From 0d5ab421588bbc8aca4c759e3bba9b5f9a337577 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Wed, 27 Jul 2016 15:09:59 -0500 Subject: [PATCH 001/205] moved docker image to docker hub --- Dockerfile | 6 +----- start-docker.sh | 9 +++++---- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/Dockerfile b/Dockerfile index 213f238..befa229 100644 --- a/Dockerfile +++ b/Dockerfile @@ -36,8 +36,4 @@ RUN cd /root \ EXPOSE 3000 3306 35729 WORKDIR /usr/app -CMD ["mysqld"] - -# ./start-docker.sh -# ./start-server.sh -# rails server -b 0.0.0.0 +CMD /bin/bash diff --git a/start-docker.sh b/start-docker.sh index 5e9740e..eddb7e4 100755 --- a/start-docker.sh +++ b/start-docker.sh @@ -1,11 +1,11 @@ #!/bin/bash -IMAGE=deb-rails-dev +IMAGE=markamoser/deb-mysql-rails CONTAINER=`basename ${PWD}` -if [ "$(docker images -q $IMAGE:latest 2> /dev/null)" == "" ]; then - docker build -t $IMAGE . -fi +# if [ "$(docker images -q $IMAGE:latest 2> /dev/null)" == "" ]; then +# docker build -t $IMAGE . +# fi STATUS=$(docker inspect --format="{{ .State.Running }}" $CONTAINER 2> /dev/null) @@ -19,3 +19,4 @@ if [ "$STATUS"=="false" ]; then fi docker attach $CONTAINER + From 5207b6b8fd5c89b01e9cb137176a5862e6bc1154 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Wed, 27 Jul 2016 22:16:12 -0500 Subject: [PATCH 002/205] roughed in quiz GET views --- app/assets/images/icon-dropdownlist.png | Bin 0 -> 1133 bytes .../images/icon-unorderedlistbullet.png | Bin 0 -> 1346 bytes app/assets/images/perficientdigital.png | Bin 0 -> 4774 bytes app/controllers/candidate_controller.rb | 19 +++++++ app/views/candidate/question.html.erb | 53 ++++++++++++++++++ app/views/candidate/saved.html.erb | 8 +++ app/views/candidate/summary.html.erb | 2 + app/views/candidate/thankyou.html.erb | 5 ++ app/views/candidate/welcome.html.erb | 43 ++++++++++++++ app/views/layouts/_footer.html.erb | 5 ++ app/views/layouts/application.html.erb | 38 ++++++++++--- app/views/questions/_checkbox.html.erb | 20 +++++++ app/views/questions/_live-coder.html.erb | 41 ++++++++++++++ app/views/questions/_radio.html.erb | 20 +++++++ app/views/questions/_text.html.erb | 11 ++++ app/workers/quiz_status.rb | 23 ++++++++ config/routes.rb | 7 +++ 17 files changed, 288 insertions(+), 7 deletions(-) create mode 100644 app/assets/images/icon-dropdownlist.png create mode 100644 app/assets/images/icon-unorderedlistbullet.png create mode 100644 app/assets/images/perficientdigital.png create mode 100644 app/controllers/candidate_controller.rb create mode 100644 app/views/candidate/question.html.erb create mode 100644 app/views/candidate/saved.html.erb create mode 100644 app/views/candidate/summary.html.erb create mode 100644 app/views/candidate/thankyou.html.erb create mode 100644 app/views/candidate/welcome.html.erb create mode 100644 app/views/layouts/_footer.html.erb create mode 100644 app/views/questions/_checkbox.html.erb create mode 100644 app/views/questions/_live-coder.html.erb create mode 100644 app/views/questions/_radio.html.erb create mode 100644 app/views/questions/_text.html.erb diff --git a/app/assets/images/icon-dropdownlist.png b/app/assets/images/icon-dropdownlist.png new file mode 100644 index 0000000000000000000000000000000000000000..759e8621a657c95e9bdafee4160e82ba95495ae5 GIT binary patch literal 1133 zcmaJ>O>EOv9Cs;{q_i}LO=t*-Cs(VAMEsF9X>27W#ZKA`Tty)gmG(g$`?Yaff6RVa z+zPrDO^^vedjn46gv5prJy5E0fI}{{+cd44gjVg6)3j;pl|xnb9GZ5A1xxmO@2}tQ z_y2tUIx{@j-g>;1Ac*$#keJ2mQT%rJTJZOm_jV9oK0wJ4bio`$CE13=fNJI;NbB-A z%tBe6{`@735kzyhmK#AM(s^DnbxQUyl&f2qO%Sm&t|cpz5P>`#*Niy1_3SwbG&N3M z3`>k;39z6I&Dik5%y3SbnN&EHJkt+iE{_Fth-BdEQ-;I4ak8e%o~+^QmI)V(c4doZDaK2w4wR&KLv?)*?Vv2&kN1Cto!qnq=`3{2qOIV@ zjdgmiEMBmoj7&Rcnp5>EW(p=Uoq}lrL8w&?bW5_L8J_V}jU`EZ+HjC;C@?L?NvuO@ zn#xBbTq>DN^)W1yV%cPb6GM#9D}+*9G#MEP57fD$sT6f+pgLFG=SCZHy@Ajz>{*1i z_61Z^wyA?!;=I;4mT*J8U9Q?VmPkV`jf0`R_Wq~cbrYT;Z@V|V_^>zr(7-cqT}S3XOe@K-MV^x@sdh0&(!gG8*od}Z!62%HQ2-0iDu z&P9);zxS0FnwPq$o8KlbA1Hsiv~sqoyg)1kS5wD8zrQlkwlW_GY#pd(?tGb;XZ&kj z2cvWDp};z`^XAPr^CwhNFNZmM2htj>a4MD?UtnCXzDjnUA6=; i<=eu>-@Q}+wD=g}D_^&@N^P!rKY(;{SbTJL^yoELqi2~OFctV z3u7Zw9R(u;LsNYNOMOEFT?0caLjx-#0|h8h0@_xTl4cd;;s&(~$g@?-C@Cqh($_C9 zFV`zK*2^zS*Eh7ZwA42+(l;{F1**_3uFNY*tkBIXR)(42l3JWxlvz-cnV+WsGBGhJ zzqG_w3FuOY7jg^W#^x16g9#X5`W1-<`i6Q2ATPlb`ugHmnwtw(U0f2Bif}JhgNs8d z3sUuiQj7CTi;{s6m!=G|s=&&*C^fMpzbGU>KL-|y0U7xv`NbLe1q#m2;80W0@J&q4 z%mWE(f_3@&T6yLbmn7yTr+T{BDgn*W%gju%GBtN}HZgE>H83=CGBk8Gvve^sa5ix^ zaHFGp|gz0t3PcF?(%`1WFO+n~&!>JdPAaVP^Az78jg)^?{Dj2SqPZbi;&zX$ZuGCte^2p8QkufN8!6n7CcyH)}F5FmCX4 zaSW-rmGtBPe|u(*`n|QM|9oD`z0SbSicNUFetgkBA<0kw)9S9>t*`&LAtCt05eAk! zQMZ2IT(TtZPu*9qmxmuV7xF|fL?|i?U$(!v;DVaK@2_oJum1o4FZJLm0hS-SYr+os z+LkEDEq4kDzMeSaRLhyh8Ctb}zrPOeda-Pg2Fpw>F_EULA!;StKSV~XJ(Q-^=EM{H z|4-u4RRYsjMu;XEi>`K>vGUC&qw971E7vj@i7t1Vu(IjgI%CH-=Fw(TABFsQe?EWP z_v-THhkcH({BZUduc-ZeyNgMaC+ty`lDN}k`u1zg)RkJbS-jn+K`#3*HNaa4KcjUsm^cg=vZ_sg)}G2e2P)M( MUHx3vIVCg!04}5Z-2eap literal 0 HcmV?d00001 diff --git a/app/assets/images/perficientdigital.png b/app/assets/images/perficientdigital.png new file mode 100644 index 0000000000000000000000000000000000000000..cf0c8ac0c14e420ad23acd890b2e784d1ddeb0a6 GIT binary patch literal 4774 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 H&WHaGDt&v` literal 0 HcmV?d00001 diff --git a/app/controllers/candidate_controller.rb b/app/controllers/candidate_controller.rb new file mode 100644 index 0000000..aa6cb4c --- /dev/null +++ b/app/controllers/candidate_controller.rb @@ -0,0 +1,19 @@ +class CandidateController < ApplicationController + def welcome + end + + def question + @question = Question.where(input_type: 'live-coder').order("RAND()").first + @status = QuizStatus.new(Candidate.order("RAND()").first) + @answer = @question.answers.order("RAND()").first + end + + def summary + end + + def thankyou + end + + def saved + end +end diff --git a/app/views/candidate/question.html.erb b/app/views/candidate/question.html.erb new file mode 100644 index 0000000..942631c --- /dev/null +++ b/app/views/candidate/question.html.erb @@ -0,0 +1,53 @@ +<% + content_for :title, "Skills Assessment" + content_for :category, @question.category + content_for :footer_title, "Skills Assessment" +%> +
+
+

<%= @question.question %>

+ <%= render partial: "questions/#{@question.input_type}" %> + + <% if @status.on_summary %> + +
+ +
+ + <% else %> + +
+ +
+
+ +
+ + <% end %> +
+
+ + diff --git a/app/views/candidate/saved.html.erb b/app/views/candidate/saved.html.erb new file mode 100644 index 0000000..8d2eb0e --- /dev/null +++ b/app/views/candidate/saved.html.erb @@ -0,0 +1,8 @@ +

+ Your test results have been saved. You can visit again later with your candidate ID to complete + the test starting from where you left off. +

+ + diff --git a/app/views/candidate/summary.html.erb b/app/views/candidate/summary.html.erb new file mode 100644 index 0000000..4d178c1 --- /dev/null +++ b/app/views/candidate/summary.html.erb @@ -0,0 +1,2 @@ +

Candidate#summary

+

Find me in app/views/candidate/summary.html.erb

diff --git a/app/views/candidate/thankyou.html.erb b/app/views/candidate/thankyou.html.erb new file mode 100644 index 0000000..4f04a58 --- /dev/null +++ b/app/views/candidate/thankyou.html.erb @@ -0,0 +1,5 @@ +

+ Your answers have been submitted. We will review and your recruiter + will contact you if we would like to set up an interview. +

+ diff --git a/app/views/candidate/welcome.html.erb b/app/views/candidate/welcome.html.erb new file mode 100644 index 0000000..db8866f --- /dev/null +++ b/app/views/candidate/welcome.html.erb @@ -0,0 +1,43 @@ +<% content_for :title, "Skills Assessment" %> + + + +
+

Oops!

+

+ Looks like you hit the browser's Back button. You can't go backwards in the test, + but you'll have a chance at the end to review your answers and make changes. +

+ +
+ + + +
+

Let's Get Started

+

+ This is a skills assessment test. It's the first step in the process of interviewing + for a Front-End Development position with Perficient Digital. +

+

+ The questions will test your knowledge in the areas of HTML, CSS, and JavaScript. + Please note that you can only move forward through the test, not back, + and you must attempt to answer the question before moving to the + next one. You'll have an opportunity at the end of the test to review and update your + answers if need be. At any time, you may save your progress and log back in to continue + taking the test from where you left off. +

+

+ Please answer to the best of your ability—it's totally okay to say + "I don't know"!—and above all, relax and have fun! Once you submit your + answers, we will review your assessment and your recruiter will be in touch. +

+ +
+
+ + +
+ +
+
diff --git a/app/views/layouts/_footer.html.erb b/app/views/layouts/_footer.html.erb new file mode 100644 index 0000000..9ba1d7e --- /dev/null +++ b/app/views/layouts/_footer.html.erb @@ -0,0 +1,5 @@ +
+ + + +
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 71eab8a..1515cdc 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -1,14 +1,38 @@ - - - SkillAssessmentApp + + + + <%= csrf_meta_tags %> - <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> - <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> - + <%= yield(:title) %> + <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> + + - <%= yield %> +
+ <% if content_for?(:category) %> + +
+ -- NO PROGRESS BAR ON EDITS -- +
+
Section: <%= yield(:category) %>
+
+
+ + <% else %> + +
+
+
Perficient Digital Skills Assessment
+
+
+ + <% end %> + <%= yield %> +
+ <%= render partial: 'layouts/footer' %> + <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> diff --git a/app/views/questions/_checkbox.html.erb b/app/views/questions/_checkbox.html.erb new file mode 100644 index 0000000..bdc1c59 --- /dev/null +++ b/app/views/questions/_checkbox.html.erb @@ -0,0 +1,20 @@ +
+ + <% + @question.input_options.each do | option | + option_id = "#{option.parameterize}_#{@question.to_i}" + %> +
+ + > + +
+ <% end %> + + -- MOVE TO FLASH HASH -- +
Please select or enter an answer.
+
diff --git a/app/views/questions/_live-coder.html.erb b/app/views/questions/_live-coder.html.erb new file mode 100644 index 0000000..ba2b10e --- /dev/null +++ b/app/views/questions/_live-coder.html.erb @@ -0,0 +1,41 @@ +
+ Please revisit this page with JavaScript enabled to modify your answer. +
+ +
+

+ This is a question where you will be asked to write code, and it utilizes a JavaScript-enabled + environment. It looks like JavaScript is not loaded for some reason. Please check the box below + to acknowledge that you agree to come back at a later time to finish answering this question + before you can submit the test. +

+ + +
+ +
+ <% + # answers inserted dynamically via jQuery .load() + # to check for JS capability/enabled + %> + +
+ + +
+ +
+ + +
+ +
+ + +
+ + -- MOVE TO FLASH HASH -- +
You must write code in one of the above textareas to progress.
+ +
+
diff --git a/app/views/questions/_radio.html.erb b/app/views/questions/_radio.html.erb new file mode 100644 index 0000000..3975252 --- /dev/null +++ b/app/views/questions/_radio.html.erb @@ -0,0 +1,20 @@ +
+ + <% + @question.input_options.each do | option | + option_id = "#{option.parameterize}_#{@question.to_i}" + %> +
+ + > + +
+ <% end %> + + -- MOVE TO FLASH HASH -- +
Please select or enter an answer. (The character limit for a textarea answer is 1000)
+
diff --git a/app/views/questions/_text.html.erb b/app/views/questions/_text.html.erb new file mode 100644 index 0000000..baba253 --- /dev/null +++ b/app/views/questions/_text.html.erb @@ -0,0 +1,11 @@ +
+ + + + +
Characters remaining:
+ + -- MOVE TO FLASH HASH -- +
Please select or enter an answer. (The character limit for a textarea answer is 1000)
+ +
diff --git a/app/workers/quiz_status.rb b/app/workers/quiz_status.rb index 9e6d695..8b5af02 100644 --- a/app/workers/quiz_status.rb +++ b/app/workers/quiz_status.rb @@ -20,4 +20,27 @@ class QuizStatus def can_submit on_summary && candidate.answered_questions.count == candidate.questions.count end + + # query($TotalQuestions); + # $TotalQuestions = $result->num_rows + 1; + # + # $progressBarValue = round($questionId/$TotalQuestions * 100); + # $_SESSION['pBarValue'] = $progressBarValue; + # + # $pValue = $_SESSION['pBarValue']; + # + # if(!isset($_GET['qid'])) { ?> + #
+ #
+ # % + #
+ #
+ # end diff --git a/config/routes.rb b/config/routes.rb index 787824f..fdf912c 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,3 +1,10 @@ Rails.application.routes.draw do + get "/welcome", to: 'candidate#welcome', as: :welcome + get "/thankyou", to: 'candidate#thankyou', as: :thankyou + get "/saved", to: 'candidate#saved', as: :saved + get "/summary", to: 'candidate#summary', as: :summary + get "/question", to: 'candidate#question', as: :question + + root to: 'candidate#welcome' # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html end From 79e1797295a74ba12fffa79bcb4a4474d3717dd0 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Wed, 27 Jul 2016 22:53:14 -0500 Subject: [PATCH 003/205] progress bar logic --- app/controllers/candidate_controller.rb | 2 +- app/views/candidate/question.html.erb | 30 ++++++------------------- app/workers/quiz_status.rb | 28 +++++------------------ test/workers/quiz_status_test.rb | 21 +++++++++++++++++ 4 files changed, 35 insertions(+), 46 deletions(-) diff --git a/app/controllers/candidate_controller.rb b/app/controllers/candidate_controller.rb index aa6cb4c..fb7df1c 100644 --- a/app/controllers/candidate_controller.rb +++ b/app/controllers/candidate_controller.rb @@ -3,7 +3,7 @@ class CandidateController < ApplicationController end def question - @question = Question.where(input_type: 'live-coder').order("RAND()").first + @question = Question.order("RAND()").first # .where(input_type: 'live-coder') @status = QuizStatus.new(Candidate.order("RAND()").first) @answer = @question.answers.order("RAND()").first end diff --git a/app/views/candidate/question.html.erb b/app/views/candidate/question.html.erb index 942631c..be9a415 100644 --- a/app/views/candidate/question.html.erb +++ b/app/views/candidate/question.html.erb @@ -27,27 +27,11 @@ - + +<% end %> diff --git a/app/workers/quiz_status.rb b/app/workers/quiz_status.rb index 8b5af02..0a5a747 100644 --- a/app/workers/quiz_status.rb +++ b/app/workers/quiz_status.rb @@ -21,26 +21,10 @@ class QuizStatus on_summary && candidate.answered_questions.count == candidate.questions.count end - # query($TotalQuestions); - # $TotalQuestions = $result->num_rows + 1; - # - # $progressBarValue = round($questionId/$TotalQuestions * 100); - # $_SESSION['pBarValue'] = $progressBarValue; - # - # $pValue = $_SESSION['pBarValue']; - # - # if(!isset($_GET['qid'])) { ?> - #
- #
- # % - #
- #
- # + def progress + answs = candidate.answered_questions.count.to_f + total = candidate.quiz.questions.count.to_f + + (answs / total * 100).round.to_i + end end diff --git a/test/workers/quiz_status_test.rb b/test/workers/quiz_status_test.rb index 8dffbe1..818d6b9 100644 --- a/test/workers/quiz_status_test.rb +++ b/test/workers/quiz_status_test.rb @@ -56,4 +56,25 @@ class QuizStatusTest < ActiveSupport::TestCase assert status.can_submit end + + test "richard is at 100%" do + richard = candidates :richard + status = QuizStatus.new richard + + assert_equal 100, status.progress + end + + test "roy is 20% done" do + roy = candidates :roy + status = QuizStatus.new roy + + assert_equal 20, status.progress + end + + test "martha is 0% done" do + martha = candidates :martha + status = QuizStatus.new martha + + assert_equal 0, status.progress + end end From 8623fe0d934a930b4fca2361654ea7a5e94fa4eb Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Thu, 28 Jul 2016 08:22:05 -0500 Subject: [PATCH 004/205] layout progress bar update --- app/views/candidate/question.html.erb | 2 ++ app/views/candidate/thankyou.html.erb | 3 +-- app/views/layouts/application.html.erb | 5 +++-- test/fixtures/questions.yml | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/app/views/candidate/question.html.erb b/app/views/candidate/question.html.erb index be9a415..081201b 100644 --- a/app/views/candidate/question.html.erb +++ b/app/views/candidate/question.html.erb @@ -1,8 +1,10 @@ <% content_for :title, "Skills Assessment" content_for :category, @question.category + content_for :summary, true if @status.on_summary content_for :footer_title, "Skills Assessment" %> +

<%= @question.question %>

diff --git a/app/views/candidate/thankyou.html.erb b/app/views/candidate/thankyou.html.erb index 4f04a58..fd2f3fc 100644 --- a/app/views/candidate/thankyou.html.erb +++ b/app/views/candidate/thankyou.html.erb @@ -1,5 +1,4 @@

- Your answers have been submitted. We will review and your recruiter + Your answers have been submitted. We will review and your recruiter will contact you if we would like to set up an interview.

- diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 1515cdc..4198d02 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -14,8 +14,7 @@
<% if content_for?(:category) %> -
- -- NO PROGRESS BAR ON EDITS -- +
>
Section: <%= yield(:category) %>
@@ -30,7 +29,9 @@
<% end %> + <%= yield %> +
<%= render partial: 'layouts/footer' %> <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> diff --git a/test/fixtures/questions.yml b/test/fixtures/questions.yml index 8ecfbc1..6302ed7 100644 --- a/test/fixtures/questions.yml +++ b/test/fixtures/questions.yml @@ -86,6 +86,6 @@ fed10: question: StarWars or Star Trek? category: Performance input_type: checkbox - input_options: ["Live long and prosper", "Who you calling Scruffy?", "J.J. Abrams"] + input_options: ["Live long and prosper", "Who ya gonna call?", "Who you calling Scruffy?", "J.J. Abrams"] sort: 9 active: true From 0950b7eb2aa4eccb0b510bba62522536f1dfba08 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Thu, 28 Jul 2016 08:47:34 -0500 Subject: [PATCH 005/205] a littel more routing --- app/controllers/candidate_controller.rb | 10 ++++++++++ app/views/candidate/question.html.erb | 3 ++- app/views/candidate/welcome.html.erb | 7 ++++--- config/routes.rb | 15 +++++++++------ 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/app/controllers/candidate_controller.rb b/app/controllers/candidate_controller.rb index fb7df1c..f7ee689 100644 --- a/app/controllers/candidate_controller.rb +++ b/app/controllers/candidate_controller.rb @@ -8,6 +8,12 @@ class CandidateController < ApplicationController @answer = @question.answers.order("RAND()").first end + def update_question + + redirect_to saved_path if params[:submit] == 'Save' + redirect_to :question + end + def summary end @@ -16,4 +22,8 @@ class CandidateController < ApplicationController def saved end + + def validate + redirect_to :question + end end diff --git a/app/views/candidate/question.html.erb b/app/views/candidate/question.html.erb index 081201b..b8a1bed 100644 --- a/app/views/candidate/question.html.erb +++ b/app/views/candidate/question.html.erb @@ -6,6 +6,7 @@ %> +<%= form_tag(post_question_path) do %>

<%= @question.question %>

<%= render partial: "questions/#{@question.input_type}" %> @@ -27,7 +28,7 @@ <% end %>
- +<% end %> <% unless @status.on_summary %>
diff --git a/app/views/candidate/welcome.html.erb b/app/views/candidate/welcome.html.erb index db8866f..f1f4e75 100644 --- a/app/views/candidate/welcome.html.erb +++ b/app/views/candidate/welcome.html.erb @@ -8,7 +8,8 @@ Looks like you hit the browser's Back button. You can't go backwards in the test, but you'll have a chance at the end to review your answers and make changes.

- + +
@@ -33,11 +34,11 @@ answers, we will review your assessment and your recruiter will be in touch.

-
+ <%= form_tag(validate_candidate_path) do %>
-
+ <% end %> diff --git a/config/routes.rb b/config/routes.rb index fdf912c..36bef86 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,10 +1,13 @@ Rails.application.routes.draw do - get "/welcome", to: 'candidate#welcome', as: :welcome - get "/thankyou", to: 'candidate#thankyou', as: :thankyou - get "/saved", to: 'candidate#saved', as: :saved - get "/summary", to: 'candidate#summary', as: :summary - get "/question", to: 'candidate#question', as: :question + get "/welcome", to: "candidate#welcome", as: :welcome + get "/thankyou", to: "candidate#thankyou", as: :thankyou + get "/saved", to: "candidate#saved", as: :saved + get "/summary", to: "candidate#summary", as: :summary + get "/question", to: "candidate#question", as: :question + post "/question", to: "candidate#update_question", as: :post_question + post "/validate", to: "candidate#validate", as: :validate_candidate - root to: 'candidate#welcome' + + root to: "candidate#welcome" # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html end From 911c42bcd67a13965b01d6e2a1fa8e0b40b093fd Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Thu, 28 Jul 2016 09:37:46 -0500 Subject: [PATCH 006/205] added save routing --- .rubocop.yml | 3 +++ app/controllers/candidate_controller.rb | 9 +++++++-- app/views/candidate/question.html.erb | 1 - config/routes.rb | 3 +-- erd.pdf | Bin 36133 -> 36133 bytes 5 files changed, 11 insertions(+), 5 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 65f43eb..39aaeaa 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -4,6 +4,9 @@ AllCops: - db/seeds.rb - bin/**/* +Style/AndOr: + Enabled: false + Style/ClassAndModuleChildren: Exclude: - test/test_helper.rb diff --git a/app/controllers/candidate_controller.rb b/app/controllers/candidate_controller.rb index f7ee689..b23d3b2 100644 --- a/app/controllers/candidate_controller.rb +++ b/app/controllers/candidate_controller.rb @@ -9,8 +9,7 @@ class CandidateController < ApplicationController end def update_question - - redirect_to saved_path if params[:submit] == 'Save' + redirect_to :saved and return if params[:save] == 'Save' redirect_to :question end @@ -26,4 +25,10 @@ class CandidateController < ApplicationController def validate redirect_to :question end + + private + + def question_params + params.permit(:save) + end end diff --git a/app/views/candidate/question.html.erb b/app/views/candidate/question.html.erb index b8a1bed..9ff5295 100644 --- a/app/views/candidate/question.html.erb +++ b/app/views/candidate/question.html.erb @@ -5,7 +5,6 @@ content_for :footer_title, "Skills Assessment" %> -
<%= form_tag(post_question_path) do %>

<%= @question.question %>

diff --git a/config/routes.rb b/config/routes.rb index 36bef86..1868c84 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -3,11 +3,10 @@ Rails.application.routes.draw do get "/thankyou", to: "candidate#thankyou", as: :thankyou get "/saved", to: "candidate#saved", as: :saved get "/summary", to: "candidate#summary", as: :summary - get "/question", to: "candidate#question", as: :question post "/question", to: "candidate#update_question", as: :post_question + get "/question", to: "candidate#question", as: :question post "/validate", to: "candidate#validate", as: :validate_candidate - root to: "candidate#welcome" # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html end diff --git a/erd.pdf b/erd.pdf index b7f2f8b60fef2ab98c3929c65f44d9a8ce0f560c..9513737b875eb3d2fe1ae2a157a0eddc5004f687 100644 GIT binary patch delta 13908 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 delta 13908 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 From 02c595aefdf27da33da5d66f686318c810cdbc89 Mon Sep 17 00:00:00 2001 From: Derek Montgomery Date: Thu, 28 Jul 2016 12:52:54 -0500 Subject: [PATCH 007/205] custom assets ported --- app/assets/stylesheets/atoms/_alerts.scss | 8 + app/assets/stylesheets/atoms/_fonts.scss | 162 +++ app/assets/stylesheets/atoms/_layout.scss | 61 ++ app/assets/stylesheets/atoms/_media.scss | 10 + app/assets/stylesheets/atoms/_pd-slant.scss | 75 ++ app/assets/stylesheets/atoms/_typography.scss | 74 ++ app/assets/stylesheets/core/_variables.scss | 948 ++++++++++++++++++ app/assets/stylesheets/molecules/_admin.scss | 35 + .../stylesheets/molecules/_buttongroups.scss | 26 + .../stylesheets/molecules/_buttons.scss | 100 ++ app/assets/stylesheets/molecules/_forms.scss | 266 +++++ app/assets/stylesheets/molecules/_lists.scss | 35 + .../stylesheets/molecules/_livecoder.scss | 60 ++ .../stylesheets/molecules/_progressbar.scss | 41 + app/assets/stylesheets/molecules/_tables.scss | 22 + app/assets/stylesheets/organisms/.keep | 0 app/assets/stylesheets/pages/_error.scss | 35 + app/assets/stylesheets/pages/_styleguide.scss | 32 + app/assets/stylesheets/templates/_footer.scss | 44 + app/assets/stylesheets/templates/_header.scss | 26 + app/assets/stylesheets/templates/_intro.scss | 26 + .../stylesheets/templates/_questions.scss | 71 ++ .../stylesheets/templates/_summary.scss | 85 ++ 23 files changed, 2242 insertions(+) create mode 100644 app/assets/stylesheets/atoms/_alerts.scss create mode 100644 app/assets/stylesheets/atoms/_fonts.scss create mode 100644 app/assets/stylesheets/atoms/_layout.scss create mode 100644 app/assets/stylesheets/atoms/_media.scss create mode 100644 app/assets/stylesheets/atoms/_pd-slant.scss create mode 100755 app/assets/stylesheets/atoms/_typography.scss create mode 100644 app/assets/stylesheets/core/_variables.scss create mode 100644 app/assets/stylesheets/molecules/_admin.scss create mode 100644 app/assets/stylesheets/molecules/_buttongroups.scss create mode 100755 app/assets/stylesheets/molecules/_buttons.scss create mode 100755 app/assets/stylesheets/molecules/_forms.scss create mode 100755 app/assets/stylesheets/molecules/_lists.scss create mode 100644 app/assets/stylesheets/molecules/_livecoder.scss create mode 100644 app/assets/stylesheets/molecules/_progressbar.scss create mode 100755 app/assets/stylesheets/molecules/_tables.scss create mode 100644 app/assets/stylesheets/organisms/.keep create mode 100644 app/assets/stylesheets/pages/_error.scss create mode 100644 app/assets/stylesheets/pages/_styleguide.scss create mode 100644 app/assets/stylesheets/templates/_footer.scss create mode 100644 app/assets/stylesheets/templates/_header.scss create mode 100644 app/assets/stylesheets/templates/_intro.scss create mode 100644 app/assets/stylesheets/templates/_questions.scss create mode 100644 app/assets/stylesheets/templates/_summary.scss diff --git a/app/assets/stylesheets/atoms/_alerts.scss b/app/assets/stylesheets/atoms/_alerts.scss new file mode 100644 index 0000000..a5db852 --- /dev/null +++ b/app/assets/stylesheets/atoms/_alerts.scss @@ -0,0 +1,8 @@ +.alert { + padding: 20px; + border-radius: 5px; + &.alert-success { + background-color: $accent-color-3; + color: $white; + } +} \ No newline at end of file diff --git a/app/assets/stylesheets/atoms/_fonts.scss b/app/assets/stylesheets/atoms/_fonts.scss new file mode 100644 index 0000000..24aa17b --- /dev/null +++ b/app/assets/stylesheets/atoms/_fonts.scss @@ -0,0 +1,162 @@ +//HALISR + +@font-face { + font-family: 'HalisR'; + src:local('Halis R Thin'), + url('../fonts/HalisR-Thin.woff2') format('woff2'), + url('../fonts/HalisR-Thin.woff') format('woff'), + url('../fonts/HalisR-Thin.otf') format('opentype'); + font-weight:100; +} +@font-face { + font-family: 'HalisR'; + src:local('Halis R Light'), + url('../fonts/HalisR-Light.woff2') format('woff2'), + url('../fonts/HalisR-Light.woff') format('woff'), + url('../fonts/HalisR-Light.otf') format('opentype'); + font-weight:200; +} + +@font-face { + font-family: 'HalisR'; + src:local('Halis R Book'), + url('../fonts/HalisR-Book.woff2') format('woff2'), + url('../fonts/HalisR-Book.woff') format('woff'), + url('../fonts/HalisR-Book.otf') format('opentype'); + font-weight:300; +} + +@font-face { + font-family: 'HalisR'; + src:local('Halis R Regular'), + url('../fonts/HalisR-Regular.woff2') format('woff2'), + url('../fonts/HalisR-Regular.woff') format('woff'), + url('../fonts/HalisR-Regular.otf') format('opentype'); + font-weight:500; +} + +@font-face { + font-family: 'HalisR'; + src:local('Halis R Medium'), + url('../fonts/HalisR-Medium.woff2') format('woff2'), + url('../fonts/HalisR-Medium.woff') format('woff'), + url('../fonts/HalisR-Medium.otf') format('opentype'); + font-weight:600; +} + +@font-face { + font-family: 'HalisR'; + src:local('Halis R Bold'), + url('../fonts/HalisR-Bold.woff2') format('woff2'), + url('../fonts/HalisR-Bold.woff') format('woff'), + url('../fonts/HalisR-Bold.otf') format('opentype'); + font-weight:700; +} + +@font-face { + font-family: 'HalisR'; + src:local('Halis R Black'), + url('../fonts/HalisR-Black.woff2') format('woff2'), + url('../fonts/HalisR-Black.woff') format('woff'), + url('../fonts/HalisR-Black.otf') format('opentype'); + font-weight:900; +} + +//LATO + + //regular + +@font-face { + font-family: 'Lato'; + src:local('Lato Hairline'), + url('../fonts/Lato-Hairline.woff2') format('woff2'), + url('../fonts/Lato-Hairline.woff') format('woff'), + url('../fonts/Lato-Hairline.ttf') format('truetype'); + font-weight:100; +} +@font-face { + font-family: 'Lato'; + src:local('Lato Light'), + url('../fonts/Lato-Light.woff2') format('woff2'), + url('../fonts/Lato-Light.woff') format('woff'), + url('../fonts/Lato-Light.ttf') format('truetype'); + font-weight:300; +} + +@font-face { + font-family: 'Lato'; + src:local('Lato Regular'), + url('../fonts/Lato-Regular.woff2') format('woff2'), + url('../fonts/Lato-Regular.woff') format('woff'), + url('../fonts/Lato-Regular.ttf') format('truetype'); + font-weight:500; +} + +@font-face { + font-family: 'Lato'; + src:local('Lato Bold'), + url('../fonts/Lato-Bold.woff2') format('woff2'), + url('../fonts/Lato-Bold.woff') format('woff'), + url('../fonts/Lato-Bold.ttf') format('truetype'); + font-weight:700; +} + +@font-face { + font-family: 'Lato'; + src:local('Lato Black'), + url('../fonts/Lato-Black.woff2') format('woff2'), + url('../fonts/Lato-Black.woff') format('woff'), + url('../fonts/Lato-Black.ttf') format('truetype'); + font-weight:900; +} + + //italicized + +@font-face { + font-family: 'Lato'; + src:local('Lato Hairline Italic'), + url('../fonts/Lato-HairlineItalic.woff2') format('woff2'), + url('../fonts/Lato-HairlineItalic.woff') format('woff'), + url('../fonts/Lato-HairlineItalic.ttf') format('truetype'); + font-weight:100; + font-style: italic; +} +@font-face { + font-family: 'Lato'; + src:local('Lato Light Italic'), + url('../fonts/Lato-LightItalic.woff2') format('woff2'), + url('../fonts/Lato-LightItalic.woff') format('woff'), + url('../fonts/Lato-LightItalic.ttf') format('truetype'); + font-weight:300; + font-style: italic; +} + +@font-face { + font-family: 'Lato'; + src:local('Lato Italic'), + url('../fonts/Lato-Italic.woff2') format('woff2'), + url('../fonts/Lato-Italic.woff') format('woff'), + url('../fonts/Lato-Italic.ttf') format('truetype'); + font-weight:500; + font-style: italic; +} + +@font-face { + font-family: 'Lato'; + src:local('Lato Bold Italic'), + url('../fonts/Lato-BoldItalic.woff2') format('woff2'), + url('../fonts/Lato-BoldItalic.woff') format('woff'), + url('../fonts/Lato-BoldItalic.ttf') format('truetype'); + font-weight:700; + font-style: italic; +} + +@font-face { + font-family: 'Lato'; + src:local('Lato Black Italic'), + url('../fonts/Lato-BlackItalic.woff2') format('woff2'), + url('../fonts/Lato-BlackItalic.woff') format('woff'), + url('../fonts/Lato-BlackItalic.ttf') format('truetype'); + font-weight:900; + font-style: italic; +} \ No newline at end of file diff --git a/app/assets/stylesheets/atoms/_layout.scss b/app/assets/stylesheets/atoms/_layout.scss new file mode 100644 index 0000000..1571202 --- /dev/null +++ b/app/assets/stylesheets/atoms/_layout.scss @@ -0,0 +1,61 @@ +html { + box-sizing: border-box; + height: 100%; +} + +body { + margin: 0 1rem; + height: 100%; + .ignore-margin + { + margin-left: -1rem; + margin-right: -1rem; + } +} + +*, +*::before, +*::after { + box-sizing: inherit; +} + +*:focus { + outline: 0; +} + +main { + display: block; + padding-top: 8vw; +} + +.layout { + min-height: calc(100% - 112px); + &:after { + content:""; + display:block; + } +} + +@media only screen and (min-width: 480px) { + .layout { + min-height: calc(100% - 116px); + } +} + +@media only screen and (min-width: $tablet) { + html { + // font-size: 2vw; + } + body { + margin: 0 2rem + } +} + +@media only screen and (min-width: $desktop) { + html { + font-size: 16px; + } + main { + padding-top: 55px; + } +} diff --git a/app/assets/stylesheets/atoms/_media.scss b/app/assets/stylesheets/atoms/_media.scss new file mode 100644 index 0000000..0c6699d --- /dev/null +++ b/app/assets/stylesheets/atoms/_media.scss @@ -0,0 +1,10 @@ +figure { + margin: 0; +} + +img, +picture { + margin: 0; + max-width: 100%; +} + diff --git a/app/assets/stylesheets/atoms/_pd-slant.scss b/app/assets/stylesheets/atoms/_pd-slant.scss new file mode 100644 index 0000000..3c62962 --- /dev/null +++ b/app/assets/stylesheets/atoms/_pd-slant.scss @@ -0,0 +1,75 @@ +// Slash Logo + +.slash-left { + position: relative; + + &:before { + content: ""; + background-color: $accent-color-1; + width:3px; + display: block; + position: absolute; + top:0; + bottom: -1rem; + left:0; + transform: skewX(-16.5deg); + transform-origin: bottom; + } +} + + + +// HTML/CSS only Slanted Border + +$prftangle: 90deg - 73.5deg; +$prftangle-negative: 73.5deg - 90deg; + +@mixin slantmix ($lmargin, $rmargin, $slantht) { + + position: relative; + display:block; + z-index: 1; + height: $slantht; + min-width: tan($prftangle) + 1 / 3; + overflow: wrap; + display:inline-block; + + &.slantright { + margin-right:tan($prftangle) + $rmargin; + &:after { + transform: skewX($prftangle-negative); + transform-origin: 0% 100%; + min-width:auto; + } + } + + &.slantleft { + margin-left:tan($prftangle) + $lmargin; + &:before { + transform: skewX($prftangle-negative); + transform-origin: 10% 0%; + min-width:auto; + } + } +} + +.slantleft:before, +.slantright:after { + background: inherit; + bottom: 0; + top:0; + content: '\00a0'; + display: block; + position: absolute; + right: 0; + left:0; + z-index: -1; +} + +.slantleft:before { + right: 50%; +} + +.slantright:after { + left: 50%; +} diff --git a/app/assets/stylesheets/atoms/_typography.scss b/app/assets/stylesheets/atoms/_typography.scss new file mode 100755 index 0000000..2b754c9 --- /dev/null +++ b/app/assets/stylesheets/atoms/_typography.scss @@ -0,0 +1,74 @@ +body { + color: $base-font-color; + font-family: $primary-font-face; + font-size: 1rem; + line-height: $base-line-height; + font-weight:300; + color: $primary-color; +} + +.hidden { + display: none !important; +} + +h1, h2, h3, +h4, h5, h6 { + font-family: $heading-font-face; + line-height: $heading-line-height; + margin: 0 0 $small-spacing; + color: $black; + font-weight: bold; +} + +h1 { font-size: modular-scale(6); } +h2 { font-size: modular-scale(5); } +h3 { font-size: modular-scale(4); } +h4 { font-size: modular-scale(3); } +h5 { font-size: modular-scale(2); } +h6 { font-size: modular-scale(1); } + +p { margin: 0 0 $small-spacing; } + +a { + color: $primary-color; + transition: color $base-duration $base-timing; + + &:active, + &:focus, + &:hover { + color: lighten($primary-color, 25%); + } +} + +hr { + border-bottom: $base-border; + border-left: 0; + border-right: 0; + border-top: 0; + margin: $base-spacing 0; +} + +.prft-heading { + text-transform: none; +} + +.question-text { + margin-bottom: 1.5rem; +} + +.prft-heading, +.question-text { + font-size: 6vw; +} + +h1 > a { + font-size: 1rem; + font-weight: 300; +} + +@media screen and (min-width: $screen-sm) { + .prft-heading, + .question-text { + font-size: 2.45rem; + } +} diff --git a/app/assets/stylesheets/core/_variables.scss b/app/assets/stylesheets/core/_variables.scss new file mode 100644 index 0000000..1d4e424 --- /dev/null +++ b/app/assets/stylesheets/core/_variables.scss @@ -0,0 +1,948 @@ +$bootstrap-sass-asset-helper: false !default; +// +// Variables +// -------------------------------------------------- + + +//== Colors +// +//## Gray and brand colors for use across Bootstrap. + +$gray-base: #000 !default; +$gray-darker: lighten($gray-base, 13.5%) !default; // #222 +$gray-dark: lighten($gray-base, 20%) !default; // #333 +$gray: lighten($gray-base, 33.5%) !default; // #555 +$gray-light: lighten($gray-base, 46.7%) !default; // #777 +$gray-lighter: lighten($gray-base, 93.5%) !default; // #eee + +$brand-primary: darken(#428bca, 6.5%) !default; // #337ab7 +$brand-success: #5cb85c !default; +$brand-info: #5bc0de !default; +$brand-warning: #f0ad4e !default; +$brand-danger: #d9534f !default; + + +//== Scaffolding +// +//## Settings for some of the most global styles. + +//** Background color for ``. +$body-bg: #fff !default; +//** Global text color on ``. +$text-color: $gray-dark !default; + +//** Global textual link color. +$link-color: $brand-primary !default; +//** Link hover color set via `darken()` function. +$link-hover-color: darken($link-color, 15%) !default; +//** Link hover decoration. +$link-hover-decoration: underline !default; + + +//== Typography +// +//## Font, line-height, and color for body text, headings, and more. + +$font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif !default; +$font-family-serif: Georgia, "Times New Roman", Times, serif !default; +//** Default monospace fonts for ``, ``, and `
`.
+$font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace !default;
+$font-family-base:        $font-family-sans-serif !default;
+
+$font-size-base:          14px !default;
+$font-size-large:         ceil(($font-size-base * 1.25)) !default; // ~18px
+$font-size-small:         ceil(($font-size-base * 0.85)) !default; // ~12px
+
+$font-size-h1:            floor(($font-size-base * 2.6)) !default; // ~36px
+$font-size-h2:            floor(($font-size-base * 2.15)) !default; // ~30px
+$font-size-h3:            ceil(($font-size-base * 1.7)) !default; // ~24px
+$font-size-h4:            ceil(($font-size-base * 1.25)) !default; // ~18px
+$font-size-h5:            $font-size-base !default;
+$font-size-h6:            ceil(($font-size-base * 0.85)) !default; // ~12px
+
+//** Unit-less `line-height` for use in components like buttons.
+$line-height-base:        1.428571429 !default; // 20/14
+//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
+$line-height-computed:    floor(($font-size-base * $line-height-base)) !default; // ~20px
+
+//** By default, this inherits from the ``.
+$headings-font-family:    inherit !default;
+$headings-font-weight:    500 !default;
+$headings-line-height:    1.1 !default;
+$headings-color:          inherit !default;
+
+
+//== Iconography
+//
+//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
+
+//** Load fonts from this directory.
+
+// [converter] If $bootstrap-sass-asset-helper if used, provide path relative to the assets load path.
+// [converter] This is because some asset helpers, such as Sprockets, do not work with file-relative paths.
+$icon-font-path: if($bootstrap-sass-asset-helper, "bootstrap/", "../fonts/bootstrap/") !default;
+
+//** File name for all font files.
+$icon-font-name:          "glyphicons-halflings-regular" !default;
+//** Element ID within SVG icon file.
+$icon-font-svg-id:        "glyphicons_halflingsregular" !default;
+
+
+//== Components
+//
+//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
+
+$padding-base-vertical:     6px !default;
+$padding-base-horizontal:   12px !default;
+
+$padding-large-vertical:    10px !default;
+$padding-large-horizontal:  16px !default;
+
+$padding-small-vertical:    5px !default;
+$padding-small-horizontal:  10px !default;
+
+$padding-xs-vertical:       1px !default;
+$padding-xs-horizontal:     5px !default;
+
+$line-height-large:         1.3333333 !default; // extra decimals for Win 8.1 Chrome
+$line-height-small:         1.5 !default;
+
+$border-radius-base:        4px !default;
+$border-radius-large:       6px !default;
+$border-radius-small:       3px !default;
+
+//** Global color for active items (e.g., navs or dropdowns).
+$component-active-color:    #fff !default;
+//** Global background color for active items (e.g., navs or dropdowns).
+$component-active-bg:       $brand-primary !default;
+
+//** Width of the `border` for generating carets that indicator dropdowns.
+$caret-width-base:          4px !default;
+//** Carets increase slightly in size for larger components.
+$caret-width-large:         5px !default;
+
+
+//== Tables
+//
+//## Customizes the `.table` component with basic values, each used across all table variations.
+
+//** Padding for ``s and ``s.
+$table-cell-padding:            8px !default;
+//** Padding for cells in `.table-condensed`.
+$table-condensed-cell-padding:  5px !default;
+
+//** Default background color used for all tables.
+$table-bg:                      transparent !default;
+//** Background color used for `.table-striped`.
+$table-bg-accent:               #f9f9f9 !default;
+//** Background color used for `.table-hover`.
+$table-bg-hover:                #f5f5f5 !default;
+$table-bg-active:               $table-bg-hover !default;
+
+//** Border color for table and cell borders.
+$table-border-color:            #ddd !default;
+
+
+//== Buttons
+//
+//## For each of Bootstrap's buttons, define text, background and border color.
+
+$btn-font-weight:                normal !default;
+
+$btn-default-color:              #333 !default;
+$btn-default-bg:                 #fff !default;
+$btn-default-border:             #ccc !default;
+
+$btn-primary-color:              #fff !default;
+$btn-primary-bg:                 $brand-primary !default;
+$btn-primary-border:             darken($btn-primary-bg, 5%) !default;
+
+$btn-success-color:              #fff !default;
+$btn-success-bg:                 $brand-success !default;
+$btn-success-border:             darken($btn-success-bg, 5%) !default;
+
+$btn-info-color:                 #fff !default;
+$btn-info-bg:                    $brand-info !default;
+$btn-info-border:                darken($btn-info-bg, 5%) !default;
+
+$btn-warning-color:              #fff !default;
+$btn-warning-bg:                 $brand-warning !default;
+$btn-warning-border:             darken($btn-warning-bg, 5%) !default;
+
+$btn-danger-color:               #fff !default;
+$btn-danger-bg:                  $brand-danger !default;
+$btn-danger-border:              darken($btn-danger-bg, 5%) !default;
+
+$btn-link-disabled-color:        $gray-light !default;
+
+// Allows for customizing button radius independently from global border radius
+$btn-border-radius-base:         $border-radius-base !default;
+$btn-border-radius-large:        $border-radius-large !default;
+$btn-border-radius-small:        $border-radius-small !default;
+
+
+//== Forms
+//
+//##
+
+//** `` background color
+$input-bg:                       #fff !default;
+//** `` background color
+$input-bg-disabled:              $gray-lighter !default;
+
+//** Text color for ``s
+$input-color:                    $gray !default;
+//** `` border color
+$input-border:                   #ccc !default;
+
+// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4
+//** Default `.form-control` border radius
+// This has no effect on ``s in CSS.
+$input-border-radius:            $border-radius-base !default;
+//** Large `.form-control` border radius
+$input-border-radius-large:      $border-radius-large !default;
+//** Small `.form-control` border radius
+$input-border-radius-small:      $border-radius-small !default;
+
+//** Border color for inputs on focus
+$input-border-focus:             #66afe9 !default;
+
+//** Placeholder text color
+$input-color-placeholder:        #999 !default;
+
+//** Default `.form-control` height
+$input-height-base:              ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;
+//** Large `.form-control` height
+$input-height-large:             (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default;
+//** Small `.form-control` height
+$input-height-small:             (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default;
+
+//** `.form-group` margin
+$form-group-margin-bottom:       15px !default;
+
+$legend-color:                   $gray-dark !default;
+$legend-border-color:            #e5e5e5 !default;
+
+//** Background color for textual input addons
+$input-group-addon-bg:           $gray-lighter !default;
+//** Border color for textual input addons
+$input-group-addon-border-color: $input-border !default;
+
+//** Disabled cursor for form controls and buttons.
+$cursor-disabled:                not-allowed !default;
+
+
+//== Dropdowns
+//
+//## Dropdown menu container and contents.
+
+//** Background for the dropdown menu.
+$dropdown-bg:                    #fff !default;
+//** Dropdown menu `border-color`.
+$dropdown-border:                rgba(0,0,0,.15) !default;
+//** Dropdown menu `border-color` **for IE8**.
+$dropdown-fallback-border:       #ccc !default;
+//** Divider color for between dropdown items.
+$dropdown-divider-bg:            #e5e5e5 !default;
+
+//** Dropdown link text color.
+$dropdown-link-color:            $gray-dark !default;
+//** Hover color for dropdown links.
+$dropdown-link-hover-color:      darken($gray-dark, 5%) !default;
+//** Hover background for dropdown links.
+$dropdown-link-hover-bg:         #f5f5f5 !default;
+
+//** Active dropdown menu item text color.
+$dropdown-link-active-color:     $component-active-color !default;
+//** Active dropdown menu item background color.
+$dropdown-link-active-bg:        $component-active-bg !default;
+
+//** Disabled dropdown menu item background color.
+$dropdown-link-disabled-color:   $gray-light !default;
+
+//** Text color for headers within dropdown menus.
+$dropdown-header-color:          $gray-light !default;
+
+//** Deprecated `$dropdown-caret-color` as of v3.1.0
+$dropdown-caret-color:           #000 !default;
+
+
+//-- Z-index master list
+//
+// Warning: Avoid customizing these values. They're used for a bird's eye view
+// of components dependent on the z-axis and are designed to all work together.
+//
+// Note: These variables are not generated into the Customizer.
+
+$zindex-navbar:            1000 !default;
+$zindex-dropdown:          1000 !default;
+$zindex-popover:           1060 !default;
+$zindex-tooltip:           1070 !default;
+$zindex-navbar-fixed:      1030 !default;
+$zindex-modal-background:  1040 !default;
+$zindex-modal:             1050 !default;
+
+
+//== Media queries breakpoints
+//
+//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
+
+// Extra small screen / phone
+//** Deprecated `$screen-xs` as of v3.0.1
+$screen-xs:                  480px !default;
+//** Deprecated `$screen-xs-min` as of v3.2.0
+$screen-xs-min:              $screen-xs !default;
+//** Deprecated `$screen-phone` as of v3.0.1
+$screen-phone:               $screen-xs-min !default;
+
+// Small screen / tablet
+//** Deprecated `$screen-sm` as of v3.0.1
+$screen-sm:                  768px !default;
+$screen-sm-min:              $screen-sm !default;
+//** Deprecated `$screen-tablet` as of v3.0.1
+$screen-tablet:              $screen-sm-min !default;
+
+// Medium screen / desktop
+//** Deprecated `$screen-md` as of v3.0.1
+$screen-md:                  992px !default;
+$screen-md-min:              $screen-md !default;
+//** Deprecated `$screen-desktop` as of v3.0.1
+$screen-desktop:             $screen-md-min !default;
+
+// Large screen / wide desktop
+//** Deprecated `$screen-lg` as of v3.0.1
+$screen-lg:                  1200px !default;
+$screen-lg-min:              $screen-lg !default;
+//** Deprecated `$screen-lg-desktop` as of v3.0.1
+$screen-lg-desktop:          $screen-lg-min !default;
+
+// So media queries don't overlap when required, provide a maximum
+$screen-xs-max:              ($screen-sm-min - 1) !default;
+$screen-sm-max:              ($screen-md-min - 1) !default;
+$screen-md-max:              ($screen-lg-min - 1) !default;
+
+
+//== Grid system
+//
+//## Define your custom responsive grid.
+
+//** Number of columns in the grid.
+$grid-columns:              12 !default;
+//** Padding between columns. Gets divided in half for the left and right.
+$grid-gutter-width:         30px !default;
+// Navbar collapse
+//** Point at which the navbar becomes uncollapsed.
+$grid-float-breakpoint:     $screen-sm-min !default;
+//** Point at which the navbar begins collapsing.
+$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;
+
+
+//== Container sizes
+//
+//## Define the maximum width of `.container` for different screen sizes.
+
+// Small screen / tablet
+$container-tablet:             (720px + $grid-gutter-width) !default;
+//** For `$screen-sm-min` and up.
+$container-sm:                 $container-tablet !default;
+
+// Medium screen / desktop
+$container-desktop:            (940px + $grid-gutter-width) !default;
+//** For `$screen-md-min` and up.
+$container-md:                 $container-desktop !default;
+
+// Large screen / wide desktop
+$container-large-desktop:      (1140px + $grid-gutter-width) !default;
+//** For `$screen-lg-min` and up.
+$container-lg:                 $container-large-desktop !default;
+
+
+//== Navbar
+//
+//##
+
+// Basics of a navbar
+$navbar-height:                    50px !default;
+$navbar-margin-bottom:             $line-height-computed !default;
+$navbar-border-radius:             $border-radius-base !default;
+$navbar-padding-horizontal:        floor(($grid-gutter-width / 2)) !default;
+$navbar-padding-vertical:          (($navbar-height - $line-height-computed) / 2) !default;
+$navbar-collapse-max-height:       340px !default;
+
+$navbar-default-color:             #777 !default;
+$navbar-default-bg:                #f8f8f8 !default;
+$navbar-default-border:            darken($navbar-default-bg, 6.5%) !default;
+
+// Navbar links
+$navbar-default-link-color:                #777 !default;
+$navbar-default-link-hover-color:          #333 !default;
+$navbar-default-link-hover-bg:             transparent !default;
+$navbar-default-link-active-color:         #555 !default;
+$navbar-default-link-active-bg:            darken($navbar-default-bg, 6.5%) !default;
+$navbar-default-link-disabled-color:       #ccc !default;
+$navbar-default-link-disabled-bg:          transparent !default;
+
+// Navbar brand label
+$navbar-default-brand-color:               $navbar-default-link-color !default;
+$navbar-default-brand-hover-color:         darken($navbar-default-brand-color, 10%) !default;
+$navbar-default-brand-hover-bg:            transparent !default;
+
+// Navbar toggle
+$navbar-default-toggle-hover-bg:           #ddd !default;
+$navbar-default-toggle-icon-bar-bg:        #888 !default;
+$navbar-default-toggle-border-color:       #ddd !default;
+
+
+//=== Inverted navbar
+// Reset inverted navbar basics
+$navbar-inverse-color:                      lighten($gray-light, 15%) !default;
+$navbar-inverse-bg:                         #222 !default;
+$navbar-inverse-border:                     darken($navbar-inverse-bg, 10%) !default;
+
+// Inverted navbar links
+$navbar-inverse-link-color:                 lighten($gray-light, 15%) !default;
+$navbar-inverse-link-hover-color:           #fff !default;
+$navbar-inverse-link-hover-bg:              transparent !default;
+$navbar-inverse-link-active-color:          $navbar-inverse-link-hover-color !default;
+$navbar-inverse-link-active-bg:             darken($navbar-inverse-bg, 10%) !default;
+$navbar-inverse-link-disabled-color:        #444 !default;
+$navbar-inverse-link-disabled-bg:           transparent !default;
+
+// Inverted navbar brand label
+$navbar-inverse-brand-color:                $navbar-inverse-link-color !default;
+$navbar-inverse-brand-hover-color:          #fff !default;
+$navbar-inverse-brand-hover-bg:             transparent !default;
+
+// Inverted navbar toggle
+$navbar-inverse-toggle-hover-bg:            #333 !default;
+$navbar-inverse-toggle-icon-bar-bg:         #fff !default;
+$navbar-inverse-toggle-border-color:        #333 !default;
+
+
+//== Navs
+//
+//##
+
+//=== Shared nav styles
+$nav-link-padding:                          10px 15px !default;
+$nav-link-hover-bg:                         $gray-lighter !default;
+
+$nav-disabled-link-color:                   $gray-light !default;
+$nav-disabled-link-hover-color:             $gray-light !default;
+
+//== Tabs
+$nav-tabs-border-color:                     #ddd !default;
+
+$nav-tabs-link-hover-border-color:          $gray-lighter !default;
+
+$nav-tabs-active-link-hover-bg:             $body-bg !default;
+$nav-tabs-active-link-hover-color:          $gray !default;
+$nav-tabs-active-link-hover-border-color:   #ddd !default;
+
+$nav-tabs-justified-link-border-color:            #ddd !default;
+$nav-tabs-justified-active-link-border-color:     $body-bg !default;
+
+//== Pills
+$nav-pills-border-radius:                   $border-radius-base !default;
+$nav-pills-active-link-hover-bg:            $component-active-bg !default;
+$nav-pills-active-link-hover-color:         $component-active-color !default;
+
+
+//== Pagination
+//
+//##
+
+$pagination-color:                     $link-color !default;
+$pagination-bg:                        #fff !default;
+$pagination-border:                    #ddd !default;
+
+$pagination-hover-color:               $link-hover-color !default;
+$pagination-hover-bg:                  $gray-lighter !default;
+$pagination-hover-border:              #ddd !default;
+
+$pagination-active-color:              #fff !default;
+$pagination-active-bg:                 $brand-primary !default;
+$pagination-active-border:             $brand-primary !default;
+
+$pagination-disabled-color:            $gray-light !default;
+$pagination-disabled-bg:               #fff !default;
+$pagination-disabled-border:           #ddd !default;
+
+
+//== Pager
+//
+//##
+
+$pager-bg:                             $pagination-bg !default;
+$pager-border:                         $pagination-border !default;
+$pager-border-radius:                  15px !default;
+
+$pager-hover-bg:                       $pagination-hover-bg !default;
+
+$pager-active-bg:                      $pagination-active-bg !default;
+$pager-active-color:                   $pagination-active-color !default;
+
+$pager-disabled-color:                 $pagination-disabled-color !default;
+
+
+//== Jumbotron
+//
+//##
+
+$jumbotron-padding:              30px !default;
+$jumbotron-color:                inherit !default;
+$jumbotron-bg:                   $gray-lighter !default;
+$jumbotron-heading-color:        inherit !default;
+$jumbotron-font-size:            ceil(($font-size-base * 1.5)) !default;
+$jumbotron-heading-font-size:    ceil(($font-size-base * 4.5)) !default;
+
+
+//== Form states and alerts
+//
+//## Define colors for form feedback states and, by default, alerts.
+
+$state-success-text:             #3c763d !default;
+$state-success-bg:               #dff0d8 !default;
+$state-success-border:           darken(adjust-hue($state-success-bg, -10), 5%) !default;
+
+$state-info-text:                #31708f !default;
+$state-info-bg:                  #d9edf7 !default;
+$state-info-border:              darken(adjust-hue($state-info-bg, -10), 7%) !default;
+
+$state-warning-text:             #8a6d3b !default;
+$state-warning-bg:               #fcf8e3 !default;
+$state-warning-border:           darken(adjust-hue($state-warning-bg, -10), 5%) !default;
+
+$state-danger-text:              #a94442 !default;
+$state-danger-bg:                #f2dede !default;
+$state-danger-border:            darken(adjust-hue($state-danger-bg, -10), 5%) !default;
+
+
+//== Tooltips
+//
+//##
+
+//** Tooltip max width
+$tooltip-max-width:           200px !default;
+//** Tooltip text color
+$tooltip-color:               #fff !default;
+//** Tooltip background color
+$tooltip-bg:                  #000 !default;
+$tooltip-opacity:             .9 !default;
+
+//** Tooltip arrow width
+$tooltip-arrow-width:         5px !default;
+//** Tooltip arrow color
+$tooltip-arrow-color:         $tooltip-bg !default;
+
+
+//== Popovers
+//
+//##
+
+//** Popover body background color
+$popover-bg:                          #fff !default;
+//** Popover maximum width
+$popover-max-width:                   276px !default;
+//** Popover border color
+$popover-border-color:                rgba(0,0,0,.2) !default;
+//** Popover fallback border color
+$popover-fallback-border-color:       #ccc !default;
+
+//** Popover title background color
+$popover-title-bg:                    darken($popover-bg, 3%) !default;
+
+//** Popover arrow width
+$popover-arrow-width:                 10px !default;
+//** Popover arrow color
+$popover-arrow-color:                 $popover-bg !default;
+
+//** Popover outer arrow width
+$popover-arrow-outer-width:           ($popover-arrow-width + 1) !default;
+//** Popover outer arrow color
+$popover-arrow-outer-color:           fade_in($popover-border-color, 0.05) !default;
+//** Popover outer arrow fallback color
+$popover-arrow-outer-fallback-color:  darken($popover-fallback-border-color, 20%) !default;
+
+
+//== Labels
+//
+//##
+
+//** Default label background color
+$label-default-bg:            $gray-light !default;
+//** Primary label background color
+$label-primary-bg:            $brand-primary !default;
+//** Success label background color
+$label-success-bg:            $brand-success !default;
+//** Info label background color
+$label-info-bg:               $brand-info !default;
+//** Warning label background color
+$label-warning-bg:            $brand-warning !default;
+//** Danger label background color
+$label-danger-bg:             $brand-danger !default;
+
+//** Default label text color
+$label-color:                 #fff !default;
+//** Default text color of a linked label
+$label-link-hover-color:      #fff !default;
+
+
+//== Modals
+//
+//##
+
+//** Padding applied to the modal body
+$modal-inner-padding:         15px !default;
+
+//** Padding applied to the modal title
+$modal-title-padding:         15px !default;
+//** Modal title line-height
+$modal-title-line-height:     $line-height-base !default;
+
+//** Background color of modal content area
+$modal-content-bg:                             #fff !default;
+//** Modal content border color
+$modal-content-border-color:                   rgba(0,0,0,.2) !default;
+//** Modal content border color **for IE8**
+$modal-content-fallback-border-color:          #999 !default;
+
+//** Modal backdrop background color
+$modal-backdrop-bg:           #000 !default;
+//** Modal backdrop opacity
+$modal-backdrop-opacity:      .5 !default;
+//** Modal header border color
+$modal-header-border-color:   #e5e5e5 !default;
+//** Modal footer border color
+$modal-footer-border-color:   $modal-header-border-color !default;
+
+$modal-lg:                    900px !default;
+$modal-md:                    600px !default;
+$modal-sm:                    300px !default;
+
+
+//== Alerts
+//
+//## Define alert colors, border radius, and padding.
+
+$alert-padding:               15px !default;
+$alert-border-radius:         $border-radius-base !default;
+$alert-link-font-weight:      bold !default;
+
+$alert-success-bg:            $state-success-bg !default;
+$alert-success-text:          $state-success-text !default;
+$alert-success-border:        $state-success-border !default;
+
+$alert-info-bg:               $state-info-bg !default;
+$alert-info-text:             $state-info-text !default;
+$alert-info-border:           $state-info-border !default;
+
+$alert-warning-bg:            $state-warning-bg !default;
+$alert-warning-text:          $state-warning-text !default;
+$alert-warning-border:        $state-warning-border !default;
+
+$alert-danger-bg:             $state-danger-bg !default;
+$alert-danger-text:           $state-danger-text !default;
+$alert-danger-border:         $state-danger-border !default;
+
+
+//== Progress bars
+//
+//##
+
+//** Background color of the whole progress component
+$progress-bg:                 #f5f5f5 !default;
+//** Progress bar text color
+$progress-bar-color:          #fff !default;
+//** Variable for setting rounded corners on progress bar.
+$progress-border-radius:      $border-radius-base !default;
+
+//** Default progress bar color
+$progress-bar-bg:             $brand-primary !default;
+//** Success progress bar color
+$progress-bar-success-bg:     $brand-success !default;
+//** Warning progress bar color
+$progress-bar-warning-bg:     $brand-warning !default;
+//** Danger progress bar color
+$progress-bar-danger-bg:      $brand-danger !default;
+//** Info progress bar color
+$progress-bar-info-bg:        $brand-info !default;
+
+
+//== List group
+//
+//##
+
+//** Background color on `.list-group-item`
+$list-group-bg:                 #fff !default;
+//** `.list-group-item` border color
+$list-group-border:             #ddd !default;
+//** List group border radius
+$list-group-border-radius:      $border-radius-base !default;
+
+//** Background color of single list items on hover
+$list-group-hover-bg:           #f5f5f5 !default;
+//** Text color of active list items
+$list-group-active-color:       $component-active-color !default;
+//** Background color of active list items
+$list-group-active-bg:          $component-active-bg !default;
+//** Border color of active list elements
+$list-group-active-border:      $list-group-active-bg !default;
+//** Text color for content within active list items
+$list-group-active-text-color:  lighten($list-group-active-bg, 40%) !default;
+
+//** Text color of disabled list items
+$list-group-disabled-color:      $gray-light !default;
+//** Background color of disabled list items
+$list-group-disabled-bg:         $gray-lighter !default;
+//** Text color for content within disabled list items
+$list-group-disabled-text-color: $list-group-disabled-color !default;
+
+$list-group-link-color:         #555 !default;
+$list-group-link-hover-color:   $list-group-link-color !default;
+$list-group-link-heading-color: #333 !default;
+
+
+//== Panels
+//
+//##
+
+$panel-bg:                    #fff !default;
+$panel-body-padding:          15px !default;
+$panel-heading-padding:       10px 15px !default;
+$panel-footer-padding:        $panel-heading-padding !default;
+$panel-border-radius:         $border-radius-base !default;
+
+//** Border color for elements within panels
+$panel-inner-border:          #ddd !default;
+$panel-footer-bg:             #f5f5f5 !default;
+
+$panel-default-text:          $gray-dark !default;
+$panel-default-border:        #ddd !default;
+$panel-default-heading-bg:    #f5f5f5 !default;
+
+$panel-primary-text:          #fff !default;
+$panel-primary-border:        $brand-primary !default;
+$panel-primary-heading-bg:    $brand-primary !default;
+
+$panel-success-text:          $state-success-text !default;
+$panel-success-border:        $state-success-border !default;
+$panel-success-heading-bg:    $state-success-bg !default;
+
+$panel-info-text:             $state-info-text !default;
+$panel-info-border:           $state-info-border !default;
+$panel-info-heading-bg:       $state-info-bg !default;
+
+$panel-warning-text:          $state-warning-text !default;
+$panel-warning-border:        $state-warning-border !default;
+$panel-warning-heading-bg:    $state-warning-bg !default;
+
+$panel-danger-text:           $state-danger-text !default;
+$panel-danger-border:         $state-danger-border !default;
+$panel-danger-heading-bg:     $state-danger-bg !default;
+
+
+//== Thumbnails
+//
+//##
+
+//** Padding around the thumbnail image
+$thumbnail-padding:           4px !default;
+//** Thumbnail background color
+$thumbnail-bg:                $body-bg !default;
+//** Thumbnail border color
+$thumbnail-border:            #ddd !default;
+//** Thumbnail border radius
+$thumbnail-border-radius:     $border-radius-base !default;
+
+//** Custom text color for thumbnail captions
+$thumbnail-caption-color:     $text-color !default;
+//** Padding around the thumbnail caption
+$thumbnail-caption-padding:   9px !default;
+
+
+//== Wells
+//
+//##
+
+$well-bg:                     #f5f5f5 !default;
+$well-border:                 darken($well-bg, 7%) !default;
+
+
+//== Badges
+//
+//##
+
+$badge-color:                 #fff !default;
+//** Linked badge text color on hover
+$badge-link-hover-color:      #fff !default;
+$badge-bg:                    $gray-light !default;
+
+//** Badge text color in active nav link
+$badge-active-color:          $link-color !default;
+//** Badge background color in active nav link
+$badge-active-bg:             #fff !default;
+
+$badge-font-weight:           bold !default;
+$badge-line-height:           1 !default;
+$badge-border-radius:         10px !default;
+
+
+//== Breadcrumbs
+//
+//##
+
+$breadcrumb-padding-vertical:   8px !default;
+$breadcrumb-padding-horizontal: 15px !default;
+//** Breadcrumb background color
+$breadcrumb-bg:                 #f5f5f5 !default;
+//** Breadcrumb text color
+$breadcrumb-color:              #ccc !default;
+//** Text color of current page in the breadcrumb
+$breadcrumb-active-color:       $gray-light !default;
+//** Textual separator for between breadcrumb elements
+$breadcrumb-separator:          "/" !default;
+
+
+//== Carousel
+//
+//##
+
+$carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6) !default;
+
+$carousel-control-color:                      #fff !default;
+$carousel-control-width:                      15% !default;
+$carousel-control-opacity:                    .5 !default;
+$carousel-control-font-size:                  20px !default;
+
+$carousel-indicator-active-bg:                #fff !default;
+$carousel-indicator-border-color:             #fff !default;
+
+$carousel-caption-color:                      #fff !default;
+
+
+//== Close
+//
+//##
+
+$close-font-weight:           bold !default;
+$close-color:                 #000 !default;
+$close-text-shadow:           0 1px 0 #fff !default;
+
+
+//== Code
+//
+//##
+
+$code-color:                  #c7254e !default;
+$code-bg:                     #f9f2f4 !default;
+
+$kbd-color:                   #fff !default;
+$kbd-bg:                      #333 !default;
+
+$pre-bg:                      #f5f5f5 !default;
+$pre-color:                   $gray-dark !default;
+$pre-border-color:            #ccc !default;
+$pre-scrollable-max-height:   340px !default;
+
+
+//== Type
+//
+//##
+
+//** Horizontal offset for forms and lists.
+$component-offset-horizontal: 180px !default;
+//** Text muted color
+$text-muted:                  $gray-light !default;
+//** Abbreviations and acronyms border color
+$abbr-border-color:           $gray-light !default;
+//** Headings small color
+$headings-small-color:        $gray-light !default;
+//** Blockquote small color
+$blockquote-small-color:      $gray-light !default;
+//** Blockquote font size
+$blockquote-font-size:        ($font-size-base * 1.25) !default;
+//** Blockquote border color
+$blockquote-border-color:     $gray-lighter !default;
+//** Page header border color
+$page-header-border-color:    $gray-lighter !default;
+//** Width of horizontal description list titles
+$dl-horizontal-offset:        $component-offset-horizontal !default;
+//** Point at which .dl-horizontal becomes horizontal
+$dl-horizontal-breakpoint:    $grid-float-breakpoint !default;
+//** Horizontal line color.
+$hr-border:                   $gray-lighter !default;
+
+// BITTERS VARIABLES
+
+// Breakpoints
+$medium-screen: 600px;
+$large-screen: 900px;
+
+// Typography
+$base-font-family: $helvetica;
+$heading-font-family: $base-font-family;
+
+// Font Sizes
+$base-font-size: 1em;
+
+// Line height
+$base-line-height: 1.5;
+$heading-line-height: 1.2;
+
+// Other Sizes
+$base-border-radius: 0px;
+$base-spacing: $base-line-height * 1em;
+$small-spacing: $base-spacing / 2;
+$base-z-index: 0;
+
+// Colors
+$blue: #1565c0;
+$dark-gray: #333;
+$medium-gray: #999;
+$light-gray: #ddd;
+
+// Font Colors
+$base-font-color: $dark-gray;
+$action-color: $blue;
+
+// Border
+$base-border-color: $light-gray;
+$base-border: 1px solid $base-border-color;
+
+// Background Colors
+$base-background-color: #fff;
+$secondary-background-color: tint($base-border-color, 75%);
+
+// Forms
+$form-box-shadow: inset 0 1px 3px rgba(#000, 0.06);
+$form-box-shadow-focus: $form-box-shadow, 0 0 5px adjust-color($action-color, $lightness: -5%, $alpha: -0.3);
+
+// Animations
+$base-duration: 150ms;
+$base-timing: ease;
+
+// Perficient Digital Variables
+$heading-font-face: 'HalisR', sans-serif;
+$primary-font-face: 'Lato', sans-serif;
+
+$black: #000000;
+$primary-color: #202526;                        // Dark Gray
+$secondary-color: lighten($primary-color, 31%); // Gray
+$accent-color-1: #EF0734;                       // Perficient Digital Red
+$accent-color-2: #FFF200;                       // Perficient Digital Yellow
+$accent-color-3: #2AB68F;                       // Perficient Digital Green
+$white: #FFFFFF;
+
+$primary-padding:1.5rem 3rem 1rem;
+
+// Breakpoints Minimum Resolution
+$tablet: 48em;  // tablet
+$desktop: 64em; // desktop
+
+// Bourbon Omega Reset
+
+@mixin omega-reset($nth) {
+  &:nth-child(#{$nth}) { margin-right: flex-gutter(); }
+  &:nth-child(#{$nth}+1) { clear: none }
+}
diff --git a/app/assets/stylesheets/molecules/_admin.scss b/app/assets/stylesheets/molecules/_admin.scss
new file mode 100644
index 0000000..2915318
--- /dev/null
+++ b/app/assets/stylesheets/molecules/_admin.scss
@@ -0,0 +1,35 @@
+main {
+  @include outer-container;
+  .saveadd {
+    @include span-columns(12);
+  }
+  .savecancel {
+    @include span-columns(12);
+  }
+  .error {
+    background-color: transparent;
+    color: $accent-color-1;
+  }
+  label.error {
+    text-align: right;
+    padding-top: 0;
+    font-size: 0.8rem;
+  }
+}
+
+@media only screen and (min-width: $tablet) {
+  main {
+    @include outer-container;
+    .viewall {
+      text-align: right;
+    }
+    .saveadd {
+      @include span-columns(6);
+    }
+    .savecancel {
+      @include span-columns(6);
+      @include omega();
+      text-align: right;
+    }
+  }
+}
diff --git a/app/assets/stylesheets/molecules/_buttongroups.scss b/app/assets/stylesheets/molecules/_buttongroups.scss
new file mode 100644
index 0000000..3b73009
--- /dev/null
+++ b/app/assets/stylesheets/molecules/_buttongroups.scss
@@ -0,0 +1,26 @@
+.btn-group {
+  > button {
+    float: left;
+    background-color: $white;
+    color: $secondary-color;
+    border-width: 1px 0;
+    border-style: solid;
+    border-color: $secondary-color;
+    margin: 0;
+    &:first-child {
+      border-radius: 999px 0 0 999px;
+      border-width:1px 0 1px 1px;
+    }
+    &:last-child {
+      border-radius: 0 999px 999px 0;
+      border-width:1px 1px 1px 0;
+    }
+    &.selected {
+      background-color: $primary-color;
+      color:$white;
+    }
+  }
+  &:after {
+    @include clearfix;
+  }
+}
\ No newline at end of file
diff --git a/app/assets/stylesheets/molecules/_buttons.scss b/app/assets/stylesheets/molecules/_buttons.scss
new file mode 100755
index 0000000..728e248
--- /dev/null
+++ b/app/assets/stylesheets/molecules/_buttons.scss
@@ -0,0 +1,100 @@
+#{$all-buttons}, .btn {
+  appearance: none;
+  background-color: $primary-color;
+  border: 0;
+  border-radius: $base-border-radius;
+  color: #fff;
+  cursor: pointer;
+  display: inline-block;
+  font-family: $primary-font-face;
+  text-transform: uppercase;
+  font-size: 0.875rem;
+  letter-spacing: 0.2rem;
+  -webkit-font-smoothing: antialiased;
+  font-weight: 600;
+  line-height: 1;
+  padding: 1.2em 2em;
+  text-decoration: none;
+  transition: background-color $base-duration $base-timing;
+  user-select: none;
+  vertical-align: middle;
+  white-space: nowrap;
+
+
+
+  &:hover,
+  &:focus {
+    &:not([disabled]) {
+      background-color: $secondary-color;
+      color: #fff;
+    }
+  }
+
+  &:disabled {
+    cursor: not-allowed;
+    opacity: 0.3;
+  }
+}
+.secondary-btn {
+  background-color: $secondary-color;
+}
+
+.tertiary-btn {
+  background-color: transparent;
+  color: $primary-color;
+  border: 1px solid $primary-color;
+}
+
+.button-save {
+  display: none;
+}
+
+.button-cancel {
+  color: #ef0734;
+  border: 1px solid #ef0734;
+  display: none;
+
+  &:hover {
+    &:not([disabled]) {
+      color: #fff;
+      background-color: #ef0734;
+    }
+  }
+}
+
+.answer-buttons {
+  .button-cancel {
+    margin-left: .5rem;
+  }
+}
+
+.disabled-button {
+  pointer-events: none;
+  opacity: 0.5;
+  cursor: default;
+}
+
+// JS-enabled styles
+html.no-js {
+  .tertiary-btn.button-edit {
+    border: none;
+  }
+  .button-save,
+  .button-cancel {
+    display: none;
+  }
+}
+html.js {
+  .button-edit {
+    @extend .btn;
+  }
+}
+
+@media screen and (min-width: $screen-sm) {
+  html.no-js {
+    .tertiary-btn.button-edit {
+      display: inline-block;
+      padding-top: .75rem;
+    }
+  }
+}
diff --git a/app/assets/stylesheets/molecules/_forms.scss b/app/assets/stylesheets/molecules/_forms.scss
new file mode 100755
index 0000000..7b9008e
--- /dev/null
+++ b/app/assets/stylesheets/molecules/_forms.scss
@@ -0,0 +1,266 @@
+// TODO: Align colors with variables.scss
+fieldset {
+  background-color: transparent;
+  // border: 1px solid $input-border;
+  border: none;
+  padding: 0;
+  margin: 0;
+}
+
+legend {
+  font-weight: 300;
+  margin-bottom: $small-spacing / 2;
+  padding: 0;
+}
+
+label {
+  display: block;
+  font-weight: 300;
+}
+
+#{$all-text-inputs} {
+  display: block;
+  font-size: $base-font-size;
+  border-left:0;
+  border-top: 0;
+  border-right: 0;
+  border-bottom: 1px solid $secondary-color;
+  box-shadow: none;
+  border-radius: $base-border-radius;
+  box-sizing: border-box;
+  margin-bottom: 1.4em;
+  padding: $base-spacing / 3;
+  width: 100%;
+  font-weight: 300;
+  font-family: $primary-font-face;
+  line-height: 1.5em;
+
+  &:hover {
+    border-color: shade($base-border-color, 20%);
+  }
+
+  &:focus {
+    outline: none;
+  }
+
+  &:disabled {
+    background-color: shade($base-background-color, 5%);
+    cursor: default;
+
+    &:hover {
+      border: $base-border;
+    }
+  }
+}
+button:disabled,
+input[type='submit']:disabled {
+  opacity: .3;
+  cursor: default;
+}
+
+textarea {
+  resize: vertical;
+  background: transparent;
+  padding: 0 0 3rem;
+}
+
+[type="search"] {
+  appearance: none;
+}
+
+%multiple-choice {
+  display: inline;
+  margin-right: $small-spacing / 2;
+  &:not(:checked),
+  &:checked {
+    position: absolute;
+    left: -9999px;
+    + label {
+      position: relative;
+      padding-left: 25px;
+      cursor: pointer;
+      &:after {
+        position: absolute;
+        line-height: 0.8;
+        color: $primary-color;
+        transition: all .2s;
+      }
+    }
+    &:disabled {
+      + label {
+        &:before {
+          box-shadow: none;
+          border-color: #bbb;
+          background-color: #ddd;
+        }
+      }
+    }
+  }
+  &:not(:checked) {
+    + label {
+      &:after {
+        opacity: 0;
+        transform: scale(0);
+      }
+    }
+  }
+  &:checked {
+    + label {
+      &:before {
+        border: 1px solid $gray;
+        background: transparent;
+      }
+      &:after {
+        opacity: 1;
+        transform: scale(1);
+      }
+    }
+    &:disabled {
+      + label {
+        &:after {
+          color: #999;
+        }
+      }
+    }
+  }
+  &:hover:not(:disabled) {
+    + label {
+      &:before {
+        border: 2px solid $primary-color;
+      }
+    }
+  }
+  &:disabled {
+    + label {
+      color: #aaa;
+    }
+  }
+  + label {
+    &:before {
+      content: '';
+      position: absolute;
+      left:0; top: 2px;
+      width: 20px; height: 20px;
+      box-shadow: 0;
+      border: 1px solid $primary-color;
+      background: transparent;
+      box-sizing: border-box;
+    }
+  }
+}
+
+[type="radio"] {
+  @extend %multiple-choice;
+  &:not(:checked),
+  &:checked {
+    + label {
+      &:after {
+        content: '\2022';
+        font-size: 28px;
+        top: 1px;
+        left: 2px;
+      }
+    }
+  }
+  + label {
+    &:before {
+      border-radius: 50%;
+    }
+  }
+  &:not(:disabled) + label:before {
+    background-color: white;
+  }
+}
+
+[type="checkbox"] {
+  @extend %multiple-choice;
+  &:not(:checked),
+  &:checked {
+    + label {
+      &:after {
+        font-family: 'Zapf Dingbats', 'Menlo';
+        content: '\2714';
+        font-size: 13px;
+        top: 7px;
+        left: 5px;
+      }
+    }
+  }
+  &:not(:disabled) + label:before {
+    background-color: white;
+  }
+}
+
+[type="file"] {
+  margin-bottom: $small-spacing;
+  width: 100%;
+}
+
+select {
+  margin-bottom: 0.75em;
+  max-width: 100%;
+  width: auto; // needed?
+  background-color: $white;
+  border: 1px solid #aaa;
+  border-radius: 0px;
+  font-weight: 300;
+  font-family: $primary-font-face;
+  font-size: 1rem;
+  &::-ms-expand {
+    display: none;
+  }
+  &:not([multiple]) {
+    background-image: url(../../assets/images/icon-dropdownlist.png);
+    background-repeat: no-repeat;
+    background-position: right 10px bottom 50%;
+    -webkit-appearance: none;
+    -moz-appearance: none;
+    appearance: none;
+    padding: 10px 40px 10px 10px;
+  }
+  option {
+    font-weight: 300;
+    font-family: $primary-font-face;
+    font-size: 1rem;
+  }
+}
+
+.form-group {
+  position: relative;
+  margin-bottom: 1.2rem;
+
+  label {
+    transition: 0.2s ease;
+    + #{$all-text-inputs} {
+      background: transparent;
+    }
+    &.loaded {
+      left: 0;
+      top: 5px;
+      font-size: 1em;
+      position: absolute;
+      pointer-events: none;
+    }
+    &.animate {
+      font-size: 0.8em;
+      top: -10px;
+    }
+  }
+}
+.form-group-multiples { // radios, checks wrappers
+  margin-bottom: .5rem;
+}
+
+.button-group {
+  margin-top: 2rem;
+}
+
+.skills-app-form {
+  margin-top: 2rem;
+}
+
+html.no-js {
+  .chars {
+    display: none;
+  }
+}
diff --git a/app/assets/stylesheets/molecules/_lists.scss b/app/assets/stylesheets/molecules/_lists.scss
new file mode 100755
index 0000000..612780f
--- /dev/null
+++ b/app/assets/stylesheets/molecules/_lists.scss
@@ -0,0 +1,35 @@
+ul, ol {
+  margin: 0;
+  padding: 0 0 0 1em;
+  li {
+    line-height: 2em;
+  }
+}
+
+dl {
+  margin: 0;
+}
+
+dt {
+  font-weight: 600;
+  margin: 0;
+}
+
+dd {
+  margin: 0;
+}
+
+ul {
+  list-style-type: none;
+  list-style-position: inside;
+  li {
+    position:relative;
+    padding-left:1em;
+    &:before {
+      position: absolute;
+      top: 3px;
+      left:0;
+      content:url('../../assets/images/icon-unorderedlistbullet.png');
+    }
+  }
+}
diff --git a/app/assets/stylesheets/molecules/_livecoder.scss b/app/assets/stylesheets/molecules/_livecoder.scss
new file mode 100644
index 0000000..9d3609f
--- /dev/null
+++ b/app/assets/stylesheets/molecules/_livecoder.scss
@@ -0,0 +1,60 @@
+.code-input {
+  margin: 10px 0;
+
+  textarea {
+    border: 1px solid black;
+    min-height: 200px;
+    padding: 10px;
+    width: 100%;
+    margin-bottom: 0;
+    background-color: #fff;
+
+    &[disabled] {
+      background-color: #ddd;
+    }
+  }
+}
+
+.code-input ~ button { 
+  margin-left: 0;
+  clear: both;
+  display: block;
+}
+
+.results {
+  border: 1px solid black;
+  clear: both;
+  margin: 10px 0;
+  min-height: 200px;
+  width: 100%;
+  background-color: #fff;
+}
+
+iframe {
+  border: 0;
+  height: 100%;
+  min-height: 190px;
+  width: 100%;
+}
+
+.live-coder-summary{
+  button.update-button{
+    display: none;
+  }
+}
+
+@media only screen and (min-width: $desktop) {
+  .code-input {
+    float: left;
+    margin: 10px 1%;
+    width: 32%;
+
+    &:nth-of-type(1) {
+      margin-left: 0;
+    }
+
+    &:nth-of-type(3) {
+      margin-right: 0;
+    }
+  }
+}
diff --git a/app/assets/stylesheets/molecules/_progressbar.scss b/app/assets/stylesheets/molecules/_progressbar.scss
new file mode 100644
index 0000000..2e5f831
--- /dev/null
+++ b/app/assets/stylesheets/molecules/_progressbar.scss
@@ -0,0 +1,41 @@
+.progress {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  max-height: 84px;
+}
+
+.progress-bar {
+  background-color: $primary-color;
+  color:white;
+  text-align: right;
+  line-height: 8vw;
+  // padding: 0 5px;
+  font-weight: 900;
+  min-width: 50px;
+  position: relative;
+  transform: skewX(-16.5deg);
+
+  span {
+    display: inline-block;
+    transform: skewX(16.5deg);
+    margin-right: .85rem;
+    font-size: 3vw;
+    line-height: 8vw;
+  }
+}
+
+@media screen and (min-width: 500px) {
+  .progress-bar span {
+    font-size: 16px;
+  }
+}
+
+@media only screen and (min-width: $desktop) {
+  .progress-bar,
+  .progress-bar span {
+    line-height: 84px;
+    max-height: 84px;
+  }
+}
diff --git a/app/assets/stylesheets/molecules/_tables.scss b/app/assets/stylesheets/molecules/_tables.scss
new file mode 100755
index 0000000..2f23953
--- /dev/null
+++ b/app/assets/stylesheets/molecules/_tables.scss
@@ -0,0 +1,22 @@
+table {
+  border-collapse: collapse;
+  margin: $small-spacing 0;
+  width: 100%;
+}
+
+th {
+  border-bottom: 1px solid shade($base-border-color, 25%);
+  font-weight: 600;
+  padding: $small-spacing 0;
+  text-align: left;
+}
+
+td {
+  padding: $small-spacing 0;
+}
+
+tr,
+td,
+th {
+  vertical-align: middle;
+}
diff --git a/app/assets/stylesheets/organisms/.keep b/app/assets/stylesheets/organisms/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/app/assets/stylesheets/pages/_error.scss b/app/assets/stylesheets/pages/_error.scss
new file mode 100644
index 0000000..3d16f4e
--- /dev/null
+++ b/app/assets/stylesheets/pages/_error.scss
@@ -0,0 +1,35 @@
+.error {
+    text-align: center;
+    background-color: $accent-color-1;
+    color: #fff;
+    padding-top: .5rem;
+    padding-bottom: .5rem;
+    margin-bottom: .5rem;
+}
+
+.error-header {
+  @include outer-container;
+  .page-title {
+    display: inline-block;
+    h1 {
+      font-family: $heading-font-face;
+      font-size: 1.5rem;
+    }
+  }
+  .secondary-btn {
+    margin-top: 1rem;
+  }
+}
+
+@media only screen and (min-width: $desktop) {
+  .error-header {
+    .page-title {
+      h1 {
+        font-size: 1.5rem;
+      }
+    }
+    .secondary-btn {
+      float:right;
+    }
+  }
+}
diff --git a/app/assets/stylesheets/pages/_styleguide.scss b/app/assets/stylesheets/pages/_styleguide.scss
new file mode 100644
index 0000000..3ad2ef6
--- /dev/null
+++ b/app/assets/stylesheets/pages/_styleguide.scss
@@ -0,0 +1,32 @@
+.styleguide_tpl {
+  @include outer-container;
+}
+
+#halisr {
+  font-family: $heading-font-face;
+  font-size:2rem;
+  #primary-100 { font-weight: 100; }
+  #primary-200 { font-weight: 200; }
+  #primary-300 { font-weight: 300; }
+  #primary-400 { font-weight: 400; }
+  #primary-500 { font-weight: 500; }
+  #primary-600 { font-weight: 600; }
+  #primary-700 { font-weight: 700; }
+  #primary-800 { font-weight: 800; }
+  #primary-900 { font-weight: 900; }
+}
+
+#lato {
+  font-family: $primary-font-face;
+  font-size:2rem;
+  #secondary-100 { font-weight: 100; }
+  #secondary-300 { font-weight: 300; }
+  #secondary-500 { font-weight: 500; }
+  #secondary-700 { font-weight: 700; }
+  #secondary-900 { font-weight: 900; }
+  #secondary-100-i { font-weight: 100; font-style: italic; }
+  #secondary-300-i { font-weight: 300; font-style: italic; }
+  #secondary-500-i { font-weight: 500; font-style: italic; }
+  #secondary-700-i { font-weight: 700; font-style: italic; }
+  #secondary-900-i { font-weight: 900; font-style: italic; }
+}
\ No newline at end of file
diff --git a/app/assets/stylesheets/templates/_footer.scss b/app/assets/stylesheets/templates/_footer.scss
new file mode 100644
index 0000000..f30502b
--- /dev/null
+++ b/app/assets/stylesheets/templates/_footer.scss
@@ -0,0 +1,44 @@
+footer {
+  width: 100%;
+  height: 112px;
+  @include outer-container;
+}
+.footer_title {
+  @include span-columns(6);
+  padding:2.5rem 0 1rem;
+  h2 {
+    font-family: $primary-font-face;
+    text-transform: uppercase;
+    font-weight: 700;
+    margin: 0 0 0 0;
+    font-size: 3vw;
+  }
+}
+.pd_logo {
+  @include span-columns(6);
+  @include omega();
+  text-align: right;
+  padding:1.5rem 0 1rem;
+  img {
+    max-height: 45px;
+  }
+}
+.footer_yellow-bar {
+  @include span-columns(12);
+  @include omega();
+  @include slantmix(0, 0, 1.5rem);
+  background-color:$accent-color-2;
+}
+
+@media only screen and (min-width: 480px) {
+  footer {
+    height: 116px;
+  }
+}
+
+
+@media screen and (min-width: 700px) {
+  .footer_title h2 {
+    font-size: 1.25rem;
+  }
+}
diff --git a/app/assets/stylesheets/templates/_header.scss b/app/assets/stylesheets/templates/_header.scss
new file mode 100644
index 0000000..b5f6734
--- /dev/null
+++ b/app/assets/stylesheets/templates/_header.scss
@@ -0,0 +1,26 @@
+header {
+  @include outer-container;
+  padding-top: 13vw;
+
+  &.no-progressbar {
+    padding-top: 52px;
+  }
+}
+.page-title {
+  @include omega();
+  text-transform: uppercase;
+  padding: 1rem 3rem .5rem;
+
+  div {
+    font: bold 1.25rem $primary-font-face;
+  }
+}
+
+@media screen and (min-width: $desktop) {
+  header {
+    padding-top: 135px;
+  }
+  .page-title {
+    padding:$primary-padding;
+  }
+}
diff --git a/app/assets/stylesheets/templates/_intro.scss b/app/assets/stylesheets/templates/_intro.scss
new file mode 100644
index 0000000..650c064
--- /dev/null
+++ b/app/assets/stylesheets/templates/_intro.scss
@@ -0,0 +1,26 @@
+.intro_tpl {
+  @include outer-container;
+  padding:$primary-padding;
+  form {
+    margin-top: 3rem;
+    @include span-columns(12);
+    @include omega();
+    button[type='submit']
+    {
+      display: block;
+      width:100%;
+      margin-top: 3rem;
+    }
+  }
+}
+
+@media only screen and (min-width: $desktop) {
+  .intro_tpl {
+    padding:$primary-padding;
+    form {
+      @include span-columns(6);
+      @include shift(3);
+      @include omega();
+    }
+  }
+}
\ No newline at end of file
diff --git a/app/assets/stylesheets/templates/_questions.scss b/app/assets/stylesheets/templates/_questions.scss
new file mode 100644
index 0000000..a60cabb
--- /dev/null
+++ b/app/assets/stylesheets/templates/_questions.scss
@@ -0,0 +1,71 @@
+.questions_tpl {
+  @include outer-container;
+  .prft-heading,
+  .content-well {
+    padding: 1rem 0;
+    @include outer-container;
+    .column-left,
+    .column-right {
+      @include span-columns(12);
+      @include omega();
+    }
+  }
+  .form-group {
+    position: relative;
+    textarea {
+      + label {
+        position: absolute;
+        left: 3rem;
+        top: 1rem;
+        pointer-events: none;
+      }
+      &:focus,
+      &:valid {
+        + label {
+          top: -10px;
+          font-size: 0.8em;
+        }
+      }
+    }
+  }
+  textarea {
+    // padding: 1rem 3rem;
+    padding: 1rem 0;
+  }
+}
+
+.btn-container-left,
+.btn-container-right {
+  padding-top: 2rem;
+}
+
+.btn-container-left {
+  @include span-columns(5);
+}
+.btn-container-right {
+  @include span-columns(7);
+  @include omega();
+  text-align: right;
+}
+
+.btn-container-summary {
+  text-align: center;
+}
+
+@media only screen and (min-width: $desktop) {
+  .questions_tpl {
+    @include outer-container;
+    .prft-heading,
+    .content-well {
+
+      .column-left {
+        @include omega-reset(6n);
+        @include span-columns(6);
+      }
+      .column-right {
+        @include span-columns(6);
+        @include omega();
+      }
+    }
+  }
+}
diff --git a/app/assets/stylesheets/templates/_summary.scss b/app/assets/stylesheets/templates/_summary.scss
new file mode 100644
index 0000000..5a9a343
--- /dev/null
+++ b/app/assets/stylesheets/templates/_summary.scss
@@ -0,0 +1,85 @@
+.summary_tpl {
+  @include outer-container;
+  padding: 2rem 0;
+  .prft-heading {
+    font-size:1.875rem;
+  }
+  .answer-sec {
+    // padding-top:2rem;
+    margin-bottom: 2rem;
+    transition: 0.3s ease;
+    // &.editable {
+    //   background-color: #f2f2f2;
+    // }
+    .question-heading {
+      @include outer-container;
+      .question-title {
+        @include span-columns(12);
+        @include omega();
+        padding-top: .75rem;
+        h3 {
+          font-size: 1.25rem;
+        }
+      }
+      .answer-buttons {
+        @include span-columns(12);
+        @include omega();
+        white-space: nowrap;
+      }
+    }
+    .answer-container {
+      padding:2rem 0;
+    }
+  }
+}
+
+.editable {
+  background-color: #f2f2f2;
+  padding: 2rem;
+  margin: 0 -2rem;
+}
+
+#summary-form {
+  margin-top: 3rem;
+}
+
+.success {
+    text-align: center;
+    background-color: $accent-color-3;
+    color: #fff;
+    padding-top: .5rem;
+    padding-bottom: .5rem;
+    margin-bottom: .5rem; 
+}
+
+@media only screen and (min-width: $tablet) {
+  .summary_tpl {
+    .answer-sec {
+      .question-heading {
+        .question-title {
+          @include span-columns(8);
+        }
+        .answer-buttons {
+          @include span-columns(4);
+          @include omega();
+          text-align: right;
+        }
+      }
+    }
+  }
+}
+
+@media only screen and (min-width: $desktop) {
+  .summary_tpl {
+    .answer-sec {
+      .question-heading {
+        .question-title {
+          @include span-columns(9);
+        }
+        .answer-buttons {
+          @include span-columns(3);
+        }
+      }
+    }
+  }
+}

From 31ae430bb6f601e2c36d42dd00334a0416731d8e Mon Sep 17 00:00:00 2001
From: Derek Montgomery 
Date: Thu, 28 Jul 2016 12:53:35 -0500
Subject: [PATCH 008/205] green tests

---
 .gitignore   | 4 ++++
 .rubocop.yml | 1 +
 2 files changed, 5 insertions(+)

diff --git a/.gitignore b/.gitignore
index 9efdd7a..8a8fe78 100644
--- a/.gitignore
+++ b/.gitignore
@@ -36,6 +36,10 @@
 /.bundle/
 /vendor/bundle
 /lib/bundler/man/
+/vendor/assets
+bower_components/
+node_modules/
+.DS_Store
 
 ### Vim ###
 [._]*.s[a-w][a-z]
diff --git a/.rubocop.yml b/.rubocop.yml
index 39aaeaa..7b9919e 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -3,6 +3,7 @@ AllCops:
     - db/schema.rb
     - db/seeds.rb
     - bin/**/*
+    - vendor/assets/**/*
 
 Style/AndOr:
   Enabled: false

From b286946a3595bc6bf0ed056d376e62f335121351 Mon Sep 17 00:00:00 2001
From: Derek Montgomery 
Date: Thu, 28 Jul 2016 12:55:47 -0500
Subject: [PATCH 009/205] vendor assets

---
 .bowerrc                                      |  4 +++
 Gemfile                                       |  7 ++++++
 Gemfile.lock                                  | 18 +++++++++++++
 README.md                                     |  2 +-
 .../{application.css => application.scss}     | 13 ++++++++--
 bower.json                                    | 25 +++++++++++++++++++
 config/application.rb                         |  9 +++++++
 config/initializers/assets.rb                 |  2 ++
 vendor/assets/javascripts/.keep               |  0
 vendor/assets/stylesheets/.keep               |  0
 10 files changed, 77 insertions(+), 3 deletions(-)
 create mode 100644 .bowerrc
 rename app/assets/stylesheets/{application.css => application.scss} (76%)
 create mode 100644 bower.json
 delete mode 100644 vendor/assets/javascripts/.keep
 delete mode 100644 vendor/assets/stylesheets/.keep

diff --git a/.bowerrc b/.bowerrc
new file mode 100644
index 0000000..bac96ad
--- /dev/null
+++ b/.bowerrc
@@ -0,0 +1,4 @@
+{
+  "directory": "vendor/assets/bower_components",
+  "analytics": false
+}
diff --git a/Gemfile b/Gemfile
index 2549807..97980ae 100644
--- a/Gemfile
+++ b/Gemfile
@@ -14,10 +14,17 @@ gem 'sass-rails', '~> 5.0'
 gem 'turbolinks', '~> 5'
 gem 'uglifier', '>= 1.3.0'
 
+# assets
+gem 'bourbon'
+gem 'neat'
+gem 'bitters'
+
 group :development do
   gem 'rack-livereload'
   gem 'rails-erd'
   gem 'web-console'
+  gem 'better_errors'
+  gem 'binding_of_caller'
 end
 
 group :development, :test do
diff --git a/Gemfile.lock b/Gemfile.lock
index 404f65b..d2ed7ea 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -43,8 +43,19 @@ GEM
     ast (2.3.0)
     awesome_print (1.7.0)
     bcrypt (3.1.11)
+    better_errors (2.1.1)
+      coderay (>= 1.0.0)
+      erubis (>= 2.6.6)
+      rack (>= 0.9.0)
     binding_of_caller (0.7.2)
       debug_inspector (>= 0.0.1)
+    bitters (1.2.0)
+      bourbon (>= 4.2)
+      sass (>= 3.4)
+      thor
+    bourbon (4.2.7)
+      sass (~> 3.4)
+      thor (~> 0.19)
     builder (3.2.2)
     byebug (9.0.5)
     choice (0.2.0)
@@ -119,6 +130,9 @@ GEM
       ruby-progressbar
     multi_json (1.12.1)
     mysql2 (0.4.4)
+    neat (1.8.0)
+      sass (>= 3.3)
+      thor (~> 0.19)
     nenv (0.3.0)
     nio4r (1.2.1)
     nokogiri (1.6.8)
@@ -234,7 +248,10 @@ PLATFORMS
 DEPENDENCIES
   awesome_print
   bcrypt (~> 3.1.7)
+  better_errors
   binding_of_caller
+  bitters
+  bourbon
   byebug
   figaro (~> 1.1.1)
   guard
@@ -248,6 +265,7 @@ DEPENDENCIES
   listen (~> 3.0)
   minitest-reporters
   mysql2 (>= 0.3.18, < 0.5)
+  neat
   pry-byebug
   pry-rails
   puma (~> 3.0)
diff --git a/README.md b/README.md
index 82d0c91..8de62f4 100644
--- a/README.md
+++ b/README.md
@@ -10,6 +10,7 @@ This application manages quizzes intended to be used as pre-interview skill asse
     * honor RuboCop
     * keep tests green
 * pull --rebase !always `git config --global pull.rebase true`
+* cd vendor/assets/ && bitters install && cd ../..
 * place all required dev seed data in fixtures for rails db:fixtures:load
 
 # Docker
@@ -24,4 +25,3 @@ This application manages quizzes intended to be used as pre-interview skill asse
     - starts up simple server for viewing/demo sans guard
 
 visit http://localhost:3000
-
diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.scss
similarity index 76%
rename from app/assets/stylesheets/application.css
rename to app/assets/stylesheets/application.scss
index 0ebd7fe..4928999 100644
--- a/app/assets/stylesheets/application.css
+++ b/app/assets/stylesheets/application.scss
@@ -10,6 +10,15 @@
  * files in this directory. Styles in this file should be added after the last require_* statement.
  * It is generally better to create a new file per style scope.
  *
- *= require_tree .
- *= require_self
  */
+
+@import 'bourbon';
+@import 'base'; // bitters
+@import 'neat';
+
+@import 'core/**/*';
+@import 'atoms/**/*';
+@import 'molecules/**/*';
+// @import 'organisms/**/*';
+@import 'templates/**/*';
+@import 'pages/**/*';
diff --git a/bower.json b/bower.json
new file mode 100644
index 0000000..f607884
--- /dev/null
+++ b/bower.json
@@ -0,0 +1,25 @@
+{
+  "name": "skill-assessment-app",
+  "authors": [
+    "Harish Bhavanichikar",
+    "Jennifer Siegfried",
+    "Derek Montgomery",
+    "Mark Moser"
+  ],
+  "private": true,
+  "dependencies": {
+    "jquery": "1.9.1",
+    "handlebars": "3.0.2",
+    "jquery-validate": "",
+    "tota11y": "",
+    "jquery-mockjax": "^2.1.1",
+    "modernizr-lite": "*"
+  },
+  "ignore": [
+    "**/.*",
+    "node_modules",
+    "bower_components",
+    "test",
+    "tests"
+  ]
+}
diff --git a/config/application.rb b/config/application.rb
index 1f12e80..5b0cbe8 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -11,5 +11,14 @@ module SkillAssessmentApp
     # Settings in config/environments/* take precedence over those specified here.
     # Application configuration should go into files in config/initializers
     # -- all .rb files in that directory are automatically loaded.
+
+    # bitters
+    config.assets.paths << Rails.root.join('vendor', 'assets', 'base')
+
+    # bourbon
+    config.assets.paths << Rails.root.join('vendor', 'assets', 'bourbon')
+
+    # bower
+    config.assets.paths << Rails.root.join('vendor', 'assets', 'bower_components')
   end
 end
diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb
index 01ef3e6..e012c15 100644
--- a/config/initializers/assets.rb
+++ b/config/initializers/assets.rb
@@ -9,3 +9,5 @@ Rails.application.config.assets.version = '1.0'
 # Precompile additional assets.
 # application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
 # Rails.application.config.assets.precompile += %w( search.js )
+
+Rails.application.config.assets.precompile += ['vendor/assets/**/*']
diff --git a/vendor/assets/javascripts/.keep b/vendor/assets/javascripts/.keep
deleted file mode 100644
index e69de29..0000000
diff --git a/vendor/assets/stylesheets/.keep b/vendor/assets/stylesheets/.keep
deleted file mode 100644
index e69de29..0000000

From 5b386937da6dbe34f5d89956b8b51f6550404933 Mon Sep 17 00:00:00 2001
From: Derek Montgomery 
Date: Thu, 28 Jul 2016 13:36:33 -0500
Subject: [PATCH 010/205] Modernizr

---
 app/assets/javascripts/application.js  | 2 +-
 app/views/layouts/application.html.erb | 1 -
 2 files changed, 1 insertion(+), 2 deletions(-)

diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js
index b12018d..d947126 100644
--- a/app/assets/javascripts/application.js
+++ b/app/assets/javascripts/application.js
@@ -13,4 +13,4 @@
 //= require jquery
 //= require jquery_ujs
 //= require turbolinks
-//= require_tree .
+//= require modernizr-lite/modernizr
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb
index 4198d02..3805059 100644
--- a/app/views/layouts/application.html.erb
+++ b/app/views/layouts/application.html.erb
@@ -8,7 +8,6 @@
     <%= yield(:title) %>
 
     <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
-    
   
   
     
From fcf59edfc47581e8d7b46756caf0465e043f3dae Mon Sep 17 00:00:00 2001 From: Derek Montgomery Date: Thu, 28 Jul 2016 13:36:50 -0500 Subject: [PATCH 011/205] fonts --- app/assets/fonts/HalisR-Black.otf | Bin 0 -> 53728 bytes app/assets/fonts/HalisR-Black.woff | Bin 0 -> 30288 bytes app/assets/fonts/HalisR-Black.woff2 | Bin 0 -> 23800 bytes app/assets/fonts/HalisR-Bold.otf | Bin 0 -> 56820 bytes app/assets/fonts/HalisR-Bold.woff | Bin 0 -> 30948 bytes app/assets/fonts/HalisR-Bold.woff2 | Bin 0 -> 24436 bytes app/assets/fonts/HalisR-Book.otf | Bin 0 -> 55492 bytes app/assets/fonts/HalisR-Book.woff | Bin 0 -> 31168 bytes app/assets/fonts/HalisR-Book.woff2 | Bin 0 -> 24572 bytes app/assets/fonts/HalisR-ExtraLight.otf | Bin 0 -> 55232 bytes app/assets/fonts/HalisR-ExtraLight.woff | Bin 0 -> 31312 bytes app/assets/fonts/HalisR-ExtraLight.woff2 | Bin 0 -> 24928 bytes app/assets/fonts/HalisR-Light.otf | Bin 0 -> 53948 bytes app/assets/fonts/HalisR-Light.woff | Bin 0 -> 31308 bytes app/assets/fonts/HalisR-Light.woff2 | Bin 0 -> 24980 bytes app/assets/fonts/HalisR-Medium.otf | Bin 0 -> 53460 bytes app/assets/fonts/HalisR-Medium.woff | Bin 0 -> 30804 bytes app/assets/fonts/HalisR-Medium.woff2 | Bin 0 -> 24132 bytes app/assets/fonts/HalisR-Regular.otf | Bin 0 -> 54444 bytes app/assets/fonts/HalisR-Regular.woff | Bin 0 -> 30832 bytes app/assets/fonts/HalisR-Regular.woff2 | Bin 0 -> 24300 bytes app/assets/fonts/HalisR-Thin.otf | Bin 0 -> 66500 bytes app/assets/fonts/HalisR-Thin.woff | Bin 0 -> 30328 bytes app/assets/fonts/HalisR-Thin.woff2 | Bin 0 -> 24024 bytes app/assets/fonts/Lato-Black.ttf | Bin 0 -> 114588 bytes app/assets/fonts/Lato-Black.woff | Bin 0 -> 31472 bytes app/assets/fonts/Lato-Black.woff2 | Bin 0 -> 24844 bytes app/assets/fonts/Lato-BlackItalic.ttf | Bin 0 -> 111616 bytes app/assets/fonts/Lato-BlackItalic.woff | Bin 0 -> 27676 bytes app/assets/fonts/Lato-BlackItalic.woff2 | Bin 0 -> 22476 bytes app/assets/fonts/Lato-Bold.ttf | Bin 0 -> 121788 bytes app/assets/fonts/Lato-Bold.woff | Bin 0 -> 32580 bytes app/assets/fonts/Lato-Bold.woff2 | Bin 0 -> 25568 bytes app/assets/fonts/Lato-BoldItalic.ttf | Bin 0 -> 120312 bytes app/assets/fonts/Lato-BoldItalic.woff | Bin 0 -> 28528 bytes app/assets/fonts/Lato-BoldItalic.woff2 | Bin 0 -> 23000 bytes app/assets/fonts/Lato-Hairline.ttf | Bin 0 -> 115316 bytes app/assets/fonts/Lato-Hairline.woff | Bin 0 -> 29856 bytes app/assets/fonts/Lato-Hairline.woff2 | Bin 0 -> 23428 bytes app/assets/fonts/Lato-HairlineItalic.ttf | Bin 0 -> 91460 bytes app/assets/fonts/Lato-HairlineItalic.woff | Bin 0 -> 26564 bytes app/assets/fonts/Lato-HairlineItalic.woff2 | Bin 0 -> 21320 bytes app/assets/fonts/Lato-Italic.ttf | Bin 0 -> 118352 bytes app/assets/fonts/Lato-Italic.woff | Bin 0 -> 28332 bytes app/assets/fonts/Lato-Italic.woff2 | Bin 0 -> 22748 bytes app/assets/fonts/Lato-Light.ttf | Bin 0 -> 122524 bytes app/assets/fonts/Lato-Light.woff | Bin 0 -> 31064 bytes app/assets/fonts/Lato-Light.woff2 | Bin 0 -> 24276 bytes app/assets/fonts/Lato-LightItalic.ttf | Bin 0 -> 91600 bytes app/assets/fonts/Lato-LightItalic.woff | Bin 0 -> 28064 bytes app/assets/fonts/Lato-LightItalic.woff2 | Bin 0 -> 22428 bytes app/assets/fonts/Lato-Regular.ttf | Bin 0 -> 120196 bytes app/assets/fonts/Lato-Regular.woff | Bin 0 -> 31856 bytes app/assets/fonts/Lato-Regular.woff2 | Bin 0 -> 24972 bytes app/assets/stylesheets/atoms/_fonts.scss | 104 ++++++++++----------- 55 files changed, 52 insertions(+), 52 deletions(-) create mode 100755 app/assets/fonts/HalisR-Black.otf create mode 100755 app/assets/fonts/HalisR-Black.woff create mode 100755 app/assets/fonts/HalisR-Black.woff2 create mode 100755 app/assets/fonts/HalisR-Bold.otf create mode 100755 app/assets/fonts/HalisR-Bold.woff create mode 100755 app/assets/fonts/HalisR-Bold.woff2 create mode 100755 app/assets/fonts/HalisR-Book.otf create mode 100755 app/assets/fonts/HalisR-Book.woff create mode 100755 app/assets/fonts/HalisR-Book.woff2 create mode 100755 app/assets/fonts/HalisR-ExtraLight.otf create mode 100755 app/assets/fonts/HalisR-ExtraLight.woff create mode 100755 app/assets/fonts/HalisR-ExtraLight.woff2 create mode 100755 app/assets/fonts/HalisR-Light.otf create mode 100755 app/assets/fonts/HalisR-Light.woff create mode 100755 app/assets/fonts/HalisR-Light.woff2 create mode 100755 app/assets/fonts/HalisR-Medium.otf create mode 100755 app/assets/fonts/HalisR-Medium.woff create mode 100755 app/assets/fonts/HalisR-Medium.woff2 create mode 100755 app/assets/fonts/HalisR-Regular.otf create mode 100755 app/assets/fonts/HalisR-Regular.woff create mode 100755 app/assets/fonts/HalisR-Regular.woff2 create mode 100755 app/assets/fonts/HalisR-Thin.otf create mode 100755 app/assets/fonts/HalisR-Thin.woff create mode 100755 app/assets/fonts/HalisR-Thin.woff2 create mode 100755 app/assets/fonts/Lato-Black.ttf create mode 100755 app/assets/fonts/Lato-Black.woff create mode 100755 app/assets/fonts/Lato-Black.woff2 create mode 100755 app/assets/fonts/Lato-BlackItalic.ttf create mode 100755 app/assets/fonts/Lato-BlackItalic.woff create mode 100755 app/assets/fonts/Lato-BlackItalic.woff2 create mode 100755 app/assets/fonts/Lato-Bold.ttf create mode 100755 app/assets/fonts/Lato-Bold.woff create mode 100755 app/assets/fonts/Lato-Bold.woff2 create mode 100755 app/assets/fonts/Lato-BoldItalic.ttf create mode 100755 app/assets/fonts/Lato-BoldItalic.woff create mode 100755 app/assets/fonts/Lato-BoldItalic.woff2 create mode 100755 app/assets/fonts/Lato-Hairline.ttf create mode 100755 app/assets/fonts/Lato-Hairline.woff create mode 100755 app/assets/fonts/Lato-Hairline.woff2 create mode 100755 app/assets/fonts/Lato-HairlineItalic.ttf create mode 100755 app/assets/fonts/Lato-HairlineItalic.woff create mode 100755 app/assets/fonts/Lato-HairlineItalic.woff2 create mode 100755 app/assets/fonts/Lato-Italic.ttf create mode 100755 app/assets/fonts/Lato-Italic.woff create mode 100755 app/assets/fonts/Lato-Italic.woff2 create mode 100755 app/assets/fonts/Lato-Light.ttf create mode 100755 app/assets/fonts/Lato-Light.woff create mode 100755 app/assets/fonts/Lato-Light.woff2 create mode 100755 app/assets/fonts/Lato-LightItalic.ttf create mode 100755 app/assets/fonts/Lato-LightItalic.woff create mode 100755 app/assets/fonts/Lato-LightItalic.woff2 create mode 100755 app/assets/fonts/Lato-Regular.ttf create mode 100755 app/assets/fonts/Lato-Regular.woff create mode 100755 app/assets/fonts/Lato-Regular.woff2 diff --git a/app/assets/fonts/HalisR-Black.otf b/app/assets/fonts/HalisR-Black.otf new file mode 100755 index 0000000000000000000000000000000000000000..e0ffc6b8bb5f624d679d72bd4f9ae0bcb9ff9fe2 GIT binary patch literal 53728 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 literal 0 HcmV?d00001 diff --git a/app/assets/fonts/HalisR-Black.woff b/app/assets/fonts/HalisR-Black.woff new file mode 100755 index 0000000000000000000000000000000000000000..09ca91d404f83affbabde6e41dd87d5ba6786539 GIT binary patch literal 30288 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
diff --git a/app/views/candidate/_live-coder.html.erb b/app/views/candidate/_live-coder.html.erb index 0cab6cb..bd96518 100644 --- a/app/views/candidate/_live-coder.html.erb +++ b/app/views/candidate/_live-coder.html.erb @@ -21,17 +21,17 @@
- +
- +
- +
-- MOVE TO FLASH HASH -- diff --git a/app/views/candidate/_radio.html.erb b/app/views/candidate/_radio.html.erb index c575a95..d5e124e 100644 --- a/app/views/candidate/_radio.html.erb +++ b/app/views/candidate/_radio.html.erb @@ -7,7 +7,7 @@ name="input_radio_<%= question.to_i %>" id="radio_<%= option_id %>" value="<%= option %>" - <%= "checked=\"checked\"" if answer == option %> + <%= "checked=\"checked\"" if question.answer == option %> > diff --git a/app/views/candidate/_text.html.erb b/app/views/candidate/_text.html.erb index e677c4e..bf1a8f0 100644 --- a/app/views/candidate/_text.html.erb +++ b/app/views/candidate/_text.html.erb @@ -1,5 +1,5 @@ - +
Characters remaining:
diff --git a/app/views/candidate/question.html.erb b/app/views/candidate/question.html.erb index af76e93..1c935a6 100644 --- a/app/views/candidate/question.html.erb +++ b/app/views/candidate/question.html.erb @@ -10,7 +10,7 @@

<%= @question.question %>

- <%= render partial: @question.input_type, locals: {question: @question, answer: @answer.answer } %> + <%= render partial: @question.input_type, locals: {question: @question} %>
<% if @status.on_summary %> diff --git a/app/views/candidate/summary.html.erb b/app/views/candidate/summary.html.erb index ca9d652..f0ba7bc 100644 --- a/app/views/candidate/summary.html.erb +++ b/app/views/candidate/summary.html.erb @@ -5,16 +5,15 @@ Once you're done, hit the button at the bottom of the page to submit your answers.

- <%= form_tag(post_summary_path) do %> - <% @candidate.quiz.questions.each do |question| %> + <% @quiz.each do |question| %>

<%= question.question %>

- Edit + Edit
@@ -22,7 +21,7 @@
- <%= render partial: question.input_type, locals: {question: question, answer: @answers.where(question_id: question.id).first.answer } %> + <%= render partial: question.input_type, locals: {question: question} %>
From 1a8d7629ff708a3096a85deba3707066d18eb392 Mon Sep 17 00:00:00 2001 From: Derek Montgomery Date: Fri, 29 Jul 2016 11:00:04 -0500 Subject: [PATCH 019/205] live coder load on question template --- app/assets/javascripts/live-coder.js | 3 ++- app/controllers/candidate_controller.rb | 6 ++++++ app/views/candidate/_live-coder.html.erb | 25 ++---------------------- app/views/candidate/live_coder.html.erb | 19 ++++++++++++++++++ config/routes.rb | 3 +++ 5 files changed, 32 insertions(+), 24 deletions(-) create mode 100644 app/views/candidate/live_coder.html.erb diff --git a/app/assets/javascripts/live-coder.js b/app/assets/javascripts/live-coder.js index ee256c6..2616bd4 100644 --- a/app/assets/javascripts/live-coder.js +++ b/app/assets/javascripts/live-coder.js @@ -113,7 +113,8 @@ $(function(){ }); // If JavaScript is enabled, display the livecoder section dynamically - $("[data-id='live-coder-answer']").load("live-coder-chunk.php .layout", function(){ + var qid = 257208768; + $("[data-id='live-coder-answer']").load("/live-coder-entry/" + qid, function(){ // if it loads in, and hide "finish later" checkbox $("[data-id='live-coder-finish-later']").addClass("hidden"); $('.js-error').addClass('hidden'); diff --git a/app/controllers/candidate_controller.rb b/app/controllers/candidate_controller.rb index 336405a..fd3d445 100644 --- a/app/controllers/candidate_controller.rb +++ b/app/controllers/candidate_controller.rb @@ -35,6 +35,12 @@ class CandidateController < ApplicationController redirect_to :question end + def live_coder + @question = Question.find(params[:question_id]) + @answer = @question.answers.order("RAND()").first.answer + render layout: false + end + # private # # def question_params diff --git a/app/views/candidate/_live-coder.html.erb b/app/views/candidate/_live-coder.html.erb index bd96518..7f1d1ea 100644 --- a/app/views/candidate/_live-coder.html.erb +++ b/app/views/candidate/_live-coder.html.erb @@ -14,28 +14,7 @@
- <% - # answers inserted dynamically via jQuery .load() - # to check for JS capability/enabled + <% # answers inserted dynamically via jQuery .load() + # to check for JS capability/enabled %> - -
- - -
- -
- - -
- -
- - -
- - -- MOVE TO FLASH HASH -- -
You must write code in one of the above textareas to progress.
- -
diff --git a/app/views/candidate/live_coder.html.erb b/app/views/candidate/live_coder.html.erb new file mode 100644 index 0000000..adc3806 --- /dev/null +++ b/app/views/candidate/live_coder.html.erb @@ -0,0 +1,19 @@ +
+ + +
+ +
+ + +
+ +
+ + +
+ +-- MOVE TO FLASH HASH -- +
You must write code in one of the above textareas to progress.
+ +
diff --git a/config/routes.rb b/config/routes.rb index d88e093..b503f26 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -8,6 +8,9 @@ Rails.application.routes.draw do get "/question", to: "candidate#question", as: :question post "/validate", to: "candidate#validate", as: :validate_candidate + # live coder partial + get "/live-coder-entry/:question_id", to: "candidate#live_coder" + root to: "candidate#welcome" # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html end From df8c31403cfc591204accf577eec3205daeb7f31 Mon Sep 17 00:00:00 2001 From: Derek Montgomery Date: Fri, 29 Jul 2016 11:10:39 -0500 Subject: [PATCH 020/205] =?UTF-8?q?custom=20linedtextarea=E2=80=94not=20bo?= =?UTF-8?q?wer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/assets/javascripts/application.js | 2 +- .../javascripts/jquery-linedtextarea-moser.js | 127 ++++++++++++++++++ bower.json | 3 +- 3 files changed, 129 insertions(+), 3 deletions(-) create mode 100644 app/assets/javascripts/jquery-linedtextarea-moser.js diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index f663725..71d4d97 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -14,7 +14,7 @@ //= require jquery_ujs //= require turbolinks //= require modernizr-lite/modernizr -//= require jquery-linedtextareaV0.1/jquery-linedtextarea +//= require jquery-linedtextarea-moser //= require button-group //= require form-animation //= require summary-edit diff --git a/app/assets/javascripts/jquery-linedtextarea-moser.js b/app/assets/javascripts/jquery-linedtextarea-moser.js new file mode 100644 index 0000000..27dced7 --- /dev/null +++ b/app/assets/javascripts/jquery-linedtextarea-moser.js @@ -0,0 +1,127 @@ +/** + * NOTE: MARK MOSER EDITED COPY. DO NOT USE BOWER. + * jQuery Lined Textarea Plugin + * http://alan.blog-city.com/jquerylinedtextarea.htm + * + * Copyright (c) 2010 Alan Williamson + * + * Version: + * $Id: jquery-linedtextarea.js 464 2010-01-08 10:36:33Z alan $ + * + * Released under the MIT License: + * http://www.opensource.org/licenses/mit-license.php + * + * Usage: + * Displays a line number count column to the left of the textarea + * + * Class up your textarea with a given class, or target it directly + * with JQuery Selectors + * + * $(".lined").linedtextarea({ + * selectedLine: 10, + * selectedClass: 'lineselect' + * }); + * + * History: + * - 2010.01.08: Fixed a Google Chrome layout problem + * - 2010.01.07: Refactored code for speed/readability; Fixed horizontal sizing + * - 2010.01.06: Initial Release + * + */ +(function($) { + + $.fn.linedtextarea = function(options) { + + // Get the Options + var opts = $.extend({}, $.fn.linedtextarea.defaults, options); + + + /* + * Helper function to make sure the line numbers are always + * kept up to the current system + */ + var fillOutLines = function(codeLines, h, lineNo){ + while ( (codeLines.height() - h ) <= 0 ){ + if ( lineNo == opts.selectedLine ) + codeLines.append("
" + lineNo + "
"); + else + codeLines.append("
" + lineNo + "
"); + + lineNo++; + } + return lineNo; + }; + + + /* + * Iterate through each of the elements are to be applied to + */ + return this.each(function() { + var lineNo = 1; + var textarea = $(this); + + /* Turn off the wrapping of as we don't want to screw up the line numbers */ + textarea.attr("wrap", "off"); + textarea.css({resize:'none'}); + var originalTextAreaWidth = textarea.outerWidth(); + + /* Wrap the text area in the elements we need */ + textarea.wrap("
"); + var linedTextAreaDiv = textarea.parent().wrap("
"); + var linedWrapDiv = linedTextAreaDiv.parent(); + + linedWrapDiv.prepend("
"); + + var linesDiv = linedWrapDiv.find(".lines"); + linesDiv.height( textarea.height() + 4 ); + + + /* Draw the number bar; filling it out where necessary */ + linesDiv.append( "
" ); + var codeLinesDiv = linesDiv.find(".codelines"); + lineNo = fillOutLines( codeLinesDiv, linesDiv.height(), 1 ); + + /* Move the textarea to the selected line */ + if ( opts.selectedLine != -1 && !isNaN(opts.selectedLine) ){ + var fontSize = parseInt( textarea.height() / (lineNo-2) ); + var position = parseInt( fontSize * opts.selectedLine ) - (textarea.height()/2); + textarea[0].scrollTop = position; + } + + + /* Set the width */ + // var sidebarWidth = linesDiv.outerWidth(); + // var paddingHorizontal = parseInt( linedWrapDiv.css("border-left-width") ) + parseInt( linedWrapDiv.css("border-right-width") ) + parseInt( linedWrapDiv.css("padding-left") ) + parseInt( linedWrapDiv.css("padding-right") ); + // var linedWrapDivNewWidth = originalTextAreaWidth - paddingHorizontal; + // var textareaNewWidth = originalTextAreaWidth - sidebarWidth - paddingHorizontal - 20; + // + // textarea.width( textareaNewWidth ); + // linedWrapDiv.width( linedWrapDivNewWidth ); + + + + /* React to the scroll event */ + textarea.scroll( function(tn){ + var domTextArea = $(this)[0]; + var scrollTop = domTextArea.scrollTop; + var clientHeight = domTextArea.clientHeight; + codeLinesDiv.css( {'margin-top': (-1*scrollTop) + "px"} ); + lineNo = fillOutLines( codeLinesDiv, scrollTop + clientHeight, lineNo ); + }); + + + /* Should the textarea get resized outside of our control */ + textarea.resize( function(tn){ + var domTextArea = $(this)[0]; + linesDiv.height( domTextArea.clientHeight + 4 ); + }); + + }); + }; + + // default options + $.fn.linedtextarea.defaults = { + selectedLine: -1, + selectedClass: 'lineselect' + }; +})(jQuery); diff --git a/bower.json b/bower.json index 5539cbc..f607884 100644 --- a/bower.json +++ b/bower.json @@ -13,8 +13,7 @@ "jquery-validate": "", "tota11y": "", "jquery-mockjax": "^2.1.1", - "modernizr-lite": "*", - "jquery-linedtextareaV0.1": "*" + "modernizr-lite": "*" }, "ignore": [ "**/.*", From 484766a377cf8f5987f8b5c4c778c0a31efc2c28 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Fri, 29 Jul 2016 11:53:01 -0500 Subject: [PATCH 021/205] candidate login/logout --- app/controllers/application_controller.rb | 4 ++ app/controllers/candidate_controller.rb | 22 +++++-- app/views/candidate/welcome.html.erb | 76 ++++++++++++----------- 3 files changed, 59 insertions(+), 43 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 1c07694..7bd799d 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,3 +1,7 @@ class ApplicationController < ActionController::Base protect_from_forgery with: :exception + + def current_candidate + @current_candidate ||= Candidate.find_by(test_hash: session[:test_id]) + end end diff --git a/app/controllers/candidate_controller.rb b/app/controllers/candidate_controller.rb index fd3d445..484c9d3 100644 --- a/app/controllers/candidate_controller.rb +++ b/app/controllers/candidate_controller.rb @@ -26,13 +26,23 @@ class CandidateController < ApplicationController end def thankyou + redirect_to root_path if session[:test_id].nil? + reset_session end def saved end def validate - redirect_to :question + candidate = Candidate.find_by(test_hash: params['test_id']) + + if candidate.nil? + reset_session + redirect_to root_path, alert: "Sorry, incorrect test id" + else + session[:test_id] = candidate.test_hash + redirect_to :question + end end def live_coder @@ -41,9 +51,9 @@ class CandidateController < ApplicationController render layout: false end - # private - # - # def question_params - # params.permit(:save) - # end + private + + def question_params + params.permit(:save) + end end diff --git a/app/views/candidate/welcome.html.erb b/app/views/candidate/welcome.html.erb index f1f4e75..ae4fe34 100644 --- a/app/views/candidate/welcome.html.erb +++ b/app/views/candidate/welcome.html.erb @@ -1,44 +1,46 @@ <% content_for :title, "Skills Assessment" %> - +<% if session[:test_id].present? %> -
-

Oops!

-

- Looks like you hit the browser's Back button. You can't go backwards in the test, - but you'll have a chance at the end to review your answers and make changes. -

+
+

Oops!

+

+ Looks like you hit the browser's Back button. You can't go backwards in the test, + but you'll have a chance at the end to review your answers and make changes. +

- -
+ +
- +<% else %> -
-

Let's Get Started

-

- This is a skills assessment test. It's the first step in the process of interviewing - for a Front-End Development position with Perficient Digital. -

-

- The questions will test your knowledge in the areas of HTML, CSS, and JavaScript. - Please note that you can only move forward through the test, not back, - and you must attempt to answer the question before moving to the - next one. You'll have an opportunity at the end of the test to review and update your - answers if need be. At any time, you may save your progress and log back in to continue - taking the test from where you left off. -

-

- Please answer to the best of your ability—it's totally okay to say - "I don't know"!—and above all, relax and have fun! Once you submit your - answers, we will review your assessment and your recruiter will be in touch. -

+
+

Let's Get Started

+

+ This is a skills assessment test. It's the first step in the process of interviewing + for a Front-End Development position with Perficient Digital. +

+

+ The questions will test your knowledge in the areas of HTML, CSS, and JavaScript. + Please note that you can only move forward through the test, not back, + and you must attempt to answer the question before moving to the + next one. You'll have an opportunity at the end of the test to review and update your + answers if need be. At any time, you may save your progress and log back in to continue + taking the test from where you left off. +

+

+ Please answer to the best of your ability—it's totally okay to say + "I don't know"!—and above all, relax and have fun! Once you submit your + answers, we will review your assessment and your recruiter will be in touch. +

- <%= form_tag(validate_candidate_path) do %> -
- - -
- - <% end %> -
+ <%= form_tag(validate_candidate_path) do %> +
+ + +
+ + <% end %> +
+ +<% end %> From a901186a74b8b7662f66945c295a3081cd1b065a Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Fri, 29 Jul 2016 13:23:25 -0500 Subject: [PATCH 022/205] css selectors are not symbols..... --- test/fixtures/answers.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/fixtures/answers.yml b/test/fixtures/answers.yml index 4297a9b..f617658 100644 --- a/test/fixtures/answers.yml +++ b/test/fixtures/answers.yml @@ -39,7 +39,7 @@ dawn2: dawn3: candidate: dawn question: fed3 - answer: {html: "

I'm a little tealpot

", css: 'h1: {color: teal;}', js: ''} + answer: {html: "

I'm a little tealpot

", css: 'h1 {color: teal;}', js: ''} saved: 0 submitted: true created_at: <%= DateTime.now() - 38.hours - 50.minutes %> @@ -75,7 +75,7 @@ dawn6: dawn7: candidate: dawn question: fed7 - answer: {html: '

This means jQuery needs to be available in live-coder!

', css: 'strong: {font-size: 1.6em;} green: {color: green;}', js: '$("strong").addClass("green");'} + answer: {html: '

This means jQuery needs to be available in live-coder!

', css: "strong {font-size: 1.6em;}\n .green {color: green;}", js: '$("strong").addClass("green");'} saved: 0 submitted: true created_at: <%= DateTime.now() - 38.hours - 34.minutes %> @@ -129,7 +129,7 @@ richard2: richard3: candidate: richard question: fed3 - answer: {html: '

Salmon

', css: 'h1: {color: salmon;}', js: ''} + answer: {html: '

Salmon

', css: 'h1 {color: salmon;}', js: ''} saved: 0 submitted: true created_at: <%= DateTime.now() - 36.hours - 26.minutes %> @@ -165,7 +165,7 @@ richard6: richard7: candidate: richard question: fed7 - answer: {html: '

This means jQuery needs to be available in live-coder!

', css: 'strong: {font-size: 1.6em;} green: {color: green;}', js: '$("strong").addClass("green");'} + answer: {html: '

This means jQuery needs to be available in live-coder!

', css: "strong {font-size: 1.6em;} .green {color: green;}", js: '$("strong").addClass("green");'} saved: 0 submitted: true created_at: <%= DateTime.now() - 36.hours - 34.minutes %> From 5be93e0d3810cbc3c19bc957f155df67c7f30480 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Fri, 29 Jul 2016 13:34:23 -0500 Subject: [PATCH 023/205] candidate quiz progression work --- app/controllers/candidate_controller.rb | 17 ++++++++++------- app/workers/candidate_quiz.rb | 2 +- app/workers/quiz_status.rb | 12 ++++++++++++ test/workers/quiz_status_test.rb | 21 +++++++++++++++++++++ 4 files changed, 44 insertions(+), 8 deletions(-) diff --git a/app/controllers/candidate_controller.rb b/app/controllers/candidate_controller.rb index 484c9d3..f9d47b1 100644 --- a/app/controllers/candidate_controller.rb +++ b/app/controllers/candidate_controller.rb @@ -3,10 +3,12 @@ class CandidateController < ApplicationController end def question - candidate = Candidate.order("RAND()").first - @status = QuizStatus.new(candidate) - @question = candidate.fetch_question(candidate.questions.order("RAND()")[[*0..9].sample].id) - # .where(input_type: 'live-coder') + @status = QuizStatus.new(current_candidate) + qid = @status.current_question_id + + redirect_to :summary and return if qid.nil? + + @question = current_candidate.fetch_question(qid) end def update_question @@ -16,9 +18,10 @@ class CandidateController < ApplicationController end def summary - @candidate = Candidate.order("RAND()").first # Candidate.where(test_hash: '6NjnourLE6Y').first - @quiz = @candidate.my_quiz - @status = QuizStatus.new(@candidate) + @quiz = current_candidate.my_quiz + @status = QuizStatus.new(current_candidate) + + redirect_to :question and return unless @status.current_question_id.nil? end def update_summary diff --git a/app/workers/candidate_quiz.rb b/app/workers/candidate_quiz.rb index 706028f..4329ef0 100644 --- a/app/workers/candidate_quiz.rb +++ b/app/workers/candidate_quiz.rb @@ -24,7 +24,7 @@ class CandidateQuiz inner join questions q on q.quiz_id = c.quiz_id left join answers a on a.candidate_id = c.id AND a.question_id = q.id where q.active = true and c.id = #{candidate_id} #{question} - order by c.id, q.sort;" + order by q.sort;" ActiveRecord::Base.connection.exec_query(sql) end end diff --git a/app/workers/quiz_status.rb b/app/workers/quiz_status.rb index 0a5a747..bca6a87 100644 --- a/app/workers/quiz_status.rb +++ b/app/workers/quiz_status.rb @@ -27,4 +27,16 @@ class QuizStatus (answs / total * 100).round.to_i end + + def current_question_id + sql = "select q.id question_id + from candidates c + inner join questions q on q.quiz_id = c.quiz_id + left join answers a on a.candidate_id = c.id AND a.question_id = q.id + where q.active = true and c.id = #{candidate.to_i} + and (a.id is null OR a.submitted is false) + order by q.sort limit 1;" + result = ActiveRecord::Base.connection.exec_query(sql).to_hash.first + result['question_id'] unless result.nil? + end end diff --git a/test/workers/quiz_status_test.rb b/test/workers/quiz_status_test.rb index 818d6b9..f7cccd5 100644 --- a/test/workers/quiz_status_test.rb +++ b/test/workers/quiz_status_test.rb @@ -77,4 +77,25 @@ class QuizStatusTest < ActiveSupport::TestCase assert_equal 0, status.progress end + + test "roy is on question 3" do + roy = candidates :roy + status = QuizStatus.new roy + + assert_equal questions(:fed3).id, status.current_question_id + end + + test "martha is on question 1" do + martha = candidates :martha + status = QuizStatus.new martha + + assert_equal questions(:fed1).id, status.current_question_id + end + + test "richard is summary" do + richard = candidates :richard + status = QuizStatus.new richard + + assert_equal nil, status.current_question_id + end end From 56d212baa763817bc3ca90996c8262a149252617 Mon Sep 17 00:00:00 2001 From: Derek Montgomery Date: Fri, 29 Jul 2016 14:27:20 -0500 Subject: [PATCH 024/205] Prevent strange error message in summary on cancel --- app/views/candidate/live_coder.html.erb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/candidate/live_coder.html.erb b/app/views/candidate/live_coder.html.erb index adc3806..99be003 100644 --- a/app/views/candidate/live_coder.html.erb +++ b/app/views/candidate/live_coder.html.erb @@ -1,16 +1,16 @@
- +
- +
- +
-- MOVE TO FLASH HASH -- From 9b0bd79ce5b89e36ebb8c93ad7438da490ab021f Mon Sep 17 00:00:00 2001 From: Derek Montgomery Date: Fri, 29 Jul 2016 14:51:20 -0500 Subject: [PATCH 025/205] Summary live coder issues resolved --- app/assets/javascripts/summary-edit.js | 23 ++++++++++++----------- app/views/candidate/live_coder.html.erb | 6 +++--- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/app/assets/javascripts/summary-edit.js b/app/assets/javascripts/summary-edit.js index 55e2915..7a8c0a7 100644 --- a/app/assets/javascripts/summary-edit.js +++ b/app/assets/javascripts/summary-edit.js @@ -92,7 +92,17 @@ var saveClickHandler = function(e) { var data =[]; var executeQuery; var questionId = thisEd.find('.button-edit').attr('data-questionid'); - if(thisEd.find('input').attr('type')=='radio') { + + if (thisEd.find('textarea.code-answer')) { + var htmlAnswer = $(thisEd.find('textarea.code-html')[0]).val(); + var cssAnswer = $(thisEd.find('textarea.code-css')[0]).val(); + var jsAnswer = $(thisEd.find('textarea.code-js')[0]).val(); + data = { + 'html': htmlAnswer, + 'css': cssAnswer, + 'js': jsAnswer + } + } else if(thisEd.find('input').attr('type')=='radio') { $(thisEd.find('input')).each(function() { if($(this).prop('checked')==true) { data = $(this).val(); @@ -104,15 +114,6 @@ var saveClickHandler = function(e) { data.push($(this).val()); } }); - } else if (thisEd.find('textarea.code-answer')) { - var htmlAnswer = $(thisEd.find('textarea.code-html')[0]).val(); - var cssAnswer = $(thisEd.find('textarea.code-css')[0]).val(); - var jsAnswer = $(thisEd.find('textarea.code-js')[0]).val(); - data = { - 'html': htmlAnswer, - 'css': cssAnswer, - 'js': jsAnswer - } } else { data = thisEd.find('textarea').val(); } @@ -122,7 +123,7 @@ var saveClickHandler = function(e) { thisEd.find('textarea:not(.code-answer)').replaceWith('

' + $.trim(thisEd.find('textarea').val()) + '

'); $.ajax({ type: "POST", - url: "assets/update_from_summary.php", + url: "/summary", data:{ id: questionId, answer: data}, success: function(data){ executeQuery = true; diff --git a/app/views/candidate/live_coder.html.erb b/app/views/candidate/live_coder.html.erb index 99be003..c971f6b 100644 --- a/app/views/candidate/live_coder.html.erb +++ b/app/views/candidate/live_coder.html.erb @@ -1,16 +1,16 @@
- +
- +
- +
-- MOVE TO FLASH HASH -- From 69ad750f88f7283faccb807d83aa00fa54a52cb0 Mon Sep 17 00:00:00 2001 From: Derek Montgomery Date: Fri, 29 Jul 2016 15:01:01 -0500 Subject: [PATCH 026/205] Minor styling Housekeeping --- app/assets/stylesheets/molecules/_forms.scss | 1 + app/views/candidate/saved.html.erb | 16 +++++++++------- app/views/candidate/thankyou.html.erb | 10 ++++++---- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/app/assets/stylesheets/molecules/_forms.scss b/app/assets/stylesheets/molecules/_forms.scss index 7b9008e..c35eb0e 100755 --- a/app/assets/stylesheets/molecules/_forms.scss +++ b/app/assets/stylesheets/molecules/_forms.scss @@ -41,6 +41,7 @@ label { &:focus { outline: none; + box-shadow: none; } &:disabled { diff --git a/app/views/candidate/saved.html.erb b/app/views/candidate/saved.html.erb index 8d2eb0e..2f6b950 100644 --- a/app/views/candidate/saved.html.erb +++ b/app/views/candidate/saved.html.erb @@ -1,8 +1,10 @@ -

- Your test results have been saved. You can visit again later with your candidate ID to complete - the test starting from where you left off. -

+
+

+ Your test results have been saved. You can visit again later with your candidate ID to complete + the test starting from where you left off. +

- + +
diff --git a/app/views/candidate/thankyou.html.erb b/app/views/candidate/thankyou.html.erb index fd2f3fc..eea0ee7 100644 --- a/app/views/candidate/thankyou.html.erb +++ b/app/views/candidate/thankyou.html.erb @@ -1,4 +1,6 @@ -

- Your answers have been submitted. We will review and your recruiter - will contact you if we would like to set up an interview. -

+
+

+ Your answers have been submitted. We will review and your recruiter + will contact you if we would like to set up an interview. +

+
From 58c46616073d1b99aaea9d0d51ebe772810db44d Mon Sep 17 00:00:00 2001 From: Derek Montgomery Date: Fri, 29 Jul 2016 15:24:10 -0500 Subject: [PATCH 027/205] dynamically load question ID --- app/assets/javascripts/live-coder.js | 2 +- app/views/candidate/question.html.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/live-coder.js b/app/assets/javascripts/live-coder.js index 2616bd4..aed1f8b 100644 --- a/app/assets/javascripts/live-coder.js +++ b/app/assets/javascripts/live-coder.js @@ -113,7 +113,7 @@ $(function(){ }); // If JavaScript is enabled, display the livecoder section dynamically - var qid = 257208768; + var qid = $('form#answer-form').data('qid'); $("[data-id='live-coder-answer']").load("/live-coder-entry/" + qid, function(){ // if it loads in, and hide "finish later" checkbox $("[data-id='live-coder-finish-later']").addClass("hidden"); diff --git a/app/views/candidate/question.html.erb b/app/views/candidate/question.html.erb index 1c935a6..595259e 100644 --- a/app/views/candidate/question.html.erb +++ b/app/views/candidate/question.html.erb @@ -5,7 +5,7 @@ content_for :footer_title, "Skills Assessment" %> -<%= form_tag(post_question_path) do %> +<%= form_tag post_question_path, id: 'answer-form', data: {qid: @question.question_id} do %>

<%= @question.question %>

From 71786f3c6eaa2e5472eda676442f43fd817c89eb Mon Sep 17 00:00:00 2001 From: Derek Montgomery Date: Fri, 29 Jul 2016 16:28:02 -0500 Subject: [PATCH 028/205] Summary dynamic load progress --- app/assets/javascripts/summary-edit.js | 11 +++++++++++ app/views/candidate/_live-coder.html.erb | 22 ++++++++++++---------- app/views/candidate/summary.html.erb | 2 +- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/app/assets/javascripts/summary-edit.js b/app/assets/javascripts/summary-edit.js index 7a8c0a7..0b4a764 100644 --- a/app/assets/javascripts/summary-edit.js +++ b/app/assets/javascripts/summary-edit.js @@ -161,3 +161,14 @@ $('.answer-block').prop('disabled', true); .on('click', '.button-edit', editClickHandler) .on('click', '.button-cancel', cancelClickHandler) .on('click', '.button-save', saveClickHandler); + + // Dynamically load in coders + $.each($('.answer-sec.live-coder-type'), function(index, elem){ + var qid = $(elem).data('qid'); + $(elem).find("[data-id='live-coder-answer']").load("/live-coder-entry/" + qid, function(){ + $(elem).find('.js-error').addClass('hidden'); + // updateResults(); + $(elem).find(".code-input textarea").linedtextarea(); + }); + +}); diff --git a/app/views/candidate/_live-coder.html.erb b/app/views/candidate/_live-coder.html.erb index 7f1d1ea..7690f65 100644 --- a/app/views/candidate/_live-coder.html.erb +++ b/app/views/candidate/_live-coder.html.erb @@ -2,16 +2,18 @@ Please revisit this page with JavaScript enabled to modify your answer. -
-

- This is a question where you will be asked to write code, and it utilizes a JavaScript-enabled - environment. It looks like JavaScript is not loaded for some reason. Please check the box below - to acknowledge that you agree to come back at a later time to finish answering this question - before you can submit the test. -

- - -
+<% unless params[:action] == 'summary' %> +
+

+ This is a question where you will be asked to write code, and it utilizes a JavaScript-enabled + environment. It looks like JavaScript is not loaded for some reason. Please check the box below + to acknowledge that you agree to come back at a later time to finish answering this question + before you can submit the test. +

+ + +
+<% end %>
<% # answers inserted dynamically via jQuery .load() diff --git a/app/views/candidate/summary.html.erb b/app/views/candidate/summary.html.erb index f0ba7bc..4ab116c 100644 --- a/app/views/candidate/summary.html.erb +++ b/app/views/candidate/summary.html.erb @@ -7,7 +7,7 @@ <%= form_tag(post_summary_path) do %> <% @quiz.each do |question| %> -
+

<%= question.question %>

From c9375937fa92ff08cb32555f8bcb49f54ad3d18f Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Sat, 30 Jul 2016 16:25:09 -0500 Subject: [PATCH 029/205] answer inserts --- .rubocop.yml | 4 +++ app/controllers/candidate_controller.rb | 36 ++++++++++++++++++++----- app/views/candidate/_checkbox.html.erb | 24 +++++++++-------- app/views/candidate/_radio.html.erb | 15 +++++------ app/views/candidate/_text.html.erb | 9 ++++--- app/views/candidate/live_coder.html.erb | 5 ++-- app/views/candidate/question.html.erb | 6 +++-- app/views/candidate/summary.html.erb | 25 ++++++++--------- config/routes.rb | 21 ++++++++------- db/sql/candidate_quiz.sql | 9 +++++++ test/fixtures/answers.yml | 4 +-- 11 files changed, 100 insertions(+), 58 deletions(-) create mode 100644 db/sql/candidate_quiz.sql diff --git a/.rubocop.yml b/.rubocop.yml index 7b9919e..47bed8a 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -25,6 +25,8 @@ Style/ExtraSpacing: Style/IndentationConsistency: EnforcedStyle: rails + Exclude: + - config/routes.rb Style/MethodDefParentheses: Enabled: false @@ -39,6 +41,7 @@ Style/StringLiterals: Metrics/AbcSize: Exclude: - db/migrate/**/* + Max: 27 Metrics/LineLength: Max: 110 @@ -51,3 +54,4 @@ Metrics/LineLength: Metrics/MethodLength: Exclude: - db/migrate/* + - app/controllers/* diff --git a/app/controllers/candidate_controller.rb b/app/controllers/candidate_controller.rb index f9d47b1..5cd5756 100644 --- a/app/controllers/candidate_controller.rb +++ b/app/controllers/candidate_controller.rb @@ -9,12 +9,25 @@ class CandidateController < ApplicationController redirect_to :summary and return if qid.nil? @question = current_candidate.fetch_question(qid) + @answer = Answer.new end - def update_question - redirect_to :summary and return if params.key?(:update) - redirect_to :saved and return if params.key?(:save) - redirect_to :question + def update_answer + answer_ids = { question_id: answer_params[:question_id], candidate_id: current_candidate.to_i } + @answer = Answer.find_or_create_by!(answer_ids) + @answer.answer = answer_for_type + @answer.saved = answer_params[:save] + @answer.submitted = answer_params[:next] + + if @answer.save + redirect_to :summary and return if params.key?(:update) + redirect_to :saved and return if params.key?(:save) + redirect_to :question + else + flash[:error] = [answer_params[:question_id]] + @question = current_candidate.fetch_question(qid) + render :question + end end def summary @@ -56,7 +69,18 @@ class CandidateController < ApplicationController private - def question_params - params.permit(:save) + def answer_params + params.require(:answer).permit( + :question_id, :answer_id, + :save, :next, :summary, + :radio, :text, checkbox: [], live_coder: [] + ) + end + + def answer_for_type + return answer_params[:radio] unless answer_params[:radio].nil? + return answer_params[:text] unless answer_params[:text].nil? + return answer_params[:checkbox] unless answer_params[:checkbox].nil? + return answer_params[:live_coder] unless answer_params[:live_coder].nil? end end diff --git a/app/views/candidate/_checkbox.html.erb b/app/views/candidate/_checkbox.html.erb index 96d1e11..ca06c9b 100644 --- a/app/views/candidate/_checkbox.html.erb +++ b/app/views/candidate/_checkbox.html.erb @@ -1,17 +1,19 @@ <% - question.input_options.each do | option | - option_id = "#{option.parameterize}_#{question.to_i}" + question.input_options.each_with_index do | option, i | + option_id = "#{question.question_id}_#{i}" + + checkbox_html = {class: 'checkbox', + id: "answer_#{option_id}", + name: "answer[checkbox][]", + checked: Array(question.answer).include?(option) + } %>
- - > - + <%= form.check_box(:answer, checkbox_html, option, '') %> + <%= form.label(option_id, option) %>
<% end %> --- MOVE TO FLASH HASH -- -
Please select or enter an answer.
+<% if flash[:error].try(:include?, question.to_i) %> +
Please select an answer.
+<% end %> diff --git a/app/views/candidate/_radio.html.erb b/app/views/candidate/_radio.html.erb index d5e124e..38a8bbd 100644 --- a/app/views/candidate/_radio.html.erb +++ b/app/views/candidate/_radio.html.erb @@ -1,17 +1,14 @@ <% question.input_options.each do | option | option_id = "#{option.parameterize}_#{question.to_i}" + radio_html = {class: 'radio', id: option_id} %>
- - > - + <%= radio_button_tag('answer[radio]', option, (question.answer == option), radio_html) %> + <%= label_tag(option_id, option) %>
<% end %> --- MOVE TO FLASH HASH -- -
Please select or enter an answer. (The character limit for a textarea answer is 1000)
+<% if flash[:error].try(:include?, question.to_i) %> +
Please select an answer.
+<% end %> diff --git a/app/views/candidate/_text.html.erb b/app/views/candidate/_text.html.erb index bf1a8f0..db29ee0 100644 --- a/app/views/candidate/_text.html.erb +++ b/app/views/candidate/_text.html.erb @@ -1,7 +1,8 @@ - - + +
Characters remaining:
--- MOVE TO FLASH HASH -- -
Please select or enter an answer. (The character limit for a textarea answer is 1000)
+<% if flash[:error].try(:include?, question.to_i) %> +
Please select or enter an answer. (The character limit for a textarea answer is 1000)
+<% end %> diff --git a/app/views/candidate/live_coder.html.erb b/app/views/candidate/live_coder.html.erb index c971f6b..331e3e0 100644 --- a/app/views/candidate/live_coder.html.erb +++ b/app/views/candidate/live_coder.html.erb @@ -13,7 +13,8 @@
--- MOVE TO FLASH HASH -- -
You must write code in one of the above textareas to progress.
+<% if flash[:error].try(:include?, @question.to_i) %> +
You must write code in one of the above textareas to progress.
+<% end %>
diff --git a/app/views/candidate/question.html.erb b/app/views/candidate/question.html.erb index 595259e..34eafc1 100644 --- a/app/views/candidate/question.html.erb +++ b/app/views/candidate/question.html.erb @@ -5,12 +5,14 @@ content_for :footer_title, "Skills Assessment" %> -<%= form_tag post_question_path, id: 'answer-form', data: {qid: @question.question_id} do %> +<%= form_for(@answer, url: post_answer_path(@answer.id), html:{id: 'answer-form', data: {qid: @question.question_id}}) do |form| %>

<%= @question.question %>

- <%= render partial: @question.input_type, locals: {question: @question} %> + <%= hidden_field_tag 'answer[question_id]', @question.question_id %> + <%= hidden_field_tag 'answer[answer_id]', @question.answer_id %> + <%= render partial: @question.input_type, locals: {question: @question, form: form} %>
<% if @status.on_summary %> diff --git a/app/views/candidate/summary.html.erb b/app/views/candidate/summary.html.erb index 4ab116c..5230789 100644 --- a/app/views/candidate/summary.html.erb +++ b/app/views/candidate/summary.html.erb @@ -5,8 +5,8 @@ Once you're done, hit the button at the bottom of the page to submit your answers.

- <%= form_tag(post_summary_path) do %> - <% @quiz.each do |question| %> + <% @quiz.each do |question| %> + <%= form_for(:answer, url: post_summary_path, html:{id: 'summary-form'}) do |form| %>
@@ -21,20 +21,21 @@
- <%= render partial: question.input_type, locals: {question: question} %> + <%= hidden_field_tag 'answer[question_id]', question.question_id %> + <%= render partial: question.input_type, locals: {question: question, form: form} %>
<% end #questions loop %> - - <% if @status.can_submit %> -
- -
- <% else %> -
Sorry, you must answer all questions before you can submit.
- <% end %> - <% end #form_tag %> + <% if @status.can_submit %> +
+ +
+ <% else %> +
Sorry, you must answer all questions before you can submit.
+ <% end %> + +
diff --git a/config/routes.rb b/config/routes.rb index b503f26..d52d09c 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,16 +1,17 @@ Rails.application.routes.draw do - get "/welcome", to: "candidate#welcome", as: :welcome - get "/thankyou", to: "candidate#thankyou", as: :thankyou - get "/saved", to: "candidate#saved", as: :saved - get "/summary", to: "candidate#summary", as: :summary - post "/summary", to: "candidate#update_summary", as: :post_summary - post "/question", to: "candidate#update_question", as: :post_question - get "/question", to: "candidate#question", as: :question - post "/validate", to: "candidate#validate", as: :validate_candidate + post "/validate", to: "candidate#validate", as: :validate_candidate + get "/welcome", to: "candidate#welcome", as: :welcome + get "/thankyou", to: "candidate#thankyou", as: :thankyou + get "/saved", to: "candidate#saved", as: :saved - # live coder partial - get "/live-coder-entry/:question_id", to: "candidate#live_coder" + post "/question(/:answer_id)", to: "candidate#update_answer", as: :post_answer + get "/question(/:question_id)", to: "candidate#question", as: :question + get "/live-coder-entry/:question_id", to: "candidate#live_coder", as: :live_coder + + post "/summary", to: "candidate#update_summary", as: :post_summary + get "/summary", to: "candidate#summary", as: :summary root to: "candidate#welcome" + # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html end diff --git a/db/sql/candidate_quiz.sql b/db/sql/candidate_quiz.sql new file mode 100644 index 0000000..0254f2d --- /dev/null +++ b/db/sql/candidate_quiz.sql @@ -0,0 +1,9 @@ +select c.id candidate_id + , c.name, c.test_hash + , q.quiz_id, q.id question_id, a.id answer_id, q.sort + , q.question, q.category, q.input_type, q.input_options, a.answer + , ifnull(a.saved, false) saved, ifnull(a.submitted, false) submitted , a.updated_at +from candidates c + inner join questions q on q.quiz_id = c.quiz_id + left join answers a on a.candidate_id = c.id AND a.question_id = q.id +order by c.name, q.sort; diff --git a/test/fixtures/answers.yml b/test/fixtures/answers.yml index f617658..ef29517 100644 --- a/test/fixtures/answers.yml +++ b/test/fixtures/answers.yml @@ -75,7 +75,7 @@ dawn6: dawn7: candidate: dawn question: fed7 - answer: {html: '

This means jQuery needs to be available in live-coder!

', css: "strong {font-size: 1.6em;}\n .green {color: green;}", js: '$("strong").addClass("green");'} + answer: {html: '

This means jQuery needs to be available in live-coder!

', css: "strong {font-size: 1.6em;}\n.green {color: green;}", js: '$("strong").addClass("green");'} saved: 0 submitted: true created_at: <%= DateTime.now() - 38.hours - 34.minutes %> @@ -165,7 +165,7 @@ richard6: richard7: candidate: richard question: fed7 - answer: {html: '

This means jQuery needs to be available in live-coder!

', css: "strong {font-size: 1.6em;} .green {color: green;}", js: '$("strong").addClass("green");'} + answer: {html: '

This means jQuery needs to be available in live-coder!

', css: "strong {font-size: 1.6em;}\n.green {color: green;}", js: '$("strong").addClass("green");'} saved: 0 submitted: true created_at: <%= DateTime.now() - 36.hours - 34.minutes %> From 0107c601b32cc534723c90a2d59bbaa521c0b952 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Sun, 31 Jul 2016 09:56:02 -0500 Subject: [PATCH 030/205] recruiter login + index --- Guardfile | 2 +- app/controllers/application_controller.rb | 18 +++++- app/controllers/recruiter_controller.rb | 40 +++++++++++++ app/models/candidate.rb | 5 ++ app/views/recruiter/create.html.erb | 2 + app/views/recruiter/index.html.erb | 23 ++++++++ app/views/recruiter/login.html.erb | 21 +++++++ app/views/recruiter/new.html.erb | 2 + config/routes.rb | 9 +++ test/controllers/recruiter_controller_test.rb | 56 +++++++++++++++++++ test/fixtures/candidates.yml | 8 +-- 11 files changed, 179 insertions(+), 7 deletions(-) create mode 100644 app/controllers/recruiter_controller.rb create mode 100644 app/views/recruiter/create.html.erb create mode 100644 app/views/recruiter/index.html.erb create mode 100644 app/views/recruiter/login.html.erb create mode 100644 app/views/recruiter/new.html.erb create mode 100644 test/controllers/recruiter_controller_test.rb diff --git a/Guardfile b/Guardfile index 738d098..3a072a4 100644 --- a/Guardfile +++ b/Guardfile @@ -15,7 +15,7 @@ # # and, you'll have to watch "config/Guardfile" instead of "Guardfile" -guard :minitest, spring: true, all_after_pass: true do +guard :minitest, spring: true do # , all_after_pass: true watch(%r{^test/test_helper\.rb$}) { 'test' } watch(%r{^test/(.*)\/?(.*)_test\.rb$}) watch(%r{^app/(.*/)?([^/]+)\.rb$}) { |m| "test/#{m[1]}#{m[2]}_test.rb" } diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 7bd799d..cb5e9bf 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,7 +1,21 @@ class ApplicationController < ActionController::Base protect_from_forgery with: :exception - def current_candidate - @current_candidate ||= Candidate.find_by(test_hash: session[:test_id]) + def current_recruiter + @current_recruiter ||= User.find_by(id: session[:user]) if session[:user] end + + def current_candidate + @current_candidate ||= Candidate.find_by(test_hash: session[:test_id]) if session[:test_id] + end + + private + + def auth_params + params.require(:auth).permit(:email, :password) + end + + def authorize_recruiter + redirect_to recruiter_login_path unless current_recruiter + end end diff --git a/app/controllers/recruiter_controller.rb b/app/controllers/recruiter_controller.rb new file mode 100644 index 0000000..0b51426 --- /dev/null +++ b/app/controllers/recruiter_controller.rb @@ -0,0 +1,40 @@ +class RecruiterController < ApplicationController + before_action :authorize_recruiter, except: [:login, :auth] + + def index + @candidates = current_recruiter.candidates + end + + def new + @candidate = Candidate.new + end + + def create + end + + def login + redirect_to recruiter_path unless current_recruiter.nil? + end + + def auth + recruiter = User.find_by(email: auth_params[:email]) + + if recruiter && recruiter.authenticate(auth_params[:password]) + session[:user] = recruiter.to_i + redirect_to recruiter_path + else + redirect_to recruiter_login_path, flash: { error: "Sorry, incorrect email or password." } + end + end + + def logout + reset_session + redirect_to recruiter_login_path + end + + private + + def candidate_params + params.require(:candidate).permit(:name, :email, :experience, :quiz_id) + end +end diff --git a/app/models/candidate.rb b/app/models/candidate.rb index b6bce4a..482864a 100644 --- a/app/models/candidate.rb +++ b/app/models/candidate.rb @@ -26,6 +26,11 @@ class Candidate < ApplicationRecord CandidateQuiz.new(id).build_my_quiz end + def status + # TODO: quiz status: not started, started, completed + "--" + end + private def generate_test_hash diff --git a/app/views/recruiter/create.html.erb b/app/views/recruiter/create.html.erb new file mode 100644 index 0000000..abf096a --- /dev/null +++ b/app/views/recruiter/create.html.erb @@ -0,0 +1,2 @@ +

Recruiter#create

+

Find me in app/views/recruiter/create.html.erb

diff --git a/app/views/recruiter/index.html.erb b/app/views/recruiter/index.html.erb new file mode 100644 index 0000000..65c7b7d --- /dev/null +++ b/app/views/recruiter/index.html.erb @@ -0,0 +1,23 @@ +
+

Candidates

+ + <%= link_to "Create New Candidate", new_candidate_path, {class: 'button'} %> + + + + + + + + + + <% @candidates.each do |candidate| %> + + + + + + + <% end %> +
CandidateEmailExperienceStatus
<%= candidate.name %><%= mail_to(candidate.email) %><%= candidate.experience %> years<%= candidate.status %>
+
diff --git a/app/views/recruiter/login.html.erb b/app/views/recruiter/login.html.erb new file mode 100644 index 0000000..abfa894 --- /dev/null +++ b/app/views/recruiter/login.html.erb @@ -0,0 +1,21 @@ +
+

Recruiter Login

+ + <% if flash[:error].present? %> +
<%= flash[:error] %>
+ <% end %> + + <%= form_for :auth, url: recruiter_login_path do |form| %> +
+ <%= form.label :email %> + <%= form.email_field :email %> +
+ +
+ <%= form.label :password %> + <%= form.password_field :password %> +
+ + <%= submit_tag "Login" %> + <% end %> +
diff --git a/app/views/recruiter/new.html.erb b/app/views/recruiter/new.html.erb new file mode 100644 index 0000000..6afd6ab --- /dev/null +++ b/app/views/recruiter/new.html.erb @@ -0,0 +1,2 @@ +

Create new candidate

+ diff --git a/config/routes.rb b/config/routes.rb index d52d09c..410be75 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -11,6 +11,15 @@ Rails.application.routes.draw do post "/summary", to: "candidate#update_summary", as: :post_summary get "/summary", to: "candidate#summary", as: :summary + get "/review", to: "review#index", as: :review + + get "/recruiter", to: "recruiter#index", as: :recruiter + get "/recruiter/new-candidate", to: "recruiter#new", as: :new_candidate + post "/recruiter/new-candidate", to: "recruiter#create", as: :create_candidate + get "/recruiter/logout", to: "recruiter#logout", as: :recruiter_logout + get "/recruiter/login", to: "recruiter#login", as: :recruiter_login + post "/recruiter/login", to: "recruiter#auth", as: :recruiter_auth + root to: "candidate#welcome" # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html diff --git a/test/controllers/recruiter_controller_test.rb b/test/controllers/recruiter_controller_test.rb new file mode 100644 index 0000000..e3bfe7f --- /dev/null +++ b/test/controllers/recruiter_controller_test.rb @@ -0,0 +1,56 @@ +require 'test_helper' + +class RecruiterControllerTest < ActionDispatch::IntegrationTest + def setup_auth + post recruiter_auth_url, params: { auth: + { email: 'pdr.recruiter@mailinator.com', password: 'password' } } + end + + test "should get login" do + get recruiter_login_url + assert_response :success + end + + test "should require auth or redirect" do + get recruiter_url + assert_redirected_to recruiter_login_path + + get new_candidate_url + assert_redirected_to recruiter_login_path + + post create_candidate_url, params: { candidate: { name: 'foo', email: 'bar', experience: 'baz' } } + assert_redirected_to recruiter_login_path + end + + test "should auth to index" do + setup_auth + assert_redirected_to recruiter_path + assert session[:user].present? + end + + test "should fail auth with flash" do + post recruiter_auth_url, params: { auth: + { email: 'pdr.recruiter@mailinator.com', password: 'bad-password' } } + + assert_redirected_to recruiter_login_path + assert flash[:error] + end + + test "should get candidate list" do + setup_auth + get recruiter_url + assert_response :success + end + + test "should get new" do + setup_auth + get new_candidate_url + assert_response :success + end + + test "should get create" do + setup_auth + get create_candidate_url + assert_response :success + end +end diff --git a/test/fixtures/candidates.yml b/test/fixtures/candidates.yml index c5c8342..7eeca9e 100644 --- a/test/fixtures/candidates.yml +++ b/test/fixtures/candidates.yml @@ -4,7 +4,7 @@ roy: name: Roy Cruz email: roy.cruz@mailinator.com experience: 0-3 - recruiter: reviewer + recruiter: recruiter quiz: fed completed: false reminded: false @@ -14,7 +14,7 @@ martha: name: Martha Watts email: martha.watts@mailinator.com experience: 4-6 - recruiter: reviewer + recruiter: recruiter quiz: fed completed: false reminded: false @@ -24,7 +24,7 @@ dawn: name: Dawn Hopkins email: dawn.hopkins@mailinator.com experience: 0-2 - recruiter: reviewer + recruiter: recruiter quiz: fed completed: false reminded: true @@ -34,7 +34,7 @@ richard: name: Richard Burns email: richard.burns@mailinator.com experience: 15+ - recruiter: reviewer + recruiter: recruiter quiz: fed completed: true reminded: false From 87bf18fa4b7c8b0c62b7de56716d766e90b65d81 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Sun, 31 Jul 2016 14:27:37 -0500 Subject: [PATCH 031/205] removed execution bit --- app/assets/fonts/HalisR-Black.otf | Bin app/assets/fonts/HalisR-Black.woff | Bin app/assets/fonts/HalisR-Black.woff2 | Bin app/assets/fonts/HalisR-Bold.otf | Bin app/assets/fonts/HalisR-Bold.woff | Bin app/assets/fonts/HalisR-Bold.woff2 | Bin app/assets/fonts/HalisR-Book.otf | Bin app/assets/fonts/HalisR-Book.woff | Bin app/assets/fonts/HalisR-Book.woff2 | Bin app/assets/fonts/HalisR-ExtraLight.otf | Bin app/assets/fonts/HalisR-ExtraLight.woff | Bin app/assets/fonts/HalisR-ExtraLight.woff2 | Bin app/assets/fonts/HalisR-Light.otf | Bin app/assets/fonts/HalisR-Light.woff | Bin app/assets/fonts/HalisR-Light.woff2 | Bin app/assets/fonts/HalisR-Medium.otf | Bin app/assets/fonts/HalisR-Medium.woff | Bin app/assets/fonts/HalisR-Medium.woff2 | Bin app/assets/fonts/HalisR-Regular.otf | Bin app/assets/fonts/HalisR-Regular.woff | Bin app/assets/fonts/HalisR-Regular.woff2 | Bin app/assets/fonts/HalisR-Thin.otf | Bin app/assets/fonts/HalisR-Thin.woff | Bin app/assets/fonts/HalisR-Thin.woff2 | Bin app/assets/fonts/Lato-Black.ttf | Bin app/assets/fonts/Lato-Black.woff | Bin app/assets/fonts/Lato-Black.woff2 | Bin app/assets/fonts/Lato-BlackItalic.ttf | Bin app/assets/fonts/Lato-BlackItalic.woff | Bin app/assets/fonts/Lato-BlackItalic.woff2 | Bin app/assets/fonts/Lato-Bold.ttf | Bin app/assets/fonts/Lato-Bold.woff | Bin app/assets/fonts/Lato-Bold.woff2 | Bin app/assets/fonts/Lato-BoldItalic.ttf | Bin app/assets/fonts/Lato-BoldItalic.woff | Bin app/assets/fonts/Lato-BoldItalic.woff2 | Bin app/assets/fonts/Lato-Hairline.ttf | Bin app/assets/fonts/Lato-Hairline.woff | Bin app/assets/fonts/Lato-Hairline.woff2 | Bin app/assets/fonts/Lato-HairlineItalic.ttf | Bin app/assets/fonts/Lato-HairlineItalic.woff | Bin app/assets/fonts/Lato-HairlineItalic.woff2 | Bin app/assets/fonts/Lato-Italic.ttf | Bin app/assets/fonts/Lato-Italic.woff | Bin app/assets/fonts/Lato-Italic.woff2 | Bin app/assets/fonts/Lato-Light.ttf | Bin app/assets/fonts/Lato-Light.woff | Bin app/assets/fonts/Lato-Light.woff2 | Bin app/assets/fonts/Lato-LightItalic.ttf | Bin app/assets/fonts/Lato-LightItalic.woff | Bin app/assets/fonts/Lato-LightItalic.woff2 | Bin app/assets/fonts/Lato-Regular.ttf | Bin app/assets/fonts/Lato-Regular.woff | Bin app/assets/fonts/Lato-Regular.woff2 | Bin app/assets/stylesheets/atoms/_typography.scss | 0 app/assets/stylesheets/molecules/_buttons.scss | 0 app/assets/stylesheets/molecules/_tables.scss | 0 57 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 app/assets/fonts/HalisR-Black.otf mode change 100755 => 100644 app/assets/fonts/HalisR-Black.woff mode change 100755 => 100644 app/assets/fonts/HalisR-Black.woff2 mode change 100755 => 100644 app/assets/fonts/HalisR-Bold.otf mode change 100755 => 100644 app/assets/fonts/HalisR-Bold.woff mode change 100755 => 100644 app/assets/fonts/HalisR-Bold.woff2 mode change 100755 => 100644 app/assets/fonts/HalisR-Book.otf mode change 100755 => 100644 app/assets/fonts/HalisR-Book.woff mode change 100755 => 100644 app/assets/fonts/HalisR-Book.woff2 mode change 100755 => 100644 app/assets/fonts/HalisR-ExtraLight.otf mode change 100755 => 100644 app/assets/fonts/HalisR-ExtraLight.woff mode change 100755 => 100644 app/assets/fonts/HalisR-ExtraLight.woff2 mode change 100755 => 100644 app/assets/fonts/HalisR-Light.otf mode change 100755 => 100644 app/assets/fonts/HalisR-Light.woff mode change 100755 => 100644 app/assets/fonts/HalisR-Light.woff2 mode change 100755 => 100644 app/assets/fonts/HalisR-Medium.otf mode change 100755 => 100644 app/assets/fonts/HalisR-Medium.woff mode change 100755 => 100644 app/assets/fonts/HalisR-Medium.woff2 mode change 100755 => 100644 app/assets/fonts/HalisR-Regular.otf mode change 100755 => 100644 app/assets/fonts/HalisR-Regular.woff mode change 100755 => 100644 app/assets/fonts/HalisR-Regular.woff2 mode change 100755 => 100644 app/assets/fonts/HalisR-Thin.otf mode change 100755 => 100644 app/assets/fonts/HalisR-Thin.woff mode change 100755 => 100644 app/assets/fonts/HalisR-Thin.woff2 mode change 100755 => 100644 app/assets/fonts/Lato-Black.ttf mode change 100755 => 100644 app/assets/fonts/Lato-Black.woff mode change 100755 => 100644 app/assets/fonts/Lato-Black.woff2 mode change 100755 => 100644 app/assets/fonts/Lato-BlackItalic.ttf mode change 100755 => 100644 app/assets/fonts/Lato-BlackItalic.woff mode change 100755 => 100644 app/assets/fonts/Lato-BlackItalic.woff2 mode change 100755 => 100644 app/assets/fonts/Lato-Bold.ttf mode change 100755 => 100644 app/assets/fonts/Lato-Bold.woff mode change 100755 => 100644 app/assets/fonts/Lato-Bold.woff2 mode change 100755 => 100644 app/assets/fonts/Lato-BoldItalic.ttf mode change 100755 => 100644 app/assets/fonts/Lato-BoldItalic.woff mode change 100755 => 100644 app/assets/fonts/Lato-BoldItalic.woff2 mode change 100755 => 100644 app/assets/fonts/Lato-Hairline.ttf mode change 100755 => 100644 app/assets/fonts/Lato-Hairline.woff mode change 100755 => 100644 app/assets/fonts/Lato-Hairline.woff2 mode change 100755 => 100644 app/assets/fonts/Lato-HairlineItalic.ttf mode change 100755 => 100644 app/assets/fonts/Lato-HairlineItalic.woff mode change 100755 => 100644 app/assets/fonts/Lato-HairlineItalic.woff2 mode change 100755 => 100644 app/assets/fonts/Lato-Italic.ttf mode change 100755 => 100644 app/assets/fonts/Lato-Italic.woff mode change 100755 => 100644 app/assets/fonts/Lato-Italic.woff2 mode change 100755 => 100644 app/assets/fonts/Lato-Light.ttf mode change 100755 => 100644 app/assets/fonts/Lato-Light.woff mode change 100755 => 100644 app/assets/fonts/Lato-Light.woff2 mode change 100755 => 100644 app/assets/fonts/Lato-LightItalic.ttf mode change 100755 => 100644 app/assets/fonts/Lato-LightItalic.woff mode change 100755 => 100644 app/assets/fonts/Lato-LightItalic.woff2 mode change 100755 => 100644 app/assets/fonts/Lato-Regular.ttf mode change 100755 => 100644 app/assets/fonts/Lato-Regular.woff mode change 100755 => 100644 app/assets/fonts/Lato-Regular.woff2 mode change 100755 => 100644 app/assets/stylesheets/atoms/_typography.scss mode change 100755 => 100644 app/assets/stylesheets/molecules/_buttons.scss mode change 100755 => 100644 app/assets/stylesheets/molecules/_tables.scss diff --git a/app/assets/fonts/HalisR-Black.otf b/app/assets/fonts/HalisR-Black.otf old mode 100755 new mode 100644 diff --git a/app/assets/fonts/HalisR-Black.woff b/app/assets/fonts/HalisR-Black.woff old mode 100755 new mode 100644 diff --git a/app/assets/fonts/HalisR-Black.woff2 b/app/assets/fonts/HalisR-Black.woff2 old mode 100755 new mode 100644 diff --git a/app/assets/fonts/HalisR-Bold.otf b/app/assets/fonts/HalisR-Bold.otf old mode 100755 new mode 100644 diff --git a/app/assets/fonts/HalisR-Bold.woff b/app/assets/fonts/HalisR-Bold.woff old mode 100755 new mode 100644 diff --git a/app/assets/fonts/HalisR-Bold.woff2 b/app/assets/fonts/HalisR-Bold.woff2 old mode 100755 new mode 100644 diff --git a/app/assets/fonts/HalisR-Book.otf b/app/assets/fonts/HalisR-Book.otf old mode 100755 new mode 100644 diff --git a/app/assets/fonts/HalisR-Book.woff b/app/assets/fonts/HalisR-Book.woff old mode 100755 new mode 100644 diff --git a/app/assets/fonts/HalisR-Book.woff2 b/app/assets/fonts/HalisR-Book.woff2 old mode 100755 new mode 100644 diff --git a/app/assets/fonts/HalisR-ExtraLight.otf b/app/assets/fonts/HalisR-ExtraLight.otf old mode 100755 new mode 100644 diff --git a/app/assets/fonts/HalisR-ExtraLight.woff b/app/assets/fonts/HalisR-ExtraLight.woff old mode 100755 new mode 100644 diff --git a/app/assets/fonts/HalisR-ExtraLight.woff2 b/app/assets/fonts/HalisR-ExtraLight.woff2 old mode 100755 new mode 100644 diff --git a/app/assets/fonts/HalisR-Light.otf b/app/assets/fonts/HalisR-Light.otf old mode 100755 new mode 100644 diff --git a/app/assets/fonts/HalisR-Light.woff b/app/assets/fonts/HalisR-Light.woff old mode 100755 new mode 100644 diff --git a/app/assets/fonts/HalisR-Light.woff2 b/app/assets/fonts/HalisR-Light.woff2 old mode 100755 new mode 100644 diff --git a/app/assets/fonts/HalisR-Medium.otf b/app/assets/fonts/HalisR-Medium.otf old mode 100755 new mode 100644 diff --git a/app/assets/fonts/HalisR-Medium.woff b/app/assets/fonts/HalisR-Medium.woff old mode 100755 new mode 100644 diff --git a/app/assets/fonts/HalisR-Medium.woff2 b/app/assets/fonts/HalisR-Medium.woff2 old mode 100755 new mode 100644 diff --git a/app/assets/fonts/HalisR-Regular.otf b/app/assets/fonts/HalisR-Regular.otf old mode 100755 new mode 100644 diff --git a/app/assets/fonts/HalisR-Regular.woff b/app/assets/fonts/HalisR-Regular.woff old mode 100755 new mode 100644 diff --git a/app/assets/fonts/HalisR-Regular.woff2 b/app/assets/fonts/HalisR-Regular.woff2 old mode 100755 new mode 100644 diff --git a/app/assets/fonts/HalisR-Thin.otf b/app/assets/fonts/HalisR-Thin.otf old mode 100755 new mode 100644 diff --git a/app/assets/fonts/HalisR-Thin.woff b/app/assets/fonts/HalisR-Thin.woff old mode 100755 new mode 100644 diff --git a/app/assets/fonts/HalisR-Thin.woff2 b/app/assets/fonts/HalisR-Thin.woff2 old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-Black.ttf b/app/assets/fonts/Lato-Black.ttf old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-Black.woff b/app/assets/fonts/Lato-Black.woff old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-Black.woff2 b/app/assets/fonts/Lato-Black.woff2 old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-BlackItalic.ttf b/app/assets/fonts/Lato-BlackItalic.ttf old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-BlackItalic.woff b/app/assets/fonts/Lato-BlackItalic.woff old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-BlackItalic.woff2 b/app/assets/fonts/Lato-BlackItalic.woff2 old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-Bold.ttf b/app/assets/fonts/Lato-Bold.ttf old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-Bold.woff b/app/assets/fonts/Lato-Bold.woff old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-Bold.woff2 b/app/assets/fonts/Lato-Bold.woff2 old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-BoldItalic.ttf b/app/assets/fonts/Lato-BoldItalic.ttf old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-BoldItalic.woff b/app/assets/fonts/Lato-BoldItalic.woff old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-BoldItalic.woff2 b/app/assets/fonts/Lato-BoldItalic.woff2 old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-Hairline.ttf b/app/assets/fonts/Lato-Hairline.ttf old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-Hairline.woff b/app/assets/fonts/Lato-Hairline.woff old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-Hairline.woff2 b/app/assets/fonts/Lato-Hairline.woff2 old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-HairlineItalic.ttf b/app/assets/fonts/Lato-HairlineItalic.ttf old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-HairlineItalic.woff b/app/assets/fonts/Lato-HairlineItalic.woff old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-HairlineItalic.woff2 b/app/assets/fonts/Lato-HairlineItalic.woff2 old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-Italic.ttf b/app/assets/fonts/Lato-Italic.ttf old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-Italic.woff b/app/assets/fonts/Lato-Italic.woff old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-Italic.woff2 b/app/assets/fonts/Lato-Italic.woff2 old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-Light.ttf b/app/assets/fonts/Lato-Light.ttf old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-Light.woff b/app/assets/fonts/Lato-Light.woff old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-Light.woff2 b/app/assets/fonts/Lato-Light.woff2 old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-LightItalic.ttf b/app/assets/fonts/Lato-LightItalic.ttf old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-LightItalic.woff b/app/assets/fonts/Lato-LightItalic.woff old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-LightItalic.woff2 b/app/assets/fonts/Lato-LightItalic.woff2 old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-Regular.ttf b/app/assets/fonts/Lato-Regular.ttf old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-Regular.woff b/app/assets/fonts/Lato-Regular.woff old mode 100755 new mode 100644 diff --git a/app/assets/fonts/Lato-Regular.woff2 b/app/assets/fonts/Lato-Regular.woff2 old mode 100755 new mode 100644 diff --git a/app/assets/stylesheets/atoms/_typography.scss b/app/assets/stylesheets/atoms/_typography.scss old mode 100755 new mode 100644 diff --git a/app/assets/stylesheets/molecules/_buttons.scss b/app/assets/stylesheets/molecules/_buttons.scss old mode 100755 new mode 100644 diff --git a/app/assets/stylesheets/molecules/_tables.scss b/app/assets/stylesheets/molecules/_tables.scss old mode 100755 new mode 100644 From 7758f8993cdfc684a906a73a0a0828ab86d46087 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Sun, 31 Jul 2016 14:27:58 -0500 Subject: [PATCH 032/205] fixed asset image path for stylesheets --- app/assets/stylesheets/molecules/_forms.scss | 2 +- app/assets/stylesheets/molecules/_lists.scss | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) mode change 100755 => 100644 app/assets/stylesheets/molecules/_forms.scss mode change 100755 => 100644 app/assets/stylesheets/molecules/_lists.scss diff --git a/app/assets/stylesheets/molecules/_forms.scss b/app/assets/stylesheets/molecules/_forms.scss old mode 100755 new mode 100644 index c35eb0e..ada651f --- a/app/assets/stylesheets/molecules/_forms.scss +++ b/app/assets/stylesheets/molecules/_forms.scss @@ -211,7 +211,7 @@ select { display: none; } &:not([multiple]) { - background-image: url(../../assets/images/icon-dropdownlist.png); + background-image: asset_data_url("icon-dropdownlist.png"); background-repeat: no-repeat; background-position: right 10px bottom 50%; -webkit-appearance: none; diff --git a/app/assets/stylesheets/molecules/_lists.scss b/app/assets/stylesheets/molecules/_lists.scss old mode 100755 new mode 100644 index 612780f..2e663ab --- a/app/assets/stylesheets/molecules/_lists.scss +++ b/app/assets/stylesheets/molecules/_lists.scss @@ -29,7 +29,7 @@ ul { position: absolute; top: 3px; left:0; - content:url('../../assets/images/icon-unorderedlistbullet.png'); + content: asset_data_url('icon-unorderedlistbullet.png'); } } } From abb3dee9f54959525e259b372868d24c620f31e1 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Sun, 31 Jul 2016 14:47:15 -0500 Subject: [PATCH 033/205] candidate creation --- app/controllers/recruiter_controller.rb | 9 ++++++ app/helpers/application_helper.rb | 10 ++++++ app/models/candidate.rb | 9 ++++-- app/validators/email_format_validator.rb | 16 ++++++++++ app/views/recruiter/form.html.erb | 32 +++++++++++++++++++ app/views/recruiter/new.html.erb | 2 -- test/controllers/recruiter_controller_test.rb | 11 +++++++ test/models/candidate_test.rb | 11 +++++-- 8 files changed, 92 insertions(+), 8 deletions(-) create mode 100644 app/validators/email_format_validator.rb create mode 100644 app/views/recruiter/form.html.erb delete mode 100644 app/views/recruiter/new.html.erb diff --git a/app/controllers/recruiter_controller.rb b/app/controllers/recruiter_controller.rb index 0b51426..a6d05c8 100644 --- a/app/controllers/recruiter_controller.rb +++ b/app/controllers/recruiter_controller.rb @@ -7,9 +7,18 @@ class RecruiterController < ApplicationController def new @candidate = Candidate.new + render :form end def create + @candidate = Candidate.create(candidate_params.merge(recruiter_id: current_recruiter.id)) + + if @candidate.persisted? + redirect_to recruiter_path, flash: { notice: "Sucessfully created candidate #{@candidate.name}" } + else + flash[:error] = "Failed to save Candidate." + render :form + end end def login diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index de6be79..4c7737c 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,2 +1,12 @@ module ApplicationHelper + def experience_options val + options_for_select([ + ["Please Select", ""], + ["0-3 Years", "0-3"], + ["4-6 Years", "4-6"], + ["7-9 Years", "7-9"], + ["10-14 Years", "10-14"], + ["15+ Years", "15+"] + ], disabled: "-", selected: (val.blank? ? '' : val)) + end end diff --git a/app/models/candidate.rb b/app/models/candidate.rb index 482864a..b219635 100644 --- a/app/models/candidate.rb +++ b/app/models/candidate.rb @@ -4,11 +4,14 @@ class Candidate < ApplicationRecord has_many :answers belongs_to :recruiter, class_name: "User" - before_create :generate_test_hash + before_validation(:generate_test_hash, on: :create) + validates_presence_of :name + validates_presence_of :email + validates_presence_of :experience validates_presence_of :recruiter_id - validates_presence_of :test_hash - validates_uniqueness_of :test_hash + validates :email, uniqueness: true, presence: true, email_format: true + validates :test_hash, uniqueness: true, presence: true def submitted_answers answers.where(submitted: true) diff --git a/app/validators/email_format_validator.rb b/app/validators/email_format_validator.rb new file mode 100644 index 0000000..cc2ec71 --- /dev/null +++ b/app/validators/email_format_validator.rb @@ -0,0 +1,16 @@ +class EmailFormatValidator < ActiveModel::EachValidator + def validate_each(record, attribute, value) + # EMAIL regex test + # (comma seperated) [any word combo] AT [any word combo] DOT [2 or more] + # me@no.yes.x == invalid + # some.thing+two@sub.domain.name == valid + + results = value.to_s.split(',').map do |v| + (v.strip =~ /^([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})$/i) || v.strip.blank? + end + + if results.include?(false) + record.errors[attribute] << (options[:message] || "is not formatted properly: #{value}") + end + end +end diff --git a/app/views/recruiter/form.html.erb b/app/views/recruiter/form.html.erb new file mode 100644 index 0000000..e0b7029 --- /dev/null +++ b/app/views/recruiter/form.html.erb @@ -0,0 +1,32 @@ +
+

New Candidate

+ + <% if flash[:error].present? %> +
+ <%= flash[:error] %> + <% @candidate.errors.messages.each do |k,v| %> +

<%= "#{k}: #{v}" %>

+ <% end %> +
+ <% end %> + + <%= form_for @candidate, url: create_candidate_path do |form| %> +
+ <%= form.label :name %> + <%= form.text_field :name %> +
+ +
+ <%= form.label :email %> + <%= form.email_field :email %> +
+ +
+ <%= form.label :experience %> + <%= form.select :experience, experience_options(@candidate.experience), include_blank: false %> +
+ + <%= form.hidden_field :quiz_id, { value: Quiz.first.to_i } %> + <%= submit_tag "Login" %> + <% end %> +
diff --git a/app/views/recruiter/new.html.erb b/app/views/recruiter/new.html.erb deleted file mode 100644 index 6afd6ab..0000000 --- a/app/views/recruiter/new.html.erb +++ /dev/null @@ -1,2 +0,0 @@ -

Create new candidate

- diff --git a/test/controllers/recruiter_controller_test.rb b/test/controllers/recruiter_controller_test.rb index e3bfe7f..da5d5f6 100644 --- a/test/controllers/recruiter_controller_test.rb +++ b/test/controllers/recruiter_controller_test.rb @@ -53,4 +53,15 @@ class RecruiterControllerTest < ActionDispatch::IntegrationTest get create_candidate_url assert_response :success end + + test "should create new candidate" do + # recruiter = users(:recruiter) + setup_auth + assert_difference("Candidate.count") do + post create_candidate_path, params: { candidate: + { name: 'new name', email: 'test@mailinator.com', experience: '0-3', quiz_id: quizzes(:fed).id } } + end + assert_redirected_to recruiter_path + assert flash[:notice] + end end diff --git a/test/models/candidate_test.rb b/test/models/candidate_test.rb index 85798b8..112f8ef 100644 --- a/test/models/candidate_test.rb +++ b/test/models/candidate_test.rb @@ -1,7 +1,12 @@ require 'test_helper' class CandidateTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end + test "test_hash is auto generated" do + candidate = Candidate.create(name: 'new name', + email: 'test@mailinator.com', + experience: '0-3', + quiz_id: quizzes(:fed).id) + + assert candidate.test_hash.present? + end end From ace9b864d3caaaa0e993e0200b4b4199b1bc9d5a Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Sun, 31 Jul 2016 16:34:35 -0500 Subject: [PATCH 034/205] review --- app/controllers/application_controller.rb | 12 ++++- app/controllers/recruiter_controller.rb | 2 +- app/controllers/review_controller.rb | 33 +++++++++++++ app/views/recruiter/index.html.erb | 4 +- app/views/review/index.html.erb | 19 ++++++++ app/views/review/login.html.erb | 21 +++++++++ app/views/review/view.html.erb | 31 ++++++++++++ config/routes.rb | 4 ++ test/controllers/review_controller_test.rb | 55 ++++++++++++++++++++++ 9 files changed, 178 insertions(+), 3 deletions(-) create mode 100644 app/controllers/review_controller.rb create mode 100644 app/views/review/index.html.erb create mode 100644 app/views/review/login.html.erb create mode 100644 app/views/review/view.html.erb create mode 100644 test/controllers/review_controller_test.rb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index cb5e9bf..5a9a581 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -2,7 +2,13 @@ class ApplicationController < ActionController::Base protect_from_forgery with: :exception def current_recruiter - @current_recruiter ||= User.find_by(id: session[:user]) if session[:user] + user_parms = { id: session[:user], role: %w(admin recruiter) } + @current_recruiter ||= User.find_by(user_parms) if session[:user] + end + + def current_reviewer + user_parms = { id: session[:user], role: %w(admin reviewer) } + @current_reviewer ||= User.find_by(user_parms) if session[:user] end def current_candidate @@ -18,4 +24,8 @@ class ApplicationController < ActionController::Base def authorize_recruiter redirect_to recruiter_login_path unless current_recruiter end + + def authorize_reviewer + redirect_to review_login_path unless current_reviewer + end end diff --git a/app/controllers/recruiter_controller.rb b/app/controllers/recruiter_controller.rb index a6d05c8..c93d19e 100644 --- a/app/controllers/recruiter_controller.rb +++ b/app/controllers/recruiter_controller.rb @@ -26,7 +26,7 @@ class RecruiterController < ApplicationController end def auth - recruiter = User.find_by(email: auth_params[:email]) + recruiter = User.find_by(email: auth_params[:email], role: %w(admin recruiter)) if recruiter && recruiter.authenticate(auth_params[:password]) session[:user] = recruiter.to_i diff --git a/app/controllers/review_controller.rb b/app/controllers/review_controller.rb new file mode 100644 index 0000000..91ae07d --- /dev/null +++ b/app/controllers/review_controller.rb @@ -0,0 +1,33 @@ +class ReviewController < ApplicationController + before_action :authorize_reviewer, except: [:login, :auth] + + def index + @candidates = Candidate.where(completed: true).includes(:recruiter) + end + + def view + @candidate = Candidate.find_by(test_hash: params[:test_hash]) + @quiz = @candidate.my_quiz + @status = QuizStatus.new(@candidate) + end + + def login + redirect_to review_path unless current_reviewer.nil? + end + + def auth + reviewer = User.find_by(email: auth_params[:email], role: %w(admin reviewer)) + + if reviewer && reviewer.authenticate(auth_params[:password]) + session[:user] = reviewer.to_i + redirect_to review_path + else + redirect_to review_login_path, flash: { error: "Sorry, incorrect email or password." } + end + end + + def logout + reset_session + redirect_to review_login_path + end +end diff --git a/app/views/recruiter/index.html.erb b/app/views/recruiter/index.html.erb index 65c7b7d..fb2412a 100644 --- a/app/views/recruiter/index.html.erb +++ b/app/views/recruiter/index.html.erb @@ -1,7 +1,9 @@

Candidates

- <%= link_to "Create New Candidate", new_candidate_path, {class: 'button'} %> + <%= link_to(new_candidate_path, { class: 'secondary-btn' }) do %> + + <% end %> diff --git a/app/views/review/index.html.erb b/app/views/review/index.html.erb new file mode 100644 index 0000000..3601598 --- /dev/null +++ b/app/views/review/index.html.erb @@ -0,0 +1,19 @@ +
+

Completed Tests

+ +
+ + + + + + + <% @candidates.each do |candidate| %> + + + + + + <% end %> +
Test IDExperienceRecruiter
<%= link_to candidate.test_hash, review_test_path(candidate.test_hash) %><%= candidate.experience %> years<%= mail_to(candidate.recruiter.email) %>
+
diff --git a/app/views/review/login.html.erb b/app/views/review/login.html.erb new file mode 100644 index 0000000..6d84f0f --- /dev/null +++ b/app/views/review/login.html.erb @@ -0,0 +1,21 @@ +
+

Reviewer Login

+ + <% if flash[:error].present? %> +
<%= flash[:error] %>
+ <% end %> + + <%= form_for :auth, url: review_login_path do |form| %> +
+ <%= form.label :email %> + <%= form.email_field :email %> +
+ +
+ <%= form.label :password %> + <%= form.password_field :password %> +
+ + <%= submit_tag "Login" %> + <% end %> +
diff --git a/app/views/review/view.html.erb b/app/views/review/view.html.erb new file mode 100644 index 0000000..463fcda --- /dev/null +++ b/app/views/review/view.html.erb @@ -0,0 +1,31 @@ +
+

Quiz Review

+

+ Test ID: <%= @candidate.test_hash %>
+ Years of Experience: <%= @candidate.experience %>
+ Recruiter Email: <%= mail_to @candidate.recruiter.name, @candidate.recruiter.email %>
+

+ + <% @quiz.each do |question| %> + <%= form_for(:answer, url: post_summary_path, html:{id: 'summary-form'}) do |form| %> +
+
+
+

<%= question.question %>

+
+
+ +
+
+ <%= hidden_field_tag 'answer[question_id]', question.question_id %> + <%= render partial: "candidate/#{question.input_type}", locals: {question: question, form: form} %> +
+
+
+ <% end #form_tag %> + <% end #questions loop %> + + <%= link_to(review_path, { class: 'secondary-btn' }) do %> + + <% end %> +
diff --git a/config/routes.rb b/config/routes.rb index 410be75..22e7fbd 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -11,7 +11,11 @@ Rails.application.routes.draw do post "/summary", to: "candidate#update_summary", as: :post_summary get "/summary", to: "candidate#summary", as: :summary + get "/review/logout", to: "review#logout", as: :review_logout + post "/review/login", to: "review#auth", as: :review_auth + get "/review/login", to: "review#login", as: :review_login get "/review", to: "review#index", as: :review + get "/review/:test_hash", to: "review#view", as: :review_test get "/recruiter", to: "recruiter#index", as: :recruiter get "/recruiter/new-candidate", to: "recruiter#new", as: :new_candidate diff --git a/test/controllers/review_controller_test.rb b/test/controllers/review_controller_test.rb new file mode 100644 index 0000000..aa6c188 --- /dev/null +++ b/test/controllers/review_controller_test.rb @@ -0,0 +1,55 @@ +require 'test_helper' + +class ReviewControllerTest < ActionDispatch::IntegrationTest + def setup_auth + post review_auth_url, params: { auth: + { email: 'fed.reviewer@mailinator.com', password: 'password' } } + end + + test "should get login" do + get review_login_url + assert_response :success + end + + test "should require auth or redirect" do + get review_url + assert_redirected_to review_login_path + + get review_test_url(candidates(:richard).test_hash) + assert_redirected_to review_login_path + end + + test "should auth to index" do + setup_auth + assert_redirected_to review_path + assert session[:user].present? + end + + test "should fail auth with flash" do + post review_auth_url, params: { auth: + { email: 'fed.review@mailinator.com', password: 'bad-password' } } + + assert_redirected_to review_login_path + assert flash[:error] + end + + test "should get review list" do + setup_auth + get review_url + assert_response :success + end + + test "should get index" do + setup_auth + + get review_url + assert_response :success + end + + test "should get view" do + setup_auth + + get review_test_url(candidates(:richard).test_hash) + assert_response :success + end +end From dfd582d251ef5701f7dfe5e69c9fec1b22f5b1a1 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Sun, 31 Jul 2016 18:54:12 -0500 Subject: [PATCH 035/205] rethinking question CRUD --- .rubocop.yml | 4 +- app/controllers/application_controller.rb | 4 + app/controllers/candidate_controller.rb | 119 +++++++++++------- ...ive-coder.html.erb => _live_code.html.erb} | 0 ...live_coder.html.erb => live_code.html.erb} | 0 app/views/candidate/question.html.erb | 2 +- config/routes.rb | 43 ++++--- db/sql/candidate_quiz.sql | 8 ++ test/controllers/candidate_controller_test.rb | 54 ++++++++ test/fixtures/answers.yml | 8 +- test/fixtures/questions.yml | 4 +- 11 files changed, 172 insertions(+), 74 deletions(-) rename app/views/candidate/{_live-coder.html.erb => _live_code.html.erb} (100%) rename app/views/candidate/{live_coder.html.erb => live_code.html.erb} (100%) create mode 100644 test/controllers/candidate_controller_test.rb diff --git a/.rubocop.yml b/.rubocop.yml index 47bed8a..bede808 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -41,7 +41,7 @@ Style/StringLiterals: Metrics/AbcSize: Exclude: - db/migrate/**/* - Max: 27 + Max: 18 Metrics/LineLength: Max: 110 @@ -54,4 +54,4 @@ Metrics/LineLength: Metrics/MethodLength: Exclude: - db/migrate/* - - app/controllers/* + # - app/controllers/* diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 5a9a581..c2965a3 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -28,4 +28,8 @@ class ApplicationController < ActionController::Base def authorize_reviewer redirect_to review_login_path unless current_reviewer end + + def authorize_candidate + redirect_to welcome_path unless current_candidate + end end diff --git a/app/controllers/candidate_controller.rb b/app/controllers/candidate_controller.rb index 5cd5756..0daca3d 100644 --- a/app/controllers/candidate_controller.rb +++ b/app/controllers/candidate_controller.rb @@ -1,33 +1,30 @@ class CandidateController < ApplicationController + before_action :authorize_candidate, except: [:welcome, :validate] + def welcome end + def saved + end + + def thankyou + redirect_to root_path if session[:test_id].nil? + reset_session + end + def question @status = QuizStatus.new(current_candidate) qid = @status.current_question_id redirect_to :summary and return if qid.nil? - @question = current_candidate.fetch_question(qid) + prep_question qid @answer = Answer.new end - def update_answer - answer_ids = { question_id: answer_params[:question_id], candidate_id: current_candidate.to_i } - @answer = Answer.find_or_create_by!(answer_ids) - @answer.answer = answer_for_type - @answer.saved = answer_params[:save] - @answer.submitted = answer_params[:next] - - if @answer.save - redirect_to :summary and return if params.key?(:update) - redirect_to :saved and return if params.key?(:save) - redirect_to :question - else - flash[:error] = [answer_params[:question_id]] - @question = current_candidate.fetch_question(qid) - render :question - end + def live_coder + question + render layout: false end def summary @@ -37,50 +34,82 @@ class CandidateController < ApplicationController redirect_to :question and return unless @status.current_question_id.nil? end + def update_text + @answer = prep_answer + @answer.update(answer: answer_params[:text], + saved: answer_params[:save], + submitted: answer_params[:next]) + validate_answer + end + + def update_radio + @answer = prep_answer + @answer.update(answer: answer_params[:radio], + saved: answer_params[:save], + submitted: answer_params[:next]) + validate_answer + end + + def update_checkbox + @answer = prep_answer + @answer.update(answer: answer_params[:checkbox], + saved: answer_params[:save], + submitted: answer_params[:next]) + validate_answer + end + + def update_live_code + @answer = prep_answer + @answer.update(answer: answer_params[:live_code], + saved: answer_params[:save], + submitted: answer_params[:next]) + validate_answer + end + + # TODO def update_summary - redirect_to :summary - end - - def thankyou - redirect_to root_path if session[:test_id].nil? - reset_session - end - - def saved + # redirect_to :summary end def validate candidate = Candidate.find_by(test_hash: params['test_id']) + redirect_to(root_path, alert: "Sorry, incorrect test id") and return if candidate.nil? - if candidate.nil? - reset_session - redirect_to root_path, alert: "Sorry, incorrect test id" - else - session[:test_id] = candidate.test_hash - redirect_to :question - end - end - - def live_coder - @question = Question.find(params[:question_id]) - @answer = @question.answers.order("RAND()").first.answer - render layout: false + session[:test_id] = candidate.test_hash + redirect_to :thankyou and return if candidate.completed? + redirect_to :question end private + def prep_question qid + @question = current_candidate.fetch_question(qid) + end + def answer_params params.require(:answer).permit( :question_id, :answer_id, :save, :next, :summary, - :radio, :text, checkbox: [], live_coder: [] + :radio, :text, checkbox: [], live_code: [] ) end - def answer_for_type - return answer_params[:radio] unless answer_params[:radio].nil? - return answer_params[:text] unless answer_params[:text].nil? - return answer_params[:checkbox] unless answer_params[:checkbox].nil? - return answer_params[:live_coder] unless answer_params[:live_coder].nil? + def prep_answer + answer_ids = { question_id: answer_params[:question_id], candidate_id: current_candidate.to_i } + answer = Answer.find_or_create_by(answer_ids) + answer + end + + def validate_answer + if @answer.errors.present? + flash[:error] = [answer_params[:question_id]] + prep_question answer_params[:question_id] + render :question + else + # TODO: change params.key? to submit = save/next/summary + redirect_to :summary and return if params.key?(:update) + redirect_to :saved and return if params.key?(:save) + redirect_to :question + end end end diff --git a/app/views/candidate/_live-coder.html.erb b/app/views/candidate/_live_code.html.erb similarity index 100% rename from app/views/candidate/_live-coder.html.erb rename to app/views/candidate/_live_code.html.erb diff --git a/app/views/candidate/live_coder.html.erb b/app/views/candidate/live_code.html.erb similarity index 100% rename from app/views/candidate/live_coder.html.erb rename to app/views/candidate/live_code.html.erb diff --git a/app/views/candidate/question.html.erb b/app/views/candidate/question.html.erb index 34eafc1..d0572d8 100644 --- a/app/views/candidate/question.html.erb +++ b/app/views/candidate/question.html.erb @@ -5,7 +5,7 @@ content_for :footer_title, "Skills Assessment" %> -<%= form_for(@answer, url: post_answer_path(@answer.id), html:{id: 'answer-form', data: {qid: @question.question_id}}) do |form| %> +<%= form_for(@answer, url: send("post_#{@question.input_type}_path", @answer.id), html:{id: 'answer-form', data: {qid: @question.question_id}}) do |form| %>

<%= @question.question %>

diff --git a/config/routes.rb b/config/routes.rb index 22e7fbd..5ff2be6 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,28 +1,31 @@ Rails.application.routes.draw do - post "/validate", to: "candidate#validate", as: :validate_candidate - get "/welcome", to: "candidate#welcome", as: :welcome - get "/thankyou", to: "candidate#thankyou", as: :thankyou - get "/saved", to: "candidate#saved", as: :saved + post "/validate", to: "candidate#validate", as: :validate_candidate + get "/welcome", to: "candidate#welcome", as: :welcome + get "/thankyou", to: "candidate#thankyou", as: :thankyou + get "/saved", to: "candidate#saved", as: :saved - post "/question(/:answer_id)", to: "candidate#update_answer", as: :post_answer - get "/question(/:question_id)", to: "candidate#question", as: :question - get "/live-coder-entry/:question_id", to: "candidate#live_coder", as: :live_coder + post "/question/text(/:answer_id)", to: "candidate#update_text", as: :post_text + post "/question/radio(/:answer_id)", to: "candidate#update_radio", as: :post_radio + post "/question/checkbox(/:answer_id)", to: "candidate#update_checkbox", as: :post_checkbox + post "/question/live-code(/:answer_id)", to: "candidate#update_live_code", as: :post_live_code + get "/question(/:question_id)", to: "candidate#question", as: :question + get "/live-coder-entry/:question_id", to: "candidate#live_coder", as: :live_coder - post "/summary", to: "candidate#update_summary", as: :post_summary - get "/summary", to: "candidate#summary", as: :summary + post "/summary", to: "candidate#update_summary", as: :post_summary + get "/summary", to: "candidate#summary", as: :summary - get "/review/logout", to: "review#logout", as: :review_logout - post "/review/login", to: "review#auth", as: :review_auth - get "/review/login", to: "review#login", as: :review_login - get "/review", to: "review#index", as: :review - get "/review/:test_hash", to: "review#view", as: :review_test + get "/review/logout", to: "review#logout", as: :review_logout + post "/review/login", to: "review#auth", as: :review_auth + get "/review/login", to: "review#login", as: :review_login + get "/review", to: "review#index", as: :review + get "/review/:test_hash", to: "review#view", as: :review_test - get "/recruiter", to: "recruiter#index", as: :recruiter - get "/recruiter/new-candidate", to: "recruiter#new", as: :new_candidate - post "/recruiter/new-candidate", to: "recruiter#create", as: :create_candidate - get "/recruiter/logout", to: "recruiter#logout", as: :recruiter_logout - get "/recruiter/login", to: "recruiter#login", as: :recruiter_login - post "/recruiter/login", to: "recruiter#auth", as: :recruiter_auth + get "/recruiter", to: "recruiter#index", as: :recruiter + get "/recruiter/new-candidate", to: "recruiter#new", as: :new_candidate + post "/recruiter/new-candidate", to: "recruiter#create", as: :create_candidate + get "/recruiter/logout", to: "recruiter#logout", as: :recruiter_logout + get "/recruiter/login", to: "recruiter#login", as: :recruiter_login + post "/recruiter/login", to: "recruiter#auth", as: :recruiter_auth root to: "candidate#welcome" diff --git a/db/sql/candidate_quiz.sql b/db/sql/candidate_quiz.sql index 0254f2d..97143f8 100644 --- a/db/sql/candidate_quiz.sql +++ b/db/sql/candidate_quiz.sql @@ -6,4 +6,12 @@ select c.id candidate_id from candidates c inner join questions q on q.quiz_id = c.quiz_id left join answers a on a.candidate_id = c.id AND a.question_id = q.id + +where c.test_hash = 'R67PmfDHGiw' -- and q.input_type = 'radio' + order by c.name, q.sort; + + + +-- delete from answers where id = 1008398109 + diff --git a/test/controllers/candidate_controller_test.rb b/test/controllers/candidate_controller_test.rb new file mode 100644 index 0000000..aab1e34 --- /dev/null +++ b/test/controllers/candidate_controller_test.rb @@ -0,0 +1,54 @@ +require 'test_helper' + +class CandidateControllerTest < ActionDispatch::IntegrationTest + def setup_auth candidate + post validate_candidate_url, params: { test_id: candidate.test_hash } + end + + test "should get login" do + get welcome_path + assert_response :success + end + + test "should require auth or redirect" do + get saved_path + assert_redirected_to welcome_path + + get thankyou_path + assert_redirected_to welcome_path + + get summary_path + assert_redirected_to welcome_path + + get question_path + assert_redirected_to welcome_path + + get question_path(questions(:fed1).id) + assert_redirected_to welcome_path + + get live_coder_path(questions(:fed1).id) + assert_redirected_to welcome_path + end + + test "should auth to question" do + setup_auth candidates(:martha) + + assert_redirected_to question_path + assert session[:test_id].present? + end + + test "should redirect to thankyou when completed" do + setup_auth candidates(:richard) + + assert_redirected_to thankyou_path + end + + test "should get summary if complete but not submitted" do + setup_auth candidates(:dawn) + + get summary_url + assert_response :success + end + + # should get flash message on bad question +end diff --git a/test/fixtures/answers.yml b/test/fixtures/answers.yml index ef29517..a46385b 100644 --- a/test/fixtures/answers.yml +++ b/test/fixtures/answers.yml @@ -39,7 +39,7 @@ dawn2: dawn3: candidate: dawn question: fed3 - answer: {html: "

I'm a little tealpot

", css: 'h1 {color: teal;}', js: ''} + answer: {html: "dawn3

I'm a little tealpot

", css: 'h1 {color: teal;}', js: ''} saved: 0 submitted: true created_at: <%= DateTime.now() - 38.hours - 50.minutes %> @@ -75,7 +75,7 @@ dawn6: dawn7: candidate: dawn question: fed7 - answer: {html: '

This means jQuery needs to be available in live-coder!

', css: "strong {font-size: 1.6em;}\n.green {color: green;}", js: '$("strong").addClass("green");'} + answer: {html: 'dawn7

This means jQuery needs to be available in live-coder!

', css: "strong {font-size: 1.6em;}\n.green {color: green;}", js: '$("strong").addClass("green");'} saved: 0 submitted: true created_at: <%= DateTime.now() - 38.hours - 34.minutes %> @@ -129,7 +129,7 @@ richard2: richard3: candidate: richard question: fed3 - answer: {html: '

Salmon

', css: 'h1 {color: salmon;}', js: ''} + answer: {html: 'richard3

Salmon

', css: 'h1 {color: salmon;}', js: ''} saved: 0 submitted: true created_at: <%= DateTime.now() - 36.hours - 26.minutes %> @@ -165,7 +165,7 @@ richard6: richard7: candidate: richard question: fed7 - answer: {html: '

This means jQuery needs to be available in live-coder!

', css: "strong {font-size: 1.6em;}\n.green {color: green;}", js: '$("strong").addClass("green");'} + answer: {html: 'richard7

This means jQuery needs to be available in live-coder!

', css: "strong {font-size: 1.6em;}\n.green {color: green;}", js: '$("strong").addClass("green");'} saved: 0 submitted: true created_at: <%= DateTime.now() - 36.hours - 34.minutes %> diff --git a/test/fixtures/questions.yml b/test/fixtures/questions.yml index 6302ed7..de67303 100644 --- a/test/fixtures/questions.yml +++ b/test/fixtures/questions.yml @@ -22,7 +22,7 @@ fed3: quiz: fed question: How would you create a widget that would fit in a 250px wide area as well as a 400px wide area? category: CSS - input_type: live-coder + input_type: live_code input_options: sort: 2 active: true @@ -58,7 +58,7 @@ fed7: quiz: fed question: Provide a code example to manipulate the DOM using jQuery/JavaScript to change the classname of a div 'classB' to 'classC', only if the div 'classA' exists in the page? category: Javascript - input_type: live-coder + input_type: live_code input_options: sort: 6 active: true From 95eec915c4a2dd0a28ccb8d3a5cc9132066a878c Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Mon, 1 Aug 2016 09:50:01 -0500 Subject: [PATCH 036/205] custom error validations --- .rubocop.yml | 2 +- app/controllers/candidate_controller.rb | 23 ++++++----- app/models/answer.rb | 4 ++ app/validators/answer_format_validator.rb | 38 +++++++++++++++++++ app/views/candidate/_answer_errors.html.erb | 5 +++ app/views/candidate/_checkbox.html.erb | 4 +- app/views/candidate/_radio.html.erb | 4 +- app/views/candidate/_text.html.erb | 4 +- ...live_code.html.erb => live_coder.html.erb} | 4 +- config/initializers/custom_error_wrapper.rb | 5 +++ test/controllers/candidate_controller_test.rb | 10 ++++- 11 files changed, 79 insertions(+), 24 deletions(-) create mode 100644 app/validators/answer_format_validator.rb create mode 100644 app/views/candidate/_answer_errors.html.erb rename app/views/candidate/{live_code.html.erb => live_coder.html.erb} (80%) create mode 100644 config/initializers/custom_error_wrapper.rb diff --git a/.rubocop.yml b/.rubocop.yml index bede808..2ad2401 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -41,7 +41,7 @@ Style/StringLiterals: Metrics/AbcSize: Exclude: - db/migrate/**/* - Max: 18 + Max: 20 Metrics/LineLength: Max: 110 diff --git a/app/controllers/candidate_controller.rb b/app/controllers/candidate_controller.rb index 0daca3d..051b1ae 100644 --- a/app/controllers/candidate_controller.rb +++ b/app/controllers/candidate_controller.rb @@ -13,8 +13,7 @@ class CandidateController < ApplicationController end def question - @status = QuizStatus.new(current_candidate) - qid = @status.current_question_id + qid = prep_status.current_question_id redirect_to :summary and return if qid.nil? @@ -29,9 +28,8 @@ class CandidateController < ApplicationController def summary @quiz = current_candidate.my_quiz - @status = QuizStatus.new(current_candidate) - redirect_to :question and return unless @status.current_question_id.nil? + redirect_to :question and return unless prep_status.current_question_id.nil? end def update_text @@ -39,7 +37,7 @@ class CandidateController < ApplicationController @answer.update(answer: answer_params[:text], saved: answer_params[:save], submitted: answer_params[:next]) - validate_answer + route_answer end def update_radio @@ -47,7 +45,7 @@ class CandidateController < ApplicationController @answer.update(answer: answer_params[:radio], saved: answer_params[:save], submitted: answer_params[:next]) - validate_answer + route_answer end def update_checkbox @@ -55,7 +53,7 @@ class CandidateController < ApplicationController @answer.update(answer: answer_params[:checkbox], saved: answer_params[:save], submitted: answer_params[:next]) - validate_answer + route_answer end def update_live_code @@ -63,7 +61,7 @@ class CandidateController < ApplicationController @answer.update(answer: answer_params[:live_code], saved: answer_params[:save], submitted: answer_params[:next]) - validate_answer + route_answer end # TODO @@ -86,6 +84,10 @@ class CandidateController < ApplicationController @question = current_candidate.fetch_question(qid) end + def prep_status + @status ||= QuizStatus.new(current_candidate) + end + def answer_params params.require(:answer).permit( :question_id, :answer_id, @@ -100,10 +102,11 @@ class CandidateController < ApplicationController answer end - def validate_answer + def route_answer if @answer.errors.present? - flash[:error] = [answer_params[:question_id]] + prep_status prep_question answer_params[:question_id] + flash[:answer_error] = answer_params[:question_id].to_i render :question else # TODO: change params.key? to submit = save/next/summary diff --git a/app/models/answer.rb b/app/models/answer.rb index 1d6ebf2..b1dc993 100644 --- a/app/models/answer.rb +++ b/app/models/answer.rb @@ -3,4 +3,8 @@ class Answer < ApplicationRecord belongs_to :question belongs_to :candidate + + validates :candidate_id, presence: true + validates :question_id, presence: true + validates :answer, answer_format: true end diff --git a/app/validators/answer_format_validator.rb b/app/validators/answer_format_validator.rb new file mode 100644 index 0000000..32f0a3f --- /dev/null +++ b/app/validators/answer_format_validator.rb @@ -0,0 +1,38 @@ +class AnswerFormatValidator < ActiveModel::EachValidator + def validate_each(record, attribute, value) + send(record.question.input_type, record, attribute, value) + end + + private + + def text record, attribute, value + return unless value.length.between? 1, 1000 + + if value.blank? + record.errors[attribute] << (options[:message] || "Please enter an answer.") + end + + if value.length > 1000 + record.errors[attribute] << (options[:message] || "The character limit for a textarea answer is 1000") + end + end + + def radio record, attribute, value + return unless value.nil? + + record.errors[attribute] << (options[:message] || "Please select an answer.") + end + + def checkbox record, attribute, value + return unless value.nil? || value.join.blank? + + record.errors[attribute] << (options[:message] || "Please select an answer.") + end + + def live_code record, attribute, value + return unless value.nil? + + msg = "You must write code in one of the above textareas to progress." + record.errors[attribute] << (options[:message] || msg) + end +end diff --git a/app/views/candidate/_answer_errors.html.erb b/app/views/candidate/_answer_errors.html.erb new file mode 100644 index 0000000..b69a5f1 --- /dev/null +++ b/app/views/candidate/_answer_errors.html.erb @@ -0,0 +1,5 @@ +<% if flash[:answer_error] == question.question_id %> + <% answer.errors.messages[:answer].each do |message| %> +
<%= message %>
+ <% end %> +<% end %> diff --git a/app/views/candidate/_checkbox.html.erb b/app/views/candidate/_checkbox.html.erb index ca06c9b..ad86f2a 100644 --- a/app/views/candidate/_checkbox.html.erb +++ b/app/views/candidate/_checkbox.html.erb @@ -14,6 +14,4 @@
<% end %> -<% if flash[:error].try(:include?, question.to_i) %> -
Please select an answer.
-<% end %> +<%= render partial: "candidate/answer_errors", locals: {question: question, answer: @answer} %> diff --git a/app/views/candidate/_radio.html.erb b/app/views/candidate/_radio.html.erb index 38a8bbd..3d1cd7d 100644 --- a/app/views/candidate/_radio.html.erb +++ b/app/views/candidate/_radio.html.erb @@ -9,6 +9,4 @@
<% end %> -<% if flash[:error].try(:include?, question.to_i) %> -
Please select an answer.
-<% end %> +<%= render partial: "candidate/answer_errors", locals: {question: question, answer: @answer} %> diff --git a/app/views/candidate/_text.html.erb b/app/views/candidate/_text.html.erb index db29ee0..d910317 100644 --- a/app/views/candidate/_text.html.erb +++ b/app/views/candidate/_text.html.erb @@ -3,6 +3,4 @@
Characters remaining:
-<% if flash[:error].try(:include?, question.to_i) %> -
Please select or enter an answer. (The character limit for a textarea answer is 1000)
-<% end %> +<%= render partial: "candidate/answer_errors", locals: {question: question, answer: @answer} %> diff --git a/app/views/candidate/live_code.html.erb b/app/views/candidate/live_coder.html.erb similarity index 80% rename from app/views/candidate/live_code.html.erb rename to app/views/candidate/live_coder.html.erb index 331e3e0..4a5c2bb 100644 --- a/app/views/candidate/live_code.html.erb +++ b/app/views/candidate/live_coder.html.erb @@ -13,8 +13,6 @@ -<% if flash[:error].try(:include?, @question.to_i) %> -
You must write code in one of the above textareas to progress.
-<% end %> +<%= render partial: "candidate/answer_errors", locals: {question: question, answer: @answer} %>
diff --git a/config/initializers/custom_error_wrapper.rb b/config/initializers/custom_error_wrapper.rb new file mode 100644 index 0000000..67cc908 --- /dev/null +++ b/config/initializers/custom_error_wrapper.rb @@ -0,0 +1,5 @@ +# TODO: needs better wrapping instead of nuking +# https://rubyplus.com/articles/3401 +ActionView::Base.field_error_proc = proc do |html_tag, _instance| + html_tag.html_safe +end diff --git a/test/controllers/candidate_controller_test.rb b/test/controllers/candidate_controller_test.rb index aab1e34..3df9b82 100644 --- a/test/controllers/candidate_controller_test.rb +++ b/test/controllers/candidate_controller_test.rb @@ -50,5 +50,13 @@ class CandidateControllerTest < ActionDispatch::IntegrationTest assert_response :success end - # should get flash message on bad question + test "should get flash message on bad radio response" do + setup_auth candidates(:martha) + qid = questions(:fed1).id + post post_radio_url, params: { answer: { question_id: qid, radio: nil } } + + assert_response :success + assert session[:test_id].present? + assert_equal qid, flash[:answer_error] + end end From fff062a3a7f83f21af596ade6dc17d9291f67c3f Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Mon, 1 Aug 2016 10:33:02 -0500 Subject: [PATCH 037/205] moving post answer routes back --- app/controllers/candidate_controller.rb | 69 ++++++++++--------- app/views/candidate/live_coder.html.erb | 2 +- app/views/candidate/question.html.erb | 2 +- config/routes.rb | 5 +- test/controllers/candidate_controller_test.rb | 2 +- 5 files changed, 41 insertions(+), 39 deletions(-) diff --git a/app/controllers/candidate_controller.rb b/app/controllers/candidate_controller.rb index 051b1ae..0dc39d0 100644 --- a/app/controllers/candidate_controller.rb +++ b/app/controllers/candidate_controller.rb @@ -21,6 +21,11 @@ class CandidateController < ApplicationController @answer = Answer.new end + def update_answer + qid = prep_status.current_question_id + send "process_#{prep_question(qid).input_type}" + end + def live_coder question render layout: false @@ -32,38 +37,6 @@ class CandidateController < ApplicationController redirect_to :question and return unless prep_status.current_question_id.nil? end - def update_text - @answer = prep_answer - @answer.update(answer: answer_params[:text], - saved: answer_params[:save], - submitted: answer_params[:next]) - route_answer - end - - def update_radio - @answer = prep_answer - @answer.update(answer: answer_params[:radio], - saved: answer_params[:save], - submitted: answer_params[:next]) - route_answer - end - - def update_checkbox - @answer = prep_answer - @answer.update(answer: answer_params[:checkbox], - saved: answer_params[:save], - submitted: answer_params[:next]) - route_answer - end - - def update_live_code - @answer = prep_answer - @answer.update(answer: answer_params[:live_code], - saved: answer_params[:save], - submitted: answer_params[:next]) - route_answer - end - # TODO def update_summary # redirect_to :summary @@ -115,4 +88,36 @@ class CandidateController < ApplicationController redirect_to :question end end + + def process_text + @answer = prep_answer + @answer.update(answer: answer_params[:text], + saved: answer_params[:save], + submitted: answer_params[:next]) + route_answer + end + + def process_radio + @answer = prep_answer + @answer.update(answer: answer_params[:radio], + saved: answer_params[:save], + submitted: answer_params[:next]) + route_answer + end + + def process_checkbox + @answer = prep_answer + @answer.update(answer: answer_params[:checkbox], + saved: answer_params[:save], + submitted: answer_params[:next]) + route_answer + end + + def process_live_code + @answer = prep_answer + @answer.update(answer: answer_params[:live_code], + saved: answer_params[:save], + submitted: answer_params[:next]) + route_answer + end end diff --git a/app/views/candidate/live_coder.html.erb b/app/views/candidate/live_coder.html.erb index 4a5c2bb..e78bf2b 100644 --- a/app/views/candidate/live_coder.html.erb +++ b/app/views/candidate/live_coder.html.erb @@ -13,6 +13,6 @@ -<%= render partial: "candidate/answer_errors", locals: {question: question, answer: @answer} %> +<%= render partial: "candidate/answer_errors", locals: {question: @question, answer: @answer} %>
diff --git a/app/views/candidate/question.html.erb b/app/views/candidate/question.html.erb index d0572d8..34eafc1 100644 --- a/app/views/candidate/question.html.erb +++ b/app/views/candidate/question.html.erb @@ -5,7 +5,7 @@ content_for :footer_title, "Skills Assessment" %> -<%= form_for(@answer, url: send("post_#{@question.input_type}_path", @answer.id), html:{id: 'answer-form', data: {qid: @question.question_id}}) do |form| %> +<%= form_for(@answer, url: post_answer_path(@answer.id), html:{id: 'answer-form', data: {qid: @question.question_id}}) do |form| %>

<%= @question.question %>

diff --git a/config/routes.rb b/config/routes.rb index 5ff2be6..ba5d123 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -4,10 +4,7 @@ Rails.application.routes.draw do get "/thankyou", to: "candidate#thankyou", as: :thankyou get "/saved", to: "candidate#saved", as: :saved - post "/question/text(/:answer_id)", to: "candidate#update_text", as: :post_text - post "/question/radio(/:answer_id)", to: "candidate#update_radio", as: :post_radio - post "/question/checkbox(/:answer_id)", to: "candidate#update_checkbox", as: :post_checkbox - post "/question/live-code(/:answer_id)", to: "candidate#update_live_code", as: :post_live_code + post "/question(/:answer_id)", to: "candidate#update_answer", as: :post_answer get "/question(/:question_id)", to: "candidate#question", as: :question get "/live-coder-entry/:question_id", to: "candidate#live_coder", as: :live_coder diff --git a/test/controllers/candidate_controller_test.rb b/test/controllers/candidate_controller_test.rb index 3df9b82..8bc745f 100644 --- a/test/controllers/candidate_controller_test.rb +++ b/test/controllers/candidate_controller_test.rb @@ -53,7 +53,7 @@ class CandidateControllerTest < ActionDispatch::IntegrationTest test "should get flash message on bad radio response" do setup_auth candidates(:martha) qid = questions(:fed1).id - post post_radio_url, params: { answer: { question_id: qid, radio: nil } } + post post_answer_path, params: { answer: { question_id: qid, radio: nil } } assert_response :success assert session[:test_id].present? From 90d0ef9db711069eeb84ebd84f4dd66d9535c465 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Mon, 1 Aug 2016 13:10:59 -0500 Subject: [PATCH 038/205] degraded security for live-coder jQuery load --- app/controllers/candidate_controller.rb | 2 +- test/controllers/candidate_controller_test.rb | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/app/controllers/candidate_controller.rb b/app/controllers/candidate_controller.rb index 0dc39d0..e3860dd 100644 --- a/app/controllers/candidate_controller.rb +++ b/app/controllers/candidate_controller.rb @@ -1,5 +1,5 @@ class CandidateController < ApplicationController - before_action :authorize_candidate, except: [:welcome, :validate] + before_action :authorize_candidate, except: [:welcome, :validate, :live_coder] def welcome end diff --git a/test/controllers/candidate_controller_test.rb b/test/controllers/candidate_controller_test.rb index 8bc745f..cdc2989 100644 --- a/test/controllers/candidate_controller_test.rb +++ b/test/controllers/candidate_controller_test.rb @@ -10,7 +10,7 @@ class CandidateControllerTest < ActionDispatch::IntegrationTest assert_response :success end - test "should require auth or redirect" do + test "should require auth and redirect" do get saved_path assert_redirected_to welcome_path @@ -25,9 +25,6 @@ class CandidateControllerTest < ActionDispatch::IntegrationTest get question_path(questions(:fed1).id) assert_redirected_to welcome_path - - get live_coder_path(questions(:fed1).id) - assert_redirected_to welcome_path end test "should auth to question" do From 8751a04669333f216c69517f146bcaaad6b0b657 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Mon, 1 Aug 2016 15:15:57 -0500 Subject: [PATCH 039/205] fixed question submission --- app/controllers/candidate_controller.rb | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/app/controllers/candidate_controller.rb b/app/controllers/candidate_controller.rb index e3860dd..6390815 100644 --- a/app/controllers/candidate_controller.rb +++ b/app/controllers/candidate_controller.rb @@ -64,8 +64,7 @@ class CandidateController < ApplicationController def answer_params params.require(:answer).permit( :question_id, :answer_id, - :save, :next, :summary, - :radio, :text, checkbox: [], live_code: [] + :radio, :text, checkbox: [], live_code: [:later, :html, :css, :js] ) end @@ -92,32 +91,32 @@ class CandidateController < ApplicationController def process_text @answer = prep_answer @answer.update(answer: answer_params[:text], - saved: answer_params[:save], - submitted: answer_params[:next]) + saved: params.key?(:save), + submitted: params.key?(:submit)) route_answer end def process_radio @answer = prep_answer @answer.update(answer: answer_params[:radio], - saved: answer_params[:save], - submitted: answer_params[:next]) + saved: params.key?(:save), + submitted: params.key?(:submit)) route_answer end def process_checkbox @answer = prep_answer @answer.update(answer: answer_params[:checkbox], - saved: answer_params[:save], - submitted: answer_params[:next]) + saved: params.key?(:save), + submitted: params.key?(:submit)) route_answer end def process_live_code @answer = prep_answer - @answer.update(answer: answer_params[:live_code], - saved: answer_params[:save], - submitted: answer_params[:next]) + @answer.update(answer: answer_params[:live_code].to_h, + saved: params.key?(:save), + submitted: params.key?(:submit)) route_answer end end From bc003eecd111c6fc6faecb11dd19781a42468be0 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Mon, 1 Aug 2016 15:16:20 -0500 Subject: [PATCH 040/205] updated live coder for attributes --- app/views/candidate/_live_code.html.erb | 13 +++++++++++-- app/views/candidate/live_coder.html.erb | 12 ++++++------ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/app/views/candidate/_live_code.html.erb b/app/views/candidate/_live_code.html.erb index 7690f65..8abd4ec 100644 --- a/app/views/candidate/_live_code.html.erb +++ b/app/views/candidate/_live_code.html.erb @@ -1,3 +1,12 @@ +<% + option_id = "#{question.question_id}_finish-later" + + checkbox_html = {class: 'checkbox', + id: "answer_#{option_id}", + name: "answer[live_code][later]", + checked: Array(question.answer).include?('finish-later') + } +%>
Please revisit this page with JavaScript enabled to modify your answer.
@@ -10,8 +19,8 @@ to acknowledge that you agree to come back at a later time to finish answering this question before you can submit the test.

- - + <%= form.check_box(:answer, checkbox_html, true, '') %> + <%= form.label(option_id, 'I will come back later to finish this live coding question.') %> <% end %> diff --git a/app/views/candidate/live_coder.html.erb b/app/views/candidate/live_coder.html.erb index e78bf2b..df661bb 100644 --- a/app/views/candidate/live_coder.html.erb +++ b/app/views/candidate/live_coder.html.erb @@ -1,16 +1,16 @@
- - + + <%= text_area_tag 'answer[live_code][html]', (@answer['html'] unless @answer.nil?), { 'data-id' => 'code-html', class: 'code-answer code-html' } %>
- - + + <%= text_area_tag 'answer[live_code][css]', (@answer['css'] unless @answer.nil?), { 'data-id' => 'code-css', class: 'code-answer code-css' } %>
- - + + <%= text_area_tag 'answer[live_code][js]', (@answer['js'] unless @answer.nil?), { 'data-id' => 'code-js', class: 'code-answer code-js' } %>
<%= render partial: "candidate/answer_errors", locals: {question: @question, answer: @answer} %> From 115fca900985feb78b9e71fdae3984060d13e9ea Mon Sep 17 00:00:00 2001 From: Derek Montgomery Date: Mon, 1 Aug 2016 15:58:20 -0500 Subject: [PATCH 041/205] Summary edit 3 primary input types --- app/assets/javascripts/summary-edit.js | 25 +++++++++++++++++-------- app/controllers/candidate_controller.rb | 11 ++++------- app/views/candidate/summary.html.erb | 2 +- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/app/assets/javascripts/summary-edit.js b/app/assets/javascripts/summary-edit.js index 0b4a764..183ea4f 100644 --- a/app/assets/javascripts/summary-edit.js +++ b/app/assets/javascripts/summary-edit.js @@ -93,7 +93,7 @@ var saveClickHandler = function(e) { var executeQuery; var questionId = thisEd.find('.button-edit').attr('data-questionid'); - if (thisEd.find('textarea.code-answer')) { + if (thisEd.hasClass('live_code-type')) { var htmlAnswer = $(thisEd.find('textarea.code-html')[0]).val(); var cssAnswer = $(thisEd.find('textarea.code-css')[0]).val(); var jsAnswer = $(thisEd.find('textarea.code-js')[0]).val(); @@ -102,29 +102,38 @@ var saveClickHandler = function(e) { 'css': cssAnswer, 'js': jsAnswer } - } else if(thisEd.find('input').attr('type')=='radio') { + } else if(thisEd.hasClass('radio-type')) { $(thisEd.find('input')).each(function() { if($(this).prop('checked')==true) { - data = $(this).val(); + data = ({ + 'radio': $(this).val() + }) } }); - } else if(thisEd.find('input').attr('type')=='checkbox') { + } else if(thisEd.hasClass('checkbox-type')) { + data = {'checkbox': []}; + $(thisEd.find('input')).each(function() { if($(this).prop('checked')==true) { - data.push($(this).val()); + data.checkbox.push($(this).val()); } }); } else { - data = thisEd.find('textarea').val(); + data = {'text': thisEd.find('textarea').val()}; } if(data == '') { $(thisEd).before('
Please select or enter a value.
'); } else { thisEd.find('textarea:not(.code-answer)').replaceWith('

' + $.trim(thisEd.find('textarea').val()) + '

'); + url = thisEd.closest('form').attr('action'); + $.ajax({ type: "POST", - url: "/summary", - data:{ id: questionId, answer: data}, + url: url, + data: ({ + 'answer': data, + 'submit': true + }), success: function(data){ executeQuery = true; //console.log(data); diff --git a/app/controllers/candidate_controller.rb b/app/controllers/candidate_controller.rb index 6390815..3855b53 100644 --- a/app/controllers/candidate_controller.rb +++ b/app/controllers/candidate_controller.rb @@ -22,7 +22,8 @@ class CandidateController < ApplicationController end def update_answer - qid = prep_status.current_question_id + qid = params[:qid] ||= prep_status.current_question_id + @answer = prep_answer qid send "process_#{prep_question(qid).input_type}" end @@ -68,8 +69,8 @@ class CandidateController < ApplicationController ) end - def prep_answer - answer_ids = { question_id: answer_params[:question_id], candidate_id: current_candidate.to_i } + def prep_answer qid = answer_params[:question_id] + answer_ids = { question_id: qid, candidate_id: current_candidate.to_i } answer = Answer.find_or_create_by(answer_ids) answer end @@ -89,7 +90,6 @@ class CandidateController < ApplicationController end def process_text - @answer = prep_answer @answer.update(answer: answer_params[:text], saved: params.key?(:save), submitted: params.key?(:submit)) @@ -97,7 +97,6 @@ class CandidateController < ApplicationController end def process_radio - @answer = prep_answer @answer.update(answer: answer_params[:radio], saved: params.key?(:save), submitted: params.key?(:submit)) @@ -105,7 +104,6 @@ class CandidateController < ApplicationController end def process_checkbox - @answer = prep_answer @answer.update(answer: answer_params[:checkbox], saved: params.key?(:save), submitted: params.key?(:submit)) @@ -113,7 +111,6 @@ class CandidateController < ApplicationController end def process_live_code - @answer = prep_answer @answer.update(answer: answer_params[:live_code].to_h, saved: params.key?(:save), submitted: params.key?(:submit)) diff --git a/app/views/candidate/summary.html.erb b/app/views/candidate/summary.html.erb index 5230789..4596e34 100644 --- a/app/views/candidate/summary.html.erb +++ b/app/views/candidate/summary.html.erb @@ -6,7 +6,7 @@

<% @quiz.each do |question| %> - <%= form_for(:answer, url: post_summary_path, html:{id: 'summary-form'}) do |form| %> + <%= form_for(:answer, url: post_answer_path(answer_id: question.answer_id, qid: question.question_id), html:{class: 'summary-form'}) do |form| %>
From df6175ce8677de8d254e4d394bbcb97db4c3e7e7 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Mon, 1 Aug 2016 16:27:17 -0500 Subject: [PATCH 042/205] live code validations working --- app/validators/answer_format_validator.rb | 13 +- app/views/candidate/_live_code.html.erb | 2 + app/views/candidate/live_coder.html.erb | 2 - .../answer_format_validator_test.rb | 157 ++++++++++++++++++ 4 files changed, 166 insertions(+), 8 deletions(-) create mode 100644 test/validators/answer_format_validator_test.rb diff --git a/app/validators/answer_format_validator.rb b/app/validators/answer_format_validator.rb index 32f0a3f..9e71bb0 100644 --- a/app/validators/answer_format_validator.rb +++ b/app/validators/answer_format_validator.rb @@ -6,31 +6,32 @@ class AnswerFormatValidator < ActiveModel::EachValidator private def text record, attribute, value - return unless value.length.between? 1, 1000 + clean_val = value.to_s.strip + return if clean_val.length.between?(1, 1000) - if value.blank? + if clean_val.blank? record.errors[attribute] << (options[:message] || "Please enter an answer.") end - if value.length > 1000 + if clean_val.length > 1000 record.errors[attribute] << (options[:message] || "The character limit for a textarea answer is 1000") end end def radio record, attribute, value - return unless value.nil? + return unless value.to_s.strip.blank? record.errors[attribute] << (options[:message] || "Please select an answer.") end def checkbox record, attribute, value - return unless value.nil? || value.join.blank? + return unless value.nil? || Array(value).join.blank? record.errors[attribute] << (options[:message] || "Please select an answer.") end def live_code record, attribute, value - return unless value.nil? + return unless value.nil? || value.values.join.blank? msg = "You must write code in one of the above textareas to progress." record.errors[attribute] << (options[:message] || msg) diff --git a/app/views/candidate/_live_code.html.erb b/app/views/candidate/_live_code.html.erb index 8abd4ec..95fdf44 100644 --- a/app/views/candidate/_live_code.html.erb +++ b/app/views/candidate/_live_code.html.erb @@ -29,3 +29,5 @@ # to check for JS capability/enabled %>
+ +<%= render partial: "candidate/answer_errors", locals: {question: question, answer: @answer} %> diff --git a/app/views/candidate/live_coder.html.erb b/app/views/candidate/live_coder.html.erb index df661bb..97d0afd 100644 --- a/app/views/candidate/live_coder.html.erb +++ b/app/views/candidate/live_coder.html.erb @@ -13,6 +13,4 @@ <%= text_area_tag 'answer[live_code][js]', (@answer['js'] unless @answer.nil?), { 'data-id' => 'code-js', class: 'code-answer code-js' } %>
-<%= render partial: "candidate/answer_errors", locals: {question: @question, answer: @answer} %> -
diff --git a/test/validators/answer_format_validator_test.rb b/test/validators/answer_format_validator_test.rb new file mode 100644 index 0000000..56b4881 --- /dev/null +++ b/test/validators/answer_format_validator_test.rb @@ -0,0 +1,157 @@ +require 'test_helper' + +class AnswerValidatable + include ActiveModel::Validations + + attr_accessor :answer + attr_accessor :question + + validates :answer, answer_format: true + + MockQuestion = Struct.new(:input_type) + + def initialize input_type + @input_type = input_type + end + + def question + MockQuestion.new(@input_type) + end +end + +class AnswerFormatValidatorTest < ActiveSupport::TestCase + # input_type RADIO + + test "radio should pass with string" do + obj = AnswerValidatable.new('radio') + obj.answer = 'option-1' + + assert obj.valid? + assert obj.errors.messages.empty? + end + + test "radio should FAIL with nil" do + obj = AnswerValidatable.new('radio') + obj.answer = nil + + refute obj.valid? + assert_match(/select.*answer/, obj.errors.messages[:answer][0]) + end + + test "radio should FAIL with empty string" do + obj = AnswerValidatable.new('radio') + obj.answer = '' + + refute obj.valid? + assert_match(/select.*answer/, obj.errors.messages[:answer][0]) + end + + # input_type TEXT + + test "text should PASS with string" do + obj = AnswerValidatable.new('text') + obj.answer = "this is a valid answer" + + assert obj.valid? + assert obj.errors.messages.empty? + end + + test "text should FAIL with nil" do + obj = AnswerValidatable.new('text') + obj.answer = nil + + refute obj.valid? + assert_match(/enter.*answer/, obj.errors.messages[:answer][0]) + end + + test "text should FAIL with empry string" do + obj = AnswerValidatable.new('text') + obj.answer = " " + + refute obj.valid? + assert_match(/enter.*answer/, obj.errors.messages[:answer][0]) + end + + test "text should FAIL with more than 1000 charactures" do + obj = AnswerValidatable.new('text') + obj.answer = SecureRandom.urlsafe_base64(1001) + + refute obj.valid? + assert_match(/char.*limit.*1000$/, obj.errors.messages[:answer][0]) + end + + # input_type CHECK BOX + + test "checkbox should PASS with populated array" do + obj = AnswerValidatable.new('checkbox') + obj.answer = ["", "", "valid answer"] + + assert obj.valid? + assert obj.errors.messages.empty? + end + + test "checkbox should FAIL with nil" do + obj = AnswerValidatable.new('checkbox') + obj.answer = nil + + refute obj.valid? + assert_match(/select.*answer/, obj.errors.messages[:answer][0]) + end + + test "checkbox should FAIL with empty string" do + obj = AnswerValidatable.new('checkbox') + obj.answer = " " + + refute obj.valid? + assert_match(/select.*answer/, obj.errors.messages[:answer][0]) + end + + test "checkbox should FAIL with array of empty strings" do + obj = AnswerValidatable.new('checkbox') + obj.answer = ["", "", " "] + + refute obj.valid? + assert_match(/select.*answer/, obj.errors.messages[:answer][0]) + end + + # input_type LIVE CODER + test "live_code should PASS with populated hash" do + obj = AnswerValidatable.new('live_code') + obj.answer = { html: 'this is html', css: '', js: '' } + + assert obj.valid? + assert obj.errors.messages.empty? + end + + test "live_code should PASS with finish later" do + obj = AnswerValidatable.new('live_code') + obj.answer = { later: "true" } + + assert obj.valid? + assert obj.errors.messages.empty? + end + + test "live_code should FAIL with nil" do + obj = AnswerValidatable.new('live_code') + obj.answer = nil + + refute obj.valid? + assert_match(/write.*code/, obj.errors.messages[:answer][0]) + end + + test "live_code should FAIL without checking finish later" do + obj = AnswerValidatable.new('live_code') + obj.answer = { "later" => "" } + + refute obj.valid? + assert_match(/write.*code/, obj.errors.messages[:answer][0]) + end + + test "live_code should FAIL without values" do + obj = AnswerValidatable.new('live_code') + obj.answer = { "later" => "", "html" => "", "css" => "", "js" => "" } + + refute obj.valid? + assert_match(/write.*code/, obj.errors.messages[:answer][0]) + end +end From 4a20c579ed81a016a7b994a44c979f0df0a8f428 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Mon, 1 Aug 2016 16:43:05 -0500 Subject: [PATCH 043/205] fixed various error messages --- app/controllers/candidate_controller.rb | 2 +- app/validators/email_format_validator.rb | 2 +- app/views/candidate/welcome.html.erb | 4 ++++ app/views/recruiter/form.html.erb | 10 ++++++---- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/app/controllers/candidate_controller.rb b/app/controllers/candidate_controller.rb index 3855b53..31e1ca8 100644 --- a/app/controllers/candidate_controller.rb +++ b/app/controllers/candidate_controller.rb @@ -45,7 +45,7 @@ class CandidateController < ApplicationController def validate candidate = Candidate.find_by(test_hash: params['test_id']) - redirect_to(root_path, alert: "Sorry, incorrect test id") and return if candidate.nil? + redirect_to(root_path, flash: { error: "Sorry, incorrect test id" }) and return if candidate.nil? session[:test_id] = candidate.test_hash redirect_to :thankyou and return if candidate.completed? diff --git a/app/validators/email_format_validator.rb b/app/validators/email_format_validator.rb index cc2ec71..a862eb8 100644 --- a/app/validators/email_format_validator.rb +++ b/app/validators/email_format_validator.rb @@ -10,7 +10,7 @@ class EmailFormatValidator < ActiveModel::EachValidator end if results.include?(false) - record.errors[attribute] << (options[:message] || "is not formatted properly: #{value}") + record.errors[attribute] << (options[:message] || "is not formatted properly") end end end diff --git a/app/views/candidate/welcome.html.erb b/app/views/candidate/welcome.html.erb index ae4fe34..dabca15 100644 --- a/app/views/candidate/welcome.html.erb +++ b/app/views/candidate/welcome.html.erb @@ -38,6 +38,10 @@
+ + <% if flash[:error].present? %> +
<%= flash[:error] %>
+ <% end %>
<% end %> diff --git a/app/views/recruiter/form.html.erb b/app/views/recruiter/form.html.erb index e0b7029..24d9b48 100644 --- a/app/views/recruiter/form.html.erb +++ b/app/views/recruiter/form.html.erb @@ -4,9 +4,11 @@ <% if flash[:error].present? %>
<%= flash[:error] %> - <% @candidate.errors.messages.each do |k,v| %> -

<%= "#{k}: #{v}" %>

- <% end %> +

+ <% @candidate.errors.messages.each do |k,v| %> + <%= "#{k.to_s} #{v.join(' and ')}" %>
+ <% end %> +

<% end %> @@ -27,6 +29,6 @@ <%= form.hidden_field :quiz_id, { value: Quiz.first.to_i } %> - <%= submit_tag "Login" %> + <%= submit_tag "Save" %> <% end %>
From ab8d983e623e558b5b585450389d5f2d49aeba81 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Mon, 1 Aug 2016 16:47:20 -0500 Subject: [PATCH 044/205] continue-test on saved pages now routes to next question --- app/views/candidate/saved.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/candidate/saved.html.erb b/app/views/candidate/saved.html.erb index 2f6b950..e08dfc0 100644 --- a/app/views/candidate/saved.html.erb +++ b/app/views/candidate/saved.html.erb @@ -5,6 +5,6 @@

From f4be785b610cacba9fbbe3d83022427db297ef28 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Mon, 1 Aug 2016 17:06:24 -0500 Subject: [PATCH 045/205] fixed live-coder answer issues --- app/controllers/candidate_controller.rb | 2 +- app/views/candidate/live_coder.html.erb | 8 +++++--- app/views/candidate/question.html.erb | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/app/controllers/candidate_controller.rb b/app/controllers/candidate_controller.rb index 31e1ca8..cb10cfe 100644 --- a/app/controllers/candidate_controller.rb +++ b/app/controllers/candidate_controller.rb @@ -18,7 +18,7 @@ class CandidateController < ApplicationController redirect_to :summary and return if qid.nil? prep_question qid - @answer = Answer.new + @answer = @question.answer.nil? ? Answer.new : Answer.find(@question.answer_id) end def update_answer diff --git a/app/views/candidate/live_coder.html.erb b/app/views/candidate/live_coder.html.erb index 97d0afd..5145907 100644 --- a/app/views/candidate/live_coder.html.erb +++ b/app/views/candidate/live_coder.html.erb @@ -1,16 +1,18 @@ +<% answer = @answer.answer || {} %> +
- <%= text_area_tag 'answer[live_code][html]', (@answer['html'] unless @answer.nil?), { 'data-id' => 'code-html', class: 'code-answer code-html' } %> + <%= text_area_tag 'answer[live_code][html]', (answer['html']), { 'data-id' => 'code-html', class: 'code-answer code-html' } %>
- <%= text_area_tag 'answer[live_code][css]', (@answer['css'] unless @answer.nil?), { 'data-id' => 'code-css', class: 'code-answer code-css' } %> + <%= text_area_tag 'answer[live_code][css]', (answer['css']), { 'data-id' => 'code-css', class: 'code-answer code-css' } %>
- <%= text_area_tag 'answer[live_code][js]', (@answer['js'] unless @answer.nil?), { 'data-id' => 'code-js', class: 'code-answer code-js' } %> + <%= text_area_tag 'answer[live_code][js]', (answer['js']), { 'data-id' => 'code-js', class: 'code-answer code-js' } %>
diff --git a/app/views/candidate/question.html.erb b/app/views/candidate/question.html.erb index 34eafc1..d479d02 100644 --- a/app/views/candidate/question.html.erb +++ b/app/views/candidate/question.html.erb @@ -5,7 +5,7 @@ content_for :footer_title, "Skills Assessment" %> -<%= form_for(@answer, url: post_answer_path(@answer.id), html:{id: 'answer-form', data: {qid: @question.question_id}}) do |form| %> +<%= form_for(@answer, url: post_answer_path(@answer.id), html:{method: :post, id: 'answer-form', data: {qid: @question.question_id}}) do |form| %>

<%= @question.question %>

From f06aed6541da6b791611453e08c260fd417dc2aa Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Mon, 1 Aug 2016 19:35:10 -0500 Subject: [PATCH 046/205] email validator tests, live coding later error message --- app/models/candidate.rb | 5 +-- app/validators/answer_format_validator.rb | 6 ++- app/validators/email_format_validator.rb | 4 +- .../answer_format_validator_test.rb | 2 +- .../validators/email_format_validator_test.rb | 41 +++++++++++++++++++ 5 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 test/validators/email_format_validator_test.rb diff --git a/app/models/candidate.rb b/app/models/candidate.rb index b219635..afae0eb 100644 --- a/app/models/candidate.rb +++ b/app/models/candidate.rb @@ -6,10 +6,9 @@ class Candidate < ApplicationRecord before_validation(:generate_test_hash, on: :create) - validates_presence_of :name - validates_presence_of :email - validates_presence_of :experience validates_presence_of :recruiter_id + validates_presence_of :name + validates_presence_of :experience validates :email, uniqueness: true, presence: true, email_format: true validates :test_hash, uniqueness: true, presence: true diff --git a/app/validators/answer_format_validator.rb b/app/validators/answer_format_validator.rb index 9e71bb0..1cbcfea 100644 --- a/app/validators/answer_format_validator.rb +++ b/app/validators/answer_format_validator.rb @@ -33,7 +33,11 @@ class AnswerFormatValidator < ActiveModel::EachValidator def live_code record, attribute, value return unless value.nil? || value.values.join.blank? - msg = "You must write code in one of the above textareas to progress." + msg = if value.present? && value.keys.count == 1 + "Please check that you will come back to complete the code example." + else + "You must write code in one of the above textareas to progress." + end record.errors[attribute] << (options[:message] || msg) end end diff --git a/app/validators/email_format_validator.rb b/app/validators/email_format_validator.rb index a862eb8..2418922 100644 --- a/app/validators/email_format_validator.rb +++ b/app/validators/email_format_validator.rb @@ -9,8 +9,6 @@ class EmailFormatValidator < ActiveModel::EachValidator (v.strip =~ /^([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})$/i) || v.strip.blank? end - if results.include?(false) - record.errors[attribute] << (options[:message] || "is not formatted properly") - end + record.errors[attribute] << (options[:message] || "is not formatted properly") if results.include?(false) end end diff --git a/test/validators/answer_format_validator_test.rb b/test/validators/answer_format_validator_test.rb index 56b4881..b8a7d2f 100644 --- a/test/validators/answer_format_validator_test.rb +++ b/test/validators/answer_format_validator_test.rb @@ -144,7 +144,7 @@ class AnswerFormatValidatorTest < ActiveSupport::TestCase obj.answer = { "later" => "" } refute obj.valid? - assert_match(/write.*code/, obj.errors.messages[:answer][0]) + assert_match(/come back/, obj.errors.messages[:answer][0]) end test "live_code should FAIL without values" do diff --git a/test/validators/email_format_validator_test.rb b/test/validators/email_format_validator_test.rb new file mode 100644 index 0000000..2de25a8 --- /dev/null +++ b/test/validators/email_format_validator_test.rb @@ -0,0 +1,41 @@ +require 'test_helper' + +class EmailValidatable + include ActiveModel::Validations + attr_accessor :email + validates :email, email_format: true +end + +class EmailFormatValidatorTest < ActiveSupport::TestCase + test "tld length" do + obj = EmailValidatable.new + + obj.email = "me@no.yes.x" + refute obj.valid?, 'allowed single length tld' + + obj.email = "me@no.yes.co" + assert obj.valid?, 'did not allow tld length 2' + + obj.email = "me@no.yes.com" + assert obj.valid?, 'did not allow tld length 3' + + obj.email = "me@no.yes.commets" + assert obj.valid?, 'did not allow tld length > 3' + end + + test "can handle comma seperated addresses" do + obj = EmailValidatable.new + obj.email = "me@no.yes, me@yes.no" + + assert obj.valid?, 'did not allow multiple address [comma seperated]' + end + + test "provides proper error message" do + obj = EmailValidatable.new + obj.email = "this is a bad email address" + obj.valid? + + refute obj.errors.messages.empty?, 'needs an error message' + assert_match(/not formatted properly/, obj.errors.messages[:email].join) + end +end From f076db259fde4c236c6cbf5cda4ffb9e2a93efc6 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Mon, 1 Aug 2016 19:51:04 -0500 Subject: [PATCH 047/205] corrected can_submit to account for finish_later --- app/workers/quiz_status.rb | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/app/workers/quiz_status.rb b/app/workers/quiz_status.rb index bca6a87..8245c8e 100644 --- a/app/workers/quiz_status.rb +++ b/app/workers/quiz_status.rb @@ -18,7 +18,9 @@ class QuizStatus end def can_submit - on_summary && candidate.answered_questions.count == candidate.questions.count + on_summary && + no_finish_later && + candidate.answered_questions.count == candidate.questions.count end def progress @@ -28,6 +30,17 @@ class QuizStatus (answs / total * 100).round.to_i end + def no_finish_later + sql = %(select count(a.id) todos + from answers a + inner join questions q on q.id = a.question_id + where q.input_type = 'live_code' + and a.answer like "%later: 'true'%" + and a.candidate_id = #{candidate.id}) + result = ActiveRecord::Base.connection.exec_query(sql).to_hash.first + result['todos'].zero? + end + def current_question_id sql = "select q.id question_id from candidates c From 465b465528e962bb6aa37ddee3d46d930eee945d Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Mon, 1 Aug 2016 20:44:39 -0500 Subject: [PATCH 048/205] configured settings & secrets --- .gitignore | 3 +++ Gemfile | 1 + Gemfile.lock | 2 ++ app/services/skill_config.rb | 6 ++++++ config/application.yml.sample | 21 +++++++++++++++++++++ config/database.yml | 10 +++++----- 6 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 app/services/skill_config.rb create mode 100644 config/application.yml.sample diff --git a/.gitignore b/.gitignore index 8a8fe78..f11e40a 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,6 @@ application.yml # Ignore Byebug command history file. .byebug_history + +# Ignore application configuration +/config/application.yml diff --git a/Gemfile b/Gemfile index d17b9b7..0f574db 100644 --- a/Gemfile +++ b/Gemfile @@ -1,6 +1,7 @@ source 'https://rubygems.org' gem 'figaro', '~> 1.1.1' +gem 'settingslogic', '~> 2.0.9' gem 'bcrypt', '~> 3.1.7' gem 'mysql2', '>= 0.3.18', '< 0.5' gem 'rails', '~> 5.0.0' diff --git a/Gemfile.lock b/Gemfile.lock index d2ed7ea..54d643d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -209,6 +209,7 @@ GEM sprockets (>= 2.8, < 4.0) sprockets-rails (>= 2.0, < 4.0) tilt (>= 1.1, < 3) + settingslogic (2.0.9) shellany (0.0.1) slop (3.6.0) spring (1.7.2) @@ -274,6 +275,7 @@ DEPENDENCIES rails-erd rubocop (~> 0.42.0) sass-rails (~> 5.0) + settingslogic (~> 2.0.9) spring spring-watcher-listen (~> 2.0.0) turbolinks (~> 5) diff --git a/app/services/skill_config.rb b/app/services/skill_config.rb new file mode 100644 index 0000000..6f3c718 --- /dev/null +++ b/app/services/skill_config.rb @@ -0,0 +1,6 @@ +class SkillConfig < Settingslogic + source "#{Rails.root}/config/application.yml" + namespace Rails.env + suppress_errors Rails.env.production? + load! +end diff --git a/config/application.yml.sample b/config/application.yml.sample new file mode 100644 index 0000000..506166b --- /dev/null +++ b/config/application.yml.sample @@ -0,0 +1,21 @@ +# Add configuration values here, as shown below. + +defaults: &defaults + mysql_host: "localhost" + mysql_usr: "user" + mysql_pwd: "password" + mailjet_key: "api-key" + mailjet_secret: "api-secret" + default_mail_from: "skills-assessment@dev.perficientxd.com" + +development: + <<: *defaults + +test: + <<: *defaults + +production: + <<: *defaults + mysql_usr: "user" + mysql_pwd: "password!" + secret_key_base: "super-long-secret-key-base" diff --git a/config/database.yml b/config/database.yml index b60aa35..c20b9ea 100644 --- a/config/database.yml +++ b/config/database.yml @@ -13,9 +13,9 @@ default: &default adapter: mysql2 encoding: utf8 pool: 5 - username: root - password: root - host: localhost + host: <%= ENV['mysql_host'] %> + username: <%= ENV['mysql_usr'] %> + password: <%= ENV['mysql_pwd'] %> development: <<: *default @@ -50,5 +50,5 @@ test: production: <<: *default database: skill-assessment-app_production - username: skill-assessment-app - password: <%= ENV['SKILL-ASSESSMENT-APP_DATABASE_PASSWORD'] %> + username: <%= ENV['mysql_usr'] %> + password: <%= ENV['mysql_pwd'] %> From f7ec6ee84fdcd5dac7707cee6fcde07f27988e08 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Tue, 2 Aug 2016 07:58:58 -0500 Subject: [PATCH 049/205] mailjet add/config --- Gemfile | 4 ++-- Gemfile.lock | 17 +++++++++++++++++ app/mailers/application_mailer.rb | 2 +- config/application.rb | 3 +++ config/application.yml.sample | 2 ++ config/initializers/mailjet.rb | 5 +++++ 6 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 config/initializers/mailjet.rb diff --git a/Gemfile b/Gemfile index 0f574db..b03c04f 100644 --- a/Gemfile +++ b/Gemfile @@ -1,17 +1,17 @@ source 'https://rubygems.org' gem 'figaro', '~> 1.1.1' -gem 'settingslogic', '~> 2.0.9' gem 'bcrypt', '~> 3.1.7' gem 'mysql2', '>= 0.3.18', '< 0.5' gem 'rails', '~> 5.0.0' -# gem 'autoprefixer-rails' gem 'jbuilder', '~> 2.6' gem 'jquery-rails' gem 'json', '~> 2.0.2' +gem 'mailjet', '~> 1.3.8' gem 'puma', '~> 3.0' gem 'sass-rails', '~> 5.0' +gem 'settingslogic', '~> 2.0.9' gem 'turbolinks', '~> 5' gem 'uglifier', '>= 1.3.0' diff --git a/Gemfile.lock b/Gemfile.lock index 54d643d..22880a9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -62,6 +62,8 @@ GEM coderay (1.1.1) concurrent-ruby (1.0.2) debug_inspector (0.0.2) + domain_name (0.5.20160615) + unf (>= 0.0.5, < 1.0.0) em-websocket (0.5.1) eventmachine (>= 0.12.9) http_parser.rb (~> 0.6.0) @@ -98,6 +100,8 @@ GEM guard-shell (0.7.1) guard (>= 2.0.0) guard-compat (~> 1.0) + http-cookie (1.0.2) + domain_name (~> 0.5) http_parser.rb (0.6.0) i18n (0.7.0) jbuilder (2.6.0) @@ -117,6 +121,10 @@ GEM lumberjack (1.0.10) mail (2.6.4) mime-types (>= 1.16, < 4) + mailjet (1.3.8) + activesupport (>= 3.1.0) + rack (>= 1.4.0) + rest-client method_source (0.8.2) mime-types (3.1) mime-types-data (~> 3.2015) @@ -134,6 +142,7 @@ GEM sass (>= 3.3) thor (~> 0.19) nenv (0.3.0) + netrc (0.11.0) nio4r (1.2.1) nokogiri (1.6.8) mini_portile2 (~> 2.1.0) @@ -193,6 +202,10 @@ GEM rb-fsevent (0.9.7) rb-inotify (0.9.7) ffi (>= 0.5.0) + rest-client (2.0.0) + http-cookie (>= 1.0.2, < 2.0) + mime-types (>= 1.16, < 4.0) + netrc (~> 0.8) rubocop (0.42.0) parser (>= 2.3.1.1, < 3.0) powerpack (~> 0.1) @@ -233,6 +246,9 @@ GEM thread_safe (~> 0.1) uglifier (3.0.0) execjs (>= 0.3.0, < 3) + unf (0.1.4) + unf_ext + unf_ext (0.0.7.2) unicode-display_width (1.1.0) web-console (3.3.1) actionview (>= 5.0) @@ -264,6 +280,7 @@ DEPENDENCIES jquery-rails json (~> 2.0.2) listen (~> 3.0) + mailjet (~> 1.3.8) minitest-reporters mysql2 (>= 0.3.18, < 0.5) neat diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb index 286b223..e21ed33 100644 --- a/app/mailers/application_mailer.rb +++ b/app/mailers/application_mailer.rb @@ -1,4 +1,4 @@ class ApplicationMailer < ActionMailer::Base - default from: 'from@example.com' + default from: ENV['default_mail_from'] layout 'mailer' end diff --git a/config/application.rb b/config/application.rb index 5b0cbe8..4bbbd91 100644 --- a/config/application.rb +++ b/config/application.rb @@ -20,5 +20,8 @@ module SkillAssessmentApp # bower config.assets.paths << Rails.root.join('vendor', 'assets', 'bower_components') + + config.action_mailer.delivery_method = :mailjet + config.action_mailer.default_url_options = { host: ENV['full_app_url'] } end end diff --git a/config/application.yml.sample b/config/application.yml.sample index 506166b..4c8f82f 100644 --- a/config/application.yml.sample +++ b/config/application.yml.sample @@ -7,6 +7,7 @@ defaults: &defaults mailjet_key: "api-key" mailjet_secret: "api-secret" default_mail_from: "skills-assessment@dev.perficientxd.com" + full_app_url: "localhost:3000" development: <<: *defaults @@ -19,3 +20,4 @@ production: mysql_usr: "user" mysql_pwd: "password!" secret_key_base: "super-long-secret-key-base" + full_app_url: "dev.perficientxd.com/Skills-Assessment/" diff --git a/config/initializers/mailjet.rb b/config/initializers/mailjet.rb new file mode 100644 index 0000000..2481ab2 --- /dev/null +++ b/config/initializers/mailjet.rb @@ -0,0 +1,5 @@ +Mailjet.configure do |config| + config.api_key = ENV['mailjet_key'] + config.secret_key = ENV['mailjet_secret'] + config.default_from = ENV['default_mail_from'] +end From 78238e6d72867452205e572a9c8c3245e58dc548 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Tue, 2 Aug 2016 10:08:16 -0500 Subject: [PATCH 050/205] candidate mailer --- app/mailers/candidate_mailer.rb | 19 ++++++++++++ app/views/candidate_mailer/reminder.html.erb | 27 ++++++++++++++++ app/views/candidate_mailer/reminder.text.erb | 10 ++++++ app/views/candidate_mailer/submitted.html.erb | 17 ++++++++++ app/views/candidate_mailer/submitted.text.erb | 5 +++ app/views/candidate_mailer/welcome.html.erb | 27 ++++++++++++++++ app/views/candidate_mailer/welcome.text.erb | 10 ++++++ app/views/layouts/mailer.html.erb | 2 +- test/mailers/candidate_mailer_test.rb | 31 +++++++++++++++++++ .../previews/candidate_mailer_preview.rb | 14 +++++++++ 10 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 app/mailers/candidate_mailer.rb create mode 100644 app/views/candidate_mailer/reminder.html.erb create mode 100644 app/views/candidate_mailer/reminder.text.erb create mode 100644 app/views/candidate_mailer/submitted.html.erb create mode 100644 app/views/candidate_mailer/submitted.text.erb create mode 100644 app/views/candidate_mailer/welcome.html.erb create mode 100644 app/views/candidate_mailer/welcome.text.erb create mode 100644 test/mailers/candidate_mailer_test.rb create mode 100644 test/mailers/previews/candidate_mailer_preview.rb diff --git a/app/mailers/candidate_mailer.rb b/app/mailers/candidate_mailer.rb new file mode 100644 index 0000000..ac3486d --- /dev/null +++ b/app/mailers/candidate_mailer.rb @@ -0,0 +1,19 @@ +class CandidateMailer < ApplicationMailer + def welcome candidate + @candidate = candidate + + mail to: @candidate.email, subject: "Perficient Digital - Skills Assessment Test" + end + + def reminder candidate + @candidate = candidate + + mail to: @candidate.email, subject: "Perficient Digital - Skills Assessment Test" + end + + def submitted candidate + @candidate = candidate + + mail to: @candidate.email, subject: "Perficient Digital - Skills Assessment Test" + end +end diff --git a/app/views/candidate_mailer/reminder.html.erb b/app/views/candidate_mailer/reminder.html.erb new file mode 100644 index 0000000..74faed6 --- /dev/null +++ b/app/views/candidate_mailer/reminder.html.erb @@ -0,0 +1,27 @@ + + + + + + + + + + + +
+ PERFICIENT DIGITAL - Skills Assessment Test +
+

Dear <%= @candidate.name %>,

+

+ Thank you for taking the Skills Assessment Test. However, it looks like you have not submitted it + yet. If you are having troubles, please reach out to your recruiter: + <%= mail_to @candidate.recruiter.email %> +

+

+ You can return to the test here: + <%= link_to nil, root_url %> +
+ Your test id is: <%= @candidate.test_hash %> +

+
diff --git a/app/views/candidate_mailer/reminder.text.erb b/app/views/candidate_mailer/reminder.text.erb new file mode 100644 index 0000000..f9895f3 --- /dev/null +++ b/app/views/candidate_mailer/reminder.text.erb @@ -0,0 +1,10 @@ +PERFICIENT DIGITAL - Skills Assessment Test + +Thank you for taking the Skills Assessment Test. However, it looks like you have not submitted it +yet. If you are having troubles, please reach out to your recruiter: +<%= @candidate.recruiter.email %> + +You can return to the test here: +<%= root_url %> + +Your test id is: <%= @candidate.test_hash %> diff --git a/app/views/candidate_mailer/submitted.html.erb b/app/views/candidate_mailer/submitted.html.erb new file mode 100644 index 0000000..32a4af8 --- /dev/null +++ b/app/views/candidate_mailer/submitted.html.erb @@ -0,0 +1,17 @@ + + + + + + + + + + + +
+ PERFICIENT DIGITAL - Skills Assessment Test +
+

Dear <%= @candidate.name %>,

+

Thank you for taking the Skills Assessment Test. Your recruiter will be in touch.

+
diff --git a/app/views/candidate_mailer/submitted.text.erb b/app/views/candidate_mailer/submitted.text.erb new file mode 100644 index 0000000..dcbc844 --- /dev/null +++ b/app/views/candidate_mailer/submitted.text.erb @@ -0,0 +1,5 @@ +PERFICIENT DIGITAL - Skills Assessment Test + +Dear <%= @candidate.name %>, + +Thank you for taking the Skills Assessment Test. Your recruiter will be in touch. diff --git a/app/views/candidate_mailer/welcome.html.erb b/app/views/candidate_mailer/welcome.html.erb new file mode 100644 index 0000000..3336217 --- /dev/null +++ b/app/views/candidate_mailer/welcome.html.erb @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + +
+ PERFICIENT DIGITAL - Skills Assessment Test +
+

Your Candidate ID is <%= @candidate.test_hash %>

+
+

+ Please visit <%= link_to nil, root_url %> + and enter the above Candidate ID to being your test. +

+
We will reach back to you once we have evaluated your answers. Good luck!
+
diff --git a/app/views/candidate_mailer/welcome.text.erb b/app/views/candidate_mailer/welcome.text.erb new file mode 100644 index 0000000..6194b9a --- /dev/null +++ b/app/views/candidate_mailer/welcome.text.erb @@ -0,0 +1,10 @@ +PERFICIENT DIGITAL - Skills Assessment Test + +Your Candidate ID is <%= @candidate.test_hash %> + +Please visit <%= root_url %> +and enter the above Candidate ID to being your test. + +We will reach back to you once we have evaluated your answers. + +Good luck! diff --git a/app/views/layouts/mailer.html.erb b/app/views/layouts/mailer.html.erb index cbd34d2..ab4308c 100644 --- a/app/views/layouts/mailer.html.erb +++ b/app/views/layouts/mailer.html.erb @@ -3,7 +3,7 @@ diff --git a/test/mailers/candidate_mailer_test.rb b/test/mailers/candidate_mailer_test.rb new file mode 100644 index 0000000..1b41c27 --- /dev/null +++ b/test/mailers/candidate_mailer_test.rb @@ -0,0 +1,31 @@ +require 'test_helper' + +class CandidateMailerTest < ActionMailer::TestCase + test "welcome" do + candidate = candidates(:martha) + mail = CandidateMailer.welcome candidate + assert_match(/skills assessment test/i, mail.subject) + assert_equal [candidate.email], mail.to + assert_equal [ENV["default_mail_from"]], mail.from + assert_match candidate.test_hash, mail.body.encoded + end + + test "reminder" do + candidate = candidates(:roy) + mail = CandidateMailer.reminder candidate + assert_match(/skills assessment test/i, mail.subject) + assert_equal [candidate.email], mail.to + assert_equal [ENV["default_mail_from"]], mail.from + assert_match candidate.test_hash, mail.body.encoded + assert_match candidate.recruiter.email, mail.body.encoded + end + + test "submitted" do + candidate = candidates(:dawn) + mail = CandidateMailer.submitted candidate + assert_match(/skills assessment test/i, mail.subject) + assert_equal [candidate.email], mail.to + assert_equal [ENV["default_mail_from"]], mail.from + assert_match candidate.name, mail.body.encoded + end +end diff --git a/test/mailers/previews/candidate_mailer_preview.rb b/test/mailers/previews/candidate_mailer_preview.rb new file mode 100644 index 0000000..08ee6c9 --- /dev/null +++ b/test/mailers/previews/candidate_mailer_preview.rb @@ -0,0 +1,14 @@ +# Preview all emails at http://localhost:3000/rails/mailers/candidate_mailer +class CandidateMailerPreview < ActionMailer::Preview + def welcome + CandidateMailer.welcome Candidate.find_by(test_hash: 'R67PmfDHGiw') # Martha + end + + def reminder + CandidateMailer.reminder Candidate.find_by(test_hash: 'NmEjDkOEKY4') # Roy + end + + def submitted + CandidateMailer.submitted Candidate.find_by(test_hash: 'OvP0ZqGKwJ0') # Dawn + end +end From 4136db4aabe51868b6b94d7d0d287af99deccc71 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Tue, 2 Aug 2016 10:35:33 -0500 Subject: [PATCH 051/205] recruiter mailer --- app/mailers/recruiter_mailer.rb | 13 ++++++++++ .../candidate_created.html.erb | 24 +++++++++++++++++++ .../candidate_created.text.erb | 10 ++++++++ .../candidate_submitted.html.erb | 17 +++++++++++++ .../candidate_submitted.text.erb | 4 ++++ .../previews/recruiter_mailer_preview.rb | 10 ++++++++ test/mailers/recruiter_mailer_test.rb | 21 ++++++++++++++++ 7 files changed, 99 insertions(+) create mode 100644 app/mailers/recruiter_mailer.rb create mode 100644 app/views/recruiter_mailer/candidate_created.html.erb create mode 100644 app/views/recruiter_mailer/candidate_created.text.erb create mode 100644 app/views/recruiter_mailer/candidate_submitted.html.erb create mode 100644 app/views/recruiter_mailer/candidate_submitted.text.erb create mode 100644 test/mailers/previews/recruiter_mailer_preview.rb create mode 100644 test/mailers/recruiter_mailer_test.rb diff --git a/app/mailers/recruiter_mailer.rb b/app/mailers/recruiter_mailer.rb new file mode 100644 index 0000000..06fb44b --- /dev/null +++ b/app/mailers/recruiter_mailer.rb @@ -0,0 +1,13 @@ +class RecruiterMailer < ApplicationMailer + def candidate_created candidate + @candidate = candidate + + mail to: @candidate.recruiter.email, subject: "Skills Assessment Test - #{candidate.name}" + end + + def candidate_submitted candidate + @candidate = candidate + + mail to: @candidate.recruiter.email, subject: "Skills Assessment Test - #{candidate.name}" + end +end diff --git a/app/views/recruiter_mailer/candidate_created.html.erb b/app/views/recruiter_mailer/candidate_created.html.erb new file mode 100644 index 0000000..2138311 --- /dev/null +++ b/app/views/recruiter_mailer/candidate_created.html.erb @@ -0,0 +1,24 @@ + + + + + + + + + + + +
+ PERFICIENT DIGITAL - Skills Assessment Test +
+

The following candidate has been invited to take the Skills Assessment Test:

+

+ Candidate Name: <%= @candidate.name %>
+ Candidate Email: <%= @candidate.email %>
+ Candidate ID: <%= @candidate.test_hash %>
+ Years of Experience: <%= @candidate.experience %> Years
+

+ +

You will be notified when the candidate has finished taking the test.

+
diff --git a/app/views/recruiter_mailer/candidate_created.text.erb b/app/views/recruiter_mailer/candidate_created.text.erb new file mode 100644 index 0000000..e8d2529 --- /dev/null +++ b/app/views/recruiter_mailer/candidate_created.text.erb @@ -0,0 +1,10 @@ +PERFICIENT DIGITAL - Skills Assessment Test + +The following candidate has been invited to take the Skills Assessment Test: + +Candidate Name: <%= @candidate.name %> +Candidate Email: <%= @candidate.email %> +Candidate ID: <%= @candidate.test_hash %> +Years of Experience: <%= @candidate.experience %> Years + +You will be notified when the candidate has finished taking the test. diff --git a/app/views/recruiter_mailer/candidate_submitted.html.erb b/app/views/recruiter_mailer/candidate_submitted.html.erb new file mode 100644 index 0000000..23070ea --- /dev/null +++ b/app/views/recruiter_mailer/candidate_submitted.html.erb @@ -0,0 +1,17 @@ + + + + + + + + + + + +
+ PERFICIENT DIGITAL - Skills Assessment Test +
+

<%= @candidate.name %> has completed the Skills Assessment Test.

+

Martin Ridgway will let you know if we would like to interview this candidate.

+
diff --git a/app/views/recruiter_mailer/candidate_submitted.text.erb b/app/views/recruiter_mailer/candidate_submitted.text.erb new file mode 100644 index 0000000..d27ef77 --- /dev/null +++ b/app/views/recruiter_mailer/candidate_submitted.text.erb @@ -0,0 +1,4 @@ +PERFICIENT DIGITAL - Skills Assessment Test + +<%= @candidate.name %> has completed the Skills Assessment Test. +Martin Ridgway will let you know if we would like to interview this candidate. diff --git a/test/mailers/previews/recruiter_mailer_preview.rb b/test/mailers/previews/recruiter_mailer_preview.rb new file mode 100644 index 0000000..b739fb8 --- /dev/null +++ b/test/mailers/previews/recruiter_mailer_preview.rb @@ -0,0 +1,10 @@ +# Preview all emails at http://localhost:3000/rails/mailers/recruiter_mailer +class RecruiterMailerPreview < ActionMailer::Preview + def candidate_created + RecruiterMailer.candidate_created Candidate.find_by(test_hash: 'R67PmfDHGiw') # Martha + end + + def candidate_submitted + RecruiterMailer.candidate_submitted Candidate.find_by(test_hash: 'OvP0ZqGKwJ0') # Dawn + end +end diff --git a/test/mailers/recruiter_mailer_test.rb b/test/mailers/recruiter_mailer_test.rb new file mode 100644 index 0000000..e6fabe4 --- /dev/null +++ b/test/mailers/recruiter_mailer_test.rb @@ -0,0 +1,21 @@ +require 'test_helper' + +class RecruiterMailerTest < ActionMailer::TestCase + test "candidate_created" do + candidate = candidates :martha + mail = RecruiterMailer.candidate_created candidate + assert_match candidate.name, mail.subject + assert_equal [candidate.recruiter.email], mail.to + assert_equal [ENV["default_mail_from"]], mail.from + assert_match candidate.test_hash, mail.body.encoded + end + + test "candidate_submitted" do + candidate = candidates :dawn + mail = RecruiterMailer.candidate_submitted candidate + assert_match candidate.name, mail.subject + assert_equal [candidate.recruiter.email], mail.to + assert_equal [ENV["default_mail_from"]], mail.from + assert_match candidate.name, mail.body.encoded + end +end From f626aea47d89aa6b81b0d0c10354d2b552848636 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Tue, 2 Aug 2016 11:30:03 -0500 Subject: [PATCH 052/205] reviewer mailers --- app/mailers/reviewer_mailer.rb | 15 +++++++++++++++ .../candidate_submission.html.erb | 18 ++++++++++++++++++ .../candidate_submission.text.erb | 5 +++++ test/fixtures/users.yml | 1 - .../previews/reviewer_mailer_preview.rb | 6 ++++++ test/mailers/reviewer_mailer_test.rb | 12 ++++++++++++ 6 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 app/mailers/reviewer_mailer.rb create mode 100644 app/views/reviewer_mailer/candidate_submission.html.erb create mode 100644 app/views/reviewer_mailer/candidate_submission.text.erb create mode 100644 test/mailers/previews/reviewer_mailer_preview.rb create mode 100644 test/mailers/reviewer_mailer_test.rb diff --git a/app/mailers/reviewer_mailer.rb b/app/mailers/reviewer_mailer.rb new file mode 100644 index 0000000..325df53 --- /dev/null +++ b/app/mailers/reviewer_mailer.rb @@ -0,0 +1,15 @@ +class ReviewerMailer < ApplicationMailer + def candidate_submission candidate + @candidate = candidate + + # TODO: candidate.reviewers.map(:email) + if Rails.env.production? + recipients = ["harish.bhavanichikar@perficient.com", "jacob.schulke@perficient.com", + "jennifer.siegfried@perficient.com", "martin.ridgway@perficient.com"] + else + recipients = ["fed.reviewer@mailinator.com"] + end + + mail to: recipients, subject: "Skills Assessment Results" + end +end diff --git a/app/views/reviewer_mailer/candidate_submission.html.erb b/app/views/reviewer_mailer/candidate_submission.html.erb new file mode 100644 index 0000000..6307b47 --- /dev/null +++ b/app/views/reviewer_mailer/candidate_submission.html.erb @@ -0,0 +1,18 @@ + + + + + + + + + + + +
+ SKILLS ASSESSMENT RESULTS +
+

<%= @candidate.test_hash %>

+

has completed the Skills Assesment Test.

+

You can review the results here: <%= link_to nil, review_test_url(@candidate.test_hash) %>

+
diff --git a/app/views/reviewer_mailer/candidate_submission.text.erb b/app/views/reviewer_mailer/candidate_submission.text.erb new file mode 100644 index 0000000..e3acb32 --- /dev/null +++ b/app/views/reviewer_mailer/candidate_submission.text.erb @@ -0,0 +1,5 @@ +SKILLS ASSESSMENT RESULTS + +<%= @candidate.test_hash %> +has completed the Skills Assesment Test. +You can review the results here: <%= review_test_url(@candidate.test_hash) %> diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml index 54ff4ec..6b8ef4d 100644 --- a/test/fixtures/users.yml +++ b/test/fixtures/users.yml @@ -17,4 +17,3 @@ admin: email: alan.admin@mailinator.com password_digest: <%= BCrypt::Password.create("password", cost: 4) %> role: admin - diff --git a/test/mailers/previews/reviewer_mailer_preview.rb b/test/mailers/previews/reviewer_mailer_preview.rb new file mode 100644 index 0000000..bf08208 --- /dev/null +++ b/test/mailers/previews/reviewer_mailer_preview.rb @@ -0,0 +1,6 @@ +# Preview all emails at http://localhost:3000/rails/mailers/reviewer_mailer +class ReviewerMailerPreview < ActionMailer::Preview + def candidate_submission + ReviewerMailer.candidate_submission Candidate.find_by(test_hash: 'OvP0ZqGKwJ0') # Dawn + end +end diff --git a/test/mailers/reviewer_mailer_test.rb b/test/mailers/reviewer_mailer_test.rb new file mode 100644 index 0000000..807f992 --- /dev/null +++ b/test/mailers/reviewer_mailer_test.rb @@ -0,0 +1,12 @@ +require 'test_helper' + +class ReviewerMailerTest < ActionMailer::TestCase + test "candidate_submission" do + candidate = candidates :dawn + mail = ReviewerMailer.candidate_submission candidate + assert_match "Results", mail.subject + # assert_equal [candidate.recruiter.email], mail.to + assert_equal [ENV["default_mail_from"]], mail.from + assert_match candidate.test_hash, mail.body.encoded + end +end From 54189603f0dfcbc0c72b6c8bdb3955e1c934d527 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Tue, 2 Aug 2016 11:48:18 -0500 Subject: [PATCH 053/205] mailers on candidate creation --- app/controllers/recruiter_controller.rb | 2 ++ test/controllers/recruiter_controller_test.rb | 8 +++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/controllers/recruiter_controller.rb b/app/controllers/recruiter_controller.rb index c93d19e..3d6ae2c 100644 --- a/app/controllers/recruiter_controller.rb +++ b/app/controllers/recruiter_controller.rb @@ -14,6 +14,8 @@ class RecruiterController < ApplicationController @candidate = Candidate.create(candidate_params.merge(recruiter_id: current_recruiter.id)) if @candidate.persisted? + CandidateMailer.welcome(@candidate).deliver_now + RecruiterMailer.candidate_created(@candidate).deliver_now redirect_to recruiter_path, flash: { notice: "Sucessfully created candidate #{@candidate.name}" } else flash[:error] = "Failed to save Candidate." diff --git a/test/controllers/recruiter_controller_test.rb b/test/controllers/recruiter_controller_test.rb index da5d5f6..6108584 100644 --- a/test/controllers/recruiter_controller_test.rb +++ b/test/controllers/recruiter_controller_test.rb @@ -57,9 +57,11 @@ class RecruiterControllerTest < ActionDispatch::IntegrationTest test "should create new candidate" do # recruiter = users(:recruiter) setup_auth - assert_difference("Candidate.count") do - post create_candidate_path, params: { candidate: - { name: 'new name', email: 'test@mailinator.com', experience: '0-3', quiz_id: quizzes(:fed).id } } + assert_difference("ActionMailer::Base.deliveries.size", 2) do + assert_difference("Candidate.count") do + post create_candidate_path, params: { candidate: + { name: 'new name', email: 'test@mailinator.com', experience: '0-3', quiz_id: quizzes(:fed).id } } + end end assert_redirected_to recruiter_path assert flash[:notice] From 8e27fb8e015081807abbaa17782de7038cc19de3 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Tue, 2 Aug 2016 11:57:52 -0500 Subject: [PATCH 054/205] mailers on submission --- app/controllers/candidate_controller.rb | 5 +++++ test/controllers/candidate_controller_test.rb | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/app/controllers/candidate_controller.rb b/app/controllers/candidate_controller.rb index cb10cfe..2a271f8 100644 --- a/app/controllers/candidate_controller.rb +++ b/app/controllers/candidate_controller.rb @@ -41,6 +41,11 @@ class CandidateController < ApplicationController # TODO def update_summary # redirect_to :summary + + # only after successful submission + CandidateMailer.submitted(current_candidate).deliver_now + RecruiterMailer.candidate_submitted(current_candidate).deliver_now + ReviewerMailer.candidate_submission(current_candidate).deliver_now end def validate diff --git a/test/controllers/candidate_controller_test.rb b/test/controllers/candidate_controller_test.rb index cdc2989..c013fab 100644 --- a/test/controllers/candidate_controller_test.rb +++ b/test/controllers/candidate_controller_test.rb @@ -56,4 +56,12 @@ class CandidateControllerTest < ActionDispatch::IntegrationTest assert session[:test_id].present? assert_equal qid, flash[:answer_error] end + + test "should send mailers on submission" do + setup_auth candidates(:dawn) + + assert_difference("ActionMailer::Base.deliveries.size", 3) do + post post_summary_path + end + end end From 9ac58773df5195fc988746724ff31b3eea19435c Mon Sep 17 00:00:00 2001 From: Derek Montgomery Date: Tue, 2 Aug 2016 13:49:03 -0500 Subject: [PATCH 055/205] Summary CRUD completed --- app/assets/javascripts/live-coder.js | 68 ++++++++++--------------- app/assets/javascripts/summary-edit.js | 9 ++-- app/controllers/candidate_controller.rb | 13 +++-- app/views/candidate/question.html.erb | 40 ++++++++------- 4 files changed, 61 insertions(+), 69 deletions(-) diff --git a/app/assets/javascripts/live-coder.js b/app/assets/javascripts/live-coder.js index aed1f8b..26aee9d 100644 --- a/app/assets/javascripts/live-coder.js +++ b/app/assets/javascripts/live-coder.js @@ -1,17 +1,8 @@ -function updateResults(includeJavascript) { - // var includeJavascript = includeJavascript; - // - // if (!(typeof(includeJavascript) != 'undefined' && includeJavascript == true)){ - // includeJavascript = false; - // } - - var resultsContainer = document.querySelectorAll('[data-id="results"]')[0]; - var codeHtml = document.querySelectorAll('[data-id="code-html"]')[0].value.trim(); - var codeCss = document.querySelectorAll('[data-id="code-css"]')[0].value.trim(); - - // if(includeJavascript == true){ - var codeJs = document.querySelectorAll('[data-id="code-js"]')[0].value.trim(); - // } +function updateResults(elem) { + var resultsContainer = $(elem).find('[data-id="results"]')[0]; + var codeHtml = $(elem).find('.code-html')[0].value.trim(); + var codeCss = $(elem).find('.code-css')[0].value.trim(); + var codeJs = $(elem).find('.code-js')[0].value.trim(); resultsContainer.innerHTML = ""; var iDoc = document.createElement('html'); @@ -33,13 +24,11 @@ function updateResults(includeJavascript) { iBody.innerHTML = codeHtml; iDoc.appendChild(iBody); - // if(includeJavascript == true){ - var codeScript = document.createElement("script"); - codeScript.setAttribute("type", "text/javascript"); - var scriptNode = document.createTextNode(codeJs); - codeScript.appendChild(scriptNode); - iDoc.appendChild(codeScript); - // } + var codeScript = document.createElement("script"); + codeScript.setAttribute("type", "text/javascript"); + var scriptNode = document.createTextNode(codeJs); + codeScript.appendChild(scriptNode); + iDoc.appendChild(codeScript); codeFrame.contentWindow.document.open(); codeFrame.contentWindow.document.appendChild(iDoc); @@ -98,39 +87,36 @@ function indentSelection(e){ } } +function loadLiveCoders(){ + $.each($('.answer-sec.live_code-type'), function(index, elem){ + var qid = $(elem).data('qid'); + $(elem).find("[data-id='live-coder-answer']").load("/live-coder-entry/" + qid, function(){ + $(elem).find('.js-error').addClass('hidden'); + $(elem).find(".code-input textarea").linedtextarea(); + updateResults(this); + }); + }); +} + timer = 0; $(function(){ // wait a half second before updating results // restart the timer if they resume typing $('html').on('keyup', '.code-input textarea', function(){ + var elem = $(this).closest('.answer-sec.live_code-type'); if (timer) { clearTimeout(timer); } - timer = setTimeout(updateResults, 500); + timer = setTimeout(updateResults(elem), 500); }); $("html").on('keydown', "textarea[data-id^=code-]", function(e){ indentSelection(e); }); - // If JavaScript is enabled, display the livecoder section dynamically - var qid = $('form#answer-form').data('qid'); - $("[data-id='live-coder-answer']").load("/live-coder-entry/" + qid, function(){ - // if it loads in, and hide "finish later" checkbox - $("[data-id='live-coder-finish-later']").addClass("hidden"); - $('.js-error').addClass('hidden'); - updateResults(); - $(".code-input textarea").linedtextarea(); + $.when(loadLiveCoders()).done(function(){ + //simple live coder for summary page + $("[data-id=live-coder-no-js], [data-id=live-coder-finish-later]").addClass('hidden'); + $("[data-id=live-coder]").removeClass('hidden'); }); - $("[data-id=live-coder]").each(function(){ - updateResults(); - }); - - - //simple live coder for summary page - $("[data-id=live-coder-no-js]").addClass('hidden'); - $("[data-id=live-coder]").removeClass('hidden'); - - $(".code-input textarea").linedtextarea(); - }); diff --git a/app/assets/javascripts/summary-edit.js b/app/assets/javascripts/summary-edit.js index 183ea4f..5f5dc12 100644 --- a/app/assets/javascripts/summary-edit.js +++ b/app/assets/javascripts/summary-edit.js @@ -98,9 +98,11 @@ var saveClickHandler = function(e) { var cssAnswer = $(thisEd.find('textarea.code-css')[0]).val(); var jsAnswer = $(thisEd.find('textarea.code-js')[0]).val(); data = { - 'html': htmlAnswer, - 'css': cssAnswer, - 'js': jsAnswer + 'live_code': { + 'html': htmlAnswer, + 'css': cssAnswer, + 'js': jsAnswer + } } } else if(thisEd.hasClass('radio-type')) { $(thisEd.find('input')).each(function() { @@ -136,7 +138,6 @@ var saveClickHandler = function(e) { }), success: function(data){ executeQuery = true; - //console.log(data); }, error: function(data){ executeQuery = false; diff --git a/app/controllers/candidate_controller.rb b/app/controllers/candidate_controller.rb index 2a271f8..bd99277 100644 --- a/app/controllers/candidate_controller.rb +++ b/app/controllers/candidate_controller.rb @@ -14,11 +14,9 @@ class CandidateController < ApplicationController def question qid = prep_status.current_question_id - redirect_to :summary and return if qid.nil? - prep_question qid - @answer = @question.answer.nil? ? Answer.new : Answer.find(@question.answer_id) + prep_instance_answer @question end def update_answer @@ -28,13 +26,14 @@ class CandidateController < ApplicationController end def live_coder - question + prep_question params[:question_id] + prep_instance_answer @question + prep_answer params[:question_id] render layout: false end def summary @quiz = current_candidate.my_quiz - redirect_to :question and return unless prep_status.current_question_id.nil? end @@ -67,6 +66,10 @@ class CandidateController < ApplicationController @status ||= QuizStatus.new(current_candidate) end + def prep_instance_answer question + @answer = question.answer.nil? ? Answer.new : Answer.find(question.answer_id) + end + def answer_params params.require(:answer).permit( :question_id, :answer_id, diff --git a/app/views/candidate/question.html.erb b/app/views/candidate/question.html.erb index d479d02..0610e88 100644 --- a/app/views/candidate/question.html.erb +++ b/app/views/candidate/question.html.erb @@ -7,30 +7,32 @@ <%= form_for(@answer, url: post_answer_path(@answer.id), html:{method: :post, id: 'answer-form', data: {qid: @question.question_id}}) do |form| %>
-

<%= @question.question %>

+
+

<%= @question.question %>

-
- <%= hidden_field_tag 'answer[question_id]', @question.question_id %> - <%= hidden_field_tag 'answer[answer_id]', @question.answer_id %> - <%= render partial: @question.input_type, locals: {question: @question, form: form} %> -
- - <% if @status.on_summary %> - -
- +
+ <%= hidden_field_tag 'answer[question_id]', @question.question_id %> + <%= hidden_field_tag 'answer[answer_id]', @question.answer_id %> + <%= render partial: @question.input_type, locals: {question: @question, form: form} %>
- <% else %> + <% if @status.on_summary %> -
- -
-
- -
+
+ +
- <% end %> + <% else %> + +
+ +
+
+ +
+ + <% end %> +
<% end %> From d5052644c22d50232f07e265922de900cf72cc5b Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Tue, 2 Aug 2016 15:25:55 -0500 Subject: [PATCH 056/205] reminders in play! --- app/workers/reminder.rb | 37 +++++++++++++++++++++++++++++++++++ lib/tasks/reminders.rake | 7 +++++++ test/fixtures/answers.yml | 8 ++++---- test/workers/reminder_test.rb | 26 ++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 app/workers/reminder.rb create mode 100644 lib/tasks/reminders.rake create mode 100644 test/workers/reminder_test.rb diff --git a/app/workers/reminder.rb b/app/workers/reminder.rb new file mode 100644 index 0000000..29584e2 --- /dev/null +++ b/app/workers/reminder.rb @@ -0,0 +1,37 @@ +class Reminder + def initialize + @collection = reminder_collection + end + + def count + @collection.count + end + alias size count + + def candidates + Candidate.includes(:recruiter).where(id: @collection.map { |row| row['id'] }) + end + + def send_all + candidates.each do |candidate| + CandidateMailer.reminder(candidate).deliver_now + flag_as_reminded candidate.id + end + end + + private + + def reminder_collection + sql = "select c.id, c.test_hash, c.name, c.email, max(a.updated_at) last_updated + from candidates c + inner join answers a on a.candidate_id = c.id + where completed = false and reminded = false + group by c.id + having MAX(a.updated_at) < DATE_SUB(NOW(), INTERVAL 24 HOUR);" + ActiveRecord::Base.connection.exec_query(sql) + end + + def flag_as_reminded candidate_id + Candidate.find(candidate_id).update(reminded: true) + end +end diff --git a/lib/tasks/reminders.rake b/lib/tasks/reminders.rake new file mode 100644 index 0000000..bd2ee48 --- /dev/null +++ b/lib/tasks/reminders.rake @@ -0,0 +1,7 @@ +namespace :reminders do + desc "send reminders to stagnate quizes" + task send_all: :environment do + reminders = Reminder.new + reminders.send_all + end +end diff --git a/test/fixtures/answers.yml b/test/fixtures/answers.yml index a46385b..7ae3270 100644 --- a/test/fixtures/answers.yml +++ b/test/fixtures/answers.yml @@ -6,8 +6,8 @@ roy1: answer: option2 saved: 0 submitted: true - created_at: <%= DateTime.now() - 90.minutes %> - updated_at: <%= DateTime.now() - 90.minutes %> + created_at: <%= DateTime.now() - 90.minutes - 36.hours %> + updated_at: <%= DateTime.now() - 90.minutes - 36.hours %> roy2: candidate: roy @@ -15,8 +15,8 @@ roy2: answer: ["option-1", "option-4", "option5"] saved: 1 submitted: true - created_at: <%= DateTime.now() - 85.minutes %> - updated_at: <%= DateTime.now() - 85.minutes %> + created_at: <%= DateTime.now() - 85.minutes - 36.hours %> + updated_at: <%= DateTime.now() - 85.minutes - 36.hours %> dawn1: candidate: dawn diff --git a/test/workers/reminder_test.rb b/test/workers/reminder_test.rb new file mode 100644 index 0000000..00d25e5 --- /dev/null +++ b/test/workers/reminder_test.rb @@ -0,0 +1,26 @@ +require 'test_helper' + +class ReminderTest < ActiveSupport::TestCase + test "collection is created with one result" do + reminders = Reminder.new + assert_equal 1, reminders.size + end + + test "each candidate has needed attributes" do + reminders = Reminder.new + + assert_instance_of String, reminders.candidates.first.name + assert_instance_of String, reminders.candidates.first.test_hash + assert_instance_of String, reminders.candidates.first.email + end + + test "send reminders sends email, and flags reminded" do + reminders = Reminder.new + pre_reminded = Candidate.find(reminders.candidates.first.id).reminded + + assert_difference("ActionMailer::Base.deliveries.size", reminders.count) do + reminders.send_all + end + refute_equal pre_reminded, Candidate.find(reminders.candidates.first.id).reminded + end +end From 02007b88717187ea39a86ceab3859e02d68d3e6d Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Tue, 2 Aug 2016 15:55:37 -0500 Subject: [PATCH 057/205] temp rubocop squelch --- .rubocop.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.rubocop.yml b/.rubocop.yml index 2ad2401..597ee1d 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -43,6 +43,11 @@ Metrics/AbcSize: - db/migrate/**/* Max: 20 +# TODO: remove this cop exception after refactor +Metrics/ClassLength: + Exclude: + - app/controllers/candidate_controller.rb + Metrics/LineLength: Max: 110 Exclude: @@ -54,4 +59,3 @@ Metrics/LineLength: Metrics/MethodLength: Exclude: - db/migrate/* - # - app/controllers/* From fe4bcef4ae258bdf42eca0b554d0b7ba0e6459fa Mon Sep 17 00:00:00 2001 From: Derek Montgomery Date: Tue, 2 Aug 2016 16:20:59 -0500 Subject: [PATCH 058/205] Markup fix --- app/views/candidate/question.html.erb | 42 +++++++++++++-------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/app/views/candidate/question.html.erb b/app/views/candidate/question.html.erb index 0610e88..3762b96 100644 --- a/app/views/candidate/question.html.erb +++ b/app/views/candidate/question.html.erb @@ -6,33 +6,31 @@ %> <%= form_for(@answer, url: post_answer_path(@answer.id), html:{method: :post, id: 'answer-form', data: {qid: @question.question_id}}) do |form| %> -
-
-

<%= @question.question %>

+
+

<%= @question.question %>

-
- <%= hidden_field_tag 'answer[question_id]', @question.question_id %> - <%= hidden_field_tag 'answer[answer_id]', @question.answer_id %> - <%= render partial: @question.input_type, locals: {question: @question, form: form} %> +
+ <%= hidden_field_tag 'answer[question_id]', @question.question_id %> + <%= hidden_field_tag 'answer[answer_id]', @question.answer_id %> + <%= render partial: @question.input_type, locals: {question: @question, form: form} %> +
+ + <% if @status.on_summary %> + +
+
- <% if @status.on_summary %> + <% else %> -
- -
+
+ +
+
+ +
- <% else %> - -
- -
-
- -
- - <% end %> -
+ <% end %>
<% end %> From 988f1346c18b7a6978ab46f4c2727a1cf8a80779 Mon Sep 17 00:00:00 2001 From: Derek Montgomery Date: Tue, 2 Aug 2016 16:26:55 -0500 Subject: [PATCH 059/205] Live coder JS adjustments --- app/assets/javascripts/live-coder.js | 3 +++ app/assets/javascripts/summary-edit.js | 12 +++++------- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/app/assets/javascripts/live-coder.js b/app/assets/javascripts/live-coder.js index 26aee9d..099766b 100644 --- a/app/assets/javascripts/live-coder.js +++ b/app/assets/javascripts/live-coder.js @@ -93,6 +93,9 @@ function loadLiveCoders(){ $(elem).find("[data-id='live-coder-answer']").load("/live-coder-entry/" + qid, function(){ $(elem).find('.js-error').addClass('hidden'); $(elem).find(".code-input textarea").linedtextarea(); + if(window.location.href.indexOf("summary") > -1) { + $(elem).find(".code-input textarea").attr('disabled', true); + } updateResults(this); }); }); diff --git a/app/assets/javascripts/summary-edit.js b/app/assets/javascripts/summary-edit.js index 5f5dc12..8948a99 100644 --- a/app/assets/javascripts/summary-edit.js +++ b/app/assets/javascripts/summary-edit.js @@ -165,7 +165,7 @@ var saveClickHandler = function(e) { $('.answer-block').prop('disabled', true); // Question events - $('.answer-sec') +$('.answer-sec') .find('.button-cancel, .button-save').hide().end() // // delegating events .on('click', '.button-edit', editClickHandler) @@ -173,12 +173,10 @@ $('.answer-block').prop('disabled', true); .on('click', '.button-save', saveClickHandler); // Dynamically load in coders - $.each($('.answer-sec.live-coder-type'), function(index, elem){ - var qid = $(elem).data('qid'); - $(elem).find("[data-id='live-coder-answer']").load("/live-coder-entry/" + qid, function(){ +$.each($('.answer-sec.live-coder-type'), function(index, elem){ + var qid = $(elem).data('qid'); + $(elem).find("[data-id='live-coder-answer']").load("/live-coder-entry/" + qid, function(){ $(elem).find('.js-error').addClass('hidden'); - // updateResults(); - $(elem).find(".code-input textarea").linedtextarea(); + $(elem).find(".code-input textarea").linedtextarea(); }); - }); From 7bdb86f89fdfdb6cd2056cd2cc7a0ac4ba8c959c Mon Sep 17 00:00:00 2001 From: Derek Montgomery Date: Tue, 2 Aug 2016 16:27:27 -0500 Subject: [PATCH 060/205] Submit summary --- app/controllers/candidate_controller.rb | 13 ++- app/models/candidate.rb | 11 +++ app/views/candidate/summary.html.erb | 10 +- test/controllers/candidate_controller_test.rb | 13 ++- test/fixtures/answers.yml | 92 ++++++++++++++++++- test/fixtures/candidates.yml | 10 ++ 6 files changed, 135 insertions(+), 14 deletions(-) diff --git a/app/controllers/candidate_controller.rb b/app/controllers/candidate_controller.rb index bd99277..8b537bc 100644 --- a/app/controllers/candidate_controller.rb +++ b/app/controllers/candidate_controller.rb @@ -37,14 +37,13 @@ class CandidateController < ApplicationController redirect_to :question and return unless prep_status.current_question_id.nil? end - # TODO def update_summary - # redirect_to :summary - - # only after successful submission - CandidateMailer.submitted(current_candidate).deliver_now - RecruiterMailer.candidate_submitted(current_candidate).deliver_now - ReviewerMailer.candidate_submission(current_candidate).deliver_now + prep_status + not_completed_error = 'You must complete all questions to submit your test.' + record_error = 'There was a problem with your submission. Please try again later.' + redirect_to :summary, flash: { error: not_completed_error } and return unless @status.can_submit + redirect_to :thankyou and return if current_candidate.complete! + redirect_to :summary, flash: { error: record_error } end def validate diff --git a/app/models/candidate.rb b/app/models/candidate.rb index afae0eb..bea5dae 100644 --- a/app/models/candidate.rb +++ b/app/models/candidate.rb @@ -33,6 +33,17 @@ class Candidate < ApplicationRecord "--" end + def complete! + if update_attributes(completed: true) + CandidateMailer.submitted(self).deliver_now + RecruiterMailer.candidate_submitted(self).deliver_now + ReviewerMailer.candidate_submission(self).deliver_now + return true + end + false + end + + private def generate_test_hash diff --git a/app/views/candidate/summary.html.erb b/app/views/candidate/summary.html.erb index 4596e34..c9e4874 100644 --- a/app/views/candidate/summary.html.erb +++ b/app/views/candidate/summary.html.erb @@ -26,13 +26,13 @@ - <% end #questions loop %> - <% end #form_tag %> + <% end %> + <% end %> <% if @status.can_submit %> -
- -
+ <%= form_tag post_summary_path, class: "btn-container-right" do %> + + <% end %> <% else %>
Sorry, you must answer all questions before you can submit.
<% end %> diff --git a/test/controllers/candidate_controller_test.rb b/test/controllers/candidate_controller_test.rb index c013fab..6be3d0d 100644 --- a/test/controllers/candidate_controller_test.rb +++ b/test/controllers/candidate_controller_test.rb @@ -57,11 +57,22 @@ class CandidateControllerTest < ActionDispatch::IntegrationTest assert_equal qid, flash[:answer_error] end - test "should send mailers on submission" do + test "should NOT send mailers on submission" do setup_auth candidates(:dawn) + assert_difference("ActionMailer::Base.deliveries.size", 0) do + post post_summary_path + end + assert_redirected_to summary_path + assert_match 'must complete', flash[:error] + end + + test "should send mailers on submission" do + setup_auth candidates(:peggy) + assert_difference("ActionMailer::Base.deliveries.size", 3) do post post_summary_path end + assert_redirected_to thankyou_path end end diff --git a/test/fixtures/answers.yml b/test/fixtures/answers.yml index 7ae3270..901f60d 100644 --- a/test/fixtures/answers.yml +++ b/test/fixtures/answers.yml @@ -108,6 +108,97 @@ dawn10: created_at: <%= DateTime.now() - 38.hours - 40.minutes %> updated_at: <%= DateTime.now() - 38.hours - 20.minutes %> +peggy1: + candidate: peggy + question: fed1 + answer: option-1 + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 38.hours - 50.minutes %> + updated_at: <%= DateTime.now() - 38.hours - 50.minutes %> + +peggy2: + candidate: peggy + question: fed2 + answer: ["option2", "option-4"] + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 38.hours - 50.minutes %> + updated_at: <%= DateTime.now() - 38.hours - 50.minutes %> + +peggy3: + candidate: peggy + question: fed3 + answer: {html: "peggy3

I'm a little tealpot

", css: 'h1 {color: teal;}', js: ''} + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 38.hours - 50.minutes %> + updated_at: <%= DateTime.now() - 38.hours - 50.minutes %> + +peggy4: + candidate: peggy + question: fed4 + answer: Vestibulum id ligula porta felis euismod semper. Sed posuere consectetur est at lobortis. + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 38.hours - 50.minutes %> + updated_at: <%= DateTime.now() - 38.hours - 50.minutes %> + +peggy5: + candidate: peggy + question: fed5 + answer: "option 3" + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 38.hours - 50.minutes %> + updated_at: <%= DateTime.now() - 38.hours - 50.minutes %> + +peggy6: + candidate: peggy + question: fed6 + answer: Integer posuere erat a ante venenatis dapibus posuere velit aliquet. + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 38.hours - 32.minutes %> + updated_at: <%= DateTime.now() - 38.hours - 12.minutes %> + +peggy7: + candidate: peggy + question: fed7 + answer: {html: 'peggy7

This means jQuery needs to be available in live-coder!

', css: "strong {font-size: 1.6em;}\n.green {color: green;}", js: '$("strong").addClass("green");'} + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 38.hours - 34.minutes %> + updated_at: <%= DateTime.now() - 38.hours - 14.minutes %> + +peggy8: + candidate: peggy + question: fed8 + answer: option2 + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 38.hours - 38.minutes %> + updated_at: <%= DateTime.now() - 38.hours - 16.minutes %> + +peggy9: + candidate: peggy + question: fed9 + answer: Grunt + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 38.hours - 38.minutes %> + updated_at: <%= DateTime.now() - 38.hours - 18.minutes %> + +peggy10: + candidate: peggy + question: fed10 + answer: ["Live long and prosper", "Who you calling Scruffy?"] + saved: 1 + submitted: true + created_at: <%= DateTime.now() - 38.hours - 40.minutes %> + updated_at: <%= DateTime.now() - 38.hours - 20.minutes %> + + richard1: candidate: richard question: fed1 @@ -197,4 +288,3 @@ richard10: submitted: true created_at: <%= DateTime.now() - 36.hours - 40.minutes %> updated_at: <%= DateTime.now() - 36.hours - 20.minutes %> - diff --git a/test/fixtures/candidates.yml b/test/fixtures/candidates.yml index 7eeca9e..f845583 100644 --- a/test/fixtures/candidates.yml +++ b/test/fixtures/candidates.yml @@ -30,6 +30,16 @@ dawn: reminded: true test_hash: OvP0ZqGKwJ0 +peggy: + name: Peggy Blisters + email: peggy.blisters@mailinator.com + experience: 0-2 + recruiter: recruiter + quiz: fed + completed: false + reminded: true + test_hash: 242a9d5d085 + richard: name: Richard Burns email: richard.burns@mailinator.com From 737fd106368cddbf856536bbb3d22a45a1806833 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Tue, 2 Aug 2016 18:02:20 -0500 Subject: [PATCH 061/205] split login/welcome and added direct link welcome --- app/controllers/application_controller.rb | 2 +- app/controllers/candidate_controller.rb | 27 ++++++- app/views/candidate/login.html.erb | 20 ++++++ app/views/candidate/oops.html.erb | 9 +++ app/views/candidate/welcome.html.erb | 70 ++++++------------- app/views/candidate_mailer/welcome.html.erb | 5 +- app/views/candidate_mailer/welcome.text.erb | 7 +- config/routes.rb | 44 ++++++------ test/controllers/candidate_controller_test.rb | 26 ++++--- 9 files changed, 125 insertions(+), 85 deletions(-) create mode 100644 app/views/candidate/login.html.erb create mode 100644 app/views/candidate/oops.html.erb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index c2965a3..ed68e9d 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -30,6 +30,6 @@ class ApplicationController < ActionController::Base end def authorize_candidate - redirect_to welcome_path unless current_candidate + redirect_to login_path unless current_candidate end end diff --git a/app/controllers/candidate_controller.rb b/app/controllers/candidate_controller.rb index 8b537bc..6031fc4 100644 --- a/app/controllers/candidate_controller.rb +++ b/app/controllers/candidate_controller.rb @@ -1,5 +1,14 @@ class CandidateController < ApplicationController - before_action :authorize_candidate, except: [:welcome, :validate, :live_coder] + before_action :authorize_candidate, except: [:login, :validate, :live_coder] + before_action :send_to_oops, only: [:login] + + def login + login_candidate + redirect_to :thankyou and return if current_candidate && current_candidate.completed? + redirect_to :welcome if current_candidate + + flash[:error] = "Sorry, incorrect test id" if params[:test_hash].present? + end def welcome end @@ -7,6 +16,9 @@ class CandidateController < ApplicationController def saved end + def oops + end + def thankyou redirect_to root_path if session[:test_id].nil? reset_session @@ -52,11 +64,22 @@ class CandidateController < ApplicationController session[:test_id] = candidate.test_hash redirect_to :thankyou and return if candidate.completed? - redirect_to :question + redirect_to :welcome end private + def login_candidate + candidate = Candidate.find_by(test_hash: params['test_id']) + return false if candidate.nil? + + session[:test_id] = candidate.test_hash + end + + def send_to_oops + redirect_to oops_path if current_candidate + end + def prep_question qid @question = current_candidate.fetch_question(qid) end diff --git a/app/views/candidate/login.html.erb b/app/views/candidate/login.html.erb new file mode 100644 index 0000000..35ee06d --- /dev/null +++ b/app/views/candidate/login.html.erb @@ -0,0 +1,20 @@ +<% content_for :title, "Skills Assessment" %> + +
+

Let's Get Started

+

+ Hey there! Give us your test id, and we'll get you started. +

+ + <%= form_tag(validate_candidate_path) do %> +
+ + + + <% if flash[:error].present? %> +
<%= flash[:error] %>
+ <% end %> +
+ + <% end %> +
diff --git a/app/views/candidate/oops.html.erb b/app/views/candidate/oops.html.erb new file mode 100644 index 0000000..81eda59 --- /dev/null +++ b/app/views/candidate/oops.html.erb @@ -0,0 +1,9 @@ +
+

Oops!

+

+ Looks like you hit the browser's Back button. You can't go backwards in the test, + but you'll have a chance at the end to review your answers and make changes. +

+ + +
diff --git a/app/views/candidate/welcome.html.erb b/app/views/candidate/welcome.html.erb index dabca15..cee02ab 100644 --- a/app/views/candidate/welcome.html.erb +++ b/app/views/candidate/welcome.html.erb @@ -1,50 +1,26 @@ <% content_for :title, "Skills Assessment" %> -<% if session[:test_id].present? %> +
+

Welcome!

+

+ This is a skills assessment test. It's the first step in the process of interviewing + for a Front-End Development position with Perficient Digital. +

+

+ The questions will test your knowledge in the areas of HTML, CSS, and JavaScript. + Please note that you can only move forward through the test, not back, + and you must attempt to answer the question before moving to the + next one. You'll have an opportunity at the end of the test to review and update your + answers if need be. At any time, you may save your progress and log back in to continue + taking the test from where you left off. +

+

+ Please answer to the best of your ability—it's totally okay to say + "I don't know"!—and above all, relax and have fun! Once you submit your + answers, we will review your assessment and your recruiter will be in touch. +

-
-

Oops!

-

- Looks like you hit the browser's Back button. You can't go backwards in the test, - but you'll have a chance at the end to review your answers and make changes. -

- - -
- -<% else %> - -
-

Let's Get Started

-

- This is a skills assessment test. It's the first step in the process of interviewing - for a Front-End Development position with Perficient Digital. -

-

- The questions will test your knowledge in the areas of HTML, CSS, and JavaScript. - Please note that you can only move forward through the test, not back, - and you must attempt to answer the question before moving to the - next one. You'll have an opportunity at the end of the test to review and update your - answers if need be. At any time, you may save your progress and log back in to continue - taking the test from where you left off. -

-

- Please answer to the best of your ability—it's totally okay to say - "I don't know"!—and above all, relax and have fun! Once you submit your - answers, we will review your assessment and your recruiter will be in touch. -

- - <%= form_tag(validate_candidate_path) do %> -
- - - - <% if flash[:error].present? %> -
<%= flash[:error] %>
- <% end %> -
- - <% end %> -
- -<% end %> + <%= link_to question_path do %> + + <% end %> +
diff --git a/app/views/candidate_mailer/welcome.html.erb b/app/views/candidate_mailer/welcome.html.erb index 3336217..e458d56 100644 --- a/app/views/candidate_mailer/welcome.html.erb +++ b/app/views/candidate_mailer/welcome.html.erb @@ -17,9 +17,10 @@

- Please visit <%= link_to nil, root_url %> - and enter the above Candidate ID to being your test. + Please visit <%= link_to nil, login_url(@candidate.test_hash) %> to get started.

+

If you would rather, visit <%= link_to nil, root_url %> + and enter the above Candidate ID to being your test.

We will reach back to you once we have evaluated your answers. Good luck!
diff --git a/app/views/candidate_mailer/welcome.text.erb b/app/views/candidate_mailer/welcome.text.erb index 6194b9a..5e1fe81 100644 --- a/app/views/candidate_mailer/welcome.text.erb +++ b/app/views/candidate_mailer/welcome.text.erb @@ -1,10 +1,9 @@ PERFICIENT DIGITAL - Skills Assessment Test -Your Candidate ID is <%= @candidate.test_hash %> +Please visit <%= login_url(@candidate.test_hash) %> to get started. -Please visit <%= root_url %> -and enter the above Candidate ID to being your test. +Or, visit <%= root_url %> and enter your Candidate ID to being your test. +Your Candidate ID is: <%= @candidate.test_hash %> We will reach back to you once we have evaluated your answers. - Good luck! diff --git a/config/routes.rb b/config/routes.rb index ba5d123..ba4630d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,30 +1,32 @@ Rails.application.routes.draw do - post "/validate", to: "candidate#validate", as: :validate_candidate - get "/welcome", to: "candidate#welcome", as: :welcome - get "/thankyou", to: "candidate#thankyou", as: :thankyou - get "/saved", to: "candidate#saved", as: :saved + post "/validate", to: "candidate#validate", as: :validate_candidate + get "/login(/:test_id)", to: "candidate#login", as: :login + get "/welcome", to: "candidate#welcome", as: :welcome + get "/saved", to: "candidate#saved", as: :saved + get "/thankyou", to: "candidate#thankyou", as: :thankyou + get "/oops", to: "candidate#oops", as: :oops - post "/question(/:answer_id)", to: "candidate#update_answer", as: :post_answer - get "/question(/:question_id)", to: "candidate#question", as: :question - get "/live-coder-entry/:question_id", to: "candidate#live_coder", as: :live_coder + post "/question(/:answer_id)", to: "candidate#update_answer", as: :post_answer + get "/question(/:question_id)", to: "candidate#question", as: :question + get "/live-coder-entry/:question_id", to: "candidate#live_coder", as: :live_coder - post "/summary", to: "candidate#update_summary", as: :post_summary - get "/summary", to: "candidate#summary", as: :summary + post "/summary", to: "candidate#update_summary", as: :post_summary + get "/summary", to: "candidate#summary", as: :summary - get "/review/logout", to: "review#logout", as: :review_logout - post "/review/login", to: "review#auth", as: :review_auth - get "/review/login", to: "review#login", as: :review_login - get "/review", to: "review#index", as: :review - get "/review/:test_hash", to: "review#view", as: :review_test + get "/review/logout", to: "review#logout", as: :review_logout + post "/review/login", to: "review#auth", as: :review_auth + get "/review/login", to: "review#login", as: :review_login + get "/review", to: "review#index", as: :review + get "/review/:test_hash", to: "review#view", as: :review_test - get "/recruiter", to: "recruiter#index", as: :recruiter - get "/recruiter/new-candidate", to: "recruiter#new", as: :new_candidate - post "/recruiter/new-candidate", to: "recruiter#create", as: :create_candidate - get "/recruiter/logout", to: "recruiter#logout", as: :recruiter_logout - get "/recruiter/login", to: "recruiter#login", as: :recruiter_login - post "/recruiter/login", to: "recruiter#auth", as: :recruiter_auth + get "/recruiter", to: "recruiter#index", as: :recruiter + get "/recruiter/new-candidate", to: "recruiter#new", as: :new_candidate + post "/recruiter/new-candidate", to: "recruiter#create", as: :create_candidate + get "/recruiter/logout", to: "recruiter#logout", as: :recruiter_logout + get "/recruiter/login", to: "recruiter#login", as: :recruiter_login + post "/recruiter/login", to: "recruiter#auth", as: :recruiter_auth - root to: "candidate#welcome" + root to: "candidate#login" # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html end diff --git a/test/controllers/candidate_controller_test.rb b/test/controllers/candidate_controller_test.rb index 6be3d0d..adba814 100644 --- a/test/controllers/candidate_controller_test.rb +++ b/test/controllers/candidate_controller_test.rb @@ -6,32 +6,42 @@ class CandidateControllerTest < ActionDispatch::IntegrationTest end test "should get login" do - get welcome_path + get login_path assert_response :success + refute flash[:error].present?, "Should not be displaying an error message" end test "should require auth and redirect" do get saved_path - assert_redirected_to welcome_path + assert_redirected_to login_path get thankyou_path - assert_redirected_to welcome_path + assert_redirected_to login_path get summary_path - assert_redirected_to welcome_path + assert_redirected_to login_path get question_path - assert_redirected_to welcome_path + assert_redirected_to login_path get question_path(questions(:fed1).id) - assert_redirected_to welcome_path + assert_redirected_to login_path end - test "should auth to question" do + test "should auth to welcome" do setup_auth candidates(:martha) - assert_redirected_to question_path + assert_redirected_to welcome_path assert session[:test_id].present? + refute flash[:error].present?, "Should not be displaying an error message" + end + + test "should auth directly to welcome" do + get login_path(candidates(:martha).test_hash) + + assert_redirected_to welcome_path + assert session[:test_id].present? + refute flash[:error].present?, "Should not be displaying an error message" end test "should redirect to thankyou when completed" do From 1a97bb16fa0ad0a33d69ca88f6196e83b7f9b172 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Tue, 2 Aug 2016 18:04:10 -0500 Subject: [PATCH 062/205] removed extra line --- app/models/candidate.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/models/candidate.rb b/app/models/candidate.rb index bea5dae..e2f171e 100644 --- a/app/models/candidate.rb +++ b/app/models/candidate.rb @@ -43,7 +43,6 @@ class Candidate < ApplicationRecord false end - private def generate_test_hash From a3eab2b27aceec845adcd8fe9d7acf364ad6ea4c Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Tue, 2 Aug 2016 18:30:15 -0500 Subject: [PATCH 063/205] displays welcome back when test has started --- app/controllers/application_controller.rb | 1 + app/controllers/candidate_controller.rb | 1 + app/views/candidate/welcome_back.html.erb | 16 ++++++++++++++++ test/controllers/candidate_controller_test.rb | 14 ++++++++++++++ 4 files changed, 32 insertions(+) create mode 100644 app/views/candidate/welcome_back.html.erb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index ed68e9d..4aed618 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -14,6 +14,7 @@ class ApplicationController < ActionController::Base def current_candidate @current_candidate ||= Candidate.find_by(test_hash: session[:test_id]) if session[:test_id] end + helper_method :current_candidate private diff --git a/app/controllers/candidate_controller.rb b/app/controllers/candidate_controller.rb index 6031fc4..f543d96 100644 --- a/app/controllers/candidate_controller.rb +++ b/app/controllers/candidate_controller.rb @@ -11,6 +11,7 @@ class CandidateController < ApplicationController end def welcome + render :welcome_back if current_candidate.answers.count > 0 end def saved diff --git a/app/views/candidate/welcome_back.html.erb b/app/views/candidate/welcome_back.html.erb new file mode 100644 index 0000000..0648c9a --- /dev/null +++ b/app/views/candidate/welcome_back.html.erb @@ -0,0 +1,16 @@ +<% content_for :title, "Skills Assessment" %> + +
+

Welcome Back

+ +

Hello <%= current_candidate.name %>

+ +

+ We are ready to pick up where you left off. +

+ +
+ <%= link_to "Return to Test", question_path, { class: "btn primary-btn" } %> +
+ +
diff --git a/test/controllers/candidate_controller_test.rb b/test/controllers/candidate_controller_test.rb index adba814..74006a6 100644 --- a/test/controllers/candidate_controller_test.rb +++ b/test/controllers/candidate_controller_test.rb @@ -44,6 +44,20 @@ class CandidateControllerTest < ActionDispatch::IntegrationTest refute flash[:error].present?, "Should not be displaying an error message" end + test "should display welcome view" do + setup_auth candidates(:martha) + get welcome_path + + assert_select '.prft-heading', "Welcome!" + end + + test "should display welcome back view" do + setup_auth candidates(:roy) + get welcome_path + + assert_select '.prft-heading', "Welcome Back" + end + test "should redirect to thankyou when completed" do setup_auth candidates(:richard) From f4abe5e2815a3747edd8361080892408c6700b7c Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Wed, 3 Aug 2016 08:55:30 -0500 Subject: [PATCH 064/205] simple question attachments --- README.md | 8 ++++++++ app/views/candidate/question.html.erb | 4 ++++ app/workers/candidate_quiz.rb | 6 +++--- app/workers/candidate_quiz_question.rb | 4 ++++ db/migrate/20160803003932_add_attachments_to_questions.rb | 5 +++++ db/schema.rb | 3 ++- test/fixtures/questions.yml | 3 ++- 7 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 db/migrate/20160803003932_add_attachments_to_questions.rb diff --git a/README.md b/README.md index 8de62f4..41f6171 100644 --- a/README.md +++ b/README.md @@ -25,3 +25,11 @@ This application manages quizzes intended to be used as pre-interview skill asse - starts up simple server for viewing/demo sans guard visit http://localhost:3000 + + +---- + +# Question creation + +* attachments: http://dev.perficientxd.com/skill_assets/ + diff --git a/app/views/candidate/question.html.erb b/app/views/candidate/question.html.erb index 3762b96..26e7054 100644 --- a/app/views/candidate/question.html.erb +++ b/app/views/candidate/question.html.erb @@ -9,6 +9,10 @@

<%= @question.question %>

+ <% if @question.attachment.present? %> + <%= image_tag @question.attachment %> + <% end %> +
<%= hidden_field_tag 'answer[question_id]', @question.question_id %> <%= hidden_field_tag 'answer[answer_id]', @question.answer_id %> diff --git a/app/workers/candidate_quiz.rb b/app/workers/candidate_quiz.rb index 4329ef0..6b7b738 100644 --- a/app/workers/candidate_quiz.rb +++ b/app/workers/candidate_quiz.rb @@ -1,8 +1,8 @@ class CandidateQuiz attr_reader :candidate_id - def initialize candidate_id - @candidate_id = candidate_id + def initialize candidate + @candidate_id = candidate.to_i end def fetch_question qid @@ -18,7 +18,7 @@ class CandidateQuiz def raw_quiz qid = nil question = qid.nil? ? "" : " and q.id = #{qid} " sql = "select c.id candidate_id, q.quiz_id, q.id question_id, a.id answer_id, q.sort - , q.question, q.category, q.input_type, q.input_options, a.answer + , q.question, q.attachment, q.category, q.input_type, q.input_options, a.answer , ifnull(a.saved, false) saved, ifnull(a.submitted, false) submitted , a.updated_at from candidates c inner join questions q on q.quiz_id = c.quiz_id diff --git a/app/workers/candidate_quiz_question.rb b/app/workers/candidate_quiz_question.rb index a1839db..70220e8 100644 --- a/app/workers/candidate_quiz_question.rb +++ b/app/workers/candidate_quiz_question.rb @@ -26,6 +26,10 @@ class CandidateQuizQuestion row["question"] end + def attachment + row['attachment'] + end + def category row["category"] end diff --git a/db/migrate/20160803003932_add_attachments_to_questions.rb b/db/migrate/20160803003932_add_attachments_to_questions.rb new file mode 100644 index 0000000..88333da --- /dev/null +++ b/db/migrate/20160803003932_add_attachments_to_questions.rb @@ -0,0 +1,5 @@ +class AddAttachmentsToQuestions < ActiveRecord::Migration[5.0] + def change + add_column :questions, :attachment, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index bc22151..61aa979 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20160727154057) do +ActiveRecord::Schema.define(version: 20160803003932) do create_table "answers", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| t.integer "candidate_id" @@ -51,6 +51,7 @@ ActiveRecord::Schema.define(version: 20160727154057) do t.boolean "active" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.string "attachment" t.index ["active"], name: "index_questions_on_active", using: :btree t.index ["quiz_id"], name: "index_questions_on_quiz_id", using: :btree t.index ["sort"], name: "index_questions_on_sort", using: :btree diff --git a/test/fixtures/questions.yml b/test/fixtures/questions.yml index de67303..027955f 100644 --- a/test/fixtures/questions.yml +++ b/test/fixtures/questions.yml @@ -47,7 +47,8 @@ fed5: fed6: quiz: fed - question: List one advantage of using IDs over classes. List one disadvantage. + question: Comment on how realistic the following image is. + attachment: "http://dev.perficientxd.com/skill_assets/commets_css.jpg" category: CSS input_type: text input_options: From 330126d6720a42649e3942b5f0d4410e3dc4b736 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Wed, 3 Aug 2016 10:46:03 -0500 Subject: [PATCH 065/205] fixes #30 - edit from summary with out js --- app/controllers/candidate_controller.rb | 6 ++--- app/views/candidate/question.html.erb | 2 +- app/views/candidate/summary.html.erb | 2 +- test/integration/question_flow_test.rb | 34 +++++++++++++++++++++++++ 4 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 test/integration/question_flow_test.rb diff --git a/app/controllers/candidate_controller.rb b/app/controllers/candidate_controller.rb index f543d96..59fd244 100644 --- a/app/controllers/candidate_controller.rb +++ b/app/controllers/candidate_controller.rb @@ -26,14 +26,14 @@ class CandidateController < ApplicationController end def question - qid = prep_status.current_question_id + qid = prep_status.current_question_id || params[:question_id] redirect_to :summary and return if qid.nil? prep_question qid prep_instance_answer @question end def update_answer - qid = params[:qid] ||= prep_status.current_question_id + qid = answer_params[:question_id] || prep_status.current_question_id @answer = prep_answer qid send "process_#{prep_question(qid).input_type}" end @@ -114,7 +114,7 @@ class CandidateController < ApplicationController render :question else # TODO: change params.key? to submit = save/next/summary - redirect_to :summary and return if params.key?(:update) + # redirect_to :summary and return if params.key?(:update) redirect_to :saved and return if params.key?(:save) redirect_to :question end diff --git a/app/views/candidate/question.html.erb b/app/views/candidate/question.html.erb index 26e7054..23fb9ba 100644 --- a/app/views/candidate/question.html.erb +++ b/app/views/candidate/question.html.erb @@ -22,7 +22,7 @@ <% if @status.on_summary %>
- +
<% else %> diff --git a/app/views/candidate/summary.html.erb b/app/views/candidate/summary.html.erb index c9e4874..208a2a0 100644 --- a/app/views/candidate/summary.html.erb +++ b/app/views/candidate/summary.html.erb @@ -6,7 +6,7 @@

<% @quiz.each do |question| %> - <%= form_for(:answer, url: post_answer_path(answer_id: question.answer_id, qid: question.question_id), html:{class: 'summary-form'}) do |form| %> + <%= form_for(:answer, url: post_answer_path(answer_id: question.answer_id), html:{class: 'summary-form'}) do |form| %>
diff --git a/test/integration/question_flow_test.rb b/test/integration/question_flow_test.rb new file mode 100644 index 0000000..048ea0b --- /dev/null +++ b/test/integration/question_flow_test.rb @@ -0,0 +1,34 @@ +require 'test_helper' + +class QuestionFlowTest < ActionDispatch::IntegrationTest + def setup_auth candidate + post validate_candidate_url, params: { test_id: candidate.test_hash } + end + + test "should load the first question" do + setup_auth candidates(:martha) + + get question_path + assert_response :success + assert_select '.question-text', questions(:fed1).question + end + + test "should load the summary" do + setup_auth candidates(:dawn) + + get summary_path + assert_response :success + assert_select '.prft-heading', 'Almost done!' + end + + test "can load specific question from summary" do + setup_auth candidates(:dawn) + question = questions(:fed4) + + get question_path(question.id) + assert_response :success + assert_select '.question-text', question.question + # TODO: add in capybara and test form post + # assert_redirected summary_path + end +end From 7e13ed59a868e917dcccce5f550b3c4ad2619af9 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Wed, 3 Aug 2016 15:22:54 -0500 Subject: [PATCH 066/205] added jquery to live-coder iframes --- .../javascripts/{live-coder.js => live-coder.js.erb} | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) rename app/assets/javascripts/{live-coder.js => live-coder.js.erb} (93%) diff --git a/app/assets/javascripts/live-coder.js b/app/assets/javascripts/live-coder.js.erb similarity index 93% rename from app/assets/javascripts/live-coder.js rename to app/assets/javascripts/live-coder.js.erb index 099766b..360b996 100644 --- a/app/assets/javascripts/live-coder.js +++ b/app/assets/javascripts/live-coder.js.erb @@ -14,19 +14,24 @@ function updateResults(elem) { codeFrame.setAttribute("height", "100%"); resultsContainer.appendChild(codeFrame); + var jqueryNode = document.createElement("script"); + jqueryNode.setAttribute("type", "text/javascript"); + jqueryNode.setAttribute("src", "<%= "//#{ENV['full_app_url']}#{javascript_path "jquery"}" %>"); + iHead.appendChild(jqueryNode); + var codeStyle = document.createElement("style"); codeStyle.setAttribute("type", "text/css"); var rulesNode = document.createTextNode(codeCss); codeStyle.appendChild(rulesNode); iHead.appendChild(codeStyle); - iDoc.appendChild(iHead); + iDoc.appendChild(iHead); iBody.innerHTML = codeHtml; iDoc.appendChild(iBody); var codeScript = document.createElement("script"); codeScript.setAttribute("type", "text/javascript"); - var scriptNode = document.createTextNode(codeJs); + var scriptNode = document.createTextNode("setTimeout(function(){ " + codeJs + "}, 800);"); codeScript.appendChild(scriptNode); iDoc.appendChild(codeScript); From 1680445c18f85e4c7c60fa9fd2a44fb33811fa7b Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Wed, 3 Aug 2016 16:45:00 -0500 Subject: [PATCH 067/205] fixed font paths --- app/assets/stylesheets/atoms/_fonts.scss | 103 ++++++++++++----------- 1 file changed, 52 insertions(+), 51 deletions(-) diff --git a/app/assets/stylesheets/atoms/_fonts.scss b/app/assets/stylesheets/atoms/_fonts.scss index 6066979..4d2b0c4 100644 --- a/app/assets/stylesheets/atoms/_fonts.scss +++ b/app/assets/stylesheets/atoms/_fonts.scss @@ -3,62 +3,63 @@ @font-face { font-family: 'HalisR'; src:local('Halis R Thin'), - font-path('HalisR-Thin.woff2') format('woff2'), - font-path('HalisR-Thin.woff') format('woff'), - font-path('HalisR-Thin.otf') format('opentype'); + font_url('HalisR-Thin.woff2') format('woff2'), + font_url('HalisR-Thin.woff') format('woff'), + font_url('HalisR-Thin.otf') format('opentype'); font-weight:100; } + @font-face { font-family: 'HalisR'; src:local('Halis R Light'), - font-path('HalisR-Light.woff2') format('woff2'), - font-path('HalisR-Light.woff') format('woff'), - font-path('HalisR-Light.otf') format('opentype'); + font_url('HalisR-Light.woff2') format('woff2'), + font_url('HalisR-Light.woff') format('woff'), + font_url('HalisR-Light.otf') format('opentype'); font-weight:200; } @font-face { font-family: 'HalisR'; src:local('Halis R Book'), - font-path('HalisR-Book.woff2') format('woff2'), - font-path('HalisR-Book.woff') format('woff'), - font-path('HalisR-Book.otf') format('opentype'); + font_url('HalisR-Book.woff2') format('woff2'), + font_url('HalisR-Book.woff') format('woff'), + font_url('HalisR-Book.otf') format('opentype'); font-weight:300; } @font-face { font-family: 'HalisR'; src:local('Halis R Regular'), - font-path('HalisR-Regular.woff2') format('woff2'), - font-path('HalisR-Regular.woff') format('woff'), - font-path('HalisR-Regular.otf') format('opentype'); + font_url('HalisR-Regular.woff2') format('woff2'), + font_url('HalisR-Regular.woff') format('woff'), + font_url('HalisR-Regular.otf') format('opentype'); font-weight:500; } @font-face { font-family: 'HalisR'; src:local('Halis R Medium'), - font-path('HalisR-Medium.woff2') format('woff2'), - font-path('HalisR-Medium.woff') format('woff'), - font-path('HalisR-Medium.otf') format('opentype'); + font_url('HalisR-Medium.woff2') format('woff2'), + font_url('HalisR-Medium.woff') format('woff'), + font_url('HalisR-Medium.otf') format('opentype'); font-weight:600; } @font-face { font-family: 'HalisR'; src:local('Halis R Bold'), - font-path('HalisR-Bold.woff2') format('woff2'), - font-path('HalisR-Bold.woff') format('woff'), - font-path('HalisR-Bold.otf') format('opentype'); + font_url('HalisR-Bold.woff2') format('woff2'), + font_url('HalisR-Bold.woff') format('woff'), + font_url('HalisR-Bold.otf') format('opentype'); font-weight:700; } @font-face { font-family: 'HalisR'; src:local('Halis R Black'), - font-path('HalisR-Black.woff2') format('woff2'), - font-path('HalisR-Black.woff') format('woff'), - font-path('HalisR-Black.otf') format('opentype'); + font_url('HalisR-Black.woff2') format('woff2'), + font_url('HalisR-Black.woff') format('woff'), + font_url('HalisR-Black.otf') format('opentype'); font-weight:900; } @@ -69,44 +70,44 @@ @font-face { font-family: 'Lato'; src:local('Lato Hairline'), - font-path('Lato-Hairline.woff2') format('woff2'), - font-path('Lato-Hairline.woff') format('woff'), - font-path('Lato-Hairline.ttf') format('truetype'); + font_url('Lato-Hairline.woff2') format('woff2'), + font_url('Lato-Hairline.woff') format('woff'), + font_url('Lato-Hairline.ttf') format('truetype'); font-weight:100; } @font-face { font-family: 'Lato'; src:local('Lato Light'), - font-path('Lato-Light.woff2') format('woff2'), - font-path('Lato-Light.woff') format('woff'), - font-path('Lato-Light.ttf') format('truetype'); + font_url('Lato-Light.woff2') format('woff2'), + font_url('Lato-Light.woff') format('woff'), + font_url('Lato-Light.ttf') format('truetype'); font-weight:300; } @font-face { font-family: 'Lato'; src:local('Lato Regular'), - font-path('Lato-Regular.woff2') format('woff2'), - font-path('Lato-Regular.woff') format('woff'), - font-path('Lato-Regular.ttf') format('truetype'); + font_url('Lato-Regular.woff2') format('woff2'), + font_url('Lato-Regular.woff') format('woff'), + font_url('Lato-Regular.ttf') format('truetype'); font-weight:500; } @font-face { font-family: 'Lato'; src:local('Lato Bold'), - font-path('Lato-Bold.woff2') format('woff2'), - font-path('Lato-Bold.woff') format('woff'), - font-path('Lato-Bold.ttf') format('truetype'); + font_url('Lato-Bold.woff2') format('woff2'), + font_url('Lato-Bold.woff') format('woff'), + font_url('Lato-Bold.ttf') format('truetype'); font-weight:700; } @font-face { font-family: 'Lato'; src:local('Lato Black'), - font-path('Lato-Black.woff2') format('woff2'), - font-path('Lato-Black.woff') format('woff'), - font-path('Lato-Black.ttf') format('truetype'); + font_url('Lato-Black.woff2') format('woff2'), + font_url('Lato-Black.woff') format('woff'), + font_url('Lato-Black.ttf') format('truetype'); font-weight:900; } @@ -115,18 +116,18 @@ @font-face { font-family: 'Lato'; src:local('Lato Hairline Italic'), - font-path('Lato-HairlineItalic.woff2') format('woff2'), - font-path('Lato-HairlineItalic.woff') format('woff'), - font-path('Lato-HairlineItalic.ttf') format('truetype'); + font_url('Lato-HairlineItalic.woff2') format('woff2'), + font_url('Lato-HairlineItalic.woff') format('woff'), + font_url('Lato-HairlineItalic.ttf') format('truetype'); font-weight:100; font-style: italic; } @font-face { font-family: 'Lato'; src:local('Lato Light Italic'), - font-path('Lato-LightItalic.woff2') format('woff2'), - font-path('Lato-LightItalic.woff') format('woff'), - font-path('Lato-LightItalic.ttf') format('truetype'); + font_url('Lato-LightItalic.woff2') format('woff2'), + font_url('Lato-LightItalic.woff') format('woff'), + font_url('Lato-LightItalic.ttf') format('truetype'); font-weight:300; font-style: italic; } @@ -134,9 +135,9 @@ @font-face { font-family: 'Lato'; src:local('Lato Italic'), - font-path('Lato-Italic.woff2') format('woff2'), - font-path('Lato-Italic.woff') format('woff'), - font-path('Lato-Italic.ttf') format('truetype'); + font_url('Lato-Italic.woff2') format('woff2'), + font_url('Lato-Italic.woff') format('woff'), + font_url('Lato-Italic.ttf') format('truetype'); font-weight:500; font-style: italic; } @@ -144,9 +145,9 @@ @font-face { font-family: 'Lato'; src:local('Lato Bold Italic'), - font-path('Lato-BoldItalic.woff2') format('woff2'), - font-path('Lato-BoldItalic.woff') format('woff'), - font-path('Lato-BoldItalic.ttf') format('truetype'); + font_url('Lato-BoldItalic.woff2') format('woff2'), + font_url('Lato-BoldItalic.woff') format('woff'), + font_url('Lato-BoldItalic.ttf') format('truetype'); font-weight:700; font-style: italic; } @@ -154,9 +155,9 @@ @font-face { font-family: 'Lato'; src:local('Lato Black Italic'), - font-path('Lato-BlackItalic.woff2') format('woff2'), - font-path('Lato-BlackItalic.woff') format('woff'), - font-path('Lato-BlackItalic.ttf') format('truetype'); + font_url('Lato-BlackItalic.woff2') format('woff2'), + font_url('Lato-BlackItalic.woff') format('woff'), + font_url('Lato-BlackItalic.ttf') format('truetype'); font-weight:900; font-style: italic; } From b3be05f4579baa302c3fd84c26d821454daed18e Mon Sep 17 00:00:00 2001 From: Jennifer Siegfried Date: Thu, 4 Aug 2016 07:50:12 -0600 Subject: [PATCH 068/205] Adjusts progress bar color --- app/assets/stylesheets/molecules/_progressbar.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/molecules/_progressbar.scss b/app/assets/stylesheets/molecules/_progressbar.scss index 2e5f831..d4e9eff 100644 --- a/app/assets/stylesheets/molecules/_progressbar.scss +++ b/app/assets/stylesheets/molecules/_progressbar.scss @@ -7,11 +7,11 @@ } .progress-bar { - background-color: $primary-color; + // background-color: $primary-color; + background-color: #39bd9a; color:white; text-align: right; line-height: 8vw; - // padding: 0 5px; font-weight: 900; min-width: 50px; position: relative; From 0562c1ffa24d1ae353192bc305194270937b62ba Mon Sep 17 00:00:00 2001 From: Jennifer Siegfried Date: Thu, 4 Aug 2016 07:50:31 -0600 Subject: [PATCH 069/205] Adjusts googly-eye radio buttons --- app/assets/stylesheets/molecules/_forms.scss | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/app/assets/stylesheets/molecules/_forms.scss b/app/assets/stylesheets/molecules/_forms.scss index ada651f..3409745 100644 --- a/app/assets/stylesheets/molecules/_forms.scss +++ b/app/assets/stylesheets/molecules/_forms.scss @@ -140,8 +140,10 @@ textarea { &:before { content: ''; position: absolute; - left:0; top: 2px; - width: 20px; height: 20px; + left:0; + top: 2px; + width: 20px; + height: 20px; box-shadow: 0; border: 1px solid $primary-color; background: transparent; @@ -156,10 +158,14 @@ textarea { &:checked { + label { &:after { - content: '\2022'; - font-size: 28px; - top: 1px; - left: 2px; + content: ''; + position: absolute; + width: 8px; + height: 8px; + top: 8px; + left: 6px; + background-color: $primary-color; + border-radius: 100%; } } } From 7f72e6eabdb005d2bd3b109496bf657706b7505c Mon Sep 17 00:00:00 2001 From: Jennifer Siegfried Date: Thu, 4 Aug 2016 07:50:48 -0600 Subject: [PATCH 070/205] Modifies button style, per Creative --- app/assets/stylesheets/molecules/_buttons.scss | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/molecules/_buttons.scss b/app/assets/stylesheets/molecules/_buttons.scss index 728e248..91b4daa 100644 --- a/app/assets/stylesheets/molecules/_buttons.scss +++ b/app/assets/stylesheets/molecules/_buttons.scss @@ -35,11 +35,15 @@ opacity: 0.3; } } -.secondary-btn { +.secondary-btn, +input[type="submit"].secondary-btn, +button.secondary-btn { background-color: $secondary-color; } -.tertiary-btn { +.tertiary-btn, +input[type="submit"].tertiary-btn, +button.tertiary-btn { background-color: transparent; color: $primary-color; border: 1px solid $primary-color; From f83add726b91cdf0d46707a23e3e4e06d2a51af0 Mon Sep 17 00:00:00 2001 From: Jennifer Siegfried Date: Thu, 4 Aug 2016 07:51:54 -0600 Subject: [PATCH 071/205] Adjusts language --- app/controllers/recruiter_controller.rb | 4 ++-- app/controllers/review_controller.rb | 2 +- app/helpers/application_helper.rb | 2 +- app/views/candidate/login.html.erb | 4 ++-- app/views/candidate/question.html.erb | 4 ++-- app/views/candidate/welcome_back.html.erb | 2 +- app/views/candidate_mailer/welcome.html.erb | 19 +++++++++++++------ app/views/candidate_mailer/welcome.text.erb | 8 ++++---- app/views/recruiter/login.html.erb | 2 +- 9 files changed, 27 insertions(+), 20 deletions(-) diff --git a/app/controllers/recruiter_controller.rb b/app/controllers/recruiter_controller.rb index 3d6ae2c..e263c80 100644 --- a/app/controllers/recruiter_controller.rb +++ b/app/controllers/recruiter_controller.rb @@ -18,7 +18,7 @@ class RecruiterController < ApplicationController RecruiterMailer.candidate_created(@candidate).deliver_now redirect_to recruiter_path, flash: { notice: "Sucessfully created candidate #{@candidate.name}" } else - flash[:error] = "Failed to save Candidate." + flash[:error] = "Failed to save candidate." render :form end end @@ -34,7 +34,7 @@ class RecruiterController < ApplicationController session[:user] = recruiter.to_i redirect_to recruiter_path else - redirect_to recruiter_login_path, flash: { error: "Sorry, incorrect email or password." } + redirect_to recruiter_login_path, flash: { error: "Sorry, incorrect email or password. Please try again." } end end diff --git a/app/controllers/review_controller.rb b/app/controllers/review_controller.rb index 91ae07d..1077fbe 100644 --- a/app/controllers/review_controller.rb +++ b/app/controllers/review_controller.rb @@ -22,7 +22,7 @@ class ReviewController < ApplicationController session[:user] = reviewer.to_i redirect_to review_path else - redirect_to review_login_path, flash: { error: "Sorry, incorrect email or password." } + redirect_to review_login_path, flash: { error: "Sorry, incorrect email or password. Please try again." } end end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 4c7737c..feaaee8 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,7 +1,7 @@ module ApplicationHelper def experience_options val options_for_select([ - ["Please Select", ""], + ["Please select", ""], ["0-3 Years", "0-3"], ["4-6 Years", "4-6"], ["7-9 Years", "7-9"], diff --git a/app/views/candidate/login.html.erb b/app/views/candidate/login.html.erb index 35ee06d..248a4fa 100644 --- a/app/views/candidate/login.html.erb +++ b/app/views/candidate/login.html.erb @@ -3,7 +3,7 @@

Let's Get Started

- Hey there! Give us your test id, and we'll get you started. + Hey there! Give us your Test ID, and we'll get you started.

<%= form_tag(validate_candidate_path) do %> @@ -15,6 +15,6 @@
<%= flash[:error] %>
<% end %>
- + <% end %>
diff --git a/app/views/candidate/question.html.erb b/app/views/candidate/question.html.erb index 23fb9ba..e8beaa4 100644 --- a/app/views/candidate/question.html.erb +++ b/app/views/candidate/question.html.erb @@ -28,10 +28,10 @@ <% else %>
- +
- +
<% end %> diff --git a/app/views/candidate/welcome_back.html.erb b/app/views/candidate/welcome_back.html.erb index 0648c9a..c813b48 100644 --- a/app/views/candidate/welcome_back.html.erb +++ b/app/views/candidate/welcome_back.html.erb @@ -3,7 +3,7 @@

Welcome Back

-

Hello <%= current_candidate.name %>

+

Hello, <%= current_candidate.name %>!

We are ready to pick up where you left off. diff --git a/app/views/candidate_mailer/welcome.html.erb b/app/views/candidate_mailer/welcome.html.erb index e458d56..87ccfae 100644 --- a/app/views/candidate_mailer/welcome.html.erb +++ b/app/views/candidate_mailer/welcome.html.erb @@ -9,19 +9,26 @@ -

Your Candidate ID is <%= @candidate.test_hash %>

+

+ Please visit <%= link_to nil, login_url(@candidate.test_hash) %> to begin your test. +

+ -

+ +

+ Or, visit <%= root_url %> and enter your Test ID to begin your test. + Your Test ID is: <%= @candidate.test_hash %>. +

+ +

Once we have evaluated your answers, your recruiter will be in touch. Good luck!
diff --git a/app/views/candidate_mailer/welcome.text.erb b/app/views/candidate_mailer/welcome.text.erb index 5e1fe81..e7279fd 100644 --- a/app/views/candidate_mailer/welcome.text.erb +++ b/app/views/candidate_mailer/welcome.text.erb @@ -1,9 +1,9 @@ PERFICIENT DIGITAL - Skills Assessment Test -Please visit <%= login_url(@candidate.test_hash) %> to get started. +Please visit <%= login_url(@candidate.test_hash) %> to begin your test. -Or, visit <%= root_url %> and enter your Candidate ID to being your test. -Your Candidate ID is: <%= @candidate.test_hash %> +Or, visit <%= root_url %> and enter your Test ID to begin your test. +Your Test ID is: <%= @candidate.test_hash %> -We will reach back to you once we have evaluated your answers. +Once we have evaluated your answers, your recruiter will be in touch. Good luck! diff --git a/app/views/recruiter/login.html.erb b/app/views/recruiter/login.html.erb index abfa894..9d4098d 100644 --- a/app/views/recruiter/login.html.erb +++ b/app/views/recruiter/login.html.erb @@ -16,6 +16,6 @@ <%= form.password_field :password %> - <%= submit_tag "Login" %> + <%= submit_tag "Log in" %> <% end %>
From 2cc1c0dfffbb61353d64ca3bfe42408be0235577 Mon Sep 17 00:00:00 2001 From: Jennifer Siegfried Date: Thu, 4 Aug 2016 07:52:04 -0600 Subject: [PATCH 072/205] Adjusts text in form labels --- app/views/recruiter/form.html.erb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/views/recruiter/form.html.erb b/app/views/recruiter/form.html.erb index 24d9b48..343cc53 100644 --- a/app/views/recruiter/form.html.erb +++ b/app/views/recruiter/form.html.erb @@ -14,21 +14,21 @@ <%= form_for @candidate, url: create_candidate_path do |form| %>
- <%= form.label :name %> + <%= form.label :name, "Candidate name" %> <%= form.text_field :name %>
- <%= form.label :email %> + <%= form.label :email, "Candidate email" %> <%= form.email_field :email %>
- <%= form.label :experience %> + <%= form.label :experience, "Years of experience" %> <%= form.select :experience, experience_options(@candidate.experience), include_blank: false %>
<%= form.hidden_field :quiz_id, { value: Quiz.first.to_i } %> - <%= submit_tag "Save" %> + <%= submit_tag "Create" %> <% end %>
From cff2985c015cbd8896618d8ee6927e1e1e564ea3 Mon Sep 17 00:00:00 2001 From: Jennifer Siegfried Date: Thu, 4 Aug 2016 07:52:24 -0600 Subject: [PATCH 073/205] Misc styling --- app/assets/stylesheets/atoms/_fonts.scss | 102 +++++++++--------- app/assets/stylesheets/atoms/_typography.scss | 10 +- 2 files changed, 58 insertions(+), 54 deletions(-) diff --git a/app/assets/stylesheets/atoms/_fonts.scss b/app/assets/stylesheets/atoms/_fonts.scss index 6066979..7bcd189 100644 --- a/app/assets/stylesheets/atoms/_fonts.scss +++ b/app/assets/stylesheets/atoms/_fonts.scss @@ -3,62 +3,62 @@ @font-face { font-family: 'HalisR'; src:local('Halis R Thin'), - font-path('HalisR-Thin.woff2') format('woff2'), - font-path('HalisR-Thin.woff') format('woff'), - font-path('HalisR-Thin.otf') format('opentype'); + font-url('HalisR-Thin.woff2') format('woff2'), + font-url('HalisR-Thin.woff') format('woff'), + font-url('HalisR-Thin.otf') format('opentype'); font-weight:100; } @font-face { font-family: 'HalisR'; src:local('Halis R Light'), - font-path('HalisR-Light.woff2') format('woff2'), - font-path('HalisR-Light.woff') format('woff'), - font-path('HalisR-Light.otf') format('opentype'); + font-url('HalisR-Light.woff2') format('woff2'), + font-url('HalisR-Light.woff') format('woff'), + font-url('HalisR-Light.otf') format('opentype'); font-weight:200; } @font-face { font-family: 'HalisR'; src:local('Halis R Book'), - font-path('HalisR-Book.woff2') format('woff2'), - font-path('HalisR-Book.woff') format('woff'), - font-path('HalisR-Book.otf') format('opentype'); + font-url('HalisR-Book.woff2') format('woff2'), + font-url('HalisR-Book.woff') format('woff'), + font-url('HalisR-Book.otf') format('opentype'); font-weight:300; } @font-face { font-family: 'HalisR'; src:local('Halis R Regular'), - font-path('HalisR-Regular.woff2') format('woff2'), - font-path('HalisR-Regular.woff') format('woff'), - font-path('HalisR-Regular.otf') format('opentype'); + font-url('HalisR-Regular.woff2') format('woff2'), + font-url('HalisR-Regular.woff') format('woff'), + font-url('HalisR-Regular.otf') format('opentype'); font-weight:500; } @font-face { font-family: 'HalisR'; src:local('Halis R Medium'), - font-path('HalisR-Medium.woff2') format('woff2'), - font-path('HalisR-Medium.woff') format('woff'), - font-path('HalisR-Medium.otf') format('opentype'); + font-url('HalisR-Medium.woff2') format('woff2'), + font-url('HalisR-Medium.woff') format('woff'), + font-url('HalisR-Medium.otf') format('opentype'); font-weight:600; } @font-face { font-family: 'HalisR'; src:local('Halis R Bold'), - font-path('HalisR-Bold.woff2') format('woff2'), - font-path('HalisR-Bold.woff') format('woff'), - font-path('HalisR-Bold.otf') format('opentype'); + font-url('HalisR-Bold.woff2') format('woff2'), + font-url('HalisR-Bold.woff') format('woff'), + font-url('HalisR-Bold.otf') format('opentype'); font-weight:700; } @font-face { font-family: 'HalisR'; src:local('Halis R Black'), - font-path('HalisR-Black.woff2') format('woff2'), - font-path('HalisR-Black.woff') format('woff'), - font-path('HalisR-Black.otf') format('opentype'); + font-url('HalisR-Black.woff2') format('woff2'), + font-url('HalisR-Black.woff') format('woff'), + font-url('HalisR-Black.otf') format('opentype'); font-weight:900; } @@ -69,44 +69,44 @@ @font-face { font-family: 'Lato'; src:local('Lato Hairline'), - font-path('Lato-Hairline.woff2') format('woff2'), - font-path('Lato-Hairline.woff') format('woff'), - font-path('Lato-Hairline.ttf') format('truetype'); + font-url('Lato-Hairline.woff2') format('woff2'), + font-url('Lato-Hairline.woff') format('woff'), + font-url('Lato-Hairline.ttf') format('truetype'); font-weight:100; } @font-face { font-family: 'Lato'; src:local('Lato Light'), - font-path('Lato-Light.woff2') format('woff2'), - font-path('Lato-Light.woff') format('woff'), - font-path('Lato-Light.ttf') format('truetype'); + font-url('Lato-Light.woff2') format('woff2'), + font-url('Lato-Light.woff') format('woff'), + font-url('Lato-Light.ttf') format('truetype'); font-weight:300; } @font-face { font-family: 'Lato'; src:local('Lato Regular'), - font-path('Lato-Regular.woff2') format('woff2'), - font-path('Lato-Regular.woff') format('woff'), - font-path('Lato-Regular.ttf') format('truetype'); + font-url('Lato-Regular.woff2') format('woff2'), + font-url('Lato-Regular.woff') format('woff'), + font-url('Lato-Regular.ttf') format('truetype'); font-weight:500; } @font-face { font-family: 'Lato'; src:local('Lato Bold'), - font-path('Lato-Bold.woff2') format('woff2'), - font-path('Lato-Bold.woff') format('woff'), - font-path('Lato-Bold.ttf') format('truetype'); + font-url('Lato-Bold.woff2') format('woff2'), + font-url('Lato-Bold.woff') format('woff'), + font-url('Lato-Bold.ttf') format('truetype'); font-weight:700; } @font-face { font-family: 'Lato'; src:local('Lato Black'), - font-path('Lato-Black.woff2') format('woff2'), - font-path('Lato-Black.woff') format('woff'), - font-path('Lato-Black.ttf') format('truetype'); + font-url('Lato-Black.woff2') format('woff2'), + font-url('Lato-Black.woff') format('woff'), + font-url('Lato-Black.ttf') format('truetype'); font-weight:900; } @@ -115,18 +115,18 @@ @font-face { font-family: 'Lato'; src:local('Lato Hairline Italic'), - font-path('Lato-HairlineItalic.woff2') format('woff2'), - font-path('Lato-HairlineItalic.woff') format('woff'), - font-path('Lato-HairlineItalic.ttf') format('truetype'); + font-url('Lato-HairlineItalic.woff2') format('woff2'), + font-url('Lato-HairlineItalic.woff') format('woff'), + font-url('Lato-HairlineItalic.ttf') format('truetype'); font-weight:100; font-style: italic; } @font-face { font-family: 'Lato'; src:local('Lato Light Italic'), - font-path('Lato-LightItalic.woff2') format('woff2'), - font-path('Lato-LightItalic.woff') format('woff'), - font-path('Lato-LightItalic.ttf') format('truetype'); + font-url('Lato-LightItalic.woff2') format('woff2'), + font-url('Lato-LightItalic.woff') format('woff'), + font-url('Lato-LightItalic.ttf') format('truetype'); font-weight:300; font-style: italic; } @@ -134,9 +134,9 @@ @font-face { font-family: 'Lato'; src:local('Lato Italic'), - font-path('Lato-Italic.woff2') format('woff2'), - font-path('Lato-Italic.woff') format('woff'), - font-path('Lato-Italic.ttf') format('truetype'); + font-url('Lato-Italic.woff2') format('woff2'), + font-url('Lato-Italic.woff') format('woff'), + font-url('Lato-Italic.ttf') format('truetype'); font-weight:500; font-style: italic; } @@ -144,9 +144,9 @@ @font-face { font-family: 'Lato'; src:local('Lato Bold Italic'), - font-path('Lato-BoldItalic.woff2') format('woff2'), - font-path('Lato-BoldItalic.woff') format('woff'), - font-path('Lato-BoldItalic.ttf') format('truetype'); + font-url('Lato-BoldItalic.woff2') format('woff2'), + font-url('Lato-BoldItalic.woff') format('woff'), + font-url('Lato-BoldItalic.ttf') format('truetype'); font-weight:700; font-style: italic; } @@ -154,9 +154,9 @@ @font-face { font-family: 'Lato'; src:local('Lato Black Italic'), - font-path('Lato-BlackItalic.woff2') format('woff2'), - font-path('Lato-BlackItalic.woff') format('woff'), - font-path('Lato-BlackItalic.ttf') format('truetype'); + font-url('Lato-BlackItalic.woff2') format('woff2'), + font-url('Lato-BlackItalic.woff') format('woff'), + font-url('Lato-BlackItalic.ttf') format('truetype'); font-weight:900; font-style: italic; } diff --git a/app/assets/stylesheets/atoms/_typography.scss b/app/assets/stylesheets/atoms/_typography.scss index 2b754c9..5b06f15 100644 --- a/app/assets/stylesheets/atoms/_typography.scss +++ b/app/assets/stylesheets/atoms/_typography.scss @@ -48,7 +48,8 @@ hr { margin: $base-spacing 0; } -.prft-heading { +// .prft-heading +h1 { text-transform: none; } @@ -56,9 +57,11 @@ hr { margin-bottom: 1.5rem; } -.prft-heading, +// .prft-heading, +h1, .question-text { font-size: 6vw; + font-weight: 100; } h1 > a { @@ -67,7 +70,8 @@ h1 > a { } @media screen and (min-width: $screen-sm) { - .prft-heading, + // .prft-heading, + h1, .question-text { font-size: 2.45rem; } From 2f75164bcd6ebbfd905b0ca71174049860f41a36 Mon Sep 17 00:00:00 2001 From: Jennifer Siegfried Date: Thu, 4 Aug 2016 07:54:38 -0600 Subject: [PATCH 074/205] Merge --- .../{live-coder.js => live-coder.js.erb} | 9 +- app/assets/stylesheets/atoms/_fonts.scss | 103 +++++++++--------- 2 files changed, 59 insertions(+), 53 deletions(-) rename app/assets/javascripts/{live-coder.js => live-coder.js.erb} (93%) diff --git a/app/assets/javascripts/live-coder.js b/app/assets/javascripts/live-coder.js.erb similarity index 93% rename from app/assets/javascripts/live-coder.js rename to app/assets/javascripts/live-coder.js.erb index 099766b..360b996 100644 --- a/app/assets/javascripts/live-coder.js +++ b/app/assets/javascripts/live-coder.js.erb @@ -14,19 +14,24 @@ function updateResults(elem) { codeFrame.setAttribute("height", "100%"); resultsContainer.appendChild(codeFrame); + var jqueryNode = document.createElement("script"); + jqueryNode.setAttribute("type", "text/javascript"); + jqueryNode.setAttribute("src", "<%= "//#{ENV['full_app_url']}#{javascript_path "jquery"}" %>"); + iHead.appendChild(jqueryNode); + var codeStyle = document.createElement("style"); codeStyle.setAttribute("type", "text/css"); var rulesNode = document.createTextNode(codeCss); codeStyle.appendChild(rulesNode); iHead.appendChild(codeStyle); - iDoc.appendChild(iHead); + iDoc.appendChild(iHead); iBody.innerHTML = codeHtml; iDoc.appendChild(iBody); var codeScript = document.createElement("script"); codeScript.setAttribute("type", "text/javascript"); - var scriptNode = document.createTextNode(codeJs); + var scriptNode = document.createTextNode("setTimeout(function(){ " + codeJs + "}, 800);"); codeScript.appendChild(scriptNode); iDoc.appendChild(codeScript); diff --git a/app/assets/stylesheets/atoms/_fonts.scss b/app/assets/stylesheets/atoms/_fonts.scss index 7bcd189..4d2b0c4 100644 --- a/app/assets/stylesheets/atoms/_fonts.scss +++ b/app/assets/stylesheets/atoms/_fonts.scss @@ -3,62 +3,63 @@ @font-face { font-family: 'HalisR'; src:local('Halis R Thin'), - font-url('HalisR-Thin.woff2') format('woff2'), - font-url('HalisR-Thin.woff') format('woff'), - font-url('HalisR-Thin.otf') format('opentype'); + font_url('HalisR-Thin.woff2') format('woff2'), + font_url('HalisR-Thin.woff') format('woff'), + font_url('HalisR-Thin.otf') format('opentype'); font-weight:100; } + @font-face { font-family: 'HalisR'; src:local('Halis R Light'), - font-url('HalisR-Light.woff2') format('woff2'), - font-url('HalisR-Light.woff') format('woff'), - font-url('HalisR-Light.otf') format('opentype'); + font_url('HalisR-Light.woff2') format('woff2'), + font_url('HalisR-Light.woff') format('woff'), + font_url('HalisR-Light.otf') format('opentype'); font-weight:200; } @font-face { font-family: 'HalisR'; src:local('Halis R Book'), - font-url('HalisR-Book.woff2') format('woff2'), - font-url('HalisR-Book.woff') format('woff'), - font-url('HalisR-Book.otf') format('opentype'); + font_url('HalisR-Book.woff2') format('woff2'), + font_url('HalisR-Book.woff') format('woff'), + font_url('HalisR-Book.otf') format('opentype'); font-weight:300; } @font-face { font-family: 'HalisR'; src:local('Halis R Regular'), - font-url('HalisR-Regular.woff2') format('woff2'), - font-url('HalisR-Regular.woff') format('woff'), - font-url('HalisR-Regular.otf') format('opentype'); + font_url('HalisR-Regular.woff2') format('woff2'), + font_url('HalisR-Regular.woff') format('woff'), + font_url('HalisR-Regular.otf') format('opentype'); font-weight:500; } @font-face { font-family: 'HalisR'; src:local('Halis R Medium'), - font-url('HalisR-Medium.woff2') format('woff2'), - font-url('HalisR-Medium.woff') format('woff'), - font-url('HalisR-Medium.otf') format('opentype'); + font_url('HalisR-Medium.woff2') format('woff2'), + font_url('HalisR-Medium.woff') format('woff'), + font_url('HalisR-Medium.otf') format('opentype'); font-weight:600; } @font-face { font-family: 'HalisR'; src:local('Halis R Bold'), - font-url('HalisR-Bold.woff2') format('woff2'), - font-url('HalisR-Bold.woff') format('woff'), - font-url('HalisR-Bold.otf') format('opentype'); + font_url('HalisR-Bold.woff2') format('woff2'), + font_url('HalisR-Bold.woff') format('woff'), + font_url('HalisR-Bold.otf') format('opentype'); font-weight:700; } @font-face { font-family: 'HalisR'; src:local('Halis R Black'), - font-url('HalisR-Black.woff2') format('woff2'), - font-url('HalisR-Black.woff') format('woff'), - font-url('HalisR-Black.otf') format('opentype'); + font_url('HalisR-Black.woff2') format('woff2'), + font_url('HalisR-Black.woff') format('woff'), + font_url('HalisR-Black.otf') format('opentype'); font-weight:900; } @@ -69,44 +70,44 @@ @font-face { font-family: 'Lato'; src:local('Lato Hairline'), - font-url('Lato-Hairline.woff2') format('woff2'), - font-url('Lato-Hairline.woff') format('woff'), - font-url('Lato-Hairline.ttf') format('truetype'); + font_url('Lato-Hairline.woff2') format('woff2'), + font_url('Lato-Hairline.woff') format('woff'), + font_url('Lato-Hairline.ttf') format('truetype'); font-weight:100; } @font-face { font-family: 'Lato'; src:local('Lato Light'), - font-url('Lato-Light.woff2') format('woff2'), - font-url('Lato-Light.woff') format('woff'), - font-url('Lato-Light.ttf') format('truetype'); + font_url('Lato-Light.woff2') format('woff2'), + font_url('Lato-Light.woff') format('woff'), + font_url('Lato-Light.ttf') format('truetype'); font-weight:300; } @font-face { font-family: 'Lato'; src:local('Lato Regular'), - font-url('Lato-Regular.woff2') format('woff2'), - font-url('Lato-Regular.woff') format('woff'), - font-url('Lato-Regular.ttf') format('truetype'); + font_url('Lato-Regular.woff2') format('woff2'), + font_url('Lato-Regular.woff') format('woff'), + font_url('Lato-Regular.ttf') format('truetype'); font-weight:500; } @font-face { font-family: 'Lato'; src:local('Lato Bold'), - font-url('Lato-Bold.woff2') format('woff2'), - font-url('Lato-Bold.woff') format('woff'), - font-url('Lato-Bold.ttf') format('truetype'); + font_url('Lato-Bold.woff2') format('woff2'), + font_url('Lato-Bold.woff') format('woff'), + font_url('Lato-Bold.ttf') format('truetype'); font-weight:700; } @font-face { font-family: 'Lato'; src:local('Lato Black'), - font-url('Lato-Black.woff2') format('woff2'), - font-url('Lato-Black.woff') format('woff'), - font-url('Lato-Black.ttf') format('truetype'); + font_url('Lato-Black.woff2') format('woff2'), + font_url('Lato-Black.woff') format('woff'), + font_url('Lato-Black.ttf') format('truetype'); font-weight:900; } @@ -115,18 +116,18 @@ @font-face { font-family: 'Lato'; src:local('Lato Hairline Italic'), - font-url('Lato-HairlineItalic.woff2') format('woff2'), - font-url('Lato-HairlineItalic.woff') format('woff'), - font-url('Lato-HairlineItalic.ttf') format('truetype'); + font_url('Lato-HairlineItalic.woff2') format('woff2'), + font_url('Lato-HairlineItalic.woff') format('woff'), + font_url('Lato-HairlineItalic.ttf') format('truetype'); font-weight:100; font-style: italic; } @font-face { font-family: 'Lato'; src:local('Lato Light Italic'), - font-url('Lato-LightItalic.woff2') format('woff2'), - font-url('Lato-LightItalic.woff') format('woff'), - font-url('Lato-LightItalic.ttf') format('truetype'); + font_url('Lato-LightItalic.woff2') format('woff2'), + font_url('Lato-LightItalic.woff') format('woff'), + font_url('Lato-LightItalic.ttf') format('truetype'); font-weight:300; font-style: italic; } @@ -134,9 +135,9 @@ @font-face { font-family: 'Lato'; src:local('Lato Italic'), - font-url('Lato-Italic.woff2') format('woff2'), - font-url('Lato-Italic.woff') format('woff'), - font-url('Lato-Italic.ttf') format('truetype'); + font_url('Lato-Italic.woff2') format('woff2'), + font_url('Lato-Italic.woff') format('woff'), + font_url('Lato-Italic.ttf') format('truetype'); font-weight:500; font-style: italic; } @@ -144,9 +145,9 @@ @font-face { font-family: 'Lato'; src:local('Lato Bold Italic'), - font-url('Lato-BoldItalic.woff2') format('woff2'), - font-url('Lato-BoldItalic.woff') format('woff'), - font-url('Lato-BoldItalic.ttf') format('truetype'); + font_url('Lato-BoldItalic.woff2') format('woff2'), + font_url('Lato-BoldItalic.woff') format('woff'), + font_url('Lato-BoldItalic.ttf') format('truetype'); font-weight:700; font-style: italic; } @@ -154,9 +155,9 @@ @font-face { font-family: 'Lato'; src:local('Lato Black Italic'), - font-url('Lato-BlackItalic.woff2') format('woff2'), - font-url('Lato-BlackItalic.woff') format('woff'), - font-url('Lato-BlackItalic.ttf') format('truetype'); + font_url('Lato-BlackItalic.woff2') format('woff2'), + font_url('Lato-BlackItalic.woff') format('woff'), + font_url('Lato-BlackItalic.ttf') format('truetype'); font-weight:900; font-style: italic; } From f8f471fba3d664cb345354a3306d8e3868dabdcb Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Thu, 4 Aug 2016 09:38:27 -0500 Subject: [PATCH 075/205] fade away resolved error messages on questions --- app/assets/javascripts/form-animation.js | 26 ++++++++++++++----- app/assets/stylesheets/application.scss | 5 +++- app/assets/stylesheets/core/_animations.scss | 5 ++++ .../stylesheets/{atoms => core}/_fonts.scss | 0 app/assets/stylesheets/molecules/_forms.scss | 7 +++++ .../stylesheets/templates/_summary.scss | 6 ----- 6 files changed, 35 insertions(+), 14 deletions(-) create mode 100644 app/assets/stylesheets/core/_animations.scss rename app/assets/stylesheets/{atoms => core}/_fonts.scss (100%) diff --git a/app/assets/javascripts/form-animation.js b/app/assets/javascripts/form-animation.js index 8601b37..ad71014 100644 --- a/app/assets/javascripts/form-animation.js +++ b/app/assets/javascripts/form-animation.js @@ -1,17 +1,29 @@ +var $textInput = $('[type="color"], [type="date"], [type="datetime"], [type="datetime-local"], [type="email"], [type="month"], [type="number"], [type="password"], [type="search"], [type="tel"], [type="text"], [type="time"], [type="url"], [type="week"], input:not([type]), textarea'); + // Text Input Label Animation - -var textInput = $('[type="color"], [type="date"], [type="datetime"], [type="datetime-local"], [type="email"], [type="month"], [type="number"], [type="password"], [type="search"], [type="tel"], [type="text"], [type="time"], [type="url"], [type="week"], input:not([type]), textarea'); - -textInput.prev('label').addClass('loaded'); -$(textInput).each(function() { +$textInput.prev('label').addClass('loaded'); +$textInput.each(function() { if( $(this).val() ) { $(this).prev('label').addClass('animate'); } }); -$(textInput).on('focus', function() { +$textInput.on('focus', function() { $(this).prev('label').addClass('animate'); }).on('focusout', function() { if( !$(this).val() ) { $(this).prev('label').removeClass('animate'); } -}); \ No newline at end of file +}); + +// form error resolutions +$('form').has('.error').each(function(){ + var $form = $(this); + + $form.on('keyup', $textInput, function(){ + $form.find(".error").addClass('resolve-error'); + }); + + $form.on('change', $("[type=radio], [type=checkbox]"), function(){ + $form.find(".error").addClass('resolve-error'); + }); +}); diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 4928999..9dd519e 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -16,7 +16,10 @@ @import 'base'; // bitters @import 'neat'; -@import 'core/**/*'; +@import 'core/fonts'; +@import 'core/variables'; +@import 'core/animations'; + @import 'atoms/**/*'; @import 'molecules/**/*'; // @import 'organisms/**/*'; diff --git a/app/assets/stylesheets/core/_animations.scss b/app/assets/stylesheets/core/_animations.scss new file mode 100644 index 0000000..8ac0eaa --- /dev/null +++ b/app/assets/stylesheets/core/_animations.scss @@ -0,0 +1,5 @@ +@keyframes success-fadeout { + 0% { opacity: 1; max-height: 40px; } + 85% { opacity: 0; max-height: 40px; padding: .5rem 0; margin-bottom: .5rem; } + 100% { opacity: 0; max-height: 0; padding: 0; margin-bottom: 0; } +} diff --git a/app/assets/stylesheets/atoms/_fonts.scss b/app/assets/stylesheets/core/_fonts.scss similarity index 100% rename from app/assets/stylesheets/atoms/_fonts.scss rename to app/assets/stylesheets/core/_fonts.scss diff --git a/app/assets/stylesheets/molecules/_forms.scss b/app/assets/stylesheets/molecules/_forms.scss index 3409745..c432e40 100644 --- a/app/assets/stylesheets/molecules/_forms.scss +++ b/app/assets/stylesheets/molecules/_forms.scss @@ -266,6 +266,13 @@ select { margin-top: 2rem; } +.resolve-error { + animation-name: success-fadeout; + animation-duration: 1.5s; + animation-delay: 0; + animation-fill-mode: forwards; +} + html.no-js { .chars { display: none; diff --git a/app/assets/stylesheets/templates/_summary.scss b/app/assets/stylesheets/templates/_summary.scss index 042a741..00a62d3 100644 --- a/app/assets/stylesheets/templates/_summary.scss +++ b/app/assets/stylesheets/templates/_summary.scss @@ -43,12 +43,6 @@ margin-top: 3rem; } -@keyframes success-fadeout { - 0% { opacity: 1; max-height: 40px; } - 85% { opacity: 0; max-height: 40px; padding: .5rem 0; margin-bottom: .5rem; } - 100% { opacity: 0; max-height: 0; padding: 0; margin-bottom: 0; } -} - .success { box-sizing: border-box; text-align: center; From 7be7f97c90c784a06dfb13ec001280f6a6fa6244 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Thu, 4 Aug 2016 09:55:51 -0500 Subject: [PATCH 076/205] cleaning up custom flash key --- app/controllers/candidate_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/candidate_controller.rb b/app/controllers/candidate_controller.rb index 59fd244..344c663 100644 --- a/app/controllers/candidate_controller.rb +++ b/app/controllers/candidate_controller.rb @@ -113,6 +113,7 @@ class CandidateController < ApplicationController flash[:answer_error] = answer_params[:question_id].to_i render :question else + flash.delete(:answer_error) # TODO: change params.key? to submit = save/next/summary # redirect_to :summary and return if params.key?(:update) redirect_to :saved and return if params.key?(:save) From 11fffc0cdf48436eec3189a33ad2235736527023 Mon Sep 17 00:00:00 2001 From: Jennifer Siegfried Date: Thu, 4 Aug 2016 14:15:13 -0600 Subject: [PATCH 077/205] Adds public directory assets to gitignore file --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index f11e40a..f0faec8 100644 --- a/.gitignore +++ b/.gitignore @@ -41,6 +41,9 @@ bower_components/ node_modules/ .DS_Store +## Public directory assets +public/assets + ### Vim ### [._]*.s[a-w][a-z] [._]s[a-w][a-z] From 1566edec4cc0da8837fce10d7d0c8b687be8b184 Mon Sep 17 00:00:00 2001 From: Jennifer Siegfried Date: Thu, 4 Aug 2016 16:24:53 -0600 Subject: [PATCH 078/205] Language/styling updates --- app/controllers/recruiter_controller.rb | 3 +- app/views/candidate_mailer/reminder.html.erb | 19 ++++++--- app/views/candidate_mailer/reminder.text.erb | 9 +++-- app/views/candidate_mailer/submitted.html.erb | 13 +++++- app/views/candidate_mailer/submitted.text.erb | 2 +- app/views/candidate_mailer/welcome.html.erb | 40 ++++++++++++------- app/views/candidate_mailer/welcome.text.erb | 4 +- .../candidate_created.html.erb | 20 +++++++--- .../candidate_created.text.erb | 8 ++-- .../candidate_submitted.html.erb | 13 +++++- .../candidate_submitted.text.erb | 2 +- .../candidate_submission.html.erb | 10 ++--- .../candidate_submission.text.erb | 8 ++-- 13 files changed, 100 insertions(+), 51 deletions(-) diff --git a/app/controllers/recruiter_controller.rb b/app/controllers/recruiter_controller.rb index e263c80..dcb145a 100644 --- a/app/controllers/recruiter_controller.rb +++ b/app/controllers/recruiter_controller.rb @@ -34,7 +34,8 @@ class RecruiterController < ApplicationController session[:user] = recruiter.to_i redirect_to recruiter_path else - redirect_to recruiter_login_path, flash: { error: "Sorry, incorrect email or password. Please try again." } + redirect_to recruiter_login_path, + flash: { error: "Sorry, incorrect email or password. Please try again." } end end diff --git a/app/views/candidate_mailer/reminder.html.erb b/app/views/candidate_mailer/reminder.html.erb index 74faed6..af7393c 100644 --- a/app/views/candidate_mailer/reminder.html.erb +++ b/app/views/candidate_mailer/reminder.html.erb @@ -1,8 +1,9 @@ - @@ -12,16 +13,24 @@

Dear <%= @candidate.name %>,

Thank you for taking the Skills Assessment Test. However, it looks like you have not submitted it - yet. If you are having troubles, please reach out to your recruiter: + yet. If you are having trouble, please reach out to your recruiter: <%= mail_to @candidate.recruiter.email %>

You can return to the test here: - <%= link_to nil, root_url %> + <%= link_to nil, root_url %>.
- Your test id is: <%= @candidate.test_hash %> + Your Test ID is: <%= @candidate.test_hash %>

+ + + +
- PERFICIENT DIGITAL - Skills Assessment Test + +
PERFICIENT/digital Skills Assessment Test
+


+


+


+
 
+
diff --git a/app/views/candidate_mailer/reminder.text.erb b/app/views/candidate_mailer/reminder.text.erb index f9895f3..3a2e08f 100644 --- a/app/views/candidate_mailer/reminder.text.erb +++ b/app/views/candidate_mailer/reminder.text.erb @@ -1,10 +1,11 @@ -PERFICIENT DIGITAL - Skills Assessment Test +PERFICIENT/digital - Skills Assessment Test Thank you for taking the Skills Assessment Test. However, it looks like you have not submitted it -yet. If you are having troubles, please reach out to your recruiter: +yet. If you are having trouble, please reach out to your recruiter: <%= @candidate.recruiter.email %> You can return to the test here: -<%= root_url %> +<%= root_url %>. -Your test id is: <%= @candidate.test_hash %> +Your Test ID is: +<%= @candidate.test_hash %> diff --git a/app/views/candidate_mailer/submitted.html.erb b/app/views/candidate_mailer/submitted.html.erb index 32a4af8..11e4679 100644 --- a/app/views/candidate_mailer/submitted.html.erb +++ b/app/views/candidate_mailer/submitted.html.erb @@ -1,8 +1,9 @@ - @@ -14,4 +15,12 @@ + + + +
- PERFICIENT DIGITAL - Skills Assessment Test + +
PERFICIENT/digital Skills Assessment Test
+


+


+


+
 
+
diff --git a/app/views/candidate_mailer/submitted.text.erb b/app/views/candidate_mailer/submitted.text.erb index dcbc844..571bde5 100644 --- a/app/views/candidate_mailer/submitted.text.erb +++ b/app/views/candidate_mailer/submitted.text.erb @@ -1,4 +1,4 @@ -PERFICIENT DIGITAL - Skills Assessment Test +PERFICIENT/digital - Skills Assessment Test Dear <%= @candidate.name %>, diff --git a/app/views/candidate_mailer/welcome.html.erb b/app/views/candidate_mailer/welcome.html.erb index 87ccfae..1fbb890 100644 --- a/app/views/candidate_mailer/welcome.html.erb +++ b/app/views/candidate_mailer/welcome.html.erb @@ -1,35 +1,45 @@ - +
- + + + - - + + + +
- PERFICIENT DIGITAL - Skills Assessment Test + +
PERFICIENT/digital
+


+

Hello there! You have been invited to take our Skills Assessment Test.

+

+
-

+

+

Please visit <%= link_to nil, login_url(@candidate.test_hash) %> to begin your test. - - +

- + +

Or, visit <%= root_url %> and enter your Test ID to begin your test. - Your Test ID is: <%= @candidate.test_hash %>. + Your Test ID is: <%= @candidate.test_hash %>.

+ Once we have evaluated your answers, your recruiter will be in touch. Good luck!

- -
Once we have evaluated your answers, your recruiter will be in touch. Good luck!
+


+


+
 
+
diff --git a/app/views/candidate_mailer/welcome.text.erb b/app/views/candidate_mailer/welcome.text.erb index e7279fd..cb16c8c 100644 --- a/app/views/candidate_mailer/welcome.text.erb +++ b/app/views/candidate_mailer/welcome.text.erb @@ -1,4 +1,6 @@ -PERFICIENT DIGITAL - Skills Assessment Test +PERFICIENT/digital + +Hello there! You have been invited to take our Skills Assessment Test. Please visit <%= login_url(@candidate.test_hash) %> to begin your test. diff --git a/app/views/recruiter_mailer/candidate_created.html.erb b/app/views/recruiter_mailer/candidate_created.html.erb index 2138311..8132ca9 100644 --- a/app/views/recruiter_mailer/candidate_created.html.erb +++ b/app/views/recruiter_mailer/candidate_created.html.erb @@ -1,8 +1,8 @@ - - @@ -11,14 +11,22 @@ + + + +
- PERFICIENT DIGITAL - Skills Assessment Test + +
PERFICIENT/digital Skills Assessment Test
+


The following candidate has been invited to take the Skills Assessment Test:

- Candidate Name: <%= @candidate.name %>
- Candidate Email: <%= @candidate.email %>
+ Candidate name: <%= @candidate.name %>
+ Candidate email: <%= @candidate.email %>
Candidate ID: <%= @candidate.test_hash %>
- Years of Experience: <%= @candidate.experience %> Years
+ Years of experience: <%= @candidate.experience %> Years

You will be notified when the candidate has finished taking the test.

+


+


+
 
+
diff --git a/app/views/recruiter_mailer/candidate_created.text.erb b/app/views/recruiter_mailer/candidate_created.text.erb index e8d2529..56b001b 100644 --- a/app/views/recruiter_mailer/candidate_created.text.erb +++ b/app/views/recruiter_mailer/candidate_created.text.erb @@ -1,10 +1,10 @@ -PERFICIENT DIGITAL - Skills Assessment Test +PERFICIENT/digital - Skills Assessment Test The following candidate has been invited to take the Skills Assessment Test: -Candidate Name: <%= @candidate.name %> -Candidate Email: <%= @candidate.email %> +Candidate name: <%= @candidate.name %> +Candidate email: <%= @candidate.email %> Candidate ID: <%= @candidate.test_hash %> -Years of Experience: <%= @candidate.experience %> Years +Years of experience: <%= @candidate.experience %> Years You will be notified when the candidate has finished taking the test. diff --git a/app/views/recruiter_mailer/candidate_submitted.html.erb b/app/views/recruiter_mailer/candidate_submitted.html.erb index 23070ea..ac47946 100644 --- a/app/views/recruiter_mailer/candidate_submitted.html.erb +++ b/app/views/recruiter_mailer/candidate_submitted.html.erb @@ -1,8 +1,9 @@ - @@ -14,4 +15,12 @@ + + + +
- PERFICIENT DIGITAL - Skills Assessment Test + +
PERFICIENT/digital Skills Assessment Test
+


+


+


+
 
+
diff --git a/app/views/recruiter_mailer/candidate_submitted.text.erb b/app/views/recruiter_mailer/candidate_submitted.text.erb index d27ef77..c6e7142 100644 --- a/app/views/recruiter_mailer/candidate_submitted.text.erb +++ b/app/views/recruiter_mailer/candidate_submitted.text.erb @@ -1,4 +1,4 @@ -PERFICIENT DIGITAL - Skills Assessment Test +PERFICIENT/digital - Skills Assessment Test <%= @candidate.name %> has completed the Skills Assessment Test. Martin Ridgway will let you know if we would like to interview this candidate. diff --git a/app/views/reviewer_mailer/candidate_submission.html.erb b/app/views/reviewer_mailer/candidate_submission.html.erb index 6307b47..f91d483 100644 --- a/app/views/reviewer_mailer/candidate_submission.html.erb +++ b/app/views/reviewer_mailer/candidate_submission.html.erb @@ -1,17 +1,17 @@ - diff --git a/app/views/reviewer_mailer/candidate_submission.text.erb b/app/views/reviewer_mailer/candidate_submission.text.erb index e3acb32..41a8ed4 100644 --- a/app/views/reviewer_mailer/candidate_submission.text.erb +++ b/app/views/reviewer_mailer/candidate_submission.text.erb @@ -1,5 +1,5 @@ -SKILLS ASSESSMENT RESULTS +PERFICIENT/digital SKILLS ASSESSMENT RESULTS -<%= @candidate.test_hash %> -has completed the Skills Assesment Test. -You can review the results here: <%= review_test_url(@candidate.test_hash) %> +Candidate <%= @candidate.test_hash %> has completed the Skills Assessment Test. + +You can view the results here: <%= review_test_url(@candidate.test_hash) %> From 53095028be8ac931dd76970e18249291912612a4 Mon Sep 17 00:00:00 2001 From: Jennifer Siegfried Date: Thu, 4 Aug 2016 16:25:12 -0600 Subject: [PATCH 079/205] Formatting updates --- app/assets/stylesheets/molecules/_buttons.scss | 7 ++++++- app/assets/stylesheets/molecules/_forms.scss | 7 +++++++ app/assets/stylesheets/pages/_error.scss | 5 ++--- app/assets/stylesheets/templates/_summary.scss | 6 +++++- app/views/candidate/saved.html.erb | 6 +++--- app/views/candidate/summary.html.erb | 2 ++ app/views/candidate/welcome.html.erb | 6 +++--- 7 files changed, 28 insertions(+), 11 deletions(-) diff --git a/app/assets/stylesheets/molecules/_buttons.scss b/app/assets/stylesheets/molecules/_buttons.scss index 91b4daa..99b0066 100644 --- a/app/assets/stylesheets/molecules/_buttons.scss +++ b/app/assets/stylesheets/molecules/_buttons.scss @@ -53,7 +53,8 @@ button.tertiary-btn { display: none; } -.button-cancel { +.button-cancel, +.tertiary-btn.button-cancel { color: #ef0734; border: 1px solid #ef0734; display: none; @@ -78,6 +79,10 @@ button.tertiary-btn { cursor: default; } +.button-wrap { + margin-top: 3rem; +} + // JS-enabled styles html.no-js { .tertiary-btn.button-edit { diff --git a/app/assets/stylesheets/molecules/_forms.scss b/app/assets/stylesheets/molecules/_forms.scss index c432e40..239e218 100644 --- a/app/assets/stylesheets/molecules/_forms.scss +++ b/app/assets/stylesheets/molecules/_forms.scss @@ -177,6 +177,13 @@ textarea { &:not(:disabled) + label:before { background-color: white; } + &:disabled { + + label { + &:after { + background-color: #888; + } + } + } } [type="checkbox"] { diff --git a/app/assets/stylesheets/pages/_error.scss b/app/assets/stylesheets/pages/_error.scss index 8c6c12b..fbce04d 100644 --- a/app/assets/stylesheets/pages/_error.scss +++ b/app/assets/stylesheets/pages/_error.scss @@ -2,9 +2,8 @@ text-align: center; background-color: $accent-color-1; color: #fff; - padding-top: .5rem; - padding-bottom: .5rem; - margin-bottom: .5rem; + margin: 2rem 0 .5rem; + padding: .5rem 0; } .error-header { diff --git a/app/assets/stylesheets/templates/_summary.scss b/app/assets/stylesheets/templates/_summary.scss index 00a62d3..3c3060e 100644 --- a/app/assets/stylesheets/templates/_summary.scss +++ b/app/assets/stylesheets/templates/_summary.scss @@ -29,6 +29,10 @@ } .answer-container { padding:2rem 0; + + textarea:not(:disabled) { + background-color: white; + } } } } @@ -50,7 +54,7 @@ color: #fff; padding-top: .5rem; padding-bottom: .5rem; - margin-bottom: .5rem; + margin-bottom: .5rem; animation-name: success-fadeout; animation-duration: 1.5s; animation-delay: 2s; diff --git a/app/views/candidate/saved.html.erb b/app/views/candidate/saved.html.erb index e08dfc0..bd7dda0 100644 --- a/app/views/candidate/saved.html.erb +++ b/app/views/candidate/saved.html.erb @@ -1,10 +1,10 @@

- Your test results have been saved. You can visit again later with your candidate ID to complete + Your test results have been saved. You can visit again later with your Test ID to complete the test starting from where you left off.

-
diff --git a/app/views/candidate/summary.html.erb b/app/views/candidate/summary.html.erb index 208a2a0..2940027 100644 --- a/app/views/candidate/summary.html.erb +++ b/app/views/candidate/summary.html.erb @@ -5,6 +5,8 @@ Once you're done, hit the button at the bottom of the page to submit your answers.

+
+ <% @quiz.each do |question| %> <%= form_for(:answer, url: post_answer_path(answer_id: question.answer_id), html:{class: 'summary-form'}) do |form| %>
diff --git a/app/views/candidate/welcome.html.erb b/app/views/candidate/welcome.html.erb index cee02ab..c98dda7 100644 --- a/app/views/candidate/welcome.html.erb +++ b/app/views/candidate/welcome.html.erb @@ -20,7 +20,7 @@ answers, we will review your assessment and your recruiter will be in touch.

- <%= link_to question_path do %> - - <% end %> +
+ <%= link_to "Begin", question_path, {class: 'btn'} %> +
From 635297884dddce188395ddc8df15f1e85accb49f Mon Sep 17 00:00:00 2001 From: Jennifer Siegfried Date: Thu, 4 Aug 2016 17:03:23 -0600 Subject: [PATCH 080/205] Misc style updates --- .../stylesheets/molecules/_buttons.scss | 1 + app/assets/stylesheets/molecules/_forms.scss | 33 +++++++++++++------ app/assets/stylesheets/pages/_error.scss | 8 +++++ app/views/candidate/_live_code.html.erb | 8 ++--- app/views/candidate/question.html.erb | 2 +- 5 files changed, 37 insertions(+), 15 deletions(-) diff --git a/app/assets/stylesheets/molecules/_buttons.scss b/app/assets/stylesheets/molecules/_buttons.scss index 99b0066..5ef730e 100644 --- a/app/assets/stylesheets/molecules/_buttons.scss +++ b/app/assets/stylesheets/molecules/_buttons.scss @@ -87,6 +87,7 @@ button.tertiary-btn { html.no-js { .tertiary-btn.button-edit { border: none; + text-decoration: underline; } .button-save, .button-cancel { diff --git a/app/assets/stylesheets/molecules/_forms.scss b/app/assets/stylesheets/molecules/_forms.scss index 239e218..5a53c2d 100644 --- a/app/assets/stylesheets/molecules/_forms.scss +++ b/app/assets/stylesheets/molecules/_forms.scss @@ -5,6 +5,17 @@ fieldset { border: none; padding: 0; margin: 0; + + &:disabled { + label { + display: none; + } + .form-group-multiples { + label { + display: block; + } + } + } } legend { @@ -21,10 +32,12 @@ label { #{$all-text-inputs} { display: block; font-size: $base-font-size; - border-left:0; - border-top: 0; - border-right: 0; - border-bottom: 1px solid $secondary-color; + border: none !important; + border-bottom: 1px solid $secondary-color !important; + // border-left:0; + // border-top: 0; + // border-right: 0; + // border-bottom: 1px solid $secondary-color; box-shadow: none; border-radius: $base-border-radius; box-sizing: border-box; @@ -35,9 +48,9 @@ label { font-family: $primary-font-face; line-height: 1.5em; - &:hover { - border-color: shade($base-border-color, 20%); - } + // &:hover { + // border-color: shade($base-border-color, 20%); + // } &:focus { outline: none; @@ -48,9 +61,9 @@ label { background-color: shade($base-background-color, 5%); cursor: default; - &:hover { - border: $base-border; - } + // &:hover { + // border: $base-border; + // } } } button:disabled, diff --git a/app/assets/stylesheets/pages/_error.scss b/app/assets/stylesheets/pages/_error.scss index fbce04d..7b6b731 100644 --- a/app/assets/stylesheets/pages/_error.scss +++ b/app/assets/stylesheets/pages/_error.scss @@ -25,6 +25,14 @@ background-color: #f39c12; } +[data-id="live-coder-finish-later"] { + .warning { + margin-bottom: 2rem; + text-align: left; + padding: .5rem 1rem; + } +} + @media only screen and (min-width: $desktop) { .error-header { .page-title { diff --git a/app/views/candidate/_live_code.html.erb b/app/views/candidate/_live_code.html.erb index 95fdf44..57a4888 100644 --- a/app/views/candidate/_live_code.html.erb +++ b/app/views/candidate/_live_code.html.erb @@ -7,20 +7,20 @@ checked: Array(question.answer).include?('finish-later') } %> -
+ <% unless params[:action] == 'summary' %>

This is a question where you will be asked to write code, and it utilizes a JavaScript-enabled - environment. It looks like JavaScript is not loaded for some reason. Please check the box below + environment. It looks like JavaScript is not loaded. Please check the box below to acknowledge that you agree to come back at a later time to finish answering this question before you can submit the test.

<%= form.check_box(:answer, checkbox_html, true, '') %> - <%= form.label(option_id, 'I will come back later to finish this live coding question.') %> + <%= form.label(option_id, 'I will come back later to finish this code question') %>
<% end %> diff --git a/app/views/candidate/question.html.erb b/app/views/candidate/question.html.erb index e8beaa4..9337177 100644 --- a/app/views/candidate/question.html.erb +++ b/app/views/candidate/question.html.erb @@ -21,7 +21,7 @@ <% if @status.on_summary %> -
+
From fc784ffcb11b03f5dd13fa1973df18ba722e9126 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Thu, 4 Aug 2016 20:01:17 -0500 Subject: [PATCH 081/205] completes #17 - live-coder plus text input type Squashed commit of the following: commit d41cbf66eb2a9ee705ab60bb156eed95881fa193 Author: Mark Moser Date: Thu Aug 4 19:58:20 2016 -0500 live-coder-text validations commit 866bfeb863516a8656bc26b10f967d0b9b8d8505 Author: Mark Moser Date: Thu Aug 4 11:57:57 2016 -0500 getting things green again and rebasing develop commit 28a23200f291e30c690b71e9bcae3e1a69eb3093 Author: Derek Montgomery Date: Thu Aug 4 10:14:23 2016 -0500 Progress on live coder text field --- .rubocop.yml | 1 + app/assets/javascripts/live-coder.js.erb | 4 +- app/assets/javascripts/summary-edit.js | 2 +- app/controllers/candidate_controller.rb | 18 +++++- app/validators/answer_format_validator.rb | 43 ++++++++++++--- app/views/candidate/_live_code_text.html.erb | 1 + ...live_coder.html.erb => live_code.html.erb} | 0 app/views/candidate/live_code_text.html.erb | 21 +++++++ test/fixtures/answers.yml | 12 ++-- test/fixtures/questions.yml | 2 +- .../answer_format_validator_test.rb | 55 ++++++++++++++++++- 11 files changed, 136 insertions(+), 23 deletions(-) create mode 100644 app/views/candidate/_live_code_text.html.erb rename app/views/candidate/{live_coder.html.erb => live_code.html.erb} (100%) create mode 100644 app/views/candidate/live_code_text.html.erb diff --git a/.rubocop.yml b/.rubocop.yml index 597ee1d..f214d03 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -47,6 +47,7 @@ Metrics/AbcSize: Metrics/ClassLength: Exclude: - app/controllers/candidate_controller.rb + - test/**/* Metrics/LineLength: Max: 110 diff --git a/app/assets/javascripts/live-coder.js.erb b/app/assets/javascripts/live-coder.js.erb index 360b996..0847e6e 100644 --- a/app/assets/javascripts/live-coder.js.erb +++ b/app/assets/javascripts/live-coder.js.erb @@ -93,7 +93,7 @@ function indentSelection(e){ } function loadLiveCoders(){ - $.each($('.answer-sec.live_code-type'), function(index, elem){ + $.each($('.answer-sec.live_code-type, .answer-sec.live_code_text-type'), function(index, elem){ var qid = $(elem).data('qid'); $(elem).find("[data-id='live-coder-answer']").load("/live-coder-entry/" + qid, function(){ $(elem).find('.js-error').addClass('hidden'); @@ -112,7 +112,7 @@ $(function(){ // wait a half second before updating results // restart the timer if they resume typing $('html').on('keyup', '.code-input textarea', function(){ - var elem = $(this).closest('.answer-sec.live_code-type'); + var elem = $(this).closest('.answer-sec.live_code-type, .answer-sec.live_code_text-type'); if (timer) { clearTimeout(timer); } timer = setTimeout(updateResults(elem), 500); }); diff --git a/app/assets/javascripts/summary-edit.js b/app/assets/javascripts/summary-edit.js index 8948a99..a70fcb5 100644 --- a/app/assets/javascripts/summary-edit.js +++ b/app/assets/javascripts/summary-edit.js @@ -173,7 +173,7 @@ $('.answer-sec') .on('click', '.button-save', saveClickHandler); // Dynamically load in coders -$.each($('.answer-sec.live-coder-type'), function(index, elem){ +$.each($('.answer-sec.live_code-type, .answer-sec.live_code_text-type'), function(index, elem){ var qid = $(elem).data('qid'); $(elem).find("[data-id='live-coder-answer']").load("/live-coder-entry/" + qid, function(){ $(elem).find('.js-error').addClass('hidden'); diff --git a/app/controllers/candidate_controller.rb b/app/controllers/candidate_controller.rb index 344c663..59d1e77 100644 --- a/app/controllers/candidate_controller.rb +++ b/app/controllers/candidate_controller.rb @@ -42,7 +42,7 @@ class CandidateController < ApplicationController prep_question params[:question_id] prep_instance_answer @question prep_answer params[:question_id] - render layout: false + render @question.input_type, layout: false end def summary @@ -95,8 +95,13 @@ class CandidateController < ApplicationController def answer_params params.require(:answer).permit( - :question_id, :answer_id, - :radio, :text, checkbox: [], live_code: [:later, :html, :css, :js] + :question_id, + :answer_id, + :radio, + :text, + checkbox: [], + live_code: [:later, :html, :css, :js], + live_code_text: [:later, :html, :css, :js, :text] ) end @@ -148,4 +153,11 @@ class CandidateController < ApplicationController submitted: params.key?(:submit)) route_answer end + + def process_live_code_text + @answer.update(answer: answer_params[:live_code_text].to_h, + saved: params.key?(:save), + submitted: params.key?(:submit)) + route_answer + end end diff --git a/app/validators/answer_format_validator.rb b/app/validators/answer_format_validator.rb index 1cbcfea..4a46672 100644 --- a/app/validators/answer_format_validator.rb +++ b/app/validators/answer_format_validator.rb @@ -14,7 +14,7 @@ class AnswerFormatValidator < ActiveModel::EachValidator end if clean_val.length > 1000 - record.errors[attribute] << (options[:message] || "The character limit for a textarea answer is 1000") + record.errors[attribute] << (options[:message] || "The character limit for this answer is 1000.") end end @@ -33,11 +33,40 @@ class AnswerFormatValidator < ActiveModel::EachValidator def live_code record, attribute, value return unless value.nil? || value.values.join.blank? - msg = if value.present? && value.keys.count == 1 - "Please check that you will come back to complete the code example." - else - "You must write code in one of the above textareas to progress." - end - record.errors[attribute] << (options[:message] || msg) + record.errors[attribute] << (options[:message] || live_code_error_message(value)) + end + + def live_code_text record, attribute, value + return if value.present? && live_code_text_value_check(value) + + record.errors[attribute] << (options[:message] || live_code_text_error_message(value)) + end + + ################################# + + def live_code_text_error_message value + return 'You must write code in one of the above textareas to progress.' if value.nil? + + code_present = value.values_at(:html, :css, :js).join.present? + reason_present = value[:text].present? + later_present = value.keys.count == 1 + return 'Please check that you will come back to complete the code example.' if later_present + return 'You must write code in one of the above textareas to progress.' unless code_present + return 'You must provide an answer in the reason field.' unless reason_present + end + + def live_code_error_message value + if value.present? && value.keys.count == 1 + return "Please check that you will come back to complete the code example." + end + "You must write code in one of the above textareas to progress." + end + + def live_code_text_value_check value + later_present = value[:later].present? && value.keys.count == 1 + code_present = value.values_at(:html, :css, :js).join.present? + reason_present = value[:text].present? + + later_present || (code_present && reason_present) end end diff --git a/app/views/candidate/_live_code_text.html.erb b/app/views/candidate/_live_code_text.html.erb new file mode 100644 index 0000000..11d5458 --- /dev/null +++ b/app/views/candidate/_live_code_text.html.erb @@ -0,0 +1 @@ +<%= render partial: "candidate/live_code", locals: {question: question, form: form} %> diff --git a/app/views/candidate/live_coder.html.erb b/app/views/candidate/live_code.html.erb similarity index 100% rename from app/views/candidate/live_coder.html.erb rename to app/views/candidate/live_code.html.erb diff --git a/app/views/candidate/live_code_text.html.erb b/app/views/candidate/live_code_text.html.erb new file mode 100644 index 0000000..6041199 --- /dev/null +++ b/app/views/candidate/live_code_text.html.erb @@ -0,0 +1,21 @@ +<% answer = @answer.answer || {} %> + + +<%= text_area_tag 'answer[live_code_text][text]', (answer['text']) %> + +
+ + <%= text_area_tag 'answer[live_code_text][html]', (answer['html']), { 'data-id' => 'code-html', class: 'code-answer code-html' } %> +
+ +
+ + <%= text_area_tag 'answer[live_code_text][css]', (answer['css']), { 'data-id' => 'code-css', class: 'code-answer code-css' } %> +
+ +
+ + <%= text_area_tag 'answer[live_code_text][js]', (answer['js']), { 'data-id' => 'code-js', class: 'code-answer code-js' } %> +
+ +
diff --git a/test/fixtures/answers.yml b/test/fixtures/answers.yml index 901f60d..196ff0f 100644 --- a/test/fixtures/answers.yml +++ b/test/fixtures/answers.yml @@ -39,7 +39,7 @@ dawn2: dawn3: candidate: dawn question: fed3 - answer: {html: "dawn3

I'm a little tealpot

", css: 'h1 {color: teal;}', js: ''} + answer: {html: "

I'm a little tealpot

", css: 'h1 {color: teal;}', js: '', text: 'I did this because reasons.'} saved: 0 submitted: true created_at: <%= DateTime.now() - 38.hours - 50.minutes %> @@ -75,7 +75,7 @@ dawn6: dawn7: candidate: dawn question: fed7 - answer: {html: 'dawn7

This means jQuery needs to be available in live-coder!

', css: "strong {font-size: 1.6em;}\n.green {color: green;}", js: '$("strong").addClass("green");'} + answer: {html: '

This means jQuery needs to be available in live-coder!

', css: "strong {font-size: 1.6em;}\n.green {color: green;}", js: '$("strong").addClass("green");'} saved: 0 submitted: true created_at: <%= DateTime.now() - 38.hours - 34.minutes %> @@ -129,7 +129,7 @@ peggy2: peggy3: candidate: peggy question: fed3 - answer: {html: "peggy3

I'm a little tealpot

", css: 'h1 {color: teal;}', js: ''} + answer: {html: "

I'm a little tealpot

", css: 'h1 {color: teal;}', js: '', text: 'I like turtles.'} saved: 0 submitted: true created_at: <%= DateTime.now() - 38.hours - 50.minutes %> @@ -165,7 +165,7 @@ peggy6: peggy7: candidate: peggy question: fed7 - answer: {html: 'peggy7

This means jQuery needs to be available in live-coder!

', css: "strong {font-size: 1.6em;}\n.green {color: green;}", js: '$("strong").addClass("green");'} + answer: {html: '

This means jQuery needs to be available in live-coder!

', css: "strong {font-size: 1.6em;}\n.green {color: green;}", js: '$("strong").addClass("green");'} saved: 0 submitted: true created_at: <%= DateTime.now() - 38.hours - 34.minutes %> @@ -220,7 +220,7 @@ richard2: richard3: candidate: richard question: fed3 - answer: {html: 'richard3

Salmon

', css: 'h1 {color: salmon;}', js: ''} + answer: {html: '

Salmon

', css: 'h1 {color: salmon;}', js: '', text: 'Gotta lotta GOOD things on sale, strangah.'} saved: 0 submitted: true created_at: <%= DateTime.now() - 36.hours - 26.minutes %> @@ -256,7 +256,7 @@ richard6: richard7: candidate: richard question: fed7 - answer: {html: 'richard7

This means jQuery needs to be available in live-coder!

', css: "strong {font-size: 1.6em;}\n.green {color: green;}", js: '$("strong").addClass("green");'} + answer: {html: '

This means jQuery needs to be available in live-coder!

', css: "strong {font-size: 1.6em;}\n.green {color: green;}", js: '$("strong").addClass("green");'} saved: 0 submitted: true created_at: <%= DateTime.now() - 36.hours - 34.minutes %> diff --git a/test/fixtures/questions.yml b/test/fixtures/questions.yml index 027955f..8b3bec8 100644 --- a/test/fixtures/questions.yml +++ b/test/fixtures/questions.yml @@ -22,7 +22,7 @@ fed3: quiz: fed question: How would you create a widget that would fit in a 250px wide area as well as a 400px wide area? category: CSS - input_type: live_code + input_type: live_code_text input_options: sort: 2 active: true diff --git a/test/validators/answer_format_validator_test.rb b/test/validators/answer_format_validator_test.rb index b8a7d2f..3d50cc7 100644 --- a/test/validators/answer_format_validator_test.rb +++ b/test/validators/answer_format_validator_test.rb @@ -77,7 +77,7 @@ class AnswerFormatValidatorTest < ActiveSupport::TestCase obj.answer = SecureRandom.urlsafe_base64(1001) refute obj.valid? - assert_match(/char.*limit.*1000$/, obj.errors.messages[:answer][0]) + assert_match(/char.*limit.*1000.$/, obj.errors.messages[:answer][0]) end # input_type CHECK BOX @@ -141,7 +141,7 @@ class AnswerFormatValidatorTest < ActiveSupport::TestCase test "live_code should FAIL without checking finish later" do obj = AnswerValidatable.new('live_code') - obj.answer = { "later" => "" } + obj.answer = { later: "" } refute obj.valid? assert_match(/come back/, obj.errors.messages[:answer][0]) @@ -149,9 +149,58 @@ class AnswerFormatValidatorTest < ActiveSupport::TestCase test "live_code should FAIL without values" do obj = AnswerValidatable.new('live_code') - obj.answer = { "later" => "", "html" => "", "css" => "", "js" => "" } + obj.answer = { later: "", html: "", css: "", js: "" } refute obj.valid? assert_match(/write.*code/, obj.errors.messages[:answer][0]) end + + # input_type LIVE CODER TEXT + test "live_code_text should PASS with populated hash" do + obj = AnswerValidatable.new('live_code_text') + obj.answer = { html: 'this is html', css: '', js: '', text: 'some reasons' } + + assert obj.valid? + assert obj.errors.messages.empty? + end + + test "live_code_text should PASS with finish later" do + obj = AnswerValidatable.new('live_code_text') + obj.answer = { later: "true" } + + assert obj.valid? + assert obj.errors.messages.empty? + end + + test "live_code_text should FAIL with nil" do + obj = AnswerValidatable.new('live_code_text') + obj.answer = nil + + refute obj.valid? + assert_match(/write.*code/, obj.errors.messages[:answer][0]) + end + + test "live_code_text should FAIL without checking finish later" do + obj = AnswerValidatable.new('live_code_text') + obj.answer = { later: "" } + + refute obj.valid? + assert_match(/come back/, obj.errors.messages[:answer][0]) + end + + test "live_code_text should FAIL without values" do + obj = AnswerValidatable.new('live_code_text') + obj.answer = { later: "", html: "", css: "", js: "", text: "" } + + refute obj.valid? + assert_match(/write.*code/, obj.errors.messages[:answer][0]) + end + + test "live_code_text should FAIL without text" do + obj = AnswerValidatable.new('live_code_text') + obj.answer = { later: "", html: "some html", css: "", js: "", text: "" } + + refute obj.valid? + assert_match(/provide.*reason/, obj.errors.messages[:answer][0]) + end end From 5cac3af3548c1354f3afffabcc25d45e331d5281 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Thu, 4 Aug 2016 20:12:14 -0500 Subject: [PATCH 082/205] fixes #39 making sure question attachements show up everywhere --- app/views/candidate/summary.html.erb | 4 +++ app/views/review/view.html.erb | 3 ++ test/integration/question_features_test.rb | 36 ++++++++++++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 test/integration/question_features_test.rb diff --git a/app/views/candidate/summary.html.erb b/app/views/candidate/summary.html.erb index 2940027..4a1d54c 100644 --- a/app/views/candidate/summary.html.erb +++ b/app/views/candidate/summary.html.erb @@ -22,6 +22,10 @@
+ <% if question.attachment.present? %> + <%= image_tag question.attachment %> + <% end %> +
<%= hidden_field_tag 'answer[question_id]', question.question_id %> <%= render partial: question.input_type, locals: {question: question, form: form} %> diff --git a/app/views/review/view.html.erb b/app/views/review/view.html.erb index 463fcda..51262c9 100644 --- a/app/views/review/view.html.erb +++ b/app/views/review/view.html.erb @@ -16,6 +16,9 @@
+ <% if question.attachment.present? %> + <%= image_tag question.attachment %> + <% end %>
<%= hidden_field_tag 'answer[question_id]', question.question_id %> <%= render partial: "candidate/#{question.input_type}", locals: {question: question, form: form} %> diff --git a/test/integration/question_features_test.rb b/test/integration/question_features_test.rb new file mode 100644 index 0000000..73909af --- /dev/null +++ b/test/integration/question_features_test.rb @@ -0,0 +1,36 @@ +require 'test_helper' + +class QuestionFeatureTest < ActionDispatch::IntegrationTest + def setup_auth candidate + post validate_candidate_url, params: { test_id: candidate.test_hash } + end + + test "should show attachments on question" do + setup_auth candidates(:dawn) + + get question_path questions(:fed6) + assert_response :success + assert_select '.question-text', questions(:fed6).question + assert_select "img[src=\"#{questions(:fed6).attachment}\"]" + end + + test "should show attachments on summary" do + setup_auth candidates(:dawn) + + get summary_path + assert_response :success + assert_select "img[src=\"#{questions(:fed6).attachment}\"]" + end + + # For some reason this test fails on review, but passes on summery /shrug + # explore later + # + # test "should show attachments on review" do + # user = users :reviewer + # post review_auth_url, params: { auth: { email: user.email, password: 'password' } } + # + # get review_path(candidates(:richard).test_hash) + # assert_response :success + # assert_select "img[src=\"#{questions(:fed6).attachment}\"]" + # end +end From 5d906c6ff40a56513787eb419583cff2bf487372 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Thu, 4 Aug 2016 21:20:01 -0500 Subject: [PATCH 083/205] fixed finish later bug for coder+text --- app/views/candidate/_live_code.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/candidate/_live_code.html.erb b/app/views/candidate/_live_code.html.erb index 57a4888..1967e3c 100644 --- a/app/views/candidate/_live_code.html.erb +++ b/app/views/candidate/_live_code.html.erb @@ -3,7 +3,7 @@ checkbox_html = {class: 'checkbox', id: "answer_#{option_id}", - name: "answer[live_code][later]", + name: "answer[#{question.input_type}][later]", checked: Array(question.answer).include?('finish-later') } %> From 8640effbfc7c1a759ff59a4404f9a59f806b6b93 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Thu, 4 Aug 2016 22:28:20 -0500 Subject: [PATCH 084/205] fixes #40 - summary noJS messages --- app/assets/javascripts/summary-edit.js | 30 +++++++++++---------- app/views/candidate/_answer_errors.html.erb | 2 +- app/views/candidate/_live_code.html.erb | 24 ++++++++++------- app/views/candidate/summary.html.erb | 2 +- 4 files changed, 32 insertions(+), 26 deletions(-) diff --git a/app/assets/javascripts/summary-edit.js b/app/assets/javascripts/summary-edit.js index a70fcb5..c25153b 100644 --- a/app/assets/javascripts/summary-edit.js +++ b/app/assets/javascripts/summary-edit.js @@ -7,11 +7,11 @@ return this.each(function(){ var lineHeight = parseInt($(this).css('line-height')); var rows = Math.ceil(input / lineHeight); - rows = rows == 0 ? 1 : rows; + rows = rows === 0 ? 1 : rows; $(this).attr('rows', rows); - }) - } + }); + }; $('input[type="radio"]').on('change', function() { var inputName = $(this).attr('name'); @@ -40,7 +40,7 @@ var editClickHandler = function(e) { } else if(thisEd.find('input').attr('type') == 'checkbox') { $(thisEd.find('input')).each(function() { - if($(this).prop('checked')==true) { + if($(this).prop('checked') === true) { existingValue.push($(this).val()); } }); @@ -91,7 +91,8 @@ var saveClickHandler = function(e) { var thisEd = $(e.delegateTarget); var data =[]; var executeQuery; - var questionId = thisEd.find('.button-edit').attr('data-questionid'); + var questionId = thisEd.find('.button-edit').attr('data-questionId'); + var answerId = thisEd.find('.button-edit').attr('data-answerId'); if (thisEd.hasClass('live_code-type')) { var htmlAnswer = $(thisEd.find('textarea.code-html')[0]).val(); @@ -103,27 +104,28 @@ var saveClickHandler = function(e) { 'css': cssAnswer, 'js': jsAnswer } - } + }; } else if(thisEd.hasClass('radio-type')) { $(thisEd.find('input')).each(function() { - if($(this).prop('checked')==true) { + if($(this).prop('checked') === true) { data = ({ 'radio': $(this).val() - }) + }); } }); } else if(thisEd.hasClass('checkbox-type')) { data = {'checkbox': []}; $(thisEd.find('input')).each(function() { - if($(this).prop('checked')==true) { + if($(this).prop('checked') === true) { data.checkbox.push($(this).val()); } }); } else { data = {'text': thisEd.find('textarea').val()}; } - if(data == '') { + + if(data === '') { $(thisEd).before('
Please select or enter a value.
'); } else { thisEd.find('textarea:not(.code-answer)').replaceWith('

' + $.trim(thisEd.find('textarea').val()) + '

'); @@ -133,7 +135,7 @@ var saveClickHandler = function(e) { type: "POST", url: url, data: ({ - 'answer': data, + 'answer': $.extend(data, {'question_id': questionId, 'answer_id': answerId}), 'submit': true }), success: function(data){ @@ -143,12 +145,12 @@ var saveClickHandler = function(e) { executeQuery = false; } }).done(function() { - if(executeQuery == true) { + if(executeQuery === true) { $('.success, .error').remove(); $(thisEd).before('
Your answer has been updated successfully!
'); $(thisEd).find('.code-answer').attr('disabled', true); } - if(executeQuery == false) { + if(executeQuery === false) { $('.error, .success').remove(); $(thisEd).before('
Oops! There was an error processing your request. Please try again.
'); } @@ -167,7 +169,7 @@ $('.answer-block').prop('disabled', true); // Question events $('.answer-sec') .find('.button-cancel, .button-save').hide().end() -// // delegating events + // delegating events .on('click', '.button-edit', editClickHandler) .on('click', '.button-cancel', cancelClickHandler) .on('click', '.button-save', saveClickHandler); diff --git a/app/views/candidate/_answer_errors.html.erb b/app/views/candidate/_answer_errors.html.erb index b69a5f1..fe8d226 100644 --- a/app/views/candidate/_answer_errors.html.erb +++ b/app/views/candidate/_answer_errors.html.erb @@ -1,4 +1,4 @@ -<% if flash[:answer_error] == question.question_id %> +<% if flash[:answer_error] == question.question_id && answer.present? %> <% answer.errors.messages[:answer].each do |message| %>
<%= message %>
<% end %> diff --git a/app/views/candidate/_live_code.html.erb b/app/views/candidate/_live_code.html.erb index 1967e3c..08a51ae 100644 --- a/app/views/candidate/_live_code.html.erb +++ b/app/views/candidate/_live_code.html.erb @@ -11,18 +11,22 @@ Please revisit this page with JavaScript enabled to modify your answer.
--> -<% unless params[:action] == 'summary' %> -
-

- This is a question where you will be asked to write code, and it utilizes a JavaScript-enabled - environment. It looks like JavaScript is not loaded. Please check the box below - to acknowledge that you agree to come back at a later time to finish answering this question - before you can submit the test. -

+
+

+ This is a question where you will be asked to write code, and it utilizes a JavaScript-enabled + environment. It looks like JavaScript is not loaded. + <% unless params[:action] == 'summary' %> + Please check the box below to acknowledge that you agree to come back at a later time to finish + answering this question before you can submit the test. + <% else %> + You will need to enable JavaScript and answer this question before you can submit the test. + <% end %> +

+ <% unless params[:action] == 'summary' %> <%= form.check_box(:answer, checkbox_html, true, '') %> <%= form.label(option_id, 'I will come back later to finish this code question') %> -
-<% end %> + <% end %> +
<% # answers inserted dynamically via jQuery .load() diff --git a/app/views/candidate/summary.html.erb b/app/views/candidate/summary.html.erb index 4a1d54c..46558b8 100644 --- a/app/views/candidate/summary.html.erb +++ b/app/views/candidate/summary.html.erb @@ -15,7 +15,7 @@

<%= question.question %>

- Edit + Edit
From 3c3b7f53042de7634cff13d81c7d9d565ed70b5d Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Fri, 5 Aug 2016 09:52:11 -0500 Subject: [PATCH 085/205] fixes #37 - textarea summary edit again, and not the last --- app/assets/javascripts/summary-edit.js | 12 ++++++++++-- app/views/candidate/_text.html.erb | 4 +++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/summary-edit.js b/app/assets/javascripts/summary-edit.js index c25153b..4f94d31 100644 --- a/app/assets/javascripts/summary-edit.js +++ b/app/assets/javascripts/summary-edit.js @@ -45,10 +45,14 @@ var editClickHandler = function(e) { } }); } + else if (thisEd.find('textarea:not(.code-answer)')) { + existingValue = thisEd.find('textarea:not(.code-answer)').val(); + thisEd.find('.chars.hidden').removeClass('hidden'); + } $('.button-edit, .submit-button').addClass('disabled-button'); thisEd.addClass('editable'); - thisEd.find('.text-answer:not(.code-answer)').replaceWith(''); + // thisEd.find('.text-answer:not(.code-answer)').replaceWith(''); thisEd.find('.answer-block, .code-answer').prop('disabled', false); thisEd.find('textarea').setTextAreaHeight(height); thisEd.find('textarea.answer-block').focus(); @@ -75,10 +79,14 @@ var cancelClickHandler = function(e) { thisEd.find('input[value="'+value+'"]').prop('checked', true); }); } + else if (thisEd.find('textarea:not(.code-answer)')) { + thisEd.find('textarea:not(.code-answer)').val(existingValue); + thisEd.find('.chars').addClass('hidden'); + } $('.success, .error').remove(); $('.button-edit, .submit-button').removeClass('disabled-button'); thisEd.removeClass('editable'); - thisEd.find('textarea:not(.code-answer)').replaceWith('

' + $.trim(thisEd.data('answer')) + '

'); + // thisEd.find('textarea:not(.code-answer)').replaceWith('

' + $.trim(thisEd.data('answer')) + '

'); thisEd.find('.answer-block, .code-answer').prop('disabled', true); thisEd.find('.button-edit').show(); thisEd.find('.button-save, .button-cancel').hide(); diff --git a/app/views/candidate/_text.html.erb b/app/views/candidate/_text.html.erb index d910317..1c6011c 100644 --- a/app/views/candidate/_text.html.erb +++ b/app/views/candidate/_text.html.erb @@ -1,6 +1,8 @@ +<% hidden = params[:action] == 'summary' ? 'hidden' : '' %> + -
Characters remaining:
+ <%= render partial: "candidate/answer_errors", locals: {question: question, answer: @answer} %> From 61104f26b75a3bc71ed4aeb6a5731c00d5ae26f2 Mon Sep 17 00:00:00 2001 From: Jennifer Siegfried Date: Fri, 5 Aug 2016 10:58:52 -0600 Subject: [PATCH 086/205] Adjusts styling --- app/assets/stylesheets/pages/_error.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/stylesheets/pages/_error.scss b/app/assets/stylesheets/pages/_error.scss index 7b6b731..e94f826 100644 --- a/app/assets/stylesheets/pages/_error.scss +++ b/app/assets/stylesheets/pages/_error.scss @@ -27,6 +27,7 @@ [data-id="live-coder-finish-later"] { .warning { + margin-top: 0; margin-bottom: 2rem; text-align: left; padding: .5rem 1rem; From f9d1bee9172c8723c3c3518f9c0ca5b4bc1caf80 Mon Sep 17 00:00:00 2001 From: Jennifer Siegfried Date: Fri, 5 Aug 2016 10:59:03 -0600 Subject: [PATCH 087/205] Adjusts language, adds link to root url --- app/views/candidate/thankyou.html.erb | 2 +- app/views/candidate_mailer/welcome.html.erb | 2 +- app/views/recruiter_mailer/candidate_submitted.html.erb | 4 ++-- app/views/reviewer_mailer/candidate_submission.html.erb | 2 +- app/views/reviewer_mailer/candidate_submission.text.erb | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/views/candidate/thankyou.html.erb b/app/views/candidate/thankyou.html.erb index eea0ee7..c693f27 100644 --- a/app/views/candidate/thankyou.html.erb +++ b/app/views/candidate/thankyou.html.erb @@ -1,6 +1,6 @@

Your answers have been submitted. We will review and your recruiter - will contact you if we would like to set up an interview. + will be in touch.

diff --git a/app/views/candidate_mailer/welcome.html.erb b/app/views/candidate_mailer/welcome.html.erb index 1fbb890..63218f4 100644 --- a/app/views/candidate_mailer/welcome.html.erb +++ b/app/views/candidate_mailer/welcome.html.erb @@ -27,7 +27,7 @@
diff --git a/app/views/reviewer_mailer/candidate_submission.html.erb b/app/views/reviewer_mailer/candidate_submission.html.erb index f91d483..f18337c 100644 --- a/app/views/reviewer_mailer/candidate_submission.html.erb +++ b/app/views/reviewer_mailer/candidate_submission.html.erb @@ -11,7 +11,7 @@ diff --git a/app/views/reviewer_mailer/candidate_submission.text.erb b/app/views/reviewer_mailer/candidate_submission.text.erb index 41a8ed4..7ca4a38 100644 --- a/app/views/reviewer_mailer/candidate_submission.text.erb +++ b/app/views/reviewer_mailer/candidate_submission.text.erb @@ -2,4 +2,4 @@ PERFICIENT/digital SKILLS ASSESSMENT RESULTS Candidate <%= @candidate.test_hash %> has completed the Skills Assessment Test. -You can view the results here: <%= review_test_url(@candidate.test_hash) %> +You can view the results here: <%= review_test_url(@candidate.test_hash) %>. From e6f0466a10fc468da3dd5f479e4af61a2d9b6c65 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Fri, 5 Aug 2016 13:10:10 -0500 Subject: [PATCH 088/205] moved flash error --- app/views/candidate/_live_code.html.erb | 4 ++-- test/fixtures/candidates.yml | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/app/views/candidate/_live_code.html.erb b/app/views/candidate/_live_code.html.erb index 08a51ae..f64a39f 100644 --- a/app/views/candidate/_live_code.html.erb +++ b/app/views/candidate/_live_code.html.erb @@ -11,6 +11,8 @@ Please revisit this page with JavaScript enabled to modify your answer. --> +<%= render partial: "candidate/answer_errors", locals: {question: question, answer: @answer} %> +

This is a question where you will be asked to write code, and it utilizes a JavaScript-enabled @@ -33,5 +35,3 @@ # to check for JS capability/enabled %>

- -<%= render partial: "candidate/answer_errors", locals: {question: question, answer: @answer} %> diff --git a/test/fixtures/candidates.yml b/test/fixtures/candidates.yml index f845583..8cb3696 100644 --- a/test/fixtures/candidates.yml +++ b/test/fixtures/candidates.yml @@ -10,6 +10,16 @@ roy: reminded: false test_hash: NmEjDkOEKY4 +gillian: + name: Gillian Anderson + email: gillian.anderson@mailinator.com + experience: 4-6 + recruiter: recruiter + quiz: fed + completed: false + reminded: false + test_hash: fbBOCmkhVC0 + martha: name: Martha Watts email: martha.watts@mailinator.com From be74717bcd4a82a1dd01bbd13ce2d7f28ef8aa2f Mon Sep 17 00:00:00 2001 From: Jennifer Siegfried Date: Fri, 5 Aug 2016 12:11:15 -0600 Subject: [PATCH 089/205] Updates some questions for demo --- test/fixtures/questions.yml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/test/fixtures/questions.yml b/test/fixtures/questions.yml index 8b3bec8..4534b73 100644 --- a/test/fixtures/questions.yml +++ b/test/fixtures/questions.yml @@ -2,19 +2,19 @@ fed1: quiz: fed - question: Select an example of media query from below. + question: 'You have a bit of text that you want to be available for screen readers but not visible on the screen, so you set it with CSS to “visibility: hidden”. Is this the best decision?' category: CSS - input_type: radio - input_options: [ option-1, option2, "option 3"] + input_type: text + input_options: sort: 0 active: true fed2: quiz: fed - question: What are some ways you can improve a site's performance (load time)? - category: Performance + question: What function can be used to determine if a value is present in a given array? + category: JavaScript input_type: checkbox - input_options: [ option-1, option2, "option 3", option-4, option5] + input_options: [ 'indexOf()', 'present()', 'inArray()' ] sort: 1 active: true @@ -29,8 +29,8 @@ fed3: fed4: quiz: fed - question: Briefly explain the principles of Progressive Enhancement. - category: Performance + question: Does your app/website need a doctype? Why or why not? + category: HTML input_type: text input_options: sort: 3 @@ -38,10 +38,10 @@ fed4: fed5: quiz: fed - question: Which is your favorite grid system? - category: CSS + question: What is the best way to track user interaction within a group of dynamically generated child elements? + category: JavaScript input_type: radio - input_options: [ option-1, option2, "option 3"] + input_options: [ 'Dynamic listeners', 'Event delegation', 'Callback functions', 'HTML data attributes' ] sort: 4 active: true From cc0823e6f9824be0d868fa6c0036bd34e2bf42f0 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Fri, 5 Aug 2016 14:13:45 -0500 Subject: [PATCH 090/205] adding test_hash to recruiter index --- app/views/recruiter/index.html.erb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/views/recruiter/index.html.erb b/app/views/recruiter/index.html.erb index fb2412a..5acc288 100644 --- a/app/views/recruiter/index.html.erb +++ b/app/views/recruiter/index.html.erb @@ -8,6 +8,7 @@
- SKILLS ASSESSMENT RESULTS + +
PERFICIENT/digital Skills Assessment Test Results
+


-

<%= @candidate.test_hash %>

-

has completed the Skills Assesment Test.

-

You can review the results here: <%= link_to nil, review_test_url(@candidate.test_hash) %>

+

Candidate <%= @candidate.test_hash %> has completed the Skills Assessment Test.

+

You can view the results here: <%= link_to nil, review_test_url(@candidate.test_hash) %>



- Or, visit <%= root_url %> and enter your Test ID to begin your test. + Or, visit <%= link_to nil, root_url %> and enter your Test ID to begin your test. Your Test ID is: <%= @candidate.test_hash %>.

Once we have evaluated your answers, your recruiter will be in touch. Good luck!

diff --git a/app/views/recruiter_mailer/candidate_submitted.html.erb b/app/views/recruiter_mailer/candidate_submitted.html.erb index ac47946..2745ce3 100644 --- a/app/views/recruiter_mailer/candidate_submitted.html.erb +++ b/app/views/recruiter_mailer/candidate_submitted.html.erb @@ -10,8 +10,8 @@
-

<%= @candidate.name %> has completed the Skills Assessment Test.

-

Martin Ridgway will let you know if we would like to interview this candidate.

+

<%= @candidate.name %> has completed the Skills Assessment Test.

+

Martin Ridgway will let you know if we would like to interview this candidate.

Candidate <%= @candidate.test_hash %> has completed the Skills Assessment Test.

-

You can view the results here: <%= link_to nil, review_test_url(@candidate.test_hash) %>

+

You can view the results here: <%= link_to nil, review_test_url(@candidate.test_hash) %>.

+ @@ -16,6 +17,7 @@ <% @candidates.each do |candidate| %> + From e6358beec862529efd9365f1f827b9f0cd796a53 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Sun, 7 Aug 2016 09:36:08 -0500 Subject: [PATCH 091/205] move summary and questions to quiz controller --- .rubocop.yml | 1 - app/controllers/candidate_controller.rb | 114 ----------------- app/controllers/quiz_controller.rb | 119 ++++++++++++++++++ app/views/candidate/_live_code_text.html.erb | 1 - .../_answer_errors.html.erb | 0 .../{candidate => quiz}/_checkbox.html.erb | 2 +- .../{candidate => quiz}/_live_code.html.erb | 2 +- app/views/quiz/_live_code_text.html.erb | 1 + app/views/{candidate => quiz}/_radio.html.erb | 2 +- app/views/{candidate => quiz}/_text.html.erb | 2 +- .../{candidate => quiz}/live_code.html.erb | 0 .../live_code_text.html.erb | 0 .../{candidate => quiz}/question.html.erb | 0 .../{candidate => quiz}/summary.html.erb | 0 app/views/review/view.html.erb | 2 +- config/routes.rb | 44 +++---- test/controllers/candidate_controller_test.rb | 19 --- test/controllers/quiz_controller_test.rb | 28 +++++ ...s_test.rb => question_attachments_test.rb} | 2 +- test/integration/question_live_coder_test.rb | 18 +++ 20 files changed, 194 insertions(+), 163 deletions(-) create mode 100644 app/controllers/quiz_controller.rb delete mode 100644 app/views/candidate/_live_code_text.html.erb rename app/views/{candidate => quiz}/_answer_errors.html.erb (100%) rename app/views/{candidate => quiz}/_checkbox.html.erb (83%) rename app/views/{candidate => quiz}/_live_code.html.erb (93%) create mode 100644 app/views/quiz/_live_code_text.html.erb rename app/views/{candidate => quiz}/_radio.html.erb (78%) rename app/views/{candidate => quiz}/_text.html.erb (74%) rename app/views/{candidate => quiz}/live_code.html.erb (100%) rename app/views/{candidate => quiz}/live_code_text.html.erb (100%) rename app/views/{candidate => quiz}/question.html.erb (100%) rename app/views/{candidate => quiz}/summary.html.erb (100%) create mode 100644 test/controllers/quiz_controller_test.rb rename test/integration/{question_features_test.rb => question_attachments_test.rb} (94%) create mode 100644 test/integration/question_live_coder_test.rb diff --git a/.rubocop.yml b/.rubocop.yml index f214d03..e67f01d 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -46,7 +46,6 @@ Metrics/AbcSize: # TODO: remove this cop exception after refactor Metrics/ClassLength: Exclude: - - app/controllers/candidate_controller.rb - test/**/* Metrics/LineLength: diff --git a/app/controllers/candidate_controller.rb b/app/controllers/candidate_controller.rb index 59d1e77..60e93e7 100644 --- a/app/controllers/candidate_controller.rb +++ b/app/controllers/candidate_controller.rb @@ -25,40 +25,6 @@ class CandidateController < ApplicationController reset_session end - def question - qid = prep_status.current_question_id || params[:question_id] - redirect_to :summary and return if qid.nil? - prep_question qid - prep_instance_answer @question - end - - def update_answer - qid = answer_params[:question_id] || prep_status.current_question_id - @answer = prep_answer qid - send "process_#{prep_question(qid).input_type}" - end - - def live_coder - prep_question params[:question_id] - prep_instance_answer @question - prep_answer params[:question_id] - render @question.input_type, layout: false - end - - def summary - @quiz = current_candidate.my_quiz - redirect_to :question and return unless prep_status.current_question_id.nil? - end - - def update_summary - prep_status - not_completed_error = 'You must complete all questions to submit your test.' - record_error = 'There was a problem with your submission. Please try again later.' - redirect_to :summary, flash: { error: not_completed_error } and return unless @status.can_submit - redirect_to :thankyou and return if current_candidate.complete! - redirect_to :summary, flash: { error: record_error } - end - def validate candidate = Candidate.find_by(test_hash: params['test_id']) redirect_to(root_path, flash: { error: "Sorry, incorrect test id" }) and return if candidate.nil? @@ -80,84 +46,4 @@ class CandidateController < ApplicationController def send_to_oops redirect_to oops_path if current_candidate end - - def prep_question qid - @question = current_candidate.fetch_question(qid) - end - - def prep_status - @status ||= QuizStatus.new(current_candidate) - end - - def prep_instance_answer question - @answer = question.answer.nil? ? Answer.new : Answer.find(question.answer_id) - end - - def answer_params - params.require(:answer).permit( - :question_id, - :answer_id, - :radio, - :text, - checkbox: [], - live_code: [:later, :html, :css, :js], - live_code_text: [:later, :html, :css, :js, :text] - ) - end - - def prep_answer qid = answer_params[:question_id] - answer_ids = { question_id: qid, candidate_id: current_candidate.to_i } - answer = Answer.find_or_create_by(answer_ids) - answer - end - - def route_answer - if @answer.errors.present? - prep_status - prep_question answer_params[:question_id] - flash[:answer_error] = answer_params[:question_id].to_i - render :question - else - flash.delete(:answer_error) - # TODO: change params.key? to submit = save/next/summary - # redirect_to :summary and return if params.key?(:update) - redirect_to :saved and return if params.key?(:save) - redirect_to :question - end - end - - def process_text - @answer.update(answer: answer_params[:text], - saved: params.key?(:save), - submitted: params.key?(:submit)) - route_answer - end - - def process_radio - @answer.update(answer: answer_params[:radio], - saved: params.key?(:save), - submitted: params.key?(:submit)) - route_answer - end - - def process_checkbox - @answer.update(answer: answer_params[:checkbox], - saved: params.key?(:save), - submitted: params.key?(:submit)) - route_answer - end - - def process_live_code - @answer.update(answer: answer_params[:live_code].to_h, - saved: params.key?(:save), - submitted: params.key?(:submit)) - route_answer - end - - def process_live_code_text - @answer.update(answer: answer_params[:live_code_text].to_h, - saved: params.key?(:save), - submitted: params.key?(:submit)) - route_answer - end end diff --git a/app/controllers/quiz_controller.rb b/app/controllers/quiz_controller.rb new file mode 100644 index 0000000..078b029 --- /dev/null +++ b/app/controllers/quiz_controller.rb @@ -0,0 +1,119 @@ +class QuizController < ApplicationController + before_action :authorize_candidate + + def question + qid = prep_status.current_question_id || params[:question_id] + redirect_to :summary and return if qid.nil? + prep_question qid + prep_instance_answer @question + end + + def update_answer + qid = answer_params[:question_id] || prep_status.current_question_id + @answer = prep_answer qid + send "process_#{prep_question(qid).input_type}" + end + + def live_coder + prep_question params[:question_id] + prep_instance_answer @question + prep_answer params[:question_id] + render @question.input_type, layout: false + end + + def summary + @quiz = current_candidate.my_quiz + redirect_to :question and return unless prep_status.current_question_id.nil? + end + + def update_summary + prep_status + not_completed_error = 'You must complete all questions to submit your test.' + record_error = 'There was a problem with your submission. Please try again later.' + redirect_to :summary, flash: { error: not_completed_error } and return unless @status.can_submit + redirect_to :thankyou and return if current_candidate.complete! + redirect_to :summary, flash: { error: record_error } + end + + private + + def prep_question qid + @question = current_candidate.fetch_question(qid) + end + + def prep_status + @status ||= QuizStatus.new(current_candidate) + end + + def prep_instance_answer question + @answer = question.answer.nil? ? Answer.new : Answer.find(question.answer_id) + end + + def answer_params + params.require(:answer).permit( + :question_id, + :answer_id, + :radio, + :text, + checkbox: [], + live_code: [:later, :html, :css, :js], + live_code_text: [:later, :html, :css, :js, :text] + ) + end + + def prep_answer qid = answer_params[:question_id] + answer_ids = { question_id: qid, candidate_id: current_candidate.to_i } + answer = Answer.find_or_create_by(answer_ids) + answer + end + + def route_answer + if @answer.errors.present? + prep_status + prep_question answer_params[:question_id] + flash[:answer_error] = answer_params[:question_id].to_i + render :question + else + flash.delete(:answer_error) + # TODO: change params.key? to submit = save/next/summary + # redirect_to :summary and return if params.key?(:update) + redirect_to :saved and return if params.key?(:save) + redirect_to :question + end + end + + def process_text + @answer.update(answer: answer_params[:text], + saved: params.key?(:save), + submitted: params.key?(:submit)) + route_answer + end + + def process_radio + @answer.update(answer: answer_params[:radio], + saved: params.key?(:save), + submitted: params.key?(:submit)) + route_answer + end + + def process_checkbox + @answer.update(answer: answer_params[:checkbox], + saved: params.key?(:save), + submitted: params.key?(:submit)) + route_answer + end + + def process_live_code + @answer.update(answer: answer_params[:live_code].to_h, + saved: params.key?(:save), + submitted: params.key?(:submit)) + route_answer + end + + def process_live_code_text + @answer.update(answer: answer_params[:live_code_text].to_h, + saved: params.key?(:save), + submitted: params.key?(:submit)) + route_answer + end +end diff --git a/app/views/candidate/_live_code_text.html.erb b/app/views/candidate/_live_code_text.html.erb deleted file mode 100644 index 11d5458..0000000 --- a/app/views/candidate/_live_code_text.html.erb +++ /dev/null @@ -1 +0,0 @@ -<%= render partial: "candidate/live_code", locals: {question: question, form: form} %> diff --git a/app/views/candidate/_answer_errors.html.erb b/app/views/quiz/_answer_errors.html.erb similarity index 100% rename from app/views/candidate/_answer_errors.html.erb rename to app/views/quiz/_answer_errors.html.erb diff --git a/app/views/candidate/_checkbox.html.erb b/app/views/quiz/_checkbox.html.erb similarity index 83% rename from app/views/candidate/_checkbox.html.erb rename to app/views/quiz/_checkbox.html.erb index ad86f2a..e63e23c 100644 --- a/app/views/candidate/_checkbox.html.erb +++ b/app/views/quiz/_checkbox.html.erb @@ -14,4 +14,4 @@ <% end %> -<%= render partial: "candidate/answer_errors", locals: {question: question, answer: @answer} %> +<%= render partial: "quiz/answer_errors", locals: {question: question, answer: @answer} %> diff --git a/app/views/candidate/_live_code.html.erb b/app/views/quiz/_live_code.html.erb similarity index 93% rename from app/views/candidate/_live_code.html.erb rename to app/views/quiz/_live_code.html.erb index f64a39f..a1df21f 100644 --- a/app/views/candidate/_live_code.html.erb +++ b/app/views/quiz/_live_code.html.erb @@ -11,7 +11,7 @@ Please revisit this page with JavaScript enabled to modify your answer. --> -<%= render partial: "candidate/answer_errors", locals: {question: question, answer: @answer} %> +<%= render partial: "quiz/answer_errors", locals: {question: question, answer: @answer} %>

diff --git a/app/views/quiz/_live_code_text.html.erb b/app/views/quiz/_live_code_text.html.erb new file mode 100644 index 0000000..1349b48 --- /dev/null +++ b/app/views/quiz/_live_code_text.html.erb @@ -0,0 +1 @@ +<%= render partial: "quiz/live_code", locals: {question: question, form: form} %> diff --git a/app/views/candidate/_radio.html.erb b/app/views/quiz/_radio.html.erb similarity index 78% rename from app/views/candidate/_radio.html.erb rename to app/views/quiz/_radio.html.erb index 3d1cd7d..89a2cf6 100644 --- a/app/views/candidate/_radio.html.erb +++ b/app/views/quiz/_radio.html.erb @@ -9,4 +9,4 @@

<% end %> -<%= render partial: "candidate/answer_errors", locals: {question: question, answer: @answer} %> +<%= render partial: "quiz/answer_errors", locals: {question: question, answer: @answer} %> diff --git a/app/views/candidate/_text.html.erb b/app/views/quiz/_text.html.erb similarity index 74% rename from app/views/candidate/_text.html.erb rename to app/views/quiz/_text.html.erb index 1c6011c..ba6b64d 100644 --- a/app/views/candidate/_text.html.erb +++ b/app/views/quiz/_text.html.erb @@ -5,4 +5,4 @@ -<%= render partial: "candidate/answer_errors", locals: {question: question, answer: @answer} %> +<%= render partial: "quiz/answer_errors", locals: {question: question, answer: @answer} %> diff --git a/app/views/candidate/live_code.html.erb b/app/views/quiz/live_code.html.erb similarity index 100% rename from app/views/candidate/live_code.html.erb rename to app/views/quiz/live_code.html.erb diff --git a/app/views/candidate/live_code_text.html.erb b/app/views/quiz/live_code_text.html.erb similarity index 100% rename from app/views/candidate/live_code_text.html.erb rename to app/views/quiz/live_code_text.html.erb diff --git a/app/views/candidate/question.html.erb b/app/views/quiz/question.html.erb similarity index 100% rename from app/views/candidate/question.html.erb rename to app/views/quiz/question.html.erb diff --git a/app/views/candidate/summary.html.erb b/app/views/quiz/summary.html.erb similarity index 100% rename from app/views/candidate/summary.html.erb rename to app/views/quiz/summary.html.erb diff --git a/app/views/review/view.html.erb b/app/views/review/view.html.erb index 51262c9..10f43aa 100644 --- a/app/views/review/view.html.erb +++ b/app/views/review/view.html.erb @@ -21,7 +21,7 @@ <% end %>
<%= hidden_field_tag 'answer[question_id]', question.question_id %> - <%= render partial: "candidate/#{question.input_type}", locals: {question: question, form: form} %> + <%= render partial: "quiz/#{question.input_type}", locals: {question: question, form: form} %>
diff --git a/config/routes.rb b/config/routes.rb index ba4630d..2e7b359 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,30 +1,30 @@ Rails.application.routes.draw do - post "/validate", to: "candidate#validate", as: :validate_candidate - get "/login(/:test_id)", to: "candidate#login", as: :login - get "/welcome", to: "candidate#welcome", as: :welcome - get "/saved", to: "candidate#saved", as: :saved - get "/thankyou", to: "candidate#thankyou", as: :thankyou - get "/oops", to: "candidate#oops", as: :oops + post "/validate", to: "candidate#validate", as: :validate_candidate + get "/login(/:test_id)", to: "candidate#login", as: :login + get "/welcome", to: "candidate#welcome", as: :welcome + get "/saved", to: "candidate#saved", as: :saved + get "/thankyou", to: "candidate#thankyou", as: :thankyou - post "/question(/:answer_id)", to: "candidate#update_answer", as: :post_answer - get "/question(/:question_id)", to: "candidate#question", as: :question - get "/live-coder-entry/:question_id", to: "candidate#live_coder", as: :live_coder + get "/oops", to: "candidate#oops", as: :oops - post "/summary", to: "candidate#update_summary", as: :post_summary - get "/summary", to: "candidate#summary", as: :summary + post "/question(/:answer_id)", to: "quiz#update_answer", as: :post_answer + get "/question(/:question_id)", to: "quiz#question", as: :question + get "/live-coder-entry/:question_id", to: "quiz#live_coder", as: :live_coder + post "/summary", to: "quiz#update_summary", as: :post_summary + get "/summary", to: "quiz#summary", as: :summary - get "/review/logout", to: "review#logout", as: :review_logout - post "/review/login", to: "review#auth", as: :review_auth - get "/review/login", to: "review#login", as: :review_login - get "/review", to: "review#index", as: :review - get "/review/:test_hash", to: "review#view", as: :review_test + get "/review/logout", to: "review#logout", as: :review_logout + post "/review/login", to: "review#auth", as: :review_auth + get "/review/login", to: "review#login", as: :review_login + get "/review", to: "review#index", as: :review + get "/review/:test_hash", to: "review#view", as: :review_test - get "/recruiter", to: "recruiter#index", as: :recruiter - get "/recruiter/new-candidate", to: "recruiter#new", as: :new_candidate - post "/recruiter/new-candidate", to: "recruiter#create", as: :create_candidate - get "/recruiter/logout", to: "recruiter#logout", as: :recruiter_logout - get "/recruiter/login", to: "recruiter#login", as: :recruiter_login - post "/recruiter/login", to: "recruiter#auth", as: :recruiter_auth + get "/recruiter", to: "recruiter#index", as: :recruiter + get "/recruiter/new-candidate", to: "recruiter#new", as: :new_candidate + post "/recruiter/new-candidate", to: "recruiter#create", as: :create_candidate + get "/recruiter/logout", to: "recruiter#logout", as: :recruiter_logout + get "/recruiter/login", to: "recruiter#login", as: :recruiter_login + post "/recruiter/login", to: "recruiter#auth", as: :recruiter_auth root to: "candidate#login" diff --git a/test/controllers/candidate_controller_test.rb b/test/controllers/candidate_controller_test.rb index 74006a6..4500630 100644 --- a/test/controllers/candidate_controller_test.rb +++ b/test/controllers/candidate_controller_test.rb @@ -17,15 +17,6 @@ class CandidateControllerTest < ActionDispatch::IntegrationTest get thankyou_path assert_redirected_to login_path - - get summary_path - assert_redirected_to login_path - - get question_path - assert_redirected_to login_path - - get question_path(questions(:fed1).id) - assert_redirected_to login_path end test "should auth to welcome" do @@ -71,16 +62,6 @@ class CandidateControllerTest < ActionDispatch::IntegrationTest assert_response :success end - test "should get flash message on bad radio response" do - setup_auth candidates(:martha) - qid = questions(:fed1).id - post post_answer_path, params: { answer: { question_id: qid, radio: nil } } - - assert_response :success - assert session[:test_id].present? - assert_equal qid, flash[:answer_error] - end - test "should NOT send mailers on submission" do setup_auth candidates(:dawn) diff --git a/test/controllers/quiz_controller_test.rb b/test/controllers/quiz_controller_test.rb new file mode 100644 index 0000000..41c567b --- /dev/null +++ b/test/controllers/quiz_controller_test.rb @@ -0,0 +1,28 @@ +require 'test_helper' + +class QuizControllerTest < ActionDispatch::IntegrationTest + def setup_auth candidate + post validate_candidate_url, params: { test_id: candidate.test_hash } + end + + test "should require auth and redirect" do + get summary_path + assert_redirected_to login_path + + get question_path + assert_redirected_to login_path + + get question_path(questions(:fed1).id) + assert_redirected_to login_path + end + + test "should get flash message on bad radio response" do + setup_auth candidates(:martha) + qid = questions(:fed1).id + post post_answer_path, params: { answer: { question_id: qid, radio: nil } } + + assert_response :success + assert session[:test_id].present? + assert_equal qid, flash[:answer_error] + end +end diff --git a/test/integration/question_features_test.rb b/test/integration/question_attachments_test.rb similarity index 94% rename from test/integration/question_features_test.rb rename to test/integration/question_attachments_test.rb index 73909af..103a094 100644 --- a/test/integration/question_features_test.rb +++ b/test/integration/question_attachments_test.rb @@ -1,6 +1,6 @@ require 'test_helper' -class QuestionFeatureTest < ActionDispatch::IntegrationTest +class QuestionAttachmentsTest < ActionDispatch::IntegrationTest def setup_auth candidate post validate_candidate_url, params: { test_id: candidate.test_hash } end diff --git a/test/integration/question_live_coder_test.rb b/test/integration/question_live_coder_test.rb new file mode 100644 index 0000000..b61b19f --- /dev/null +++ b/test/integration/question_live_coder_test.rb @@ -0,0 +1,18 @@ +require 'test_helper' + +class QuestionLiveCoderTest < ActionDispatch::IntegrationTest + def setup_auth candidate + post validate_candidate_url, params: { test_id: candidate.test_hash } + end + + test "can load a live coder question" do + setup_auth candidates(:dawn) + question = questions(:fed7) + + get question_path(question.id) + assert_response :success + assert_select '.question-text', question.question + # TODO: add in capybara and test form post + # assert_redirected summary_path + end +end From ac1c618a747e71a1ca2dd8238a297c9ce187dead Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Mon, 8 Aug 2016 11:56:42 -0500 Subject: [PATCH 092/205] cleaned up progress bar display logic #47 --- app/views/layouts/application.html.erb | 30 ++++++++++++++------------ app/views/quiz/question.html.erb | 11 +--------- app/views/quiz/summary.html.erb | 8 +++++-- 3 files changed, 23 insertions(+), 26 deletions(-) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 3805059..52e97f8 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -11,26 +11,28 @@
- <% if content_for?(:category) %> -
> -
+
> +
+ <% if content_for?(:category) %>
Section: <%= yield(:category) %>
-
-
- - <% else %> - -
-
+ <% else %>
Perficient Digital Skills Assessment
-
-
- - <% end %> + <% end %> +
+
<%= yield %> + <% if content_for?(:progress) %> +
+
+ <%= yield :progress %>% +
+
+ <% end %> +
<%= render partial: 'layouts/footer' %> <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> diff --git a/app/views/quiz/question.html.erb b/app/views/quiz/question.html.erb index 9337177..4b175d3 100644 --- a/app/views/quiz/question.html.erb +++ b/app/views/quiz/question.html.erb @@ -1,8 +1,8 @@ <% content_for :title, "Skills Assessment" content_for :category, @question.category - content_for :summary, true if @status.on_summary content_for :footer_title, "Skills Assessment" + content_for :progress, @status.progress.to_s %> <%= form_for(@answer, url: post_answer_path(@answer.id), html:{method: :post, id: 'answer-form', data: {qid: @question.question_id}}) do |form| %> @@ -37,12 +37,3 @@ <% end %> <% end %> - -<% unless @status.on_summary %> -
-
- <%= @status.progress %>% -
-
-<% end %> diff --git a/app/views/quiz/summary.html.erb b/app/views/quiz/summary.html.erb index 46558b8..8e44fbc 100644 --- a/app/views/quiz/summary.html.erb +++ b/app/views/quiz/summary.html.erb @@ -1,3 +1,9 @@ +<% + content_for :title, "Skills Assessment" + content_for :footer_title, "Skills Assessment" + content_for :progress, @status.progress.to_s +%> +

Almost done!

@@ -42,6 +48,4 @@ <% else %>

Sorry, you must answer all questions before you can submit.
<% end %> - -
From d301547660d636b8b0e8d5fcec88819b606e3317 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Mon, 8 Aug 2016 12:03:11 -0500 Subject: [PATCH 093/205] removed extra quotes from classname --- app/views/layouts/application.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 52e97f8..80a05f8 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -12,7 +12,7 @@
-
> +
>
<% if content_for?(:category) %>
Section: <%= yield(:category) %>
From 5f395dcf4124c7b8615a3beb20e0384797a38bfc Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Mon, 8 Aug 2016 17:08:20 -0500 Subject: [PATCH 094/205] live coder refactor fixes #36 and #50 --- app/assets/javascripts/application.js | 2 +- app/assets/javascripts/live-coder.js.erb | 28 ++------- app/assets/javascripts/summary-edit.js | 10 --- app/assets/javascripts/test-builder.js | 66 -------------------- app/controllers/quiz_controller.rb | 8 +-- app/views/quiz/_checkbox.html.erb | 3 +- app/views/quiz/_live_code.html.erb | 37 ++++++++--- app/views/quiz/_live_code_text.html.erb | 58 ++++++++++++++++- app/views/quiz/_radio.html.erb | 3 +- app/views/quiz/_text.html.erb | 9 ++- app/views/quiz/live_code.html.erb | 18 ------ app/views/quiz/live_code_text.html.erb | 21 ------- app/views/quiz/question.html.erb | 2 +- app/views/quiz/summary.html.erb | 3 +- app/views/review/view.html.erb | 2 +- config/routes.rb | 1 - test/integration/question_live_coder_test.rb | 11 ++++ 17 files changed, 117 insertions(+), 165 deletions(-) delete mode 100644 app/assets/javascripts/test-builder.js delete mode 100644 app/views/quiz/live_code.html.erb delete mode 100644 app/views/quiz/live_code_text.html.erb diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 71d4d97..e716f6f 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -15,9 +15,9 @@ //= require turbolinks //= require modernizr-lite/modernizr //= require jquery-linedtextarea-moser + //= require button-group //= require form-animation //= require summary-edit -//= require test-builder //= require textarea-limit //= require live-coder diff --git a/app/assets/javascripts/live-coder.js.erb b/app/assets/javascripts/live-coder.js.erb index 0847e6e..ffc2a64 100644 --- a/app/assets/javascripts/live-coder.js.erb +++ b/app/assets/javascripts/live-coder.js.erb @@ -1,5 +1,4 @@ -function updateResults(elem) { - var resultsContainer = $(elem).find('[data-id="results"]')[0]; +function updateResults(elem) { var resultsContainer = $(elem).find('[data-id="results"]')[0]; var codeHtml = $(elem).find('.code-html')[0].value.trim(); var codeCss = $(elem).find('.code-css')[0].value.trim(); var codeJs = $(elem).find('.code-js')[0].value.trim(); @@ -92,22 +91,8 @@ function indentSelection(e){ } } -function loadLiveCoders(){ - $.each($('.answer-sec.live_code-type, .answer-sec.live_code_text-type'), function(index, elem){ - var qid = $(elem).data('qid'); - $(elem).find("[data-id='live-coder-answer']").load("/live-coder-entry/" + qid, function(){ - $(elem).find('.js-error').addClass('hidden'); - $(elem).find(".code-input textarea").linedtextarea(); - if(window.location.href.indexOf("summary") > -1) { - $(elem).find(".code-input textarea").attr('disabled', true); - } - updateResults(this); - }); - }); -} timer = 0; - $(function(){ // wait a half second before updating results // restart the timer if they resume typing @@ -117,14 +102,13 @@ $(function(){ timer = setTimeout(updateResults(elem), 500); }); + $("[data-id=live-coder-answer]").each(function(){ + updateResults(this); + }); + $("html").on('keydown', "textarea[data-id^=code-]", function(e){ indentSelection(e); }); - $.when(loadLiveCoders()).done(function(){ - //simple live coder for summary page - $("[data-id=live-coder-no-js], [data-id=live-coder-finish-later]").addClass('hidden'); - $("[data-id=live-coder]").removeClass('hidden'); - }); - + $(".code-input textarea").linedtextarea(); }); diff --git a/app/assets/javascripts/summary-edit.js b/app/assets/javascripts/summary-edit.js index 4f94d31..2611acc 100644 --- a/app/assets/javascripts/summary-edit.js +++ b/app/assets/javascripts/summary-edit.js @@ -177,16 +177,6 @@ $('.answer-block').prop('disabled', true); // Question events $('.answer-sec') .find('.button-cancel, .button-save').hide().end() - // delegating events .on('click', '.button-edit', editClickHandler) .on('click', '.button-cancel', cancelClickHandler) .on('click', '.button-save', saveClickHandler); - - // Dynamically load in coders -$.each($('.answer-sec.live_code-type, .answer-sec.live_code_text-type'), function(index, elem){ - var qid = $(elem).data('qid'); - $(elem).find("[data-id='live-coder-answer']").load("/live-coder-entry/" + qid, function(){ - $(elem).find('.js-error').addClass('hidden'); - $(elem).find(".code-input textarea").linedtextarea(); - }); -}); diff --git a/app/assets/javascripts/test-builder.js b/app/assets/javascripts/test-builder.js deleted file mode 100644 index 25fca79..0000000 --- a/app/assets/javascripts/test-builder.js +++ /dev/null @@ -1,66 +0,0 @@ -$(document).ready(function() { - //$(".answer_container").hide(); - //$(".test-builder-success").hide(); - //$(".question-edit-container").hide(); - - $(".skills-app-form").each(function () { - var thisQu = $(this), - questionOf = thisQu.find(".question-block").text(); - - - thisQu.find(".testbuilderquestion").val(questionOf); - - thisQu.find(".answer_type").change(function(){ - if ( $(this).val() == "1" ) { - thisQu.find(".answer_container").hide(); - thisQu.find(".answer_container.answer_text").show(); - } - if ( $(this).val() == "2" ) { - thisQu.find(".answer_container").hide(); - thisQu.find(".answer_container.answer_multiple").show(); - } - if ( $(this).val() == "3" ) { - thisQu.find(".answer_container").hide(); - thisQu.find(".answer_container.answer_multiple").show(); - } - }); - thisQu.find(".test-builder-edit").click(function(){ - thisQu.find(".question-display").slideUp().fadeOut(); - thisQu.find(".question-edit-container").slideDown().fadeIn(); - }); - thisQu.find(".btn-saveedit").click(function(){ - if(thisQu.valid()) { - thisQu.find(".question-display").slideDown().fadeIn(); - thisQu.find(".question-edit-container").slideUp().fadeOut(); - thisQu.find(".test-builder-success").slideDown().fadeIn(); - thisQu.find(".test-builder-success").delay(3000).slideUp().fadeOut(); - } - }); - thisQu.find(".btn-cancel-edit").click(function(){ - thisQu.find(".question-display").slideDown().fadeIn(); - thisQu.find(".question-edit-container").slideUp().fadeOut(); - }); - thisQu.find(".btn-cancel").click(function(){ - thisQu.find(".answer_container").hide(); - }); - thisQu.find(".skills-app-form").submit(function() { - return false; - }); - thisQu.find(".test-builder-save").click(function(){ - if(thisQu.valid()) { - thisQu.find(".answer_container").hide(); - thisQu.find(".test-builder-success").slideDown(); - thisQu.find(".test-builder-success").delay(3000).slideUp(); - } - else { - thisQu.find(".form-validation-script:invalid").css("border-color", "red"); - } - }); - thisQu.find( ".btn-save" ).click(function() { - if(thisQu.valid()) { - window.location.href = "test-builder-success.html"; - } - }); - }); - -}); \ No newline at end of file diff --git a/app/controllers/quiz_controller.rb b/app/controllers/quiz_controller.rb index 078b029..e87593d 100644 --- a/app/controllers/quiz_controller.rb +++ b/app/controllers/quiz_controller.rb @@ -5,6 +5,7 @@ class QuizController < ApplicationController qid = prep_status.current_question_id || params[:question_id] redirect_to :summary and return if qid.nil? prep_question qid + @answer = prep_answer qid prep_instance_answer @question end @@ -14,13 +15,6 @@ class QuizController < ApplicationController send "process_#{prep_question(qid).input_type}" end - def live_coder - prep_question params[:question_id] - prep_instance_answer @question - prep_answer params[:question_id] - render @question.input_type, layout: false - end - def summary @quiz = current_candidate.my_quiz redirect_to :question and return unless prep_status.current_question_id.nil? diff --git a/app/views/quiz/_checkbox.html.erb b/app/views/quiz/_checkbox.html.erb index e63e23c..4e8a2b5 100644 --- a/app/views/quiz/_checkbox.html.erb +++ b/app/views/quiz/_checkbox.html.erb @@ -7,6 +7,7 @@ name: "answer[checkbox][]", checked: Array(question.answer).include?(option) } + answers = answer.try(:answer) || answer %>
<%= form.check_box(:answer, checkbox_html, option, '') %> @@ -14,4 +15,4 @@
<% end %> -<%= render partial: "quiz/answer_errors", locals: {question: question, answer: @answer} %> +<%= render partial: "quiz/answer_errors", locals: {question: question, answer: answer} %> diff --git a/app/views/quiz/_live_code.html.erb b/app/views/quiz/_live_code.html.erb index a1df21f..20de13f 100644 --- a/app/views/quiz/_live_code.html.erb +++ b/app/views/quiz/_live_code.html.erb @@ -1,19 +1,17 @@ <% option_id = "#{question.question_id}_finish-later" - checkbox_html = {class: 'checkbox', id: "answer_#{option_id}", name: "answer[#{question.input_type}][later]", checked: Array(question.answer).include?('finish-later') } + disabled = local_assigns.fetch :disable_input, false + answers = answer.try(:answer) || answer %> - -<%= render partial: "quiz/answer_errors", locals: {question: question, answer: @answer} %> +<%= render partial: "quiz/answer_errors", locals: {question: question, answer: answer} %> -
+

This is a question where you will be asked to write code, and it utilizes a JavaScript-enabled environment. It looks like JavaScript is not loaded. @@ -30,8 +28,27 @@ <% end %>

-
- <% # answers inserted dynamically via jQuery .load() - # to check for JS capability/enabled - %> + + + diff --git a/app/views/quiz/_live_code_text.html.erb b/app/views/quiz/_live_code_text.html.erb index 1349b48..636234a 100644 --- a/app/views/quiz/_live_code_text.html.erb +++ b/app/views/quiz/_live_code_text.html.erb @@ -1 +1,57 @@ -<%= render partial: "quiz/live_code", locals: {question: question, form: form} %> +<% + option_id = "#{question.question_id}_finish-later" + checkbox_html = {class: 'checkbox', + id: "answer_#{option_id}", + name: "answer[#{question.input_type}][later]", + checked: Array(question.answer).include?('finish-later') + } + disabled = local_assigns.fetch :disable_input, false + answers = answer.try(:answer) || answer +%> + +<%= render partial: "quiz/answer_errors", locals: {question: question, answer: answer} %> + +
+

+ This is a question where you will be asked to write code, and it utilizes a JavaScript-enabled + environment. It looks like JavaScript is not loaded. + <% unless params[:action] == 'summary' %> + Please check the box below to acknowledge that you agree to come back at a later time to finish + answering this question before you can submit the test. + <% else %> + You will need to enable JavaScript and answer this question before you can submit the test. + <% end %> +

+ <% unless params[:action] == 'summary' %> + <%= form.check_box(:answer, checkbox_html, true, '') %> + <%= form.label(option_id, 'I will come back later to finish this code question') %> + <% end %> +
+ + + + diff --git a/app/views/quiz/_radio.html.erb b/app/views/quiz/_radio.html.erb index 89a2cf6..daa7bdf 100644 --- a/app/views/quiz/_radio.html.erb +++ b/app/views/quiz/_radio.html.erb @@ -2,6 +2,7 @@ question.input_options.each do | option | option_id = "#{option.parameterize}_#{question.to_i}" radio_html = {class: 'radio', id: option_id} + answers = answer.try(:answer) || answer %>
<%= radio_button_tag('answer[radio]', option, (question.answer == option), radio_html) %> @@ -9,4 +10,4 @@
<% end %> -<%= render partial: "quiz/answer_errors", locals: {question: question, answer: @answer} %> +<%= render partial: "quiz/answer_errors", locals: {question: question, answer: answer} %> diff --git a/app/views/quiz/_text.html.erb b/app/views/quiz/_text.html.erb index ba6b64d..8c4b484 100644 --- a/app/views/quiz/_text.html.erb +++ b/app/views/quiz/_text.html.erb @@ -1,8 +1,11 @@ -<% hidden = params[:action] == 'summary' ? 'hidden' : '' %> +<% + hidden = params[:action] == 'summary' ? 'hidden' : '' + answers = answer.try(:answer) || answer +%> - + -<%= render partial: "quiz/answer_errors", locals: {question: question, answer: @answer} %> +<%= render partial: "quiz/answer_errors", locals: {question: question, answer: answer} %> diff --git a/app/views/quiz/live_code.html.erb b/app/views/quiz/live_code.html.erb deleted file mode 100644 index 5145907..0000000 --- a/app/views/quiz/live_code.html.erb +++ /dev/null @@ -1,18 +0,0 @@ -<% answer = @answer.answer || {} %> - -
- - <%= text_area_tag 'answer[live_code][html]', (answer['html']), { 'data-id' => 'code-html', class: 'code-answer code-html' } %> -
- -
- - <%= text_area_tag 'answer[live_code][css]', (answer['css']), { 'data-id' => 'code-css', class: 'code-answer code-css' } %> -
- -
- - <%= text_area_tag 'answer[live_code][js]', (answer['js']), { 'data-id' => 'code-js', class: 'code-answer code-js' } %> -
- -
diff --git a/app/views/quiz/live_code_text.html.erb b/app/views/quiz/live_code_text.html.erb deleted file mode 100644 index 6041199..0000000 --- a/app/views/quiz/live_code_text.html.erb +++ /dev/null @@ -1,21 +0,0 @@ -<% answer = @answer.answer || {} %> - - -<%= text_area_tag 'answer[live_code_text][text]', (answer['text']) %> - -
- - <%= text_area_tag 'answer[live_code_text][html]', (answer['html']), { 'data-id' => 'code-html', class: 'code-answer code-html' } %> -
- -
- - <%= text_area_tag 'answer[live_code_text][css]', (answer['css']), { 'data-id' => 'code-css', class: 'code-answer code-css' } %> -
- -
- - <%= text_area_tag 'answer[live_code_text][js]', (answer['js']), { 'data-id' => 'code-js', class: 'code-answer code-js' } %> -
- -
diff --git a/app/views/quiz/question.html.erb b/app/views/quiz/question.html.erb index 4b175d3..21cd044 100644 --- a/app/views/quiz/question.html.erb +++ b/app/views/quiz/question.html.erb @@ -16,7 +16,7 @@
<%= hidden_field_tag 'answer[question_id]', @question.question_id %> <%= hidden_field_tag 'answer[answer_id]', @question.answer_id %> - <%= render partial: @question.input_type, locals: {question: @question, form: form} %> + <%= render partial: @question.input_type, locals: {question: @question, form: form, answer: @answer } %>
<% if @status.on_summary %> diff --git a/app/views/quiz/summary.html.erb b/app/views/quiz/summary.html.erb index 8e44fbc..b843f87 100644 --- a/app/views/quiz/summary.html.erb +++ b/app/views/quiz/summary.html.erb @@ -34,7 +34,8 @@
<%= hidden_field_tag 'answer[question_id]', question.question_id %> - <%= render partial: question.input_type, locals: {question: question, form: form} %> + <%= hidden_field_tag 'answer[answer_id]', question.answer_id %> + <%= render partial: question.input_type, locals: {question: question, form: form, answer: question.answer, disable_input: true} %>
diff --git a/app/views/review/view.html.erb b/app/views/review/view.html.erb index 10f43aa..6030fa6 100644 --- a/app/views/review/view.html.erb +++ b/app/views/review/view.html.erb @@ -21,7 +21,7 @@ <% end %>
<%= hidden_field_tag 'answer[question_id]', question.question_id %> - <%= render partial: "quiz/#{question.input_type}", locals: {question: question, form: form} %> + <%= render partial: "quiz/#{question.input_type}", locals: {question: question, answer: question.answer, form: form} %>
diff --git a/config/routes.rb b/config/routes.rb index 2e7b359..847837f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -9,7 +9,6 @@ Rails.application.routes.draw do post "/question(/:answer_id)", to: "quiz#update_answer", as: :post_answer get "/question(/:question_id)", to: "quiz#question", as: :question - get "/live-coder-entry/:question_id", to: "quiz#live_coder", as: :live_coder post "/summary", to: "quiz#update_summary", as: :post_summary get "/summary", to: "quiz#summary", as: :summary diff --git a/test/integration/question_live_coder_test.rb b/test/integration/question_live_coder_test.rb index b61b19f..f0b343a 100644 --- a/test/integration/question_live_coder_test.rb +++ b/test/integration/question_live_coder_test.rb @@ -15,4 +15,15 @@ class QuestionLiveCoderTest < ActionDispatch::IntegrationTest # TODO: add in capybara and test form post # assert_redirected summary_path end + + test "can load a live coder TEXT question" do + setup_auth candidates(:dawn) + question = questions(:fed3) + + get question_path(question.id) + assert_response :success + assert_select '.question-text', question.question + # TODO: add in capybara and test form post + # assert_redirected summary_path + end end From 084a1a23269a91e2d93d72a62fbe9ca1068e84eb Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Tue, 9 Aug 2016 11:36:52 -0500 Subject: [PATCH 095/205] adding eslint --- .eslintrc.yml | 19 +++ Dockerfile | 4 + Gemfile | 2 +- Guardfile | 11 +- app/assets/javascripts/button-group.js | 2 +- app/assets/javascripts/cable.js | 12 +- .../javascripts/jquery-linedtextarea-moser.js | 154 +++++++++--------- app/assets/javascripts/live-coder.js.erb | 9 +- app/assets/javascripts/summary-edit.js | 54 +++--- app/assets/javascripts/textarea-limit.js | 50 +++--- package.json | 15 ++ start-dev.sh | 1 + start-server.sh | 1 + 13 files changed, 190 insertions(+), 144 deletions(-) create mode 100644 .eslintrc.yml create mode 100644 package.json diff --git a/.eslintrc.yml b/.eslintrc.yml new file mode 100644 index 0000000..dec7a9c --- /dev/null +++ b/.eslintrc.yml @@ -0,0 +1,19 @@ +# http://eslint.org/docs/user-guide/configuring +# http://eslint.org/docs/2.0.0/rules/ +env: + browser: true + jquery: true +extends: 'eslint:recommended' +rules: + indent: + - error + - 2 + linebreak-style: + - error + - unix + no-trailing-spaces: + - warn + quotes: off + semi: + - error + - always diff --git a/Dockerfile b/Dockerfile index befa229..e744705 100644 --- a/Dockerfile +++ b/Dockerfile @@ -19,6 +19,10 @@ RUN apt-get update \ && echo "alias la='ls -ahl'" >> /root/.bashrc \ && echo "export HISTCONTROL=ignoredups" >> /root/.bashrc +# RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - +# RUN apt-get update\ +# && apt-get install --yes nodejs + # install current Ruby RUN curl -L --progress https://github.com/postmodern/ruby-install/archive/v0.6.0.tar.gz | tar xz \ && cd ruby-install-0.6.0 \ diff --git a/Gemfile b/Gemfile index b03c04f..4529cd4 100644 --- a/Gemfile +++ b/Gemfile @@ -21,10 +21,10 @@ gem 'neat' gem 'bitters' group :development do + gem 'better_errors' gem 'rack-livereload' gem 'rails-erd' gem 'web-console' - gem 'better_errors' end group :development, :test do diff --git a/Guardfile b/Guardfile index 3a072a4..b3d22bf 100644 --- a/Guardfile +++ b/Guardfile @@ -23,7 +23,7 @@ guard :minitest, spring: true do # , all_after_pass: true end guard 'livereload' do - watch(%r{app/assets/.+\.(scss|css|js)}) + watch(%r{app/assets/.+\.(scss|css|js|erb)}) watch(%r{app/views/.+\.(erb|haml|slim)$}) watch(%r{app/controllers/.+\.rb}) watch(%r{app/helpers/.+\.rb}) @@ -31,7 +31,7 @@ guard 'livereload' do watch(%r{config/locales/.+\.yml}) # Rails Assets Pipeline - watch(%r{(app|vendor)(/assets/\w+/(.+\.(scss|css|js|html|png|jpg))).*}) do |m| + watch(%r{(app|vendor)(/assets/\w+/(.+\.(scss|css|js|erb|html|png|jpg))).*}) do |m| "/assets/#{m[3]}" end end @@ -41,3 +41,10 @@ guard :rubocop do watch(/Rakefile/) watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) } end + +# ESLint +guard :shell, all_on_start: true do + watch %r{app/assets/javascripts/*/.*} do |file| + `eslint #{file[0]}` + end +end diff --git a/app/assets/javascripts/button-group.js b/app/assets/javascripts/button-group.js index 727382b..bea798c 100644 --- a/app/assets/javascripts/button-group.js +++ b/app/assets/javascripts/button-group.js @@ -1,7 +1,7 @@ /** * Button Group Functionality */ - + $('.btn-group button').click(function() { $(this).siblings().removeClass('selected'); $(this).addClass('selected'); diff --git a/app/assets/javascripts/cable.js b/app/assets/javascripts/cable.js index 71ee1e6..24e7047 100644 --- a/app/assets/javascripts/cable.js +++ b/app/assets/javascripts/cable.js @@ -5,9 +5,9 @@ //= require_self //= require_tree ./channels -(function() { - this.App || (this.App = {}); - - App.cable = ActionCable.createConsumer(); - -}).call(this); +// (function() { +// this.App || (this.App = {}); +// +// App.cable = ActionCable.createConsumer(); +// +// }).call(this); diff --git a/app/assets/javascripts/jquery-linedtextarea-moser.js b/app/assets/javascripts/jquery-linedtextarea-moser.js index 27dced7..bea9ef9 100644 --- a/app/assets/javascripts/jquery-linedtextarea-moser.js +++ b/app/assets/javascripts/jquery-linedtextarea-moser.js @@ -1,5 +1,6 @@ /** * NOTE: MARK MOSER EDITED COPY. DO NOT USE BOWER. + * * jQuery Lined Textarea Plugin * http://alan.blog-city.com/jquerylinedtextarea.htm * @@ -29,99 +30,96 @@ * */ (function($) { + $.fn.linedtextarea = function(options) { - $.fn.linedtextarea = function(options) { + // Get the Options + var opts = $.extend({}, $.fn.linedtextarea.defaults, options); - // Get the Options - var opts = $.extend({}, $.fn.linedtextarea.defaults, options); + /* + * Helper function to make sure the line numbers are always + * kept up to the current system + */ + var fillOutLines = function(codeLines, h, lineNo){ + while ( (codeLines.height() - h ) <= 0 ){ + if ( lineNo == opts.selectedLine ) + codeLines.append("
" + lineNo + "
"); + else + codeLines.append("
" + lineNo + "
"); + + lineNo++; + } + return lineNo; + }; + + /* + * Iterate through each of the elements are to be applied to + */ + return this.each(function() { + var lineNo = 1; + var textarea = $(this); + + /* Turn off the wrapping of as we don't want to screw up the line numbers */ + textarea.attr("wrap", "off"); + textarea.css({resize:'none'}); + // var originalTextAreaWidth = textarea.outerWidth(); + + /* Wrap the text area in the elements we need */ + textarea.wrap("
"); + var linedTextAreaDiv = textarea.parent().wrap("
"); + var linedWrapDiv = linedTextAreaDiv.parent(); + + linedWrapDiv.prepend("
"); + + var linesDiv = linedWrapDiv.find(".lines"); + linesDiv.height( textarea.height() + 4 ); - /* - * Helper function to make sure the line numbers are always - * kept up to the current system - */ - var fillOutLines = function(codeLines, h, lineNo){ - while ( (codeLines.height() - h ) <= 0 ){ - if ( lineNo == opts.selectedLine ) - codeLines.append("
" + lineNo + "
"); - else - codeLines.append("
" + lineNo + "
"); + /* Draw the number bar; filling it out where necessary */ + linesDiv.append( "
" ); + var codeLinesDiv = linesDiv.find(".codelines"); + lineNo = fillOutLines( codeLinesDiv, linesDiv.height(), 1 ); - lineNo++; - } - return lineNo; - }; + /* Move the textarea to the selected line */ + if ( opts.selectedLine != -1 && !isNaN(opts.selectedLine) ){ + var fontSize = parseInt( textarea.height() / (lineNo-2) ); + var position = parseInt( fontSize * opts.selectedLine ) - (textarea.height()/2); + textarea[0].scrollTop = position; + } - /* - * Iterate through each of the elements are to be applied to - */ - return this.each(function() { - var lineNo = 1; - var textarea = $(this); - - /* Turn off the wrapping of as we don't want to screw up the line numbers */ - textarea.attr("wrap", "off"); - textarea.css({resize:'none'}); - var originalTextAreaWidth = textarea.outerWidth(); - - /* Wrap the text area in the elements we need */ - textarea.wrap("
"); - var linedTextAreaDiv = textarea.parent().wrap("
"); - var linedWrapDiv = linedTextAreaDiv.parent(); - - linedWrapDiv.prepend("
"); - - var linesDiv = linedWrapDiv.find(".lines"); - linesDiv.height( textarea.height() + 4 ); - - - /* Draw the number bar; filling it out where necessary */ - linesDiv.append( "
" ); - var codeLinesDiv = linesDiv.find(".codelines"); - lineNo = fillOutLines( codeLinesDiv, linesDiv.height(), 1 ); - - /* Move the textarea to the selected line */ - if ( opts.selectedLine != -1 && !isNaN(opts.selectedLine) ){ - var fontSize = parseInt( textarea.height() / (lineNo-2) ); - var position = parseInt( fontSize * opts.selectedLine ) - (textarea.height()/2); - textarea[0].scrollTop = position; - } - - - /* Set the width */ - // var sidebarWidth = linesDiv.outerWidth(); - // var paddingHorizontal = parseInt( linedWrapDiv.css("border-left-width") ) + parseInt( linedWrapDiv.css("border-right-width") ) + parseInt( linedWrapDiv.css("padding-left") ) + parseInt( linedWrapDiv.css("padding-right") ); - // var linedWrapDivNewWidth = originalTextAreaWidth - paddingHorizontal; - // var textareaNewWidth = originalTextAreaWidth - sidebarWidth - paddingHorizontal - 20; - // - // textarea.width( textareaNewWidth ); - // linedWrapDiv.width( linedWrapDivNewWidth ); + /* Set the width */ + // var sidebarWidth = linesDiv.outerWidth(); + // var paddingHorizontal = parseInt( linedWrapDiv.css("border-left-width") ) + parseInt( linedWrapDiv.css("border-right-width") ) + parseInt( linedWrapDiv.css("padding-left") ) + parseInt( linedWrapDiv.css("padding-right") ); + // var linedWrapDivNewWidth = originalTextAreaWidth - paddingHorizontal; + // var textareaNewWidth = originalTextAreaWidth - sidebarWidth - paddingHorizontal - 20; + // + // textarea.width( textareaNewWidth ); + // linedWrapDiv.width( linedWrapDivNewWidth ); - /* React to the scroll event */ - textarea.scroll( function(tn){ - var domTextArea = $(this)[0]; - var scrollTop = domTextArea.scrollTop; - var clientHeight = domTextArea.clientHeight; - codeLinesDiv.css( {'margin-top': (-1*scrollTop) + "px"} ); - lineNo = fillOutLines( codeLinesDiv, scrollTop + clientHeight, lineNo ); - }); + /* React to the scroll event */ + textarea.scroll( function(){ + var domTextArea = $(this)[0]; + var scrollTop = domTextArea.scrollTop; + var clientHeight = domTextArea.clientHeight; + codeLinesDiv.css( {'margin-top': (-1*scrollTop) + "px"} ); + lineNo = fillOutLines( codeLinesDiv, scrollTop + clientHeight, lineNo ); + }); - /* Should the textarea get resized outside of our control */ - textarea.resize( function(tn){ - var domTextArea = $(this)[0]; - linesDiv.height( domTextArea.clientHeight + 4 ); - }); + /* Should the textarea get resized outside of our control */ + textarea.resize( function(){ + var domTextArea = $(this)[0]; + linesDiv.height( domTextArea.clientHeight + 4 ); + }); - }); - }; + }); + }; // default options $.fn.linedtextarea.defaults = { - selectedLine: -1, - selectedClass: 'lineselect' + selectedLine: -1, + selectedClass: 'lineselect' }; })(jQuery); diff --git a/app/assets/javascripts/live-coder.js.erb b/app/assets/javascripts/live-coder.js.erb index ffc2a64..f559a09 100644 --- a/app/assets/javascripts/live-coder.js.erb +++ b/app/assets/javascripts/live-coder.js.erb @@ -1,4 +1,5 @@ -function updateResults(elem) { var resultsContainer = $(elem).find('[data-id="results"]')[0]; +function updateResults(elem) { + var resultsContainer = $(elem).find('[data-id="results"]')[0]; var codeHtml = $(elem).find('.code-html')[0].value.trim(); var codeCss = $(elem).find('.code-css')[0].value.trim(); var codeJs = $(elem).find('.code-js')[0].value.trim(); @@ -15,7 +16,9 @@ function updateResults(elem) { var resultsContainer = $(elem).find('[data-id="r var jqueryNode = document.createElement("script"); jqueryNode.setAttribute("type", "text/javascript"); - jqueryNode.setAttribute("src", "<%= "//#{ENV['full_app_url']}#{javascript_path "jquery"}" %>"); + // TODO: fix eslint runner to handle erb snippets + // jqueryNode.setAttribute("src", "<%= "//#{ENV['full_app_url']}#{javascript_path "jquery"}" %>"); + jqueryNode.setAttribute("src", "https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"); iHead.appendChild(jqueryNode); var codeStyle = document.createElement("style"); @@ -92,7 +95,7 @@ function indentSelection(e){ } -timer = 0; +var timer = 0; $(function(){ // wait a half second before updating results // restart the timer if they resume typing diff --git a/app/assets/javascripts/summary-edit.js b/app/assets/javascripts/summary-edit.js index 2611acc..e3ebf7f 100644 --- a/app/assets/javascripts/summary-edit.js +++ b/app/assets/javascripts/summary-edit.js @@ -41,7 +41,7 @@ var editClickHandler = function(e) { else if(thisEd.find('input').attr('type') == 'checkbox') { $(thisEd.find('input')).each(function() { if($(this).prop('checked') === true) { - existingValue.push($(this).val()); + existingValue.push($(this).val()); } }); } @@ -66,13 +66,13 @@ var cancelClickHandler = function(e) { var thisEd = $(e.delegateTarget); if(thisEd.find('input').attr('type') == 'radio') { $(thisEd.find('input')).each(function() { - if($(this).val()!=existingValue) { - $(this).attr('checked', false).prop('checked', false); - } - else { - $(this).prop('checked', true); - } - }); + if($(this).val()!=existingValue) { + $(this).attr('checked', false).prop('checked', false); + } + else { + $(this).prop('checked', true); + } + }); } else if(thisEd.find('input').attr('type') == 'checkbox') { $(existingValue).each(function(index, value) { @@ -137,39 +137,39 @@ var saveClickHandler = function(e) { $(thisEd).before('
Please select or enter a value.
'); } else { thisEd.find('textarea:not(.code-answer)').replaceWith('

' + $.trim(thisEd.find('textarea').val()) + '

'); - url = thisEd.closest('form').attr('action'); + var postUrl = thisEd.closest('form').attr('action'); $.ajax({ type: "POST", - url: url, + url: postUrl, data: ({ 'answer': $.extend(data, {'question_id': questionId, 'answer_id': answerId}), 'submit': true }), - success: function(data){ + success: function(){ //unused data executeQuery = true; }, - error: function(data){ + error: function(){ //unused data executeQuery = false; } }).done(function() { - if(executeQuery === true) { - $('.success, .error').remove(); - $(thisEd).before('
Your answer has been updated successfully!
'); - $(thisEd).find('.code-answer').attr('disabled', true); - } - if(executeQuery === false) { - $('.error, .success').remove(); - $(thisEd).before('
Oops! There was an error processing your request. Please try again.
'); - } + if(executeQuery === true) { + $('.success, .error').remove(); + $(thisEd).before('
Your answer has been updated successfully!
'); + $(thisEd).find('.code-answer').attr('disabled', true); + } + if(executeQuery === false) { + $('.error, .success').remove(); + $(thisEd).before('
Oops! There was an error processing your request. Please try again.
'); + } }); - $('.button-edit, .submit-button').removeClass('disabled-button'); - thisEd.removeClass('editable'); - thisEd.find('.answer-block').prop('disabled', true); - thisEd.find('.button-edit').show(); - thisEd.find('.button-save, .button-cancel').hide(); -} + $('.button-edit, .submit-button').removeClass('disabled-button'); + thisEd.removeClass('editable'); + thisEd.find('.answer-block').prop('disabled', true); + thisEd.find('.button-edit').show(); + thisEd.find('.button-save, .button-cancel').hide(); + } }; $('.answer-block').prop('disabled', true); diff --git a/app/assets/javascripts/textarea-limit.js b/app/assets/javascripts/textarea-limit.js index ca9ee07..6605f85 100644 --- a/app/assets/javascripts/textarea-limit.js +++ b/app/assets/javascripts/textarea-limit.js @@ -1,30 +1,28 @@ $(document).ready(function() { - setTextAreaLimit(); + setTextAreaLimit(); -function setTextAreaLimit() { - $.fn.extend({ - limiter: function(limit, elem) { - $('textarea').on("keyup focus show", function() { - setCount(this, elem); - }); - - function setCount(src, elem) { - if(src != undefined) { - var chars = src.value.length; - if (chars > limit) { - src.value = src.value.substr(0, limit); - chars = limit; - } - elem.html(limit - chars); - } - } - setCount($(this)[0], elem); - } + function setTextAreaLimit() { + $.fn.extend({ + limiter: function(limit, elem) { + $('textarea').on("keyup focus show", function() { + setCount(this, elem); }); - var elem = $(".chars span"); - $('textarea').limiter(1000, elem); - //$('input').limiter(1000, elem); - //$('.Question-1').addClass('active'); -} -}); \ No newline at end of file + function setCount(src, elem) { + if(src !== undefined) { + var chars = src.value.length; + if (chars > limit) { + src.value = src.value.substr(0, limit); + chars = limit; + } + elem.html(limit - chars); + } + } + setCount($(this)[0], elem); + } + }); + + var elem = $(".chars span"); + $('textarea').limiter(1000, elem); + } +}); diff --git a/package.json b/package.json new file mode 100644 index 0000000..a5660a3 --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "skill-assessment-app", + "version": "1.0.0", + "description": "This application manages quizzes intended to be used as pre-interview skill assessments.", + "dependencies": { + "bower": "^1.7.9", + "eslint": "^3.2.2" + }, + "devDependencies": {}, + "repository": { + "type": "git", + "url": "git@gitlab.perficientxd.com:pdr/skill-assessment-app.git" + }, + "license": "ISC" +} diff --git a/start-dev.sh b/start-dev.sh index 8b92cfe..beeef7c 100755 --- a/start-dev.sh +++ b/start-dev.sh @@ -2,6 +2,7 @@ if [ -d '/usr/app' ]; then cd /usr/app bundle + npm install bower install cd vendor/assets/ && bitters install && cd /usr/app diff --git a/start-server.sh b/start-server.sh index e22fe66..aa2a135 100755 --- a/start-server.sh +++ b/start-server.sh @@ -2,6 +2,7 @@ if [ -d '/usr/app' ]; then cd /usr/app bundle + npm install bower install cd vendor/assets/ && bitters install && cd /usr/app From 76bb21a15094f03c1a6d3376d86c28c72f1e6a6d Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Tue, 9 Aug 2016 23:17:35 -0500 Subject: [PATCH 096/205] summary page rebuild --- .../javascripts/jquery-linedtextarea-moser.js | 11 - app/assets/javascripts/live-coder.js.erb | 4 +- app/assets/javascripts/summary-edit.js | 228 +++++------------- app/assets/stylesheets/molecules/_forms.scss | 4 + .../stylesheets/molecules/_livecoder.scss | 14 +- app/controllers/quiz_controller.rb | 24 +- app/views/quiz/_answer_errors.html.erb | 2 +- app/views/quiz/_checkbox.html.erb | 28 +-- app/views/quiz/_live_code.html.erb | 7 +- app/views/quiz/_live_code_text.html.erb | 9 +- app/views/quiz/_radio.html.erb | 19 +- app/views/quiz/_text.html.erb | 5 +- app/views/quiz/summary.html.erb | 9 +- app/views/review/view.html.erb | 3 +- test/controllers/quiz_controller_test.rb | 2 +- test/fixtures/answers.yml | 24 +- test/workers/quiz_status_test.rb | 6 +- 17 files changed, 141 insertions(+), 258 deletions(-) diff --git a/app/assets/javascripts/jquery-linedtextarea-moser.js b/app/assets/javascripts/jquery-linedtextarea-moser.js index bea9ef9..e1059ae 100644 --- a/app/assets/javascripts/jquery-linedtextarea-moser.js +++ b/app/assets/javascripts/jquery-linedtextarea-moser.js @@ -87,17 +87,6 @@ } - /* Set the width */ - // var sidebarWidth = linesDiv.outerWidth(); - // var paddingHorizontal = parseInt( linedWrapDiv.css("border-left-width") ) + parseInt( linedWrapDiv.css("border-right-width") ) + parseInt( linedWrapDiv.css("padding-left") ) + parseInt( linedWrapDiv.css("padding-right") ); - // var linedWrapDivNewWidth = originalTextAreaWidth - paddingHorizontal; - // var textareaNewWidth = originalTextAreaWidth - sidebarWidth - paddingHorizontal - 20; - // - // textarea.width( textareaNewWidth ); - // linedWrapDiv.width( linedWrapDivNewWidth ); - - - /* React to the scroll event */ textarea.scroll( function(){ var domTextArea = $(this)[0]; diff --git a/app/assets/javascripts/live-coder.js.erb b/app/assets/javascripts/live-coder.js.erb index f559a09..d88b9e2 100644 --- a/app/assets/javascripts/live-coder.js.erb +++ b/app/assets/javascripts/live-coder.js.erb @@ -1,4 +1,6 @@ function updateResults(elem) { + if ($(elem).length ===0){return false;}; + var resultsContainer = $(elem).find('[data-id="results"]')[0]; var codeHtml = $(elem).find('.code-html')[0].value.trim(); var codeCss = $(elem).find('.code-css')[0].value.trim(); @@ -100,7 +102,7 @@ $(function(){ // wait a half second before updating results // restart the timer if they resume typing $('html').on('keyup', '.code-input textarea', function(){ - var elem = $(this).closest('.answer-sec.live_code-type, .answer-sec.live_code_text-type'); + var elem = $(this).closest("[data-id=live-coder-answer]"); if (timer) { clearTimeout(timer); } timer = setTimeout(updateResults(elem), 500); }); diff --git a/app/assets/javascripts/summary-edit.js b/app/assets/javascripts/summary-edit.js index e3ebf7f..5b2dc34 100644 --- a/app/assets/javascripts/summary-edit.js +++ b/app/assets/javascripts/summary-edit.js @@ -1,181 +1,83 @@ +/* global updateResults */ +/* TODO: remove global ^ once live-coder is properly name spaced */ /** * Summary Page Answer Editor */ +function disableForm($form){ + $form.find('fieldset').prop('disabled', true); + $form.find('textarea').prop('disabled', true); + $form.find('.button-save, .button-cancel').hide(); + $form.find('.button-edit').show(); + $form.find('.editable').removeClass('editable'); + $('.button-edit, .submit-button').removeClass('disabled-button'); +} -(function($){ - $.fn.setTextAreaHeight = function(input) { - return this.each(function(){ - var lineHeight = parseInt($(this).css('line-height')); - var rows = Math.ceil(input / lineHeight); - rows = rows === 0 ? 1 : rows; - - $(this).attr('rows', rows); - }); - }; - - $('input[type="radio"]').on('change', function() { - var inputName = $(this).attr('name'); - //$('input[name="'+inputName+'"]').attr('checked', false); - var value = $(this).attr('value'); - $('input[name="'+inputName+'"][value="'+value+'"]').attr("checked",true); - $('input[name="'+inputName+'"]').each(function() { - if($(this).val() != value) { - $(this).attr('checked', false); - } - }); +function restoreValues($form){ + $form.find('[type=radio][data-last], [type=checkbox][data-last]').each(function(){ + $(this).prop('checked', $(this).attr('data-last')); }); - // $('.run-js').hide().delay(); -}(jQuery)); + $form.find('textarea[data-last]').each(function(){ + $(this).val($(this).attr('data-last')); + }); +} -var existingValue = []; +function updateLocalValues($form){ + $form.find('[type=radio][data-last], [type=checkbox][data-last]').each(function(){ + $(this).attr('data-last', $(this).prop('checked') ? 'checked' : ''); + }); -var editClickHandler = function(e) { + $form.find('textarea[data-last]').each(function(){ + $(this).attr('data-last', $(this).val()); + }); +} + +function prepareAjax($form) { + $form.on("ajax:success", function(e, data){ + $form.prepend('
' + data.message + '
'); + disableForm($form); + updateLocalValues($form); + }).on("ajax:error", function(e, xhr) { + if (xhr.status === 400){ + $form.prepend('
' + xhr.responseJSON.join('
') + '
'); + } else { + $form.prepend('
Oops! There was an error processing your request. Please try again.
'); + } + }); +} + +function editClickHandler(e) { e.preventDefault(); - var thisEd = $(e.delegateTarget); - var height = thisEd.find('p').height(); - thisEd.data('answer', thisEd.find('p').text()); - if(thisEd.find('input').attr('type') == 'radio') { - existingValue = thisEd.find('input:checked').val(); - } - else if(thisEd.find('input').attr('type') == 'checkbox') { - $(thisEd.find('input')).each(function() { - if($(this).prop('checked') === true) { - existingValue.push($(this).val()); - } - }); - } - else if (thisEd.find('textarea:not(.code-answer)')) { - existingValue = thisEd.find('textarea:not(.code-answer)').val(); - thisEd.find('.chars.hidden').removeClass('hidden'); - } - $('.button-edit, .submit-button').addClass('disabled-button'); - thisEd.addClass('editable'); - // thisEd.find('.text-answer:not(.code-answer)').replaceWith(''); - thisEd.find('.answer-block, .code-answer').prop('disabled', false); - thisEd.find('textarea').setTextAreaHeight(height); - thisEd.find('textarea.answer-block').focus(); - thisEd.find('.button-edit').hide().delay(); - thisEd.find('.button-save, .button-cancel').show().delay(); - // thisEd.find('button.run-js').show().delay(); -}; + var $form = $(e.delegateTarget).closest('form'); + $(e.delegateTarget).addClass('editable'); + $form.find('fieldset').prop('disabled', false); + $form.find('textarea').prop('disabled', false); + $form.find('textarea').focus(); + $form.find('.button-edit').hide().delay(); + $form.find('.button-save, .button-cancel').show().delay(); +} -var cancelClickHandler = function(e) { +function cancelClickHandler(e) { e.preventDefault(); - var thisEd = $(e.delegateTarget); - if(thisEd.find('input').attr('type') == 'radio') { - $(thisEd.find('input')).each(function() { - if($(this).val()!=existingValue) { - $(this).attr('checked', false).prop('checked', false); - } - else { - $(this).prop('checked', true); - } - }); - } - else if(thisEd.find('input').attr('type') == 'checkbox') { - $(existingValue).each(function(index, value) { - thisEd.find('input[value="'+value+'"]').prop('checked', true); - }); - } - else if (thisEd.find('textarea:not(.code-answer)')) { - thisEd.find('textarea:not(.code-answer)').val(existingValue); - thisEd.find('.chars').addClass('hidden'); - } - $('.success, .error').remove(); - $('.button-edit, .submit-button').removeClass('disabled-button'); - thisEd.removeClass('editable'); - // thisEd.find('textarea:not(.code-answer)').replaceWith('

' + $.trim(thisEd.data('answer')) + '

'); - thisEd.find('.answer-block, .code-answer').prop('disabled', true); - thisEd.find('.button-edit').show(); - thisEd.find('.button-save, .button-cancel').hide(); - // thisEd.find('button.run-js').hide(); - existingValue = []; -}; + var $form = $(e.delegateTarget).closest('form'); + $form.find('.error, .success').remove(); + disableForm($form); + restoreValues($form); + updateResults($form.find("[data-id=live-coder-answer]")); +} -var saveClickHandler = function(e) { +function saveClickHandler(e) { e.preventDefault(); - var thisEd = $(e.delegateTarget); - var data =[]; - var executeQuery; - var questionId = thisEd.find('.button-edit').attr('data-questionId'); - var answerId = thisEd.find('.button-edit').attr('data-answerId'); + var $form = $(e.delegateTarget).closest('form'); + $form.find('.error, .success').remove(); + $form.submit(); +} - if (thisEd.hasClass('live_code-type')) { - var htmlAnswer = $(thisEd.find('textarea.code-html')[0]).val(); - var cssAnswer = $(thisEd.find('textarea.code-css')[0]).val(); - var jsAnswer = $(thisEd.find('textarea.code-js')[0]).val(); - data = { - 'live_code': { - 'html': htmlAnswer, - 'css': cssAnswer, - 'js': jsAnswer - } - }; - } else if(thisEd.hasClass('radio-type')) { - $(thisEd.find('input')).each(function() { - if($(this).prop('checked') === true) { - data = ({ - 'radio': $(this).val() - }); - } - }); - } else if(thisEd.hasClass('checkbox-type')) { - data = {'checkbox': []}; - - $(thisEd.find('input')).each(function() { - if($(this).prop('checked') === true) { - data.checkbox.push($(this).val()); - } - }); - } else { - data = {'text': thisEd.find('textarea').val()}; - } - - if(data === '') { - $(thisEd).before('
Please select or enter a value.
'); - } else { - thisEd.find('textarea:not(.code-answer)').replaceWith('

' + $.trim(thisEd.find('textarea').val()) + '

'); - var postUrl = thisEd.closest('form').attr('action'); - - $.ajax({ - type: "POST", - url: postUrl, - data: ({ - 'answer': $.extend(data, {'question_id': questionId, 'answer_id': answerId}), - 'submit': true - }), - success: function(){ //unused data - executeQuery = true; - }, - error: function(){ //unused data - executeQuery = false; - } - }).done(function() { - if(executeQuery === true) { - $('.success, .error').remove(); - $(thisEd).before('
Your answer has been updated successfully!
'); - $(thisEd).find('.code-answer').attr('disabled', true); - } - if(executeQuery === false) { - $('.error, .success').remove(); - $(thisEd).before('
Oops! There was an error processing your request. Please try again.
'); - } - }); - - $('.button-edit, .submit-button').removeClass('disabled-button'); - thisEd.removeClass('editable'); - thisEd.find('.answer-block').prop('disabled', true); - thisEd.find('.button-edit').show(); - thisEd.find('.button-save, .button-cancel').hide(); - } -}; - -$('.answer-block').prop('disabled', true); - -// Question events -$('.answer-sec') +$('.summary_tpl fieldset').prop('disabled', true); +$('.summary_tpl textarea').prop('disabled', true); +$('.summary_tpl form').each(function(){ prepareAjax($(this)); }); +$('.summary_tpl .answer-sec') .find('.button-cancel, .button-save').hide().end() .on('click', '.button-edit', editClickHandler) .on('click', '.button-cancel', cancelClickHandler) diff --git a/app/assets/stylesheets/molecules/_forms.scss b/app/assets/stylesheets/molecules/_forms.scss index 5a53c2d..6a0ed63 100644 --- a/app/assets/stylesheets/molecules/_forms.scss +++ b/app/assets/stylesheets/molecules/_forms.scss @@ -78,6 +78,10 @@ textarea { padding: 0 0 3rem; } +.summary_tpl textarea { + padding: 1rem 1rem 3rem; +} + [type="search"] { appearance: none; } diff --git a/app/assets/stylesheets/molecules/_livecoder.scss b/app/assets/stylesheets/molecules/_livecoder.scss index 56ef959..07ca65e 100644 --- a/app/assets/stylesheets/molecules/_livecoder.scss +++ b/app/assets/stylesheets/molecules/_livecoder.scss @@ -2,18 +2,12 @@ margin: 10px 0; textarea { - background-color: #fff; - border: 1px solid black; font-family: "Lucida Console", Monaco, monospace; font-size: 10px; // line-height: 1.6em; margin-bottom: 0; min-height: 205px; width: 100%; - - &[disabled] { - background-color: #ddd; - } } } @@ -44,12 +38,6 @@ iframe { width: 100%; } -.live-coder-summary{ - button.update-button{ - display: none; - } -} - @media only screen and (min-width: $desktop) { .code-input { float: left; @@ -107,7 +95,7 @@ iframe { .linedtextarea textarea { padding-right: 0.3em; padding-top: 0.3em; - border: 0; + border: 0 !important; } .linedwrap .lines { diff --git a/app/controllers/quiz_controller.rb b/app/controllers/quiz_controller.rb index e87593d..1b50e63 100644 --- a/app/controllers/quiz_controller.rb +++ b/app/controllers/quiz_controller.rb @@ -10,9 +10,10 @@ class QuizController < ApplicationController end def update_answer - qid = answer_params[:question_id] || prep_status.current_question_id - @answer = prep_answer qid - send "process_#{prep_question(qid).input_type}" + @answer = prep_answer answer_params[:question_id] + send "process_#{prep_question(answer_params[:question_id]).input_type}" + route_remote and return if request.xhr? + route_answer end def summary @@ -65,49 +66,50 @@ class QuizController < ApplicationController if @answer.errors.present? prep_status prep_question answer_params[:question_id] - flash[:answer_error] = answer_params[:question_id].to_i + flash[:error] = answer_params[:question_id].to_i render :question else - flash.delete(:answer_error) # TODO: change params.key? to submit = save/next/summary - # redirect_to :summary and return if params.key?(:update) redirect_to :saved and return if params.key?(:save) redirect_to :question end end + def route_remote + if @answer.errors.present? + render json: @answer.errors["answer"].to_json, status: 400 + else + render json: { message: "Your answer has been updated successfully!" }.to_json + end + end + def process_text @answer.update(answer: answer_params[:text], saved: params.key?(:save), submitted: params.key?(:submit)) - route_answer end def process_radio @answer.update(answer: answer_params[:radio], saved: params.key?(:save), submitted: params.key?(:submit)) - route_answer end def process_checkbox @answer.update(answer: answer_params[:checkbox], saved: params.key?(:save), submitted: params.key?(:submit)) - route_answer end def process_live_code @answer.update(answer: answer_params[:live_code].to_h, saved: params.key?(:save), submitted: params.key?(:submit)) - route_answer end def process_live_code_text @answer.update(answer: answer_params[:live_code_text].to_h, saved: params.key?(:save), submitted: params.key?(:submit)) - route_answer end end diff --git a/app/views/quiz/_answer_errors.html.erb b/app/views/quiz/_answer_errors.html.erb index fe8d226..2f338a7 100644 --- a/app/views/quiz/_answer_errors.html.erb +++ b/app/views/quiz/_answer_errors.html.erb @@ -1,4 +1,4 @@ -<% if flash[:answer_error] == question.question_id && answer.present? %> +<% if flash[:error] == question.question_id && answer.try(:errors) %> <% answer.errors.messages[:answer].each do |message| %>
<%= message %>
<% end %> diff --git a/app/views/quiz/_checkbox.html.erb b/app/views/quiz/_checkbox.html.erb index 4e8a2b5..f1062b3 100644 --- a/app/views/quiz/_checkbox.html.erb +++ b/app/views/quiz/_checkbox.html.erb @@ -1,18 +1,18 @@ -<% - question.input_options.each_with_index do | option, i | - option_id = "#{question.question_id}_#{i}" +<% question.input_options.each_with_index do | option, i | + option_id = "#{question.question_id}_#{i}" - checkbox_html = {class: 'checkbox', - id: "answer_#{option_id}", - name: "answer[checkbox][]", - checked: Array(question.answer).include?(option) - } - answers = answer.try(:answer) || answer -%> -
- <%= form.check_box(:answer, checkbox_html, option, '') %> - <%= form.label(option_id, option) %> -
+ checkbox_html = {class: 'checkbox', + id: "answer_#{option_id}", + name: "answer[checkbox][]", + checked: Array(question.answer).include?(option), + data: { last: Array(question.answer).include?(option) ? 'checked' : '' } + } + answers = answer.try(:answer) || answer + %> +
+ <%= form.check_box(:answer, checkbox_html, option, '') %> + <%= form.label(option_id, option) %> +
<% end %> <%= render partial: "quiz/answer_errors", locals: {question: question, answer: answer} %> diff --git a/app/views/quiz/_live_code.html.erb b/app/views/quiz/_live_code.html.erb index 20de13f..ea220bf 100644 --- a/app/views/quiz/_live_code.html.erb +++ b/app/views/quiz/_live_code.html.erb @@ -5,7 +5,6 @@ name: "answer[#{question.input_type}][later]", checked: Array(question.answer).include?('finish-later') } - disabled = local_assigns.fetch :disable_input, false answers = answer.try(:answer) || answer %> @@ -31,17 +30,17 @@
- + + + <% @candidates.each do |candidate| %> @@ -21,6 +23,8 @@ + + <% end %>
CandidateTest ID Email Experience Status
<%= candidate.name %><%= candidate.test_hash %> <%= mail_to(candidate.email) %> <%= candidate.experience %> years <%= candidate.status %>Test ID Email ExperienceStatusProgressCompletedReminded
<%= mail_to(candidate.email) %> <%= candidate.experience %> years <%= candidate.status %><%= candidate.completed ? "Submitted" : "" %><%= candidate.reminded ? "Yes" : "" %>
diff --git a/test/fixtures/answers.yml b/test/fixtures/answers.yml index e71e2de..c7f03a7 100644 --- a/test/fixtures/answers.yml +++ b/test/fixtures/answers.yml @@ -373,8 +373,9 @@ juan9: juan10: candidate: juan question: fed10 - answer: + answer: 'wibbly wobbly, timey wimey' saved: 1 submitted: true created_at: <%= DateTime.now() - 38.hours - 40.minutes %> updated_at: <%= DateTime.now() - 38.hours - 20.minutes %> + diff --git a/test/integration/question_flow_test.rb b/test/integration/question_flow_test.rb index 048ea0b..ee79aa8 100644 --- a/test/integration/question_flow_test.rb +++ b/test/integration/question_flow_test.rb @@ -31,4 +31,12 @@ class QuestionFlowTest < ActionDispatch::IntegrationTest # TODO: add in capybara and test form post # assert_redirected summary_path end + + test 'juan should be on summary with 80% complete' do + setup_auth candidates(:juan) + + get summary_path + assert_response :success + assert_select '.progress span', '80%' + end end From bf71f3e4a553da95d68d939687a5570895ed86a7 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Fri, 12 Aug 2016 14:27:47 -0500 Subject: [PATCH 108/205] removed bitters from container start up scripts too. --- README.md | 1 - app/assets/stylesheets/application.scss | 1 - start-dev.sh | 1 - start-server.sh | 1 - 4 files changed, 4 deletions(-) diff --git a/README.md b/README.md index 1b2b020..b7e176c 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,6 @@ This application manages quizzes intended to be used as pre-interview skill asse * bundle * npm install * bower install -* cd vendor/assets/ && bitters install && cd ../.. * cp config/application.yml.sample config/application.yml * edit and update proper values to application.yml * rake db:setup diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 67e64a5..02a4988 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -13,7 +13,6 @@ */ @import 'bourbon'; -// @import 'base'; // bitters @import 'neat'; @import 'core/fonts'; diff --git a/start-dev.sh b/start-dev.sh index 853a113..28e3bce 100755 --- a/start-dev.sh +++ b/start-dev.sh @@ -13,7 +13,6 @@ if [ -d '/usr/app' ]; then bundle npm install bower install --allow-root - cd vendor/assets/ && bitters install && cd /usr/app rails db:setup rails db:migrate rails db:fixtures:load diff --git a/start-server.sh b/start-server.sh index 72b1b1d..0463917 100755 --- a/start-server.sh +++ b/start-server.sh @@ -13,7 +13,6 @@ if [ -d '/usr/app' ]; then bundle npm install bower install --allow-root - cd vendor/assets/ && bitters install && cd /usr/app rails db:setup rails db:migrate rails db:fixtures:load From a714d1c5a10b20081990655eb22c3ab88c1c3691 Mon Sep 17 00:00:00 2001 From: Jennifer Siegfried Date: Fri, 12 Aug 2016 13:32:03 -0600 Subject: [PATCH 109/205] Better label styling --- app/assets/stylesheets/molecules/_forms.scss | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/app/assets/stylesheets/molecules/_forms.scss b/app/assets/stylesheets/molecules/_forms.scss index d4b05de..2b2883e 100644 --- a/app/assets/stylesheets/molecules/_forms.scss +++ b/app/assets/stylesheets/molecules/_forms.scss @@ -270,19 +270,15 @@ select { } } } -.content-well { - label { - font-weight: 400; - font-style: italic; - } + +label[for="answer_text"], +label[for="answer_live_code"] { + font-weight: 400; + font-style: italic; } + .form-group-multiples { // radios, checks wrappers margin-bottom: .5rem; - - label { - font-style: normal; - font-weight: 300; - } } .button-group { From 991925f33d862e4608268e6952e9d3bb85f12290 Mon Sep 17 00:00:00 2001 From: Jennifer Siegfried Date: Fri, 12 Aug 2016 13:32:09 -0600 Subject: [PATCH 110/205] Adjusts language --- app/views/candidate/thankyou.html.erb | 1 + app/views/quiz/_live_code.html.erb | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/views/candidate/thankyou.html.erb b/app/views/candidate/thankyou.html.erb index c693f27..b796e52 100644 --- a/app/views/candidate/thankyou.html.erb +++ b/app/views/candidate/thankyou.html.erb @@ -1,4 +1,5 @@
+

Thank you!

Your answers have been submitted. We will review and your recruiter will be in touch. diff --git a/app/views/quiz/_live_code.html.erb b/app/views/quiz/_live_code.html.erb index d270a9b..1559583 100644 --- a/app/views/quiz/_live_code.html.erb +++ b/app/views/quiz/_live_code.html.erb @@ -13,8 +13,15 @@

<%= render partial: 'layouts/footer' %> - <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> + + + <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> + + diff --git a/bower.json b/bower.json index 11bb5f4..4022d5f 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,8 @@ { "name": "rails-dev", - "authors": [""], + "authors": [ + "" + ], "private": true, "dependencies": { "jquery": "1.9.1", @@ -14,5 +16,8 @@ "bower_components", "test", "tests" - ] + ], + "devDependencies": { + "html5shiv": "^3.7.3" + } } diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb index e012c15..3ef4dab 100644 --- a/config/initializers/assets.rb +++ b/config/initializers/assets.rb @@ -11,3 +11,5 @@ Rails.application.config.assets.version = '1.0' # Rails.application.config.assets.precompile += %w( search.js ) Rails.application.config.assets.precompile += ['vendor/assets/**/*'] + +Rails.application.config.assets.precompile += %w(ie9.js) From 10d69f3664c1ae4d93fdbabadd752535cb59f0fa Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Tue, 16 Aug 2016 12:08:13 -0500 Subject: [PATCH 113/205] split up answer validation test into themed files --- .rubocop.yml | 5 - Guardfile | 11 +- bower.json | 4 +- test/test_helper.rb | 2 + test/test_helpers/README.txt | 25 +++ test/test_helpers/answer_validatable.rb | 18 ++ .../answer_format_validator/checkbox_test.rb | 35 ++++ .../answer_format_validator/live_code_test.rb | 51 ++++++ .../answer_format_validator/radio_test.rb | 27 +++ .../answer_format_validator/text_test.rb | 35 ++++ .../answer_format_validator_test.rb | 165 ------------------ 11 files changed, 203 insertions(+), 175 deletions(-) create mode 100644 test/test_helpers/README.txt create mode 100644 test/test_helpers/answer_validatable.rb create mode 100644 test/validators/answer_format_validator/checkbox_test.rb create mode 100644 test/validators/answer_format_validator/live_code_test.rb create mode 100644 test/validators/answer_format_validator/radio_test.rb create mode 100644 test/validators/answer_format_validator/text_test.rb delete mode 100644 test/validators/answer_format_validator_test.rb diff --git a/.rubocop.yml b/.rubocop.yml index e67f01d..b02a7d9 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -43,11 +43,6 @@ Metrics/AbcSize: - db/migrate/**/* Max: 20 -# TODO: remove this cop exception after refactor -Metrics/ClassLength: - Exclude: - - test/**/* - Metrics/LineLength: Max: 110 Exclude: diff --git a/Guardfile b/Guardfile index 7c89660..b58c512 100644 --- a/Guardfile +++ b/Guardfile @@ -15,11 +15,16 @@ # # and, you'll have to watch "config/Guardfile" instead of "Guardfile" -guard :minitest, spring: true do # , all_after_pass: true +guard :minitest, spring: "bin/rails test", all_after_pass: true, all_on_start: false do watch(%r{^test/test_helper\.rb$}) { 'test' } watch(%r{^test/(.*)\/?(.*)_test\.rb$}) - watch(%r{^app/(.*/)?([^/]+)\.rb$}) { |m| "test/#{m[1]}#{m[2]}_test.rb" } - watch(%r{^lib/(.*/)?([^/]+)\.rb$}) { |m| "test/lib/#{m[1]}#{m[2]}_test.rb" } + + # run tests when touching files matching: /app/**/*.rb + watch(%r{^app/(.*/)?([^/]+)\.rb$}) { |m| ["test/#{m[1]}#{m[2]}_test.rb", "test/#{m[1]}#{m[2]}"] } + + # run tests when touching files matching: /lib/**/*.rb + watch(%r{^lib/(.*/)?([^/]+)\.rb$}) { |m| ["test/lib/#{m[1]}#{m[2]}_test.rb", "test/lib/#{m[1]}#{m[2]}"] } + end guard 'livereload' do diff --git a/bower.json b/bower.json index 4022d5f..f05a02e 100644 --- a/bower.json +++ b/bower.json @@ -8,7 +8,8 @@ "jquery": "1.9.1", "jquery-validate": "", "tota11y": "", - "modernizr-lite": "*" + "modernizr-lite": "*", + "html5shiv": "^3.7.3" }, "ignore": [ "**/.*", @@ -18,6 +19,5 @@ "tests" ], "devDependencies": { - "html5shiv": "^3.7.3" } } diff --git a/test/test_helper.rb b/test/test_helper.rb index 5087494..b3eba45 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -4,6 +4,8 @@ require File.expand_path('../../config/environment', __FILE__) require 'rails/test_help' require "minitest/autorun" require 'minitest/reporters' +Dir[Rails.root.join("test/test_helpers/**/*.rb")].each { |f| require f } + Minitest::Reporters.use! [Minitest::Reporters::DefaultReporter.new(color: true)] class ActiveSupport::TestCase diff --git a/test/test_helpers/README.txt b/test/test_helpers/README.txt new file mode 100644 index 0000000..037f183 --- /dev/null +++ b/test/test_helpers/README.txt @@ -0,0 +1,25 @@ +Use this folder to store mocks, stubs, etc to make isolated testing possible. + +Some definitions borrowed from: +http://martinfowler.com/articles/mocksArentStubs.html + +* Dummy + objects are passed around but never actually used. + Usually they are just used to fill parameter lists. + +* Fake + objects actually have working implementations, but usually + take some shortcut which makes them not suitable for + production (an in memory database is a good example). + +* Stubs + provide canned answers to calls made during the test, + usually not responding at all to anything outside what's + programmed in for the test. Stubs may also record information + about calls, such as an email gateway stub that remembers the + messages it 'sent', or maybe only how many messages it 'sent'. + +* Mocks + objects pre-programmed with expectations which form a + specification of the calls they are expected to receive. + diff --git a/test/test_helpers/answer_validatable.rb b/test/test_helpers/answer_validatable.rb new file mode 100644 index 0000000..0b0e71e --- /dev/null +++ b/test/test_helpers/answer_validatable.rb @@ -0,0 +1,18 @@ +class AnswerValidatable + include ActiveModel::Validations + + attr_accessor :answer + attr_accessor :question + + validates :answer, answer_format: true + + MockQuestion = Struct.new(:input_type) + + def initialize input_type + @input_type = input_type + end + + def question + MockQuestion.new(@input_type) + end +end diff --git a/test/validators/answer_format_validator/checkbox_test.rb b/test/validators/answer_format_validator/checkbox_test.rb new file mode 100644 index 0000000..8899919 --- /dev/null +++ b/test/validators/answer_format_validator/checkbox_test.rb @@ -0,0 +1,35 @@ +require 'test_helper' + +class AnswerFormatValidatorTest < ActiveSupport::TestCase + test "checkbox should PASS with populated array" do + obj = AnswerValidatable.new('checkbox') + obj.answer = ["", "", "valid answer"] + + assert obj.valid? + assert obj.errors.messages.empty? + end + + test "checkbox should FAIL with nil" do + obj = AnswerValidatable.new('checkbox') + obj.answer = nil + + refute obj.valid? + assert_match(/select.*answer/, obj.errors.messages[:answer][0]) + end + + test "checkbox should FAIL with empty string" do + obj = AnswerValidatable.new('checkbox') + obj.answer = " " + + refute obj.valid? + assert_match(/select.*answer/, obj.errors.messages[:answer][0]) + end + + test "checkbox should FAIL with array of empty strings" do + obj = AnswerValidatable.new('checkbox') + obj.answer = ["", "", " "] + + refute obj.valid? + assert_match(/select.*answer/, obj.errors.messages[:answer][0]) + end +end diff --git a/test/validators/answer_format_validator/live_code_test.rb b/test/validators/answer_format_validator/live_code_test.rb new file mode 100644 index 0000000..9f6de95 --- /dev/null +++ b/test/validators/answer_format_validator/live_code_test.rb @@ -0,0 +1,51 @@ +require 'test_helper' + +class AnswerFormatValidatorTest < ActiveSupport::TestCase + test "live_code should PASS with populated hash" do + obj = AnswerValidatable.new('live_code') + obj.answer = { html: 'this is html', css: '', js: '', text: 'some reasons' } + + assert obj.valid? + assert obj.errors.messages.empty? + end + + test "live_code should PASS with finish later" do + obj = AnswerValidatable.new('live_code') + obj.answer = { later: "true" } + + assert obj.valid? + assert obj.errors.messages.empty? + end + + test "live_code should FAIL with nil" do + obj = AnswerValidatable.new('live_code') + obj.answer = nil + + refute obj.valid? + assert_match(/write.*code/, obj.errors.messages[:answer][0]) + end + + test "live_code should FAIL without checking finish later" do + obj = AnswerValidatable.new('live_code') + obj.answer = { later: "" } + + refute obj.valid? + assert_match(/come back/, obj.errors.messages[:answer][0]) + end + + test "live_code should FAIL without values" do + obj = AnswerValidatable.new('live_code') + obj.answer = { text: "", html: "", css: "", js: "" } + + refute obj.valid? + assert_match(/write.*code/, obj.errors.messages[:answer][0]) + end + + test "live_code should PASS with text only" do + obj = AnswerValidatable.new('live_code') + obj.answer = { html: "", css: "", js: "", text: "reasons" } + + assert obj.valid? + assert obj.errors.messages.empty? + end +end diff --git a/test/validators/answer_format_validator/radio_test.rb b/test/validators/answer_format_validator/radio_test.rb new file mode 100644 index 0000000..6629d87 --- /dev/null +++ b/test/validators/answer_format_validator/radio_test.rb @@ -0,0 +1,27 @@ +require 'test_helper' + +class AnswerFormatValidatorTest < ActiveSupport::TestCase + test "radio should pass with string" do + obj = AnswerValidatable.new('radio') + obj.answer = 'option-1' + + assert obj.valid? + assert obj.errors.messages.empty? + end + + test "radio should FAIL with nil" do + obj = AnswerValidatable.new('radio') + obj.answer = nil + + refute obj.valid? + assert_match(/select.*answer/, obj.errors.messages[:answer][0]) + end + + test "radio should FAIL with empty string" do + obj = AnswerValidatable.new('radio') + obj.answer = '' + + refute obj.valid? + assert_match(/select.*answer/, obj.errors.messages[:answer][0]) + end +end diff --git a/test/validators/answer_format_validator/text_test.rb b/test/validators/answer_format_validator/text_test.rb new file mode 100644 index 0000000..b0a8396 --- /dev/null +++ b/test/validators/answer_format_validator/text_test.rb @@ -0,0 +1,35 @@ +require 'test_helper' + +class AnswerFormatValidatorTest < ActiveSupport::TestCase + test "text should PASS with string" do + obj = AnswerValidatable.new('text') + obj.answer = "this is a valid answer" + + assert obj.valid? + assert obj.errors.messages.empty? + end + + test "text should FAIL with nil" do + obj = AnswerValidatable.new('text') + obj.answer = nil + + refute obj.valid? + assert_match(/enter.*answer/, obj.errors.messages[:answer][0]) + end + + test "text should FAIL with empry string" do + obj = AnswerValidatable.new('text') + obj.answer = " " + + refute obj.valid? + assert_match(/enter.*answer/, obj.errors.messages[:answer][0]) + end + + test "text should FAIL with more than 1000 charactures" do + obj = AnswerValidatable.new('text') + obj.answer = SecureRandom.urlsafe_base64(1001) + + refute obj.valid? + assert_match(/char.*limit.*1000.$/, obj.errors.messages[:answer][0]) + end +end diff --git a/test/validators/answer_format_validator_test.rb b/test/validators/answer_format_validator_test.rb deleted file mode 100644 index 263941c..0000000 --- a/test/validators/answer_format_validator_test.rb +++ /dev/null @@ -1,165 +0,0 @@ -require 'test_helper' - -class AnswerValidatable - include ActiveModel::Validations - - attr_accessor :answer - attr_accessor :question - - validates :answer, answer_format: true - - MockQuestion = Struct.new(:input_type) - - def initialize input_type - @input_type = input_type - end - - def question - MockQuestion.new(@input_type) - end -end - -class AnswerFormatValidatorTest < ActiveSupport::TestCase - # input_type RADIO - - test "radio should pass with string" do - obj = AnswerValidatable.new('radio') - obj.answer = 'option-1' - - assert obj.valid? - assert obj.errors.messages.empty? - end - - test "radio should FAIL with nil" do - obj = AnswerValidatable.new('radio') - obj.answer = nil - - refute obj.valid? - assert_match(/select.*answer/, obj.errors.messages[:answer][0]) - end - - test "radio should FAIL with empty string" do - obj = AnswerValidatable.new('radio') - obj.answer = '' - - refute obj.valid? - assert_match(/select.*answer/, obj.errors.messages[:answer][0]) - end - - # input_type TEXT - - test "text should PASS with string" do - obj = AnswerValidatable.new('text') - obj.answer = "this is a valid answer" - - assert obj.valid? - assert obj.errors.messages.empty? - end - - test "text should FAIL with nil" do - obj = AnswerValidatable.new('text') - obj.answer = nil - - refute obj.valid? - assert_match(/enter.*answer/, obj.errors.messages[:answer][0]) - end - - test "text should FAIL with empry string" do - obj = AnswerValidatable.new('text') - obj.answer = " " - - refute obj.valid? - assert_match(/enter.*answer/, obj.errors.messages[:answer][0]) - end - - test "text should FAIL with more than 1000 charactures" do - obj = AnswerValidatable.new('text') - obj.answer = SecureRandom.urlsafe_base64(1001) - - refute obj.valid? - assert_match(/char.*limit.*1000.$/, obj.errors.messages[:answer][0]) - end - - # input_type CHECK BOX - - test "checkbox should PASS with populated array" do - obj = AnswerValidatable.new('checkbox') - obj.answer = ["", "", "valid answer"] - - assert obj.valid? - assert obj.errors.messages.empty? - end - - test "checkbox should FAIL with nil" do - obj = AnswerValidatable.new('checkbox') - obj.answer = nil - - refute obj.valid? - assert_match(/select.*answer/, obj.errors.messages[:answer][0]) - end - - test "checkbox should FAIL with empty string" do - obj = AnswerValidatable.new('checkbox') - obj.answer = " " - - refute obj.valid? - assert_match(/select.*answer/, obj.errors.messages[:answer][0]) - end - - test "checkbox should FAIL with array of empty strings" do - obj = AnswerValidatable.new('checkbox') - obj.answer = ["", "", " "] - - refute obj.valid? - assert_match(/select.*answer/, obj.errors.messages[:answer][0]) - end - - # input_type LIVE CODER - test "live_code should PASS with populated hash" do - obj = AnswerValidatable.new('live_code') - obj.answer = { html: 'this is html', css: '', js: '', text: 'some reasons' } - - assert obj.valid? - assert obj.errors.messages.empty? - end - - test "live_code should PASS with finish later" do - obj = AnswerValidatable.new('live_code') - obj.answer = { later: "true" } - - assert obj.valid? - assert obj.errors.messages.empty? - end - - test "live_code should FAIL with nil" do - obj = AnswerValidatable.new('live_code') - obj.answer = nil - - refute obj.valid? - assert_match(/write.*code/, obj.errors.messages[:answer][0]) - end - - test "live_code should FAIL without checking finish later" do - obj = AnswerValidatable.new('live_code') - obj.answer = { later: "" } - - refute obj.valid? - assert_match(/come back/, obj.errors.messages[:answer][0]) - end - - test "live_code should FAIL without values" do - obj = AnswerValidatable.new('live_code') - obj.answer = { text: "", html: "", css: "", js: "" } - - refute obj.valid? - assert_match(/write.*code/, obj.errors.messages[:answer][0]) - end - - test "live_code should PASS with text only" do - obj = AnswerValidatable.new('live_code') - obj.answer = { html: "", css: "", js: "", text: "reasons" } - - assert obj.valid? - assert obj.errors.messages.empty? - end -end From de7ce04615de527a49c9409aaa3fdaabb100f695 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Tue, 16 Aug 2016 12:08:42 -0500 Subject: [PATCH 114/205] added watch task for erb files --- Guardfile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Guardfile b/Guardfile index b58c512..5f22305 100644 --- a/Guardfile +++ b/Guardfile @@ -25,6 +25,11 @@ guard :minitest, spring: "bin/rails test", all_after_pass: true, all_on_start: f # run tests when touching files matching: /lib/**/*.rb watch(%r{^lib/(.*/)?([^/]+)\.rb$}) { |m| ["test/lib/#{m[1]}#{m[2]}_test.rb", "test/lib/#{m[1]}#{m[2]}"] } + # run controller/integration test when touching erb files + watch(%r{^app/views/((?!_mailer).)*([^/]+)\.erb$}) { ["test/controllers", "test/integration"] } + + # run mailers/integration test when touching mailer erb files + watch(%r{^app/views/(.*_mailer/)?([^/]+)\.erb$}) { ["test/mailers", "test/integration"] } end guard 'livereload' do From f44b11fde85ddfd26f340bd32a943cd58678f430 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Tue, 16 Aug 2016 14:19:45 -0500 Subject: [PATCH 115/205] worker tests --- app/models/candidate.rb | 2 +- app/workers/candidate_quiz.rb | 3 ++- test/workers/quiz_status_test.rb | 14 ++++++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/app/models/candidate.rb b/app/models/candidate.rb index 7da2524..f4dfc84 100644 --- a/app/models/candidate.rb +++ b/app/models/candidate.rb @@ -22,7 +22,7 @@ class Candidate < ApplicationRecord end def fetch_question qid - CandidateQuiz.new(id).fetch_question(qid).first + CandidateQuiz.new(id).fetch_question(qid) end def my_quiz diff --git a/app/workers/candidate_quiz.rb b/app/workers/candidate_quiz.rb index 6b7b738..bedc7a9 100644 --- a/app/workers/candidate_quiz.rb +++ b/app/workers/candidate_quiz.rb @@ -6,7 +6,8 @@ class CandidateQuiz end def fetch_question qid - raw_quiz(qid).each_with_object([]) { |row, quiz| quiz << CandidateQuizQuestion.new(row) } + questions = raw_quiz(qid).each_with_object([]) { |row, quiz| quiz << CandidateQuizQuestion.new(row) } + questions.first end def build_my_quiz diff --git a/test/workers/quiz_status_test.rb b/test/workers/quiz_status_test.rb index ed69e1b..615eac7 100644 --- a/test/workers/quiz_status_test.rb +++ b/test/workers/quiz_status_test.rb @@ -98,4 +98,18 @@ class QuizStatusTest < ActiveSupport::TestCase assert_equal nil, status.current_question_id end + + test "richard has no_finish_laters" do + richard = candidates :richard + status = QuizStatus.new richard + + assert status.no_finish_later + end + + test "juan has some finish_laters" do + juan = candidates :juan + status = QuizStatus.new juan + + refute status.no_finish_later + end end From a3d1363842aeb46f977001123d4b99ebb49ebead Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Tue, 16 Aug 2016 14:24:37 -0500 Subject: [PATCH 116/205] ahem... new worker tests. --- Gemfile | 1 + Gemfile.lock | 7 +++ test/workers/candidate_quiz_question_test.rb | 47 ++++++++++++++++++++ test/workers/candidate_quiz_test.rb | 20 +++++++++ 4 files changed, 75 insertions(+) create mode 100644 test/workers/candidate_quiz_question_test.rb create mode 100644 test/workers/candidate_quiz_test.rb diff --git a/Gemfile b/Gemfile index 1480e53..e89e6ca 100644 --- a/Gemfile +++ b/Gemfile @@ -40,6 +40,7 @@ group :development, :test do gem 'pry-byebug' gem 'pry-rails' gem 'rubocop', '~> 0.42.0' + gem 'simplecov', require: false gem 'spring' gem 'spring-watcher-listen', '~> 2.0.0' end diff --git a/Gemfile.lock b/Gemfile.lock index 0cb5323..1ff2d1b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -58,6 +58,7 @@ GEM coderay (1.1.1) concurrent-ruby (1.0.2) debug_inspector (0.0.2) + docile (1.1.5) domain_name (0.5.20160615) unf (>= 0.0.5, < 1.0.0) em-websocket (0.5.1) @@ -220,6 +221,11 @@ GEM tilt (>= 1.1, < 3) settingslogic (2.0.9) shellany (0.0.1) + simplecov (0.12.0) + docile (~> 1.1.0) + json (>= 1.8, < 3) + simplecov-html (~> 0.10.0) + simplecov-html (0.10.0) slop (3.6.0) spring (1.7.2) spring-watcher-listen (2.0.0) @@ -288,6 +294,7 @@ DEPENDENCIES rubocop (~> 0.42.0) sass-rails (~> 5.0) settingslogic (~> 2.0.9) + simplecov spring spring-watcher-listen (~> 2.0.0) turbolinks (~> 5) diff --git a/test/workers/candidate_quiz_question_test.rb b/test/workers/candidate_quiz_question_test.rb new file mode 100644 index 0000000..7d09060 --- /dev/null +++ b/test/workers/candidate_quiz_question_test.rb @@ -0,0 +1,47 @@ +require 'test_helper' + +class CandidateQuizQuestionTest < ActiveSupport::TestCase + def setup + @row = { + "candidate_id" => "12345", + "quiz_id" => 9876, + "question_id" => 5, + "answer_id" => 6, + "question" => 'what now?', + "input_type" => 'text', + "input_options" => %w(one two three).to_yaml, + "answer" => { test: 1, foo: 'bar', cheer: 'huzzah!' }.to_yaml + } + end + + test "propper dot attributes work" do + question = CandidateQuizQuestion.new @row + + assert_equal '12345', question.candidate_id + assert_equal 9876, question.quiz_id + assert_equal 5, question.question_id + assert_equal 6, question.answer_id + assert_equal 'what now?', question.question + assert_equal 'text', question.input_type + assert_kind_of Array, question.input_options + assert_kind_of Hash, question.answer + end + + test "should handle string answer" do + question = CandidateQuizQuestion.new("answer" => "this is a text answer".to_yaml) + + assert_kind_of String, question.answer + end + + test "should handle array answer" do + question = CandidateQuizQuestion.new("answer" => %w(one two three four).to_yaml) + + assert_kind_of Array, question.answer + end + + test "should handle hash answer" do + question = CandidateQuizQuestion.new @row + + assert_kind_of Hash, question.answer + end +end diff --git a/test/workers/candidate_quiz_test.rb b/test/workers/candidate_quiz_test.rb new file mode 100644 index 0000000..0e4a0f3 --- /dev/null +++ b/test/workers/candidate_quiz_test.rb @@ -0,0 +1,20 @@ +require 'test_helper' + +class CandidateQuizTest < ActiveSupport::TestCase + test "can get quiz question" do + fed8 = questions(:fed8) + + quiz = CandidateQuiz.new candidates(:richard) + fetched = quiz.fetch_question(fed8.id) + + assert_equal fed8.id, fetched.question_id + assert_equal fed8.question, fetched.question + end + + test "can build full quiz" do + quiz = CandidateQuiz.new(candidates(:richard)).build_my_quiz + + assert_equal questions(:fed1).question, quiz.first.question + assert_equal answers(:richard10).answer, quiz[9].answer + end +end From c7111ad7ad250251f29c3bcbaf274c651b70bb08 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Tue, 16 Aug 2016 15:20:16 -0500 Subject: [PATCH 117/205] added simplecov for test coverge report --- Guardfile | 2 +- config/environments/development.rb | 4 ++++ config/environments/test.rb | 4 ++++ test/test_helper.rb | 7 ++++++ test/workers/candidate_quiz_question_test.rb | 25 +++++++++++--------- 5 files changed, 30 insertions(+), 12 deletions(-) diff --git a/Guardfile b/Guardfile index 5f22305..e686215 100644 --- a/Guardfile +++ b/Guardfile @@ -15,7 +15,7 @@ # # and, you'll have to watch "config/Guardfile" instead of "Guardfile" -guard :minitest, spring: "bin/rails test", all_after_pass: true, all_on_start: false do +guard :minitest, spring: true, all_after_pass: true, all_on_start: false do watch(%r{^test/test_helper\.rb$}) { 'test' } watch(%r{^test/(.*)\/?(.*)_test\.rb$}) diff --git a/config/environments/development.rb b/config/environments/development.rb index 6f71970..88c86ee 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -51,4 +51,8 @@ Rails.application.configure do # Use an evented file watcher to asynchronously detect changes in source code, # routes, locales, etc. This feature depends on the listen gem. config.file_watcher = ActiveSupport::EventedFileUpdateChecker + + # Disable Rails's static asset server (Apache or nginx will already do this) + config.public_file_server.enabled = false + config.eager_load = false end diff --git a/config/environments/test.rb b/config/environments/test.rb index 30587ef..bb560d5 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -39,4 +39,8 @@ Rails.application.configure do # Raises error for missing translations # config.action_view.raise_on_missing_translations = true + + # Disable Rails's static asset server (Apache or nginx will already do this) + config.public_file_server.enabled = false + config.eager_load = false end diff --git a/test/test_helper.rb b/test/test_helper.rb index b3eba45..5c9b571 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,5 +1,12 @@ ENV['RAILS_ENV'] ||= 'test' +# https://github.com/colszowka/simplecov +require 'simplecov' +SimpleCov.start 'rails' do + add_group 'Models', ['app/models', 'app/validators'] + add_group 'Services & Workers', ['app/workers', 'app/services'] +end + require File.expand_path('../../config/environment', __FILE__) require 'rails/test_help' require "minitest/autorun" diff --git a/test/workers/candidate_quiz_question_test.rb b/test/workers/candidate_quiz_question_test.rb index 7d09060..dde32f9 100644 --- a/test/workers/candidate_quiz_question_test.rb +++ b/test/workers/candidate_quiz_question_test.rb @@ -2,16 +2,12 @@ require 'test_helper' class CandidateQuizQuestionTest < ActiveSupport::TestCase def setup - @row = { - "candidate_id" => "12345", - "quiz_id" => 9876, - "question_id" => 5, - "answer_id" => 6, - "question" => 'what now?', - "input_type" => 'text', - "input_options" => %w(one two three).to_yaml, - "answer" => { test: 1, foo: 'bar', cheer: 'huzzah!' }.to_yaml - } + @row = { "candidate_id" => "12345", "quiz_id" => 9876, "question_id" => 5, "answer_id" => 6, + "input_type" => 'text', "question" => 'what now?', + "input_options" => %w(one two three).to_yaml, + "answer" => { test: 1, foo: 'bar', cheer: 'huzzah!' }.to_yaml, + "saved" => false, "submitted" => true, + "updated_at" => DateTime.parse('20160816') } end test "propper dot attributes work" do @@ -23,8 +19,15 @@ class CandidateQuizQuestionTest < ActiveSupport::TestCase assert_equal 6, question.answer_id assert_equal 'what now?', question.question assert_equal 'text', question.input_type + assert_equal false, question.saved + assert_equal true, question.submitted + assert_equal DateTime.parse('20160816'), question.updated_at + end + + test 'should handle array of input options' do + question = CandidateQuizQuestion.new @row + assert_kind_of Array, question.input_options - assert_kind_of Hash, question.answer end test "should handle string answer" do From 14bbd301ed536472da8b6a053254aaee237e944a Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Tue, 16 Aug 2016 17:09:40 -0500 Subject: [PATCH 118/205] progress on #27: test coverage over 96% --- app/controllers/quiz_controller.rb | 6 -- app/models/candidate.rb | 3 + test/controllers/candidate_controller_test.rb | 8 +++ test/controllers/quiz_controller_test.rb | 66 ++++++++++++++++++- test/controllers/recruiter_controller_test.rb | 23 ++++++- test/controllers/review_controller_test.rb | 8 +++ test/services/skill_config_test.rb | 17 +++++ test/test_helper.rb | 5 +- 8 files changed, 125 insertions(+), 11 deletions(-) create mode 100644 test/services/skill_config_test.rb diff --git a/app/controllers/quiz_controller.rb b/app/controllers/quiz_controller.rb index 0a8ce09..d604fed 100644 --- a/app/controllers/quiz_controller.rb +++ b/app/controllers/quiz_controller.rb @@ -109,10 +109,4 @@ class QuizController < ApplicationController saved: params.key?(:save), submitted: params.key?(:submit)) end - - def process_live_code_text - @answer.update(answer: answer_params[:live_code_text].to_h, - saved: params.key?(:save), - submitted: params.key?(:submit)) - end end diff --git a/app/models/candidate.rb b/app/models/candidate.rb index f4dfc84..8af27fa 100644 --- a/app/models/candidate.rb +++ b/app/models/candidate.rb @@ -37,6 +37,9 @@ class Candidate < ApplicationRecord "#{my_status.progress}%" end + # FIXME: This feels wrong here. Mail deliveries should be in controller. + # Privatize in QuizController + # also, bang methods in ruby do an action and replace, or return nil def complete! if update_attributes(completed: true) CandidateMailer.submitted(self).deliver_now diff --git a/test/controllers/candidate_controller_test.rb b/test/controllers/candidate_controller_test.rb index 4500630..d0258a1 100644 --- a/test/controllers/candidate_controller_test.rb +++ b/test/controllers/candidate_controller_test.rb @@ -55,6 +55,14 @@ class CandidateControllerTest < ActionDispatch::IntegrationTest assert_redirected_to thankyou_path end + test 'should reset session' do + setup_auth candidates(:dawn) + get thankyou_path + + assert :success + assert session[:test_id].nil? + end + test "should get summary if complete but not submitted" do setup_auth candidates(:dawn) diff --git a/test/controllers/quiz_controller_test.rb b/test/controllers/quiz_controller_test.rb index fa17727..8de42eb 100644 --- a/test/controllers/quiz_controller_test.rb +++ b/test/controllers/quiz_controller_test.rb @@ -16,13 +16,75 @@ class QuizControllerTest < ActionDispatch::IntegrationTest assert_redirected_to login_path end + # TODO: test models/candidate.complete! == false + # test 'should gracefully fail on summary submit' do + # # if the mailers fail, should go to thank you still + # end + + test "should redirect to saved on save" do + setup_auth candidates(:dawn) + qid = questions(:fed5).id + post post_answer_path, params: { save: 'Save', answer: { question_id: qid, radio: 'an option' } } + + assert_redirected_to saved_path + assert session[:test_id].present? + end + + test "should redirect to next question on next" do + setup_auth candidates(:roy) + qid = questions(:fed3).id + params = { submit: 'Next', answer: { question_id: qid, live_code: { text: 'stuff' } } } + post post_answer_path, params: params + + assert_redirected_to question_path + assert session[:test_id].present? + end + test "should get flash message on bad radio response" do - setup_auth candidates(:martha) - qid = questions(:fed1).id + setup_auth candidates(:dawn) + qid = questions(:fed5).id post post_answer_path, params: { answer: { question_id: qid, radio: nil } } assert_response :success assert session[:test_id].present? assert_equal qid, flash[:error] end + + test "should get flash message on bad text response" do + setup_auth candidates(:dawn) + qid = questions(:fed4).id + post post_answer_path, params: { answer: { question_id: qid, text: nil } } + + assert_response :success + assert session[:test_id].present? + assert_equal qid, flash[:error] + end + + test "should process checkbox" do + setup_auth candidates(:dawn) + qid = questions(:fed10).id + post post_answer_path, params: { answer: { question_id: qid, checkbox: 'an-option' } } + + assert_response :success + assert session[:test_id].present? + end + + test 'should handle XHR update and complete progress' do + setup_auth candidates(:peggy) + qid = questions(:fed10).id + post post_answer_path, xhr: true, params: { answer: { question_id: qid, checkbox: ['an-option'] } } + + assert_response :success + assert_match(/updated successfully/, JSON.parse(@response.body)['message']) + assert_equal 100, JSON.parse(@response.body)['progress'] + end + + test 'should handle XHR fail' do + setup_auth candidates(:peggy) + qid = questions(:fed10).id + post post_answer_path, xhr: true, params: { answer: { question_id: qid, checkbox: nil } } + + assert_response 400 + assert_match(/select.*answer/i, JSON.parse(@response.body).join) + end end diff --git a/test/controllers/recruiter_controller_test.rb b/test/controllers/recruiter_controller_test.rb index 6108584..5a02765 100644 --- a/test/controllers/recruiter_controller_test.rb +++ b/test/controllers/recruiter_controller_test.rb @@ -11,6 +11,14 @@ class RecruiterControllerTest < ActionDispatch::IntegrationTest assert_response :success end + test 'should logout and reset session' do + setup_auth + get recruiter_logout_path + + assert :success + assert session[:user].nil? + end + test "should require auth or redirect" do get recruiter_url assert_redirected_to recruiter_login_path @@ -55,8 +63,8 @@ class RecruiterControllerTest < ActionDispatch::IntegrationTest end test "should create new candidate" do - # recruiter = users(:recruiter) setup_auth + assert_difference("ActionMailer::Base.deliveries.size", 2) do assert_difference("Candidate.count") do post create_candidate_path, params: { candidate: @@ -66,4 +74,17 @@ class RecruiterControllerTest < ActionDispatch::IntegrationTest assert_redirected_to recruiter_path assert flash[:notice] end + + test "should fail creation with message" do + setup_auth + + assert_difference("ActionMailer::Base.deliveries.size", 0) do + assert_difference("Candidate.count", 0) do + post create_candidate_path, params: { candidate: + { name: 'new name', email: 'test@mailinatorcom', experience: '0-3', quiz_id: quizzes(:fed).id } } + end + end + assert :success + assert_match(/failed.*save/i, flash[:error]) + end end diff --git a/test/controllers/review_controller_test.rb b/test/controllers/review_controller_test.rb index aa6c188..12e92f3 100644 --- a/test/controllers/review_controller_test.rb +++ b/test/controllers/review_controller_test.rb @@ -52,4 +52,12 @@ class ReviewControllerTest < ActionDispatch::IntegrationTest get review_test_url(candidates(:richard).test_hash) assert_response :success end + + test 'should logout and reset session' do + setup_auth + get review_logout_path + + assert :success + assert session[:user].nil? + end end diff --git a/test/services/skill_config_test.rb b/test/services/skill_config_test.rb new file mode 100644 index 0000000..e72dfb5 --- /dev/null +++ b/test/services/skill_config_test.rb @@ -0,0 +1,17 @@ +require 'test_helper' + +class SkillConfigTest < ActiveSupport::TestCase + test "verify sample file exists" do + assert File.exist? "#{Rails.root}/config/application.yml.sample" + end + + test "verify config file exists" do + assert File.exist? "#{Rails.root}/config/application.yml" + end + + test 'config can load and return proper values' do + skonfig = SkillConfig.new + + assert_equal 'localhost', skonfig.mysql_host + end +end diff --git a/test/test_helper.rb b/test/test_helper.rb index 5c9b571..a65e8ac 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -3,8 +3,9 @@ ENV['RAILS_ENV'] ||= 'test' # https://github.com/colszowka/simplecov require 'simplecov' SimpleCov.start 'rails' do - add_group 'Models', ['app/models', 'app/validators'] - add_group 'Services & Workers', ['app/workers', 'app/services'] + add_group 'Models', %w(app/models app/validators) + add_group 'Services & Workers', %w(app/workers app/services) + add_group "Jobs", 'app/jobs' end require File.expand_path('../../config/environment', __FILE__) From 86c36fd7fb7f95bb25e347bc7295c0902f0e5741 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Wed, 17 Aug 2016 13:58:25 -0500 Subject: [PATCH 119/205] testing existance of instance var for views --- Gemfile | 1 + Gemfile.lock | 5 ++++ app/views/layouts/_footer.html.erb | 5 ---- app/views/layouts/application.html.erb | 7 ++++- test/controllers/quiz_controller_test.rb | 28 +++++++++++++++++++ test/controllers/recruiter_controller_test.rb | 3 ++ test/controllers/review_controller_test.rb | 4 +++ 7 files changed, 47 insertions(+), 6 deletions(-) delete mode 100644 app/views/layouts/_footer.html.erb diff --git a/Gemfile b/Gemfile index e89e6ca..651faee 100644 --- a/Gemfile +++ b/Gemfile @@ -39,6 +39,7 @@ group :development, :test do gem 'minitest-reporters' gem 'pry-byebug' gem 'pry-rails' + gem 'rails-controller-testing' gem 'rubocop', '~> 0.42.0' gem 'simplecov', require: false gem 'spring' diff --git a/Gemfile.lock b/Gemfile.lock index 1ff2d1b..a704484 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -178,6 +178,10 @@ GEM bundler (>= 1.3.0, < 2.0) railties (= 5.0.0) sprockets-rails (>= 2.0.0) + rails-controller-testing (1.0.1) + actionpack (~> 5.x) + actionview (~> 5.x) + activesupport (~> 5.x) rails-dom-testing (2.0.1) activesupport (>= 4.2.0, < 6.0) nokogiri (~> 1.6.0) @@ -290,6 +294,7 @@ DEPENDENCIES puma (~> 3.0) rack-livereload rails (~> 5.0.0) + rails-controller-testing rails-erd rubocop (~> 0.42.0) sass-rails (~> 5.0) diff --git a/app/views/layouts/_footer.html.erb b/app/views/layouts/_footer.html.erb deleted file mode 100644 index 9ba1d7e..0000000 --- a/app/views/layouts/_footer.html.erb +++ /dev/null @@ -1,5 +0,0 @@ -
- - - -
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index a66a0f9..9e37c00 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -42,7 +42,12 @@ <% end %> - <%= render partial: 'layouts/footer' %> + +
+ + + +
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> diff --git a/test/controllers/quiz_controller_test.rb b/test/controllers/quiz_controller_test.rb index 8de42eb..de17520 100644 --- a/test/controllers/quiz_controller_test.rb +++ b/test/controllers/quiz_controller_test.rb @@ -38,6 +38,24 @@ class QuizControllerTest < ActionDispatch::IntegrationTest assert_redirected_to question_path assert session[:test_id].present? + assert assigns(:question), '@question not present' + assert assigns(:answer), '@answer not present' + assert assigns(:status), '@status not present' + end + + test "should get summary" do + setup_auth candidates :dawn + get summary_path + + assert_response :success + assert assigns(:quiz), '@quiz not present' + end + + test "should redirect from summary" do + setup_auth candidates :roy + get summary_path + + assert_redirected_to question_path end test "should get flash message on bad radio response" do @@ -48,6 +66,8 @@ class QuizControllerTest < ActionDispatch::IntegrationTest assert_response :success assert session[:test_id].present? assert_equal qid, flash[:error] + assert assigns(:question), '@question not present' + assert assigns(:answer), '@answer not present' end test "should get flash message on bad text response" do @@ -58,6 +78,8 @@ class QuizControllerTest < ActionDispatch::IntegrationTest assert_response :success assert session[:test_id].present? assert_equal qid, flash[:error] + assert assigns(:question), '@question not present' + assert assigns(:answer), '@answer not present' end test "should process checkbox" do @@ -67,6 +89,8 @@ class QuizControllerTest < ActionDispatch::IntegrationTest assert_response :success assert session[:test_id].present? + assert assigns(:question), '@question not present' + assert assigns(:answer), '@answer not present' end test 'should handle XHR update and complete progress' do @@ -77,6 +101,8 @@ class QuizControllerTest < ActionDispatch::IntegrationTest assert_response :success assert_match(/updated successfully/, JSON.parse(@response.body)['message']) assert_equal 100, JSON.parse(@response.body)['progress'] + assert assigns(:question), '@question not present' + assert assigns(:answer), '@answer not present' end test 'should handle XHR fail' do @@ -86,5 +112,7 @@ class QuizControllerTest < ActionDispatch::IntegrationTest assert_response 400 assert_match(/select.*answer/i, JSON.parse(@response.body).join) + assert assigns(:question), '@question not present' + assert assigns(:answer), '@answer not present' end end diff --git a/test/controllers/recruiter_controller_test.rb b/test/controllers/recruiter_controller_test.rb index 5a02765..d63c300 100644 --- a/test/controllers/recruiter_controller_test.rb +++ b/test/controllers/recruiter_controller_test.rb @@ -48,12 +48,14 @@ class RecruiterControllerTest < ActionDispatch::IntegrationTest setup_auth get recruiter_url assert_response :success + assert assigns(:candidates), "@candidates not present" end test "should get new" do setup_auth get new_candidate_url assert_response :success + assert assigns(:candidate), "@candidate not present" end test "should get create" do @@ -85,6 +87,7 @@ class RecruiterControllerTest < ActionDispatch::IntegrationTest end end assert :success + assert assigns(:candidate), "@candidate not present" assert_match(/failed.*save/i, flash[:error]) end end diff --git a/test/controllers/review_controller_test.rb b/test/controllers/review_controller_test.rb index 12e92f3..b030c41 100644 --- a/test/controllers/review_controller_test.rb +++ b/test/controllers/review_controller_test.rb @@ -37,6 +37,7 @@ class ReviewControllerTest < ActionDispatch::IntegrationTest setup_auth get review_url assert_response :success + assert assigns(:candidates), '@candidates not present' end test "should get index" do @@ -51,6 +52,9 @@ class ReviewControllerTest < ActionDispatch::IntegrationTest get review_test_url(candidates(:richard).test_hash) assert_response :success + assert assigns(:candidate), "@candidate not present" + assert assigns(:quiz), "@quiz not present" + assert assigns(:status), "@status not present" end test 'should logout and reset session' do From 225f402c0f59921ed82f4982d18316900bb4f512 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Wed, 17 Aug 2016 14:26:54 -0500 Subject: [PATCH 120/205] fixed attachment test --- test/integration/question_attachments_test.rb | 19 ++++++++----------- test/integration/question_live_coder_test.rb | 11 ----------- 2 files changed, 8 insertions(+), 22 deletions(-) diff --git a/test/integration/question_attachments_test.rb b/test/integration/question_attachments_test.rb index 103a094..4f25a90 100644 --- a/test/integration/question_attachments_test.rb +++ b/test/integration/question_attachments_test.rb @@ -22,15 +22,12 @@ class QuestionAttachmentsTest < ActionDispatch::IntegrationTest assert_select "img[src=\"#{questions(:fed6).attachment}\"]" end - # For some reason this test fails on review, but passes on summery /shrug - # explore later - # - # test "should show attachments on review" do - # user = users :reviewer - # post review_auth_url, params: { auth: { email: user.email, password: 'password' } } - # - # get review_path(candidates(:richard).test_hash) - # assert_response :success - # assert_select "img[src=\"#{questions(:fed6).attachment}\"]" - # end + test "should show attachments on review" do + user = users :reviewer + post review_auth_url, params: { auth: { email: user.email, password: 'password' } } + + get review_test_path(candidates(:richard).test_hash) + assert_response :success + assert_select "img[src=\"#{questions(:fed6).attachment}\"]" + end end diff --git a/test/integration/question_live_coder_test.rb b/test/integration/question_live_coder_test.rb index f0b343a..b61b19f 100644 --- a/test/integration/question_live_coder_test.rb +++ b/test/integration/question_live_coder_test.rb @@ -15,15 +15,4 @@ class QuestionLiveCoderTest < ActionDispatch::IntegrationTest # TODO: add in capybara and test form post # assert_redirected summary_path end - - test "can load a live coder TEXT question" do - setup_auth candidates(:dawn) - question = questions(:fed3) - - get question_path(question.id) - assert_response :success - assert_select '.question-text', question.question - # TODO: add in capybara and test form post - # assert_redirected summary_path - end end From b16b1929b49c9c25fff24e800c1a45cba11f21af Mon Sep 17 00:00:00 2001 From: "Manny.Muriel" Date: Thu, 11 Aug 2016 14:30:57 -0700 Subject: [PATCH 121/205] Rails Email Config --- Gemfile | 4 +++ Gemfile.lock | 15 ++++++++ app/assets/stylesheets/foundation_emails.scss | 9 +++++ .../{reminder.html.erb => reminder.html.inky} | 35 ++++++------------- app/views/layouts/application.html.erb | 1 + app/views/layouts/mailer.html.erb | 20 +++++++---- .../layouts/old_mailer_1470948990.html.erb | 13 +++++++ config/initializers/assets.rb | 2 +- 8 files changed, 68 insertions(+), 31 deletions(-) create mode 100644 app/assets/stylesheets/foundation_emails.scss rename app/views/candidate_mailer/{reminder.html.erb => reminder.html.inky} (51%) create mode 100644 app/views/layouts/old_mailer_1470948990.html.erb diff --git a/Gemfile b/Gemfile index 651faee..667035c 100644 --- a/Gemfile +++ b/Gemfile @@ -19,6 +19,10 @@ gem 'uglifier', '>= 1.3.0' gem 'bourbon' gem 'neat' +# Foundation for Emails +gem 'inky-rb', require: 'inky' +gem 'premailer-rails' + group :development do gem 'better_errors' gem 'rack-livereload' diff --git a/Gemfile.lock b/Gemfile.lock index a704484..31a7bcb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -38,6 +38,7 @@ GEM i18n (~> 0.7) minitest (~> 5.1) tzinfo (~> 1.1) + addressable (2.4.0) ansi (1.5.0) arel (7.1.0) ast (2.3.0) @@ -57,6 +58,8 @@ GEM choice (0.2.0) coderay (1.1.1) concurrent-ruby (1.0.2) + css_parser (1.4.5) + addressable debug_inspector (0.0.2) docile (1.1.5) domain_name (0.5.20160615) @@ -71,6 +74,7 @@ GEM figaro (1.1.1) thor (~> 0.14) formatador (0.2.5) + foundation_emails (2.2.0.0) globalid (0.3.6) activesupport (>= 4.1.0) guard (2.14.0) @@ -97,10 +101,13 @@ GEM guard-shell (0.7.1) guard (>= 2.0.0) guard-compat (~> 1.0) + htmlentities (4.3.4) http-cookie (1.0.2) domain_name (~> 0.5) http_parser.rb (0.6.0) i18n (0.7.0) + inky-rb (1.3.6.1) + foundation_emails (~> 2) jbuilder (2.6.0) activesupport (>= 3.0.0, < 5.1) multi_json (~> 1.2) @@ -151,6 +158,12 @@ GEM ast (~> 2.2) pkg-config (1.1.7) powerpack (0.1.1) + premailer (1.8.7) + css_parser (>= 1.4.5) + htmlentities (>= 4.0.0) + premailer-rails (1.9.4) + actionmailer (>= 3, < 6) + premailer (~> 1.7, >= 1.7.9) pry (0.10.4) coderay (~> 1.1.0) method_source (~> 0.8.1) @@ -281,6 +294,7 @@ DEPENDENCIES guard-minitest guard-rubocop guard-shell + inky-rb jbuilder (~> 2.6) jquery-rails json (~> 2.0.2) @@ -289,6 +303,7 @@ DEPENDENCIES minitest-reporters mysql2 (>= 0.3.18, < 0.5) neat + premailer-rails pry-byebug pry-rails puma (~> 3.0) diff --git a/app/assets/stylesheets/foundation_emails.scss b/app/assets/stylesheets/foundation_emails.scss new file mode 100644 index 0000000..1646a71 --- /dev/null +++ b/app/assets/stylesheets/foundation_emails.scss @@ -0,0 +1,9 @@ +@import "foundation-emails"; +.pd-logo { + font-size: 28px; +} + +.email-container { + width: 100% !important; + max-width:600px; +} \ No newline at end of file diff --git a/app/views/candidate_mailer/reminder.html.erb b/app/views/candidate_mailer/reminder.html.inky similarity index 51% rename from app/views/candidate_mailer/reminder.html.erb rename to app/views/candidate_mailer/reminder.html.inky index af7393c..4c447c7 100644 --- a/app/views/candidate_mailer/reminder.html.erb +++ b/app/views/candidate_mailer/reminder.html.inky @@ -1,16 +1,12 @@ - - + - - - - - - - - - - - -
-
PERFICIENT/digital Skills Assessment Test
-


-
-

Dear <%= @candidate.name %>,

+ + +

Dear <%= @candidate.name %>,

Thank you for taking the Skills Assessment Test. However, it looks like you have not submitted it yet. If you are having trouble, please reach out to your recruiter: @@ -19,18 +15,9 @@

You can return to the test here: <%= link_to nil, root_url %>. -
+
Your Test ID is: <%= @candidate.test_hash %>

-
-


-


 
-
+ + \ No newline at end of file diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 9e37c00..1dd9704 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -1,5 +1,6 @@ + diff --git a/app/views/layouts/mailer.html.erb b/app/views/layouts/mailer.html.erb index ab4308c..374751e 100644 --- a/app/views/layouts/mailer.html.erb +++ b/app/views/layouts/mailer.html.erb @@ -1,13 +1,21 @@ - - + + - + + + <%= stylesheet_link_tag "foundation_emails" %> - <%= yield %> + + + + +
+
+ <%= yield %> +
+
diff --git a/app/views/layouts/old_mailer_1470948990.html.erb b/app/views/layouts/old_mailer_1470948990.html.erb new file mode 100644 index 0000000..ab4308c --- /dev/null +++ b/app/views/layouts/old_mailer_1470948990.html.erb @@ -0,0 +1,13 @@ + + + + + + + + + <%= yield %> + + diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb index 3ef4dab..d7d0686 100644 --- a/config/initializers/assets.rb +++ b/config/initializers/assets.rb @@ -11,5 +11,5 @@ Rails.application.config.assets.version = '1.0' # Rails.application.config.assets.precompile += %w( search.js ) Rails.application.config.assets.precompile += ['vendor/assets/**/*'] - Rails.application.config.assets.precompile += %w(ie9.js) +Rails.application.config.assets.precompile += %w( foundation_emails.css ) From dab2dc5946df363df76ff99556352ea05c68e4ff Mon Sep 17 00:00:00 2001 From: "Manny.Muriel" Date: Fri, 12 Aug 2016 14:43:33 -0700 Subject: [PATCH 122/205] Email edits --- app/assets/stylesheets/foundation_emails.scss | 163 +++++++++++++++++- app/views/candidate_mailer/reminder.html.inky | 26 ++- 2 files changed, 178 insertions(+), 11 deletions(-) diff --git a/app/assets/stylesheets/foundation_emails.scss b/app/assets/stylesheets/foundation_emails.scss index 1646a71..ad24c1d 100644 --- a/app/assets/stylesheets/foundation_emails.scss +++ b/app/assets/stylesheets/foundation_emails.scss @@ -1,9 +1,168 @@ @import "foundation-emails"; + +// Foundation for Emails Settings +// ------------------------------ +// +// Table of Contents: +// +// 1. Global +// 2. Grid +// 3. Block Grid +// 4. Typography +// 5. Button +// 6. Callout +// 7. Menu +// 8. Thumbnail + + +// 1. Global +// --------- + +$primary-color: #2199e8; +$secondary-color: #777777; +$success-color: #3adb76; +$warning-color: #ffae00; +$alert-color: #ec5840; +$light-gray: #f3f3f3; +$medium-gray: #cacaca; +$dark-gray: #8a8a8a; +$black: #0a0a0a; +$white: #fefefe; +$pre-color: #ff6908; +$global-width: 600px !default; +$global-width-small: 95%; +$global-gutter: 16px; +$body-background: $light-gray; +$container-background: $white; +$global-padding: 16px; +$global-margin: 16px; +$global-radius: 3px; +$global-rounded: 500px; +$global-breakpoint: $global-width + $global-gutter; + +// 2. Grid +// ------- + +$grid-column-count: 12; +$column-padding-bottom: $global-padding; +$container-radius: 0; + +// 3. Block Grid +// ------------- + +$block-grid-max: 8; +$block-grid-gutter: $global-gutter; + +// 4. Typography +// ------------- + +$global-font-color: $black; +$body-font-family: Helvetica, Arial, sans-serif; +$global-font-weight: normal; +$header-color: inherit; +$global-line-height: 1.3; +$global-font-size: 16px; +$body-line-height: $global-line-height; +$header-font-family: $body-font-family; +$header-font-weight: $global-font-weight; +$h1-font-size: 34px; +$h2-font-size: 30px; +$h3-font-size: 28px; +$h4-font-size: 24px; +$h5-font-size: 20px; +$h6-font-size: 18px; +$header-margin-bottom: 10px; +$paragraph-margin-bottom: 10px; +$small-font-size: 80%; +$small-font-color: $medium-gray; +$lead-font-size: $global-font-size * 1.25; +$lead-line-height: 1.6; +$text-padding: 10px; +$subheader-lineheight: 1.4; +$subheader-color: $dark-gray; +$subheader-font-weight: $global-font-weight; +$subheader-margin-top: 4px; +$subheader-margin-bottom: 8px; +$hr-width: $global-width; +$hr-border: 1px solid $black; +$hr-margin: 20px auto; +$anchor-text-decoration: none; +$anchor-color: $primary-color; +$anchor-color-visited: $anchor-color; +$anchor-color-hover: darken($primary-color, 10%); +$anchor-color-active: $anchor-color-hover; +$stat-font-size: 40px; + +// 5. Button +// --------- + +$button-padding: ( + tiny: 4px 8px 4px 8px, + small: 5px 10px 5px 10px, + default: 8px 16px 8px 16px, + large: 10px 20px 10px 20px, +); +$button-font-size: ( + tiny: 10px, + small: 12px, + default: 16px, + large: 20px, +); +$button-color: $white; +$button-color-alt: $medium-gray; +$button-font-weight: bold; +$button-margin: 0 0 $global-margin 0; +$button-background: $primary-color; +$button-border: 2px solid $button-background; +$button-radius: $global-radius; +$button-rounded: $global-rounded; + +// 6. Callout +// ---------- + +$callout-background: $white; +$callout-background-fade: 85%; +$callout-padding: 10px; +$callout-margin-bottom: $global-margin; +$callout-border: 1px solid darken($callout-background, 20%); +$callout-border-secondary: 1px solid darken($secondary-color, 20%); +$callout-border-success: 1px solid darken($success-color, 20%); +$callout-border-warning: 1px solid darken($warning-color, 20%); +$callout-border-alert: 1px solid darken($alert-color, 20%); + +// 7. Menu +// ------- + +$menu-item-padding: 10px; +$menu-item-gutter: 10px; +$menu-item-color: $primary-color; + +// 8. Thumbnail +// ------------ + +$thumbnail-border: solid 4px $white; +$thumbnail-margin-bottom: $global-margin; +$thumbnail-shadow: 0 0 0 1px rgba($black, 0.2); +$thumbnail-shadow-hover: 0 0 6px 1px rgba($primary-color, 0.5); +$thumbnail-transition: box-shadow 200ms ease-out; +$thumbnail-radius: $global-radius; + + + .pd-logo { font-size: 28px; } .email-container { - width: 100% !important; max-width:600px; -} \ No newline at end of file + background-color:green; + .email-title { + font-family: 'HalisR', Helvetica Neue, Helvetica, Ariel, sans-serif !important; + .prft-slash { + font-size: 100px; + font-weight: 100; + color: #EF0734; + } + } +} + diff --git a/app/views/candidate_mailer/reminder.html.inky b/app/views/candidate_mailer/reminder.html.inky index 4c447c7..8cee384 100644 --- a/app/views/candidate_mailer/reminder.html.inky +++ b/app/views/candidate_mailer/reminder.html.inky @@ -1,12 +1,14 @@ - \ No newline at end of file From d5d15b3537d1b46be07eb30d8da5f3c54b8a06ca Mon Sep 17 00:00:00 2001 From: "Manny.Muriel" Date: Fri, 12 Aug 2016 14:50:14 -0700 Subject: [PATCH 123/205] sorcery errors --- config/initializers/assets.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb index d7d0686..9a8719f 100644 --- a/config/initializers/assets.rb +++ b/config/initializers/assets.rb @@ -12,4 +12,4 @@ Rails.application.config.assets.version = '1.0' Rails.application.config.assets.precompile += ['vendor/assets/**/*'] Rails.application.config.assets.precompile += %w(ie9.js) -Rails.application.config.assets.precompile += %w( foundation_emails.css ) +Rails.application.config.assets.precompile += %w(foundation_emails.css) From c628fa58a04e9c7d0cad4ab5aa29f614e04cb7ad Mon Sep 17 00:00:00 2001 From: Derek Montgomery Date: Mon, 15 Aug 2016 08:31:39 -0500 Subject: [PATCH 124/205] Foundation for Emails editable vendor lib --- .gitignore | 3 +- .../mailers/foundation_emails.scss | 18 + app/views/layouts/mailer.html.erb | 2 +- config/initializers/assets.rb | 1 + vendor/assets/foundation-emails/.bower.json | 28 + .../assets/foundation-emails/CONTRIBUTING.md | 46 + vendor/assets/foundation-emails/LICENSE.md | 9 + vendor/assets/foundation-emails/README.md | 122 ++ vendor/assets/foundation-emails/bower.json | 18 + .../dist/foundation-emails.css | 1348 +++++++++++++++++ .../dist/foundation-emails.min.css | 1 + .../assets/img/campaign-monitor-css-guide.jpg | Bin 0 -> 344129 bytes .../docs/assets/img/cm-email-client-stats.png | Bin 0 -> 57258 bytes .../assets/img/icons/footer-expo-retina.png | Bin 0 -> 2137 bytes .../docs/assets/img/icons/footer-expo.png | Bin 0 -> 1353 bytes .../img/icons/footer-foundation-retina.png | Bin 0 -> 1980 bytes .../assets/img/icons/footer-foundation.png | Bin 0 -> 1297 bytes .../assets/img/icons/footer-icons-retina.png | Bin 0 -> 6389 bytes .../docs/assets/img/icons/footer-icons.png | Bin 0 -> 5662 bytes .../img/icons/footer-products-retina.png | Bin 0 -> 2187 bytes .../docs/assets/img/icons/footer-products.png | Bin 0 -> 1466 bytes .../img/icons/footer-studios-retina.png | Bin 0 -> 2725 bytes .../docs/assets/img/icons/footer-studios.png | Bin 0 -> 1565 bytes .../img/icons/footer-top-icons-retina.png | Bin 0 -> 3647 bytes .../assets/img/icons/footer-top-icons.png | Bin 0 -> 4645 bytes .../assets/img/icons/footer-university.png | Bin 0 -> 1353 bytes .../docs/assets/img/icons/social-retina.png | Bin 0 -> 6847 bytes .../docs/assets/img/icons/social.png | Bin 0 -> 3815 bytes .../docs/assets/img/logos/sass-logo.svg | 1 + .../docs/assets/js/codeSample.js | 20 + .../foundation-emails/docs/assets/js/docs.js | 1 + .../docs/assets/scss/_code.scss | 6 + .../docs/assets/scss/_compatibility.scss | 157 ++ .../docs/assets/scss/_course-callout.scss | 40 + .../docs/assets/scss/docs.scss | 49 + .../docs/layouts/component.html | 314 ++++ .../docs/layouts/default.html | 73 + .../foundation-emails/docs/pages/alignment.md | 215 +++ .../foundation-emails/docs/pages/button.md | 83 + .../foundation-emails/docs/pages/callout.md | 62 + .../docs/pages/compatibility.md | 173 +++ .../foundation-emails/docs/pages/css-guide.md | 181 +++ .../foundation-emails/docs/pages/global.md | 110 ++ .../foundation-emails/docs/pages/grid.md | 118 ++ .../foundation-emails/docs/pages/index.md | 92 ++ .../foundation-emails/docs/pages/inky.md | 73 + .../docs/pages/media-query.md | 92 ++ .../foundation-emails/docs/pages/menu.md | 52 + .../foundation-emails/docs/pages/migration.md | 511 +++++++ .../foundation-emails/docs/pages/panini.md | 240 +++ .../docs/pages/sass-guide.md | 179 +++ .../foundation-emails/docs/pages/sass.md | 98 ++ .../foundation-emails/docs/pages/spacer.md | 26 + .../foundation-emails/docs/pages/styling.md | 5 + .../foundation-emails/docs/pages/thumbnail.md | 19 + .../docs/pages/tips-tricks.md | 337 +++++ .../docs/pages/typography.md | 73 + .../docs/pages/visibility.md | 33 + .../foundation-emails/docs/pages/wrapper.md | 66 + .../docs/pages/zurb-stack.md | 16 + .../docs/partials/component-list.html | 40 + .../docs/partials/course-callout.html | 6 + .../docs/partials/footer.html | 113 ++ .../docs/partials/mobile-navigation.html | 80 + .../docs/partials/navigation.html | 62 + .../docs/partials/off-canvas.html | 72 + vendor/assets/foundation-emails/gulpfile.js | 222 +++ vendor/assets/foundation-emails/migration.md | 457 ++++++ vendor/assets/foundation-emails/package.json | 67 + .../foundation-emails/scss/_global.scss | 95 ++ .../scss/components/_alignment.scss | 88 ++ .../scss/components/_button.scss | 311 ++++ .../scss/components/_callout.scss | 85 ++ .../scss/components/_code.scss | 0 .../scss/components/_media-query.scss | 139 ++ .../scss/components/_menu.scss | 67 + .../scss/components/_normalize.scss | 90 ++ .../scss/components/_outlook-first.scss | 11 + .../scss/components/_thumbnail.scss | 49 + .../scss/components/_typography.scss | 339 +++++ .../scss/components/_visibility.scss | 66 + .../scss/foundation-emails.scss | 19 + .../scss/grid/_block-grid.scss | 32 + .../foundation-emails/scss/grid/_grid.scss | 172 +++ .../scss/settings/_settings.scss | 23 +- .../foundation-emails/scss/util/_util.scss | 22 + .../foundation-emails/templates/basic.html | 91 ++ .../foundation-emails/templates/drip.html | 71 + .../foundation-emails/templates/hero.html | 103 ++ .../templates/marketing.html | 86 ++ .../templates/newsletter-2.html | 49 + .../templates/newsletter.html | 48 + .../foundation-emails/templates/order.html | 86 ++ .../foundation-emails/templates/password.html | 48 + .../templates/sidebar-hero.html | 124 ++ .../foundation-emails/templates/sidebar.html | 114 ++ .../foundation-emails/templates/welcome.html | 63 + 97 files changed, 8697 insertions(+), 24 deletions(-) create mode 100644 app/assets/stylesheets/mailers/foundation_emails.scss create mode 100644 vendor/assets/foundation-emails/.bower.json create mode 100644 vendor/assets/foundation-emails/CONTRIBUTING.md create mode 100644 vendor/assets/foundation-emails/LICENSE.md create mode 100644 vendor/assets/foundation-emails/README.md create mode 100644 vendor/assets/foundation-emails/bower.json create mode 100644 vendor/assets/foundation-emails/dist/foundation-emails.css create mode 100644 vendor/assets/foundation-emails/dist/foundation-emails.min.css create mode 100644 vendor/assets/foundation-emails/docs/assets/img/campaign-monitor-css-guide.jpg create mode 100644 vendor/assets/foundation-emails/docs/assets/img/cm-email-client-stats.png create mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/footer-expo-retina.png create mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/footer-expo.png create mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/footer-foundation-retina.png create mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/footer-foundation.png create mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/footer-icons-retina.png create mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/footer-icons.png create mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/footer-products-retina.png create mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/footer-products.png create mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/footer-studios-retina.png create mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/footer-studios.png create mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/footer-top-icons-retina.png create mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/footer-top-icons.png create mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/footer-university.png create mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/social-retina.png create mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/social.png create mode 100644 vendor/assets/foundation-emails/docs/assets/img/logos/sass-logo.svg create mode 100644 vendor/assets/foundation-emails/docs/assets/js/codeSample.js create mode 100644 vendor/assets/foundation-emails/docs/assets/js/docs.js create mode 100644 vendor/assets/foundation-emails/docs/assets/scss/_code.scss create mode 100644 vendor/assets/foundation-emails/docs/assets/scss/_compatibility.scss create mode 100644 vendor/assets/foundation-emails/docs/assets/scss/_course-callout.scss create mode 100644 vendor/assets/foundation-emails/docs/assets/scss/docs.scss create mode 100644 vendor/assets/foundation-emails/docs/layouts/component.html create mode 100644 vendor/assets/foundation-emails/docs/layouts/default.html create mode 100644 vendor/assets/foundation-emails/docs/pages/alignment.md create mode 100644 vendor/assets/foundation-emails/docs/pages/button.md create mode 100644 vendor/assets/foundation-emails/docs/pages/callout.md create mode 100644 vendor/assets/foundation-emails/docs/pages/compatibility.md create mode 100644 vendor/assets/foundation-emails/docs/pages/css-guide.md create mode 100644 vendor/assets/foundation-emails/docs/pages/global.md create mode 100644 vendor/assets/foundation-emails/docs/pages/grid.md create mode 100644 vendor/assets/foundation-emails/docs/pages/index.md create mode 100644 vendor/assets/foundation-emails/docs/pages/inky.md create mode 100644 vendor/assets/foundation-emails/docs/pages/media-query.md create mode 100644 vendor/assets/foundation-emails/docs/pages/menu.md create mode 100644 vendor/assets/foundation-emails/docs/pages/migration.md create mode 100644 vendor/assets/foundation-emails/docs/pages/panini.md create mode 100644 vendor/assets/foundation-emails/docs/pages/sass-guide.md create mode 100644 vendor/assets/foundation-emails/docs/pages/sass.md create mode 100644 vendor/assets/foundation-emails/docs/pages/spacer.md create mode 100644 vendor/assets/foundation-emails/docs/pages/styling.md create mode 100644 vendor/assets/foundation-emails/docs/pages/thumbnail.md create mode 100644 vendor/assets/foundation-emails/docs/pages/tips-tricks.md create mode 100644 vendor/assets/foundation-emails/docs/pages/typography.md create mode 100644 vendor/assets/foundation-emails/docs/pages/visibility.md create mode 100644 vendor/assets/foundation-emails/docs/pages/wrapper.md create mode 100644 vendor/assets/foundation-emails/docs/pages/zurb-stack.md create mode 100644 vendor/assets/foundation-emails/docs/partials/component-list.html create mode 100644 vendor/assets/foundation-emails/docs/partials/course-callout.html create mode 100644 vendor/assets/foundation-emails/docs/partials/footer.html create mode 100644 vendor/assets/foundation-emails/docs/partials/mobile-navigation.html create mode 100644 vendor/assets/foundation-emails/docs/partials/navigation.html create mode 100644 vendor/assets/foundation-emails/docs/partials/off-canvas.html create mode 100644 vendor/assets/foundation-emails/gulpfile.js create mode 100644 vendor/assets/foundation-emails/migration.md create mode 100644 vendor/assets/foundation-emails/package.json create mode 100755 vendor/assets/foundation-emails/scss/_global.scss create mode 100755 vendor/assets/foundation-emails/scss/components/_alignment.scss create mode 100755 vendor/assets/foundation-emails/scss/components/_button.scss create mode 100644 vendor/assets/foundation-emails/scss/components/_callout.scss create mode 100644 vendor/assets/foundation-emails/scss/components/_code.scss create mode 100755 vendor/assets/foundation-emails/scss/components/_media-query.scss create mode 100644 vendor/assets/foundation-emails/scss/components/_menu.scss create mode 100755 vendor/assets/foundation-emails/scss/components/_normalize.scss create mode 100755 vendor/assets/foundation-emails/scss/components/_outlook-first.scss create mode 100644 vendor/assets/foundation-emails/scss/components/_thumbnail.scss create mode 100755 vendor/assets/foundation-emails/scss/components/_typography.scss create mode 100644 vendor/assets/foundation-emails/scss/components/_visibility.scss create mode 100644 vendor/assets/foundation-emails/scss/foundation-emails.scss create mode 100755 vendor/assets/foundation-emails/scss/grid/_block-grid.scss create mode 100755 vendor/assets/foundation-emails/scss/grid/_grid.scss rename app/assets/stylesheets/foundation_emails.scss => vendor/assets/foundation-emails/scss/settings/_settings.scss (90%) create mode 100755 vendor/assets/foundation-emails/scss/util/_util.scss create mode 100644 vendor/assets/foundation-emails/templates/basic.html create mode 100644 vendor/assets/foundation-emails/templates/drip.html create mode 100644 vendor/assets/foundation-emails/templates/hero.html create mode 100644 vendor/assets/foundation-emails/templates/marketing.html create mode 100644 vendor/assets/foundation-emails/templates/newsletter-2.html create mode 100644 vendor/assets/foundation-emails/templates/newsletter.html create mode 100644 vendor/assets/foundation-emails/templates/order.html create mode 100644 vendor/assets/foundation-emails/templates/password.html create mode 100644 vendor/assets/foundation-emails/templates/sidebar-hero.html create mode 100644 vendor/assets/foundation-emails/templates/sidebar.html create mode 100644 vendor/assets/foundation-emails/templates/welcome.html diff --git a/.gitignore b/.gitignore index eca05bb..9631b7d 100644 --- a/.gitignore +++ b/.gitignore @@ -37,7 +37,8 @@ tmux*log /.bundle/ /vendor/bundle /lib/bundler/man/ -/vendor/assets +/vendor/assets/* +!/vendor/assets/foundation-emails bower_components/ node_modules/ .DS_Store diff --git a/app/assets/stylesheets/mailers/foundation_emails.scss b/app/assets/stylesheets/mailers/foundation_emails.scss new file mode 100644 index 0000000..22faf6b --- /dev/null +++ b/app/assets/stylesheets/mailers/foundation_emails.scss @@ -0,0 +1,18 @@ +@import "foundation-emails/scss/foundation-emails"; + +.pd-logo { + font-size: 28px; +} + +.email-container { + max-width:600px; + background-color:green; + .email-title { + font-family: 'HalisR', Helvetica Neue, Helvetica, Ariel, sans-serif !important; + .prft-slash { + font-size: 100px; + font-weight: 100; + color: #EF0734; + } + } +} diff --git a/app/views/layouts/mailer.html.erb b/app/views/layouts/mailer.html.erb index 374751e..02456c3 100644 --- a/app/views/layouts/mailer.html.erb +++ b/app/views/layouts/mailer.html.erb @@ -4,7 +4,7 @@ - <%= stylesheet_link_tag "foundation_emails" %> + <%= stylesheet_link_tag "mailers/foundation_emails" %> diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb index 9a8719f..ff99107 100644 --- a/config/initializers/assets.rb +++ b/config/initializers/assets.rb @@ -13,3 +13,4 @@ Rails.application.config.assets.version = '1.0' Rails.application.config.assets.precompile += ['vendor/assets/**/*'] Rails.application.config.assets.precompile += %w(ie9.js) Rails.application.config.assets.precompile += %w(foundation_emails.css) +Rails.application.config.assets.precompile += ['mailers/foundation_emails.css'] diff --git a/vendor/assets/foundation-emails/.bower.json b/vendor/assets/foundation-emails/.bower.json new file mode 100644 index 0000000..d85ebff --- /dev/null +++ b/vendor/assets/foundation-emails/.bower.json @@ -0,0 +1,28 @@ +{ + "name": "foundation-emails", + "version": "2.2.1", + "homepage": "http://foundation.zurb.com/emails", + "authors": [ + "ZURB " + ], + "description": "A framework for designing responsive emails by ZURB.", + "license": "MIT", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "gem", + "test", + "tests" + ], + "_release": "2.2.1", + "_resolution": { + "type": "version", + "tag": "v2.2.1", + "commit": "de8db7c234e7b04e30e006de19625035f9e2fa5c" + }, + "_source": "https://github.com/zurb/foundation-emails.git", + "_target": "^2.2.1", + "_originalSource": "foundation-emails", + "_direct": true +} \ No newline at end of file diff --git a/vendor/assets/foundation-emails/CONTRIBUTING.md b/vendor/assets/foundation-emails/CONTRIBUTING.md new file mode 100644 index 0000000..b352cf7 --- /dev/null +++ b/vendor/assets/foundation-emails/CONTRIBUTING.md @@ -0,0 +1,46 @@ +# Contributing to Foundation + +ZURB loves its community! We always want to hear from our users, whether they're reporting bugs, suggesting new features, or even adding them themselves. + +## Reporting Bugs + +[Open a new issue](https://github.com/zurb/foundation-emails/issues/new) to report a problem you're having with Foundation for Apps. When writing your issue, keep these things in mind: + +- **Be descriptive.** If you can, upload a screenshot of problem you're having, or copy and paste any JavaScript or command line errors you encounter. Being detailed will help us hone in on the problem faster. +- **Post your code.** It's very helpful to see any HTML, Sass, or JavaScript you've written that you think may be causing the problem. In some cases, we might be able to fix your problem just by fixing your code. +- **Help us recreate it.** If your problem is complex, tell us the steps needed to recreate the issue. Sometimes we need to see the problem for ourselves, in our own testing environment, so we can more easily debug it. + +## Editing the Documentation + +The documentation is compiled by a tool called [Supercollider](https://github.com/gakimball/supercollider). Each page is compiled from 1–2 sources: + +- A Markdown file under `docs/pages/`. +- If it's a Sass component, the relevant Sass file inside `scss/` is scanned for special [SassDoc](http://sassdoc.com/) comments. + +Each page is rendered in one big [Handlebars template](https://github.com/zurb/foundation-docs/blob/master/templates/component.html) that takes in all of the above data. + +Much of the guts of the documentation are stored in an external codebase called [foundation-docs](https://github.com/zurb/foundation-docs). This is code that's shared between the documentation for all three Foundation frameworks, including: + +- CSS specific to the documentation +- The Handlebars template used to build pages +- A series of Handlebars helpers for the template +- A custom Markdown parser used when parsing pages +- A script that generates the search results for documentation pages + +To hack on this repo locally, clone the foundation-docs repo into a folder adjacent to this repo's folder on your machine. Then run `npm link ../foundation-docs` to wire the two together. + +## Submitting Pull Requests + +If you think you can solve a problem yourself, or want to implement a new feature, go for it! Follow these guidelines to make the most killer PR ever. + +- **Target the right branch.** So we can properly follow [semantic versioning](http://semver.org/), be sure to develop your pull request in the right branch: + - Ink 1.0 changes: `v1.0` + - Foundation for Emails 2.0+ bug fixes: `develop` + - New features should be pointed to: `v2.2` +- **Test, test, and test.** The Foundation frameworks are used by thousands and thousands of designers and developers, so making sure your changes work in every email client is important! Please test bug fixes or new features in Litmus, or another email testing service. + +## Help Wanted + +Want something to work on? Let us guide you in the right direction. + +- Browse the [Help Wanted](https://github.com/zurb/foundation-emails/labels/help%20wanted) issue to see bugs or features we've asked for the community's help on. Feel free to implement them yourself as a pull request! diff --git a/vendor/assets/foundation-emails/LICENSE.md b/vendor/assets/foundation-emails/LICENSE.md new file mode 100644 index 0000000..86691bb --- /dev/null +++ b/vendor/assets/foundation-emails/LICENSE.md @@ -0,0 +1,9 @@ +Copyright (c) 2016 ZURB, inc. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/vendor/assets/foundation-emails/README.md b/vendor/assets/foundation-emails/README.md new file mode 100644 index 0000000..1c2015a --- /dev/null +++ b/vendor/assets/foundation-emails/README.md @@ -0,0 +1,122 @@ +# [Foundation for Emails](http://foundation.zurb.com/emails) + +[![npm version badge](https://img.shields.io/npm/v/foundation-emails.svg)](https://www.npmjs.org/package/foundation-emails) +[![downloads badge](http://img.shields.io/npm/dm/foundation-emails.svg)](https://www.npmjs.org/package/foundation-emails) +[![Gem Version](https://badge.fury.io/rb/foundation_emails.svg)](https://badge.fury.io/rb/foundation_emails) +[![downloads badge](http://img.shields.io/npm/l/foundation-emails.svg)](https://www.npmjs.org/package/foundation-emails) + + +Foundation for Emails (previously known as Ink) is a framework for creating responsive HTML emails that work in any email client — even Outlook. Our HTML/CSS components have been tested across every major email client to ensure consistency. And with the [Inky](https://github.com/zurb/inky) templating language, writing HTML emails is now even easier. + +## Getting Started + +The main way to get started is with our [email template stack](https://github.com/zurb/foundation-emails-template). To use the stack, you'll need [Node.js](https://nodejs.org/en/) installed on your machine. + +To set up the emails template, run these commands: + +```bash +git clone https://github.com/zurb/foundation-emails-template project +cd project +npm install +``` + +Then run `npm start` to run the project. A new browser window will open with a BrowserSync server showing the finished files. + +Run `npm run build` to do a full email inlining process. + + +#### Using the Ruby gem + +**foundation_emails** is a gem that enables you to use Foundation for Emails assets within a Rails project. To install in your app: + +1. Add the following line to your Gemfile: + + ```ruby + gem 'foundation_emails' + ``` + +2. Then execute: + + ```bash + bundle install + ``` + +3. Import Foundation for Emails in your `application.scss`: + + ```scss + @import "foundation-emails"; + ``` + +## Documentation + +**Check out our [Migration Guide](https://github.com/zurb/foundation-emails/blob/master/migration.md) for upgrading an existing template or for more in-depth code examples.** + +Foundation for Emails 2.0 documentation and framework are on the `develop` branch and you can compile it on your own machine. + +Run these commands to set up the documentation: + +```bash +git clone https://github.com/zurb/foundation-emails.git +cd foundation-emails +``` + +Foundation for Emails 2.0 documentation is on the `develop` branch. + +```bash +git fetch +git checkout develop +npm install +``` + +Then run `npm start` to compile the documentation. When it finishes, a new browser window will open pointing to a BrowserSync server displaying the documentation. + +## Testing + +Run `npm run test:visual` to compile the visual regression tests. All of the pages under `test/visual/pages` are compiled and inlined. From there, they can be uploaded to Litmus for testing. + +## Inky + +[Inky](https://github.com/zurb/inky) is our new templating language that converts simple HTML into the complex tables required for email layout. + +The parser converts a set of custom HTML tags, expanding them out into full HTML syntax. Below is a list of every custom element. + +### Grid + +```html + + + + + + +``` + +### Block Grid + +```html + + + + + +``` + +### Components + +```html + +``` + +```html + + Item One + Item Two + Item Three + +``` + +## Contributing + +As an open source project, we looooove our community support. Please file issues, or better yet pull requests on the [Foundation for Emails Repo](https://github.com/zurb/foundation-emails). We're stoked to hear your feedback, make improvements, and keep evolving Foundation for Emails! + +Copyright (c) 2016 ZURB, inc. diff --git a/vendor/assets/foundation-emails/bower.json b/vendor/assets/foundation-emails/bower.json new file mode 100644 index 0000000..1f48a1a --- /dev/null +++ b/vendor/assets/foundation-emails/bower.json @@ -0,0 +1,18 @@ +{ + "name": "foundation-emails", + "version": "2.2.1", + "homepage": "http://foundation.zurb.com/emails", + "authors": [ + "ZURB " + ], + "description": "A framework for designing responsive emails by ZURB.", + "license": "MIT", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "gem", + "test", + "tests" + ] +} diff --git a/vendor/assets/foundation-emails/dist/foundation-emails.css b/vendor/assets/foundation-emails/dist/foundation-emails.css new file mode 100644 index 0000000..acd1b98 --- /dev/null +++ b/vendor/assets/foundation-emails/dist/foundation-emails.css @@ -0,0 +1,1348 @@ +.wrapper { + width: 100%; } + +#outlook a { + padding: 0; } + +body { + width: 100% !important; + min-width: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + margin: 0; + Margin: 0; + padding: 0; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; } + +.ExternalClass { + width: 100%; } + .ExternalClass, + .ExternalClass p, + .ExternalClass span, + .ExternalClass font, + .ExternalClass td, + .ExternalClass div { + line-height: 100%; } + +#backgroundTable { + margin: 0; + Margin: 0; + padding: 0; + width: 100% !important; + line-height: 100% !important; } + +img { + outline: none; + text-decoration: none; + -ms-interpolation-mode: bicubic; + width: auto; + max-width: 100%; + clear: both; + display: block; } + +center { + width: 100%; + min-width: 580px; } + +a img { + border: none; } + +p { + margin: 0 0 0 10px; + Margin: 0 0 0 10px; } + +table { + border-spacing: 0; + border-collapse: collapse; } + +td { + word-wrap: break-word; + -webkit-hyphens: auto; + -moz-hyphens: auto; + hyphens: auto; + border-collapse: collapse !important; } + +table, tr, td { + padding: 0; + vertical-align: top; + text-align: left; } + +@media only screen { + html { + min-height: 100%; + background: #f3f3f3; } } + +table.body { + background: #f3f3f3; + height: 100%; + width: 100%; } + +table.container { + background: #fefefe; + width: 580px; + margin: 0 auto; + Margin: 0 auto; + text-align: inherit; } + +table.row { + padding: 0; + width: 100%; + position: relative; } + +table.spacer { + width: 100%; } + table.spacer td { + mso-line-height-rule: exactly; } + +table.container table.row { + display: table; } + +td.columns, +td.column, +th.columns, +th.column { + margin: 0 auto; + Margin: 0 auto; + padding-left: 16px; + padding-bottom: 16px; } + td.columns .column, + td.columns .columns, + td.column .column, + td.column .columns, + th.columns .column, + th.columns .columns, + th.column .column, + th.column .columns { + padding-left: 0 !important; + padding-right: 0 !important; } + td.columns .column center, + td.columns .columns center, + td.column .column center, + td.column .columns center, + th.columns .column center, + th.columns .columns center, + th.column .column center, + th.column .columns center { + min-width: none !important; } + +td.columns.last, +td.column.last, +th.columns.last, +th.column.last { + padding-right: 16px; } + +td.columns table:not(.button), +td.column table:not(.button), +th.columns table:not(.button), +th.column table:not(.button) { + width: 100%; } + +td.large-1, +th.large-1 { + width: 32.33333px; + padding-left: 8px; + padding-right: 8px; } + +td.large-1.first, +th.large-1.first { + padding-left: 16px; } + +td.large-1.last, +th.large-1.last { + padding-right: 16px; } + +.collapse > tbody > tr > td.large-1, +.collapse > tbody > tr > th.large-1 { + padding-right: 0; + padding-left: 0; + width: 48.33333px; } + +.collapse td.large-1.first, +.collapse th.large-1.first, +.collapse td.large-1.last, +.collapse th.large-1.last { + width: 56.33333px; } + +td.large-1 center, +th.large-1 center { + min-width: 0.33333px; } + +.body .columns td.large-1, +.body .column td.large-1, +.body .columns th.large-1, +.body .column th.large-1 { + width: 8.33333%; } + +td.large-2, +th.large-2 { + width: 80.66667px; + padding-left: 8px; + padding-right: 8px; } + +td.large-2.first, +th.large-2.first { + padding-left: 16px; } + +td.large-2.last, +th.large-2.last { + padding-right: 16px; } + +.collapse > tbody > tr > td.large-2, +.collapse > tbody > tr > th.large-2 { + padding-right: 0; + padding-left: 0; + width: 96.66667px; } + +.collapse td.large-2.first, +.collapse th.large-2.first, +.collapse td.large-2.last, +.collapse th.large-2.last { + width: 104.66667px; } + +td.large-2 center, +th.large-2 center { + min-width: 48.66667px; } + +.body .columns td.large-2, +.body .column td.large-2, +.body .columns th.large-2, +.body .column th.large-2 { + width: 16.66667%; } + +td.large-3, +th.large-3 { + width: 129px; + padding-left: 8px; + padding-right: 8px; } + +td.large-3.first, +th.large-3.first { + padding-left: 16px; } + +td.large-3.last, +th.large-3.last { + padding-right: 16px; } + +.collapse > tbody > tr > td.large-3, +.collapse > tbody > tr > th.large-3 { + padding-right: 0; + padding-left: 0; + width: 145px; } + +.collapse td.large-3.first, +.collapse th.large-3.first, +.collapse td.large-3.last, +.collapse th.large-3.last { + width: 153px; } + +td.large-3 center, +th.large-3 center { + min-width: 97px; } + +.body .columns td.large-3, +.body .column td.large-3, +.body .columns th.large-3, +.body .column th.large-3 { + width: 25%; } + +td.large-4, +th.large-4 { + width: 177.33333px; + padding-left: 8px; + padding-right: 8px; } + +td.large-4.first, +th.large-4.first { + padding-left: 16px; } + +td.large-4.last, +th.large-4.last { + padding-right: 16px; } + +.collapse > tbody > tr > td.large-4, +.collapse > tbody > tr > th.large-4 { + padding-right: 0; + padding-left: 0; + width: 193.33333px; } + +.collapse td.large-4.first, +.collapse th.large-4.first, +.collapse td.large-4.last, +.collapse th.large-4.last { + width: 201.33333px; } + +td.large-4 center, +th.large-4 center { + min-width: 145.33333px; } + +.body .columns td.large-4, +.body .column td.large-4, +.body .columns th.large-4, +.body .column th.large-4 { + width: 33.33333%; } + +td.large-5, +th.large-5 { + width: 225.66667px; + padding-left: 8px; + padding-right: 8px; } + +td.large-5.first, +th.large-5.first { + padding-left: 16px; } + +td.large-5.last, +th.large-5.last { + padding-right: 16px; } + +.collapse > tbody > tr > td.large-5, +.collapse > tbody > tr > th.large-5 { + padding-right: 0; + padding-left: 0; + width: 241.66667px; } + +.collapse td.large-5.first, +.collapse th.large-5.first, +.collapse td.large-5.last, +.collapse th.large-5.last { + width: 249.66667px; } + +td.large-5 center, +th.large-5 center { + min-width: 193.66667px; } + +.body .columns td.large-5, +.body .column td.large-5, +.body .columns th.large-5, +.body .column th.large-5 { + width: 41.66667%; } + +td.large-6, +th.large-6 { + width: 274px; + padding-left: 8px; + padding-right: 8px; } + +td.large-6.first, +th.large-6.first { + padding-left: 16px; } + +td.large-6.last, +th.large-6.last { + padding-right: 16px; } + +.collapse > tbody > tr > td.large-6, +.collapse > tbody > tr > th.large-6 { + padding-right: 0; + padding-left: 0; + width: 290px; } + +.collapse td.large-6.first, +.collapse th.large-6.first, +.collapse td.large-6.last, +.collapse th.large-6.last { + width: 298px; } + +td.large-6 center, +th.large-6 center { + min-width: 242px; } + +.body .columns td.large-6, +.body .column td.large-6, +.body .columns th.large-6, +.body .column th.large-6 { + width: 50%; } + +td.large-7, +th.large-7 { + width: 322.33333px; + padding-left: 8px; + padding-right: 8px; } + +td.large-7.first, +th.large-7.first { + padding-left: 16px; } + +td.large-7.last, +th.large-7.last { + padding-right: 16px; } + +.collapse > tbody > tr > td.large-7, +.collapse > tbody > tr > th.large-7 { + padding-right: 0; + padding-left: 0; + width: 338.33333px; } + +.collapse td.large-7.first, +.collapse th.large-7.first, +.collapse td.large-7.last, +.collapse th.large-7.last { + width: 346.33333px; } + +td.large-7 center, +th.large-7 center { + min-width: 290.33333px; } + +.body .columns td.large-7, +.body .column td.large-7, +.body .columns th.large-7, +.body .column th.large-7 { + width: 58.33333%; } + +td.large-8, +th.large-8 { + width: 370.66667px; + padding-left: 8px; + padding-right: 8px; } + +td.large-8.first, +th.large-8.first { + padding-left: 16px; } + +td.large-8.last, +th.large-8.last { + padding-right: 16px; } + +.collapse > tbody > tr > td.large-8, +.collapse > tbody > tr > th.large-8 { + padding-right: 0; + padding-left: 0; + width: 386.66667px; } + +.collapse td.large-8.first, +.collapse th.large-8.first, +.collapse td.large-8.last, +.collapse th.large-8.last { + width: 394.66667px; } + +td.large-8 center, +th.large-8 center { + min-width: 338.66667px; } + +.body .columns td.large-8, +.body .column td.large-8, +.body .columns th.large-8, +.body .column th.large-8 { + width: 66.66667%; } + +td.large-9, +th.large-9 { + width: 419px; + padding-left: 8px; + padding-right: 8px; } + +td.large-9.first, +th.large-9.first { + padding-left: 16px; } + +td.large-9.last, +th.large-9.last { + padding-right: 16px; } + +.collapse > tbody > tr > td.large-9, +.collapse > tbody > tr > th.large-9 { + padding-right: 0; + padding-left: 0; + width: 435px; } + +.collapse td.large-9.first, +.collapse th.large-9.first, +.collapse td.large-9.last, +.collapse th.large-9.last { + width: 443px; } + +td.large-9 center, +th.large-9 center { + min-width: 387px; } + +.body .columns td.large-9, +.body .column td.large-9, +.body .columns th.large-9, +.body .column th.large-9 { + width: 75%; } + +td.large-10, +th.large-10 { + width: 467.33333px; + padding-left: 8px; + padding-right: 8px; } + +td.large-10.first, +th.large-10.first { + padding-left: 16px; } + +td.large-10.last, +th.large-10.last { + padding-right: 16px; } + +.collapse > tbody > tr > td.large-10, +.collapse > tbody > tr > th.large-10 { + padding-right: 0; + padding-left: 0; + width: 483.33333px; } + +.collapse td.large-10.first, +.collapse th.large-10.first, +.collapse td.large-10.last, +.collapse th.large-10.last { + width: 491.33333px; } + +td.large-10 center, +th.large-10 center { + min-width: 435.33333px; } + +.body .columns td.large-10, +.body .column td.large-10, +.body .columns th.large-10, +.body .column th.large-10 { + width: 83.33333%; } + +td.large-11, +th.large-11 { + width: 515.66667px; + padding-left: 8px; + padding-right: 8px; } + +td.large-11.first, +th.large-11.first { + padding-left: 16px; } + +td.large-11.last, +th.large-11.last { + padding-right: 16px; } + +.collapse > tbody > tr > td.large-11, +.collapse > tbody > tr > th.large-11 { + padding-right: 0; + padding-left: 0; + width: 531.66667px; } + +.collapse td.large-11.first, +.collapse th.large-11.first, +.collapse td.large-11.last, +.collapse th.large-11.last { + width: 539.66667px; } + +td.large-11 center, +th.large-11 center { + min-width: 483.66667px; } + +.body .columns td.large-11, +.body .column td.large-11, +.body .columns th.large-11, +.body .column th.large-11 { + width: 91.66667%; } + +td.large-12, +th.large-12 { + width: 564px; + padding-left: 8px; + padding-right: 8px; } + +td.large-12.first, +th.large-12.first { + padding-left: 16px; } + +td.large-12.last, +th.large-12.last { + padding-right: 16px; } + +.collapse > tbody > tr > td.large-12, +.collapse > tbody > tr > th.large-12 { + padding-right: 0; + padding-left: 0; + width: 580px; } + +.collapse td.large-12.first, +.collapse th.large-12.first, +.collapse td.large-12.last, +.collapse th.large-12.last { + width: 588px; } + +td.large-12 center, +th.large-12 center { + min-width: 532px; } + +.body .columns td.large-12, +.body .column td.large-12, +.body .columns th.large-12, +.body .column th.large-12 { + width: 100%; } + +td.large-offset-1, +td.large-offset-1.first, +td.large-offset-1.last, +th.large-offset-1, +th.large-offset-1.first, +th.large-offset-1.last { + padding-left: 64.33333px; } + +td.large-offset-2, +td.large-offset-2.first, +td.large-offset-2.last, +th.large-offset-2, +th.large-offset-2.first, +th.large-offset-2.last { + padding-left: 112.66667px; } + +td.large-offset-3, +td.large-offset-3.first, +td.large-offset-3.last, +th.large-offset-3, +th.large-offset-3.first, +th.large-offset-3.last { + padding-left: 161px; } + +td.large-offset-4, +td.large-offset-4.first, +td.large-offset-4.last, +th.large-offset-4, +th.large-offset-4.first, +th.large-offset-4.last { + padding-left: 209.33333px; } + +td.large-offset-5, +td.large-offset-5.first, +td.large-offset-5.last, +th.large-offset-5, +th.large-offset-5.first, +th.large-offset-5.last { + padding-left: 257.66667px; } + +td.large-offset-6, +td.large-offset-6.first, +td.large-offset-6.last, +th.large-offset-6, +th.large-offset-6.first, +th.large-offset-6.last { + padding-left: 306px; } + +td.large-offset-7, +td.large-offset-7.first, +td.large-offset-7.last, +th.large-offset-7, +th.large-offset-7.first, +th.large-offset-7.last { + padding-left: 354.33333px; } + +td.large-offset-8, +td.large-offset-8.first, +td.large-offset-8.last, +th.large-offset-8, +th.large-offset-8.first, +th.large-offset-8.last { + padding-left: 402.66667px; } + +td.large-offset-9, +td.large-offset-9.first, +td.large-offset-9.last, +th.large-offset-9, +th.large-offset-9.first, +th.large-offset-9.last { + padding-left: 451px; } + +td.large-offset-10, +td.large-offset-10.first, +td.large-offset-10.last, +th.large-offset-10, +th.large-offset-10.first, +th.large-offset-10.last { + padding-left: 499.33333px; } + +td.large-offset-11, +td.large-offset-11.first, +td.large-offset-11.last, +th.large-offset-11, +th.large-offset-11.first, +th.large-offset-11.last { + padding-left: 547.66667px; } + +td.expander, +th.expander { + visibility: hidden; + width: 0; + padding: 0 !important; } + +table.container.radius { + border-radius: 0; + border-collapse: separate; } + +.block-grid { + width: 100%; + max-width: 580px; } + .block-grid td { + display: inline-block; + padding: 8px; } + +.up-2 td { + width: 274px !important; } + +.up-3 td { + width: 177px !important; } + +.up-4 td { + width: 129px !important; } + +.up-5 td { + width: 100px !important; } + +.up-6 td { + width: 80px !important; } + +.up-7 td { + width: 66px !important; } + +.up-8 td { + width: 56px !important; } + +table.text-center, +th.text-center, +td.text-center, +h1.text-center, +h2.text-center, +h3.text-center, +h4.text-center, +h5.text-center, +h6.text-center, +p.text-center, +span.text-center { + text-align: center; } + +table.text-left, +th.text-left, +td.text-left, +h1.text-left, +h2.text-left, +h3.text-left, +h4.text-left, +h5.text-left, +h6.text-left, +p.text-left, +span.text-left { + text-align: left; } + +table.text-right, +th.text-right, +td.text-right, +h1.text-right, +h2.text-right, +h3.text-right, +h4.text-right, +h5.text-right, +h6.text-right, +p.text-right, +span.text-right { + text-align: right; } + +span.text-center { + display: block; + width: 100%; + text-align: center; } + +@media only screen and (max-width: 596px) { + .small-float-center { + margin: 0 auto !important; + float: none !important; + text-align: center !important; } + .small-text-center { + text-align: center !important; } + .small-text-left { + text-align: left !important; } + .small-text-right { + text-align: right !important; } } + +img.float-left { + float: left; + text-align: left; } + +img.float-right { + float: right; + text-align: right; } + +img.float-center, +img.text-center { + margin: 0 auto; + Margin: 0 auto; + float: none; + text-align: center; } + +table.float-center, +td.float-center, +th.float-center { + margin: 0 auto; + Margin: 0 auto; + float: none; + text-align: center; } + +.hide-for-large { + display: none !important; + mso-hide: all; + overflow: hidden; + max-height: 0; + font-size: 0; + width: 0; + line-height: 0; } + @media only screen and (max-width: 596px) { + .hide-for-large { + display: block !important; + width: auto !important; + overflow: visible !important; + max-height: none !important; + font-size: inherit !important; + line-height: inherit !important; } } + +table.body table.container .hide-for-large * { + mso-hide: all; } + +@media only screen and (max-width: 596px) { + table.body table.container .hide-for-large, + table.body table.container .row.hide-for-large { + display: table !important; + width: 100% !important; } } + +@media only screen and (max-width: 596px) { + table.body table.container .callout-inner.hide-for-large { + display: table-cell !important; + width: 100% !important; } } + +@media only screen and (max-width: 596px) { + table.body table.container .show-for-large { + display: none !important; + width: 0; + mso-hide: all; + overflow: hidden; } } + +body, +table.body, +h1, +h2, +h3, +h4, +h5, +h6, +p, +td, +th, +a { + color: #0a0a0a; + font-family: Helvetica, Arial, sans-serif; + font-weight: normal; + padding: 0; + margin: 0; + Margin: 0; + text-align: left; + line-height: 1.3; } + +h1, +h2, +h3, +h4, +h5, +h6 { + color: inherit; + word-wrap: normal; + font-family: Helvetica, Arial, sans-serif; + font-weight: normal; + margin-bottom: 10px; + Margin-bottom: 10px; } + +h1 { + font-size: 34px; } + +h2 { + font-size: 30px; } + +h3 { + font-size: 28px; } + +h4 { + font-size: 24px; } + +h5 { + font-size: 20px; } + +h6 { + font-size: 18px; } + +body, +table.body, +p, +td, +th { + font-size: 16px; + line-height: 1.3; } + +p { + margin-bottom: 10px; + Margin-bottom: 10px; } + p.lead { + font-size: 20px; + line-height: 1.6; } + p.subheader { + margin-top: 4px; + margin-bottom: 8px; + Margin-top: 4px; + Margin-bottom: 8px; + font-weight: normal; + line-height: 1.4; + color: #8a8a8a; } + +small { + font-size: 80%; + color: #cacaca; } + +a { + color: #2199e8; + text-decoration: none; } + a:hover { + color: #147dc2; } + a:active { + color: #147dc2; } + a:visited { + color: #2199e8; } + +h1 a, +h1 a:visited, +h2 a, +h2 a:visited, +h3 a, +h3 a:visited, +h4 a, +h4 a:visited, +h5 a, +h5 a:visited, +h6 a, +h6 a:visited { + color: #2199e8; } + +pre { + background: #f3f3f3; + margin: 30px 0; + Margin: 30px 0; } + pre code { + color: #cacaca; } + pre code span.callout { + color: #8a8a8a; + font-weight: bold; } + pre code span.callout-strong { + color: #ff6908; + font-weight: bold; } + +table.hr { + width: 100%; } + table.hr th { + height: 0; + max-width: 580px; + border-top: 0; + border-right: 0; + border-bottom: 1px solid #0a0a0a; + border-left: 0; + margin: 20px auto; + Margin: 20px auto; + clear: both; } + +.stat { + font-size: 40px; + line-height: 1; } + p + .stat { + margin-top: -16px; + Margin-top: -16px; } + +span.preheader { + display: none !important; + visibility: hidden; + mso-hide: all !important; + font-size: 1px; + color: #f3f3f3; + line-height: 1px; + max-height: 0px; + max-width: 0px; + opacity: 0; + overflow: hidden; } + +table.button { + width: auto; + margin: 0 0 16px 0; + Margin: 0 0 16px 0; } + table.button table td { + text-align: left; + color: #fefefe; + background: #2199e8; + border: 2px solid #2199e8; } + table.button table td a { + font-family: Helvetica, Arial, sans-serif; + font-size: 16px; + font-weight: bold; + color: #fefefe; + text-decoration: none; + display: inline-block; + padding: 8px 16px 8px 16px; + border: 0 solid #2199e8; + border-radius: 3px; } + table.button.radius table td { + border-radius: 3px; + border: none; } + table.button.rounded table td { + border-radius: 500px; + border: none; } + +table.button:hover table tr td a, +table.button:active table tr td a, +table.button table tr td a:visited, +table.button.tiny:hover table tr td a, +table.button.tiny:active table tr td a, +table.button.tiny table tr td a:visited, +table.button.small:hover table tr td a, +table.button.small:active table tr td a, +table.button.small table tr td a:visited, +table.button.large:hover table tr td a, +table.button.large:active table tr td a, +table.button.large table tr td a:visited { + color: #fefefe; } + +table.button.tiny table td, +table.button.tiny table a { + padding: 4px 8px 4px 8px; } + +table.button.tiny table a { + font-size: 10px; + font-weight: normal; } + +table.button.small table td, +table.button.small table a { + padding: 5px 10px 5px 10px; + font-size: 12px; } + +table.button.large table a { + padding: 10px 20px 10px 20px; + font-size: 20px; } + +table.button.expand, +table.button.expanded { + width: 100% !important; } + table.button.expand table, + table.button.expanded table { + width: 100%; } + table.button.expand table a, + table.button.expanded table a { + text-align: center; + width: 100%; + padding-left: 0; + padding-right: 0; } + table.button.expand center, + table.button.expanded center { + min-width: 0; } + +table.button:hover table td, +table.button:visited table td, +table.button:active table td { + background: #147dc2; + color: #fefefe; } + +table.button:hover table a, +table.button:visited table a, +table.button:active table a { + border: 0 solid #147dc2; } + +table.button.secondary table td { + background: #777777; + color: #fefefe; + border: 0px solid #777777; } + +table.button.secondary table a { + color: #fefefe; + border: 0 solid #777777; } + +table.button.secondary:hover table td { + background: #919191; + color: #fefefe; } + +table.button.secondary:hover table a { + border: 0 solid #919191; } + +table.button.secondary:hover table td a { + color: #fefefe; } + +table.button.secondary:active table td a { + color: #fefefe; } + +table.button.secondary table td a:visited { + color: #fefefe; } + +table.button.success table td { + background: #3adb76; + border: 0px solid #3adb76; } + +table.button.success table a { + border: 0 solid #3adb76; } + +table.button.success:hover table td { + background: #23bf5d; } + +table.button.success:hover table a { + border: 0 solid #23bf5d; } + +table.button.alert table td { + background: #ec5840; + border: 0px solid #ec5840; } + +table.button.alert table a { + border: 0 solid #ec5840; } + +table.button.alert:hover table td { + background: #e23317; } + +table.button.alert:hover table a { + border: 0 solid #e23317; } + +table.button.warning table td { + background: #ffae00; + border: 0px solid #ffae00; } + +table.button.warning table a { + border: 0px solid #ffae00; } + +table.button.warning:hover table td { + background: #cc8b00; } + +table.button.warning:hover table a { + border: 0px solid #cc8b00; } + +table.callout { + margin-bottom: 16px; + Margin-bottom: 16px; } + +th.callout-inner { + width: 100%; + border: 1px solid #cbcbcb; + padding: 10px; + background: #fefefe; } + th.callout-inner.primary { + background: #def0fc; + border: 1px solid #444444; + color: #0a0a0a; } + th.callout-inner.secondary { + background: #ebebeb; + border: 1px solid #444444; + color: #0a0a0a; } + th.callout-inner.success { + background: #e1faea; + border: 1px solid #1b9448; + color: #fefefe; } + th.callout-inner.warning { + background: #fff3d9; + border: 1px solid #996800; + color: #fefefe; } + th.callout-inner.alert { + background: #fce6e2; + border: 1px solid #b42912; + color: #fefefe; } + +.thumbnail { + border: solid 4px #fefefe; + box-shadow: 0 0 0 1px rgba(10, 10, 10, 0.2); + display: inline-block; + line-height: 0; + max-width: 100%; + transition: box-shadow 200ms ease-out; + border-radius: 3px; + margin-bottom: 16px; } + .thumbnail:hover, .thumbnail:focus { + box-shadow: 0 0 6px 1px rgba(33, 153, 232, 0.5); } + +table.menu { + width: 580px; } + table.menu td.menu-item, + table.menu th.menu-item { + padding: 10px; + padding-right: 10px; } + table.menu td.menu-item a, + table.menu th.menu-item a { + color: #2199e8; } + +table.menu.vertical td.menu-item, +table.menu.vertical th.menu-item { + padding: 10px; + padding-right: 0; + display: block; } + table.menu.vertical td.menu-item a, + table.menu.vertical th.menu-item a { + width: 100%; } + +table.menu.vertical td.menu-item table.menu.vertical td.menu-item, +table.menu.vertical td.menu-item table.menu.vertical th.menu-item, +table.menu.vertical th.menu-item table.menu.vertical td.menu-item, +table.menu.vertical th.menu-item table.menu.vertical th.menu-item { + padding-left: 10px; } + +table.menu.text-center a { + text-align: center; } + +.menu[align="center"] { + width: auto !important; } + +body.outlook p { + display: inline !important; } + +@media only screen and (max-width: 596px) { + table.body img { + width: auto; + height: auto; } + table.body center { + min-width: 0 !important; } + table.body .container { + width: 95% !important; } + table.body .columns, + table.body .column { + height: auto !important; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding-left: 16px !important; + padding-right: 16px !important; } + table.body .columns .column, + table.body .columns .columns, + table.body .column .column, + table.body .column .columns { + padding-left: 0 !important; + padding-right: 0 !important; } + table.body .collapse .columns, + table.body .collapse .column { + padding-left: 0 !important; + padding-right: 0 !important; } + td.small-1, + th.small-1 { + display: inline-block !important; + width: 8.33333% !important; } + td.small-2, + th.small-2 { + display: inline-block !important; + width: 16.66667% !important; } + td.small-3, + th.small-3 { + display: inline-block !important; + width: 25% !important; } + td.small-4, + th.small-4 { + display: inline-block !important; + width: 33.33333% !important; } + td.small-5, + th.small-5 { + display: inline-block !important; + width: 41.66667% !important; } + td.small-6, + th.small-6 { + display: inline-block !important; + width: 50% !important; } + td.small-7, + th.small-7 { + display: inline-block !important; + width: 58.33333% !important; } + td.small-8, + th.small-8 { + display: inline-block !important; + width: 66.66667% !important; } + td.small-9, + th.small-9 { + display: inline-block !important; + width: 75% !important; } + td.small-10, + th.small-10 { + display: inline-block !important; + width: 83.33333% !important; } + td.small-11, + th.small-11 { + display: inline-block !important; + width: 91.66667% !important; } + td.small-12, + th.small-12 { + display: inline-block !important; + width: 100% !important; } + .columns td.small-12, + .column td.small-12, + .columns th.small-12, + .column th.small-12 { + display: block !important; + width: 100% !important; } + table.body td.small-offset-1, + table.body th.small-offset-1 { + margin-left: 8.33333% !important; + Margin-left: 8.33333% !important; } + table.body td.small-offset-2, + table.body th.small-offset-2 { + margin-left: 16.66667% !important; + Margin-left: 16.66667% !important; } + table.body td.small-offset-3, + table.body th.small-offset-3 { + margin-left: 25% !important; + Margin-left: 25% !important; } + table.body td.small-offset-4, + table.body th.small-offset-4 { + margin-left: 33.33333% !important; + Margin-left: 33.33333% !important; } + table.body td.small-offset-5, + table.body th.small-offset-5 { + margin-left: 41.66667% !important; + Margin-left: 41.66667% !important; } + table.body td.small-offset-6, + table.body th.small-offset-6 { + margin-left: 50% !important; + Margin-left: 50% !important; } + table.body td.small-offset-7, + table.body th.small-offset-7 { + margin-left: 58.33333% !important; + Margin-left: 58.33333% !important; } + table.body td.small-offset-8, + table.body th.small-offset-8 { + margin-left: 66.66667% !important; + Margin-left: 66.66667% !important; } + table.body td.small-offset-9, + table.body th.small-offset-9 { + margin-left: 75% !important; + Margin-left: 75% !important; } + table.body td.small-offset-10, + table.body th.small-offset-10 { + margin-left: 83.33333% !important; + Margin-left: 83.33333% !important; } + table.body td.small-offset-11, + table.body th.small-offset-11 { + margin-left: 91.66667% !important; + Margin-left: 91.66667% !important; } + table.body table.columns td.expander, + table.body table.columns th.expander { + display: none !important; } + table.body .right-text-pad, + table.body .text-pad-right { + padding-left: 10px !important; } + table.body .left-text-pad, + table.body .text-pad-left { + padding-right: 10px !important; } + table.menu { + width: 100% !important; } + table.menu td, + table.menu th { + width: auto !important; + display: inline-block !important; } + table.menu.vertical td, + table.menu.vertical th, table.menu.small-vertical td, + table.menu.small-vertical th { + display: block !important; } + table.menu[align="center"] { + width: auto !important; } + table.button.small-expand, + table.button.small-expanded { + width: 100% !important; } + table.button.small-expand table, + table.button.small-expanded table { + width: 100%; } + table.button.small-expand table a, + table.button.small-expanded table a { + text-align: center !important; + width: 100% !important; + padding-left: 0 !important; + padding-right: 0 !important; } + table.button.small-expand center, + table.button.small-expanded center { + min-width: 0; } } diff --git a/vendor/assets/foundation-emails/dist/foundation-emails.min.css b/vendor/assets/foundation-emails/dist/foundation-emails.min.css new file mode 100644 index 0000000..157be02 --- /dev/null +++ b/vendor/assets/foundation-emails/dist/foundation-emails.min.css @@ -0,0 +1 @@ +.wrapper{width:100%}#outlook a,body{padding:0}body{width:100%!important;min-width:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;margin:0;Margin:0;box-sizing:border-box}.ExternalClass{width:100%}.ExternalClass,.ExternalClass div,.ExternalClass font,.ExternalClass p,.ExternalClass span,.ExternalClass td{line-height:100%}#backgroundTable{margin:0;Margin:0;padding:0;width:100%!important;line-height:100%!important}img{outline:none;text-decoration:none;-ms-interpolation-mode:bicubic;width:auto;max-width:100%;clear:both;display:block}center{width:100%;min-width:580px}a img{border:none}p{margin:0 0 0 10px;Margin:0 0 0 10px}table{border-spacing:0;border-collapse:collapse}td{word-wrap:break-word;-webkit-hyphens:auto;hyphens:auto;border-collapse:collapse!important}table,td,tr{padding:0;vertical-align:top;text-align:left}@media only screen{html{min-height:100%;background:#f3f3f3}}table.body{background:#f3f3f3;height:100%;width:100%}table.container{background:#fefefe;width:580px;margin:0 auto;Margin:0 auto;text-align:inherit}table.row{padding:0;position:relative}table.row,table.spacer{width:100%}table.spacer td{mso-line-height-rule:exactly}table.container table.row{display:table}td.column,td.columns,th.column,th.columns{margin:0 auto;Margin:0 auto;padding-left:16px;padding-bottom:16px}td.column .column,td.column .columns,td.columns .column,td.columns .columns,th.column .column,th.column .columns,th.columns .column,th.columns .columns{padding-left:0!important;padding-right:0!important}td.column .column center,td.column .columns center,td.columns .column center,td.columns .columns center,th.column .column center,th.column .columns center,th.columns .column center,th.columns .columns center{min-width:none!important}td.column.last,td.columns.last,th.column.last,th.columns.last{padding-right:16px}td.columns table:not(.button),td.column table:not(.button),th.columns table:not(.button),th.column table:not(.button){width:100%}td.large-1,th.large-1{width:32.33333px;padding-left:8px;padding-right:8px}td.large-1.first,th.large-1.first{padding-left:16px}td.large-1.last,th.large-1.last{padding-right:16px}.collapse>tbody>tr>td.large-1,.collapse>tbody>tr>th.large-1{padding-right:0;padding-left:0;width:48.33333px}.collapse td.large-1.first,.collapse td.large-1.last,.collapse th.large-1.first,.collapse th.large-1.last{width:56.33333px}td.large-1 center,th.large-1 center{min-width:.33333px}.body .columns td.large-1,.body .columns th.large-1,.body .column td.large-1,.body .column th.large-1{width:8.33333%}td.large-2,th.large-2{width:80.66667px;padding-left:8px;padding-right:8px}td.large-2.first,th.large-2.first{padding-left:16px}td.large-2.last,th.large-2.last{padding-right:16px}.collapse>tbody>tr>td.large-2,.collapse>tbody>tr>th.large-2{padding-right:0;padding-left:0;width:96.66667px}.collapse td.large-2.first,.collapse td.large-2.last,.collapse th.large-2.first,.collapse th.large-2.last{width:104.66667px}td.large-2 center,th.large-2 center{min-width:48.66667px}.body .columns td.large-2,.body .columns th.large-2,.body .column td.large-2,.body .column th.large-2{width:16.66667%}td.large-3,th.large-3{width:129px;padding-left:8px;padding-right:8px}td.large-3.first,th.large-3.first{padding-left:16px}td.large-3.last,th.large-3.last{padding-right:16px}.collapse>tbody>tr>td.large-3,.collapse>tbody>tr>th.large-3{padding-right:0;padding-left:0;width:145px}.collapse td.large-3.first,.collapse td.large-3.last,.collapse th.large-3.first,.collapse th.large-3.last{width:153px}td.large-3 center,th.large-3 center{min-width:97px}.body .columns td.large-3,.body .columns th.large-3,.body .column td.large-3,.body .column th.large-3{width:25%}td.large-4,th.large-4{width:177.33333px;padding-left:8px;padding-right:8px}td.large-4.first,th.large-4.first{padding-left:16px}td.large-4.last,th.large-4.last{padding-right:16px}.collapse>tbody>tr>td.large-4,.collapse>tbody>tr>th.large-4{padding-right:0;padding-left:0;width:193.33333px}.collapse td.large-4.first,.collapse td.large-4.last,.collapse th.large-4.first,.collapse th.large-4.last{width:201.33333px}td.large-4 center,th.large-4 center{min-width:145.33333px}.body .columns td.large-4,.body .columns th.large-4,.body .column td.large-4,.body .column th.large-4{width:33.33333%}td.large-5,th.large-5{width:225.66667px;padding-left:8px;padding-right:8px}td.large-5.first,th.large-5.first{padding-left:16px}td.large-5.last,th.large-5.last{padding-right:16px}.collapse>tbody>tr>td.large-5,.collapse>tbody>tr>th.large-5{padding-right:0;padding-left:0;width:241.66667px}.collapse td.large-5.first,.collapse td.large-5.last,.collapse th.large-5.first,.collapse th.large-5.last{width:249.66667px}td.large-5 center,th.large-5 center{min-width:193.66667px}.body .columns td.large-5,.body .columns th.large-5,.body .column td.large-5,.body .column th.large-5{width:41.66667%}td.large-6,th.large-6{width:274px;padding-left:8px;padding-right:8px}td.large-6.first,th.large-6.first{padding-left:16px}td.large-6.last,th.large-6.last{padding-right:16px}.collapse>tbody>tr>td.large-6,.collapse>tbody>tr>th.large-6{padding-right:0;padding-left:0;width:290px}.collapse td.large-6.first,.collapse td.large-6.last,.collapse th.large-6.first,.collapse th.large-6.last{width:298px}td.large-6 center,th.large-6 center{min-width:242px}.body .columns td.large-6,.body .columns th.large-6,.body .column td.large-6,.body .column th.large-6{width:50%}td.large-7,th.large-7{width:322.33333px;padding-left:8px;padding-right:8px}td.large-7.first,th.large-7.first{padding-left:16px}td.large-7.last,th.large-7.last{padding-right:16px}.collapse>tbody>tr>td.large-7,.collapse>tbody>tr>th.large-7{padding-right:0;padding-left:0;width:338.33333px}.collapse td.large-7.first,.collapse td.large-7.last,.collapse th.large-7.first,.collapse th.large-7.last{width:346.33333px}td.large-7 center,th.large-7 center{min-width:290.33333px}.body .columns td.large-7,.body .columns th.large-7,.body .column td.large-7,.body .column th.large-7{width:58.33333%}td.large-8,th.large-8{width:370.66667px;padding-left:8px;padding-right:8px}td.large-8.first,th.large-8.first{padding-left:16px}td.large-8.last,th.large-8.last{padding-right:16px}.collapse>tbody>tr>td.large-8,.collapse>tbody>tr>th.large-8{padding-right:0;padding-left:0;width:386.66667px}.collapse td.large-8.first,.collapse td.large-8.last,.collapse th.large-8.first,.collapse th.large-8.last{width:394.66667px}td.large-8 center,th.large-8 center{min-width:338.66667px}.body .columns td.large-8,.body .columns th.large-8,.body .column td.large-8,.body .column th.large-8{width:66.66667%}td.large-9,th.large-9{width:419px;padding-left:8px;padding-right:8px}td.large-9.first,th.large-9.first{padding-left:16px}td.large-9.last,th.large-9.last{padding-right:16px}.collapse>tbody>tr>td.large-9,.collapse>tbody>tr>th.large-9{padding-right:0;padding-left:0;width:435px}.collapse td.large-9.first,.collapse td.large-9.last,.collapse th.large-9.first,.collapse th.large-9.last{width:443px}td.large-9 center,th.large-9 center{min-width:387px}.body .columns td.large-9,.body .columns th.large-9,.body .column td.large-9,.body .column th.large-9{width:75%}td.large-10,th.large-10{width:467.33333px;padding-left:8px;padding-right:8px}td.large-10.first,th.large-10.first{padding-left:16px}td.large-10.last,th.large-10.last{padding-right:16px}.collapse>tbody>tr>td.large-10,.collapse>tbody>tr>th.large-10{padding-right:0;padding-left:0;width:483.33333px}.collapse td.large-10.first,.collapse td.large-10.last,.collapse th.large-10.first,.collapse th.large-10.last{width:491.33333px}td.large-10 center,th.large-10 center{min-width:435.33333px}.body .columns td.large-10,.body .columns th.large-10,.body .column td.large-10,.body .column th.large-10{width:83.33333%}td.large-11,th.large-11{width:515.66667px;padding-left:8px;padding-right:8px}td.large-11.first,th.large-11.first{padding-left:16px}td.large-11.last,th.large-11.last{padding-right:16px}.collapse>tbody>tr>td.large-11,.collapse>tbody>tr>th.large-11{padding-right:0;padding-left:0;width:531.66667px}.collapse td.large-11.first,.collapse td.large-11.last,.collapse th.large-11.first,.collapse th.large-11.last{width:539.66667px}td.large-11 center,th.large-11 center{min-width:483.66667px}.body .columns td.large-11,.body .columns th.large-11,.body .column td.large-11,.body .column th.large-11{width:91.66667%}td.large-12,th.large-12{width:564px;padding-left:8px;padding-right:8px}td.large-12.first,th.large-12.first{padding-left:16px}td.large-12.last,th.large-12.last{padding-right:16px}.collapse>tbody>tr>td.large-12,.collapse>tbody>tr>th.large-12{padding-right:0;padding-left:0;width:580px}.collapse td.large-12.first,.collapse td.large-12.last,.collapse th.large-12.first,.collapse th.large-12.last{width:588px}td.large-12 center,th.large-12 center{min-width:532px}.body .columns td.large-12,.body .columns th.large-12,.body .column td.large-12,.body .column th.large-12{width:100%}td.large-offset-1,td.large-offset-1.first,td.large-offset-1.last,th.large-offset-1,th.large-offset-1.first,th.large-offset-1.last{padding-left:64.33333px}td.large-offset-2,td.large-offset-2.first,td.large-offset-2.last,th.large-offset-2,th.large-offset-2.first,th.large-offset-2.last{padding-left:112.66667px}td.large-offset-3,td.large-offset-3.first,td.large-offset-3.last,th.large-offset-3,th.large-offset-3.first,th.large-offset-3.last{padding-left:161px}td.large-offset-4,td.large-offset-4.first,td.large-offset-4.last,th.large-offset-4,th.large-offset-4.first,th.large-offset-4.last{padding-left:209.33333px}td.large-offset-5,td.large-offset-5.first,td.large-offset-5.last,th.large-offset-5,th.large-offset-5.first,th.large-offset-5.last{padding-left:257.66667px}td.large-offset-6,td.large-offset-6.first,td.large-offset-6.last,th.large-offset-6,th.large-offset-6.first,th.large-offset-6.last{padding-left:306px}td.large-offset-7,td.large-offset-7.first,td.large-offset-7.last,th.large-offset-7,th.large-offset-7.first,th.large-offset-7.last{padding-left:354.33333px}td.large-offset-8,td.large-offset-8.first,td.large-offset-8.last,th.large-offset-8,th.large-offset-8.first,th.large-offset-8.last{padding-left:402.66667px}td.large-offset-9,td.large-offset-9.first,td.large-offset-9.last,th.large-offset-9,th.large-offset-9.first,th.large-offset-9.last{padding-left:451px}td.large-offset-10,td.large-offset-10.first,td.large-offset-10.last,th.large-offset-10,th.large-offset-10.first,th.large-offset-10.last{padding-left:499.33333px}td.large-offset-11,td.large-offset-11.first,td.large-offset-11.last,th.large-offset-11,th.large-offset-11.first,th.large-offset-11.last{padding-left:547.66667px}td.expander,th.expander{visibility:hidden;width:0;padding:0!important}table.container.radius{border-radius:0;border-collapse:separate}.block-grid{width:100%;max-width:580px}.block-grid td{display:inline-block;padding:8px}.up-2 td{width:274px!important}.up-3 td{width:177px!important}.up-4 td{width:129px!important}.up-5 td{width:100px!important}.up-6 td{width:80px!important}.up-7 td{width:66px!important}.up-8 td{width:56px!important}h1.text-center,h2.text-center,h3.text-center,h4.text-center,h5.text-center,h6.text-center,p.text-center,span.text-center,table.text-center,td.text-center,th.text-center{text-align:center}h1.text-left,h2.text-left,h3.text-left,h4.text-left,h5.text-left,h6.text-left,p.text-left,span.text-left,table.text-left,td.text-left,th.text-left{text-align:left}h1.text-right,h2.text-right,h3.text-right,h4.text-right,h5.text-right,h6.text-right,p.text-right,span.text-right,table.text-right,td.text-right,th.text-right{text-align:right}span.text-center{display:block;width:100%;text-align:center}@media only screen and (max-width:596px){.small-float-center{margin:0 auto!important;float:none!important}.small-float-center,.small-text-center{text-align:center!important}.small-text-left{text-align:left!important}.small-text-right{text-align:right!important}}img.float-left{float:left;text-align:left}img.float-right{float:right;text-align:right}img.float-center,img.text-center,table.float-center,td.float-center,th.float-center{margin:0 auto;Margin:0 auto;float:none;text-align:center}.hide-for-large{display:none!important;mso-hide:all;overflow:hidden;max-height:0;font-size:0;width:0;line-height:0}@media only screen and (max-width:596px){.hide-for-large{display:block!important;width:auto!important;overflow:visible!important;max-height:none!important;font-size:inherit!important;line-height:inherit!important}}table.body table.container .hide-for-large *{mso-hide:all}@media only screen and (max-width:596px){table.body table.container .hide-for-large,table.body table.container .row.hide-for-large{display:table!important;width:100%!important}}@media only screen and (max-width:596px){table.body table.container .callout-inner.hide-for-large{display:table-cell!important;width:100%!important}}@media only screen and (max-width:596px){table.body table.container .show-for-large{display:none!important;width:0;mso-hide:all;overflow:hidden}}a,body,h1,h2,h3,h4,h5,h6,p,table.body,td,th{color:#0a0a0a;font-family:Helvetica,Arial,sans-serif;font-weight:400;padding:0;margin:0;Margin:0;text-align:left;line-height:1.3}h1,h2,h3,h4,h5,h6{color:inherit;word-wrap:normal;font-family:Helvetica,Arial,sans-serif;font-weight:400;margin-bottom:10px;Margin-bottom:10px}h1{font-size:34px}h2{font-size:30px}h3{font-size:28px}h4{font-size:24px}h5{font-size:20px}h6{font-size:18px}body,p,table.body,td,th{font-size:16px;line-height:1.3}p{margin-bottom:10px;Margin-bottom:10px}p.lead{font-size:20px;line-height:1.6}p.subheader{margin-top:4px;margin-bottom:8px;Margin-top:4px;Margin-bottom:8px;font-weight:400;line-height:1.4;color:#8a8a8a}small{font-size:80%;color:#cacaca}a{color:#2199e8;text-decoration:none}a:active,a:hover{color:#147dc2}a:visited,h1 a,h1 a:visited,h2 a,h2 a:visited,h3 a,h3 a:visited,h4 a,h4 a:visited,h5 a,h5 a:visited,h6 a,h6 a:visited{color:#2199e8}pre{background:#f3f3f3;margin:30px 0;Margin:30px 0}pre code{color:#cacaca}pre code span.callout{color:#8a8a8a;font-weight:700}pre code span.callout-strong{color:#ff6908;font-weight:700}table.hr{width:100%}table.hr th{height:0;max-width:580px;border-top:0;border-right:0;border-bottom:1px solid #0a0a0a;border-left:0;margin:20px auto;Margin:20px auto;clear:both}.stat{font-size:40px;line-height:1}p+.stat{margin-top:-16px;Margin-top:-16px}span.preheader{display:none!important;visibility:hidden;mso-hide:all!important;font-size:1px;color:#f3f3f3;line-height:1px;max-height:0;max-width:0;opacity:0;overflow:hidden}table.button{width:auto;margin:0 0 16px;Margin:0 0 16px 0}table.button table td{text-align:left;color:#fefefe;background:#2199e8;border:2px solid #2199e8}table.button table td a{font-family:Helvetica,Arial,sans-serif;font-size:16px;font-weight:700;color:#fefefe;text-decoration:none;display:inline-block;padding:8px 16px;border:0 solid #2199e8;border-radius:3px}table.button.radius table td{border-radius:3px;border:none}table.button.rounded table td{border-radius:500px;border:none}table.button.large:active table tr td a,table.button.large:hover table tr td a,table.button.large table tr td a:visited,table.button.small:active table tr td a,table.button.small:hover table tr td a,table.button.small table tr td a:visited,table.button.tiny:active table tr td a,table.button.tiny:hover table tr td a,table.button.tiny table tr td a:visited,table.button:active table tr td a,table.button:hover table tr td a,table.button table tr td a:visited{color:#fefefe}table.button.tiny table a,table.button.tiny table td{padding:4px 8px}table.button.tiny table a{font-size:10px;font-weight:400}table.button.small table a,table.button.small table td{padding:5px 10px;font-size:12px}table.button.large table a{padding:10px 20px;font-size:20px}table.button.expand,table.button.expanded{width:100%!important}table.button.expanded table,table.button.expand table{width:100%}table.button.expanded table a,table.button.expand table a{text-align:center;width:100%;padding-left:0;padding-right:0}table.button.expand center,table.button.expanded center{min-width:0}table.button:active table td,table.button:hover table td,table.button:visited table td{background:#147dc2;color:#fefefe}table.button:active table a,table.button:hover table a,table.button:visited table a{border:0 solid #147dc2}table.button.secondary table td{background:#777}table.button.secondary table a,table.button.secondary table td{color:#fefefe;border:0 solid #777}table.button.secondary:hover table td{background:#919191;color:#fefefe}table.button.secondary:hover table a{border:0 solid #919191}table.button.secondary:active table td a,table.button.secondary:hover table td a,table.button.secondary table td a:visited{color:#fefefe}table.button.success table td{background:#3adb76;border:0 solid #3adb76}table.button.success table a{border:0 solid #3adb76}table.button.success:hover table td{background:#23bf5d}table.button.success:hover table a{border:0 solid #23bf5d}table.button.alert table td{background:#ec5840;border:0 solid #ec5840}table.button.alert table a{border:0 solid #ec5840}table.button.alert:hover table td{background:#e23317}table.button.alert:hover table a{border:0 solid #e23317}table.button.warning table td{background:#ffae00;border:0 solid #ffae00}table.button.warning table a{border:0 solid #ffae00}table.button.warning:hover table td{background:#cc8b00}table.button.warning:hover table a{border:0 solid #cc8b00}table.callout{margin-bottom:16px;Margin-bottom:16px}th.callout-inner{width:100%;border:1px solid #cbcbcb;padding:10px;background:#fefefe}th.callout-inner.primary{background:#def0fc;border:1px solid #444;color:#0a0a0a}th.callout-inner.secondary{background:#ebebeb;border:1px solid #444;color:#0a0a0a}th.callout-inner.success{background:#e1faea;border:1px solid #1b9448;color:#fefefe}th.callout-inner.warning{background:#fff3d9;border:1px solid #996800;color:#fefefe}th.callout-inner.alert{background:#fce6e2;border:1px solid #b42912;color:#fefefe}.thumbnail{border:4px solid #fefefe;box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;max-width:100%;transition:box-shadow .2s ease-out;border-radius:3px;margin-bottom:16px}.thumbnail:focus,.thumbnail:hover{box-shadow:0 0 6px 1px rgba(33,153,232,.5)}table.menu{width:580px}table.menu td.menu-item,table.menu th.menu-item{padding:10px;padding-right:10px}table.menu td.menu-item a,table.menu th.menu-item a{color:#2199e8}table.menu.vertical td.menu-item,table.menu.vertical th.menu-item{padding:10px;padding-right:0;display:block}table.menu.vertical td.menu-item a,table.menu.vertical th.menu-item a{width:100%}table.menu.vertical td.menu-item table.menu.vertical td.menu-item,table.menu.vertical td.menu-item table.menu.vertical th.menu-item,table.menu.vertical th.menu-item table.menu.vertical td.menu-item,table.menu.vertical th.menu-item table.menu.vertical th.menu-item{padding-left:10px}table.menu.text-center a{text-align:center}.menu[align=center]{width:auto!important}body.outlook p{display:inline!important}@media only screen and (max-width:596px){table.body img{width:auto;height:auto}table.body center{min-width:0!important}table.body .container{width:95%!important}table.body .column,table.body .columns{height:auto!important;box-sizing:border-box;padding-left:16px!important;padding-right:16px!important}table.body .collapse .column,table.body .collapse .columns,table.body .column .column,table.body .column .columns,table.body .columns .column,table.body .columns .columns{padding-left:0!important;padding-right:0!important}td.small-1,th.small-1{display:inline-block!important;width:8.33333%!important}td.small-2,th.small-2{display:inline-block!important;width:16.66667%!important}td.small-3,th.small-3{display:inline-block!important;width:25%!important}td.small-4,th.small-4{display:inline-block!important;width:33.33333%!important}td.small-5,th.small-5{display:inline-block!important;width:41.66667%!important}td.small-6,th.small-6{display:inline-block!important;width:50%!important}td.small-7,th.small-7{display:inline-block!important;width:58.33333%!important}td.small-8,th.small-8{display:inline-block!important;width:66.66667%!important}td.small-9,th.small-9{display:inline-block!important;width:75%!important}td.small-10,th.small-10{display:inline-block!important;width:83.33333%!important}td.small-11,th.small-11{display:inline-block!important;width:91.66667%!important}td.small-12,th.small-12{display:inline-block!important;width:100%!important}.columns td.small-12,.columns th.small-12,.column td.small-12,.column th.small-12{display:block!important;width:100%!important}table.body td.small-offset-1,table.body th.small-offset-1{margin-left:8.33333%!important;Margin-left:8.33333%!important}table.body td.small-offset-2,table.body th.small-offset-2{margin-left:16.66667%!important;Margin-left:16.66667%!important}table.body td.small-offset-3,table.body th.small-offset-3{margin-left:25%!important;Margin-left:25%!important}table.body td.small-offset-4,table.body th.small-offset-4{margin-left:33.33333%!important;Margin-left:33.33333%!important}table.body td.small-offset-5,table.body th.small-offset-5{margin-left:41.66667%!important;Margin-left:41.66667%!important}table.body td.small-offset-6,table.body th.small-offset-6{margin-left:50%!important;Margin-left:50%!important}table.body td.small-offset-7,table.body th.small-offset-7{margin-left:58.33333%!important;Margin-left:58.33333%!important}table.body td.small-offset-8,table.body th.small-offset-8{margin-left:66.66667%!important;Margin-left:66.66667%!important}table.body td.small-offset-9,table.body th.small-offset-9{margin-left:75%!important;Margin-left:75%!important}table.body td.small-offset-10,table.body th.small-offset-10{margin-left:83.33333%!important;Margin-left:83.33333%!important}table.body td.small-offset-11,table.body th.small-offset-11{margin-left:91.66667%!important;Margin-left:91.66667%!important}table.body table.columns td.expander,table.body table.columns th.expander{display:none!important}table.body .right-text-pad,table.body .text-pad-right{padding-left:10px!important}table.body .left-text-pad,table.body .text-pad-left{padding-right:10px!important}table.menu{width:100%!important}table.menu td,table.menu th{width:auto!important;display:inline-block!important}table.menu.small-vertical td,table.menu.small-vertical th,table.menu.vertical td,table.menu.vertical th{display:block!important}table.menu[align=center]{width:auto!important}table.button.small-expand,table.button.small-expanded{width:100%!important}table.button.small-expanded table,table.button.small-expand table{width:100%}table.button.small-expanded table a,table.button.small-expand table a{text-align:center!important;width:100%!important;padding-left:0!important;padding-right:0!important}table.button.small-expand center,table.button.small-expanded center{min-width:0}} \ No newline at end of file diff --git a/vendor/assets/foundation-emails/docs/assets/img/campaign-monitor-css-guide.jpg b/vendor/assets/foundation-emails/docs/assets/img/campaign-monitor-css-guide.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dcdad184716c5fc5655b3331d0c3d503d067d968 GIT binary patch literal 344129 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�LdVZ&6=(jI2a!YpoZ&*hLG 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 N;;n?@%+>YL{{eNg!-W6< literal 0 HcmV?d00001 diff --git a/vendor/assets/foundation-emails/docs/assets/img/cm-email-client-stats.png b/vendor/assets/foundation-emails/docs/assets/img/cm-email-client-stats.png new file mode 100644 index 0000000000000000000000000000000000000000..7b76835f1fecff1b3c6b2ab61b6a16c4119ccc65 GIT binary patch literal 57258 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 C^K4}R literal 0 HcmV?d00001 diff --git a/vendor/assets/foundation-emails/docs/assets/img/icons/footer-expo-retina.png b/vendor/assets/foundation-emails/docs/assets/img/icons/footer-expo-retina.png new file mode 100644 index 0000000000000000000000000000000000000000..71275576fa5e64c85e8540264501c9477aeb2402 GIT binary patch literal 2137 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 ZnPGL|1mCRVnaZHT&C}J-Wt~$(69B2)>~R19 literal 0 HcmV?d00001 diff --git a/vendor/assets/foundation-emails/docs/assets/img/icons/footer-foundation-retina.png b/vendor/assets/foundation-emails/docs/assets/img/icons/footer-foundation-retina.png new file mode 100644 index 0000000000000000000000000000000000000000..03d7d06b022fbf980f24fc45c5fa00f75ad0387f GIT binary patch literal 1980 zcmeAS@N?(olHy`uVBq!ia0vp^CLqkg1|*MGNWTVBk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m{l@EB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMwS&*t9 zlvO-#2=9ZF3nBND}m`vLFjeCsTY(OatnYqyQCInmZhe+73JqDfIV%MiQ6rXIL(9V zO~LIJC!BiqfsWA!MJ-ZP!-Rn82gHOYTp$OY^i%VI>AeV;uwVbISkJ(~qUY)27*cWT zO;l`-kE6)EtGS_nLslx)1u6Mn$ePNf`D*>6gUt$p=Y3UtRa}%lzB_6>>CwS%mWL}J zIbP5T6}_tECFo)j5*WI+Z0)sQ`|cD=W`Eo7TW0=UCH~!=o7VT|85=)8bI0=f)6YLc zj7~~SO?f0C^4&>Z=n2zO2REJ=O$Wh%GetZ$FC8Q|SOi(eL;?WB!2cgFwpu zCV{7qg80r{T2v6{_C3 z8^rQNCOoj`nZl60bzU8B472}odH&n^lm1_Ms+`Vwq2EmZ!yU6J&nGiye3mc0&9~ig zX7~YD$zP@iOcKnc_AE?vkl!GukrVYh1&>qa|so%fS^bUX1C1HuB8ub5l7ormo6SP+!#=TJ`cchfe+6 zjV9Ap++Gs8w8ix4qezQvgR6ZJuGbSbXiWETtDID)KYfF;O7>+&&cDlZ_WL~1oWAJn zhLGpACq6E`DE`jQuZzD_^{~~G%i zd9r&`U#sT)$%;9jbJiW?yj>`>tx_gNFY))XH!?!E+IJk*oA^ojwt{+2yQOSeAA_%2 zg;-yUBdfxx&Ok}EZDkCRh6M%Lo4I8~i&nhQKeO|m_?HHrHOTVz3c?VY? z-{Et+g8ofct_@*Z93Yn|D0`MI)1@+L#@pb%LVA~<)H#UcOxv@jv$-ycXUfSh8!Nx~ zJ?!+=wYb&HA|E x`8+m%A`Wx+rCn|pKX>Sr#1jdToqxm<82ki}vbrQLoB^s&Jzf1=);T3K0RW0!5VrsT literal 0 HcmV?d00001 diff --git a/vendor/assets/foundation-emails/docs/assets/img/icons/footer-foundation.png b/vendor/assets/foundation-emails/docs/assets/img/icons/footer-foundation.png new file mode 100644 index 0000000000000000000000000000000000000000..143f9eae3a05bba9992b430fd172f68bf2597573 GIT binary patch literal 1297 zcmeAS@N?(olHy`uVBq!ia0vp^5DSr z1<%~X^wgl##FWaylc_cg49qH-ArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XRMoSU}&gdW~OIo zVrph)sH0$HU}&Uo07PcGh9*{~W>!Y#3Q(W~w5=#5%__*n4QdyVXRDM^Qc_^0uU}qX zu2*iXmtT~wZ)j<02{OaTNEfI=x41H|B(Xv_uUHvof=g;~a#3bMNoIbY0?5R~r2Ntn zTP2`NAzsKWfE$}v3=Jk=fazBx7U&!58GyV5Q|Rl9UukYGTy=3tP%6T`SPd=?sVqp< z4@xc0FD*(2MqHXQ$f^P>=c3falKi5O{QMkPC z!8&|>tvvIJOA_;vQ$1a5m4IgGWoD*WIht7*85@~6yE$8!85+78Sy(zdx;Yy<89N!f zI9phl!t}c2Czs}?=9R$orXcjX;M5CB47mkBn_W_iGRsm^+=}vZ6~Lah%EaOpQ%6f< zH*<40oaRCGreJXkM6ZPbPQCg-$LNEi7AdM>LcsI`V!{(HkONQpsd>QkUIa|o#!R^h z3=E9To-U3d6}PTjy{qk9C~@H9{WQPGLdExbIhv|@OZLRx*fUjHyy&rgK$rcorT-l# za(lH*SfUv;O(^@GP*jIe-}}kWugto+u1>uARq*Yfw&~|Bt`G33yn#e#t$ zPfl_wGpSeWCiHYJU_XB2SohCfEuKZ9o+Zj{vU{@qY}+obd9M2P2W!kvfeXx^UmP;w z6Lew!v#YLwWzmd-c3BtL=0DSUEEgPcHA!>*0qL+WM-;cr-aqk>&?>{GX)>1UXEZlQ z>ipU)G;d?tr{m1mKCh{N#hU+6JK@dIxM#*21RwAC7OfMYcK*;aSr6wWxne6OuiF&q z5O=2KEYtJ~omXbEhkMVO=}r&RePyI#laOlf<$SZk&eaiEx z))5C*gvFenkr8+25s&bW!)*JCzwGfy7MguyD(n0+zKdAqzPSF^u1Edv#$eg{zI}6R zt#&#^1?ats;hy@cD(1GyGtm!+E?)fEs4OXA`LAoivlFayDmI&I%lwUgY|q5Q(ED@Y U@9$@q9sw0np00i_>zopr0GT@0CjbBd literal 0 HcmV?d00001 diff --git a/vendor/assets/foundation-emails/docs/assets/img/icons/footer-icons-retina.png b/vendor/assets/foundation-emails/docs/assets/img/icons/footer-icons-retina.png new file mode 100644 index 0000000000000000000000000000000000000000..17fdedc867689e0cb9025fd81c8b7208b7488d47 GIT binary patch literal 6389 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 J{_XZ({|7rMSqlIF literal 0 HcmV?d00001 diff --git a/vendor/assets/foundation-emails/docs/assets/img/icons/footer-icons.png b/vendor/assets/foundation-emails/docs/assets/img/icons/footer-icons.png new file mode 100644 index 0000000000000000000000000000000000000000..39b48e1c08e77c4773504d1ca0b38e4555b8eb8b GIT binary patch literal 5662 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 U57zh0{A26p?CEr4>;A+40w#Z+lK=n! literal 0 HcmV?d00001 diff --git a/vendor/assets/foundation-emails/docs/assets/img/icons/footer-products-retina.png b/vendor/assets/foundation-emails/docs/assets/img/icons/footer-products-retina.png new file mode 100644 index 0000000000000000000000000000000000000000..04fee5d23f81e745ab9a4e178bbb8b7722c51e9b GIT binary patch literal 2187 zcmaJ@eLU0q9^XhFN@NO zuBUTOhvIbVND|e>C2`&Cq`CTFrfn+-kB~($4^lax5X08^VB|tEgoeR9yyRjwClQdL;sKsOL_;rJzllZ(xHR-p zBGZK__67KYfD;lR>_l)l=R_ih!bN*|qCDhOh(HL)*eJO$NhGDpY3Prx0VqOg7}@b)ij0Pal>U~2Q2d!zB>hw-s9;z*Ta3kFTr?@IJ2IL7-&H95 z>@AhCfZz50Phx3!x){K+04bOv;XsW`*sTdArus?%whWYngJ9Bn6+`);43zRgG0HcL zgmPfAIRcT!;P?^2WKtO-sf;b+01P?}4RK%u0xs2+OmQRlxw;StL_7}X=Sn6K2!3Qb z+11Sr?@J-Ntz+pRCq)Q|Wb0V&?^xW1Sj{j9#ZY8AAQ7YjTz?5DM14$}D%em9-fu&` zPgw4TTJZiGVzH1Itfsa9)#`N*-H*!Hy)?lLgezR)jn+7|dxs$c$>{bd&*Gwg?742$63L-EdW? z1GmR4$*yiz=Zdo7VSGzkJtIzC#4pbJcb2}&i|J_?pu0MPrtE+RW-82HDZSB_L;di2 z?WwL0EAWEho<8_;mI!fmVgHUdM)V8|+Xp)bBJ7L%zp$6+&z;(J&|9gqHPwa%^Ux|f zp*>O2JGMus0-`wAJq{rUyy}u~y?qnvNFOp_C?mzG)rZg(Y1tx5s z>O$q+w|;{B(+&LPOWpi2xG&+y(!Iv<*j8jfNyAV(bsK)c&{El0$qk5AAf7q<$8yVh z6p@lilzH)Do~x#$;}z=?B`M?|K%NbwRB6ox2ukwPQ?2942aUdkpwA=v$ zr<0~~zGG&>qncxVZ9b+U~fRIF{A2Pr_PEp}6MbM)cTcg$a<~F&dX~iA| zk^9t^4|VNE)HyAs*6at)eFcSL{U3_3*1&vK>(tVbAiZ|`BDXgCyh$b5vKUw#?Sjwz z%1_CO9Eq%AF9B~}YDxTZXJaAywra>5onJzyf2-4TWJ_e-p;Fn*?Z;k>Oe#7@b& zw=E#QRza-KL2k=1FEu%$UuSf&ZeER5i8BYU82mNnZsB{xq+U5%WE|VW8}9fe!*|9_ zd%(xERQJZSe^ug|&U744KP#lXHSg{quo=BcO` zjoFspnH?Uq>zhp2-QyIboY@^Y8nak)aM2Spp_09u8eB7~n;4em9sn~(%FeDNV>=G9 zx|PV=qMBr%p^IRplcm+6lyv8SP-JU?xX>aJ@EKB_y)&oJ^pX#!U(4?Nv*8pwxFfi1 zD1Po%#Ic|B8Z(OfTZ

9m(~VaBm`iTAgyxqZ*gUKaG&cv#<0ub3)cfVrK{_&HU7 zti~>Gh=i84m+x7b9*+IQP)c!#QQ w@96Z)34m)?RAs~ogAjX=dmeT#g=E5EkBWOcUoV-Q()=DU{DSG<`ov}b2Tc!kzyJUM literal 0 HcmV?d00001 diff --git a/vendor/assets/foundation-emails/docs/assets/img/icons/footer-products.png b/vendor/assets/foundation-emails/docs/assets/img/icons/footer-products.png new file mode 100644 index 0000000000000000000000000000000000000000..2506878b1889f52d801cfad3ce8658b00c61902a GIT binary patch literal 1466 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 LGo2c3x2V4WB~VWS literal 0 HcmV?d00001 diff --git a/vendor/assets/foundation-emails/docs/assets/img/icons/footer-top-icons.png b/vendor/assets/foundation-emails/docs/assets/img/icons/footer-top-icons.png new file mode 100644 index 0000000000000000000000000000000000000000..596be27f8288917e7e014284c641eca64e2f793c GIT binary patch literal 4645 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 ZnPGL|1mCRVnaZHT&C}J-Wt~$(69B2)>~R19 literal 0 HcmV?d00001 diff --git a/vendor/assets/foundation-emails/docs/assets/img/icons/social-retina.png b/vendor/assets/foundation-emails/docs/assets/img/icons/social-retina.png new file mode 100644 index 0000000000000000000000000000000000000000..3f2e4a3fd9e69ba20d707a2eaec9ac8d1ec542be GIT binary patch literal 6847 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 V4c9xkS!=(Zj&{zrH*AhY{s&9iWyk;k literal 0 HcmV?d00001 diff --git a/vendor/assets/foundation-emails/docs/assets/img/logos/sass-logo.svg b/vendor/assets/foundation-emails/docs/assets/img/logos/sass-logo.svg new file mode 100644 index 0000000..194e860 --- /dev/null +++ b/vendor/assets/foundation-emails/docs/assets/img/logos/sass-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/assets/foundation-emails/docs/assets/js/codeSample.js b/vendor/assets/foundation-emails/docs/assets/js/codeSample.js new file mode 100644 index 0000000..734ae26 --- /dev/null +++ b/vendor/assets/foundation-emails/docs/assets/js/codeSample.js @@ -0,0 +1,20 @@ +!function() { + +var $currentText = $('[data-docs-code-current]'); +var $toggleButtons = $('[data-docs-code-toggle]'); + +$toggleButtons.click(function(e) { + e.preventDefault(); + $('body').toggleClass('is-inky-enabled'); + + if ($('body').hasClass('is-inky-enabled')) { + $currentText.text('Inky'); + $toggleButtons.text('Switch to HTML'); + } + else { + $currentText.text('HTML'); + $toggleButtons.text('Switch to Inky'); + } +}); + +}(); diff --git a/vendor/assets/foundation-emails/docs/assets/js/docs.js b/vendor/assets/foundation-emails/docs/assets/js/docs.js new file mode 100644 index 0000000..947ba5a --- /dev/null +++ b/vendor/assets/foundation-emails/docs/assets/js/docs.js @@ -0,0 +1 @@ +$(document).foundation(); diff --git a/vendor/assets/foundation-emails/docs/assets/scss/_code.scss b/vendor/assets/foundation-emails/docs/assets/scss/_code.scss new file mode 100644 index 0000000..b04942b --- /dev/null +++ b/vendor/assets/foundation-emails/docs/assets/scss/_code.scss @@ -0,0 +1,6 @@ +.docs-code-html, +.docs-code-inky { + code { + max-height: 300px; + } +} diff --git a/vendor/assets/foundation-emails/docs/assets/scss/_compatibility.scss b/vendor/assets/foundation-emails/docs/assets/scss/_compatibility.scss new file mode 100644 index 0000000..6cbf50b --- /dev/null +++ b/vendor/assets/foundation-emails/docs/assets/scss/_compatibility.scss @@ -0,0 +1,157 @@ +// Compatability Table +// ------------------- +// A styled table used on the compatability page to show which browsers the framework works with. + +$primary: #002b36; +$secondary: #efefef; +$alert: #cf2a0e; +$warning: #ffae00; +$success: #43AC6A; +$gutter: 40px; +$rad: 5px; + +@mixin font-size($sizeValue){ + font-size: $sizeValue + px; + font-size: ($sizeValue / 10) + rem; +} + +@mixin -breakpoint($point) { + @if $point == smallmobile { + @media (max-width: 200px) { @content; } + } + @if $point == mobile { + @media (max-width: 640px) { @content; } + } + @if $point == tablet { + @media (max-width: 1000px) { @content; } + } + @if $point == smallscreen { + @media (max-width: 1120px) { @content; } + } +} + +.comparison-table { + display: block; + width: 100%; + border-collapse: separate; + thead tr { + color: $primary; + font-weight: bold; + text-transform: uppercase; + td { color: #666 !important; } + td { padding-bottom: 10px; } + td { border: none !important; } + } + tr { + width: 100%; + td { + border-right: 1px solid #ddd; + } + &:first-child { + td { border-top: 1px solid #ddd; } + td:first-child { + + } + td:last-child { + + } + } + &:last-child { + td { border-bottom: 1px solid #ddd; } + td:first-child { + + } + td:last-child { + + } + } + td:first-child { + width: 25%; + padding: 10px; + color: $primary; + font-weight: bold; + border-left: 1px solid #ddd; + } + td.marker.yes { + width: 10%; + text-align: center; + vertical-align: middle; + color: $success; + font-weight: bold; + } + td.marker.mostly { + width: 10%; + text-align: center; + vertical-align: middle; + color: $warning; + font-weight: bold; + } + td.marker.no { + width: 10%; + text-align: center; + vertical-align: middle; + color: $alert-color; + font-size: 1.3rem; + font-weight: bold; + } + } + tr:nth-child(even) { + background: $secondary; + } + @include -breakpoint(smallmobile) { + td, tr td, tr td.marker, tr td:first-child, tr td:first-child + td { + position: relative; + display: block; + width: 100%; + border-top: none; + border-bottom: none; + border-left: 1px solid #ddd; + } + tr:first-child td:first-child { + + } + tr:first-child td:last-child { + border-top-right-radius: 0; + } + tr:last-child td:first-child { + border-bottom-left-radius: 0; + } + tr:last-child td:last-child { + border-bottom: 1px solid #ddd; + } + tr td:first-child { + border-top: 1px solid #ddd; + & + td { + padding: 0 10px 10px; + } + } + tr td.marker { + padding: 10px; + font-weight: bold; + &:before { + content: "Grid: "; + } + & + td.marker:before { + content: "Layout/UI: "; + } + & + td.marker + td.marker:before { + content: "JS: "; + } + } + thead tr td.marker { + display: none; + } + } +} + +td.divider { + background: $dark-gray; + + &:first-child { + border-right: $dark-gray; + } + + &:last-child { + border-left: $dark-gray; + } +} \ No newline at end of file diff --git a/vendor/assets/foundation-emails/docs/assets/scss/_course-callout.scss b/vendor/assets/foundation-emails/docs/assets/scss/_course-callout.scss new file mode 100644 index 0000000..948708b --- /dev/null +++ b/vendor/assets/foundation-emails/docs/assets/scss/_course-callout.scss @@ -0,0 +1,40 @@ +.docs-course-callout { + display: block; + background: #A183D3; + color: $white; + padding: 1rem; + margin-top: 1rem; + + &:hover, + &:focus { + color: $white; + } + + .button { + background: $white; + color: #85769e; + font-weight: bold; + border-radius: 2px; + box-shadow: 0 2px 0 #999; + margin-bottom: 0; + } + + p { + font-size: rem-calc(14); + line-height: 21px; + } +} + +.docs-course-callout-subtitle { + text-transform: uppercase; + font-weight: bold; + letter-spacing: 1px; + font-size: rem-calc(12); + display: block; +} + +.docs-course-callout-title { + font-weight: bold; + margin-bottom: 0.75rem; + display: block; +} diff --git a/vendor/assets/foundation-emails/docs/assets/scss/docs.scss b/vendor/assets/foundation-emails/docs/assets/scss/docs.scss new file mode 100644 index 0000000..207bf75 --- /dev/null +++ b/vendor/assets/foundation-emails/docs/assets/scss/docs.scss @@ -0,0 +1,49 @@ +// The CSS for the Foundation docs is stored in an external codebase: +// https://github.com/zurb/foundation-docs +// +// You can test Sass changes locally by running these commands: +// git clone https://github.com/zurb/foundation-docs +// npm link ./foundation-docs +// +// Feel free to submit pull requests to foundation-docs like you would Foundation itself! + +$foundation-palette: ( + primary: #7465be, + secondary: #777, + success: #3adb76, + warning: #ffae00, + alert: #ec5840, +); + +@import 'node_modules/foundation-sites/scss/foundation'; +@import 'node_modules/motion-ui/src/motion-ui'; + +@include foundation-everything; +@include motion-ui-transitions; + +@import 'node_modules/foundation-docs/scss/foundation-docs'; + +@import 'code'; +@import 'compatibility'; +@import 'course-callout'; + +.dropdown.menu > li.is-dropdown-submenu-parent > a { + padding-right: 1rem; +} + +.dropdown.menu > li.is-dropdown-submenu-parent > a::after { + display: none; +} + +.docs-newsletter { + background: #2a2f58; +} + +.zurb-footer-top { + background: #1C1F3A !important; +} + +.callout.secondary.tip { + border: none; + border-left: 5px solid $primary-color; +} diff --git a/vendor/assets/foundation-emails/docs/layouts/component.html b/vendor/assets/foundation-emails/docs/layouts/component.html new file mode 100644 index 0000000..e503ab0 --- /dev/null +++ b/vendor/assets/foundation-emails/docs/layouts/component.html @@ -0,0 +1,314 @@ +

diff --git a/vendor/assets/foundation-emails/docs/layouts/default.html b/vendor/assets/foundation-emails/docs/layouts/default.html new file mode 100644 index 0000000..4bad2d3 --- /dev/null +++ b/vendor/assets/foundation-emails/docs/layouts/default.html @@ -0,0 +1,73 @@ + + + + + + + + + + Foundation for Emails 2 Docs{{#unlesspage 'index'}} | {{title}}{{/unlesspage}} + + + + + + +
+ + {{> off-canvas}} + +
+ + + + {{> navigation}} + {{> mobile-navigation}} + + + +
+
+ +{{> body}} +
+
+ {{> component-list}} + {{> course-callout}} +
+
+ + {{> footer}} +
+ +
+ + + + + + + + + + + diff --git a/vendor/assets/foundation-emails/docs/pages/alignment.md b/vendor/assets/foundation-emails/docs/pages/alignment.md new file mode 100644 index 0000000..cebbe72 --- /dev/null +++ b/vendor/assets/foundation-emails/docs/pages/alignment.md @@ -0,0 +1,215 @@ +--- +title: Alignment +description: Centering, images, text, buttons, and menus in HTML emails made easy. +--- + +Foundation includes a handful of helpful alignment classes to add common positioning behaviors to elements. + +--- + +## Text Alignment + +You can align text with the `.text-x` classes. These classes will appy to the large breakpoint as well as the small. + +```inky_example + + + + +

Left (default)

+
+ +

center

+
+ +

right

+
+
+
+``` + +If you need to change text alignment only on the small breakpoint, you can use the `.small-text-x` classes. + + +```inky_example + + + + +

Left on small

+
+ +

Center on small

+
+ +

Right on small

+
+
+
+``` + +You can combine these classes to override the behavior on the small breakpoint. + +```inky_example + + + + +

Center, small left

+
+ +

Right, small center

+
+
+
+``` + +--- + +## Centering Images + +Just wrap the `
` around an image you’ll be good to go. Inky will handle the magic behind the scenes! In the CSS version, you’ll add a `.float-center` class, `align="center"` attribute and wrap a <center> tag to make sure things are centered. + +```inky_example + + + +
+ image of clever meme that made me chuckle +
+
+
+
+``` + +So to be clear: with Inky you only need to wrap an image in `
` tag to reliably center it. + +In the CSS version, our centering recipe includes three ingredients: + +- `.float-center` class on the `` element +- `align="center"` attribute on the `` element +- Wrap the `` with `
` tags (needed for Outlook 2007, 2010, and 2011) + +Also, it's not really a float, but the `.float-center` class to an element to engage the automatic margin centering trick. Note that this will only work on elements with an absolute width, which means not a percentage or auto width. + +If you need to center an image only on mobile clients, you can apply the `.small-float-center` class. A good use case would be centering an image smaller than the full column width on devices like an iPhone 5, iPhone 6, and Android 4.4. + +```inky_example + + + + please don't forget me + + +

What is the deal?

+

Sweet beast sun bathe or chase mice rub face on everything or leave dead animals as gifts for mark territory play time.

+
+
+
+``` + +--- + +## Aligning Images Left and Right + +You can also align images to the left or the right. + +```inky_example + + + + + + + + + +``` + +--- + +## Centering a Button + +Wrap the button with `
` tags to center it. + +```inky_example + + + +
+ +
+
+
+
+``` + +--- + +## Centering Columns + +Tables by nature take up as much space is available to them. Because of this, centering columns can be done by adding empty columns to left and right of the column to be centered. + +```inky_example + + + + + Centering a column + + + + + Centering a column + + + + + Centering a column + + + +``` + +If you don't add a size attribute like `small="x"` then the columns will be equal width. + +--- + +## Centering a Menu + +Centering the menu is a common practice. Wrapping the menu in `
` tags will achieve this. + +```inky_example +
+ + Item + Item + Item + +
+``` + +--- + +## Vertical Alignment + +You can vertically align your content within columns by using `valign` attribute. The available values are `top`, `middle`, and `bottom`. + +```inky_example + + + + + +

Bottom

+
+ +

HEADLINE

+

SUBHEADLINE

+
+ + + +
+``` +
diff --git a/vendor/assets/foundation-emails/docs/pages/button.md b/vendor/assets/foundation-emails/docs/pages/button.md new file mode 100644 index 0000000..2a396ab --- /dev/null +++ b/vendor/assets/foundation-emails/docs/pages/button.md @@ -0,0 +1,83 @@ +--- +title: Button +description: Buttons are convenient tools when you need more traditional actions. To that end, Foundation has many easy to use button styles that you can customize or override to fit your needs. +sass: scss/components/_button.scss +--- + +Creating a bullet-proof button that works in all email clients requires a table nested inside of a table. Put the class `.button` on the outer ``. Inside of the inner table, put an `` with an `href` attribute containing your link. + +In Inky HTML, the ` +``` + +
+- It's important to add an `href` attribute to your `
+ +--- + +## Sizing + +By default, buttons are sized by the content and padding within them. You can also size a button according to it's parent container (see Expanded section). + +Buttons can be made larger or smaller by adding the class `.tiny`, `.small`, or `.large` to a button's outer `
`. + +In Inky HTML, add the same class to the ` + + + +``` + +Don't forget the `href=""` ;) + +--- + +## Expanded + +To create an expanded button (full width of it's container), add the class `.expanded` to the outer `
` of the button, and wrap a `
` tag around the ``. + +In Inky HTML, add the `.expanded` class to the ` + + + +``` + +--- + +## Coloring + +Change the background color of a button by adding the class `.secondary`, `.success`, `.warning`, or `.alert` to the outer `
` (or the ` + + + +``` + +--- + +## Radius and Round + +Creating buttons with a radius or rounded edges (like a pill) can be achieved by adding the `.radius` or `.rounded` class to a button. + +*Note - border-radius is not supported on Outlook 2000-2013, Yahoo! Mail, and Android 4+ (Gmail)* + +*Note - In order to create `.radius` and `.rounded` buttons, the border needs to be removed.* + +```inky_example + + + +``` diff --git a/vendor/assets/foundation-emails/docs/pages/callout.md b/vendor/assets/foundation-emails/docs/pages/callout.md new file mode 100644 index 0000000..4730469 --- /dev/null +++ b/vendor/assets/foundation-emails/docs/pages/callout.md @@ -0,0 +1,62 @@ +--- +title: Callout +description: Formerly panels, callouts can be used to create sidebar panels or call out important content in an email. +sass: scss/components/_callout.scss +tags: + - panel + - alert +--- + +## Basics + +A Callout adds a border, background, and some padding. Callouts use a full table structure, with the class `.callout` on the outer `
` (for bottom margin) and the `.callout-inner` applied to the innermost ``), add one column using this code: + +```html +
`. + +When using [Inky](inky.html) HTML, the `` tag will create this structure for you. You can wrap them around a row or inside a column. + +```inky_example + + +

Not in a callout :(

+
+ + +

I'm in a callout!

+
+
+
+ + + + +

This whole row is in a callout!

+
+
+
+``` + +--- + +## Coloring Classes + +The color of a callout can be changed by adding the class `.primary`, `.success`, `.warning`, or `.alert` to the element. A callout without a color class will have a white background. + +```inky_example + +

Successfully avoided Kraken. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.

+
+ +

Successfully avoided Kraken. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.

+
+ + +

Successfully avoided Kraken. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.

+
+ + +

There may be Krakens around. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.

+
+ + +

Incoming Kraken! Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.

+
+``` diff --git a/vendor/assets/foundation-emails/docs/pages/compatibility.md b/vendor/assets/foundation-emails/docs/pages/compatibility.md new file mode 100644 index 0000000..48f7c5c --- /dev/null +++ b/vendor/assets/foundation-emails/docs/pages/compatibility.md @@ -0,0 +1,173 @@ +--- +title: Compatibility +description: Foundation for Emails is battle-tested in the trickiest email clients, like Microsoft Outlook. +--- + +Foundation for Emails is designed for and tested on numerous email clients and devices. Here's the rundown on what type of compatibility to expect in general. Because email clients have varying CSS support and specific quirks, each individual component will have more information on compatibility. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Email Client/DeviceCompatibility
Apple Mail:
Apple Mail 7
Apple Mail 8
Outlook:
Outlook 2000
Outlook 2002
Outlook 2003
Outlook 2007
Outlook 2010
Outlook 2011
Outlook 2013
Outlook 2016
Mobile:
Android 4.4
Gmail app for Android✓ *
iPhone 5
iPhone 6
iPad
iPad Mini
Gmail:
In Internet Explorer
In Firefox
In Chrome
Google Apps:
In Internet Explorer
In Firefox
In Chrome
Office 365:
In Internet Explorer
In Firefox
In Chrome
Outlook.com:
In Internet Explorer
In Firefox
In Chrome
Yahoo! Mail:
In Internet Explorer
In Firefox
In Chrome
+ + ** *Gmail app for Android:** Works - does not recognize media queries so it will render large breakpoint. diff --git a/vendor/assets/foundation-emails/docs/pages/css-guide.md b/vendor/assets/foundation-emails/docs/pages/css-guide.md new file mode 100644 index 0000000..6bbd41f --- /dev/null +++ b/vendor/assets/foundation-emails/docs/pages/css-guide.md @@ -0,0 +1,181 @@ +--- +title: Getting Started with CSS +description: Get started with the CSS version of Foundation for Emails. +--- + +Foundation for Emails takes the pain out of developing HTML emails by giving you a set of powerful, tested components out of the box. This includes a fully-responsive grid, buttons, callouts, menus, and more. + +In this Getting Started guide, we'll download Foundation for Emails, construct the basic grid, and then inline our email so it's ready to test. + +--- + +## Installing + +If you haven't yet, download the starter files for Foundation for Emails. They include the boilerplate HTML needed for an email, and all of the CSS for Foundation. + +Download Foundation for Emails + +Unzip the folder and open it in your text editor of choice. + +--- + +## File Structure + +Here's a breakdown of the files in the folder you got: + +- `css/foundation-emails.css`: the Foundation for Emails CSS. +- `index.html`: a blank boilerplate to get started. +- `templates/`: a set of pre-made templates following common email layouts. + +We'll be writing a layout from scratch, so open up `index.html`. + +--- + +## Boilerplate + +Inside `index.html`, you can see the boilerplate needed to make an HTML work, with comments explaining what does what. + +```html + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ + +``` + +--- + +## Grid Basics + +Foundation for Emails includes many common elements needed to make HTML emails: a grid, typography styles, buttons, callouts, and more. + +The markup required to create HTML emails that work in all email clients is *complicated*, and involves writing many tables. However, all of Foundation's components are thoroughly tested in every major email client, including the problematic ones like Outlook. The rigid structure ensures your designs don't look off in any email client. + +Let's start by building a basic grid. To do that, we need three pieces: a container, a row, and then some columns. + +### Container + +Most Foundation for Emails components are full tables, including the container. Inside the `
` tag of `index.html`, add this table code: + +```html + + + + +
+``` + +The **container** will wrap the body of your entire email. It applies a maximum width to the body of the email. Every email needs this bit of boilerplate. + +### Row + +Next, let's build the grid itself, starting with the row. **Rows** group columns together into a unit. Inside of your container, add this table: + +```html + + + + +
+``` + +### Columns + +Columns divide your layout into horizontal sections that sit side-by-side. On small screens, these columns stack on top of each other to save space—unless you set them up to keep their layout on small screens. + +Inside of your row (the innermost `
+ + + + +
+ Column One +
+``` + +In the above example, we used the classes `.small-12` and `.large-6` to define the size of the column on small vs. large email clients. Foundation uses a 12-column grid, so on mobile clients, the column stretches the full width of the page, and on desktop clients, the column is half the width of the row. + +Since this first column is half-width, we need a second one to go with it. *After* the `` for the first column, add the code for the second column: + +```html + + + + + + +
+ Column One + + Column Two +
+``` + +You may have noticed the `.first` and `.last` classes on the column. The first column in a row needs the `.first` class, and the last column in a row needs the `.last` class. This is explained more in the [First and Last Classes](grid.html#first-and-last-classes) section of the grid documentation. + +That's a lot of HTML! Let's look at what it is at a high level: + +```html + + + + +``` + +The CSS classes are always on the outermost table element, so that's an easy way to identify where a component starts. The container starts at the table with the `.container` class, the row starts at the table with the `.row` class, and so on. + +--- + +## Inlining + +Now that we have a basic email, the last thing we need to do before we can send it is *inline* it. This is the process of injecting all of the CSS for the email into the HTML, so that it works as a self-contained file. + +Email clients like Gmail and Outlook strip out ` + + + 4 columns, 6 columns on small + 8 columns, 6 columns on small + +``` + +--- + +## Using the Media Query + +The media query will wrap the styles you wish to affect. Because there is only one breakpoint to consider and it's a max-width, your mobile styles or overrides will go in a media query. If you're using the CSS version of Foundation, use this media query to imitate the core breakpoint: + +```scss +/* Small only */ +@media screen and (max-width: 596px) {} +``` + +The Sass version of Foundation uses a convenient variable to set the breakpoint width. Use this media query to imitate the core breakpoint: + +```scss +/* Small only */ +@media only screen and (max-width: #{$global-breakpoint}) {} +``` + +### Example usage + +```scss +.newsletter-title { + text-transform: uppercase; + font-size: 9px; + padding-left: 40px; + font-weight: bold; + + @media only screen and (max-width: #{$global-breakpoint}) { + padding-left: 0; + } +} +``` + +```scss +@media only screen and (max-width: #{$global-breakpoint}) { + p { + font-size: 19px; + font-weight: 600; + } +} +``` + +--- + +## Changing the Breakpoint + +Changing the breakpoint is easy in the Sass version. In the `_settings.scss` you can control the width of this breakpoint. + +```scss +$global-breakpoint: $global-width + $global-gutter; +``` + +The `$global-breakpoint` is a combined width of the `$global-width` and the `$global gutter`. You could hard-code a pixel value here instead of the variables or change the `$global-width` (recommended) as it takes account for the gutter calculation. + +```scss +$global-width: 580px; +``` + + + diff --git a/vendor/assets/foundation-emails/docs/pages/menu.md b/vendor/assets/foundation-emails/docs/pages/menu.md new file mode 100644 index 0000000..5d55d6b --- /dev/null +++ b/vendor/assets/foundation-emails/docs/pages/menu.md @@ -0,0 +1,52 @@ +--- +title: Menu +description: Use the menu component to create a horizontal or vertical list of links. +sass: scss/components/_menu.scss +--- + +## Basics + +A menu is a `` with a class of `.menu` and a `` inside of it. Each link in the menu is a ` + + + +``` + +### Offset Columns +Because we’ve eliminated the wrapper, offsets are now directly applied to the column itself. + +Version 1 + +``` +
` with an `` inside of it. + +In Inky HTML, use the tag `` to make a menu, and the tag `` to make an item. + +```inky_example + + Item + Item + Item + +``` + +
+- It's important to add an `href` attribute to your ``'s to ensure that Outlook.com will not display `[undefined]` in your rendered email.
+- Office 365 and Outlook.com require a valid url in the href attribute or you can use the # placeholder. +
+ +--- + +## Vertical Menu + +Menus align horizontally by default. To switch to a vertical menu, add the class `.vertical` to the menu. + +```inky_example + + Item + Item + Item + +``` + +--- + +## Vertical Menu on the Small Breakpoint + +Menus align horizontally by default. To switch to a vertical menu on the small breakpoint only, add the class `.small-vertical` to the menu. This works well because the email clients that support media queries fall into the small breakpoint like iPhones and Android 4.4. + +```inky_example + + Item + Item + Item + +``` \ No newline at end of file diff --git a/vendor/assets/foundation-emails/docs/pages/migration.md b/vendor/assets/foundation-emails/docs/pages/migration.md new file mode 100644 index 0000000..16ee073 --- /dev/null +++ b/vendor/assets/foundation-emails/docs/pages/migration.md @@ -0,0 +1,511 @@ +--- +title: Foundation for Emails 2 Migration Guide +description: This guide describes the changes required to migrate a Foundation for Emails template from version 1 (formerly Ink) to Foundation for Emails 2. +tags: + - upgrade +--- + +## What’s new? + +- **Streamlined and updated responsive grid:** We’ve simplified the markup in the new version so it’s faster and easier to code. The new responsive grid in Emails 2 requires fewer tags and classes. It’s also now responsive on Android Native! +- **Inky templating language:** With Inky you can write less code and get more done. The Inky language gets you out of tables and into a simpler, more web-like, HTML. +- **Built with Sass:** Now faster than ever, you can easily make sweeping visual changes to your email that reflect your brand styles - all within one settings file. +- **ZURB Stack:** All kinds of task automation - [Panini](http://foundation.zurb.com/sites/docs/panini.html), our Handlebars templates, compiling Sass, BrowserSync, image compression, and auto inlining are built in to speed up your workflow. + +--- + +## Overview + +First off, you'll want to choose a version to get started with. +
[CSS version](css-guide.html) or the [Sass version with Inky](sass-guide.html) + +When migrating, the following items can be translated easily from 1 to 2: +- Boilerplate +- Visibility +- Typography +- Text helper classes +- Container +- Panel +- Media Queries + +Other areas may require more changes to work correctly including: +- Grid +- Sub-grid (now part of Grid) +- Button class + +What’s new that you might want to use: +- Menu - Horizontal +- Menu - Vertical + +--- + +## HTML + +With Foundation for Emails 2, confusing and tedious tables are a thing of the past. The new Inky markup will save you time and energy coding your emails. It looks like: + +``` + + + + Content + + + Content + + + +``` + +You can use it to create the grid structure, buttons, and other components. We’ll go into this in detail in the components section. We'll explain more in the
Grid section. + +--- + +## CSS & Sass + +Foundation for Emails 2 is available in a Sass version which let’s you quickly change common CSS values with some simple variables within the settings. + +These are some CSS classes that are no longer needed for proper spacing: +- `.wrapper` +- `.wrapper-last` +- `.text-pad` +- `.text-pad-left` +- `.text-pad-right` + +Some helper classes have changed: + +`.center` was used in version 1 to center text. + +Version 2 now has more alignment classes: +- `.text-center`: centers text +- `.text-left`: aligns text to the left +- `.text-right`: aligns text to the right +- `.small-text-center`: centers text on the small breakpoint +- `.small-text-left`: left aligns text on the small breakpoint +- `.small-text-right`: right aligns text on the small breakpoint +- `float-center`: centers an image (see the [alignment docs](alignment.html) for best practices.) + +--- + +## Ink 1.0 Components + +### Grid + +#### Old Markup + +In the Ink 1.0, we needed extra tags to support a wrapper element. This used to control the gutter and margins of a column. + +``` + + + + +
+ + + + + +
+ + + + + + +
+ +
+ +
+ +
+``` + +#### New Markup + +In Foundation for Emails 2, we’ve eliminated another tag in an effort to simplify your markup. Gutters are now directly applied to the column element itself. We still need to identify the last column with a `.last` class, and now the first column element with the `.first` class. If you have columns in the middle of first and last, they don't need a `.first` or `.last` class. + +Also, we stitched `
`'s to ``'s because that allows Android 4 native to be responsive - win! + +``` + + + + + +
+ + + + +
+ +
+
+``` + +#### New Markup (Inky HTML) + +``` + + + + + + + +``` + +--- + +### Sub-grid + +In an effort to unify the thinking across the Foundation family, we’ve removed the sub-columns and moved towards a fully functional small grid. + +#### Old Markup + +``` + + + + +
+ + + + + + + +
+ + + +
+ +
+``` + +#### New Markup (Plain HTML) + +``` + + + + +
+ + + + + + + + +
+ + + +
+ +
+``` + +#### New Markup (Inky HTML) + +``` + + + + + + + + + + +``` + +--- + +### Block Grid + +The block grid has a minor syntax change with identifying the number of elements that are displayed in the row. We’ve moved to the convention of `.up-x`, instead of `.x-up`. + +#### Old Markup + +``` + + + + +
+ Thing 1 + + Thing 2 + + Thing 3 +
+``` + +#### New Markup (Plain HTML) + +``` + + + + +
+ Thing 1 + + Thing 2 + + Thing 3 +
+``` + +#### New Markup (Inky HTML) + +``` + + Thing 1 + Thing 2 + Thing 3 + +``` + +--- + +### Offset Columns + +Because we’ve eliminated the wrapper, offsets are now directly applied to the column itself. + +#### Old Markup + +``` + + + + +
+ + + + + + +
+ +
+
+``` + +#### New Markup (Plain HTML) + +``` + + + + +
+ +
+``` + +#### New Markup (Inky HTML) + +``` + + + + + +``` + +Offsets now can be used on the small breakpoint or the large, or both. They will shift over a set of columns over from the left. + +--- + +### Buttons + +In the previous version of F4E the text inside of the button was the only clickable element. In F4E 2, we’ve taken a hybrid approach of using padding and borders to increase the clickable area. It requires one more table but the result is a much bigger touch target which is good for usability. + +#### Old Markup + +``` + + + + +
+ Button Label +
+``` + +#### New Markup (Plain HTML) + +``` + + + + +
+ + + + +
+ I am successful +
+
+``` + +#### New Markup (Inky HTML) + +``` + +``` + +Centering a button is easier now, just wrap the button with `
` tags. + +--- + +### Panels + +In an effort to unify the terminology across the Foundation family `panels` are now called `callouts`. + +#### Old Markup + +``` + + + + + +
+ Panel content +
+``` + +#### New Markup (Plain HTML) + +``` + + + + + +
+ +
+``` + +#### New Markup (Inky HTML) + +``` + + +

One Word

+
+ + +

I'm in a callout!

+
+
+
+ + + + + + +

This whole row is in a callout!

+
+ +

This whole row is in a callout!

+
+
+
+
+
+``` + +You can wrap a callout around a `` or the content inside a ``. + +--- + +## New Components + +### Menu + +#### Old Markup (Plain HTML) + +``` + + + + +
+ + + + + + + +
+``` + +#### New Markup (Inky HTML) + +``` + + Item One + Item Two + Item Three + +``` + +The menu component can be used to create a simple set of links comonly used in headers, for social icons or in footers. Adding the `.vertical` class will change the orientation. You can even make it vertical on the small breakpoint only with `.small-vertical`. + +### Spacer + +#### New Markup (Inky HTML) + +``` + +``` + +The spacer component creates consistant vertical spacing between or inside of elements. The size `size="x"` attribute allows you to set the height in pixels of vertical spacing you need. + +### Wrapper + +#### New Markup (Inky HTML) + +``` + + content here + +``` + +The wrapper component allows you to wrap content to target CSS within it. You can add classes to it so you can easily create a full with background. + +## Dependencies + +The CSS version works exactly like the one we distributed with Ink 1.0. Check out our [getting started guide](css-guide.html) to learn more. + +To use the Sass version with the Inky markup language you'll want to install the Foundation for Emails project template. We have another [getting started guide](sass-guide.html) just for the Sass version of Foundation. diff --git a/vendor/assets/foundation-emails/docs/pages/panini.md b/vendor/assets/foundation-emails/docs/pages/panini.md new file mode 100644 index 0000000..3f833f8 --- /dev/null +++ b/vendor/assets/foundation-emails/docs/pages/panini.md @@ -0,0 +1,240 @@ +--- +title: Panini +description: A flat file compiler that powers our prototyping template. Create pages with consistent layouts and reusable partials with ease. +library: + github: https://github.com/zurb/panini + docs: https://github.com/zurb/panini +--- + +{{{{raw}}}} + +If you've ever created a static site, maybe you had five pages that all shared the same header and footer. You create your first page, and then copy and paste the common elements to the next page. But now if you need to make a change to the header, the change has to be made across multiple files. You can do this with Emails in your campaigns too! + +Panini is a flat file compiler that uses the concepts of templates, pages, and partials—powered by the [Handlebars](http://handlebarsjs.com/) templating language—to streamline the process of creating static prototypes. + +Our [prototyping template](starter-projects.html) uses Panini, along with a host of other tools for processing Sass and images, to make creating optimized templates easy. It's already been configured to utilize all of the features below, but if you want to learn the specifics of how to configure the library, head over to the [Panini GitHub page](https://github.com/zurb/panini). + +--- + +## Basics: Templates & Pages + +A **template** is a common layout that every page in your design shares. It's possible to have multiple templates, but generally you'll only need one, and a page can only use one template. In the prototyping template, the default layout is found under `src/layouts/default.html`. + +Here's what a basic template might look like: + +```handlebars + + + Definitely an Email! + + +
+ {{> body}} +
+ + +``` + +In the middle of the HTML is a bit of Handlebars code: `{{> body}}`. This is where the pages you write are injected when Panini runs, giving you a series of complete HTML files at the end. + +The **pages** make up the guts of your layouts. These files will just have the middle section of the design, since the layout already covers the top and bottom. The prototyping template includes one blank page to get you started, under `src/pages/index.html`. + +A basic page might look like this: + +```html +

Page Title

+

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Praesentium ducimus eligendi, reiciendis corporis quam facere quaerat qui, aspernatur molestiae velit, vero ea quisquam laborum corrupti repudiandae totam, at aliquam esse.

+``` + +Note that there's no `` or `` tags, and no header or footer. This code will be injected into the `{{> body}}` declaration when Panini assembles your pages. + +In the prototyping template, these finished files are compiled into a standalone folder called `dist` (short for "distribution"), which also includes your processed CSS, JavaScript, and images. This folder can easily be uploaded to any ESP (Email Service Provider). + +--- + +## Partials + +Partials are a feature of Handlebars which allow you to inject HTML anywhere in a page or layout. They're really useful when you need to repeat certain chunks of code throughout your pages, or to keep individual files from getting too cluttered with HTML. + +Here's an example of a layout file that divides its key sections into partials: + +```handlebars + + + Definitely STILL an Email! + + + {{> header}} + {{> body}} + {{> footer}} + + +``` + +The `{{> }}` syntax tells Handlebars to look for an HTML file with that name, and inject it at that place. In this example, we have files called `header.html`, `navigation.html`, and `footer.html`. In the prototyping template, these files all exist within `src/partials`. + +--- + +## Page Variables + +Pages have a few built-in variables, which can be used within the page template itself, or within a layout or partial being used in tandem with the page. + +### page + +Prints the name of the current page, without its original file extension. In the below example, if the page is `index.html`, `{{page}}` will become `index`. + +```handlebars +

You are here: {{page}}

+``` + +### root + +Use `{{root}}` before a file path to make sure it works no matter what folder the current page is in. + +For example, a path to an external CSS file will need to be different if the current page is at the root level of your site, or in a sub-folder. + +Here's how you'd use it with a `` tag: + +```handlebars + +``` + +If the page is `index.html`, the path will look like this: + +```html + +``` + +If the page is `folder/page.html`, the path will look like this: + +```html + +``` + +The `../` is added only on pages in a sub-folder, so the CSS can still be properly loaded. + +--- + +## Helpers + +Helpers are special functions that manipulate content on the page. In addition to [Handlebars's built-in helpers](http://handlebarsjs.com/builtin_helpers.html), Panini includes a few custom helpers and you can add your own. + +### ifpage + +Displays the HTML inside the helper only on specific pages. In the below example, the HTML inside the helper will only show up on the `index.html` page. + +```handlebars +{{#ifpage 'index'}} +

This is definitely the Index page.

+{{/ifpage}} +``` + +You can also check for multiple pages. If *any* name in the list matches the current page, the HTML will appear. + +```handlebars +{{#ifpage 'index' 'about'}} +

This is definitely either the Index or About page.

+{{/ifpage}} +``` + +### unlesspage + +The opposite of `#ifpage`, `#unlesspage` will only display the HTML inside of it if the current page is *not* in the parameters. + +```handlebars +{{#unlesspage 'index'}} +

This is definitely not the Index page.

+{{/unlesspage}} +``` + +### repeat + +Repeats the content inside of it `n` number of times. Use this to easily print lots of duplicate HTML in a prototype. + +```handlebars +
    + {{#repeat 5}} +
  • Five hundred ninety-nine US dollars
  • + {{/repeat}} +
+``` + +### markdown + +Converts Markdown into HTML. + +```handlebars +{{#markdown}} +# Heading 1 +Lorem ipsum [dolor sit amet](http://html5zombo.com), consectetur adipisicing elit. Nam dolor, perferendis. Mollitia aut dolorum, est amet libero eos ad facere pariatur, ullam dolorem similique fugit, debitis impedit, eligendi officiis dolores. +{{/markdown}} +``` + +### Custom Helpers + +If you don't see the right helper, you can write your own. Add a javascript file to 'src/helpers', restart npm, then call it in your templates. + +``` +// Example file src/helpers/bold.js +module.exports = function(options) { + // options.fn(this) = Handelbars content between {{#bold}} HERE {{/bold}} + var bolder = '' + options.fn(this) + ''; + return bolder; +} +``` +Then in your projects call your custom `{{#bold}}` helper + +``` +{{#bold}}ideas{{/bold}} +``` + +--- + +## Custom Data + +Custom data can be added to your pages. This data can then be inserted into your HTML through Handlebars. There are two ways to add data to a project. + +To add variables to a specific page only, add it at the top of the page's HTML as a [Front Matter](http://jekyllrb.com/docs/frontmatter/) block. Let's say the below content is inside `src/pages/index.html`. + +```html +--- +title: Page Title +description: Lorem ipsum. +--- + + +``` + +Now, you can insert the values of these variables into the `index.html` page, *or* the `default.html` layout. To insert a variable, wrap the name of the variable in double curly braces, like so: + +```handlebars +

{{ title }}

+``` + +Variables can also be added globally by creating an external JSON or YML file, and adding it to the `src/data` folder in your project. Let's create a file called `breakfast.yml`: + +``` +- eggs +- bacon +- toast +``` + +Panini will load in the contents of this YML file as a variable called `{{ breakfast }}`. Because it's an array, we can loop through it using Handlebars's `{{#each}}` helper: + +```handlebars +
    + {{#each breakfast}} +
  • {{ this }}
  • + {{/each}} +
+``` + +This code will print three `
  • `s, one for each item in the file. + +## Tutorials + +[Staying D.R.Y. with Panini](http://zurb.com/university/lessons/staying-d-r-y-with-panini) +Panini comes with tons of Handlebars helpers built in, like a repeat helper or markdown parser, but in this lesson we’ll take a look at creating a custom month/year helper for an HTML email. + + +{{{{/raw}}}} diff --git a/vendor/assets/foundation-emails/docs/pages/sass-guide.md b/vendor/assets/foundation-emails/docs/pages/sass-guide.md new file mode 100644 index 0000000..4139199 --- /dev/null +++ b/vendor/assets/foundation-emails/docs/pages/sass-guide.md @@ -0,0 +1,179 @@ +--- +title: Getting Started with Sass +description: Get started with the Sass-powered ZURB Stack for writing HTML emails. +--- + +Foundation for Emails takes the pain out of developing HTML emails by giving you a set of powerful, tested components out of the box. This includes a fully-responsive grid, buttons, callouts, menus, and more. + +The Sass workflow for Foundation for Emails is backed by the [ZURB Email Stack](zurb-stack.html), an all-in-one build system for creating HTML emails. This workflow requires a bit more up-front setup, but the tooling makes it wicked fast to code, and keeps your code amazingly clean with our new custom HTML tags in Inky. + +The ZURB Stack workflow also includes Handlebars, allowing you to write emails as templates instead of static files. Lastly, you can easily make sweeping design changes with the Sass [settings file](sass.html#the-settings-file). Here’s everything that’s packaged in this template: + +- Inky HTML +- Sass +- Handlebars templates +- BrowserSync +- Image compression +- Inlining + +In this Getting Started guide, we'll download Foundation for Emails, construct the basic grid, and then inline our email so it's ready to test. + +--- + +## Requirements + +To use the Sass version of Foundation for Emails, you need Node.js installed on your computer. Node is compatible with Windows, OS X, and Linux—the [Node.js website](https://nodejs.org/) has installers for every operating system. + +--- + +## Installing + +We'll use the Foundation CLI to set up a new project. If you already have the Foundation CLI installed from Foundation for Sites or Apps, you can skip this first command. + +```bash +npm install --global foundation-cli +``` + +If you run into any permission errors (EACCESS) on OS X or Linux, you can try prefixing the command with `sudo`. + +```bash +sudo npm install --global foundation-cli +``` + +Once the CLI is installed on your machine, it’s super easy to fire up a blank Foundation for Emails project. Move into the folder you store your projects in, and then run this command: + +```bash +foundation new --framework emails +``` + +The CLI will ask you for a project name, which is used as the name of the folder to install in. After that, the project template will be downloaded, and the various dependencies installed. The entire process takes over a minute. + +--- + +## Running the Server + +After your project has been installed, run `cd project`, where `project` is the name of the project just created. Then run: + +```bash +npm start +``` + +This will kick off the build process, which includes HTML parsing, Sass, image compression, and a server. When the initial build finishes, your browser will pop open a new tab pointing to your project. You'll be seeing a blank `index.html` file. + +--- + +## File Structure + +You'll do all of your work in the `src` folder of your project. The various HTML files, Sass files, and images inside of `src` are compiled to a new folder called `dist/` (as in "distribution"), which contains the final HTML and CSS for your emails. These are the files you'll upload to Litmus, Campaign Monitor, etc. for testing, or load into your email campaign service. + +Here's a breakdown of the files in the `src` folder: + +- `assets/`: Sass and image files. +- `layouts/`: Boilerplate HTML that wraps all of your emails. +- `pages/`: HTML files for emails. +- `partials/`: Reusable chunks of HTML that can be injected into pages. + +--- + +## Boilerplate + +Inside `src/layouts/default.html`, you can see the boilerplate needed to make an HTML work. Below we've annotated this boilerplate, explaining what does what. + +{{{{raw}}}} + +```html + + + + + + + + + + + + + + + + + + + + + +
    +
    + + {{> body}} +
    +
    + + +``` + +{{{{/raw}}}} + +--- + +## Grid Basics + +Foundation for Emails includes many common elements needed to make HTML emails: a grid, typography styles, buttons, callouts, and more. + +The markup required to create HTML emails that work in all email clients is *complicated*, and involves writing many tables. However, the ZURB Stack includes Inky, a templating language that converts simple HTML tags to the complex HTML required for the components. + +Let's build a basic grid. + +```html + + + Column One + Column Two + + +``` + +Here we're using all three of the key layout elements: the container, row, and column. + +A **container** will wrap the body of your email. It applies a maximum width to the body of the email. + +**Rows** are used to group sets of **columns** together. Columns divide your layout into horizontal sections that sit side-by-side. On small screens, these columns stack on top of each other to save space—unless you set them up to keep their layout on small screens. + +In the above example, we used the attribute `large` on the `` tag to define a size for that column *on large screens*. Foundation uses a 12-column grid, and since `large="6"`, that means each column will take up half the width of the row. On a small screen, each columns will be full width and the second column will stack underneath. + +--- + +## Inlining + +Now that we have a basic email, the last thing we need to do before we can send it is *inline* it. This is the process of injecting all of the CSS for the email into the HTML, so that it works as a self-contained file. + +Email clients like Gmail and Outlook strip out ` + + + +
    + + + + + + +

    BASIC

    +
    +
    +
    +
    + +
    +``` + +Using this structure outside of the container will yeild a fluid width background that expands to the width of the email client's viewport. + + diff --git a/vendor/assets/foundation-emails/docs/pages/zurb-stack.md b/vendor/assets/foundation-emails/docs/pages/zurb-stack.md new file mode 100644 index 0000000..ecf7e9a --- /dev/null +++ b/vendor/assets/foundation-emails/docs/pages/zurb-stack.md @@ -0,0 +1,16 @@ +--- +title: ZURB Stack +descripiton: The ZURB email stack is a boilerplate that gives you everything you need to develop and test HTML emails. +--- + +Email and web development can get complicated fast. We’ve introduced the ZURB Stack which helps you get started faster and lets you do more - without having to spend time finding the right tool for the job. The ZURB Stack includes: + +- **Gulp.** This is our task runner of choice for Foundation. Gulp lets us queue up tasks to execute. This lets us do cool things like inlining automagically updating your browser. It’s what the Stack is built on. [Find out more about Gulp](http://gulpjs.com/). +- **Sass.** We use Libsass as our CSS preprocessor of choice. If you’re not familiar with Sass, it lets you use variables, nesting, and mixins (to name a few). [Learn more about Sass](http://sass-lang.com/). +- **Inlining.** One of the biggest headaches and time-sucks used to be inlining your HTML email. Well, no more! We’re using gulp-inline to to scan your CSS file and and automatically inject your CSS when you’re ready. Just run `npm run build` in your project when you’re ready to inline. +- **Build Options.** By default the inliner works without removing whitespaces and inlining for you, you have to change your settings in the inliner function (`function inliner(css)`) on your gulpfile.babel.js which is the root of your project. To change these settings go and update this part of the function as you wish: ``` .pipe($.htmlmin, { collapseWhitespace: true, minifyCSS: true }); ```. +- **Panini.** This is our flat file generator for Foundation. Just like it’s real-world counterpart, it takes a set of ingredients and flattens them into one delicious item. This lets you separate things like the header and footer content into partials, letting you focus on your code when you’re building. It’s built off of Handlebars, which let’s you keep things super organized with partial files and repeatable sections. Checkout our [Panini Repo](https://github.com/zurb/panini). +- **BrowserSync.** BrowserSync is awesome. It’s the specific tool in our ZURB Stack that let’s you see your code changes in the browser in real-time. Just save your code and watch the magic happen in your browser. [Learn more about BrowserSync](https://www.browsersync.io/). +- **Image Compression.** Finally, we’ve added gulp-imagemin which intelligently reduces the file-size of your png, jpeg, gif, and svg images. This lets your emails load at lightning speeds! [Check out the gulp-imagemin repo](https://github.com/sindresorhus/gulp-imagemin). + +The ZURB Stack is just a starting place that lets you do all of the things mentioned above! You can totally rip out or add to the ZURB Stack’s gulp file to make your perfect email environment. diff --git a/vendor/assets/foundation-emails/docs/partials/component-list.html b/vendor/assets/foundation-emails/docs/partials/component-list.html new file mode 100644 index 0000000..9a7ff03 --- /dev/null +++ b/vendor/assets/foundation-emails/docs/partials/component-list.html @@ -0,0 +1,40 @@ + diff --git a/vendor/assets/foundation-emails/docs/partials/course-callout.html b/vendor/assets/foundation-emails/docs/partials/course-callout.html new file mode 100644 index 0000000..426c884 --- /dev/null +++ b/vendor/assets/foundation-emails/docs/partials/course-callout.html @@ -0,0 +1,6 @@ + + ZURB Master Class + Responsive Emails +

    In this online class, you’ll learn how to rapidly design and develop responsive emails that look beautiful on just about every screen, browser, and email client out there—even Outlook.

    + View Class +
    diff --git a/vendor/assets/foundation-emails/docs/partials/footer.html b/vendor/assets/foundation-emails/docs/partials/footer.html new file mode 100644 index 0000000..3bafe2a --- /dev/null +++ b/vendor/assets/foundation-emails/docs/partials/footer.html @@ -0,0 +1,113 @@ +
    +
    +
    +
    Stay on top of what’s happening in responsive design.
    +

    Sign up to receive monthly Responsive Reading highlights. Read Last Month's Edition »

    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + + + diff --git a/vendor/assets/foundation-emails/docs/partials/mobile-navigation.html b/vendor/assets/foundation-emails/docs/partials/mobile-navigation.html new file mode 100644 index 0000000..9fce5d0 --- /dev/null +++ b/vendor/assets/foundation-emails/docs/partials/mobile-navigation.html @@ -0,0 +1,80 @@ +
    +
    + + Foundation +
    +
    + + + +
    + + +
    diff --git a/vendor/assets/foundation-emails/docs/partials/navigation.html b/vendor/assets/foundation-emails/docs/partials/navigation.html new file mode 100644 index 0000000..6d9fc63 --- /dev/null +++ b/vendor/assets/foundation-emails/docs/partials/navigation.html @@ -0,0 +1,62 @@ + diff --git a/vendor/assets/foundation-emails/docs/partials/off-canvas.html b/vendor/assets/foundation-emails/docs/partials/off-canvas.html new file mode 100644 index 0000000..80b7e23 --- /dev/null +++ b/vendor/assets/foundation-emails/docs/partials/off-canvas.html @@ -0,0 +1,72 @@ + + +
    + + +
    diff --git a/vendor/assets/foundation-emails/gulpfile.js b/vendor/assets/foundation-emails/gulpfile.js new file mode 100644 index 0000000..d0624f6 --- /dev/null +++ b/vendor/assets/foundation-emails/gulpfile.js @@ -0,0 +1,222 @@ +var $ = require('gulp-load-plugins')(); +var gulp = require('gulp'); +var sequence = require('run-sequence'); +var panini = require('panini'); +var supercollider = require('supercollider'); +var rimraf = require('rimraf'); +var browser = require('browser-sync'); +var foundationDocs = require('foundation-docs'); +var octophant = require('octophant'); +var inky = require('inky'); +var siphon = require('siphon-media-query'); +var lazypipe = require('lazypipe'); +var fs = require('fs'); + +// Configuration for the documentation generator +supercollider + .config({ + template: foundationDocs.componentTemplate, + marked: foundationDocs.marked, + handlebars: foundationDocs.handlebars, + keepFm: true, + quiet: false, + pageRoot: 'docs/pages', + data: { + repoName: 'foundation-emails', + editBranch: 'develop' + } + }) + .searchConfig({ + sort: ['page', 'component', 'sass variable', 'sass mixin', 'sass function', 'js class', 'js function', 'js plugin option', 'js event'], + pageTypes: { + library: function(item) { + return !!(item.library); + } + } + }) + .adapter('sass') + .adapter('js'); + +// Cleans the build folder +gulp.task('clean', function(cb) { + rimraf('_build', cb); +}); + +// Copies static documentation assets +gulp.task('copy', function() { + return gulp.src(['docs/assets/**/*', '!docs/assets/scss/**/*', '!docs/assets/js/**/*']) + .pipe(gulp.dest('_build/assets')); +}); + +// Builds documentation pages +gulp.task('html', function() { + return gulp.src('docs/pages/**/*') + .pipe($.cached('docs')) + .pipe(supercollider.init()) + .pipe(panini({ + root: 'docs/pages/', + layouts: 'docs/layouts/', + partials: 'docs/partials/', + helpers: foundationDocs.handlebarsHelpers + })) + .pipe(gulp.dest('_build')) + .on('finish', function() { + supercollider.buildSearch('_build/data/search.json', function() {}); + }); +}); + +gulp.task('sass', ['sass:docs', 'sass:foundation']); + +// Compiles documentation-specific CSS +gulp.task('sass:docs', function() { + return gulp.src('docs/assets/scss/docs.scss') + .pipe($.sass({ includePaths: [process.cwd()] }).on('error', $.sass.logError)) + .pipe($.autoprefixer({ + browsers: ['last 2 versions', 'ie >= 9'] + })) + .pipe(gulp.dest('_build/assets/css')); +}); + +// Compiles Foundation-specific CSS +gulp.task('sass:foundation', function() { + return gulp.src('scss/foundation-emails.scss') + .pipe($.sass().on('error', $.sass.logError)) + .pipe(gulp.dest('_build/assets/css')); +}); + +// Compiles documentation JavaScript +gulp.task('javascript:docs', function() { + return gulp.src(['node_modules/foundation-docs/js/*.js', 'docs/assets/js/**/*.js']) + .pipe($.concat('docs.js')) + .pipe(gulp.dest('_build/assets/js')); +}); + +// Generates a Sass settings file from the current codebase +gulp.task('settings', function() { + octophant('scss/**/*.scss', { + title: 'Foundation for Emails Settings', + output: 'scss/settings/_settings.scss', + sort: ['global', 'grid', 'block-grid', 'type'] + }); +}); + +// Lints the Sass codebase +gulp.task('lint', function() { + return gulp.src('scss/**/*.scss') + .pipe($.sassLint()) + .pipe($.sassLint.format()) + .pipe($.sassLint.failOnError()); +}); + +// Creates a BrowserSync server +gulp.task('server', ['build'], function() { + browser.init({ + server: './_build' + }); +}); + +// Uploads the documentation to the live server +gulp.task('deploy:docs', ['build'], function() { + return gulp.src('./_build/**') + .pipe($.prompt.confirm('Make sure everything looks right before you deploy.')) + .pipe($.rsync({ + root: './_build', + hostname: 'deployer@72.32.134.77', + destination: '/home/deployer/sites/foundation-emails-march16' + })); +}); + +// Runs the entire build process +gulp.task('build', function(cb) { + sequence('clean', ['copy', 'html', 'sass', 'javascript:docs'], cb); +}); + +// Runs the build process, spins up a server, and watches for file changes +gulp.task('default', ['server'], function() { + gulp.watch('docs/**/*', ['html', browser.reload]); + gulp.watch(['docs/assets/scss/**/*', 'node_modules/foundation-docs/scss/**/*'], ['sass:docs', browser.reload]); + gulp.watch('scss/**/*.scss', ['sass:foundation', browser.reload]); +}); + +gulp.task('test', ['sass', 'test:compile'], function() { + browser.init({ server: 'test/visual/_build', directory: true }); + gulp.watch('scss/**/*.scss', ['sass:foundation', browser.reload]); + gulp.watch('test/visual/pages/*.html', ['test:compile', browser.reload]); +}); + +gulp.task('test:compile', function() { + gulp.src('test/visual/pages/*.html') + .pipe($.wrap({ src: 'test/visual/_template.html' })) + .pipe(inky()) + .pipe(inliner('_build/assets/css/foundation-emails.css')) + .pipe(gulp.dest('test/visual/_build')); +}); + +gulp.task('templates', function() { + return gulp.src('templates/*.html') + .pipe($.wrap({ src: 'test/visual/_template.html' })) + .pipe(inky()) + .pipe($.prettify({ indent_size: 2 })) + .pipe(gulp.dest('.templates')) + .pipe($.zip('all-templates.zip')) + .pipe(gulp.dest('.templates')); +}); + +gulp.task('download:build:index', function() { + return gulp.src('test/visual/_template.html', { base: 'test/visual' }) + .pipe($.injectString.replace('<%= contents %>', '')) + .pipe($.injectString.replace('../assets/', '')) + .pipe($.rename('index.html')) + .pipe(gulp.dest('.download')); +}); + +gulp.task('download:build:templates', ['templates'], function() { + return gulp.src('.templates/*.html') + .pipe(gulp.dest('.download/templates')); +}); + +gulp.task('download:build:css', ['sass:foundation'], function() { + return gulp.src('_build/assets/css/foundation-emails.css') + .pipe(gulp.dest('.download/css')); +}) + +gulp.task('download:build', ['download:build:index', 'download:build:templates', 'download:build:css'], function() { + return gulp.src('.download/**/*') + .pipe($.zip('foundation-emails.zip')) + .pipe(gulp.dest('.')); +}); + +gulp.task('download', ['download:build'], function(done) { + return gulp.src('foundation-emails.zip') + .pipe($.rsync({ + hostname: 'deployer@72.32.134.77', + destination: '/home/deployer/sites/foundation-sites-6-marketing/downloads/' + })); +}); + +gulp.task('dist', ['sass:foundation'], function() { + return gulp.src('_build/assets/css/foundation-emails.css') + .pipe(gulp.dest('dist')) + .pipe($.cssnano()) + .pipe($.rename('foundation-emails.min.css')) + .pipe(gulp.dest('dist')); +}); + +function inliner(css) { + var css = fs.readFileSync(css).toString(); + var mqCss = siphon(css); + + var pipe = lazypipe() + .pipe($.inlineCss, { + applyStyleTags: false, + removeStyleTags: false, + removeLinkTags: false + }) + .pipe($.injectString.replace, '', '') + .pipe($.htmlmin, { + collapseWhitespace: false, + minifyCSS: false + }); + + return pipe(); +} diff --git a/vendor/assets/foundation-emails/migration.md b/vendor/assets/foundation-emails/migration.md new file mode 100644 index 0000000..330ba8a --- /dev/null +++ b/vendor/assets/foundation-emails/migration.md @@ -0,0 +1,457 @@ +# Foundation for Emails 2 Migration Guide + +- [What’s new?](https://github.com/zurb/foundation-emails/blob/master/migration.md#whats-new) +- [Overview](https://github.com/zurb/foundation-emails/blob/master/migration.md#overview) +- [HTML](https://github.com/zurb/foundation-emails/blob/master/migration.md#html) +- [CSS/Sass](https://github.com/zurb/foundation-emails/blob/master/migration.md#csssass) +- [Components](https://github.com/zurb/foundation-emails/blob/master/migration.md#components) + - [Grid](https://github.com/zurb/foundation-emails/blob/master/migration.md#grid) + - [Buttons](https://github.com/zurb/foundation-emails/blob/master/migration.md#buttons) + - [Callout](https://github.com/zurb/foundation-emails/blob/master/migration.md#panels-are-now-callouts) + - [Menu](https://github.com/zurb/foundation-emails/blob/master/migration.md#menu) +- [Dependencies](https://github.com/zurb/foundation-emails/blob/master/migration.md#dependencies) + +#### This guide describes the changes required to migrate a Foundation for Emails template from version 1 (formerly Ink) to 2. + +## What’s new? + +- **Streamlined and updated responsive grid:** We’ve simplified the markup in the new version so it’s faster and easier to code. The new responsive grid in Emails 2 requires fewer tags and classes. It’s also now responsive on Android Native! +- **Inky templating language:** With Inky you can write less code and get more done. The Inky language gets you out of tables and into a simpler, more web-like, HTML. +- **Built with Sass:** Now faster than ever, you can easily make sweeping visual changes to your email that reflect your brand styles - all within one settings file. +- **ZURB Stack:** All kinds of task automation - [Panini](http://foundation.zurb.com/sites/docs/panini.html), our Handlebars templates, compiling Sass, BrowserSync, image compression, and auto inlining are built in to speed up your workflow. + +## Overview + +When migrating, the following items can be translated easily from 1 to 2: +- Boilerplate +- Visibility +- Typography +- Text helper classes +- Button class +- Container +- Panel +- Media Queries + +Other areas may require more changes to work correctly including: +- Grid +- Sub-grid (now part of Grid) + +What’s new that you might want to use: +- Menu - Horizontal +- Menu - Vertical + +## HTML + +With Foundation for Emails 2, confusing and tedious tables are a thing of the past. The new Inky markup will save you time and energy coding your emails. It looks like: + +``` + + + + + + +``` + +You can use it to create the grid structure, buttons, and other components. We’ll go into this in detail in the components section. We'll explain more in the [Grid section](https://github.com/zurb/foundation-emails/blob/master/migration.md#grid). + +## CSS/Sass + +Foundation for Emails 2 is available in a Sass version which let’s you quickly change common CSS values with some simple variables within the settings. + +These are some CSS classes that are no longer needed for proper spacing: +- .wrapper +- .wrapper-last +- .text-pad +- .text-pad-left +- .text.pad-right + +*** +## Components +*** + +### Grid + +Version 1 +In the previous version, we needed extra tags to support a wrapper element. This used to control the gutter and margins of a column. + +``` + + + + +
    + + + + + +
    + + + + + + +
    + +
    + +
    + +
    +``` + +Version 2 (CSS version) +In F4E 2, we’ve eliminated another a tag in an effort to simplify your markup. Gutters are now directly applied to the column element itself. We still need to identify the last column with a last class, however we also need to identify the first column element with the first class. + +``` + + + + + +
    + + + + +
    + +
    +
    +``` + +Version 2 (Inky markup) + +``` + + + + + + + +``` + +### Sub-grid is now a small grid +In an effort to unify the thinking across the Foundation family, we’ve removed the sub-columns and moved towards a fully functional small grid. + +Version 1 + +``` + + + + +
    + + + + + + + +
    + + + +
    + +
    +``` + +Version 2 (CSS version) + +``` + + + + +
    + + + + + + + + +
    + + + +
    + +
    +``` + +Version 2 (Inky markup) + +``` + + + + + + + + + + +``` + +### Block Grid +The block grid has a minor syntax change with identifying the number of elements that are displayed in the row. We’ve moved to the convention of `.up-x`, instead of `.ex-up`. + + +Version 1 + +``` + + + + +
    + Thing 1 + + Thing 2 + + Thing 3 +
    +``` + +Version 2 (CSS version) + +``` + + + + + + +
    Thing 1Thing 2Thing 3
    +``` + +Version 2 (Inky markup) + +``` + +
  • Thing 1Thing 2Thing 3
    + + + +
    + + + + + + +
    + +
    +
    +``` + +Version 2 (CSS version) + +``` + + + + +
    + +
    +``` + +Version 2 (Inky markup) + +``` + + + + + +``` + +## Buttons +In the previous version of F4E the text inside of the button was the only clickable element. In F4E 2, we’ve taken the hybrid approach of using padding and borders to increase the clickable area + +Version 1 + +``` + + + + +
    + Button Label +
    +``` + +Version 2 (CSS version) + +``` + + + + +
    + + + + +
    + I am successful +
    +
    +``` + +Version 2 (Inky markup) + +``` + +``` + +The button markup has changed to make the touch targets better. Now the whole button is clickable. It requires more table markup but you should use Inky anyways which is much simpler. + +## Panels are now Callouts +In an effort to unify the terminology across the Foundation family panels are now called callouts. + +Version 1 + +``` + + + + + +
    + Panel content +
    +``` + +Version 2 (CSS version) + +``` + + + + + +
    + +
    +``` + +Version 2 (Inky markup) + +``` + + +

    One Word

    +
    + + +

    2sdafkhasdfkjhas dkfjh askdjfh askjdhf aksjdhf aksjdhf kajshdf

    +
    +
    +
    + + + + + + + +

    One Word

    +
    + +

    2sdafkhasdfkjhas dkfjh askdjfh askjdhf aksjdhf aksjdhf kajshdf

    +
    +
    + +
    +
    +
    +``` + +Callouts used to only be applicable to a ``. In Foundation for Emails 2, you can wrap a callout around a `` or the content inside a ``. + +*** +## NEW +*** + +### Menu + +Version 2 (CSS version) + +``` + + + + +
    + + + + + + + +
    +``` + +Version 2 (Inky markup) + +``` + + Item One + Item Two + Item Three + +``` + +The menu component can be used to create a simple set of links comonly used in headers, for social icons or in footers. Adding the `.vertical` class will change the orientation. + +## Dependencies + +**CSS:** + +- Text Editor + +**Sass version:** + +- Text Editor +- Git +- Node + +To use the Sass version with the Inky markup language you'll want to insall the Foundation for Emails project template. You'll find the [installation instructions here](https://github.com/zurb/foundation-emails/tree/v2.0#getting-started). diff --git a/vendor/assets/foundation-emails/package.json b/vendor/assets/foundation-emails/package.json new file mode 100644 index 0000000..7df5fc3 --- /dev/null +++ b/vendor/assets/foundation-emails/package.json @@ -0,0 +1,67 @@ +{ + "name": "foundation-emails", + "version": "2.2.1", + "description": "A framework for responsive emails made by ZURB", + "keywords": [ + "responsive", + "emails" + ], + "author": "ZURB (http://foundation.zurb.com)", + "scripts": { + "start": "gulp", + "test:visual": "gulp test", + "deploy:dist": "gulp dist", + "deploy:settings": "gulp settings", + "deploy:download": "gulp download", + "deploy:templates": "gulp templates", + "deploy:docs": "gulp deploy:docs" + }, + "repository": "https://github.com/zurb/foundation-emails", + "bugs": "https://github.com/zurb/foundation-emails/issues", + "devDependencies": { + "browser-sync": "^2.9.10", + "cheerio": "^0.19.0", + "clipboard-js": "^0.2.0", + "foundation-docs": "zurb/foundation-docs", + "foundation-sites": "^6.2.0", + "gulp": "^3.8.11", + "gulp-autoprefixer": "^2.3.1", + "gulp-cached": "^1.1.0", + "gulp-concat": "^2.6.0", + "gulp-cssnano": "^2.1.1", + "gulp-htmlmin": "^1.3.0", + "gulp-if": "^2.0.0", + "gulp-inject-string": "^1.1.0", + "gulp-inline-css": "^2.0.0", + "gulp-load-plugins": "^1.0.0-rc.1", + "gulp-prettify": "^0.4.0", + "gulp-prompt": "^0.1.2", + "gulp-rename": "^1.2.2", + "gulp-rsync": "0.0.5", + "gulp-sass": "^2.1.0", + "gulp-sass-lint": "^1.1.1", + "gulp-sourcemaps": "^1.6.0", + "gulp-wrap": "^0.11.0", + "gulp-zip": "^3.2.0", + "inky": "^1.3.6", + "lazypipe": "^1.0.1", + "motion-ui": "^1.1.1", + "multiline": "^1.0.2", + "octophant": "^1.0.0", + "panini": "^1.2.0", + "rimraf": "^2.4.2", + "run-sequence": "^1.1.2", + "siphon-media-query": "^1.0.0", + "supercollider": "^1.4.0", + "typeahead.js": "^0.11.1", + "zeroclipboard": "^2.2.0" + }, + "license": "MIT", + "eyeglass": { + "name": "foundation-emails", + "sassDir": "scss", + "needs": "^0.8.0" + } +} + + diff --git a/vendor/assets/foundation-emails/scss/_global.scss b/vendor/assets/foundation-emails/scss/_global.scss new file mode 100755 index 0000000..1d17692 --- /dev/null +++ b/vendor/assets/foundation-emails/scss/_global.scss @@ -0,0 +1,95 @@ +// Foundation for Emails by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +//// +/// @group global +//// + +/// Primary color for interactive components like links and buttons. +/// @type Color +$primary-color: #2199e8 !default; + +/// Secondary color, used with components that support the `.secondary` class. +/// @type Color +$secondary-color: #777777 !default; + +/// Color to indicate a positive status or action, used with the `.success` class. +/// @type Color +$success-color: #3adb76 !default; + +/// Color to indicate a caution status or action, used with the `.warning` class. +/// @type Color +$warning-color: #ffae00 !default; + +/// Color to indicate a negative status or action, used with the `.alert` class. +/// @type Color +$alert-color: #ec5840 !default; + +/// Color used for light gray UI items within Foundation. +/// @type Color +$light-gray: #f3f3f3 !default; + +/// Color used for medium gray UI items within Foundation. +/// @type Color +$medium-gray: #cacaca !default; + +/// Color used for dark gray UI items within Foundation. +/// @type Color +$dark-gray: #8a8a8a !default; + +/// Color used for black ui items within Foundation +/// @type Color +$black: #0a0a0a !default; + +/// Color used for white ui items within Foundation +/// @type Color +$white: #fefefe !default; + +/// Color used code. +/// @type Color +$pre-color: #ff6908 !default; + +/// Width of the container. +/// @type Number +$global-width: 580px !default; + +/// Width of the container on small screens. +/// @type Length +$global-width-small: 95% !default; + +/// Gutter for grid elements. +/// @type length +$global-gutter: 16px !default; + +/// Body background color. +/// @type Length +$body-background: $light-gray !default; + +/// Color for the container background +/// @type Color +$container-background: $white !default; + +/// Global padding. +/// @type Number +$global-padding: 16px !default; + +/// Global margin. Margin requires a capital 'M' to workin Outlook.com +/// @type Number +$global-margin: 16px !default; + +/// Global raidus of radius-corners. +/// @type Number +$global-radius: 3px !default; + +/// Global rounded radius of rounded-corners. +/// @type Number +$global-rounded: 500px !default; + +/// Global media query to switch from desktop to mobile styles. +/// @type String +$global-breakpoint: $global-width + $global-gutter !default; + +.wrapper { + width: 100%; +} diff --git a/vendor/assets/foundation-emails/scss/components/_alignment.scss b/vendor/assets/foundation-emails/scss/components/_alignment.scss new file mode 100755 index 0000000..cee59e5 --- /dev/null +++ b/vendor/assets/foundation-emails/scss/components/_alignment.scss @@ -0,0 +1,88 @@ +// Foundation for Emails by ZURB +// zurb.com/ink/ +// Licensed under MIT Open Source + +//// +/// @group alignment +//// + +table, +th, +td, +h1, +h2, +h3, +h4, +h5, +h6, +p, +span { + &.text-center { + text-align: center; + } + + &.text-left { + text-align: left; + } + + &.text-right { + text-align: right; + } +} + +span.text-center { + display: block; + width: 100%; + text-align: center; +} + +@media only screen and (max-width: #{$global-breakpoint}) { + .small-float-center { + margin: 0 auto !important; + float: none !important; + text-align: center !important; + } + + .small-text-center { + text-align: center !important; + } + + .small-text-left { + text-align: left !important; + } + + .small-text-right { + text-align: right !important; + } +} + +img.float-left { + float: left; + text-align: left; +} + +img.float-right { + float: right; + text-align: right; +} + +img.float-center, +img.text-center { + margin: 0 auto; + Margin: 0 auto; + float: none; + text-align: center; +} + +table, +td, +th { + &.float-center { + margin: 0 auto; + Margin: 0 auto; + float: none; + text-align: center; + } +} + + diff --git a/vendor/assets/foundation-emails/scss/components/_button.scss b/vendor/assets/foundation-emails/scss/components/_button.scss new file mode 100755 index 0000000..d57bbc2 --- /dev/null +++ b/vendor/assets/foundation-emails/scss/components/_button.scss @@ -0,0 +1,311 @@ +// Foundation for Emails by ZURB +// zurb.com/ink/ +// Licensed under MIT Open Source + +//// +/// @group button +//// + +/// Padding inside buttons at various sizes. +/// @type Map +$button-padding: ( + tiny: 4px 8px 4px 8px, + small: 5px 10px 5px 10px, + default: 8px 16px 8px 16px, + large: 10px 20px 10px 20px, +) !default; + +/// Font sizes of buttons at various sizes. +/// @type Map +$button-font-size: ( + tiny: 10px, + small: 12px, + default: 16px, + large: 20px, +) !default; + +/// Text color of buttons. +/// @type Color +$button-color: $white !default; + +/// Text color of buttons with a light background. +/// @type Color +$button-color-alt: $medium-gray !default; + +/// Font weight of buttons. +/// @type Weight +$button-font-weight: bold !default; + +/// Margin around buttons. +/// @type List +$button-margin: 0 0 $global-margin 0 !default; + +/// Background color of buttons. +/// @type Color +$button-background: $primary-color !default; + +/// Border around buttons. +/// @type Border +$button-border: 2px solid $button-background !default; + +/// Border radius of buttons. Not supported by all email clients. +/// @type Number +$button-radius: $global-radius !default; + +/// Border radius of rounded buttons. Not supported by all email clients. +/// @type Number +$button-rounded: $global-rounded !default; + +table.button { + width: auto; + margin: $button-margin; + Margin: $button-margin; + + table { + + td { + text-align: left; + color: $button-color; + background: $button-background; + border: $button-border; + + a { + font-family: $body-font-family; + font-size: map-get($button-font-size, default); + font-weight: $button-font-weight; + color: $button-color; + text-decoration: none; + display: inline-block; + padding: map-get($button-padding, default); + border: 0 solid $button-background; + border-radius: $button-radius; + } + } + } + + &.radius table td { + border-radius: $button-radius; + border: none; + } + + &.rounded table td { + border-radius: $button-rounded; + border: none; + } +} + +table.button:hover table tr td a, +table.button:active table tr td a, +table.button table tr td a:visited, +table.button.tiny:hover table tr td a, +table.button.tiny:active table tr td a, +table.button.tiny table tr td a:visited, +table.button.small:hover table tr td a, +table.button.small:active table tr td a, +table.button.small table tr td a:visited, +table.button.large:hover table tr td a, +table.button.large:active table tr td a, +table.button.large table tr td a:visited { + color: $button-color; +} + +table.button.tiny { + table { + td, + a { + padding: map-get($button-padding, tiny); + } + + a { + font-size: map-get($button-font-size, tiny); + font-weight: normal; + } + } +} + +table.button.small { + table { + td, + a { + padding: map-get($button-padding, small); + font-size: map-get($button-font-size, small); + } + } +} + +table.button.large { + table { + a { + padding: map-get($button-padding, large); + font-size: map-get($button-font-size, large); + } + } +} + +table.button.expand, +table.button.expanded { + width: 100% !important; + + table { + width: 100%; + + a { + text-align: center; + width: 100%; + padding-left: 0; + padding-right: 0; + } + } + + center { + min-width: 0; + } +} + +table.button:hover, +table.button:visited, +table.button:active { + table { + td { + background: darken($button-background, 10%); + color: $button-color; + } + } +} + +table.button:hover, +table.button:visited, +table.button:active { + table { + a { + border: 0 solid darken($button-background, 10%); + } + } +} + +table.button.secondary { + table { + td { + background: $secondary-color; + color: $button-color; + border: 0px solid $secondary-color; + } + + a { + color: $button-color; + border: 0 solid $secondary-color; + } + } +} + +table.button.secondary:hover { + table { + td { + background: lighten($secondary-color, 10%); + color: $button-color; + } + + a { + border: 0 solid lighten($secondary-color, 10%); + } + } +} + +table.button.secondary:hover { + table { + td a { + color: $button-color; + } + } +} + +table.button.secondary:active { + table { + td a { + color: $button-color; + } + } +} + +table.button.secondary { + table { + td a:visited { + color: $button-color; + } + } +} + +table.button.success { + table { + td { + background: $success-color; + border: 0px solid $success-color; + } + + a { + border: 0 solid $success-color; + } + } +} + +table.button.success:hover { + table { + td { + background: darken($success-color, 10%); + } + + a { + border: 0 solid darken($success-color, 10%); + } + } +} + +table.button.alert { + table { + td { + background: $alert-color; + border: 0px solid $alert-color; + } + + a { + border: 0 solid $alert-color; + } + } +} + +table.button.alert:hover { + table { + td { + background: darken($alert-color, 10%); + } + + a { + border: 0 solid darken($alert-color, 10%); + } + } +} + +table.button.warning { + table { + td { + background: $warning-color; + border: 0px solid $warning-color; + } + + a { + border: 0px solid $warning-color; + } + } +} + +table.button.warning:hover { + table { + td { + background: darken($warning-color, 10%); + } + + a { + border: 0px solid darken($warning-color, 10%); + } + } +} diff --git a/vendor/assets/foundation-emails/scss/components/_callout.scss b/vendor/assets/foundation-emails/scss/components/_callout.scss new file mode 100644 index 0000000..17ae6dd --- /dev/null +++ b/vendor/assets/foundation-emails/scss/components/_callout.scss @@ -0,0 +1,85 @@ +// Foundation for Emails by ZURB +// zurb.com/ink/ +// Licensed under MIT Open Source + +//// +/// @group callout +//// + +/// Background color of a callout. +/// @type Color +$callout-background: $white !default; + +/// Fade value for callout backgrounds. +/// @type Number +$callout-background-fade: 85% !default; + +/// Padding inside a callout. +/// @type Length +$callout-padding: 10px !default; + +/// Bottom margin of a callout. +/// @type Length +$callout-margin-bottom: $global-margin !default; + +/// Border around a callout. +/// @type Border +$callout-border: 1px solid darken($callout-background, 20%) !default; + +/// Border around a callout with the `.success` class. +/// @type Border +$callout-border-secondary: 1px solid darken($secondary-color, 20%) !default; + +/// Border around a callout with the `.success` class. +/// @type Border +$callout-border-success: 1px solid darken($success-color, 20%) !default; + +/// Border around a callout with the `.warning` class. +/// @type Border +$callout-border-warning: 1px solid darken($warning-color, 20%) !default; + +/// Border around a callout with the `.alert` class. +/// @type Border +$callout-border-alert: 1px solid darken($alert-color, 20%) !default; + +table.callout { + margin-bottom: $callout-margin-bottom; + Margin-bottom: $callout-margin-bottom; +} + +th.callout-inner { + width: 100%; + border: $callout-border; + padding: $callout-padding; + background: $callout-background; + + &.primary { + background: scale-color($primary-color, $lightness: $callout-background-fade); + border: $callout-border-secondary; + color: $black; + } + + &.secondary { + background: scale-color($secondary-color, $lightness: $callout-background-fade); + border: $callout-border-secondary; + color: $black; + } + + &.success { + background: scale-color($success-color, $lightness: $callout-background-fade); + border: $callout-border-success; + color: $white; + } + + &.warning { + background: scale-color($warning-color, $lightness: $callout-background-fade); + border: $callout-border-warning; + color: $white; + } + + &.alert { + background: scale-color($alert-color, $lightness: $callout-background-fade); + border: $callout-border-alert; + color: $white; + } +} diff --git a/vendor/assets/foundation-emails/scss/components/_code.scss b/vendor/assets/foundation-emails/scss/components/_code.scss new file mode 100644 index 0000000..e69de29 diff --git a/vendor/assets/foundation-emails/scss/components/_media-query.scss b/vendor/assets/foundation-emails/scss/components/_media-query.scss new file mode 100755 index 0000000..52c94fa --- /dev/null +++ b/vendor/assets/foundation-emails/scss/components/_media-query.scss @@ -0,0 +1,139 @@ +// Foundation for Emails by ZURB +// zurb.com/ink/ +// Licensed under MIT Open Source + +//// +/// @group media-query +//// + +@media only screen and (max-width: #{$global-breakpoint}) { + table.body img { + width: auto; + height: auto; + } + + table.body center { + min-width: 0 !important; + } + + table.body .container { + width: $global-width-small !important; + } + + //If it supports border-box, why not? Am I right? + //Also, by default pad that to the global-gutter variable + table.body .columns, + table.body .column { + height: auto !important; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding-left: $global-gutter !important; + padding-right: $global-gutter !important; + + // Nested columns won't double the padding + .column, + .columns { + padding-left: 0 !important; + padding-right: 0 !important; + } + } + + // Collpased columns have no gutter. + .collapse { + table.body & .columns, + table.body & .column { + padding-left: 0 !important; + padding-right: 0 !important; + } + } + + // Basic grid rules + @for $i from 1 through $grid-column-count { + td.small-#{$i}, + th.small-#{$i} { + display: inline-block !important; + width: -zf-grid-calc-pct($i, $grid-column-count) !important; + } + } + + //If it's the last column in column count (12 by default), + //give it block and 100% width to knock down the wimpy columns to their own row. + .columns td.small-#{$grid-column-count}, + .column td.small-#{$grid-column-count}, + .columns th.small-#{$grid-column-count}, + .column th.small-#{$grid-column-count} { + display: block !important; + width: 100% !important; + } + + @for $i from 1 through ($grid-column-count - 1) { + table.body td.small-offset-#{$i}, + table.body th.small-offset-#{$i} { + //1.5 takes in effect a whole empty cell. + margin-left: -zf-grid-calc-pct($i, $grid-column-count) !important; + Margin-left: -zf-grid-calc-pct($i, $grid-column-count) !important; + } + } + + table.body table.columns td.expander, + table.body table.columns th.expander { + display: none !important; + } + + table.body .right-text-pad, + table.body .text-pad-right { + padding-left: $text-padding !important; + } + + table.body .left-text-pad, + table.body .text-pad-left { + padding-right: $text-padding !important; + } + + //menu + table.menu { + width: 100% !important; + + td, + th { + width: auto !important; + display: inline-block !important; + } + + &.vertical, + &.small-vertical { + td, + th { + display: block !important; + } + } + } + + // Centers the menus! + table.menu[align="center"] { + width: auto !important; + } + + // expands buttons for small only + table.button.small-expand, + table.button.small-expanded { + width: 100% !important; + + table { + width: 100%; + + a { + text-align: center !important; + width: 100% !important; + padding-left: 0 !important; + padding-right: 0 !important; + } + } + + center { + min-width: 0; + } + } +} + diff --git a/vendor/assets/foundation-emails/scss/components/_menu.scss b/vendor/assets/foundation-emails/scss/components/_menu.scss new file mode 100644 index 0000000..ff4f912 --- /dev/null +++ b/vendor/assets/foundation-emails/scss/components/_menu.scss @@ -0,0 +1,67 @@ +// Foundation for Emails by ZURB +// zurb.com/ink/ +// Licensed under MIT Open Source + +//// +/// @group menu +//// + +/// Padding inside a menu item. +/// @type Length +$menu-item-padding: 10px !default; + +/// Right-hand spacing of items in menus with the `.simple` class. +/// @type Length +$menu-item-gutter: 10px !default; + +/// This is the color of the menu item links. +/// @type Color +$menu-item-color: $primary-color !default; + +table.menu { + width: $global-width; + + td.menu-item, + th.menu-item { + padding: $menu-item-padding; + padding-right: $menu-item-gutter; + + a { + color: $menu-item-color; + } + } +} + +// Doesn't work on the pesky ESPs like outlook 2000 +table.menu.vertical { + td.menu-item, + th.menu-item { + padding: $menu-item-padding; + padding-right: 0; + display: block; + + a { + width: 100%; + } + } + + // Nested lists need some more padding to the left + td.menu-item, + th.menu-item { + table.menu.vertical { + td.menu-item, + th.menu-item { + padding-left: $menu-item-padding; + } + } + } +} + +table.menu.text-center a { + text-align: center; +} + +//Centers the menus! +.menu[align="center"] { + width: auto !important; +} \ No newline at end of file diff --git a/vendor/assets/foundation-emails/scss/components/_normalize.scss b/vendor/assets/foundation-emails/scss/components/_normalize.scss new file mode 100755 index 0000000..285e310 --- /dev/null +++ b/vendor/assets/foundation-emails/scss/components/_normalize.scss @@ -0,0 +1,90 @@ +// Foundation for Emails by ZURB +// zurb.com/ink/ +// Licensed under MIT Open Source + +//// +/// @group normalize +//// + +$paragraph-margin-bottom: 10px !default; + +#outlook a { + padding: 0; +} + +body { + width: 100% !important; + min-width: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + margin: 0; + Margin: 0; + padding: 0; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +.ExternalClass { + width: 100%; + + &, + p, + span, + font, + td, + div { + line-height: 100%; + } +} + +#backgroundTable { + margin: 0; + Margin: 0; + padding: 0; + width: 100% !important; + line-height: 100% !important; +} + +img { + outline: none; + text-decoration: none; + -ms-interpolation-mode: bicubic; + width: auto; + max-width: 100%; + clear: both; + display: block; +} + +center { + width: 100%; + min-width: $global-width; +} + +a img { + border: none; +} + +p { + margin: 0 0 0 $paragraph-margin-bottom; + Margin: 0 0 0 $paragraph-margin-bottom; +} + +table { + border-spacing: 0; + border-collapse: collapse; +} + +td { + word-wrap: break-word; + -webkit-hyphens: auto; + -moz-hyphens: auto; + hyphens: auto; + border-collapse: collapse !important; +} + +table, tr, td { + padding: 0; + vertical-align: top; + text-align: left; +} diff --git a/vendor/assets/foundation-emails/scss/components/_outlook-first.scss b/vendor/assets/foundation-emails/scss/components/_outlook-first.scss new file mode 100755 index 0000000..2e03732 --- /dev/null +++ b/vendor/assets/foundation-emails/scss/components/_outlook-first.scss @@ -0,0 +1,11 @@ +// Foundation for Emails by ZURB +// zurb.com/ink/ +// Licensed under MIT Open Source + +//// +/// @group outlook +//// + +body.outlook p { + display: inline !important; +} diff --git a/vendor/assets/foundation-emails/scss/components/_thumbnail.scss b/vendor/assets/foundation-emails/scss/components/_thumbnail.scss new file mode 100644 index 0000000..2120503 --- /dev/null +++ b/vendor/assets/foundation-emails/scss/components/_thumbnail.scss @@ -0,0 +1,49 @@ +// Foundation for Emails by ZURB +// zurb.com/ink/ +// Licensed under MIT Open Source + +//// +/// @group thumbnail +//// + +/// Border around thumbnail images. +/// @type Border +$thumbnail-border: solid 4px $white !default; + +/// Bottom margin for thumbnail images. +/// @type Length +$thumbnail-margin-bottom: $global-margin !default; + +/// Box shadow under thumbnail images. +/// @type Shadow +$thumbnail-shadow: 0 0 0 1px rgba($black, 0.2) !default; + +/// Box shadow under thumbnail images. +/// @type Shadow +$thumbnail-shadow-hover: 0 0 6px 1px rgba($primary-color, 0.5) !default; + +/// Transition proprties for thumbnail images. +/// @type Transition +$thumbnail-transition: box-shadow 200ms ease-out !default; + +/// Default radius for thumbnail images. +/// @type Number +$thumbnail-radius: $global-radius !default; + +/// Adds thumbnail styles to an element. +.thumbnail { + border: $thumbnail-border; + box-shadow: $thumbnail-shadow; + display: inline-block; + line-height: 0; + max-width: 100%; + transition: $thumbnail-transition; + border-radius: $thumbnail-radius; + margin-bottom: $thumbnail-margin-bottom; + + &:hover, + &:focus { + box-shadow: $thumbnail-shadow-hover; + } +} + diff --git a/vendor/assets/foundation-emails/scss/components/_typography.scss b/vendor/assets/foundation-emails/scss/components/_typography.scss new file mode 100755 index 0000000..d68417a --- /dev/null +++ b/vendor/assets/foundation-emails/scss/components/_typography.scss @@ -0,0 +1,339 @@ +// Foundation for Emails by ZURB +// zurb.com/ink/ +// Licensed under MIT Open Source + +//// +/// @group typography +//// + +/// Global font color. +/// @type Color +$global-font-color: $black !default; + +/// Global font family. +/// @type Font +$body-font-family: Helvetica, Arial, sans-serif !default; + +/// Global font weight. +/// @type Keyword +$global-font-weight: normal !default; + +/// Global font weight. +/// @type Keyword +$header-color: inherit !default; + +/// Global line height. +/// @type Number +$global-line-height: 1.3 !default; + +/// Font size of body text. +/// @type Number +$global-font-size: 16px !default; + +/// Line height of body text. +/// @type Number +$body-line-height: $global-line-height !default; + +/// Font family of headings. +/// @type List +$header-font-family: $body-font-family !default; + +/// Font family of headings. +/// @type List +$header-font-weight: $global-font-weight !default; + +/// Font size of `

    ` elements. +/// @type Number +$h1-font-size: 34px !default; + +/// Font size of `

    ` elements. +/// @type Number +$h2-font-size: 30px !default; + +/// Font size of `

    ` elements. +/// @type Number +$h3-font-size: 28px !default; + +/// Font size of `

    ` elements. +/// @type Number +$h4-font-size: 24px !default; + +/// Font size of `

    ` elements. +/// @type Number +$h5-font-size: 20px !default; + +/// Font size of `
    ` elements. +/// @type Number +$h6-font-size: 18px !default; + +/// Margin bottom of `

    ` through `

    ` elements. +/// @type Number +$header-margin-bottom: 10px !default; + +/// Margin bottom of paragraphs. +/// @type Number +$paragraph-margin-bottom: 10px !default; + +/// Default font size for ``. +/// @type Number +$small-font-size: 80% !default; + +/// Color of `` elements when placed inside headers. +/// @type Color +$small-font-color: $medium-gray !default; + +/// Font size of lead paragraphs. +/// @type Number +$lead-font-size: $global-font-size * 1.25 !default; + +/// Line height of lead paragraphs. +/// @type Number +$lead-line-height: 1.6 !default; + +/// Padding inside paragraphs. +/// @type Number +$text-padding: 10px !default; + +/// Default line height for subheaders. +/// @type Number +$subheader-lineheight: 1.4 !default; + +/// Default font color for subheaders. +/// @type Color +$subheader-color: $dark-gray !default; + +/// Default font weight for subheaders. +/// @type String +$subheader-font-weight: $global-font-weight !default; + +/// Default top margin for subhheaders. +/// @type Number +$subheader-margin-top: 4px !default; + +/// Default bottom margin for subheaders. +/// @type Number +$subheader-margin-bottom: 8px !default; + +/// Maximum width of a divider. +/// @type Number +$hr-width: $global-width !default; + +/// Default border for a divider. +/// @type List +$hr-border: 1px solid $black !default; + +/// Default margin for a divider. +/// @type Number | List +$hr-margin: 20px auto !default; + +/// Text decoration for anchors. +/// @type Keyword +$anchor-text-decoration: none !default; + +/// Text color of anchors. +/// @type Color +$anchor-color: $primary-color !default; + +/// Text color of anchors to visited links. +/// @type Color +$anchor-color-visited: $anchor-color !default; + +/// Text color of anchors on hover. +/// @type Color +$anchor-color-hover: darken($primary-color, 10%) !default; + +/// Text color of active anchors. +/// @type Color +$anchor-color-active: $anchor-color-hover !default; + +/// Default font size for statistic numbers. +/// @type Number +$stat-font-size: 40px !default; + +body, +table.body, +h1, +h2, +h3, +h4, +h5, +h6, +p, +td, +th, +a { + color: $global-font-color; + font-family: $body-font-family; + font-weight: $global-font-weight; + padding: 0; + margin: 0; + Margin: 0; + text-align: left; + line-height: $global-line-height; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + color: $header-color; + word-wrap: normal; + font-family: $header-font-family; + font-weight: $header-font-weight; + margin-bottom: $header-margin-bottom; + Margin-bottom: $header-margin-bottom; +} + +h1 { + font-size: $h1-font-size; +} + +h2 { + font-size: $h2-font-size; +} + +h3 { + font-size: $h3-font-size; +} + +h4 { + font-size: $h4-font-size; +} + +h5 { + font-size: $h5-font-size; +} + +h6 { + font-size: $h6-font-size; +} + +body, +table.body, +p, +td, +th { + font-size: $global-font-size; + line-height: $body-line-height; +} + +p { + margin-bottom: $paragraph-margin-bottom; + Margin-bottom: $paragraph-margin-bottom; + + &.lead { + font-size: $lead-font-size; + line-height: $lead-line-height; + } + + &.subheader { + margin-top: $subheader-margin-top; + margin-bottom: $subheader-margin-bottom; + Margin-top: $subheader-margin-top; + Margin-bottom: $subheader-margin-bottom; + font-weight: $subheader-font-weight; + line-height: $subheader-lineheight; + color: $subheader-color; + } +} + +small { + font-size: $small-font-size; + color: $small-font-color; +} + +a { + color: $anchor-color; + text-decoration: $anchor-text-decoration; + + &:hover { + color: $anchor-color-hover; + } + + &:active { + color: $anchor-color-active; + } + + &:visited { + color: $anchor-color-visited; + } +} + +h1 a, +h1 a:visited, +h2 a, +h2 a:visited, +h3 a, +h3 a:visited, +h4 a, +h4 a:visited, +h5 a, +h5 a:visited, +h6 a, +h6 a:visited { + color: $anchor-color; +} + +pre { + background: $light-gray; + margin: 30px 0; + Margin: 30px 0; + + code { + color: $medium-gray; + + span.callout { + color: $dark-gray; + font-weight: bold; + } + + span.callout-strong { + color: $pre-color; + font-weight: bold; + } + } +} + +// Horizontal rule +table.hr { + width: 100%; + + th { + height: 0; + max-width: $hr-width; + border-top: 0; + border-right: 0; + border-bottom: $hr-border; + border-left: 0; + margin: $hr-margin; + Margin: $hr-margin; + clear: both; + } +} + +// Use to style a large number to display a statistic +.stat { + font-size: $stat-font-size; + line-height: 1; + + p + & { + margin-top: -16px; + Margin-top: -16px; + } +} + +// preheader styles +span.preheader { + display: none !important; + visibility: hidden; + mso-hide: all !important; + font-size: 1px; + color: $body-background; // needs to match background color of it's container + line-height: 1px; + max-height: 0px; + max-width: 0px; + opacity: 0; + overflow: hidden; +} \ No newline at end of file diff --git a/vendor/assets/foundation-emails/scss/components/_visibility.scss b/vendor/assets/foundation-emails/scss/components/_visibility.scss new file mode 100644 index 0000000..7af167a --- /dev/null +++ b/vendor/assets/foundation-emails/scss/components/_visibility.scss @@ -0,0 +1,66 @@ +// Foundation for Emails by ZURB +// zurb.com/ink/ +// Licensed under MIT Open Source + +//// +/// @group visibility +//// + +.hide-for-large { + display: none !important; + mso-hide: all; // hide selected elements in Outlook 2007-2013 + overflow: hidden; + max-height: 0; + font-size: 0; + width: 0; + line-height: 0; + + @media only screen and (max-width: #{$global-breakpoint}) { + display: block !important; + width: auto !important; + overflow: visible !important; + max-height: none !important; + font-size: inherit !important; + line-height: inherit !important; + } +} + +table.body table.container .hide-for-large * { + mso-hide: all; // hide selected elements in Outlook 2007-2013 +} + +table.body table.container .hide-for-large, +table.body table.container .row.hide-for-large { + @media only screen and (max-width: #{$global-breakpoint}) { + display: table !important; + width: 100% !important; + } +} + +table.body table.container .callout-inner.hide-for-large { + @media only screen and (max-width: #{$global-breakpoint}) { + display: table-cell !important; + width: 100% !important; + } +} + +table.body table.container .show-for-large { + @media only screen and (max-width: #{$global-breakpoint}) { + display: none !important; + width: 0; + mso-hide: all; // hide selected elements in Outlook 2007-2013 + overflow: hidden; + } +} + +// [todo] add image resets +// img { +// max-height: 0; +// width: 0; +// } +// in media query +// img { +// max-height: none !important; +// width: auto !important; +// } + diff --git a/vendor/assets/foundation-emails/scss/foundation-emails.scss b/vendor/assets/foundation-emails/scss/foundation-emails.scss new file mode 100644 index 0000000..03ccb41 --- /dev/null +++ b/vendor/assets/foundation-emails/scss/foundation-emails.scss @@ -0,0 +1,19 @@ +// Foundation for Emails by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import + 'util/util', + 'global', + 'components/normalize', + 'grid/grid', + 'grid/block-grid', + 'components/alignment', + 'components/visibility', + 'components/typography', + 'components/button', + 'components/callout', + 'components/thumbnail', + 'components/menu', + 'components/outlook-first', + 'components/media-query'; diff --git a/vendor/assets/foundation-emails/scss/grid/_block-grid.scss b/vendor/assets/foundation-emails/scss/grid/_block-grid.scss new file mode 100755 index 0000000..0a38192 --- /dev/null +++ b/vendor/assets/foundation-emails/scss/grid/_block-grid.scss @@ -0,0 +1,32 @@ +// Foundation for Emails by ZURB +// zurb.com/ink/ +// Licensed under MIT Open Source + +//// +/// @group block-grid +//// + +/// The highest number of `.x-up` classes available when using the block grid CSS. +/// @type Number +$block-grid-max: 8 !default; + +/// Gutter between elements in a block grid. +/// @type Number +$block-grid-gutter: $global-gutter !default; + +.block-grid { + width: 100%; + max-width: $global-width; + + td { + display: inline-block; + padding: $block-grid-gutter / 2; + } +} + +// Sizing classes +@for $i from 2 through $block-grid-max { + .up-#{$i} td { + width: floor(($global-width - $i * $block-grid-gutter) / $i) !important; + } +} diff --git a/vendor/assets/foundation-emails/scss/grid/_grid.scss b/vendor/assets/foundation-emails/scss/grid/_grid.scss new file mode 100755 index 0000000..ea81daa --- /dev/null +++ b/vendor/assets/foundation-emails/scss/grid/_grid.scss @@ -0,0 +1,172 @@ +// Foundation for Emails by ZURB +// zurb.com/ink/ +// Licensed under MIT Open Source + +//// +/// @group grid +//// + +/// Default number of columns for an email. +/// @type Number +$grid-column-count: 12 !default; + +/// Default padding for the bottom of a column. +/// @type Number +$column-padding-bottom: $global-padding !default; + +/// Default border radius for the container. Use a px value +/// @type Number +$container-radius: 0 !default; + +//For viewing email in browser +@media only screen { + html { + min-height: 100%; + background: $body-background; + } +} + +table { + &.body { + background: $body-background; + height: 100%; + width: 100%; + } + + &.container { + background: $container-background; + width: $global-width; + margin: 0 auto; + Margin: 0 auto; + text-align: inherit; + } + + &.row { + padding: 0; + width: 100%; + position: relative; + } + + &.spacer { + width: 100%; + td { + mso-line-height-rule: exactly; + } + } +} + +table.container table.row { + display: table; +} + +td.columns, +td.column, +th.columns, +th.column { + margin: 0 auto; + Margin: 0 auto; + padding-left: $global-gutter; + padding-bottom: $column-padding-bottom; + + // Prevents Nested columns from double the padding + .column, + .columns { + padding-left: 0 !important; + padding-right: 0 !important; + + center { + min-width: none !important; + } + } +} + +td.columns.last, +td.column.last, +th.columns.last, +th.column.last { + padding-right: $global-gutter; +} + +//makes sure nested tables are 100% width +td.columns, +td.column, +th.columns, +th.column { + table:not(.button) { + width: 100%; + } +} + +@for $i from 1 through $grid-column-count { + td.large-#{$i}, + th.large-#{$i} { + width: -zf-grid-calc-px($i, $grid-column-count, $global-width); + padding-left: $global-gutter / 2; + padding-right: $global-gutter / 2; + } + + td.large-#{$i}.first, + th.large-#{$i}.first { + padding-left: $global-gutter; + } + + td.large-#{$i}.last, + th.large-#{$i}.last { + padding-right: $global-gutter; + } + + //Collapsed logic + .collapse { + > tbody > tr > td.large-#{$i}, + > tbody > tr > th.large-#{$i} { + padding-right: 0; + padding-left: 0; + width: -zf-grid-calc-px($i, $grid-column-count, $global-width) + $global-gutter; + } + + //Gotta give it that extra love for the first and last columns. + td.large-#{$i}.first, + th.large-#{$i}.first, + td.large-#{$i}.last, + th.large-#{$i}.last { + width: -zf-grid-calc-px($i, $grid-column-count, $global-width) + ($global-gutter * 1.5); + } + } + + td.large-#{$i} center, + th.large-#{$i} center { + min-width: -zf-grid-calc-px($i, $grid-column-count, $global-width) - ($global-gutter * 2); + } + + .body .columns td.large-#{$i}, + .body .column td.large-#{$i}, + .body .columns th.large-#{$i}, + .body .column th.large-#{$i} { + width: -zf-grid-calc-pct($i, $grid-column-count); + } +} + +@for $i from 1 through ($grid-column-count - 1) { + td.large-offset-#{$i}, + td.large-offset-#{$i}.first, + td.large-offset-#{$i}.last, + th.large-offset-#{$i}, + th.large-offset-#{$i}.first, + th.large-offset-#{$i}.last { + //1.5 takes in effect a whole empty cell. + padding-left: -zf-grid-calc-px($i, $grid-column-count, $global-width) + $global-gutter * 2; + } +} + +td.expander, +th.expander { + visibility: hidden; + width: 0; + padding: 0 !important; +} + +// adds radius to container +table.container.radius { + border-radius: $container-radius; + border-collapse: separate; +} diff --git a/app/assets/stylesheets/foundation_emails.scss b/vendor/assets/foundation-emails/scss/settings/_settings.scss similarity index 90% rename from app/assets/stylesheets/foundation_emails.scss rename to vendor/assets/foundation-emails/scss/settings/_settings.scss index ad24c1d..57c3d0f 100644 --- a/app/assets/stylesheets/foundation_emails.scss +++ b/vendor/assets/foundation-emails/scss/settings/_settings.scss @@ -1,5 +1,3 @@ -@import "foundation-emails"; - // Foundation for Emails Settings // ------------------------------ // @@ -29,7 +27,7 @@ $dark-gray: #8a8a8a; $black: #0a0a0a; $white: #fefefe; $pre-color: #ff6908; -$global-width: 600px !default; +$global-width: 580px; $global-width-small: 95%; $global-gutter: 16px; $body-background: $light-gray; @@ -147,22 +145,3 @@ $thumbnail-shadow-hover: 0 0 6px 1px rgba($primary-color, 0.5); $thumbnail-transition: box-shadow 200ms ease-out; $thumbnail-radius: $global-radius; - - -.pd-logo { - font-size: 28px; -} - -.email-container { - max-width:600px; - background-color:green; - .email-title { - font-family: 'HalisR', Helvetica Neue, Helvetica, Ariel, sans-serif !important; - .prft-slash { - font-size: 100px; - font-weight: 100; - color: #EF0734; - } - } -} - diff --git a/vendor/assets/foundation-emails/scss/util/_util.scss b/vendor/assets/foundation-emails/scss/util/_util.scss new file mode 100755 index 0000000..faabca5 --- /dev/null +++ b/vendor/assets/foundation-emails/scss/util/_util.scss @@ -0,0 +1,22 @@ +// Foundation for Emails by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +/// Calculates a percentage value for a grid column width. +/// @access private +/// @param {number} $colNumber - Column count of the column. +/// @param {number} $totalColumns - Column count of the entire row. +/// @returns {number} A percentage width value. +@function -zf-grid-calc-pct($colNumber, $totalColumns) { + @return floor(percentage(($colNumber / $totalColumns)) * 1000000) / 1000000; +} + +/// Calculates a pixel value for a grid column width. +/// @access private +/// @param {number} $columnNumber - Column count of the column. +/// @param {number} $totalColumns - Column count of the entire row. +/// @param {number} $containerWidth - Width of the surrounding container, in pixels. +/// @returns {number} A pixel width value. +@function -zf-grid-calc-px($columnNumber, $totalColumns, $containerWidth) { + @return ($containerWidth / $totalColumns * $columnNumber - $global-gutter); +} diff --git a/vendor/assets/foundation-emails/templates/basic.html b/vendor/assets/foundation-emails/templates/basic.html new file mode 100644 index 0000000..e1f1224 --- /dev/null +++ b/vendor/assets/foundation-emails/templates/basic.html @@ -0,0 +1,91 @@ + + + + + + + + + + + +

    BASIC

    +
    +
    +
    +
    + + + + + + + + +

    Hi, Susan Calvin

    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Magni, iste, amet consequatur a veniam.

    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut optio nulla et, fugiat. Maiores accusantium nostrum asperiores provident, quam modi ex inventore dolores id aspernatur architecto odio minima perferendis, explicabo. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima quos quasi itaque beatae natus fugit provident delectus, magnam laudantium odio corrupti sit quam. Optio aut ut repudiandae velit distinctio asperiores?

    + +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Reprehenderit repellendus natus, sint ea optio dignissimos asperiores inventore a molestiae dolorum placeat repellat excepturi mollitia ducimus unde doloremque ad, alias eos!

    +
    +
    +
    + + + + + + +
    Connect With Us:
    + + + +
    + +
    Contact Info:
    +

    Phone: 408-341-0600

    +
    + + + + diff --git a/vendor/assets/foundation-emails/templates/drip.html b/vendor/assets/foundation-emails/templates/drip.html new file mode 100644 index 0000000..5487677 --- /dev/null +++ b/vendor/assets/foundation-emails/templates/drip.html @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + +
    + +
    + + + + + +

    Responsive Emails

    +

    15 sections | 567 Min

    +
    +
    + +
    + + + +

    Hey you! It's you! Just a heads up, we just added this hot new class that will teach you how to NOT be a lame as a duck. Not the metaphorical lame duck, either, but a real duck that was actually lame, maybe from stepping on a land mine or something. Anyways, Foundation for Emails makes coding HTML emails like calling the Navy SEALS to invade a Pre-school, with pre-schoolers, armed with Crayolas.

    +
    + +
    +
    +
    + + + +
    \ No newline at end of file diff --git a/vendor/assets/foundation-emails/templates/hero.html b/vendor/assets/foundation-emails/templates/hero.html new file mode 100644 index 0000000..a5a773c --- /dev/null +++ b/vendor/assets/foundation-emails/templates/hero.html @@ -0,0 +1,103 @@ + + + + + + + + + +

    HERO

    +
    +
    +
    +
    + + + + + + + +

    Hi, Elijah Baily

    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nisi impedit sapiente delectus molestias quia.

    + + +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Veniam assumenda, praesentium qui vitae voluptate dolores. Click it!

    +
    +

    Title Ipsum This is a note.

    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nisi repellat, harum. Quas nobis id aut, aspernatur, sequi tempora laborum corporis cum debitis, ullam, dolorem dolore quisquam aperiam! Accusantium, ullam, nesciunt. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ducimus consequuntur commodi, aut sed, quas quam optio accusantium recusandae nesciunt, architecto veritatis. Voluptatibus sunt esse dolor ipsum voluptates, assumenda quisquam.

    + + + +
    +
    + + + + + + + +
    Connect With Us:
    + + + +
    + +
    Contact Info:
    +

    Phone: 408-341-0600

    +

    Email: foundation@zurb.com

    +
    +
    +
    + +
    + + Terms + Privacy + Unsubscribe + +
    + +
    diff --git a/vendor/assets/foundation-emails/templates/marketing.html b/vendor/assets/foundation-emails/templates/marketing.html new file mode 100644 index 0000000..9358a57 --- /dev/null +++ b/vendor/assets/foundation-emails/templates/marketing.html @@ -0,0 +1,86 @@ + + + + + + +
    + +
    +
    + +

    Do Something Radical With This App.

    + +
    +
    + + + + + +

    It's Never Been Easier to Do Things.

    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consequatur pariatur unde magni repudiandae totam, accusamus facere eligendi. Ad nobis eius porro saepe et ab, aliquid, sed mollitia cumque suscipit aperiam.

    +
    +
    + + +
    + +
    +
    Feature One
    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Rerum, quod quam unde earum.

    +
    + +
    + +
    +
    Feature Two
    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Rerum, quod quam unde earum.

    +
    + +
    + +
    +
    Feature Three
    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Rerum, quod quam unde earum.

    +
    +
    + + + + + +

    What Are You Waiting For? Get Started Today.

    + + + + +
    +
    + + + + + +
    diff --git a/vendor/assets/foundation-emails/templates/newsletter-2.html b/vendor/assets/foundation-emails/templates/newsletter-2.html new file mode 100644 index 0000000..8965c83 --- /dev/null +++ b/vendor/assets/foundation-emails/templates/newsletter-2.html @@ -0,0 +1,49 @@ + + + + + + + + + + +
    + +
    +
    +
    + + +

    This is a title

    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quam at, nihil quas harum mollitia dolores odio. Inventore delectus nihil soluta quos, magni doloribus, voluptas aspernatur explicabo atque perspiciatis possimus voluptates.

    +

    Learn more

    +
    + + + +
    + + +

    Sub Section Title

    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quod eum eius numquam sint dolore voluptatibus beatae ab ad, dignissimos fugiat? Nisi odio commodi debitis eveniet tenetur provident aliquid tempora placeat.

    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quod eum eius numquam sint dolore voluptatibus beatae ab ad, dignissimos fugiat? Nisi odio commodi debitis eveniet tenetur provident aliquid tempora placeat.

    +
    + +

    Sub Section Title

    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quod eum eius numquam sint dolore voluptatibus beatae ab ad, dignissimos fugiat? Nisi odio commodi debitis eveniet tenetur provident aliquid tempora placeat.

    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quod eum eius numquam sint dolore voluptatibus beatae ab ad, dignissimos fugiat? Nisi odio commodi debitis eveniet tenetur provident aliquid tempora placeat.

    +
    +
    + + +

    You received this email because you're signed up to receive updates from us. Click here to unsubscribe.

    +
    +
    +
    diff --git a/vendor/assets/foundation-emails/templates/newsletter.html b/vendor/assets/foundation-emails/templates/newsletter.html new file mode 100644 index 0000000..bbcc934 --- /dev/null +++ b/vendor/assets/foundation-emails/templates/newsletter.html @@ -0,0 +1,48 @@ + + + + + + + + +

    The Insider

    +
    + +
    + + + +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ipsa itaque illo doloribus soluta expedita dolores commodi fuga odit.

    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Architecto reiciendis eos magni deleniti accusamus tempore, consectetur! Maxime amet, exercitationem nihil fugit eius esse voluptatum ab incidunt minima, saepe reiciendis ipsum.

    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Architecto reiciendis eos magni deleniti accusamus tempore, consectetur! Maxime amet, exercitationem nihil fugit eius esse voluptatum ab incidunt minima, saepe reiciendis ipsum.

    + + + +

    More Reading:

    + +
    + +

    Get Involved:

    + +
    +
    + +

    You received this email because you're signed up to get updates from us. Click here to unsubscribe.

    +
    +
    +
    diff --git a/vendor/assets/foundation-emails/templates/order.html b/vendor/assets/foundation-emails/templates/order.html new file mode 100644 index 0000000..def3831 --- /dev/null +++ b/vendor/assets/foundation-emails/templates/order.html @@ -0,0 +1,86 @@ + + + + + + + + +

    Thanks for your order.

    +

    Thanks for shopping with us! Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ad earum ducimus, non, eveniet neque dolores voluptas architecto sed, voluptatibus aut dolorem odio. Cupiditate a recusandae, illum cum voluptatum modi nostrum.

    + + + + + + +

    + Payment Method
    + Dubloons +

    +

    + Email Address
    + thecapn@pirates.org +

    +

    + Order ID
    + 239235983749636 +

    +
    + +

    + Shipping Method
    + Boat (1–2 weeks)
    + Shipping Address
    + Captain Price
    + 123 Maple Rd
    + Campbell, CA 95112 +

    +
    +
    +
    + +

    Order Details

    + + + + + + + + + + +
    Item#Price
    Ship's Cannon2$100
    Ship's Cannon2$100
    Ship's Cannon2$100
    Subtotal:$600
    + +
    + +

    What's Next?

    + +

    Our carrier raven will prepare your order for delivery. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Modi necessitatibus itaque debitis laudantium doloribus quasi nostrum distinctio suscipit, magni soluta eius animi voluptatem qui velit eligendi quam praesentium provident culpa?

    +
    +
    + + + + + +

    + Call us at 800.555.1923
    + Email us at support@discount.boat +

    +
    + +

    + 123 Maple Rd
    + Campbell, CA 95112 +

    +
    +
    +
    diff --git a/vendor/assets/foundation-emails/templates/password.html b/vendor/assets/foundation-emails/templates/password.html new file mode 100644 index 0000000..efbbd5e --- /dev/null +++ b/vendor/assets/foundation-emails/templates/password.html @@ -0,0 +1,48 @@ + + + + + + + + + +

    Pirate Retirement Services

    +
    +
    + + + + + +
    + +
    + + + +

    Forgot Your Password?

    + + + +

    It happens. Click the link below to reset your password.

    + + +
    + +

    You're getting this email because you've signed up for email updates. If you want to opt-out of future emails, unsubscribe here.

    +
    +
    + + +
    diff --git a/vendor/assets/foundation-emails/templates/sidebar-hero.html b/vendor/assets/foundation-emails/templates/sidebar-hero.html new file mode 100644 index 0000000..71cc088 --- /dev/null +++ b/vendor/assets/foundation-emails/templates/sidebar-hero.html @@ -0,0 +1,124 @@ + + + + + + + + + + + +

    SIDEBAR HERO

    +
    +
    +
    +
    + + + + + + + +

    Hi, Elijah Baily

    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nisi impedit sapiente delectus molestias quia.

    +
    + +
    + +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Veniam assumenda, praesentium qui vitae voluptate dolores. Click it!

    +
    +
    +
    + + +

    Hello, Han Fastolfe

    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Laboriosam nobis velit, aliquid pariatur at fugit. Omnis at quae, libero iusto quisquam animi blanditiis neque, alias minima corporis, ab in explicabo?

    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Maxime dignissimos voluptas minus, cupiditate voluptatem, voluptatum iste molestiae consectetur temporibus quae dolore nam possimus reprehenderit blanditiis laborum iusto sit. Perspiciatis, dolor.

    + + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Culpa quas optio totam quidem, placeat sunt, sit iusto fugit. Harum omnis deleniti enim nihil iure, quis laudantium veniam velit animi debitis. Click It! + +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolores minus eius amet alias odit accusantium, fugit perspiciatis nulla suscipit nisi. Laborum aliquid, voluptatum consectetur fugiat maxime architecto enim molestias aperiam!

    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ex eveniet veritatis, magnam ipsam et vero necessitatibus. Deserunt facilis impedit, adipisci illo laboriosam assumenda fugiat dolorum nam odio aliquid, sit est.

    + +
    + + +
    Header
    +

    Sub-header

    + + Just a Plain Link » + Just a Plain Link » + Just a Plain Link » + Just a Plain Link » + Just a Plain Link » + Just a Plain Link » + Just a Plain Link » + +
    + +
    CONNECT WITH US:
    + + + +

    CONTACT INFO:

    +

    Phone: 408-341-0600

    +

    Email: foundation@zurb.com

    +
    +
    +
    + +
    + + Terms + Privacy + Unsubscribe + +
    + +
    diff --git a/vendor/assets/foundation-emails/templates/sidebar.html b/vendor/assets/foundation-emails/templates/sidebar.html new file mode 100644 index 0000000..022d01e --- /dev/null +++ b/vendor/assets/foundation-emails/templates/sidebar.html @@ -0,0 +1,114 @@ + + + + + + + + + + + +

    SIDEBAR

    +
    +
    +
    +
    + + + + + + + +

    Hello, Han Fastolfe

    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Laboriosam nobis velit, aliquid pariatur at fugit. Omnis at quae, libero iusto quisquam animi blanditiis neque, alias minima corporis, ab in explicabo?

    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Maxime dignissimos voluptas minus, cupiditate voluptatem, voluptatum iste molestiae consectetur temporibus quae dolore nam possimus reprehenderit blanditiis laborum iusto sit. Perspiciatis, dolor.

    + + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Culpa quas optio totam quidem, placeat sunt, sit iusto fugit. Harum omnis deleniti enim nihil iure, quis laudantium veniam velit animi debitis. Click It! + +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolores minus eius amet alias odit accusantium, fugit perspiciatis nulla suscipit nisi. Laborum aliquid, voluptatum consectetur fugiat maxime architecto enim molestias aperiam!

    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ex eveniet veritatis, magnam ipsam et vero necessitatibus. Deserunt facilis impedit, adipisci illo laboriosam assumenda fugiat dolorum nam odio aliquid, sit est.

    + +
    + + +
    Header
    +

    Sub-header

    + + Just a Plain Link » + Just a Plain Link » + Just a Plain Link » + Just a Plain Link » + Just a Plain Link » + Just a Plain Link » + Just a Plain Link » + +
    + +
    CONNECT WITH US:
    + + + +

    CONTACT INFO:

    +

    Phone: 408-341-0600

    +

    Email: foundation@zurb.com

    +
    +
    +
    + + +
    + + Terms + Privacy + Unsubscribe + +
    +
    +
    +
    diff --git a/vendor/assets/foundation-emails/templates/welcome.html b/vendor/assets/foundation-emails/templates/welcome.html new file mode 100644 index 0000000..145a978 --- /dev/null +++ b/vendor/assets/foundation-emails/templates/welcome.html @@ -0,0 +1,63 @@ + + + + + +

    Welcome to Kraken Academy

    + +
    + + About + Course List + Campus Map + Contact + +
    + +
    +
    +
    + + + + + + + +
    + +
    + + + +

    An exciting future of terrorizing sailors awaits you at Kraken Academy.

    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque culpa vel architecto, perspiciatis eius cum autem quidem, sunt consequuntur, impedit dolor vitae illum nobis sint nihil aliquid? Assumenda, amet, officia.

    + +
    + + krakenacademy.com + Facebook + Twitter + (408)-555-0123 + +
    + +
    +
    + + +
    From f3d367271774e8238f2960e9e03a677772892544 Mon Sep 17 00:00:00 2001 From: Derek Montgomery Date: Mon, 15 Aug 2016 08:31:39 -0500 Subject: [PATCH 125/205] Foundation for Emails editable vendor lib --- app/assets/stylesheets/mailers/foundation_emails.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/mailers/foundation_emails.scss b/app/assets/stylesheets/mailers/foundation_emails.scss index 22faf6b..a4706b9 100644 --- a/app/assets/stylesheets/mailers/foundation_emails.scss +++ b/app/assets/stylesheets/mailers/foundation_emails.scss @@ -1,4 +1,4 @@ -@import "foundation-emails/scss/foundation-emails"; +@import "scss/foundation-emails"; .pd-logo { font-size: 28px; From d7aa25621759ffb11d52b169c9bc0f154c3a995e Mon Sep 17 00:00:00 2001 From: Derek Montgomery Date: Mon, 15 Aug 2016 12:29:50 -0500 Subject: [PATCH 126/205] Refactored foundation style manifest --- ..._emails.scss => custom-mailer-styles.scss} | 7 +- .../mailers/foundation_global_overrides.scss | 3 + .../mailers/foundation_vendor_manifest.scss | 20 + app/views/layouts/mailer.html.erb | 2 +- bower.json | 3 +- config/initializers/assets.rb | 3 +- vendor/assets/foundation-emails/.bower.json | 28 - .../assets/foundation-emails/CONTRIBUTING.md | 46 - vendor/assets/foundation-emails/LICENSE.md | 9 - vendor/assets/foundation-emails/README.md | 122 -- vendor/assets/foundation-emails/bower.json | 18 - .../dist/foundation-emails.css | 1348 ----------------- .../dist/foundation-emails.min.css | 1 - .../assets/img/campaign-monitor-css-guide.jpg | Bin 344129 -> 0 bytes .../docs/assets/img/cm-email-client-stats.png | Bin 57258 -> 0 bytes .../assets/img/icons/footer-expo-retina.png | Bin 2137 -> 0 bytes .../docs/assets/img/icons/footer-expo.png | Bin 1353 -> 0 bytes .../img/icons/footer-foundation-retina.png | Bin 1980 -> 0 bytes .../assets/img/icons/footer-foundation.png | Bin 1297 -> 0 bytes .../assets/img/icons/footer-icons-retina.png | Bin 6389 -> 0 bytes .../docs/assets/img/icons/footer-icons.png | Bin 5662 -> 0 bytes .../img/icons/footer-products-retina.png | Bin 2187 -> 0 bytes .../docs/assets/img/icons/footer-products.png | Bin 1466 -> 0 bytes .../img/icons/footer-studios-retina.png | Bin 2725 -> 0 bytes .../docs/assets/img/icons/footer-studios.png | Bin 1565 -> 0 bytes .../img/icons/footer-top-icons-retina.png | Bin 3647 -> 0 bytes .../assets/img/icons/footer-top-icons.png | Bin 4645 -> 0 bytes .../assets/img/icons/footer-university.png | Bin 1353 -> 0 bytes .../docs/assets/img/icons/social-retina.png | Bin 6847 -> 0 bytes .../docs/assets/img/icons/social.png | Bin 3815 -> 0 bytes .../docs/assets/img/logos/sass-logo.svg | 1 - .../docs/assets/js/codeSample.js | 20 - .../foundation-emails/docs/assets/js/docs.js | 1 - .../docs/assets/scss/_code.scss | 6 - .../docs/assets/scss/_compatibility.scss | 157 -- .../docs/assets/scss/_course-callout.scss | 40 - .../docs/assets/scss/docs.scss | 49 - .../docs/layouts/component.html | 314 ---- .../docs/layouts/default.html | 73 - .../foundation-emails/docs/pages/alignment.md | 215 --- .../foundation-emails/docs/pages/button.md | 83 - .../foundation-emails/docs/pages/callout.md | 62 - .../docs/pages/compatibility.md | 173 --- .../foundation-emails/docs/pages/css-guide.md | 181 --- .../foundation-emails/docs/pages/global.md | 110 -- .../foundation-emails/docs/pages/grid.md | 118 -- .../foundation-emails/docs/pages/index.md | 92 -- .../foundation-emails/docs/pages/inky.md | 73 - .../docs/pages/media-query.md | 92 -- .../foundation-emails/docs/pages/menu.md | 52 - .../foundation-emails/docs/pages/migration.md | 511 ------- .../foundation-emails/docs/pages/panini.md | 240 --- .../docs/pages/sass-guide.md | 179 --- .../foundation-emails/docs/pages/sass.md | 98 -- .../foundation-emails/docs/pages/spacer.md | 26 - .../foundation-emails/docs/pages/styling.md | 5 - .../foundation-emails/docs/pages/thumbnail.md | 19 - .../docs/pages/tips-tricks.md | 337 ----- .../docs/pages/typography.md | 73 - .../docs/pages/visibility.md | 33 - .../foundation-emails/docs/pages/wrapper.md | 66 - .../docs/pages/zurb-stack.md | 16 - .../docs/partials/component-list.html | 40 - .../docs/partials/course-callout.html | 6 - .../docs/partials/footer.html | 113 -- .../docs/partials/mobile-navigation.html | 80 - .../docs/partials/navigation.html | 62 - .../docs/partials/off-canvas.html | 72 - vendor/assets/foundation-emails/gulpfile.js | 222 --- vendor/assets/foundation-emails/migration.md | 457 ------ vendor/assets/foundation-emails/package.json | 67 - .../foundation-emails/scss/_global.scss | 95 -- .../scss/components/_alignment.scss | 88 -- .../scss/components/_button.scss | 311 ---- .../scss/components/_callout.scss | 85 -- .../scss/components/_code.scss | 0 .../scss/components/_media-query.scss | 139 -- .../scss/components/_menu.scss | 67 - .../scss/components/_normalize.scss | 90 -- .../scss/components/_outlook-first.scss | 11 - .../scss/components/_thumbnail.scss | 49 - .../scss/components/_typography.scss | 339 ----- .../scss/components/_visibility.scss | 66 - .../scss/foundation-emails.scss | 19 - .../scss/grid/_block-grid.scss | 32 - .../foundation-emails/scss/grid/_grid.scss | 172 --- .../scss/settings/_settings.scss | 147 -- .../foundation-emails/scss/util/_util.scss | 22 - .../foundation-emails/templates/basic.html | 91 -- .../foundation-emails/templates/drip.html | 71 - .../foundation-emails/templates/hero.html | 103 -- .../templates/marketing.html | 86 -- .../templates/newsletter-2.html | 49 - .../templates/newsletter.html | 48 - .../foundation-emails/templates/order.html | 86 -- .../foundation-emails/templates/password.html | 48 - .../templates/sidebar-hero.html | 124 -- .../foundation-emails/templates/sidebar.html | 114 -- .../foundation-emails/templates/welcome.html | 63 - 99 files changed, 30 insertions(+), 8829 deletions(-) rename app/assets/stylesheets/mailers/{foundation_emails.scss => custom-mailer-styles.scss} (75%) create mode 100644 app/assets/stylesheets/mailers/foundation_global_overrides.scss create mode 100644 app/assets/stylesheets/mailers/foundation_vendor_manifest.scss delete mode 100644 vendor/assets/foundation-emails/.bower.json delete mode 100644 vendor/assets/foundation-emails/CONTRIBUTING.md delete mode 100644 vendor/assets/foundation-emails/LICENSE.md delete mode 100644 vendor/assets/foundation-emails/README.md delete mode 100644 vendor/assets/foundation-emails/bower.json delete mode 100644 vendor/assets/foundation-emails/dist/foundation-emails.css delete mode 100644 vendor/assets/foundation-emails/dist/foundation-emails.min.css delete mode 100644 vendor/assets/foundation-emails/docs/assets/img/campaign-monitor-css-guide.jpg delete mode 100644 vendor/assets/foundation-emails/docs/assets/img/cm-email-client-stats.png delete mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/footer-expo-retina.png delete mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/footer-expo.png delete mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/footer-foundation-retina.png delete mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/footer-foundation.png delete mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/footer-icons-retina.png delete mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/footer-icons.png delete mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/footer-products-retina.png delete mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/footer-products.png delete mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/footer-studios-retina.png delete mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/footer-studios.png delete mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/footer-top-icons-retina.png delete mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/footer-top-icons.png delete mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/footer-university.png delete mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/social-retina.png delete mode 100644 vendor/assets/foundation-emails/docs/assets/img/icons/social.png delete mode 100644 vendor/assets/foundation-emails/docs/assets/img/logos/sass-logo.svg delete mode 100644 vendor/assets/foundation-emails/docs/assets/js/codeSample.js delete mode 100644 vendor/assets/foundation-emails/docs/assets/js/docs.js delete mode 100644 vendor/assets/foundation-emails/docs/assets/scss/_code.scss delete mode 100644 vendor/assets/foundation-emails/docs/assets/scss/_compatibility.scss delete mode 100644 vendor/assets/foundation-emails/docs/assets/scss/_course-callout.scss delete mode 100644 vendor/assets/foundation-emails/docs/assets/scss/docs.scss delete mode 100644 vendor/assets/foundation-emails/docs/layouts/component.html delete mode 100644 vendor/assets/foundation-emails/docs/layouts/default.html delete mode 100644 vendor/assets/foundation-emails/docs/pages/alignment.md delete mode 100644 vendor/assets/foundation-emails/docs/pages/button.md delete mode 100644 vendor/assets/foundation-emails/docs/pages/callout.md delete mode 100644 vendor/assets/foundation-emails/docs/pages/compatibility.md delete mode 100644 vendor/assets/foundation-emails/docs/pages/css-guide.md delete mode 100644 vendor/assets/foundation-emails/docs/pages/global.md delete mode 100644 vendor/assets/foundation-emails/docs/pages/grid.md delete mode 100644 vendor/assets/foundation-emails/docs/pages/index.md delete mode 100644 vendor/assets/foundation-emails/docs/pages/inky.md delete mode 100644 vendor/assets/foundation-emails/docs/pages/media-query.md delete mode 100644 vendor/assets/foundation-emails/docs/pages/menu.md delete mode 100644 vendor/assets/foundation-emails/docs/pages/migration.md delete mode 100644 vendor/assets/foundation-emails/docs/pages/panini.md delete mode 100644 vendor/assets/foundation-emails/docs/pages/sass-guide.md delete mode 100644 vendor/assets/foundation-emails/docs/pages/sass.md delete mode 100644 vendor/assets/foundation-emails/docs/pages/spacer.md delete mode 100644 vendor/assets/foundation-emails/docs/pages/styling.md delete mode 100644 vendor/assets/foundation-emails/docs/pages/thumbnail.md delete mode 100644 vendor/assets/foundation-emails/docs/pages/tips-tricks.md delete mode 100644 vendor/assets/foundation-emails/docs/pages/typography.md delete mode 100644 vendor/assets/foundation-emails/docs/pages/visibility.md delete mode 100644 vendor/assets/foundation-emails/docs/pages/wrapper.md delete mode 100644 vendor/assets/foundation-emails/docs/pages/zurb-stack.md delete mode 100644 vendor/assets/foundation-emails/docs/partials/component-list.html delete mode 100644 vendor/assets/foundation-emails/docs/partials/course-callout.html delete mode 100644 vendor/assets/foundation-emails/docs/partials/footer.html delete mode 100644 vendor/assets/foundation-emails/docs/partials/mobile-navigation.html delete mode 100644 vendor/assets/foundation-emails/docs/partials/navigation.html delete mode 100644 vendor/assets/foundation-emails/docs/partials/off-canvas.html delete mode 100644 vendor/assets/foundation-emails/gulpfile.js delete mode 100644 vendor/assets/foundation-emails/migration.md delete mode 100644 vendor/assets/foundation-emails/package.json delete mode 100755 vendor/assets/foundation-emails/scss/_global.scss delete mode 100755 vendor/assets/foundation-emails/scss/components/_alignment.scss delete mode 100755 vendor/assets/foundation-emails/scss/components/_button.scss delete mode 100644 vendor/assets/foundation-emails/scss/components/_callout.scss delete mode 100644 vendor/assets/foundation-emails/scss/components/_code.scss delete mode 100755 vendor/assets/foundation-emails/scss/components/_media-query.scss delete mode 100644 vendor/assets/foundation-emails/scss/components/_menu.scss delete mode 100755 vendor/assets/foundation-emails/scss/components/_normalize.scss delete mode 100755 vendor/assets/foundation-emails/scss/components/_outlook-first.scss delete mode 100644 vendor/assets/foundation-emails/scss/components/_thumbnail.scss delete mode 100755 vendor/assets/foundation-emails/scss/components/_typography.scss delete mode 100644 vendor/assets/foundation-emails/scss/components/_visibility.scss delete mode 100644 vendor/assets/foundation-emails/scss/foundation-emails.scss delete mode 100755 vendor/assets/foundation-emails/scss/grid/_block-grid.scss delete mode 100755 vendor/assets/foundation-emails/scss/grid/_grid.scss delete mode 100644 vendor/assets/foundation-emails/scss/settings/_settings.scss delete mode 100755 vendor/assets/foundation-emails/scss/util/_util.scss delete mode 100644 vendor/assets/foundation-emails/templates/basic.html delete mode 100644 vendor/assets/foundation-emails/templates/drip.html delete mode 100644 vendor/assets/foundation-emails/templates/hero.html delete mode 100644 vendor/assets/foundation-emails/templates/marketing.html delete mode 100644 vendor/assets/foundation-emails/templates/newsletter-2.html delete mode 100644 vendor/assets/foundation-emails/templates/newsletter.html delete mode 100644 vendor/assets/foundation-emails/templates/order.html delete mode 100644 vendor/assets/foundation-emails/templates/password.html delete mode 100644 vendor/assets/foundation-emails/templates/sidebar-hero.html delete mode 100644 vendor/assets/foundation-emails/templates/sidebar.html delete mode 100644 vendor/assets/foundation-emails/templates/welcome.html diff --git a/app/assets/stylesheets/mailers/foundation_emails.scss b/app/assets/stylesheets/mailers/custom-mailer-styles.scss similarity index 75% rename from app/assets/stylesheets/mailers/foundation_emails.scss rename to app/assets/stylesheets/mailers/custom-mailer-styles.scss index a4706b9..b64991b 100644 --- a/app/assets/stylesheets/mailers/foundation_emails.scss +++ b/app/assets/stylesheets/mailers/custom-mailer-styles.scss @@ -1,18 +1,17 @@ -@import "scss/foundation-emails"; - .pd-logo { font-size: 28px; } .email-container { max-width:600px; - background-color:green; + background-color: green; .email-title { font-family: 'HalisR', Helvetica Neue, Helvetica, Ariel, sans-serif !important; .prft-slash { font-size: 100px; font-weight: 100; - color: #EF0734; + // color: #EF0734; + color: $success-color; } } } diff --git a/app/assets/stylesheets/mailers/foundation_global_overrides.scss b/app/assets/stylesheets/mailers/foundation_global_overrides.scss new file mode 100644 index 0000000..e5dc53b --- /dev/null +++ b/app/assets/stylesheets/mailers/foundation_global_overrides.scss @@ -0,0 +1,3 @@ +// manny, put stuff here to override foundation settings + +$success-color: salmon; diff --git a/app/assets/stylesheets/mailers/foundation_vendor_manifest.scss b/app/assets/stylesheets/mailers/foundation_vendor_manifest.scss new file mode 100644 index 0000000..70c2b1a --- /dev/null +++ b/app/assets/stylesheets/mailers/foundation_vendor_manifest.scss @@ -0,0 +1,20 @@ +// Foundation for Emails by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source +// +@import 'foundation-emails/scss/util/util', + 'foundation-emails/scss/global', + 'foundation_global_overrides', + 'foundation-emails/scss/components/normalize', + 'foundation-emails/scss/grid/grid', + 'foundation-emails/scss/grid/block-grid', + 'foundation-emails/scss/components/alignment', + 'foundation-emails/scss/components/visibility', + 'foundation-emails/scss/components/typography', + 'foundation-emails/scss/components/button', + 'foundation-emails/scss/components/callout', + 'foundation-emails/scss/components/thumbnail', + 'foundation-emails/scss/components/menu', + 'foundation-emails/scss/components/outlook-first', + 'foundation-emails/scss/components/media-query'; +@import 'custom-mailer-styles'; diff --git a/app/views/layouts/mailer.html.erb b/app/views/layouts/mailer.html.erb index 02456c3..dfe995b 100644 --- a/app/views/layouts/mailer.html.erb +++ b/app/views/layouts/mailer.html.erb @@ -4,7 +4,7 @@ - <%= stylesheet_link_tag "mailers/foundation_emails" %> + <%= stylesheet_link_tag "mailers/foundation_vendor_manifest" %> diff --git a/bower.json b/bower.json index f05a02e..34e7316 100644 --- a/bower.json +++ b/bower.json @@ -9,7 +9,8 @@ "jquery-validate": "", "tota11y": "", "modernizr-lite": "*", - "html5shiv": "^3.7.3" + "html5shiv": "^3.7.3", + "foundation-emails": "^2.2.1" }, "ignore": [ "**/.*", diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb index ff99107..2cf352a 100644 --- a/config/initializers/assets.rb +++ b/config/initializers/assets.rb @@ -12,5 +12,4 @@ Rails.application.config.assets.version = '1.0' Rails.application.config.assets.precompile += ['vendor/assets/**/*'] Rails.application.config.assets.precompile += %w(ie9.js) -Rails.application.config.assets.precompile += %w(foundation_emails.css) -Rails.application.config.assets.precompile += ['mailers/foundation_emails.css'] +Rails.application.config.assets.precompile += %w(mailers/foundation_vendor_manifest.scss) diff --git a/vendor/assets/foundation-emails/.bower.json b/vendor/assets/foundation-emails/.bower.json deleted file mode 100644 index d85ebff..0000000 --- a/vendor/assets/foundation-emails/.bower.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "foundation-emails", - "version": "2.2.1", - "homepage": "http://foundation.zurb.com/emails", - "authors": [ - "ZURB " - ], - "description": "A framework for designing responsive emails by ZURB.", - "license": "MIT", - "ignore": [ - "**/.*", - "node_modules", - "bower_components", - "gem", - "test", - "tests" - ], - "_release": "2.2.1", - "_resolution": { - "type": "version", - "tag": "v2.2.1", - "commit": "de8db7c234e7b04e30e006de19625035f9e2fa5c" - }, - "_source": "https://github.com/zurb/foundation-emails.git", - "_target": "^2.2.1", - "_originalSource": "foundation-emails", - "_direct": true -} \ No newline at end of file diff --git a/vendor/assets/foundation-emails/CONTRIBUTING.md b/vendor/assets/foundation-emails/CONTRIBUTING.md deleted file mode 100644 index b352cf7..0000000 --- a/vendor/assets/foundation-emails/CONTRIBUTING.md +++ /dev/null @@ -1,46 +0,0 @@ -# Contributing to Foundation - -ZURB loves its community! We always want to hear from our users, whether they're reporting bugs, suggesting new features, or even adding them themselves. - -## Reporting Bugs - -[Open a new issue](https://github.com/zurb/foundation-emails/issues/new) to report a problem you're having with Foundation for Apps. When writing your issue, keep these things in mind: - -- **Be descriptive.** If you can, upload a screenshot of problem you're having, or copy and paste any JavaScript or command line errors you encounter. Being detailed will help us hone in on the problem faster. -- **Post your code.** It's very helpful to see any HTML, Sass, or JavaScript you've written that you think may be causing the problem. In some cases, we might be able to fix your problem just by fixing your code. -- **Help us recreate it.** If your problem is complex, tell us the steps needed to recreate the issue. Sometimes we need to see the problem for ourselves, in our own testing environment, so we can more easily debug it. - -## Editing the Documentation - -The documentation is compiled by a tool called [Supercollider](https://github.com/gakimball/supercollider). Each page is compiled from 1–2 sources: - -- A Markdown file under `docs/pages/`. -- If it's a Sass component, the relevant Sass file inside `scss/` is scanned for special [SassDoc](http://sassdoc.com/) comments. - -Each page is rendered in one big [Handlebars template](https://github.com/zurb/foundation-docs/blob/master/templates/component.html) that takes in all of the above data. - -Much of the guts of the documentation are stored in an external codebase called [foundation-docs](https://github.com/zurb/foundation-docs). This is code that's shared between the documentation for all three Foundation frameworks, including: - -- CSS specific to the documentation -- The Handlebars template used to build pages -- A series of Handlebars helpers for the template -- A custom Markdown parser used when parsing pages -- A script that generates the search results for documentation pages - -To hack on this repo locally, clone the foundation-docs repo into a folder adjacent to this repo's folder on your machine. Then run `npm link ../foundation-docs` to wire the two together. - -## Submitting Pull Requests - -If you think you can solve a problem yourself, or want to implement a new feature, go for it! Follow these guidelines to make the most killer PR ever. - -- **Target the right branch.** So we can properly follow [semantic versioning](http://semver.org/), be sure to develop your pull request in the right branch: - - Ink 1.0 changes: `v1.0` - - Foundation for Emails 2.0+ bug fixes: `develop` - - New features should be pointed to: `v2.2` -- **Test, test, and test.** The Foundation frameworks are used by thousands and thousands of designers and developers, so making sure your changes work in every email client is important! Please test bug fixes or new features in Litmus, or another email testing service. - -## Help Wanted - -Want something to work on? Let us guide you in the right direction. - -- Browse the [Help Wanted](https://github.com/zurb/foundation-emails/labels/help%20wanted) issue to see bugs or features we've asked for the community's help on. Feel free to implement them yourself as a pull request! diff --git a/vendor/assets/foundation-emails/LICENSE.md b/vendor/assets/foundation-emails/LICENSE.md deleted file mode 100644 index 86691bb..0000000 --- a/vendor/assets/foundation-emails/LICENSE.md +++ /dev/null @@ -1,9 +0,0 @@ -Copyright (c) 2016 ZURB, inc. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/vendor/assets/foundation-emails/README.md b/vendor/assets/foundation-emails/README.md deleted file mode 100644 index 1c2015a..0000000 --- a/vendor/assets/foundation-emails/README.md +++ /dev/null @@ -1,122 +0,0 @@ -# [Foundation for Emails](http://foundation.zurb.com/emails) - -[![npm version badge](https://img.shields.io/npm/v/foundation-emails.svg)](https://www.npmjs.org/package/foundation-emails) -[![downloads badge](http://img.shields.io/npm/dm/foundation-emails.svg)](https://www.npmjs.org/package/foundation-emails) -[![Gem Version](https://badge.fury.io/rb/foundation_emails.svg)](https://badge.fury.io/rb/foundation_emails) -[![downloads badge](http://img.shields.io/npm/l/foundation-emails.svg)](https://www.npmjs.org/package/foundation-emails) - - -Foundation for Emails (previously known as Ink) is a framework for creating responsive HTML emails that work in any email client — even Outlook. Our HTML/CSS components have been tested across every major email client to ensure consistency. And with the [Inky](https://github.com/zurb/inky) templating language, writing HTML emails is now even easier. - -## Getting Started - -The main way to get started is with our [email template stack](https://github.com/zurb/foundation-emails-template). To use the stack, you'll need [Node.js](https://nodejs.org/en/) installed on your machine. - -To set up the emails template, run these commands: - -```bash -git clone https://github.com/zurb/foundation-emails-template project -cd project -npm install -``` - -Then run `npm start` to run the project. A new browser window will open with a BrowserSync server showing the finished files. - -Run `npm run build` to do a full email inlining process. - - -#### Using the Ruby gem - -**foundation_emails** is a gem that enables you to use Foundation for Emails assets within a Rails project. To install in your app: - -1. Add the following line to your Gemfile: - - ```ruby - gem 'foundation_emails' - ``` - -2. Then execute: - - ```bash - bundle install - ``` - -3. Import Foundation for Emails in your `application.scss`: - - ```scss - @import "foundation-emails"; - ``` - -## Documentation - -**Check out our [Migration Guide](https://github.com/zurb/foundation-emails/blob/master/migration.md) for upgrading an existing template or for more in-depth code examples.** - -Foundation for Emails 2.0 documentation and framework are on the `develop` branch and you can compile it on your own machine. - -Run these commands to set up the documentation: - -```bash -git clone https://github.com/zurb/foundation-emails.git -cd foundation-emails -``` - -Foundation for Emails 2.0 documentation is on the `develop` branch. - -```bash -git fetch -git checkout develop -npm install -``` - -Then run `npm start` to compile the documentation. When it finishes, a new browser window will open pointing to a BrowserSync server displaying the documentation. - -## Testing - -Run `npm run test:visual` to compile the visual regression tests. All of the pages under `test/visual/pages` are compiled and inlined. From there, they can be uploaded to Litmus for testing. - -## Inky - -[Inky](https://github.com/zurb/inky) is our new templating language that converts simple HTML into the complex tables required for email layout. - -The parser converts a set of custom HTML tags, expanding them out into full HTML syntax. Below is a list of every custom element. - -### Grid - -```html - - - - - - -``` - -### Block Grid - -```html - - - - - -``` - -### Components - -```html - -``` - -```html - - Item One - Item Two - Item Three - -``` - -## Contributing - -As an open source project, we looooove our community support. Please file issues, or better yet pull requests on the [Foundation for Emails Repo](https://github.com/zurb/foundation-emails). We're stoked to hear your feedback, make improvements, and keep evolving Foundation for Emails! - -Copyright (c) 2016 ZURB, inc. diff --git a/vendor/assets/foundation-emails/bower.json b/vendor/assets/foundation-emails/bower.json deleted file mode 100644 index 1f48a1a..0000000 --- a/vendor/assets/foundation-emails/bower.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "foundation-emails", - "version": "2.2.1", - "homepage": "http://foundation.zurb.com/emails", - "authors": [ - "ZURB " - ], - "description": "A framework for designing responsive emails by ZURB.", - "license": "MIT", - "ignore": [ - "**/.*", - "node_modules", - "bower_components", - "gem", - "test", - "tests" - ] -} diff --git a/vendor/assets/foundation-emails/dist/foundation-emails.css b/vendor/assets/foundation-emails/dist/foundation-emails.css deleted file mode 100644 index acd1b98..0000000 --- a/vendor/assets/foundation-emails/dist/foundation-emails.css +++ /dev/null @@ -1,1348 +0,0 @@ -.wrapper { - width: 100%; } - -#outlook a { - padding: 0; } - -body { - width: 100% !important; - min-width: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; - margin: 0; - Margin: 0; - padding: 0; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; } - -.ExternalClass { - width: 100%; } - .ExternalClass, - .ExternalClass p, - .ExternalClass span, - .ExternalClass font, - .ExternalClass td, - .ExternalClass div { - line-height: 100%; } - -#backgroundTable { - margin: 0; - Margin: 0; - padding: 0; - width: 100% !important; - line-height: 100% !important; } - -img { - outline: none; - text-decoration: none; - -ms-interpolation-mode: bicubic; - width: auto; - max-width: 100%; - clear: both; - display: block; } - -center { - width: 100%; - min-width: 580px; } - -a img { - border: none; } - -p { - margin: 0 0 0 10px; - Margin: 0 0 0 10px; } - -table { - border-spacing: 0; - border-collapse: collapse; } - -td { - word-wrap: break-word; - -webkit-hyphens: auto; - -moz-hyphens: auto; - hyphens: auto; - border-collapse: collapse !important; } - -table, tr, td { - padding: 0; - vertical-align: top; - text-align: left; } - -@media only screen { - html { - min-height: 100%; - background: #f3f3f3; } } - -table.body { - background: #f3f3f3; - height: 100%; - width: 100%; } - -table.container { - background: #fefefe; - width: 580px; - margin: 0 auto; - Margin: 0 auto; - text-align: inherit; } - -table.row { - padding: 0; - width: 100%; - position: relative; } - -table.spacer { - width: 100%; } - table.spacer td { - mso-line-height-rule: exactly; } - -table.container table.row { - display: table; } - -td.columns, -td.column, -th.columns, -th.column { - margin: 0 auto; - Margin: 0 auto; - padding-left: 16px; - padding-bottom: 16px; } - td.columns .column, - td.columns .columns, - td.column .column, - td.column .columns, - th.columns .column, - th.columns .columns, - th.column .column, - th.column .columns { - padding-left: 0 !important; - padding-right: 0 !important; } - td.columns .column center, - td.columns .columns center, - td.column .column center, - td.column .columns center, - th.columns .column center, - th.columns .columns center, - th.column .column center, - th.column .columns center { - min-width: none !important; } - -td.columns.last, -td.column.last, -th.columns.last, -th.column.last { - padding-right: 16px; } - -td.columns table:not(.button), -td.column table:not(.button), -th.columns table:not(.button), -th.column table:not(.button) { - width: 100%; } - -td.large-1, -th.large-1 { - width: 32.33333px; - padding-left: 8px; - padding-right: 8px; } - -td.large-1.first, -th.large-1.first { - padding-left: 16px; } - -td.large-1.last, -th.large-1.last { - padding-right: 16px; } - -.collapse > tbody > tr > td.large-1, -.collapse > tbody > tr > th.large-1 { - padding-right: 0; - padding-left: 0; - width: 48.33333px; } - -.collapse td.large-1.first, -.collapse th.large-1.first, -.collapse td.large-1.last, -.collapse th.large-1.last { - width: 56.33333px; } - -td.large-1 center, -th.large-1 center { - min-width: 0.33333px; } - -.body .columns td.large-1, -.body .column td.large-1, -.body .columns th.large-1, -.body .column th.large-1 { - width: 8.33333%; } - -td.large-2, -th.large-2 { - width: 80.66667px; - padding-left: 8px; - padding-right: 8px; } - -td.large-2.first, -th.large-2.first { - padding-left: 16px; } - -td.large-2.last, -th.large-2.last { - padding-right: 16px; } - -.collapse > tbody > tr > td.large-2, -.collapse > tbody > tr > th.large-2 { - padding-right: 0; - padding-left: 0; - width: 96.66667px; } - -.collapse td.large-2.first, -.collapse th.large-2.first, -.collapse td.large-2.last, -.collapse th.large-2.last { - width: 104.66667px; } - -td.large-2 center, -th.large-2 center { - min-width: 48.66667px; } - -.body .columns td.large-2, -.body .column td.large-2, -.body .columns th.large-2, -.body .column th.large-2 { - width: 16.66667%; } - -td.large-3, -th.large-3 { - width: 129px; - padding-left: 8px; - padding-right: 8px; } - -td.large-3.first, -th.large-3.first { - padding-left: 16px; } - -td.large-3.last, -th.large-3.last { - padding-right: 16px; } - -.collapse > tbody > tr > td.large-3, -.collapse > tbody > tr > th.large-3 { - padding-right: 0; - padding-left: 0; - width: 145px; } - -.collapse td.large-3.first, -.collapse th.large-3.first, -.collapse td.large-3.last, -.collapse th.large-3.last { - width: 153px; } - -td.large-3 center, -th.large-3 center { - min-width: 97px; } - -.body .columns td.large-3, -.body .column td.large-3, -.body .columns th.large-3, -.body .column th.large-3 { - width: 25%; } - -td.large-4, -th.large-4 { - width: 177.33333px; - padding-left: 8px; - padding-right: 8px; } - -td.large-4.first, -th.large-4.first { - padding-left: 16px; } - -td.large-4.last, -th.large-4.last { - padding-right: 16px; } - -.collapse > tbody > tr > td.large-4, -.collapse > tbody > tr > th.large-4 { - padding-right: 0; - padding-left: 0; - width: 193.33333px; } - -.collapse td.large-4.first, -.collapse th.large-4.first, -.collapse td.large-4.last, -.collapse th.large-4.last { - width: 201.33333px; } - -td.large-4 center, -th.large-4 center { - min-width: 145.33333px; } - -.body .columns td.large-4, -.body .column td.large-4, -.body .columns th.large-4, -.body .column th.large-4 { - width: 33.33333%; } - -td.large-5, -th.large-5 { - width: 225.66667px; - padding-left: 8px; - padding-right: 8px; } - -td.large-5.first, -th.large-5.first { - padding-left: 16px; } - -td.large-5.last, -th.large-5.last { - padding-right: 16px; } - -.collapse > tbody > tr > td.large-5, -.collapse > tbody > tr > th.large-5 { - padding-right: 0; - padding-left: 0; - width: 241.66667px; } - -.collapse td.large-5.first, -.collapse th.large-5.first, -.collapse td.large-5.last, -.collapse th.large-5.last { - width: 249.66667px; } - -td.large-5 center, -th.large-5 center { - min-width: 193.66667px; } - -.body .columns td.large-5, -.body .column td.large-5, -.body .columns th.large-5, -.body .column th.large-5 { - width: 41.66667%; } - -td.large-6, -th.large-6 { - width: 274px; - padding-left: 8px; - padding-right: 8px; } - -td.large-6.first, -th.large-6.first { - padding-left: 16px; } - -td.large-6.last, -th.large-6.last { - padding-right: 16px; } - -.collapse > tbody > tr > td.large-6, -.collapse > tbody > tr > th.large-6 { - padding-right: 0; - padding-left: 0; - width: 290px; } - -.collapse td.large-6.first, -.collapse th.large-6.first, -.collapse td.large-6.last, -.collapse th.large-6.last { - width: 298px; } - -td.large-6 center, -th.large-6 center { - min-width: 242px; } - -.body .columns td.large-6, -.body .column td.large-6, -.body .columns th.large-6, -.body .column th.large-6 { - width: 50%; } - -td.large-7, -th.large-7 { - width: 322.33333px; - padding-left: 8px; - padding-right: 8px; } - -td.large-7.first, -th.large-7.first { - padding-left: 16px; } - -td.large-7.last, -th.large-7.last { - padding-right: 16px; } - -.collapse > tbody > tr > td.large-7, -.collapse > tbody > tr > th.large-7 { - padding-right: 0; - padding-left: 0; - width: 338.33333px; } - -.collapse td.large-7.first, -.collapse th.large-7.first, -.collapse td.large-7.last, -.collapse th.large-7.last { - width: 346.33333px; } - -td.large-7 center, -th.large-7 center { - min-width: 290.33333px; } - -.body .columns td.large-7, -.body .column td.large-7, -.body .columns th.large-7, -.body .column th.large-7 { - width: 58.33333%; } - -td.large-8, -th.large-8 { - width: 370.66667px; - padding-left: 8px; - padding-right: 8px; } - -td.large-8.first, -th.large-8.first { - padding-left: 16px; } - -td.large-8.last, -th.large-8.last { - padding-right: 16px; } - -.collapse > tbody > tr > td.large-8, -.collapse > tbody > tr > th.large-8 { - padding-right: 0; - padding-left: 0; - width: 386.66667px; } - -.collapse td.large-8.first, -.collapse th.large-8.first, -.collapse td.large-8.last, -.collapse th.large-8.last { - width: 394.66667px; } - -td.large-8 center, -th.large-8 center { - min-width: 338.66667px; } - -.body .columns td.large-8, -.body .column td.large-8, -.body .columns th.large-8, -.body .column th.large-8 { - width: 66.66667%; } - -td.large-9, -th.large-9 { - width: 419px; - padding-left: 8px; - padding-right: 8px; } - -td.large-9.first, -th.large-9.first { - padding-left: 16px; } - -td.large-9.last, -th.large-9.last { - padding-right: 16px; } - -.collapse > tbody > tr > td.large-9, -.collapse > tbody > tr > th.large-9 { - padding-right: 0; - padding-left: 0; - width: 435px; } - -.collapse td.large-9.first, -.collapse th.large-9.first, -.collapse td.large-9.last, -.collapse th.large-9.last { - width: 443px; } - -td.large-9 center, -th.large-9 center { - min-width: 387px; } - -.body .columns td.large-9, -.body .column td.large-9, -.body .columns th.large-9, -.body .column th.large-9 { - width: 75%; } - -td.large-10, -th.large-10 { - width: 467.33333px; - padding-left: 8px; - padding-right: 8px; } - -td.large-10.first, -th.large-10.first { - padding-left: 16px; } - -td.large-10.last, -th.large-10.last { - padding-right: 16px; } - -.collapse > tbody > tr > td.large-10, -.collapse > tbody > tr > th.large-10 { - padding-right: 0; - padding-left: 0; - width: 483.33333px; } - -.collapse td.large-10.first, -.collapse th.large-10.first, -.collapse td.large-10.last, -.collapse th.large-10.last { - width: 491.33333px; } - -td.large-10 center, -th.large-10 center { - min-width: 435.33333px; } - -.body .columns td.large-10, -.body .column td.large-10, -.body .columns th.large-10, -.body .column th.large-10 { - width: 83.33333%; } - -td.large-11, -th.large-11 { - width: 515.66667px; - padding-left: 8px; - padding-right: 8px; } - -td.large-11.first, -th.large-11.first { - padding-left: 16px; } - -td.large-11.last, -th.large-11.last { - padding-right: 16px; } - -.collapse > tbody > tr > td.large-11, -.collapse > tbody > tr > th.large-11 { - padding-right: 0; - padding-left: 0; - width: 531.66667px; } - -.collapse td.large-11.first, -.collapse th.large-11.first, -.collapse td.large-11.last, -.collapse th.large-11.last { - width: 539.66667px; } - -td.large-11 center, -th.large-11 center { - min-width: 483.66667px; } - -.body .columns td.large-11, -.body .column td.large-11, -.body .columns th.large-11, -.body .column th.large-11 { - width: 91.66667%; } - -td.large-12, -th.large-12 { - width: 564px; - padding-left: 8px; - padding-right: 8px; } - -td.large-12.first, -th.large-12.first { - padding-left: 16px; } - -td.large-12.last, -th.large-12.last { - padding-right: 16px; } - -.collapse > tbody > tr > td.large-12, -.collapse > tbody > tr > th.large-12 { - padding-right: 0; - padding-left: 0; - width: 580px; } - -.collapse td.large-12.first, -.collapse th.large-12.first, -.collapse td.large-12.last, -.collapse th.large-12.last { - width: 588px; } - -td.large-12 center, -th.large-12 center { - min-width: 532px; } - -.body .columns td.large-12, -.body .column td.large-12, -.body .columns th.large-12, -.body .column th.large-12 { - width: 100%; } - -td.large-offset-1, -td.large-offset-1.first, -td.large-offset-1.last, -th.large-offset-1, -th.large-offset-1.first, -th.large-offset-1.last { - padding-left: 64.33333px; } - -td.large-offset-2, -td.large-offset-2.first, -td.large-offset-2.last, -th.large-offset-2, -th.large-offset-2.first, -th.large-offset-2.last { - padding-left: 112.66667px; } - -td.large-offset-3, -td.large-offset-3.first, -td.large-offset-3.last, -th.large-offset-3, -th.large-offset-3.first, -th.large-offset-3.last { - padding-left: 161px; } - -td.large-offset-4, -td.large-offset-4.first, -td.large-offset-4.last, -th.large-offset-4, -th.large-offset-4.first, -th.large-offset-4.last { - padding-left: 209.33333px; } - -td.large-offset-5, -td.large-offset-5.first, -td.large-offset-5.last, -th.large-offset-5, -th.large-offset-5.first, -th.large-offset-5.last { - padding-left: 257.66667px; } - -td.large-offset-6, -td.large-offset-6.first, -td.large-offset-6.last, -th.large-offset-6, -th.large-offset-6.first, -th.large-offset-6.last { - padding-left: 306px; } - -td.large-offset-7, -td.large-offset-7.first, -td.large-offset-7.last, -th.large-offset-7, -th.large-offset-7.first, -th.large-offset-7.last { - padding-left: 354.33333px; } - -td.large-offset-8, -td.large-offset-8.first, -td.large-offset-8.last, -th.large-offset-8, -th.large-offset-8.first, -th.large-offset-8.last { - padding-left: 402.66667px; } - -td.large-offset-9, -td.large-offset-9.first, -td.large-offset-9.last, -th.large-offset-9, -th.large-offset-9.first, -th.large-offset-9.last { - padding-left: 451px; } - -td.large-offset-10, -td.large-offset-10.first, -td.large-offset-10.last, -th.large-offset-10, -th.large-offset-10.first, -th.large-offset-10.last { - padding-left: 499.33333px; } - -td.large-offset-11, -td.large-offset-11.first, -td.large-offset-11.last, -th.large-offset-11, -th.large-offset-11.first, -th.large-offset-11.last { - padding-left: 547.66667px; } - -td.expander, -th.expander { - visibility: hidden; - width: 0; - padding: 0 !important; } - -table.container.radius { - border-radius: 0; - border-collapse: separate; } - -.block-grid { - width: 100%; - max-width: 580px; } - .block-grid td { - display: inline-block; - padding: 8px; } - -.up-2 td { - width: 274px !important; } - -.up-3 td { - width: 177px !important; } - -.up-4 td { - width: 129px !important; } - -.up-5 td { - width: 100px !important; } - -.up-6 td { - width: 80px !important; } - -.up-7 td { - width: 66px !important; } - -.up-8 td { - width: 56px !important; } - -table.text-center, -th.text-center, -td.text-center, -h1.text-center, -h2.text-center, -h3.text-center, -h4.text-center, -h5.text-center, -h6.text-center, -p.text-center, -span.text-center { - text-align: center; } - -table.text-left, -th.text-left, -td.text-left, -h1.text-left, -h2.text-left, -h3.text-left, -h4.text-left, -h5.text-left, -h6.text-left, -p.text-left, -span.text-left { - text-align: left; } - -table.text-right, -th.text-right, -td.text-right, -h1.text-right, -h2.text-right, -h3.text-right, -h4.text-right, -h5.text-right, -h6.text-right, -p.text-right, -span.text-right { - text-align: right; } - -span.text-center { - display: block; - width: 100%; - text-align: center; } - -@media only screen and (max-width: 596px) { - .small-float-center { - margin: 0 auto !important; - float: none !important; - text-align: center !important; } - .small-text-center { - text-align: center !important; } - .small-text-left { - text-align: left !important; } - .small-text-right { - text-align: right !important; } } - -img.float-left { - float: left; - text-align: left; } - -img.float-right { - float: right; - text-align: right; } - -img.float-center, -img.text-center { - margin: 0 auto; - Margin: 0 auto; - float: none; - text-align: center; } - -table.float-center, -td.float-center, -th.float-center { - margin: 0 auto; - Margin: 0 auto; - float: none; - text-align: center; } - -.hide-for-large { - display: none !important; - mso-hide: all; - overflow: hidden; - max-height: 0; - font-size: 0; - width: 0; - line-height: 0; } - @media only screen and (max-width: 596px) { - .hide-for-large { - display: block !important; - width: auto !important; - overflow: visible !important; - max-height: none !important; - font-size: inherit !important; - line-height: inherit !important; } } - -table.body table.container .hide-for-large * { - mso-hide: all; } - -@media only screen and (max-width: 596px) { - table.body table.container .hide-for-large, - table.body table.container .row.hide-for-large { - display: table !important; - width: 100% !important; } } - -@media only screen and (max-width: 596px) { - table.body table.container .callout-inner.hide-for-large { - display: table-cell !important; - width: 100% !important; } } - -@media only screen and (max-width: 596px) { - table.body table.container .show-for-large { - display: none !important; - width: 0; - mso-hide: all; - overflow: hidden; } } - -body, -table.body, -h1, -h2, -h3, -h4, -h5, -h6, -p, -td, -th, -a { - color: #0a0a0a; - font-family: Helvetica, Arial, sans-serif; - font-weight: normal; - padding: 0; - margin: 0; - Margin: 0; - text-align: left; - line-height: 1.3; } - -h1, -h2, -h3, -h4, -h5, -h6 { - color: inherit; - word-wrap: normal; - font-family: Helvetica, Arial, sans-serif; - font-weight: normal; - margin-bottom: 10px; - Margin-bottom: 10px; } - -h1 { - font-size: 34px; } - -h2 { - font-size: 30px; } - -h3 { - font-size: 28px; } - -h4 { - font-size: 24px; } - -h5 { - font-size: 20px; } - -h6 { - font-size: 18px; } - -body, -table.body, -p, -td, -th { - font-size: 16px; - line-height: 1.3; } - -p { - margin-bottom: 10px; - Margin-bottom: 10px; } - p.lead { - font-size: 20px; - line-height: 1.6; } - p.subheader { - margin-top: 4px; - margin-bottom: 8px; - Margin-top: 4px; - Margin-bottom: 8px; - font-weight: normal; - line-height: 1.4; - color: #8a8a8a; } - -small { - font-size: 80%; - color: #cacaca; } - -a { - color: #2199e8; - text-decoration: none; } - a:hover { - color: #147dc2; } - a:active { - color: #147dc2; } - a:visited { - color: #2199e8; } - -h1 a, -h1 a:visited, -h2 a, -h2 a:visited, -h3 a, -h3 a:visited, -h4 a, -h4 a:visited, -h5 a, -h5 a:visited, -h6 a, -h6 a:visited { - color: #2199e8; } - -pre { - background: #f3f3f3; - margin: 30px 0; - Margin: 30px 0; } - pre code { - color: #cacaca; } - pre code span.callout { - color: #8a8a8a; - font-weight: bold; } - pre code span.callout-strong { - color: #ff6908; - font-weight: bold; } - -table.hr { - width: 100%; } - table.hr th { - height: 0; - max-width: 580px; - border-top: 0; - border-right: 0; - border-bottom: 1px solid #0a0a0a; - border-left: 0; - margin: 20px auto; - Margin: 20px auto; - clear: both; } - -.stat { - font-size: 40px; - line-height: 1; } - p + .stat { - margin-top: -16px; - Margin-top: -16px; } - -span.preheader { - display: none !important; - visibility: hidden; - mso-hide: all !important; - font-size: 1px; - color: #f3f3f3; - line-height: 1px; - max-height: 0px; - max-width: 0px; - opacity: 0; - overflow: hidden; } - -table.button { - width: auto; - margin: 0 0 16px 0; - Margin: 0 0 16px 0; } - table.button table td { - text-align: left; - color: #fefefe; - background: #2199e8; - border: 2px solid #2199e8; } - table.button table td a { - font-family: Helvetica, Arial, sans-serif; - font-size: 16px; - font-weight: bold; - color: #fefefe; - text-decoration: none; - display: inline-block; - padding: 8px 16px 8px 16px; - border: 0 solid #2199e8; - border-radius: 3px; } - table.button.radius table td { - border-radius: 3px; - border: none; } - table.button.rounded table td { - border-radius: 500px; - border: none; } - -table.button:hover table tr td a, -table.button:active table tr td a, -table.button table tr td a:visited, -table.button.tiny:hover table tr td a, -table.button.tiny:active table tr td a, -table.button.tiny table tr td a:visited, -table.button.small:hover table tr td a, -table.button.small:active table tr td a, -table.button.small table tr td a:visited, -table.button.large:hover table tr td a, -table.button.large:active table tr td a, -table.button.large table tr td a:visited { - color: #fefefe; } - -table.button.tiny table td, -table.button.tiny table a { - padding: 4px 8px 4px 8px; } - -table.button.tiny table a { - font-size: 10px; - font-weight: normal; } - -table.button.small table td, -table.button.small table a { - padding: 5px 10px 5px 10px; - font-size: 12px; } - -table.button.large table a { - padding: 10px 20px 10px 20px; - font-size: 20px; } - -table.button.expand, -table.button.expanded { - width: 100% !important; } - table.button.expand table, - table.button.expanded table { - width: 100%; } - table.button.expand table a, - table.button.expanded table a { - text-align: center; - width: 100%; - padding-left: 0; - padding-right: 0; } - table.button.expand center, - table.button.expanded center { - min-width: 0; } - -table.button:hover table td, -table.button:visited table td, -table.button:active table td { - background: #147dc2; - color: #fefefe; } - -table.button:hover table a, -table.button:visited table a, -table.button:active table a { - border: 0 solid #147dc2; } - -table.button.secondary table td { - background: #777777; - color: #fefefe; - border: 0px solid #777777; } - -table.button.secondary table a { - color: #fefefe; - border: 0 solid #777777; } - -table.button.secondary:hover table td { - background: #919191; - color: #fefefe; } - -table.button.secondary:hover table a { - border: 0 solid #919191; } - -table.button.secondary:hover table td a { - color: #fefefe; } - -table.button.secondary:active table td a { - color: #fefefe; } - -table.button.secondary table td a:visited { - color: #fefefe; } - -table.button.success table td { - background: #3adb76; - border: 0px solid #3adb76; } - -table.button.success table a { - border: 0 solid #3adb76; } - -table.button.success:hover table td { - background: #23bf5d; } - -table.button.success:hover table a { - border: 0 solid #23bf5d; } - -table.button.alert table td { - background: #ec5840; - border: 0px solid #ec5840; } - -table.button.alert table a { - border: 0 solid #ec5840; } - -table.button.alert:hover table td { - background: #e23317; } - -table.button.alert:hover table a { - border: 0 solid #e23317; } - -table.button.warning table td { - background: #ffae00; - border: 0px solid #ffae00; } - -table.button.warning table a { - border: 0px solid #ffae00; } - -table.button.warning:hover table td { - background: #cc8b00; } - -table.button.warning:hover table a { - border: 0px solid #cc8b00; } - -table.callout { - margin-bottom: 16px; - Margin-bottom: 16px; } - -th.callout-inner { - width: 100%; - border: 1px solid #cbcbcb; - padding: 10px; - background: #fefefe; } - th.callout-inner.primary { - background: #def0fc; - border: 1px solid #444444; - color: #0a0a0a; } - th.callout-inner.secondary { - background: #ebebeb; - border: 1px solid #444444; - color: #0a0a0a; } - th.callout-inner.success { - background: #e1faea; - border: 1px solid #1b9448; - color: #fefefe; } - th.callout-inner.warning { - background: #fff3d9; - border: 1px solid #996800; - color: #fefefe; } - th.callout-inner.alert { - background: #fce6e2; - border: 1px solid #b42912; - color: #fefefe; } - -.thumbnail { - border: solid 4px #fefefe; - box-shadow: 0 0 0 1px rgba(10, 10, 10, 0.2); - display: inline-block; - line-height: 0; - max-width: 100%; - transition: box-shadow 200ms ease-out; - border-radius: 3px; - margin-bottom: 16px; } - .thumbnail:hover, .thumbnail:focus { - box-shadow: 0 0 6px 1px rgba(33, 153, 232, 0.5); } - -table.menu { - width: 580px; } - table.menu td.menu-item, - table.menu th.menu-item { - padding: 10px; - padding-right: 10px; } - table.menu td.menu-item a, - table.menu th.menu-item a { - color: #2199e8; } - -table.menu.vertical td.menu-item, -table.menu.vertical th.menu-item { - padding: 10px; - padding-right: 0; - display: block; } - table.menu.vertical td.menu-item a, - table.menu.vertical th.menu-item a { - width: 100%; } - -table.menu.vertical td.menu-item table.menu.vertical td.menu-item, -table.menu.vertical td.menu-item table.menu.vertical th.menu-item, -table.menu.vertical th.menu-item table.menu.vertical td.menu-item, -table.menu.vertical th.menu-item table.menu.vertical th.menu-item { - padding-left: 10px; } - -table.menu.text-center a { - text-align: center; } - -.menu[align="center"] { - width: auto !important; } - -body.outlook p { - display: inline !important; } - -@media only screen and (max-width: 596px) { - table.body img { - width: auto; - height: auto; } - table.body center { - min-width: 0 !important; } - table.body .container { - width: 95% !important; } - table.body .columns, - table.body .column { - height: auto !important; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - padding-left: 16px !important; - padding-right: 16px !important; } - table.body .columns .column, - table.body .columns .columns, - table.body .column .column, - table.body .column .columns { - padding-left: 0 !important; - padding-right: 0 !important; } - table.body .collapse .columns, - table.body .collapse .column { - padding-left: 0 !important; - padding-right: 0 !important; } - td.small-1, - th.small-1 { - display: inline-block !important; - width: 8.33333% !important; } - td.small-2, - th.small-2 { - display: inline-block !important; - width: 16.66667% !important; } - td.small-3, - th.small-3 { - display: inline-block !important; - width: 25% !important; } - td.small-4, - th.small-4 { - display: inline-block !important; - width: 33.33333% !important; } - td.small-5, - th.small-5 { - display: inline-block !important; - width: 41.66667% !important; } - td.small-6, - th.small-6 { - display: inline-block !important; - width: 50% !important; } - td.small-7, - th.small-7 { - display: inline-block !important; - width: 58.33333% !important; } - td.small-8, - th.small-8 { - display: inline-block !important; - width: 66.66667% !important; } - td.small-9, - th.small-9 { - display: inline-block !important; - width: 75% !important; } - td.small-10, - th.small-10 { - display: inline-block !important; - width: 83.33333% !important; } - td.small-11, - th.small-11 { - display: inline-block !important; - width: 91.66667% !important; } - td.small-12, - th.small-12 { - display: inline-block !important; - width: 100% !important; } - .columns td.small-12, - .column td.small-12, - .columns th.small-12, - .column th.small-12 { - display: block !important; - width: 100% !important; } - table.body td.small-offset-1, - table.body th.small-offset-1 { - margin-left: 8.33333% !important; - Margin-left: 8.33333% !important; } - table.body td.small-offset-2, - table.body th.small-offset-2 { - margin-left: 16.66667% !important; - Margin-left: 16.66667% !important; } - table.body td.small-offset-3, - table.body th.small-offset-3 { - margin-left: 25% !important; - Margin-left: 25% !important; } - table.body td.small-offset-4, - table.body th.small-offset-4 { - margin-left: 33.33333% !important; - Margin-left: 33.33333% !important; } - table.body td.small-offset-5, - table.body th.small-offset-5 { - margin-left: 41.66667% !important; - Margin-left: 41.66667% !important; } - table.body td.small-offset-6, - table.body th.small-offset-6 { - margin-left: 50% !important; - Margin-left: 50% !important; } - table.body td.small-offset-7, - table.body th.small-offset-7 { - margin-left: 58.33333% !important; - Margin-left: 58.33333% !important; } - table.body td.small-offset-8, - table.body th.small-offset-8 { - margin-left: 66.66667% !important; - Margin-left: 66.66667% !important; } - table.body td.small-offset-9, - table.body th.small-offset-9 { - margin-left: 75% !important; - Margin-left: 75% !important; } - table.body td.small-offset-10, - table.body th.small-offset-10 { - margin-left: 83.33333% !important; - Margin-left: 83.33333% !important; } - table.body td.small-offset-11, - table.body th.small-offset-11 { - margin-left: 91.66667% !important; - Margin-left: 91.66667% !important; } - table.body table.columns td.expander, - table.body table.columns th.expander { - display: none !important; } - table.body .right-text-pad, - table.body .text-pad-right { - padding-left: 10px !important; } - table.body .left-text-pad, - table.body .text-pad-left { - padding-right: 10px !important; } - table.menu { - width: 100% !important; } - table.menu td, - table.menu th { - width: auto !important; - display: inline-block !important; } - table.menu.vertical td, - table.menu.vertical th, table.menu.small-vertical td, - table.menu.small-vertical th { - display: block !important; } - table.menu[align="center"] { - width: auto !important; } - table.button.small-expand, - table.button.small-expanded { - width: 100% !important; } - table.button.small-expand table, - table.button.small-expanded table { - width: 100%; } - table.button.small-expand table a, - table.button.small-expanded table a { - text-align: center !important; - width: 100% !important; - padding-left: 0 !important; - padding-right: 0 !important; } - table.button.small-expand center, - table.button.small-expanded center { - min-width: 0; } } diff --git a/vendor/assets/foundation-emails/dist/foundation-emails.min.css b/vendor/assets/foundation-emails/dist/foundation-emails.min.css deleted file mode 100644 index 157be02..0000000 --- a/vendor/assets/foundation-emails/dist/foundation-emails.min.css +++ /dev/null @@ -1 +0,0 @@ -.wrapper{width:100%}#outlook a,body{padding:0}body{width:100%!important;min-width:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;margin:0;Margin:0;box-sizing:border-box}.ExternalClass{width:100%}.ExternalClass,.ExternalClass div,.ExternalClass font,.ExternalClass p,.ExternalClass span,.ExternalClass td{line-height:100%}#backgroundTable{margin:0;Margin:0;padding:0;width:100%!important;line-height:100%!important}img{outline:none;text-decoration:none;-ms-interpolation-mode:bicubic;width:auto;max-width:100%;clear:both;display:block}center{width:100%;min-width:580px}a img{border:none}p{margin:0 0 0 10px;Margin:0 0 0 10px}table{border-spacing:0;border-collapse:collapse}td{word-wrap:break-word;-webkit-hyphens:auto;hyphens:auto;border-collapse:collapse!important}table,td,tr{padding:0;vertical-align:top;text-align:left}@media only screen{html{min-height:100%;background:#f3f3f3}}table.body{background:#f3f3f3;height:100%;width:100%}table.container{background:#fefefe;width:580px;margin:0 auto;Margin:0 auto;text-align:inherit}table.row{padding:0;position:relative}table.row,table.spacer{width:100%}table.spacer td{mso-line-height-rule:exactly}table.container table.row{display:table}td.column,td.columns,th.column,th.columns{margin:0 auto;Margin:0 auto;padding-left:16px;padding-bottom:16px}td.column .column,td.column .columns,td.columns .column,td.columns .columns,th.column .column,th.column .columns,th.columns .column,th.columns .columns{padding-left:0!important;padding-right:0!important}td.column .column center,td.column .columns center,td.columns .column center,td.columns .columns center,th.column .column center,th.column .columns center,th.columns .column center,th.columns .columns center{min-width:none!important}td.column.last,td.columns.last,th.column.last,th.columns.last{padding-right:16px}td.columns table:not(.button),td.column table:not(.button),th.columns table:not(.button),th.column table:not(.button){width:100%}td.large-1,th.large-1{width:32.33333px;padding-left:8px;padding-right:8px}td.large-1.first,th.large-1.first{padding-left:16px}td.large-1.last,th.large-1.last{padding-right:16px}.collapse>tbody>tr>td.large-1,.collapse>tbody>tr>th.large-1{padding-right:0;padding-left:0;width:48.33333px}.collapse td.large-1.first,.collapse td.large-1.last,.collapse th.large-1.first,.collapse th.large-1.last{width:56.33333px}td.large-1 center,th.large-1 center{min-width:.33333px}.body .columns td.large-1,.body .columns th.large-1,.body .column td.large-1,.body .column th.large-1{width:8.33333%}td.large-2,th.large-2{width:80.66667px;padding-left:8px;padding-right:8px}td.large-2.first,th.large-2.first{padding-left:16px}td.large-2.last,th.large-2.last{padding-right:16px}.collapse>tbody>tr>td.large-2,.collapse>tbody>tr>th.large-2{padding-right:0;padding-left:0;width:96.66667px}.collapse td.large-2.first,.collapse td.large-2.last,.collapse th.large-2.first,.collapse th.large-2.last{width:104.66667px}td.large-2 center,th.large-2 center{min-width:48.66667px}.body .columns td.large-2,.body .columns th.large-2,.body .column td.large-2,.body .column th.large-2{width:16.66667%}td.large-3,th.large-3{width:129px;padding-left:8px;padding-right:8px}td.large-3.first,th.large-3.first{padding-left:16px}td.large-3.last,th.large-3.last{padding-right:16px}.collapse>tbody>tr>td.large-3,.collapse>tbody>tr>th.large-3{padding-right:0;padding-left:0;width:145px}.collapse td.large-3.first,.collapse td.large-3.last,.collapse th.large-3.first,.collapse th.large-3.last{width:153px}td.large-3 center,th.large-3 center{min-width:97px}.body .columns td.large-3,.body .columns th.large-3,.body .column td.large-3,.body .column th.large-3{width:25%}td.large-4,th.large-4{width:177.33333px;padding-left:8px;padding-right:8px}td.large-4.first,th.large-4.first{padding-left:16px}td.large-4.last,th.large-4.last{padding-right:16px}.collapse>tbody>tr>td.large-4,.collapse>tbody>tr>th.large-4{padding-right:0;padding-left:0;width:193.33333px}.collapse td.large-4.first,.collapse td.large-4.last,.collapse th.large-4.first,.collapse th.large-4.last{width:201.33333px}td.large-4 center,th.large-4 center{min-width:145.33333px}.body .columns td.large-4,.body .columns th.large-4,.body .column td.large-4,.body .column th.large-4{width:33.33333%}td.large-5,th.large-5{width:225.66667px;padding-left:8px;padding-right:8px}td.large-5.first,th.large-5.first{padding-left:16px}td.large-5.last,th.large-5.last{padding-right:16px}.collapse>tbody>tr>td.large-5,.collapse>tbody>tr>th.large-5{padding-right:0;padding-left:0;width:241.66667px}.collapse td.large-5.first,.collapse td.large-5.last,.collapse th.large-5.first,.collapse th.large-5.last{width:249.66667px}td.large-5 center,th.large-5 center{min-width:193.66667px}.body .columns td.large-5,.body .columns th.large-5,.body .column td.large-5,.body .column th.large-5{width:41.66667%}td.large-6,th.large-6{width:274px;padding-left:8px;padding-right:8px}td.large-6.first,th.large-6.first{padding-left:16px}td.large-6.last,th.large-6.last{padding-right:16px}.collapse>tbody>tr>td.large-6,.collapse>tbody>tr>th.large-6{padding-right:0;padding-left:0;width:290px}.collapse td.large-6.first,.collapse td.large-6.last,.collapse th.large-6.first,.collapse th.large-6.last{width:298px}td.large-6 center,th.large-6 center{min-width:242px}.body .columns td.large-6,.body .columns th.large-6,.body .column td.large-6,.body .column th.large-6{width:50%}td.large-7,th.large-7{width:322.33333px;padding-left:8px;padding-right:8px}td.large-7.first,th.large-7.first{padding-left:16px}td.large-7.last,th.large-7.last{padding-right:16px}.collapse>tbody>tr>td.large-7,.collapse>tbody>tr>th.large-7{padding-right:0;padding-left:0;width:338.33333px}.collapse td.large-7.first,.collapse td.large-7.last,.collapse th.large-7.first,.collapse th.large-7.last{width:346.33333px}td.large-7 center,th.large-7 center{min-width:290.33333px}.body .columns td.large-7,.body .columns th.large-7,.body .column td.large-7,.body .column th.large-7{width:58.33333%}td.large-8,th.large-8{width:370.66667px;padding-left:8px;padding-right:8px}td.large-8.first,th.large-8.first{padding-left:16px}td.large-8.last,th.large-8.last{padding-right:16px}.collapse>tbody>tr>td.large-8,.collapse>tbody>tr>th.large-8{padding-right:0;padding-left:0;width:386.66667px}.collapse td.large-8.first,.collapse td.large-8.last,.collapse th.large-8.first,.collapse th.large-8.last{width:394.66667px}td.large-8 center,th.large-8 center{min-width:338.66667px}.body .columns td.large-8,.body .columns th.large-8,.body .column td.large-8,.body .column th.large-8{width:66.66667%}td.large-9,th.large-9{width:419px;padding-left:8px;padding-right:8px}td.large-9.first,th.large-9.first{padding-left:16px}td.large-9.last,th.large-9.last{padding-right:16px}.collapse>tbody>tr>td.large-9,.collapse>tbody>tr>th.large-9{padding-right:0;padding-left:0;width:435px}.collapse td.large-9.first,.collapse td.large-9.last,.collapse th.large-9.first,.collapse th.large-9.last{width:443px}td.large-9 center,th.large-9 center{min-width:387px}.body .columns td.large-9,.body .columns th.large-9,.body .column td.large-9,.body .column th.large-9{width:75%}td.large-10,th.large-10{width:467.33333px;padding-left:8px;padding-right:8px}td.large-10.first,th.large-10.first{padding-left:16px}td.large-10.last,th.large-10.last{padding-right:16px}.collapse>tbody>tr>td.large-10,.collapse>tbody>tr>th.large-10{padding-right:0;padding-left:0;width:483.33333px}.collapse td.large-10.first,.collapse td.large-10.last,.collapse th.large-10.first,.collapse th.large-10.last{width:491.33333px}td.large-10 center,th.large-10 center{min-width:435.33333px}.body .columns td.large-10,.body .columns th.large-10,.body .column td.large-10,.body .column th.large-10{width:83.33333%}td.large-11,th.large-11{width:515.66667px;padding-left:8px;padding-right:8px}td.large-11.first,th.large-11.first{padding-left:16px}td.large-11.last,th.large-11.last{padding-right:16px}.collapse>tbody>tr>td.large-11,.collapse>tbody>tr>th.large-11{padding-right:0;padding-left:0;width:531.66667px}.collapse td.large-11.first,.collapse td.large-11.last,.collapse th.large-11.first,.collapse th.large-11.last{width:539.66667px}td.large-11 center,th.large-11 center{min-width:483.66667px}.body .columns td.large-11,.body .columns th.large-11,.body .column td.large-11,.body .column th.large-11{width:91.66667%}td.large-12,th.large-12{width:564px;padding-left:8px;padding-right:8px}td.large-12.first,th.large-12.first{padding-left:16px}td.large-12.last,th.large-12.last{padding-right:16px}.collapse>tbody>tr>td.large-12,.collapse>tbody>tr>th.large-12{padding-right:0;padding-left:0;width:580px}.collapse td.large-12.first,.collapse td.large-12.last,.collapse th.large-12.first,.collapse th.large-12.last{width:588px}td.large-12 center,th.large-12 center{min-width:532px}.body .columns td.large-12,.body .columns th.large-12,.body .column td.large-12,.body .column th.large-12{width:100%}td.large-offset-1,td.large-offset-1.first,td.large-offset-1.last,th.large-offset-1,th.large-offset-1.first,th.large-offset-1.last{padding-left:64.33333px}td.large-offset-2,td.large-offset-2.first,td.large-offset-2.last,th.large-offset-2,th.large-offset-2.first,th.large-offset-2.last{padding-left:112.66667px}td.large-offset-3,td.large-offset-3.first,td.large-offset-3.last,th.large-offset-3,th.large-offset-3.first,th.large-offset-3.last{padding-left:161px}td.large-offset-4,td.large-offset-4.first,td.large-offset-4.last,th.large-offset-4,th.large-offset-4.first,th.large-offset-4.last{padding-left:209.33333px}td.large-offset-5,td.large-offset-5.first,td.large-offset-5.last,th.large-offset-5,th.large-offset-5.first,th.large-offset-5.last{padding-left:257.66667px}td.large-offset-6,td.large-offset-6.first,td.large-offset-6.last,th.large-offset-6,th.large-offset-6.first,th.large-offset-6.last{padding-left:306px}td.large-offset-7,td.large-offset-7.first,td.large-offset-7.last,th.large-offset-7,th.large-offset-7.first,th.large-offset-7.last{padding-left:354.33333px}td.large-offset-8,td.large-offset-8.first,td.large-offset-8.last,th.large-offset-8,th.large-offset-8.first,th.large-offset-8.last{padding-left:402.66667px}td.large-offset-9,td.large-offset-9.first,td.large-offset-9.last,th.large-offset-9,th.large-offset-9.first,th.large-offset-9.last{padding-left:451px}td.large-offset-10,td.large-offset-10.first,td.large-offset-10.last,th.large-offset-10,th.large-offset-10.first,th.large-offset-10.last{padding-left:499.33333px}td.large-offset-11,td.large-offset-11.first,td.large-offset-11.last,th.large-offset-11,th.large-offset-11.first,th.large-offset-11.last{padding-left:547.66667px}td.expander,th.expander{visibility:hidden;width:0;padding:0!important}table.container.radius{border-radius:0;border-collapse:separate}.block-grid{width:100%;max-width:580px}.block-grid td{display:inline-block;padding:8px}.up-2 td{width:274px!important}.up-3 td{width:177px!important}.up-4 td{width:129px!important}.up-5 td{width:100px!important}.up-6 td{width:80px!important}.up-7 td{width:66px!important}.up-8 td{width:56px!important}h1.text-center,h2.text-center,h3.text-center,h4.text-center,h5.text-center,h6.text-center,p.text-center,span.text-center,table.text-center,td.text-center,th.text-center{text-align:center}h1.text-left,h2.text-left,h3.text-left,h4.text-left,h5.text-left,h6.text-left,p.text-left,span.text-left,table.text-left,td.text-left,th.text-left{text-align:left}h1.text-right,h2.text-right,h3.text-right,h4.text-right,h5.text-right,h6.text-right,p.text-right,span.text-right,table.text-right,td.text-right,th.text-right{text-align:right}span.text-center{display:block;width:100%;text-align:center}@media only screen and (max-width:596px){.small-float-center{margin:0 auto!important;float:none!important}.small-float-center,.small-text-center{text-align:center!important}.small-text-left{text-align:left!important}.small-text-right{text-align:right!important}}img.float-left{float:left;text-align:left}img.float-right{float:right;text-align:right}img.float-center,img.text-center,table.float-center,td.float-center,th.float-center{margin:0 auto;Margin:0 auto;float:none;text-align:center}.hide-for-large{display:none!important;mso-hide:all;overflow:hidden;max-height:0;font-size:0;width:0;line-height:0}@media only screen and (max-width:596px){.hide-for-large{display:block!important;width:auto!important;overflow:visible!important;max-height:none!important;font-size:inherit!important;line-height:inherit!important}}table.body table.container .hide-for-large *{mso-hide:all}@media only screen and (max-width:596px){table.body table.container .hide-for-large,table.body table.container .row.hide-for-large{display:table!important;width:100%!important}}@media only screen and (max-width:596px){table.body table.container .callout-inner.hide-for-large{display:table-cell!important;width:100%!important}}@media only screen and (max-width:596px){table.body table.container .show-for-large{display:none!important;width:0;mso-hide:all;overflow:hidden}}a,body,h1,h2,h3,h4,h5,h6,p,table.body,td,th{color:#0a0a0a;font-family:Helvetica,Arial,sans-serif;font-weight:400;padding:0;margin:0;Margin:0;text-align:left;line-height:1.3}h1,h2,h3,h4,h5,h6{color:inherit;word-wrap:normal;font-family:Helvetica,Arial,sans-serif;font-weight:400;margin-bottom:10px;Margin-bottom:10px}h1{font-size:34px}h2{font-size:30px}h3{font-size:28px}h4{font-size:24px}h5{font-size:20px}h6{font-size:18px}body,p,table.body,td,th{font-size:16px;line-height:1.3}p{margin-bottom:10px;Margin-bottom:10px}p.lead{font-size:20px;line-height:1.6}p.subheader{margin-top:4px;margin-bottom:8px;Margin-top:4px;Margin-bottom:8px;font-weight:400;line-height:1.4;color:#8a8a8a}small{font-size:80%;color:#cacaca}a{color:#2199e8;text-decoration:none}a:active,a:hover{color:#147dc2}a:visited,h1 a,h1 a:visited,h2 a,h2 a:visited,h3 a,h3 a:visited,h4 a,h4 a:visited,h5 a,h5 a:visited,h6 a,h6 a:visited{color:#2199e8}pre{background:#f3f3f3;margin:30px 0;Margin:30px 0}pre code{color:#cacaca}pre code span.callout{color:#8a8a8a;font-weight:700}pre code span.callout-strong{color:#ff6908;font-weight:700}table.hr{width:100%}table.hr th{height:0;max-width:580px;border-top:0;border-right:0;border-bottom:1px solid #0a0a0a;border-left:0;margin:20px auto;Margin:20px auto;clear:both}.stat{font-size:40px;line-height:1}p+.stat{margin-top:-16px;Margin-top:-16px}span.preheader{display:none!important;visibility:hidden;mso-hide:all!important;font-size:1px;color:#f3f3f3;line-height:1px;max-height:0;max-width:0;opacity:0;overflow:hidden}table.button{width:auto;margin:0 0 16px;Margin:0 0 16px 0}table.button table td{text-align:left;color:#fefefe;background:#2199e8;border:2px solid #2199e8}table.button table td a{font-family:Helvetica,Arial,sans-serif;font-size:16px;font-weight:700;color:#fefefe;text-decoration:none;display:inline-block;padding:8px 16px;border:0 solid #2199e8;border-radius:3px}table.button.radius table td{border-radius:3px;border:none}table.button.rounded table td{border-radius:500px;border:none}table.button.large:active table tr td a,table.button.large:hover table tr td a,table.button.large table tr td a:visited,table.button.small:active table tr td a,table.button.small:hover table tr td a,table.button.small table tr td a:visited,table.button.tiny:active table tr td a,table.button.tiny:hover table tr td a,table.button.tiny table tr td a:visited,table.button:active table tr td a,table.button:hover table tr td a,table.button table tr td a:visited{color:#fefefe}table.button.tiny table a,table.button.tiny table td{padding:4px 8px}table.button.tiny table a{font-size:10px;font-weight:400}table.button.small table a,table.button.small table td{padding:5px 10px;font-size:12px}table.button.large table a{padding:10px 20px;font-size:20px}table.button.expand,table.button.expanded{width:100%!important}table.button.expanded table,table.button.expand table{width:100%}table.button.expanded table a,table.button.expand table a{text-align:center;width:100%;padding-left:0;padding-right:0}table.button.expand center,table.button.expanded center{min-width:0}table.button:active table td,table.button:hover table td,table.button:visited table td{background:#147dc2;color:#fefefe}table.button:active table a,table.button:hover table a,table.button:visited table a{border:0 solid #147dc2}table.button.secondary table td{background:#777}table.button.secondary table a,table.button.secondary table td{color:#fefefe;border:0 solid #777}table.button.secondary:hover table td{background:#919191;color:#fefefe}table.button.secondary:hover table a{border:0 solid #919191}table.button.secondary:active table td a,table.button.secondary:hover table td a,table.button.secondary table td a:visited{color:#fefefe}table.button.success table td{background:#3adb76;border:0 solid #3adb76}table.button.success table a{border:0 solid #3adb76}table.button.success:hover table td{background:#23bf5d}table.button.success:hover table a{border:0 solid #23bf5d}table.button.alert table td{background:#ec5840;border:0 solid #ec5840}table.button.alert table a{border:0 solid #ec5840}table.button.alert:hover table td{background:#e23317}table.button.alert:hover table a{border:0 solid #e23317}table.button.warning table td{background:#ffae00;border:0 solid #ffae00}table.button.warning table a{border:0 solid #ffae00}table.button.warning:hover table td{background:#cc8b00}table.button.warning:hover table a{border:0 solid #cc8b00}table.callout{margin-bottom:16px;Margin-bottom:16px}th.callout-inner{width:100%;border:1px solid #cbcbcb;padding:10px;background:#fefefe}th.callout-inner.primary{background:#def0fc;border:1px solid #444;color:#0a0a0a}th.callout-inner.secondary{background:#ebebeb;border:1px solid #444;color:#0a0a0a}th.callout-inner.success{background:#e1faea;border:1px solid #1b9448;color:#fefefe}th.callout-inner.warning{background:#fff3d9;border:1px solid #996800;color:#fefefe}th.callout-inner.alert{background:#fce6e2;border:1px solid #b42912;color:#fefefe}.thumbnail{border:4px solid #fefefe;box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;max-width:100%;transition:box-shadow .2s ease-out;border-radius:3px;margin-bottom:16px}.thumbnail:focus,.thumbnail:hover{box-shadow:0 0 6px 1px rgba(33,153,232,.5)}table.menu{width:580px}table.menu td.menu-item,table.menu th.menu-item{padding:10px;padding-right:10px}table.menu td.menu-item a,table.menu th.menu-item a{color:#2199e8}table.menu.vertical td.menu-item,table.menu.vertical th.menu-item{padding:10px;padding-right:0;display:block}table.menu.vertical td.menu-item a,table.menu.vertical th.menu-item a{width:100%}table.menu.vertical td.menu-item table.menu.vertical td.menu-item,table.menu.vertical td.menu-item table.menu.vertical th.menu-item,table.menu.vertical th.menu-item table.menu.vertical td.menu-item,table.menu.vertical th.menu-item table.menu.vertical th.menu-item{padding-left:10px}table.menu.text-center a{text-align:center}.menu[align=center]{width:auto!important}body.outlook p{display:inline!important}@media only screen and (max-width:596px){table.body img{width:auto;height:auto}table.body center{min-width:0!important}table.body .container{width:95%!important}table.body .column,table.body .columns{height:auto!important;box-sizing:border-box;padding-left:16px!important;padding-right:16px!important}table.body .collapse .column,table.body .collapse .columns,table.body .column .column,table.body .column .columns,table.body .columns .column,table.body .columns .columns{padding-left:0!important;padding-right:0!important}td.small-1,th.small-1{display:inline-block!important;width:8.33333%!important}td.small-2,th.small-2{display:inline-block!important;width:16.66667%!important}td.small-3,th.small-3{display:inline-block!important;width:25%!important}td.small-4,th.small-4{display:inline-block!important;width:33.33333%!important}td.small-5,th.small-5{display:inline-block!important;width:41.66667%!important}td.small-6,th.small-6{display:inline-block!important;width:50%!important}td.small-7,th.small-7{display:inline-block!important;width:58.33333%!important}td.small-8,th.small-8{display:inline-block!important;width:66.66667%!important}td.small-9,th.small-9{display:inline-block!important;width:75%!important}td.small-10,th.small-10{display:inline-block!important;width:83.33333%!important}td.small-11,th.small-11{display:inline-block!important;width:91.66667%!important}td.small-12,th.small-12{display:inline-block!important;width:100%!important}.columns td.small-12,.columns th.small-12,.column td.small-12,.column th.small-12{display:block!important;width:100%!important}table.body td.small-offset-1,table.body th.small-offset-1{margin-left:8.33333%!important;Margin-left:8.33333%!important}table.body td.small-offset-2,table.body th.small-offset-2{margin-left:16.66667%!important;Margin-left:16.66667%!important}table.body td.small-offset-3,table.body th.small-offset-3{margin-left:25%!important;Margin-left:25%!important}table.body td.small-offset-4,table.body th.small-offset-4{margin-left:33.33333%!important;Margin-left:33.33333%!important}table.body td.small-offset-5,table.body th.small-offset-5{margin-left:41.66667%!important;Margin-left:41.66667%!important}table.body td.small-offset-6,table.body th.small-offset-6{margin-left:50%!important;Margin-left:50%!important}table.body td.small-offset-7,table.body th.small-offset-7{margin-left:58.33333%!important;Margin-left:58.33333%!important}table.body td.small-offset-8,table.body th.small-offset-8{margin-left:66.66667%!important;Margin-left:66.66667%!important}table.body td.small-offset-9,table.body th.small-offset-9{margin-left:75%!important;Margin-left:75%!important}table.body td.small-offset-10,table.body th.small-offset-10{margin-left:83.33333%!important;Margin-left:83.33333%!important}table.body td.small-offset-11,table.body th.small-offset-11{margin-left:91.66667%!important;Margin-left:91.66667%!important}table.body table.columns td.expander,table.body table.columns th.expander{display:none!important}table.body .right-text-pad,table.body .text-pad-right{padding-left:10px!important}table.body .left-text-pad,table.body .text-pad-left{padding-right:10px!important}table.menu{width:100%!important}table.menu td,table.menu th{width:auto!important;display:inline-block!important}table.menu.small-vertical td,table.menu.small-vertical th,table.menu.vertical td,table.menu.vertical th{display:block!important}table.menu[align=center]{width:auto!important}table.button.small-expand,table.button.small-expanded{width:100%!important}table.button.small-expanded table,table.button.small-expand table{width:100%}table.button.small-expanded table a,table.button.small-expand table a{text-align:center!important;width:100%!important;padding-left:0!important;padding-right:0!important}table.button.small-expand center,table.button.small-expanded center{min-width:0}} \ No newline at end of file diff --git a/vendor/assets/foundation-emails/docs/assets/img/campaign-monitor-css-guide.jpg b/vendor/assets/foundation-emails/docs/assets/img/campaign-monitor-css-guide.jpg deleted file mode 100644 index dcdad184716c5fc5655b3331d0c3d503d067d968..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 344129 zcmeEu2Ur!!vhbX9$T@)fn-sVLx;xS6BAlyL<2Z|M&j4?RREss;jE2d%CNust1n-jy?c5G7{1f00aU7q`-f`(MO;~ z+|Aqs0OaKXdH?`W0AvUr00SWi_z!@P0Eovh02n|>zrz-gi(hG=APpM;UIAS2=Kx_p zh6zCUZh$#}@Rc_fyu%CFB3$apUCG?d*veYp$<~45GV^6-HUMB}W#i;yW#?n#rC{TL z13VxS_5|{qK2Ml@h`7&9B%TC=$6+p(}Q zv$6mJ!ftl@hL*-o6b8no<~D*PR2rP}tnzlE#%AVH9uCH;9tzhCJuD4* zji`i$C*;$$gEbzNSGLe$p5n1Yj; zgPD~Ig=-`_P` zTPs1T-@i||?nZ`uj?M-a#)eK`hvKTfDGLa){8YgL@6r!lgcHC~;JCrT?=L`z;_veJ z2>d+)e~-Z5Bk=bK{5=By`$ph57tYuQ^xIrP2Mst{0(g|nY@KW!&1~&JSCSRrxhgG> z0QWt?atvQM265h#g$#xR1qgF~sIiMXSAC8?kzSM*71dKxQIwFD69?U503bc9Z)ax( z#Q^|o8z%=9$*UCCHMJ;^$3ef993TLw0X%&}N4qOZN^-|CPrYpQ9ecSz4-;J0sU&}l z#5DqaJSPCpH$a%c0aOqGkWk>T=?Q!e z4jY`ntj9FhR761GdNzy zg$lf4m^nzPfOi6L++JAP%EDm`5U#W_P*4P6JP>|s4)*9PJY?o9r3S)q`b9%WQE)5) zLI4b7jP%81K^PoMD50~Z+Lf;`yS@Vm9n(V<%$=mKeT5AiY*oI>hq@R$imQTnuq~*I znXxo{uE1s9x3Ns`#%6+jpZgx@(@s={@E^Nx9# ziNf*6G!D)xaGhyD{Dz5x1iX(R4eYG7BM2S03u89aKi1(ah!=4(y9STFKwj8&W5?@o z9gcM~G8PjDVNeH{k+F^1SDj(t?79k<3Fq~7+&i z&<7jbSe171}D4`2zf0cjk+^IbizH3nQj{NZ=(2`>|1a$M_j%wY*k zgDqGikRS*l@FU29R}t{Xj=+P!`;CtR`DLr`lg@aF)S|BCyK z6LA``3-J?TFX9KpK|mJdFb4bV0A6jr_e>p_JeKmcr+VhM9lmMsU9vpz0pvRw6=QJ3 zY=F6MGzhey)|?1e5d=Z~LERAu5l8?g1P-t#R}h53zHx%sZ=(m-+WET{zm4U$asNgK z*N@_dK7Pex(PMFb)xzMr{-WPU;`dU1t1$3d)GK@402_-KP`!O7Uo37mg` zsI8s5gSn}h6U7zKA{$dk+ZZx4Qo!R{0D#+fI1K=-s~p>H2w~@MIDIQ{4`BxYw5z}2 zY(bll8wF15$G_od!L>=u3jhTwhRzNyC-M;BH$(spzy?)KHKOh2# z12TXja1GD|Zh)h123Uhyy8>RoEx;cL1|9%WKpc<^qyjI19H0Ow0V;vlKqJr!yaRfH zVQ_9t0Smw?um$Xc=^SJTCIlZs3^@_`L%JY?kdKf#$Y;nN6b8kB5 zLp`8(p<&QiXbLnNS`2*+ZH4wiKR_3tn=k-|4kLt7!kAz@Fj1HyObccLbAb84f?(0G z6j&~-9DLV3un(|B*e(JR0zLu-0uwktr4ZB*3=!-Rd=Nqq;t*aS6eH9l^dNjhSVj1P zh>3U(kpYnpQ5x|&qA8*)qCa9ZVj5x*VgtCMrVzJ~kdO$G=#aRO3RxwsL)-pCK_66)K*f+2}u%odHu{*IB zaZqt+aYS+SaeQ#%amsM|aW--BaoKPcajkJfa5Hh6acA+6@o4eH@r>~9;-%u%;Z5Mf z@Tu`d@eT3s;6KA}z@H*OBA_FXCa@p~CdeV^AXq(vcZTDP`Wd$~@n@>ed?17o(h^D& zS`mg577+Fk?h%m@T_G|i3M9%U>L%JgOL|u1tnt~Pvw3HG&+ZXZ5Q`IA5=Ri15RZ}| zkkFGTlem&3ku;Djk`j>elNyo+krt2+or9jEKc{le^IYn=wsV_gc|$! z3CTssEyyFutI6liGr=p`$ zqqR@~M$JQQLLEu{hI*CeJdHe!7flw;&;`^BJQvI^#9U~)uuV%xt3ew;TS7Za zca~0?&Vw$CZsa27Md6F~7gH|2zl3y&=aS{6#7pn!q4b>eX7us&oeWS0E(UXkM20R# zL`Ggl8^#pIekKg2D@-m-Sxg_937O@XZ!?!LFSF3FXt6}FG_ibPhQ}tu zcAKr7?K3+)yCHi#`}@n7mnAOyUM{`7#=*d0%#p+~z=_W(&l$k^hVzh%o6CVKmurrj zhWjRW0(U zwPG+aNwFZY4skqjHSsv{F$pROQ;95zRY^`sPsv&-L@8OR2&sN)GHFBU4Cz%FZW(Wx zdRYuvRoOV%Pjd8f4szx4PI7Zhw1N)!P_X~jp1qe^s2_DU7XNXkme@ygRG zY${$VO{(~+da9YKTi32$3%@q3c2Uh)?TtFNx{i8=`nHCc#zTz{*IBN6UvJeU(KOdA z)k4-%*Gkjc)E3u{(w@@c)bZEp)1}jO(`~*%a>MFIl^(X9zFy%?#G4v7GjAT~E9$4{ zZyHD&Bp9q3iW^CxWM;=Nm6duUlRp zy{~vb^?~>p_`LC@_Py&nUn5PWfH3yMA{k?n&Ou^2hRb z@b3@c4@ka`aNqoXN8sha$AMphjDlK%S%ag44?+w>T0+@EV?&R^Ou{ieN6NC!Q+ECv$)>) ztMPdW=Mn-FwiAsKyOTtca+ArDgOm53m_HeKD*3cHg*GKR6)Dvvb^4k5v!>@f&ok0U z(t^_t({0i}yij>jpTV7xk$EmNJPVrToHduNll?A7ET=S=Dfej}VP5b{;HC4+`TU#t zeFd@wZwh$|b6;I}l~9CV6jTf;b}wEnF)R5{s#)4qCR6sNoWH!Ng1I8SlCmP%I5 zHCpxE>Z2Nun$23f+QrwVuP5H~<_Ob1g>Zjoe!-<7S z$H{}KyVID{(KF{~GG^IlE9WHU-py;zPc7Ij>@WH+;VvaCUtE5*BC^u9dVO_j&0+26 zbI3aJdin;(#+yy0&9N=(t^Mtw9parAyF9y1dm4K)`>qGb2eF5j4$HsDei=EkK030~ zchEof1>h$XP!sT+<#Rd!U}^#Y{yWg8z&eS)jwwKQ83NLPusVbpvH-1z-9b=A6hWdx zCP6uidLB&>T>--q^8r>F_98A5o-uwZ!2}^ak^9*i5^Pe9bI-`u&kIo8rEI6hrBS&M zO51u7xOAD`gdv8pg=w4RBC9f+AA8p2UQQ?%8@Db`5N|QxM*&Ph9-*7Ufg<@=MnqA> zxWo-59!Qo-jmbb{Y2+m3Efm5PUnvbJ@2C=9yR4?DZmkh|Jy)|;>!bFn&bIEp9&i&) zpV)xO@QRU&v7U*sslJ)2xqt)5dP;i#-%A$9KAMj9;r%nSOAtC>1kuGx_} z1-V^$Yx%eZmkU*2ITk%A&L}A_eO*>pURzO7SyYu*ol%oooA^5FO;DXzy+wm+BUjVe zrroz6nmbz>TkG0hw^w%Lb;iDP>=Nz9?C$A_e{a&u*@xKI-~VF3Wl&@YX{ZUDUz{T| zqY-2LV-w?{ANW5kd`$kNG69>&n^c?Jor;`hoUWNsnVFouH^(wJIsan8X7Tdk=2G6W z;R^0b(W=tw^qSXaqR)-%;Ttxa`dcR8Jeu5VIAlILI)4Auke5&k7&~khAs^8X={m9? z3KJ?F8XY>jt_1!UN!#Q85}|$BK@=XiC>Y7okJ(POs;+2kK!q14b?F9 z<^^=x^K_gSr7zv2cV~FSn9tP4Jj;r}M#(O4S&PGoGnnfccNtGR?t`BMLlL5pF7QIT>v)@R+uL>y_BswC zj^`csoqC;fT>M=P+{E2kJ!m}1yokNe_~7^=`EL1ry47+!|4!6h*L%ADG67=uPdx`iA@d3#!Y4^Em zvRv}i^YIkXl#x{7)c!Os7xZbx=_u%SF1B4trgvnJVx(k(GR-mfv%F<3XUk-dz3j(v zlarSViK~-4isw2nG4CK>BEOLUyC9O_m{75BxQN*mv8%MAIAVaIhN(8Do}=M)T}Jba=D5}iZCh~v-_@48~|xu1oIC16==b<0}R2EnGm_MY7pyB+&1 z2TgF#&Tvw6+Hj6_5pWrE^>ZV0t8%~TLFh5$ndNoI`?}9XpDo`yzel%BZ;RcbzkBu` zx~1b4m&P&YQKx=8tY+yAKJUz zuR2gRL^&Ka$}*1i(RDI-)_qCg^VY61{QaNg;oy4$5*GkG0^>~eQ1CYg01+hsKwAL- zL}&n@gb4uGcmZfYE&!Fx1t6C9zV9Cp@LU`Pj5!H`^S~v51B^7~04*?bb^`*zh%y_f z2D-sK$N>ZoatR^=#)poOP%s{BfJ{IkP)g`ks1Y;(jPkmndoXI4Jj?_30@ja!g20Dh zjgX2kh=_+M3r1vhNDw3uBtN7#$cV@?$PbVQP$*HXP|8q|Q8iFspzfi`qdi62Mpr<8 zfq{TwfKi8e0W%PD8S5HWB^c>M-~c%GIFq=VxSeGi5x!V-6g!0?9adk>lW|!(QeRQ>HhnJ zio?_|c1PUD_5*U9bHD>g0a`HEAPmR@I$&`u^mq&?jEGDq%vdaVthj6_Y`g5Um-{(dIA3$U=5FB` z=Kai%CBQ1EEMzY1B;s(z?CNz(OWq>AE7mf)TisTy-F zN-a|TiAK%!H7!nUKb`g)n|B~` zlyGu!PInn{!*Q4Q2=^TDruFgmow#Ls2j^~!zterBz<^+cko#ez;dK$WA6<_Ujp2XH zAJ3o2n|$dhLQ3N^mo(D!stkjyGuflL4KF(jHjCIwyvkZDv8%;u9p0qX&oy0bE@)%x zNO(8ez43mnZ)RX(Xm(^{9P$xuf?$efMrtm4k$WX*J#E`+w`2eALEYiTm)+y{4+U30 zE|_g%0)zl%F#qWdL<28@Heeot3g(97Ar6pONG)U@N(dE$IziK*Loi&JH0&;{7Ip|` zW;_te5e^WqAO<1!BV9teg*1vRgq(tcf?|vE9+ek05e*9FLVD4~&?_)_F^`EBZTfm)`{G?&ehr7$aC4}nVZcyIhI9viyq$F|SaH zyo(P?1IuYE-c{YM;i{c`lTfeNh|pBg?AXfCHrbK%?s_*tPj_#4zs$hVQ1*!8=^|Ct*{!XP~op<`EWr7nheMR@_$;*Frx#uZyj3Z)9#NYz}XkZEbD4Y|riJ>~!vm z?q=;_?%C~i?{n_Q?ynt4AEX@YA6`4m`2zcL{Y&-{M@Rc9M@NULV6ZU)0JT;pXFG6WB=8I%VH^&%(6?{G??0BKVKA!- zrWyaO0vGac34k*ny#a7hU@!z<7z7u9;zD4!kfVBVvV)(iA;RmwYmEYhAtE6oKv2=Z zdNQyA3Wfbp4M1Q}1SDh>MAV}p00RuYpg1sa2p|XPd&vUdh5Q)+dSgP!gR#rDHBq55 zDB;y^N%DkV5Zx$`6WUVPp#DrJC|$}czyC!|nqfG!nww#^>lOF2v|jQY_jOagEy8|d zPK{_50|CBbJNX#b;Z2T}tG;_V}hdl6g%nQR)T*GAj@8 zR&e=fW!3fDUesJG_v7Nvij33NLgQ_0SL=_tJ!B-$U&JuQMuyJi5bXX%&49W86VH-% z%L5v##(eoi62^~Q3oGk-^mVTMCe`X?`NZq841nvbh139Bp-6MJ1}Vps4SU}fXI5Xy z4b3*2XILfp#fH(`q#Wp++x+wG2Zz}{F3O1>-m#985K4!pI^8%U8N1UU#xy zVt$;p$)&6PDWHERp4`8atd++(KO5m`=MCka4L+ancd2t;vb~FMst?5z47x`t^0`zn(m$H|H5 z4+{cYOCa!vM-W8RG>m9sv{G#L`-aEZXN0dRuv}Ppzba-l0AigjN0hsHsh@k zAh&dI=ve@+`p@V3Ut|rGnP@Arzx^)WPRF5P#bU3>_PuqMM<=#V)lU3ue|}+#m~)HG zF%c32qm`T~YugEjK|y1Eqa#Kw{0Y*|=U+NJS#EPZUij&-2#7%u-yO_w7>pQuS@C>p z(+@mbU5Ua;UGLNw-k{akw=}ex-UX?|lg}>9kFbyj47tDU)EGNW5adoL`Wml}14s=M z6X()j$ZeCjZtX5Xhmoxy#GBZ3uAqwotOGMma@acXL*Ji3P8-q?jWw5Q+XrpM+l27G zLg{x3_2fUCl@+$LS`uib0049jF}XFQ>WT*Y*s<-Qmcz#&)rT*Z>7h=TD(LUIovYVg zfo-dQEN$>5vYg($%5$`=THA zt27DN%gW2OOb%37Cp(zTmXqN@7` zw!PuAo!mTJ4*oj65&%q3j^7UM0`dE5|D?L-C25+9V%3>NjCCC|tV8d%8daDp%ktvN zwgOCe&J81$f8H)B{i6EN%nv-qCwJ3~Zn$w1lm_a6oJ44xuK}Oc0KjW1r%`{frk+=4 zpKt^`BfSaYFkG&GSZ}hG!7yw#&vLp<7 zmRH)0Fakz<%6ur`R6mtJV@cqQ*bk7KP7hYV7+(i5H;${(7-Tn zwFo#l6v}fN<3RwKW1eKf_TgNafz_7)Ymgs6!WLkupR$LW08Cth!GPQfHe&svDT1D) zbQkhA$0pOTg}bw4bgiry)@^%f{M@Do*sgsWrXx!!* zPa?)v^Jz^u9k?ZjRn)J|=~kG+*9|61-pjRFK4dfaD6u7z^Ny>1?BVwnzOm>B0A2x{ z^YmNHn$bON1z1ugFV0zh8Trq>R-N0~UYIDpKkAmBZ}t z-UsmQ#W0$bkvFGwv(j`tO!F<+AiVsx;7>CZpvn4+M&{i4cBi%6TbWlp{Fh6{xcmUX zVubr_-lrw6amvTm%S@m~020H5nBp3FO^gh!V)d4-9tDW|ONEg3gzaSa`Ax((%L2!o zSe%nB>_-~}01Wr){ooXTxapK|*8soF(-r(N37D@Hw^fUICK_`)IDiL{{gl-@htXQp%g z7>UF(AttbDQ!r_>j$;q zXNoaFoCh9k1)oQrrRTDMG*gLedid)NS~ZxBj$a;F`++Eq4#-`z&tzw@F5_!#P+MNw zI@x*x;3DA#ORpzt;){;+m#q@`0t5@MuYyMSu6_Uh(D?Bh1eo4``r?yiH9hEr^{(xh z1iZjvHm2N;fEY60s+@faa9KMB8Mf@HgC_&(Q`IAW0HB@GaB!$T*k158B!NxxB8&At z*n9MzKdcrM@R!Pe#ydK08YaGXVAx=jC%NNQf1-=Iw|7AJm3RE2$FJiTTLi8tGS|R~ z?h2Pq__&bh>FH0r`#L0sLIRG}S#@bHUwo?IM(+0>*101fYjw-EMBz1j0I^s?=CwI? zUltPQXOt=z&KKvdWW7Amfh}fEL}>bRdS*ph`n5et``v`Q#}%hWQ{czDJufUnt7X%s z0t@%Zz^Db>yYv#{VwfJ2Eufd{*s02sRDQoL?g=s=Q#%jWNjG z!fm9E6U%=JCl>Z}xm&+TFGZE8tM&@1$nnndyI>D?W-SHoW3)cUrvrnQyyFH>bop~v zbo>+gAH69!=ESm{)cqKt{b=z3;LMv(A}2I|_S(?q#+InkQm~%1a^tHAG`h0^gGs(? z+Bqy9o$rM9T>RidA>wA~pAv1!gVgu+3`aLkOyX<%N(0~fo7-dU9a0`0s~{PI`R5BH zuFyAXo~nlY&Fmm1<(2B1LP@wdgLhv3@*aqRG?kO*lFpDk)624%BP+ZK?iJ{v6Zi*` zdDUAs4x)Xoejt~CFdvoaea`js9>&~-#SAY&6m@-3eCD=1@1>!L@^0`MUg{TTMQ%)f z&Xoym4(pMK2HV~V1qV-K}Q?Ax0F8((`8n`oJ;YCN@HA`xv1wNmvNoQy}C|x*QvW2gC%LG+& zjqai?^1TwKtx3>h9aUhNnJ@0JjuBZp&YGO3e9K3h9q>Ns>B!d)XhE(&TmJJC6Y_j> zi(C--tCGLuiXd5bBhF)V;WA6ZLU0@Kqm_h&?5uU{4d#vvd$sooq+{^VOdn;!e4L!##8BTUs08G!Z=`{@PR*SL^ zk7!eXOek5O+P%5`^cfFd7rt6&^aKC)>|= zUi{=`rmBVlcDMlNO&Xo%nSrzG*K8DS`rAnJ5p-0w zCHasQ8gP0-gSr$O_{IbYa<;0QDrP|pGWo1WscnKqgilVzGnaNh(34{34gp=^>ixm8 zW^BzdxaO+|v+&Tp&3i6#tYaXz7DRj#o zO@(I9nKfYnwXD?G=@(;Zdn>1OFMkKF+nZ>>2WP z{lG^d>Uk0H_Vhe>`BnxPN`!UqNDlM|$4)Jb^o^MnM)vqL6iIlVtJE6Yv(EF(9doXE z{=|G~naI+_a^Q16`O^Kl-eNC@Zvy_cyD387`umNaI~roX6vd0vwdpLjT< zsKRURO}@G9!^O;Am|hrCp{f~rFrDD28$##PQF5~vzCZkl^1ZD;!SkIIW6H&p;iaW| zuk{%s{A)}tL-fqFFSMgxUDJ_QDq%2tQ5yHuM!iefp7ZKRPD;uri+g3-;^Ota=nlm} z!GW2CQ~zz)ZX7tY>YrHK@16V0z`v2C_^nM?@}>`Y`_|k5uOGN#UfZ{xsmKY=%}ydE z%O5vr!I5aS1`m41ttiErJT^h_!C?A?`AxKzQsBg{~H5v z6O5GphV6d!*}e^HTHBhf0%3I#5O+TaOhzf*N^+qeOy!%P0Lj4eUzLLRp67%$u-R?Y z`+-fd>5))@&gen8GCLS~d+dU!zgF^DkNJMul;D^jGoL5fh!b!91phTZ0ns@=ulNfs zV{kN{XLJ~7-$_UjIbr{ngZ!7X3?yEG5{b1hqi(z(==dz>2mXO+4#9zH&P12YxaFc} zbqI*DUk=Ff-)+nwnjbEgv;sE@$n6QY`Xc~$VWlcQ;lXC&2e55y?2h}7KVf<`jXjoM zTnbtQQCP^2Bnv_m8eau;jnA5c2zdE>V*Cev$&yF2txN_B0RyVUlE&Myee{?XFjktB-)8w}+Z=|WgXQ#*Ef8@^@-yhh#s0O~#@1Gche@UIOss`^e?lE&7%yA^QiTc8 z({Cq&aKsPgm!pth@{8c!Op=V+^vVNiINA^N`&s5%){X#Xz9Ya>drJhIrZWUhQ5!kl z0o6IJ-eo_C{;S}B>rnipQ@?XqKDFzaDvlDmGbFn-;PI=P9y`+@<$s~Sf@|8yw^xGR z^mHr9;d1Y`AGr8!+SqrDm*9tbfQ1+J+2D_%wi4YY`$vE!^`;SsG;63_?OnGf=%5|p zOH>Cr;N`!{aryP^1e>6tt_Kg^=Ku6CoA+L?O|Pb(!iT0VVt9YR^7Z%>gnr2bg1DQd zV{F3p9-u*;p%FB712JD+o?p*p&v`zb|5$CGDZW>{95KvwDl@EZJ%!fojvm`~nyM$i z0epLa-C3HS_lVa@YgdIn-u`$KM8V6=^*3$B^zgk1ET^2df=8hpv3Y^JpK|p4C%|J; zDXvzS}&HNR7h)c?(38dT>0Q3MTs{K^ z6c_!tD4nl((jUkUez%-F#BHP`Z8&zz8Toz8!9pEEPU~zj-&)(EV3)p*dVK7S$VJo# zM?j8_Z+)Zl;V8}821ccwp3}X__Of!m`H!Q5oEKV?JW_1p1Dh1b7?&0CI(+km<~=)j zhyt`*1{a-36%VwdH=g%%U+86rh8C4CuT)Gv;~QEtn2LJtEKQPyH!;oCwNNHo_UJ}P z<%p`4vp`O#ZO5Q370=q{{u*MkOF6I@{I0X~)pG8238&t6HgoO;%g3X!bver=3hDYI z!|Qs}$#2Pk>rYjzOSte~D)X zzg~{%@xi-_P zgo&w_++^CFy|TDWU#>(y4SvZy$3D{c>|R#qfzGI=>(JXi=aIpMFWJ?xs8x@giA6V! zC;06|w7X+CR`#sgU1Q6=DlxaU^g{I1jK-XVZ_URi*;M2XdYa4QAYmUk_3LXzA3p0W zTpDayu5Kx0Y;7&sw`eZSwy9YnH8`KOwESsd;0rVJa$yZo(suq45am9m>(<*_HA>j@ zLF&N$!N!&9qUDZCPgm!IrAmeI{Bt9ip5$E^H~H0@j0K0boh!UcF0AMe1u^d|#48t~ zS2q+V@Rt%7EyQZicO%rd51VNx>XBYHjq6+tP8zqr+2t@CId}xD^_GZvCwpo-s$;7X zQXRZxq7xW*N!|C6EL?02Y-_T)PJ}=fL1!U#eJwG#{|H#>61-z6I{MB#3T8dRoc1BM z>D6+uWBe2EGSgnYhvoCS*?M*&Z#wF?!Zn+uTU>PSh;eSxw3uuj0bFu-c!FD8ONSaH z8@DFaY%P~aFH|;UjJOmU4-&n?$lhGwzPS}ey@W!voL5pTHm+Y;^OT{YeMr3({YL%L zKpE13i(sg3#|^g^HPe@R)7`IQv-nh$8uBc8GSwF{cNbnK3oz4EDs(MsFwuLpHbm&; zJuqC5(`wTFaOrG7yKtM?N-JFrOpTjS#mKMK zoru^lxrzq56KuB&WKAOwTcP4GQINJ86v#Y*#yH@Fvr+m(A>#OWOPBEnld-;04KJek;{Ixs`|i^r|Bt035mlW6qY@*Z^AdOyW1J@9 zlk}p9g@vRlTx?{Vo8Gw@aHG?4R!qzZu#w(-6gRrI!Q3QfiPJ}ZW$4+b(1 z;m_|_%6E~8dE6k4Ub<+tCmPfCBJ>kxyDgPBw`SO9llwu#L2sSpzr^Qvk<@brJaEb2 zNj37$)9LH+H=*|18y{BsY-3rh&){?&C6x<2w7m5JBlT?4B~l;SYa_!-Q36cqfCWju zMbm5~RG0t|&6^`QxzEZ;+Fz`ToBG%U0jAcIjVeWV0uH*Uxwgpp?-!FlRF*cgYg8Hb z>K3}H+e-V2-F&Y6L&s!TqO??&7D0Z>M%z!^);Dn(a1gMB<&A=AG^v^ir3%C!GDiIF z;ldx*9P>yg{GQ<#QR=74{e|pX^JS+g67@T+;M}Lm&H6*R!QnA;S3AW^e04(HM%6Ck zN&=-%+s4-iK7S|(87{?W6McxL#q=h{gyI&Yc2b21XF`KJ9@Dsr`i?xeD&II)ZVGa* zn$x?|+$4)VH4S<6ptP=A9+Z(AclanGy!BE;AuH`G?GDYZhC;R`R>J(D3{v;G z(YPURd1lHBLnTjB1826f?I#SU5O(l79?S7vu-Cv!qBaSp>O2CtGey)AE089wHzpA^ zhhN%Aj7zMdqGJ>5oX7lP^K5*dtVhjyfaCJjy=1IZ_TUt*LK(rQT{)`{aK@hG+lz*4 zZ~42ZNA`;PT5e4`q&8e9J!E$Kl#751y|-h%tLH!HLu$NZ9mN55X+TY$vwOb9Ohs%s zJ0)|UJv!?W-pj(r94w1WhFXn9p_U|loY|Jw`|@*sdA$1%YfpFu7XFz32kB4$X=6VS ze^=!_Gw&ZLclA`&-(UD^Jt<8~5*&{mzqcD2GtH$JJE*G0*>f12RX~|Ropx5nela3e zpQui|fU--_;qqF36l+<^_@jmL3M!I^eEN6O&s#_ztecnHqKXz_*4dX)dnUP;hn7w0 z@wnT|_*`e+jhoLjF%RC=PSPz5c2RoR^|{GSnl3EuwdRFs1(N4eZeH-|kn!>U2xCIu zO8B$YdK*FoOV_4%6=b;CqSxJ#Egl7NNe<|>KX#iJipI?07IVg(bFc|+Rmkw646+}4h~c>e@t3Zh zgm;0+$ zf1t#6+VG*A-Bccj{kE2=UQWV0wIuGxSy@LGNo@seWC;$$(GmRyvYTCuvf*ZI%X8 z!}>}_#RMued3-t~9tYa{o?+AFZ0x`j8o~9e>!+aa7`@}bwdVlMUK-%0woP?IxEBzT zi|r52XBFGSTcqmX`;VXQL`B4&^WqC>VZJ}qesL>6qU4Q;sK@Pw1}s6_A>u(TRW;1R zyy1wJ@H01UHyNz()OM_6J{E&U3`3M?OHEbYsk|VLAcAY*VrJFDzJ*I#af9**GUjPP z-YS3FvR`a=BWTNn^COZ&Lo)8Q6CNas_YUH`kLba;z_TUQ#v1%FXAoyLsf>7Mpe0tP z%eHymWvvir&0Tc;x&j?+lkb~JBk$kl(1uDXHa7Pz#74!3MRI7jdAV|>4wh{V>vgGJR9D8hcg^Y5 zKii#uYOLh@kz8q<=4HgS-aQW`O8c3cyy)qIf>~?{_8FAVN)ss&%6q1NY)$?@vtK-s zA!avdsd%jqvbC6A<4Vm&hA-oL4@kXwD(UvkBn%y04=49zbgTP(=FM3l?(c&>}Gn;FIf~sFrf23x_XF~kyfs&DUT)U#xyIICwZ^^h*m=zke zCq{PRTmtog#%*J2ySJ?7qDa0Xkt$l}*dmL^Il>>rI5g*A#Cc9rmqzNhJFHIl`8n)% z7Tlmb5dC5n5$}mjRYu4)#m3ZnWr9U5p!&e+L<~?Dm;6pmVkP=!FFp(;TN#@E}c1_=5R{z`Q0vN|K_lrMs}*p^^;$BivM+*oA!-I=QOYI zG>7d}xoW?L(cgN~)VlH9Rx>=wSaWr?|1Q95Y%eA({5~`HVw%=Mgx6F~GaJED)~yQL z4f?Dg^XPItJ`V3X*3RfA(kGsi$zh!FSwXs8l+4_(?H7~E$*z4&SR9}a_2H%UiTfqy zjF0|6<4PHukiE4y{<(JJXZtxYIbngk&5`=1VdSCQLRv0;dasi*FkwG5cB=J74|6^}y8Z(jhx!Mh_&@1M?xpnbMWg?q9b87g zZNd9GSGqW=-%|$hZsHpgCf||7Duo%kQ4#g6*{KbT;6PeE@oxcZ%IZjoxu_}lpTHT5 z+2Yt(y5q0>smOI>)P%n|j*7vCfwGHx&*mr3QGqunLDsE*#oUFhvDCyyhhvj3Aj~6i zcui3bU1r=yNQ-+aHfPq(!Sd?3eJ4&tWTi!OA&F0*2=$r>0^gUwU(DL}&pEVzF9T=T z_e#*b9iQ;yr>EpH=bTjNh5unV`VWFbc$V&eRxVBwFCrAZ{=GfECQpBF!~$#Pvmuqu zhACU_oSZtGxz6s)ax)zbMNV&$Uo6`$-9)I#{HGWvDcR6f9Z$O405u*{elE0By)fzI zwEv7pn4rCKDNf&-4^g%6*`009Vf@@!fqM}TvL9dtHg!KZV`}rdjMSU%_a^RVmk`R8 zGkIZ@yFCdH?R@u+GjXIYZc&`_5>}|~T|fVgQR*In&G&{}(IV2jKJm3Qi~`1XUfjFo zk9-$Pp`vwS_Gn_8gGT4_$*ve5R(`i_8}w;$bI!&bm#D1!l+`>hmGR!SnnxqW;BpbDaKC3bBu)G0yx52o5^}9tV|cZ%u_? zQ(jrPQd#TifgVWdlK5hbM6r-j%GH0-(}!bbaRKv{@BTS+>*}hSi#6A!w~Qt54Bd5MY=sy5YZNU92FNdC?r(9R6i9`9RUx$+_2O#M_g9cf?uuO`~<5uFl#rsk8SK zR_&-Pop^bF-jukDv^F>j%RgiGS zy#x5UHbROKR;mp+TZ$=r*v}CX`OZTt*%vv&CBzH22%S$W zD4q^-v+Sfs_p!WIlJ^j|>RO-rNS7j}`=q{YyG8Wo=d0YAaV^7fmpht@Y;3&tW;)nM zaV~kJ%L621zZ`7s|Fn&w43#{HaT@1xle*|D`|-VrvXexgx#TN8 z&T2d;X^&I5+hZ7FePwuC^FmqAByfuf>c?Rh~n2{(Ge2t)gsw0oD+L9ZxGi@p|qj zo+V#Xc9-iFYLWK7@_*p3e-8%!rBuqysp*klVv9ct4!$?`!|war-u%?Q<8%TGywmCb zV2}N0J!#-rI}AC^J`MhsiS7~pKkU7CRFloVFCGw-P6z>|6Cgl9_v~}_``&fe z`mOWdWaW9j^UTaMlTZ0(=2__^NHbE+{IOF!WoVPfNr_E1C6jn$_4(h-`oA~icic)< z@xGj*UocpM-hDx96n)>9>%Kp<{-fmlGybqE;KKDQnA{YqdaMsucBh^0z@H4MM z!P$vy9`NQt@dfBiy)RO-u$E7?tmv{?r#%BCIo2YYIfY#P*>m6W>Eo?dj*VL9`YZ4+m;hHP-^I7p z>xu`{qgn~mDMyMqV}Cx47 zY`OQfhUqx`Bm4Xx&Ah*Y`Tu{fA-{`pteWrUCZHbTvMd!( zLm1M=q!}Wm0g29U{(eE(!+(XI33h5#|0pWh7QB{&j{^Pz!n z$Lslqy(Z7x#}mvhoO9xv$r!DK@%SRLRjyRsPpD@?0uIw0hJTc+m^vmV$A?Q}-xyUK zD*xW(|JN1fcQMAl>#LIgskVEJj#B=CvhnYs{#N7izpY_^x%+P)eg}g6e%#+(pZ_aM;xozue9 zM`g*8Hx7QY`3DQor_4z8@qk)bsD6CQEMw1;zV0#3uil2ZlxGro6J|~}7FChV)9*mK zCP9gQuQL>);j$O z1}?}t0EC@mh{-+ z_v5U19lBotefyu+eMIHXog(OKp~L+vz5R_D4X%ikc`3JdG7glWupDZc)Q(baWN&yv zY-TX@7vNf=zDYnQs#XO=bG*?D!xs!chH^1s8w0xS}Vn!)3at~Zv|flkuCN3_nX)nsJ| z;8Cw>L+8EUSO%U&PJZ$(FZ?Nu&5=?J(0&GCR~_`tpL=+xdyA{U%oqbE!DSG`r9`MM z*%)I=AWDo$^8yO9h z@Q1S^nLVx>$Sd&z0=H8lr@vT+k4@hpwxljfd%^+|QgFgOpxKS|Y{LAVGD}c1Kajdz zSH2gmHky91=$iM;2nL)@>vn|vt0 z6|Nke7-tldN(=l}szfg=&kqvX9%&*{OoLo)=@-Nmja{x@#NVkAlX~}lNxRdd&bm4| zA%rQ!$K2TqZz_lMyr&3k8lyR2rS_5?0|jw+8r4V|85im9Y=?IXk^(je3fW;|iqzhN2MBZx)-<9}fARmtcW)s_Y|qI8h< z3vVnd-lJSh$fFS&HJ5K5D#nkMAb(d#17ETDX$@?aoW%M|gP-+btOYrrax?&gm6~VZ zv73=ky$uYV0xQD!U4Br_&N3S-tWiWBE_Y$iT$&7i1+?vW?_Yu2Z2uztd}<0U17%@x zaLi>iauD7QDKW}9k1BS@sToON0X?$nbVKblIAKC?O=Gt zz#4_Env?heTjGX96tDka_tb0iZq_sjCE8{~xToTVkN zZ^osbj!2?(?aQWkS5i7V&w=I~Tne46*eG=l8mv{Q$s}ChA&d1pymvV$C+Qk84&=<9 z`~(QW+eX)T&waxh;TnjGR@EIHY9mGAg>K$K&@xn9i7^M1y>aktebAQmD*e5ie7;#n zkWVBC8{EPju~j4xz!)FF=YSzsK$tP(C|#5uCdokn3y`?vuYEh-71{!5jxvCg!rY>|$m2tEy>} zLi&b5NF+$FjGp(>{PC=GuRJSCf9VY(xLUnP1uWiOT&z@1@peL}e0QBPF{{Amw4?x2 zEJh?@AI{{`0Xy~Tn%OKGdP=#P5FB1vVhykDT!e=wKw)rrbH@m^6#RXfi&lfI(u{MMn_2!Ght}Uxm z!Kd-LAssKMfuu)7j8;9*)6b_X zd}eX6qoO zGs=YUgjnmQDb!eXLC2JAhB2cFO8G>daYj};)nfwlDa%yy%=1l*>42%SqEm}!!Qu<> zXLgE`*a_ps5+ACNJz_IkB%dlEk8C_S0SbcEk?X^5f2-obSA;;Nra)^B5d~0y#|?Nh zi-?hj#ksx(AgOf*891c0uhB2-BOz%HF^ASSO<7u9htnCcde0;~Smm}-^XF1%Nsg>u zQ@;SAb@u{nE_UyZltKE;FJ?P0AoY8R$aX%aL=YR|q)>c#PBwJ}aX$by;bo3;QGZwf zdAS(*B;|Ss*8m@H0hM(ix@i+1lp_#4WpA~@PV{6(ennOv{}5U8COX3GxS63a8J2wH zy`ZtCP4)R2{mu^Uek0kNLX(O4*KQ--C?gJ>&>iYaI1;Cc!6Of$|8s0&Enx&nhww+s^f3Os6OK@vl=p0H5#YDI_qlgg^-cCZWWHyRZ2r$;gN*OU1 zsC)!}3?XMuTTXq&KYNx+u3ys^R1);_GzeQsn48o%s>PHm=YdST9nyLAQ`T$i798EZ zfR;Y75lbBesu;*A%VVGvg@vm(4c8GXnKAW!lExc#6@;+4`?^>x^M*n~Upm%2jUH_b zkgl>)DrAB&$uL4X8k&sK9qt>dzD&cHJQ=Vv!=&+(^5^7Q>x;7sED@|J%!nitZ}SlK zN*0Lp29ZxfisJ3OXAir@B7Z@a$(8vn(ipOn+e{B&)Y#Piw#UD*>S*}f}fR6PZ%o!rnb}g+|Fxt&lQEm ztBs8BrQBkDhrw0J7IwH0N_tVKg@@pH(TE_Lkhvwn({Kc8a{Uu9mQ-W30cAn#`JnK* z#wJAu#U9XIixiGleitr{OHEFZ976JH^y#*O`+;kMTTE2zrJ!K$e$-fWecoxuh3-ZQCu2;d5;V^7ND_OnKME%;y)95MU;>St|-mBgxliOV2 zVWodqidJM^METdiIJ0AiP0yPo;pf)B#Qg$1Gw6J&a6qs#c_SUtZIXhp4uZ>7-*XUj zAgh$ ziDrqBLrMVjnOi5+=DIt9azLA%xVc3%~cZmp7mx+zA{GN<){CN?2%uNiFjIrS; zU~yi0<0%1{apmj06S-z}mlNlnFjdg%*s*6kaaY(hX;X9*Kx8@`g!ZdBp`_)W=Q6X_ zn(NW<5pP9x%Oov02>QV-f}iD`fVr@1Hm8s^g1~@slz^=S?*lAHiBBRnq11uzX;VcG zZ$F1b{6dh>L}s=?loB#S9-2K;st2$CT!rBG?%`ctAD#j?YG|@089}X7)`zwn^Z3s$ zI!u||RUNn0rnl~D_A>TBD=$H;6>zCw+#v^#+H*JM;66+NjnG#t8 zN=!?xiKZja$5KNwb?PptG3<`CQYLZ!BEwM91^rI>GX`$p%qi#OG#pYs%(;j&h`n4y zx?($&D8#<@nFV@h%nRw^kJHLI;{$(NzikJ8UQsNdk+*P`KyxZYPmSyhr_Y%d{!}%# z=9E^Nua0)c<~CjZV5+bTD;EhbL(HJ=7s{|3-8n4y*mc*A~$ObjhFm!A%Rc0Kz9CI>z|Bhz$8Y9$>B8D0Pb$MIAQee0L%yt z=}x&0PaS;T5R|k~t*O-7$z>+OMn%n)x_nryhKxZMf`Pb#=n`WSbC?WD#9`XS9hg(# zPv?t7sbH@mG8@UtFg+GAeQx607i(Y6spB*{C%v0(sHpcep9o-H4iSaCh+cTU47W!& zz#GmVgSeA(&i<4O>_SWfezGeApwFD?QLtTsb3V}Nu1ad?bC0E{L7(wgfP z#IholEodw=nrWjt7L2mKXHCM)QRMBMlCeK1oU_i4FAegPT@(h`T9a=_Tn z@@2y8ZNQiT&L`cM6@y_OZP2c;G*+6VkVhX3SShHJol8_9lz6PYdx_(Obies-|5{&X zUwG50|KdIFj9Ssuc6%07P}^gb7i)be@M@>>+^3%$4AYMkqMqBQy5V_Z8?mumXVO0{ zwEPHr64LnWHF|MhOUCt{*JUTA?3^)*^V2duLSTio&AQd`?gS|&2O3&yz49GH3A}=| z6|_?huq7VRxBX60af7`@JqA&j6m&YN=Qe*mSt_-I((>Kw8&8gtu`gb8HFE$n56%&L zj}9?T^p3uaO`l~8RI&cX)d$$8R?~PoX>(#(9lJhP&~Ax{^J_Ivm1wB@{#p~B3&u%Y zM!v^qJFQA&l8+AN-W0x^Tzu{V3QKu|T9V4{MuIn4V;Gi-ndvGeAq+KfO^gnlx|6{c8w)YPR>ULb@1h!4-yRtsiH{o8A zgT2G$Tm&i~?}Vzaw2&fL^)FX4E8y@KD?fNCu2@oNCG;8JS(9liadUN#A^vdAry`x| zcjTPhw{mZmx|XDqDX>PRY@zVN(>-SjX7Pt5AD^VB*7|S+?q1=Y=bCw#t47_srzH7TB`=F#lRX zO*$ES$0h+t)+URdv}9}I!+@*r_B`q&M)Q7`GpTvO#U+?gV1RAoq)fRdY2rP_Tnmyp za3w^wybmih_6}bF-It_-Z@arkd|wm;-Ah(F#?Cbcb?^*g z8+AB)u1dd~cY+p*oZ`-NY6+w002}31VSVb(Ug7qj^30K0Kug(WA3ootaQTaM2ja2( zk}R@`4eD`&r}-l3aw7%BOcXw0X8iRgZSB2H{5hWIFks&KDTscsN^NR6dEW;;D3xrW zo=p?HA$I;Qf}$SOvcjd6d+|IY-P&vQU6Vkm0Zkg~Xz)AY7mTTxdet)~4?4@p35Hzv z^_>Fv(4^aC=^(kSQ=)n$*F0r&TfDA>8QhaWFH23g3_5~-yTaDM+$+&T7> z2h+$mcMJrQ)@!AgLbnQNYO4582AXKv95|Df8*U8fLX>Ek5g^?zA_=i~v-}g&zMVea z;^^JH7J{F>5!w|bs_rhwZK?_^wA~Hq?5O-y{QToU?jmFIy3TY9uK=dd@t)4UUWZHW z+@~dJ7YewHzk?dty|MHv$Ok3?LB=3f?o>a%Yuj!&V zj6_JcIB-Rmp9x{+#-!_lxpg8GdDqV0>sD8yK)+s~Jj9H?@*pD5PV%s<==Jqmr5x*x zuscEb2eV||U)2O37CH`{v7I`6d{|5?z(5)Z*&iQH@V40D$^@hu)C9w{X2k8sIujK< z$b-6?iBB&E>5Du6^!^~UPguMZAiAcar7Sb>?k4y)Yp<5EeDDdMh?VqL$h#^PxjBj7 zE>hH-oal9~U3Jr7uX6ezJaA3`_mj5>kyoJ8_)=W}e|^`C?XFf6x{uapHT!f!@B(qG z(DqxGTCXf~K`@&dHF?$&bvX&{8B*7%%072Jzph|$LLfvo#(hY9B`GGtmtBcAUjoqy zQv^4I(!93Ax-Vrv=%+5kgPO-T$2u5PB+hco4JU=L&b112#&>LhABp0f&KF$l+R8P# z({ht3*&W%kDU8%g1ZTffe3aM&4CxV_v_c^d>;i{2-ar~l@UP`-PIMi^Ue8Plc-?IBCL#`b`NX!8Y0-xRNqqMZo(y(z^6e5POp_*WaPrKch}{% zWT=qix_$xN#NXW!Or#MGT!CU;oa2AKS z;U~gxxH@*T_3QhoH2G?Bt;GIUm2ax(KJR*pSSb&zj1NI zE6gabrlchJx2Tn%M}V=Lxh^>pEruF~iOZIP6~b!$N1o;es$Bw!#yJzOPXqE&`w(cV z4MFjH)J9anncMF=Ob*DK^prP))bQ|bcQd}lTrXo-0f8M$Au_Tu@^O6dDz;dgu{as2 zx?c9cKmOH412M>Yf5Gl}am(n?MP!b$ejAZ&-ar+?CkWmkogZ*2;a)pVXBv)6O#jG* z<-qE^`_Z&(C7ulg6@BQ%%owWf=H%Wu4Xh1!^g9|oC%ChF?Pj~rN7`vRshBx9Lb+QY zDTUenpx2tjC*fczFD1?$(q@Jvu+DHrKN5mlRDxJ8Gi>gmvk9Jx17!2Bfn{OZ;o zzKeJ{eOC?`zmN3YF59AaK-)^HeuXohp6|^rZpmSqt8S)9rjgIS>d}RwOIrKAhn?l* zPL2uU17zRPW6Dx2otpyJzf{+~HsTNslQ>JSZ+a|GTXCK0%&f?5?-ud0pF>-bLMLnT9tu2@{3+e4Qw==pzVI3?hL0#=w{@0j`e z!7OJa`9bUldkhlpa&BLjgC2J5a|P7p0MM=ht?o2FlP7{Xv^iQ~R_qD<`lkg0TQ@!} zuI`7s4*?{FL`ND2uT$b(|4v|{a592-S>6Np=46}^)6Yxy;b zW1H?{o$iSbd6Zv?Xsm2~dd|Wqswd7B3+F_?TDM7KED)$^t z0EMaLQ$ZFQlnJ7|#+kYWBid^*ofJcT2nxxC)xx@rMcjNNLf6ITLh;hwNOa9(lJV`R z=WXf$RWj9Waj}HNjvhEiN4|;taa|#Vv|-rp>9Tu{6?csYx2Mr~C^WGdRH}%koWAC! zbz{P=TlyLnFTFzpLh_P6ZrINV_H4d_DGb$^HGcGPJ5O#plgOFt4twims-O9$zeC5% zg=qLOOi)e`qqS!V{|!WLzP~DOj6HSU!$`Tbj7em}cV&{MfO4$3j^8ln>l)tDc*<1E z$G-L{?zY@sUn@G4U8vAN7aH`nTlfwx}<$z9Kcu(2sJTJkZp@=}icv zUBAyjhLSg3CPP-@PYd}IOJEl4$#b}cXZ)+`NXr&)AO9iyJ!k*6E+%BW~jFO-^i8o@ z-<<^=kVl)FbbKhT>m-T#AmMIo0xm7p9j+~%BL=YofwwWF=UcT3^NR}IJPHGyt(0Rm z&FvUu9e&6`e25SeNLw$bm0r1#Bj^KrEx_^f3QJ&H**n-$>w*z04v%q;313VnMZPJ= z>r3B4EJe!%8I?Kz+*68C9Jpn6sIjEm8LzkAJx+os96(zxHhuCp(bpFnJxxWL!QqhX z&5|Y&2cer{qKB;Qa|hTAcFh?hM48iJ#o=R`bZPv@-SX4hxu>c!q*^OgQR$W&&@wXgeWpv*POS0HU} z1!42u>HN+quDPQLrlAwFjMZ3G?b z+)POdg7i4`WhiDC>%PXRg68DaJ~P>SUppkH(h{_vJroslolfyDct&`#HVAcsH>d+2 zd*PD;-Tj;9X6E(vyRnnm8DH*ReA0a;&K(w5EAl}MR({zB;)#B97O9!wBDM$b3haU} zPlm|X`eU#4x^U6)=C#g%T9lvE7CkhHDuCB@4Gk+1=_Oxej2zILCwvt-Pjr`F@#E2}mD+xo*-)Wo#Yve9 zJFigPbQv`u&SkF3OZ(uR<{K9&)IvHrk(G}x8~p_+k4rIa@r`;qNP$CMju>*x7d2or zlD#?LJ(>MxJ@qsYjX>*ssu#9oiBC+jWsdgeVvRf2gkMus+8hIPPJAgqXvz!8cWUzz zYUEl+_T27hjos2acW$%mW=lQ}#=f9z<{?akE3c~GB zLVw@HSEo~#kMrQZNGo654u4wiE9J^cRf(U+hhwprTjxK`yH!nQlDS}wp7tJGCNf!M z>bFzDgc=!CCYVTnoGt;blrSRe4#!ICm7H-NiQ@hw;V7G6{7)OZP~cpnVF0yuR5CR9RYjyF|@VXWy;nfiFqe|ZEMOzIda zH9AisPlADD`vyiQdJ6z3EowGNcj8+4|Jd4|nWD|T$f{$^K7?(TD*-AY% zoJ1tSWGrPIjb(~rNO^e+#@H@$xgZK4r~8!uBjzb1u|rH_+|l}eI#RYb=O}|U&{XQP znlLLeL&NaRQ-L+~$YVgc{o(>fewWE}zI~ig_=BD{PEd92e!}k3TbN6L^}y zg9CDaMz4vIl^`VL&j%{%Ta^WU`Oh*q;U>yh4=>HsctZL!i$RzJs2Ft#_(f3H!M%=n zt1PHej8p(?fN7xI3mwfoETUm$&^~V$jo_x4dUE3+M3@boqMu%U$~O3ZM4wY&f3x^&~!RYV!Wm3s>UW-d`W(dD@gM>v-PVweb%Z{+VZ7 zIsYYU>Yp2g-%dq5`R{kiafRcDivL`Lk9%yg=0U>~hj-H^Jb$q83vf~Jrxwl~(DbZC zzYn6-mIF(d-31OOaf{s%0o486{({MAxv*4RTxrDx8B5>Wfpe=)gP9d+LZ#^vQd!}^7 z29A-i@Hp9}nTfC@V1Hy4>rN`uU-AzyMd?Di^EYn2y)G)LTjpsWi$A3)9b9(N{uJKk z#(MJMb>RBmSjgk8&GtRn?@>c@O16og!_3&F1DUK}iuUsG@%4!h8ZJn9-l>d6#E&3w z`mb_xmBhb_#tkQ3J>G~WwW~^k3`K<)=TGP#XK@%iECi8Nl`J(>A>L+-F&-2w&COl*ANLY# ztb$G;v@rVFvu|n)!qFRqqm0IuH`}4;>{nI?^1RH^msMo3WX+JToFUU`nf0c- zXKv;NC$4X6teATgKO0Pl%I&P;x#gc3?b#o|D5ZIa8E14|5jECdYluBvpsS%z$PINt zqx7zyjbXWDBM7e#PO5Zqy0EP*9bNr(Ls~t0HeO6uX*$owm;qojAm){M1&hgy+E&7q zh{9#!ljl;B9fK`!-O~XIIIj7P_+|O%Mm5^IMNv3zGc4V)#zvtpB=f5~RD@Pw%ULKrH~a*TUw!Q1BokiZryd)f*W|>JjcIwz_VOO$ zH2+o&l(PZBGmvP-g2`SD>V`}RS(VI8EtBHPqDe!K ziyYg^*Ek}a+nM`eMT(zR0+yYui}H4=HdTuHnT(BVyq9;K7rzc=49{uYAj>CtTZ<)Wb0Gtn5Yp7a}XJN zH0uUn?xj;!K5I4hLuKnp48;uqxUl$^J!_^oYiE9kaQ*Pxfq!IbMwz$+KvNd z%^nBp`*s}2edjn({cReO{O-cWagBw$$2D5q`KK;CJG4LX&p+UQugSwV_uK!{C4YWP z{#YmfQ)Bb*O<(yVV=vV9?Jw`f9~siW*8j)fg#Yc`+TZAW$i$$${MJ8ivYP97miS#i zEIPOw*&6xfc$PdpUVa}>q`iOAz8$rx`g6Sj)(DpKz+5x5*b<`|T16K>K6}fWdpVkB zVfl?^q=1q1Eh=YvKDM=OyrB{cR2Vdt*GI_VWLLeo(o`}Va8MM~#2ae0u9Bs! zl_am;&@i8*%ZTT7b7Hx4wZ28)P_y4BD~QP>{5S_^1QNg;f9Toy>ROPL^iMUn2pnH| zp08#2%MBPKq-in{%Yuppe_rswa1-U}>ps6DNG?P{lnM9KP$ET|uv? z#MZR;G3=sM;dI***1<%cplN?4hcZVDp**uPLg1OzoC6q*#>FAA=$DwJtZQuTz&UCG*<4P!|9UsQWV1wlbOEqInq;i|oai1#xX`QcjB1Bw zZ+bXnjxKEPvzG$O{fHX;i^+vSdzCsUy63(u`ZD^Ph@RgP7^e)JP|( z2If|N;AF~*}JV{AV z6oV)|*;cb?yVeDh5-XLRZPM$IgyAh4COn4Fh3nZ_0_Naqu`E_%{7CKgPGp*9-ay`? zJmBWo({sF+f-8DW`Y10BR{Xp5egO^&a}*hMZ1jR^uX?NOffV}dA1Y`(g@$~ws z6b)urFL=~L3<)zG6_4M&B*-m)>dbAWB>N>~GjLR@OQ&MS>Qny@BWJwe-9;wEHSW1Z zcxoeTp{D!2m5W5LRQ`ydaHXA$F(WG1h|z#l9a~D~0b$~cZS?mb%trLlELX8cN~z>o zmSixxEW4ODE{`P}QSc?7jHs+mP0CG+c|5Wt6Iy89^xomwOx=V6PgBsN>=TiK#iCFE z1BoqiBbGt7Xx+dqciBQAPlq_NKy}Uvxo0+dOGl3^30@d zdWA^a=weYKBbN8bD>+VvZ!g*3vXBAg9d7QppIA; z6y^MeL78^TJRA?*YG279n7r>ZIv4sWnk8*MbT>xy)C+39RqyN1d;5+5!(smulJ`Fx z_P@*C{~vQ$iI{v(d#8n}DC&1YIBI1f^I`ffiHJ!&)lon#HO#-uJu%eZ%e~{`0e>Vz z$S`2C?zXv&^lzCoR>~)>a?9)vWSYL}`3n!V$clP>r#08SE1+&ez@ z+SX@S(W?e@xkWE>KOdnRJ@7G6QW`B`wvHiry)`~bA;W3l3~2LrU&}&kEe{=%e}GEF zgYl8cfnNYtTr2|7D))R$AP^^`WXx7iW5WnqsP;&L48kGuq}-xwC=iJ}A+VU|8Jx#4 zs`DE|EKp4H4Jz~D-~x=%Bq{LuBy3#?JfFgp6!DHN#xK$3ovXhYq#6AY@$Bve4engQ zDomi`ae@*!Jx{%jhmK{~G{N>v01(DL25A&+`uLg!Q~gjTIp`|6>p2dtCpD#>PiR`5 zifCg|;%k0W0P7;a$1jJe7Xd&Xjg^pAFi-TXocJ$*KR!`PVR6eels!pb-8ShCxtZzb ziC4vlqDy|6CUMF!*R`gsi7NN_*EBuTucXes;XFUjP0h9*K&B_7FVmT#mh*$LC_MVcatS(>q?J)JH=4g{cIogO%;dB?3O-GfK zqdhJ2b@O@5kWz4lO_8C&taNffP}bTeJO`Wu6k58_pZ=3irIhH7F-(yOHd9#i#%oN; z=p$=|^@PFYjHl zMf%0N;U8vGP6Xw^8%quJqY3o@33LU39$%sg-bvvG5so$NV_o#Q9(R$mc5{TqWVR#} zb|iBC7vM&$ly+N0z|W#OjUSN*QgUT?ddf>)JiuZiy*?zFqkaLd7lIAbH$}#Nv~OQu zJv>_36XM{`>AU>%@&UnXaY3v0=vZ!zu>9I#`YL_v=Wp7PL2Vztc+04ekFz^j57vty z#&>?(j8V#Q*3OAQFvOG3_AEzz**176W^Zoro?4iPuCyp~&vX0FiR*Xd8-~-i1!b{G zp#4lh+w9WCk`<3zsZcr{om(WvJ9YfRWucWj$$lcl!-+%W)$sA-hx)#{{KqQ!tovyA%d}b0z zOWk9**$#6mI`SKKtP=WGPCr37gc<4LjhYI8w&HKOY!V}M=Z)cJ;rx2{lj59wtAf>> zN_vY049AuG7&eo~+`&y5S<+VVF!NI)d_m3ZuV^9{^?xhn#6h>`Mi+1>@hK3QhaB*{ zbt#-+5b1}p$u_#1>J8B#X;_*!k;)aNvWcVwJ*cs}C>&)cahUNR_?4>)!@(1=$k5Ow z{l=r|xs%=^SAUl#{g)Y+hK-5IGqXEdL5d(m`og3=) z){Q2;JkpsSu%h~O&O!->A!nT@|2t=x1S>PUQS#DY?~l|`#yV$jkqCLIHip&TmZRQ? zOXs}EOb_@r3g8jx{@RVSZJXz_Wyj{*pXrqS#d-@U${9L#v;G+u>c4W=A2E)8&u;o> zY`tUfK5_WypBs&1m-4^gJAa5@9rsxBpWu}J#b|T>Zh3`EHB672(VD@`_<@IMAG*l8 z;+7yivmFCy@_ux9F*mF_O8SAU%)C<2a&F)J#!%;XAJl2u<~qE4_-mUS)Tix>az!$1 zj1?i`fB}m&)c*pkC&B*#haXm&NKxbHe1wc%Ds%6cI8|tEBF!4F8)fJ1J+F_TQQ);xM>cwAvWFv zq0DrJf2vhwkX?x4bW_)ZHM~g>$Ic^cA(y>M0%R*!!80-SX&*8&bV0L90nM*Q*($|l z?U%;vs09@!_}4*Z#M6#4(TO+%Lt$X+Wx?TwL^0L^jY)Uu5K+P&+9VMRX5F+6k@1V0wvjneP`-Y)<9P={9Wi%0$;dsp-Bw||LQ zP!ZlAd$gC9_d{tjZ%fD1>gvJcukEV>Ctf%29NsmH+iXA1yr}Tw)SR8&{y*3wM_-It zwt8fj56`^>pl{dzn}^Z{k6Sd^ugiY9H#-|OddUB$c_x2{Y5ust{*TO+y)!yXv+KV?QnH?Q7>C3U;q@BWO9%6vz1#J=TRo~e=l6dBw9F%~thHo}eUz5% zpXDL>M-|eKJPyN?WTi06mYI6-(D#MGHutuoNf~o~Q ztp;E@=Pp@=S2Fs9k%bC0(P^DxEDr!~U9ErYtqb4fv*q>?P>QDkP^I=o@e5Si{SXtM zsNSB`f_J>D1&OXu;ghoov>~+&?W^qTcD>oi6e`GCJLzf}%KQ7WX|kiky^z+XyuR<2 zT53Xf`X;6i<7MTY_dPWl>Ai9pMWfNY-_DNh z{;*N4HH%0|($AF_5;>EhiqN~LAG55~$$EqN)<8Kkc5?E&`p>w>`dy+e<<$C`fEK9% z7-Klwfju2W$2$B(SH6=JZ<<&3facu1v!OhfIWM18Kt{Gu0E4EZo`?ZC`We79t!RyO zyVYd-Hm+M6Rfs)4wMay@N@y99JT!Qxdh|!ZQO7mrJy-pMuipled=HyD*haKp&Si!u zy_l59vl^Nh`Q|KcVd2=``N2m2=g;>?SCd%wip=wm?ED5b`7VF^YDT9cXH@jy{ayw< zs%cj*-|%@*Rd!BLx3i7a{{7E#Dn5p@UkjAX%WQ8mWXXj8{CWBFg7>G-p}V)c@+9VA z+K8_|`NR3sv{<4euY4I6f}5HUIm#rNSvQ_mIiQJ;akSApFRIk)jbZXlTQL`vL?3AeRZFB+-cNAu#wH3?^5w9v9b_St7PbwvYwZ{E%dDSO7QAjM z)c&}5Sju~ zMUVgj2{j2VAP9oeC1@0sF1-^Hx*|w`fG8pzq=t@yH0ela3Q9+i=3%a~ues(o&pvB@ z)3wk3G5?HfT*(+IZ$^^)dG7Ks&#q@(#le79a82F!u3PB7_ihpvGe01Z)2m09s7((~ zs3dj})d5Yoy_8R~?824C4n}>kg*6l|SvIy2QY+P_KjVsGkLNRN6o z%eb%^^mE_7yu0Ajl=y8xN0j_|WZj_`9v5J{9Tg%=(Oz9M0E6wmOu2tA$uR#gK1Tcv zI~LE^s;sx$+`ki}M?Q>Omi)e*!OfqPKPM6U@0|79>ybYrD(rtaev;Gh=RSo;YzHUe z!+%uI_|J$I|6O_aJ0ycClE={i&a}cH_8A4oK}jUSH+r*svj0ui-faS7FE5AixZ239 zkfM4ujvtLeek50CrQhRR5|YDJC5Gsji9e*UX=b*xTU7z&Y`qFkTkC;ajpe8jI06^p z%rQ%Gc5t6_ctrGFe9@hC?aE}xkq`nY3%*b$?c%|NaRf8KQYtQhh{CR7^Hk52*S^o3 zrC^F~g|%IbXuhXn;BD6BJ60@?UHVc^=Np>$T*$Zg=e6U}#KA7H6H*{j0vY{ zhE$V+Zj1e(6Ug5M15z=(yv7opI1=*F>a!}sR*KOPKKoPG-Xd`ldMZz>W!FMr86 zBlW$@k42gxS{+UyBY+?#L;&kSR`tnXYVPZV*Q;NM(3FzIfVY03@x7&r3jy$ZJ?C1`-@i;`WJ(TEImz3+!rJnY1;>#t5$+bo z{hZ?x;nEfcXLC3Jhe42zN6FEp^Tx~+liuDd9MtDpwSBh)BQOl9eRAPI(-c+SDk!IT zr3uBZGi6W=$8&y3Kkqq8sHA->HKRhZ` z3x9H$oDk6D)o^+L1t0cx{+)6C zUspi~6(Gqzf!EpFGgQ=?t36u%-8<)CGyws7m1hVSS6i%4Ed~1jqB7og{huli{?%Fk zZ>p#Mqy+EZYOwx)Sh@GNrQ1JKAN`Js@Bh}$x-?U!i>IylxyUvM_SD!g=VjX1g0Jiy z;blzpvbZ2RBOz{ar6iMeW2L#CBCMTinDj-y0p_ z5MEa1h(S-9-{m}%9SzFkla?u)8OUj)yB&FrQNv0vp*O51wI%)z>q02ttWu4HizMnK zHZ*%9U2{>qurde~G7)B^qv)jU9MXOhoaH@!Us7rq-_?(k=gTWJ2~uzQTPMvMKAHf_ zB#kR|Tf*oQc6R;A<%Ck@{{!ZljobRl-NuP^4dKtOzv!cRej&B4m-IwK)F$G*UGu}t zUftBKds!##`^=Ucpoj_eCXCNR;}{rW=Zn)gobU$kfcsu=hpChW(U{;brio?B$8130 zywff$YW2ku`pB1+eCWuGOi9i45_^Lq`ilh6ruQZ}n6XPL7nUZZ=c6Z#Ds0tEFc@z^>Xl$Qcnodn$Ge2o=1v2tU?EcIk@-mJy_aG?VR${9 z+bjUf=&R}JgI7@}YHa^hk!OU^R`nP}(RSbb2Grn_hef7MhyLr;^Z!o1xGKo&QSS zj|CWK=kpsB`TGz2P0^v3CUPERw7T7bFguPrf%w0rYWTP6;{?HC8x2l&e`nS3moj8Z zEB6+-(omw z{E}NQ?7AKz%2ddZk*wOCj>}OenQSXd(A@MH5pc>KcQofZ2+m(jKfI0DZ`Tz@X}?LA zXY9=)-)2lp*XvQBUb+ZyTR2hs%Fpf(B|D7|ehD^_dE|di`X%>~iAm9(5mR2}M3N-d zp7C0WeL9;o6C}5+rWe zvswba|JBjIn^=$vx@!Z*}*@^Eq4iO%MoD-csLlXC;{X za9SZeaYG8SATT#>-%|iYN{fZO4ujSkC#a2Zay_RRA*jwS7`e2@N%yC;Xdz|=%-LVv zgIAn?K{=Tx29r)qbhnuF^sfn9)2S*$`x}yU7jRBk~NcCHT{Zk*RNgDEN z+6Caisy-%>PTw=jk7f>(b^=aBGk)yKSX@q`(J&(F<1&*7gI5_%>MsB-h_=)cgLlR(ofoZj6G^?8rIU>vX{c}WqS|!$GrZ4=wnr`8E`eOTwIxx?JJ`z@Pm~dBtjmP zvm{rU$4)_+QrIdju|vv^6MkkN&Sv>!W$M`*sa8^dh%Jh;r*7nN_$+SK`NiYqN`$Nq zg!M7XU4koYORFasGgQyJPV^+PDyC*@Ia@_A!)z2_!?K;O;yyVu;Re<+FWOV>@pEzD zdB^wZ0_`bL2_h+hWKTCJZZi{rbh#5=^FB@QJ$ZII(n;ci8AE4l`gzID`n;@Uy_1Md zn2&KvDymBkXhYT`LEMjo%ZPej_`IOOI8|fmk)di(zRF^T)6Fdh78w`7sX~8~RZ&zg zVi^^6=A~|EqNcR=mL2vLG7`oc9_ir*knj}CI^_v6Pyh_%eEM+fN;;s@qF1eph9Dt* z=~8PpSH8V1YxWEJaq#xw*`*fEAj@Yq743 z+jVA_t>LRY!|Z|!5g}+@rL?eFPHRt9e6h$yCAO~!u8@eQ@L~@pXp7k#oNYm_+nb$b zURI@wrm`WiUH7^s*DorT(wm=?`Kko^AfOzx5BxCxeeVXVb7)-b!gWp7oB>yam33Fd z5)f+NZn72Wv1Hvl!G!Q#)?P_h`()M29Lq(IW3Z4mQcOjJaqVfP^WZ9%o|bu6#@i)9T*G!ELqULXN6D$Ex@=wn|{d1F06$B^_`|KaP_z>t&i%B znx~tav`!DRS5K~0n`{y?#0$pRtq``(D%q;jy<_&aZJn9$sG~9Z(`i9rS|yPwH$H5A zt|T59fa*<3jlt?4vJ&eTN(Zd4nMJoBrrgi7 zsl#JjK?C=#6DkV>qaYSa1npG8KJM=|{V6AMHPjs*_m{YQzS!X4JL!Dm41p=hr-W{z zw$ewSS&mLi>p|#HU$)eoUeh^VK@Wx>;T&Y)TLSh&Re+Gtnr?sI3ICU!OlT&=7h2`< zUad2VDb{)_4rq7p{;%wpyjnC`CMV+%Ie_lg@X}>T8?9Hgins#41cB>3HruVumqXtj zUYh4qkLz->T(2b-!A{hgr&}Wv5zOrMc{wT{H6|x*8Rxp0>@kzb=++H|>OvjD*3GxT zwOm;S|5UElNbIn@LN(22;g*0fnT^J=1;wWOWV|SI_(r@RG?9{NX}_f9?gX`QrTdhV z3o1adBc2x~aqYuWmiXt?%;xXN5YNvvqi0RhnQ=>`0!vTnA2%31?pebypL5|-XZd>o zrQa@Ve47tsjfW?J3q&k9IhpdgS$dr6qYQ4kf?A;2FSI0mh|V0$?314W-%!`@x+X+E zQWaCR*2?M(yA2h9U%SlHN}Y!FUd+zf?7>VQ1=;!T!Ll2wYduKR|(*uJ*eWt?q5+t|lHRF&TpcI$_ z^V`2E8sO7?M~Z7?^?<8qqwcT_xim;EztxUZxtU+}a5Ud8Ze{_Ot)BL;SNDI@+RX|h z4;nA*(EbNs=^yzY4COR|_UC8iznoFJV?Fm4(!=-mWWFAogH(^6RmJ17hhZZr2WMJ`!+Ag=MAv(;|g zF0{_ISNDh*T6He3tP$7sTIA30gCN)Y-P}!{bXh2z2FrgSriDxdOJ0M!vCaEl*e;07 zrM7BJ*p9DZo5TRPYihBB+*+zSIHlFQS^dTNbYl+ICuPeaV@Q`Tgnp1tadh& zYi?hWPsbFAa!V>HPg88&obO33NquF)e^oI;CLRd?O+E(s_i~4I%-0$0br#&xrbanX;n!5*YdV4b8vy$?}eNZVQ=H`jzUDqzA)eoniMkeYpxl{-# zBILX?Z|0duhc|}y;8JDt^k{SL@lxGgrV5&KewdjRC@4kj0;C_PddrpLds3DGRA-b3 z%c7nFxps%7$0uGunbeM4U$T=7&o8QQViFXUtf8R>Ov#*|H+c6<(4@pnSCXkKy*8Wc zr^|+f8z48dw?DKpv@#f!1A(6W$>=eSJb69FK;H+Tx$`=EbUu&2Zo7$2_v9;nE%DSh zra$NP>0<0#Z2~<1m-_CHdc1$B@BUG`?f0thw1FxkP*Xd;!VJA^j>P9e&yoeTw^;h} zUyO|m2$=3CKj2Nv)9X8)=;BU|lEgPLf%O?--9gZKlicfOy`4_#uyi3tquXg9I`1yr zq3tOhAMT`p3mP(y${M94C+r#PWYbPbr zZEvo+#!E!3*#4~8rR=)DI{Ikflf)Ud+ZM=&TP@s~cK82qZZhyMX%F3NuK*QiRAU-@ zK26nLzkP#Ia-sR^nIsjJtd?!97czcP;!*HU7gyxlyU9DC+a@6)Pe299JQHv4l6?bf zs!>2|>Oec(Hve~??2|DL1LZh*z}y)b?jLG3rAB2#pVFOWG&nfA{Jj}r{4zpH-?~tT z5ConhlbKOg_Ad3Ib7~eWAzK=@PQ65sd!-3XBO!WojmOOY=+4L%$!YQaDcJ~b#Kj)g zM-XOaz9bZ>H~o=N0;@>R`6TT8nr0o!&=}_-j6Ki!J&uACp?Ve^Dvc9+n!spZU?W$#-TeOz}+j@yc;d zsoF|l;AqVM;)!&Hd&~g5SZR{7W_WhnR`~3Dw+|@P8n} zAOD#pP{B=9X4aoRQTA?nm&d){YC@Z>2{6&+30q}_+vuZlM6d?zKw2r$>AixMasij% zI#@qLEjnW#y4)pnit7vP%q6kp1ErQ*h){eW2i-z-F8-q{#_g`eqy*4yQH}r>Qg3|~ z#M0wt?@sr;$ooDAVA_nx8bw6O0}kZ=B#h(j?Af1{cwexSz3}Mqi$BDhwe)Td+$(Xp znEGMAXNqKX|M>0UYf}}*6Q=mlTTqshSm%uyEn^YWrC^gYJyWmSsZ1|x#nFLbTEPX4 zk)s$oNd~)gJybp_M>rRy26-qJ48ILwfF!b>sBzEevS|ftm>ZV&DtAehxdz^VgA{}E z3PlU=;uBO9N8BeXlhsO|7nAdzQ{{4M6sG&91^I0Vi9Y&y6#rk+zto#@(%|Poy}m|k z8!ZU^pN|K`w4zQh)h_P83Zypk@tg9s#{rwrdk3Yog;&3F(%vFRO--l4V2vMZ$0n>V zmprX_3;PW_uQg{ptG@m&75rc4P8BR{ooKCopM2}TQV74Dk@*v3(Fr|Kagts4=RSpP z!5{zl^88a0wttsl{gwoAo?Hc>6$TG4q$&vf z=%2n%y5})Zl6Nm#3S)rLfU>$;<8ZB=@LQL4nZuqysbN|&6{jaf%@%MbgEB&GM8kWq zu1?y`NY)#4Wh-rVh`?Y`l+e`ALM0Khk1II;3p{cQO!oWQsLh9&kvUYPG3Ve2^a zGnKf;pv#{Lar#>+$lr^F(wta5{!47spA2#OqwVpJu~2r|yRZJqII927JAwbjM({tE zTlLRGYH9w(vfK3MlDPh98PM;r4F8)9={Mzm{pTg~i%RYvG#S{rO6r{`Y}M$9wwpQ^ zwZK3LWZYxp0mjOJrz6&mPw)cE5q7eEE$jp_`2ee&eEXc?bR*?zBjzourS-)r|7n|M zZ0|JK3Fy{qPQl;K#Z_s`S$93%yCWcpi?JWNuG1n!3mDI9ymQi;Z<&pEeEC|HVKL_e zGQ0Ih%AP4yl;K)nM9wZAPo2K-1VYSF;9fEl3nfb?^&yy&zim9HrAlvaZkJ${3aQXL zfX)P=t&0Xy&-0F$e&$TfiX!L%X!kn}I{osUhW`I>$-0`~(0KWaN^-~u8aO!pvP+Ct zfAj3a{=v>6-_NL1o4c+Xj@cQ2av(Gse$rRxc-h+4W0#Tn%!>wz; zqg(d&+xkzlonVjGr(G5;GENeTE3;oPW*{QXWOc+<(!Zp2MiRE5HH}8Xh}6^fklaP7C9(=W$A~??^Dxv8U;R}BGA7Rz8UM2bfs>PQQu-;>3@??^N-*4 zyBl5qt8H}uu)*hd!P-AQ&Tj|0e+Gk}fWF4>|M-&srQ7)Lu{i%I=s$VFm4LKAmjrvV zV(!07@^m8RN~le{f5)cpqmBkau9rXbCRu8)EFljDv(f{@(dNz*p357Z4p-`XiFIe+l9u)a_ZqdgK%wN|NNoX>xCtXeMzz zMQGAKV%H^Vbfe1r3NP{G48@+3)hHET;A}=Gkm?$>PkthllIpe&5dV~BeO0!ievE-P zVfBN`nML|R9a)A+VYdx@1HO2#=4J5ag~cRY7R*hKdinPLl_%JA(z_ zD}4yQWQDaJB<**Z)Ynf?)^b6-q`Up4eD>|DoWe4qbsGnhR;-*B4o|FHA;I0xM7h>> zH(W@UxJEV219ZkRV2Q-`NtpRWqzRfQET#+1m5InBfw&3*42rSp3r#5lO^BudJFd2b zNKE@Un%{;1v6s$0hjmI8-N&W&qY;{9U{8;pwv}gQ`nL5s97}+^u`o8FL=W^FBQgWQpQjwc_|tL_nLK z){JApDW~$fAFh^IrEzhl(n94Bp0NvYqMIK4N`jvH-av>e+;pka`XXQ=)unVM6D%Ni zaYM^M8lq2yVS;u8V4=JWg$l;rsulqS-05C(;%6RV3-%s*mW4^Z466;dXrX}Av>rwY z57E|1b7WxHDoJ;>3 zQl; zZ8=v5v~4KlGI@AWMoXeP`te4}A;ihK0sltUg<~AujS{eSa%S)iQ^ik{bn+F z2RNfVv!-M}5B*qF#U~bsROUdgpKZ8&YXUn6l!)g9GF@8t5`IBvCULKg{)sBH_toJp z)2yG;d5yOo#!YnB^Eb9W4#U_p-p|pjfat+f4cnxtnb3g77F1~U7(%lGNann0Qguw> zM+|JGfzx`6va7EVR+S8W{De&VIO?cT_A9z1@x)j@iw(()mTTn#cb-m9;&ix|nCH zMCs9Rj4{RMOkDMspem3ECE*uUWUKaQ7v=CZPpbXt9`lLdy01E0zG}2x<&Vpv2hw@s zY4D@4EZB`h+8ha33iTcoXBZT718tRfh)p`0eri-yzb7*F5s;sXYQcXM{yr@jPr9av zt86i^8}<6+_&7?Y?qsUE!}Z%8pf2D1{<$cRL=PVNbQnDK)GO7LF&Qak_SyDL06OmeSy(jp`ZRPbLEnFo8SlWDB^RlN=%hUyWe^8~4~#7uY#5N@#iC zDzx^SLVn9(!g!XaeDoo;DdTg171iTw;)!$}eAo)K&Tu)!m>fn`#*gOn3RPaHSNybI z(j)TtYjv^%!BJ!Fc9VPDk3EHrZxQJj84_D%dFdCY9iR)s%BND0RaNs%6!8BqrxVA3ja1}&l$}@C1;%SE zgCG@GB2_6YEccc#y{TzEPREp ze8u(LeJ&0rPwSZln`2801D6B8p3G@wkeM2=LdL*8JubM*b%5GYVVjJr33pBKP^S9mzcPfY0YHt&s+P83g~0H{vHMi|%KXB428olmZJbNGSlcU)NFJYH zG7+BB;-$)ANe_0~=x8%_NR|l8v*zglOHZU}79%u?W1i%$hbt>i`Uqj9K$#W0-M*Wy zLvYJBC)s%xEsiP@1{{n{`FRQwBJQ=D;2AwnRlr131k1K%1U*SUHH&&oz3eISj1ORr77<9xk_zt|>eJFg*NLyGJq@ZiNgY zq(yndJwV)Q6AzT!Vmz2n!bz+#WD=o9<^E8|y;;8=*Hpl(xrdAuO2WN7#Gd#Wr;}ln z)%@uGonKTw5?XPhmy@~OyuY|tpSx|`L_w89zyen7TG?xyq1BUwTG>G4N3k&K z8riu^2jq6Ez4I~$b+K=}rZ5Nm^{jb7O&3^4mkSfm;Wv}23kM07eYHZhU4*NoGdeMC z0%o#;{VnrqfwT{lmqJjK>L{}|$n%Mfkriglk_E4+)Af|euUrdSxZy7KUH%XoCkA~> zte=YP4RIH^wF_?WF0o*(EGpqG9q!;&Wge43?YlVTu)->UF15*txtg)CHfB(SY^DEz z=B&)R3+P+pTQvW@ZzG@ep=Z~n?F}~&Cdu|DNIPd7bwy*WpYr$h8UNfo;^@X50}O#* za27f0tsTREXc2TbT>1@g7$}Ljh`tz<-~ak8c7y}MQnOxLxJnDTc)E{l4J2EBt~kB# zZb6ntpeBx&%ki*={G+jJ#DlMj5CP6xsRMdUh7+2K{A|tbL+1DrCZv5C1sW{Q_B#Bd zB{@%ZX{^d4_0xL(U@%2#{U}#m9(#d(Z-^-vhS`gRn3UdfMX87P9mJ0hec4{eZ4KNa zE)KQDE0C=(WgA@4WR~|)IL%`TJ$ti(>-lqPSjaFI1hD}(Vnv6&(7GHQFVC%Kx`&nY zwS@9_3pv=Lt)5su(?i~eJu14#r%AUZpzk0ZCxj1~#cbSHu1tgq?yZTwPto%9vH_mC z^#i_V(?kToA|0e#V)cnO~UP>YWH_NO{r=V%RM}oqqMm1w&J*j8;cqR zpBd_2g@_Kjo+XXB-#}ll?{3XuyM8$O-D^rwe7yQ%fZ{|s*A0mZO@OWEWeDdQ_{&D& z+m&M3kq9n_LDx6pn^xB(^iVl64pKUw`=NpqwTT>75;;80ewSyQwkG-s2a{PmEOFxe z=03V*At_B9yQ5rAn?o+Nh1rPP|CotAeB)c`P$k_3^JUVlJBXfih2ChLg(Qx}6GG6~ zff>fOoc0lu?@P9hWt+@Eo)Q=83Ib$^#9(4t;Q`4#ug@r6pYU|;Acjq35@v;&Re$6X z=Ov?@zfg-mD8767Y`bxzTDkTUY(){O%*sVV+^f>Y7y#34@3rW?r2sm2S3TJ6eaBFh;duOPin2Ggx z9CL4=lW~_&c``vGPk5K5!Kc%3;EPV>Q9<{oc{#GOJaiCP8#*G?u8la4am8)(SOwCs z7p}@Yf8SO~!Iu*ULM6yy^>gkzq%P~oUsNs6RZIh}&aTN^>MeXDz>;Hu^q1*z-SBVc zy;gb9?8Ja*I7=)I6i~t0D+fwEjb2X2=6%)u%%ZIAFk(1xZMlew`hL%=ppAcAqPI|bJbodTXr&+>w_V!#ZI z{x^%75b=C#;x{v6s@5|F4#03WKS-D&ir&_ur7M6x+G8S~pW3*^Jo6K`cN+xqlQwic z73^Ba{pte8>_&{O*$AIAjq(6UayGu3bx8`*z>_!^Nl7dRwvUWrQ}Zs*z75Zxo4Ob# ze&H=Pd?dowr3n{~KkLz-OHdxyl)x}Dnzf*wQ`xny1N7e5@u_nrkh6yrwJfqxPSq1< zPK!3S`jMDTo}AXv9O*y7JIH*sJ4~DpdIH3_CNw?4Q4D@UdE$0aMrjvqnrpKdc6c~l zxylJS>EiGzSfU^kYYEws(zvSZgJmo~xLCs|iJtLnYsa$GNvBK3e^$!!l$h06W8(r> zwnf+LtZ;6ShF;8}9<;tDY5>xmUsej-XR&sF$wl{yObE&JsJe6Br3MGY@MBDKkatuM z;802^YOV`6p=Off7}*&mWZn%2GF;! z7^xq`^P3&>8!FeuZ3x~EnqaNn>>qO{?LcqKF>l>&i&9``=K@!p_n)IxA5WwKy>|qT zehk4^%t&2~fTWIjs)g#=*Dx}Buo3d;lUq$Nq%*D9#v+ud%;m`4OvHqBY)uQsg$G|f zKC}#=a8&}r8bS-Xn=Zyi<`oxU2W(mH<>GfG^!72|zX zQAho9G0Au@0gUBYE!P-RPvshaV&6WAP6el?+qjtI>pzi^Czj0tgsV-Szv3H_sg1#% z0});0w|h#_8~%!9T=#O@Sx@VMde->ZGg1| zwHe%;cr!xeHGL){4g0JN7)SMVv#Im#`Woua76n9NlpXxN4e{G%W|(Hg>*BGw2&WLWEz%gwP7%P#(+@&%KNr-p`K zgbJE|)}?EIZ<5aWLcRM*tP(temwZFqqP~KM|KXEp2trH3>BmrF7??sa=Q(w=Mk?Y( zeJj-oGyG&V^ugLol7tywyvvq7Y2Isw0{q0DSBI6IWT{@*A<6d7=`cS^tD;FhcUKa( zblvirdo$|Mjh`|0`0z+VGs;3l5x2(1>};)ep3z2h&u|bmYwew+@#yNpti#A8EKI_N z$!W)WLs!(8(fLl~7K`-oI#*-x-8Wzk36}DNwbqBXq4E0yx98qYl8}y-J)U5v9-g#? z<0}I^__VL?onj%Ji1^7AHv?_;Z}YWIbcJ$>nWy9|BNQ@{pqjA6^<;2rbSLz}tQ3*r z8P-O7J)Y%085kZM9TFxgJDWfH75P9B(YJTAl7_*!H7xrcBxNQbSxu%5N!t4AeeU#D zw1bmo)bZW`%o;j`OA?gT3Twr5^h7~JI0K_hgDpRkvS+QEhRR#5BW)rIHz0Pc!c>*3 z?Kaa8?581oj#2p>(`D{bL zJbBq4^xjHm>v~EL3ptZc+{uk?aL%%T^b*PjWQn+Y${j2Hf!P`TV zh{e=?O>u^dPmLnJw{kuY63}1??yI}(gi_Jg2wi;uf)W-B9KERUBN8birI<<;NtqXZ zzP!}vX23HCJErF|<{9dSTfgCGftd%}MEhS;SMQ6?V)IqHuK_>xzDX z+(k4R_&ZF9pl+K_WgELc$4eXF^7Q;Mtt2f!Q-_&11Xa6KlNdRqbW|@i^E?rf<9#^_ zk=K^&sOS?GgHWwaMHI7C9xnAhsxC` z#uuWRtpiq$Ct=`5qTs&&w56HI4SM^k~%2zQ&ezx6xyy?&luaZ(443Mz4yZ|tv zWWj6@r(}Q~JgxV;L_#8Nw>?$Vg278JeODooLc;}gIS_pQKV9TrRrnTmJq|bDrIX3M zLSdE5Dh3pJel;tU(PN@35Pj!BsU6ivR6Dg0avat@+F#qAwMOR$`e@VhsjsY>ode95 zhECfQ{-TT#Nl&&u4 zgWAyonzH6Yl}w}7Da4T^IeULRu{0eP2Q;0o=VZ+S}IukA(lNj*c zbiyWbfL{*Z<9Bn&VcnYbGUv}s9I+waq1$6e7Lz{%%?u&?a#BjiQIl=GUZR&H%Y0sS z#<6C4z_J72ankLtx+KsGS_MsPa-7cE3YA*O^vb!@QYdiwhtPbV)RS4*Y-%Mhfb#eP zSC8E8?+)7CZ#{G7-vYqbrwz8wE#5ZhLjPh3^b)pTQk9ugJaA&r~j zV=L{@lV(F{gww&L*>QUSE9aYxdrvWpRrAsn+8_Y$ZR1_@@3LCf#dVhlg*8~^kaA$z zQG)og-8j8_hv(bMO4&H-NR8NS1UsgVT03 znf!R7$HVxBp7p9ybD6y7_2b34e65+bWqBQ!v)??0$4I2gM8Vl^iw!Qd_kzt{kitTz zF2>K&9+z5WG7Qe86m)8}oHc+)hwO8K%j7cRdrPzaFHL!777zX$P1#|UfR9Kf5G zccD?;A^olIa~dC3r+qs?4-e9ju6H=FSLX`FQQ3MtqS+GgtvmFBTG3cQtX`svp<(={ z27g3&;wEC)Xlu(!8lTf{H=|l&9GMsMwLovG_P!!m4uz=9^1koX0ePFyLc#E|)R7^^ zj2xf*jf?jP2*-{a7JTT*Y&I_QS2=yFITcE0gKB85yt)*=7avx?vosv=NdPH{1t>X4 zvqp+eh!_{N5aMyO5hg`Rh8$|>MiPtPAekOI!6;xCyd(-~pc z31DNXP-*=aqH3pyQkl{c6l7EKGwnxk`;8mXPuk##!xp|mpUx$gR>*KU58A6&34%NP z#~p2%qg(~tNd9*vpv=+mO&>9gH`{NM&V0|V7SUy`k)eIC7u$8Q z2U#2iqzt_1z-E5502Y)Dggqki3)@u^|8d8~3adOGK+tSy|ubCf|ne*&xBFyLX z_EH92VFI-)U3B?)Bt`}TZUdGQBVAHe9U*sLeb-(?`Okf3kGS|gYhJ?N5Q5Pm=Nd$7 zJ8yVlF7;PF^{t>!5%5k7WB8Vb{(R@KkW}OpO3DYB76*aV9OhoBzxL6ROz_f;P5aT| zk)P5dZV%>CNm6FOZz^f--_q3mT%`YibS))Pb41?nS!SQ=#vimq!(62g#IF zfwIVJ57}BgC@M0VTX%$v43X$CLo4pp6w%6+?eTBs=_Z(?!D$!@MNq*0thlU6a&7E#BWsMnyf1J{<@sF2`(PfLTu*GCJIT$SGNmdWJye7wY#&(A-kQ}ravF-i% z8VB_3hDpJm2~t8$?6WYLDNNmiQg!@3LZh2u6KFbRb#Q&4=n>$+o1&T`R3pgY6Bc|c zk8WsD-$A2R%Uci-+HwZFy&VD+EKj)C!d?R#$4N@ zWj+1lAA@cWPDM%3hp%`K41dzpXF!%n+pcbX@mA&JV+E)5kDIdTXx=4ixQIllOQE=L zJlJBEv-N}$4UvfR9x%+3G_p0O1@q;kqwLzhxHKrf{bOpDB>IATLE(~obhVyuxTPg# zn%~V)E*VQEl{dUTba=jjm{%~H)>CK)NlC-Q_%4qcmvrc3W*(%U4WXbT_?GRgyAwkw zxcOa&Q`}r>ZTYApwKd5B35hrQ{t7pyGGVb3POPLYVXZP$6?+4}?A1lRO4Ve?Xax7^ zWFvdiwO5kX^{K!HiWym(i2(eG$@UEiA7ZgA18io9!=FQ>DCMA(7(-!U8&5dbjrqy^ zFLZjoOrB5lUJVxwM?uUsyyY8qX*%6pNKMTZ&o>@4D-;ZC7dOGx^t}tYU6Fc@<$M65 zaj;4`c&9Km-6Z@os%l>5U{#2g$S6aYQ!M(@R-^DJE8lE?G)cOH_eKQ8a9dnr`J`9k zjzD-^*u6lFa53ZQ>o6vo6_#0=GD*gv@ad9SEpX@hEunC}==1Mwq)3%yD-POrY`G6^f}hUm;h7#V^WWHBYD0)J~RjD=$(!=NLWu@sATu zgP;lbDdR(#?=NRR@J#i%)`}Zn@)Ak7=W42j>&=^z7JY5!RX$8yLZ_STRu5B6e2oDAk zI<%y`Gtwr`For890s9U1&v>44%qi0fc}>9YoyNROCJt0b&R<(d_{g*^bz%Fb+7 zvZBmO5T3|eMgca#SaPmY*_dUBRkb-f?rfZIRTf7I0dz9`+!%b+n`e?l&o68S*~T^} zR&hzkhfn)4&TdQP+|>!4h`y-dZdr8gHom!zyK`7P*|8TQcPc8n+OySZbZ$fU2_!;P zxd&c%)y)F{poqvR=C>w(S1d4uIBO^pOycM&AdD!d#|0d+dm}IP1JGlSgk?^rQ0|Dz znNXT9DsG!KM8DAK!tXy-#}`m?=%QoJw7KL9#M@wil}Afc6O0(hy-7X}^j}A{@7M--@k%y=9L*n~t`H2DXHJ-n(lv6;>i3cEN1f z;OV?gs1mNdjqL)j zn&P-)^}*17Ts=s!kGEoawtCYVDJL8#__`aZPtv^M>cDU5Zzvo{!}aLVB5*_oA~s`* zojB$3ymla|`7?X6RXP)TeAnC^Au@J+f!v+rZUNkAdUh9DcdZUr-Q zK!Taza~NUlp`kg9CnL2GQZPhP2qIC6>gMTFM>ZItEWK;)oLj76()LtG>^v*Qj6dm= zEBr=s1BV&VnF#YR2s1RKzZ^gS>MIiUP1+>%c|v4q(TcibG5mYf&HDHN+o&wjlNW+DZJ>J*tpQ8D+JqK9wplUyZCf0DEdDVSeWZzK?0gd80S zeI^)A4}oIM(HCLYBy&Vwp#n%zQK<)6p7z%F*9!a(tU%y?h@PH= zDWe|kiSUDZ3zS850a@WT@nFu>sfIa0y=X;pwzkONcD6n9={7dCC|PUo*=8HS=W>2V zWslmrgSsp8VZW&8o<7ooZuL99m|CpN9}R5Qn{AJ z*)AQUSN( zUB14m=}olC7&;d>>)!&)vin$RZTL!cxj`QaFt(3>|JZ+03AD~7>0agWZ14Nk*AK{J z9&tV1CKqgO`88x4l6KB1ILG$oci(nYVQlCP=iwP2ocW?VEJ3ZW%zkDH0ARvH5!9gM zn^b;XVpQ})-_bv&s)wvRp>usjwcUH3MajGcqtNCzS_#4i=9AT47PQsUr(2BpJzpKK ze)tItY`$Zg*k8ZRE57SnQm~VP(nG7Kj$234I_PeBNHaRzdX3JLH7O%!3e28kw?RWA zEuq%6lnI?4o|T@r?6Zt9M+<2^ibV!vro0IEYr3bc*E6wA#oZPhqdn+xY9@~gkgeib zMMrwR*ta2*`MG)P7eHX=@bEF6YJ%!E`O0GoOUGH*jR!xWuXxfh;%bUtzcu9eQg>tp zcxc~1F2BK(SamF6pL|r-Y4MlG32$R_@<=cV3yxi@xcm9dtt?j`>63-qZ-@(t2l~8G z3Y#d_I~7|Xg|PBZk-1EfHrx9K!}yt!VK9E&_$gN%;!ufF19x~2wT!Nllf_aIOqe7R z(OO+2T}oo~vZK2#6736V%k0#nB))yymWO$UcE2s>@|{%q5*{N#B&P!>KAF?Etk-gl z$<+BxYw*G{;m$X90B=OySf|cvYO8EIY~Wc}>b1+L+yPoqSSL-o^6Ytbnz-=E0P}k* zgEvwVGfyiX`34%CE;}})5+C*GSh%D9PGQW2vGms6PpR8YZWrhMD@TYQAM*a9^2WH= znPv0gs;tYUS=5KpFOKF!E60(MN@3w0Qs=UqC!V}hn3?s2=Buol-Sv@O_LQc{>Mv`aa=Z>_Gi2+x&oWC!2P-lcov?8@kNq;NonerXTS2`(!=27N=@a5H<1;!6L(ZOz) zzp|dEeQ?2B>lN_)W(Cps^tpqsR-cClK9U6SH;zM#fxd-xg2l|=2FLCL85~qBI6ew8 zySzCs$Fufc^X-OU@s*b&-#*U0s$D6ZhP^fDF8FAL0Jz-WEH9oZh9S&fT_)4>Mj74> zU9sbeGA0^6&OM4UCyrF{Cir9SUV&wc;v#IyOWZFFxk#a3MDKa@z?I_i+rKHtsxQ`E zMHPW>=Lh@VUp9k2;&iGau!#%+r1r@Yr7n-NMkh^?5(+RTI&2f98r*5N4U)H6}spR`NX4e}!h4EFZmlb1Nk(YOBgNWTl zFG=YaReMTw!$XO9M)>{uPj92i89(MdcMuNI3s+g)8z^DX*iJ-tNP)41|3swmqD0lo zuI+@_u;g?<|5V}bqyZN)=US9MtKzruOcs3^TdbbzK{(O?BVfYFQ0FVW^JbS%M}}p2 z@n?lhoIxh-1??T$h|BTXW_i;x6vW+jPpe8_W=)_1{$WX)=i)yEksW2 zmP3+Y=ll|7rfVMl!1jaaq1^P`#l9;l9xJ3usmQ8N2XT>hqXoMI@zsMx?u_#<6jA#@x^u~Va?khq@X`qDz&Vc$$r3}Ai>4N+pRq89)U$1+ zsZd5A;RAd0xEEaQl&zLN#>-TzcPj{|m*5plJy^x{+$9lA<~dpp>mnrwIDRa{PJAKw z@#VIOG$E50=zaI&Dt^1N_s|kl=*I~^CFcf8#`2nFSxap=6YMD#;9Wr?jEh^&B1ar~ zE|-dO$RO8%!yNfjcXqgj8{?@d(qA;YpX7}nla@&FAcyMo@@CRrt#V7+wi@3}zG;t`P@e!%Sz(TWKGBb$| zj)vW0M8-X7ay0b2oj+rMNZA;Om)eZUL08&|a`;O!XKwI3&K*JT_`ox>bmKMDP|;;y z=*wob)Zly|un?%>$p;&FSP8B;d~P%yk)AW@soe=y;fR>@Zo#Doa6O-*VV$KFnG5Z= zh0+M*bnRW%+OzpFg1dEkVe?osz{{9-uI5TExe3nYuEP_*i%PmUC~JB={Q;$2&KrI9 z$Cr-lKdZ3$NhJpl9ebCU4+=;YjxCz*n=xF%Z+H1FzmpVg#kL~UKPQW0Z`_v6u1oZh z&0piP;<}RoxD7rDV(#!>fDq&4%2KEA-O&yQxGAQ_ETwV+PdG&TVBHuwJprG)Qq>SImQlda|=Xk>jeUE#ymbZ(_PObMtz7gBo1U+ zdApQN+uor$38Zg9hJDVE!;_xQ1Z7pwIt_1)Lk926uXbO6tS<*m#$B5|<`HWz)#nVT zddk)ZX`Q)y(d{wUpZCes3W<1RRsdlL?Xue$f^EY(vpt_)GOD+H$Bb6BRaEj+{7JHWrIV=TT?av#FXs%zRFe6NfZrZRUthlWWtq|!DqCpo`phJcGzJRO z0tYh!rrjuIlVtC%Jgnd$ZN;Ut=#+;IHF;5+l*9ql6cO-FjH&Yw((}?OQQ{X3_HJR; zm#8+zeV5tf{c**?o)N!y72iEVj)qXw8(+pdZ!JKqzAwu;3j)VI#Tl^B_m6nRx5DR* zth(zGjdvo70U3tD!d!HmA+xnV2m>9j%?+?J8NlXXMLq*9k6r*r;4R>t4?C$b3T<8Uw3qISEtjpd#9N?J6(`_`B`pVHhnQi!5Q z*C+HDw}0vI?zwM-`WhSRBtP8#nB@Bub&{RWP1H%&GD4`6OlqE?PEsFzjyj1S-(~6~ z`-*?=@U34o#kwW`(%Js$y?7vfqw?q2U%0sc*t*|wedgV_iuZog)#v+Y<@u*Wh&qV3 z^AhPd#RN6*Tz+$4{jXumx+^{+Z8b#|&;Qh{k}*e`zc@-0?sv;Jay&h6!Yx@smzkwq z=f-70I{N%%C2*te!BnZJ_}GuOxvg_Sxwi3?D$NeBvFY@M!{OHlh%e~*W101tQb)(H zfyxSFM!BvRfdjQ9=G?L|*Ng=WK!bGlZdHbVbME@e^j&`@PCW0fuRH{*O8OKI)$fi9 z5z?IVm|zZ_&vLstr6GbtR>DY)bSC*yqWR8|yY=+G!khJH*E0|CMe4++Uo=S!w;p}{ zTzw)XCf=WyXIFQvD_TW20+A#wn!Q<+-K&vT0{*^-%+G@r?2V}I@gd?xM^fQ#^5SeR z!o4mxKAe1bYGQGc`75=&`Em~Zb!@KTxVA1m5C~IVp2m$LDufRrR5*H*T*c`MmnTG@ zW*F=;X$6D{tD$@^NuQJ~WJkmRVk&IW+EG=bPf-})r6=Sl2}oWlhkBUPe#WgclWsuW zmydV+=_A#{uoBa5UE12@T_=FZ6LQSN#eG#xj^5lD9MsPAA_L$BV4$;*70455YU(R0 zbRTm#yvP~mJ{yxmVF~5r;NV2YED4!vgwv~*Xwfi1OK3y)+kCtTVhaWjOvRWMBAyb= z&VhAubX(6s_pQx$U(Vfv*S{L7%UkQQN8tiqe#(|Jbv9U#wah8$q}?@i@epcr5eU}@ z+1dBG?Rsu|t=xP3)fn{1Z_{1pwTFXTp5L8^8XQSFp{5sa#B9KHs-)`sMyHc@5b;C_ zL2=gFy~EP6;{Fs$^^yx|=3}l?mwk(zcb zWZv=k_lY1zh1;RCIV-Wvbek8@P=?dfl_p=Rj|UZ212Yj>-9%GyNBqFG!0eoCIZF?w z$Cn3H54xOe>~bv8eD}N=4B-G7&ev~{gR;yffZbRy`)hn-J(*vZj8KkLtz;6=pi^FL zYMw*XBC zVm}yaubg*Lv1=V6>Jg?nS;s04J7jy|>`scs@|z-xqm3w42k>T`ZL^2lXXeVggzvdQ zE_UI`99XHDQMktv1i<18gV7ZcqFw?U@fBxp zwDU-taYUS0AM@G(na0bJ9Y|w~64eA%LGh6Dn%&tzzXY}b#w+LY$y|VakQCPO`+m^L z%I2zbyNZRU*W#@-Hvm5EYQJdsf=Hn=X7#|4sH!+1*89Wj~vKM zy!z;i*CFuc1ps_ySW038XyC;42=8mvdQ>;4H3ALToteAs>qf= zGtHUa?*vZ@heC?J)rzKn79!okf^>gKU5^Gqh%hX-rnhvV9tCj2UKp1|1Pa+yL~>Tv zy>~z|$hdCI*EFJ74^KZG2$53ERD9`k7EkDM=LKQ!TB)jAlmd9AJ9NC% z#+?tk^eGGu)iypg=nxC1g_+Cut1GZ4n> ztC;cQo#T661yyRhBj&zgqoT%u-Q%?@!rF-8`@~NBpGr#!cY&>V9MY5bqntoQUrbkN z3{gs0+g2N$wf}L~^*W2<49;orNhE_>lK!p}DqP#arqsdy#+~=fa!G7W%qJr`QtI@l z&ry~NNXWpaWuL=$0}g7I5>-5E4FytaevZh5bJ%~*!;0XK1rJ~8mwo1UEtE&UD<$92 zP}AV`J1hGJsMK$mFR3N@T8F@I;2mC|7+i7>M$KU@u*jP-YXJ`AKyAp$o71*r109$) zokX#F3m}ihEQO8*~d-B_|~iSkOjWzt*vTjJ8M75F#(BlF*>R}7B?t`Ml?dS z6-sN%va0UzEK@tEUa7Zg+3|TYf6eG6aFHLnX$&0c5x(sxp|W5ZmQ}vpKt$J4e$n(e zHm|moSWc$vI{BHT9{G(dvdA{Y#sb)|VgrRkCpHNyldsfL-eJJdavB;M+PmjylyA8U zYykSZmj=F7<|GaiKRN4PDK>gL^!9;O&dtIbAM5mdklx8p-fUNFDgC^*;yCZI_;B=J zJp9u>wS)X082>rskMU2T{uuuZi8}s|^Jwb$-(~+8zt`@M(@E|6bBCAwq9O49 zw)6kL+@1fT<^Gn7^(U|Ff8Lqj5j78w8@7I56#OlM|Dp)1J7w)(w?z2?(lWk<#HrR? zMD{z(R$R^$_kao>u}sc+t_92s96%?J<^NCbKWCOgLS|dtl$z4FFif`$NKMaZZv`?4 zK2<%*?$C5}_kW-RdCy%<6&?n=C5m&QVNDeMO0%DwZ#71~5D96w@cwCPZp}OhzbALV zU?wk)orOk>C9nX#CeWvjK%3Bmlaw!$qSCvPOMMr3-aZFjT)SFvT-F)Rq}g|%jiq^^ zb&SqRlhpB8LWF?1&EoF85usy>)G}mZ(Dt%GIlQx_czfFN3CRT1mY=sDgeHMSz`9`! zU%ULzVyd{jVbj;oJELw1>5?)dTN~%QpUxN(+)(%d#M=|IL4|C+W8!3v9IIEMuD+_T zrWdq}CdG{#`&odeLnt>B2BZZQw_f(-M&|jM$i@rh<})JKPAk*kLXzMlEM6`iqyd{& zUXm%ok0{!N7DE+-%(}8p(zC8{i>=pqJQm_GS^T^WKlfq;t?F5Xu;+KYoxN_&h{0EP zGI+FDL_bXc5IEj@IH}vO(eE+(619+3XKwG5sq0RUEy7@r^$KXcS-4L6%S(a5Lr>A{ zc_$O33RRm;h=%O|f%y6>xl~VsXK@d|GGXaQ7Szk)yj9s3(duAO9X9xip$F!jXSZrt zpDPW=(;UuJH%1RykPVc)@=7~r8rF~gnYvEVY+O`kQY%W$#Er&zpCrWj>5n~W6#*`> zali;OD`kOYscPmL*;EY|Y$!X4o`#6BWMXiii4vg{5r1SKy87(oe5o(JS7d==x27c( zpS_w0RfCUmjPk>Hk&_16lAP+^@sfp|PkM8sV7Rv;URgBtH@q(FHWf5_mmP#Z*(b^L zg=5-`^j?62fGvWc1`nNPxpelE16+BWP7NpS;)DnGL)~-H?@G8iUkn;>o<_TiB8|T z;bic=N1?AU8X7j@n4-mt25)A~a=FX(Vm^P>wAm3=nr2^-*2n`?yzJo_{ z>*_t&c^z3gT2kM0GeM0lL?j-|&)!Q)VxJMh91ifRu#c8k_h5Q1DlHXNN6qHTb?5nU z#S4ig=u5!r_A9c0PBS{Uu&?k#yLy!yTKIj$aJBSEypyFf_SMcX_f`dQ(^1@`3pUim zd$LYZN7hlr$J28P+r&NZ>|=~$T?Sv54uo0ef7%m?DQAUeC4Y^ z4A}vB&W|W-U8>HBaG|=izwX#QME~aU}gULK+cDSnd#) zU~A&x)^-iL@m+t%GZ`pYZWLUN`l6puy_KbdiP>Uq&n*Bl4^q@S&%TM|q8oDTyKsYH zS$Q_pLha_9GwkgdnVnoM;|yN^Hw{In&0R`3T)3yU$kd+LYda1H*N0t7U4_;9Qu);0 zq9Ivi0FO5}>4HYLB=qD9lbQ~X=Dc0Qx)zW1EME;)mE$Wt@m7%Pl`I%iDz{(*Qt!%n z$R|EwQC%y;So))bUI=91CywRQes5I?_3-+jVCqoI{Mp7_+~_e7VCQ0a zi=i}!-{vP!!3A`~tXmQy3IPfLp29y!E1`FL^1Nj^)9%72wDo2Ak-@>RDdk13C%qLh zoXpLZ@XkOEm+DcB5Ve{IpS_uImyyP{l6d>D!|;+F#(!O?$(?J7+{=%#Kv<*A#P12Q zSh&%8gXzZT(?182jUEr)y(|ecXKyr;;yC*rw)-qU7e}kfnGmKDJ_ngYE)Jv@4oqCd z8S6t&2Qv9@=zopnuRqI(z={NBR`gB@(bqg{D6e_Q+|c1SKMm<;Aht2h65(G9GCS+m zz?dI#AB?7)S%~?;j@ah7d(rfm!%GW4!my%G6GmAQI5;^uEMt~FC|)Js#?h$gCv4u0-E3MY6@ALuKX({?yqc%b<@vzSH6#-}`$}43oh*Md?|$)7 zOCTx1UV-n@LOITB$!*3|!Df5DKW&J2$K0i=KO%Z=P7thdb6wHK-37c>korie=Rj604XG;JHBwgcT@@wX~eUQ`d|l^km73uA-W!;V8K z-B{bV;?(3njZh{ks`bPE(LipGPL#07LVa^K|BKB4BYjf#xc*PIuu)=7&BAhmcR&O@ z7HD_@`{_|`Md##mS&n$ea6|O~hDrtX9z_G!pxVa1X@d%b9n=%A)uPJQNU(N!X3_1% z{FOo(l+h|zozNb=(8&oyp$d*ls_*5OP0FIAA0^#LJQivs_r0)!z$I2l)*cDnC?Z$`arNn9Q~X>_k3HWPW&&LsuGjF<<^;?BYAhd zBMhI@{Ic@+=p&^j|0PJm1+3wCZ6>`|PW|aKQre6%Z?N%fKOVsN^x4l4i|wtt^A1`} zgAH>VV*$?q>h4xgw4LtvNaiZO`iz@ad&43ws`Qw3XKQ%wzWo`KfNBFZq;(yH>{{!6NO?`yV9{I0W+~3oYD+zCr`zwDrocSGm z>ESi+;luU6U&6mcuO3KW{{uJuIRy4wu@5!yeisD!-($DXLrxc-Vz&=)+~G{kY=gWxv$;2--%D-c!vBlr7*=yH z<#>66-S!s^WBnU{p)yruk*Jl`scEcn(1xeGJ1MnSz%vNdHCp}VC=>*pBmzhifG*CY0QNtZ4b3YgBggg85d}M zfqK_hnc{q-TALa4+_4l2rigdI(!G)*afW0WeK z^qL|~UKlbVbHH|tV~QiG6Q}rJP7rogpp`~*%dz_ zr}w-5`^d$1!b)`63eu9tBO9Eo|8#Taroqd*30Jqn)w6QKz_v=KeQNT$zhZmUk**TH3rB6jDI$*T6&OB*l!57el1iH#5$Ongv-kP0aLw1 z8e3aQ@|G|@{UudDRwJWqdMs)c_EiTTl$5T%X|&xwP3z4ppBZ#w1DWqa32;i#EJChB6Rg2PKl@T>3y~08G2wg z)~M+0u{;5d)Y0IV>CXhbY-Zi|sCS|M;}q}Vg-@;tpIGNdp_1M9yLRwPa$A@fn7U*5 z`M02VeqM=43zTjURc?~MsP#2BYrAeGbh&!`34RYFuesNxuM-F1QS)b!=&21WlAmjh zK?3RxZJX{3i@z{YtHO>?la$$baX(&8sa#Ne`+X$fD;!gi!?Av*Op$e&LBcIaJ}`Sa zW18t}^@W&&=7Kbh`DDzdl;Q-vqGi1_k4cfJdtW%ri7QcR16F{vt26#eJg6$T(O9;C;E zCW_tq;A=2S9ApSF9^|dHe~TOIysrc)pMnoRjv+({wLJ=!pNZ$TFW>?2K392~DhXo3 zqOUXOV6wn4#Z1AwYKT3LK-1&v#iBPP&t0J}_6$@D{j6K~4FK7NZIn!re&&*E*J^1^ z>29Ac$};6lePtL}B+V8|2Q`8TKK-iSHGj5|ZgXg7uOHwjnIE*};P}pZ0`JO+HP|ZM zl>~NaLtl?l9=zxe*;hn^K5gJ;`<@FdSD~xAHL=6-6$3&R?VTWQ$jmy(~sPIQ?D{B6|f1W!vKhynCC5Ievtde>REu$+G zjlAaf#F^T=;T1BlD7I_;_$@V2y?gw8kJXh8s5^f3-FXSP<4*^pIUwESD$&Wpj%eb4 zXB^)jp`uNALtFkxVB3uX@laa6M1?A=Te6~+x}LB%*{()K?>y-&9HGD*o7x%G-9pfr zn)3kMv?xiGG-_S27P3_`6Mapr&@{Is2vqS${gZ=(I@R`7#I}927$u+0B(q^TED6st%zbQE1c-GHc@k zMRyQ%XUWin#yiW(*fWof9b7Imb?lz*diBh7zYab4GCJqE<2EZD0@9?8gI8pynItKL zO(c&Ov(xXW#ktO6+l#8=el|F~kM#fcI9)}>YpLWOhiFd*VpTh`b?dAdmg#P5{4rA>pG(n&7_Myxqv*MK0q>8@E48R6un8HZtZdMRcZ-J_b(cdg4Y7q>Fz|grs7;t(EH_( zh(L{jiLccohKw|H8YCJ>36n|(Kecs97xi)SVZ&i^!$0_x3jYf4n-*+41MK7c);bfc zAs;lFV^V3Bq#HO!pL0fkzhnD6uB&ubKJ=AerQDL9D2PSA1fB`HM90Y->NLFVo%WG1 z8=>K3d_ITAx5+{dVUFo{!hMiUs|xausjPW8x5Jgwo%15qRMV?eQ`#89z@#@~O71vE}yX?5{vHqesu% zg!J|6%E#d4M`@_il@~Nx+^jW|(zXY6br1Q7ZMdH-nR{T|vVE+uTztxpqGtG)1M30O z1l0+9zGB+z-iXxNXR%7YplD$e~RY(=bZmPWJTYO0{+I9{w&P-r%{nvKo|3GMpyr4i~TK_?zb?#|Jaz{ z!3(ebqOsol12Fy`0Qffy^_Rg#>7Rt32YM99Cm)K_LwXz5BPLSSnB>G^ z+Hg$9zDqM^xN@a?!W;cQ3T&+GJR)HLrZ?ArB2+&KMQ7KeDnvbKj?V z`0RcYNKi;Xd$q8F!|jrjG-;)^P#eQ@(GN77(Bx?B&~v$QNH?7C@urO$E&k@6Z)-CGqKkY&KUk8v5R_3r6D{gn=A=a*YPhWXP#ojH+tKvoRfw&fwgkU1MTi0i4IW#PIIQUq@A|QyaU$@+I{Xp&p z+ga|f!iNkjd1Ert>UIOUUyft7kW90_VBhM@lO%Z1FB81ua_%=Mr6oK zUHf;hCTtpiS^T^+nWTb&Bb1fiG48CMw$thG9)x1%4wFT^^5Qs6LEoM2b~q)Ciq!CjTuM)B zR>#!>WQ-fEXK((GFy()QDgVC{rub+UKvP%mtPcw1rW;-E?P3u{X1_@Sg@GP$zQTOP`3Gn*@3Z*e z)yVwZKH}C;l4Lb8_Iym*gTBT&f}is0B8E~vwG-4;{)=XlO(f{u(Mc0!*7q3OIB(CC zaF#T)tSM1Rfz(%=K(|jlMT*Gc^`gV|vOaChQ5ogQV0@QO3#TR29L9$G3;>{cRttgK zef-SIqyixbeuKvuM&|aL33A)@TY%&LK(?lAJ#o8*H7&bRzM#@0{3Xy#F$RJ%l z53{=O1Dvp)#%DqiciudtfFZKvuiZgeNLz%#WFthkcT10xcS`zlMHL>xd2?tY`5?a# zo8F0AUXX}Y$~$n@F&Q`rcGdD%)lyZ!YoSjT-VVx=_a#4x6!3DucZ$LhJxUVT#!o#h zFT;oRO|6Wg*?-ifOs=giX84lrJ-BzB)QX^in+;44?~P_ttL(lP+8gJ6O z!lQKNySPz)4rCDI90_88)pt#!0vrOHHaZ-8RpGGowFectQ*km?vQAf(@R6S&1PdLl z_cTGNRr!V&TUOqRfL%N;hl3mR49 zE&|0A*o%SoK4ImgWth##r%ONO4xG@O`54}u3ckq^LycQGpX8O-Z&q!4jwcavy)+@H%Jq* z(Bmbcw%4wC=!ptEl@FRmm#=#5co^2B%9SF0uL_xpe(<&qepk9;1PoY}FH1Ucym_R5_&bS(DDI zPU{P@ozFi{(1QVX7}DzO!S&*`c#WWJ(N_aSU@oQH17|e89G!or@V(+DpKcnX#u96D z`Q27Y`?S`V>_OwU63ln(RI;*pwb42ILV^Jw3jVbA=AXbCRFpDTT=WNW`aRm4e*$$; zWr0ime@HX_oUrJhSlr)(w8XAY5Wl}ERsLEX(r=JbU3*izbo{$O=aq!yKQD;-t%Q&o zcz>}>>KMQpG1kB}rdH6}MT8BaQzUYcoZdi36I!*tcqT%iV#?I0ia__FKt7Eg_u)&+ zBJhUBpp_N?R5HORj(T?6_dSF(^Yk!+tFAoqRjy+CW0j79s@fpDAl_M|VYH6y8ZZlZA6&!dW}?$3(*DXXQq5Y^*I#h23lgS6|1WdXanGChz$UVW6=~uX&N}viCa11WPtEeVcFPArPPquY80%~p*XrC9-^5JXS_+83~(9i zK;|m<(D_C{_!GFtUENLT?q`ZpI0SGhBuzG^cE?IlL4k-tl>O2HVzL?#3r~>EvPjD| zGMERve*5aP#{lGOlkw>_2r-zD>`{S@nibN}5^si6+bJX3ubN3r-_E_`WCYkB_mHO; z>_bisNcwRy9IOBLajkz>Mb6UbPUU%2c6P3u@JIpl-b*oLFCXXbDhHv;!9X05-~z`X zI0>IUJUMQSo;p6zh=bq1HF0w)>E;fddB}JoN8jeL7jKSV24H^_U%IPGrVTACcF6H} z>^uK9WVEnf(SQ2_4-(%+2$`#Rfk9T_l_oowYP_Zls5fA;w=E|Al!yD>`d7J(cFzJc zJ0FeP1f^vCObI(i&`T^tIgb_{4%xlCw0pRJPs6j4B@Q_1b0$?Fn7a+m=lNk5zezAb zUt$e)ec(T&5KRwH(44#^+L2@O9F{ZiK+X_U(e8nr>0sr|>@-uB^IfUwl z?>4Hr9P9u4l9T|Ee`CeX|Hzd76`9h~*bO87ZG2u7?81EirK?avSj(_Tx`kP3MsouD zJIEoL>l*)97iO@+im99(vu>iG{7g;f=6j1^?THYIf3dP{VBVwG$OJdcD4&-8iLfP% zPhYHanQd0RNS_(5FLe9SGmvrTiUH8}ECT-?UT|==GgekEq~Eo@kd$8SvJad{pM3Xk zATQg_pflEX^CF0f7P_C2Pl54r7dnK>%C+^z$S921G><5Iu2ki2`$%3B@HLd>3)8=b zuzkou5HS{Ry%)9u&{h$%@Ch+K|9viJ7SeQ1IaCqk_1HO1A-i}D7}NiN%H?4ZNh1AU z(<~GpeRoN<)Vd}7vzcyd5tYX?ejT%{`4w{nID^x9g>bqLrMC`ixN!DNwLa>*af6>@ z$)(Ml^_=gJy%A;gxgWvH zMf18pobvK6wZY`;f&D_&{e#j0KD$s6VNStmT_URB^c-ZY;c~Ew`#2)bo=VZ^-e0Ei zeLAax`wJ1>tbk3TWX(l&2k+1^BfW}gwU`-adaxSKP3YE$XJNpD*L({YtxS_F!`E1^ z?yF528iW;jqU2dHZCEo49TayiFq2iSi#tIjB&6AuWgNV~x)ZkE|%!=05h zGGPuM7h&4={Y8`b7cQfEg3^=jnyfM|aYmfbnZS(_6-H<>lpRR1rP(wdIMXxHwXo(o zA1E3HC9SUAZW9_i#zZ(nv}#=2J7vdR=YrD(f6-*Gt^T~^2`Yr=ehzYoy0=xo^iiOB zYgHh;&GbQY#t6;jgPak2ZK<}H(Tg_Q1O0`HF`0^^A7C+=Zx{^Z`SY#6%!ewWa3C%s z!v2lr7PH%DL%SN?JnfU6A=B*pYC|iZ657p4GY25bQOBbmM_0sR3y>}iBCbyl;0DQ< zX%OwV6$l72L*r43O06K9D);ker)M=qNLvT=l>PDH2Yq?0z5FrhGu;a3&)V>CqT!== z8@SL`dwAdhVHzKa9iOCf-0C=9Vmt1qd*%ngi)BLWMLD~dKMHTdCJwCo$QRweQA-U} zz7GD?D!l(7b}7_`T7RQ<{{xA9WZ_L5Ck`pda;n^ zk1t`AV&}2M+Rd?N7Z7>A!zH#i%|m8*5{`Rvkp8#br}hPFIRhXK?YO_ry>4R7glcd% zpC-_nV;S?kw)Z z4#kbxPIS$;lN*t?eGtK^5-L*^1&Puz$Op2v2VNFDVx_EESFH4n@6-+D$P9lo_cj2n zFv=$B_trQ^mG!K3@_PeRvb*oB_*jkid?SoA^ko^%*F9%n>{d8e+pvvR>faPeVEs)0 zHDeEbP)&IfTN7hJG_kKdCGyzX4VT0715N06j;=1o83e_R+$*=5^kVL~K@S*%j6JBo zuJ24Kl}FukAIF~_J~t_y)9>VWhZ!kyWuYuFkwwk5Tqro0RI#(q{uA~Tu6Odp&h4PU zEH?a8sOSidfGqSq?a%8bbyQnKZd6Rw)?!gvJ#SuStK&9XiHpHZdmI;8ijV7q6q9O6 zT*z2{Lrr_AWlbw&X=PH{s@<^JJtPSO3h2sV)UwM7mUL92?f|ztD3#% z`VjRWU&0SaL(!Z$6Qo&3Ra{6qIaufaw?}p}J@IO7S$cOznx{v?0|Zp+)@Vd8mtpx=yaBf*ldY=2GKW z<8wxu7qXY~wwE9fe7>s-E7gWJeakp42|B^Ufiv{BekF<@>;GmR9TpFLAup+B0nic< zrFNF0Rx=$aEFY(|4?oC@zg;lUD=n1_%hgwNA#J8LKT*?2L1}xM|NIhhXVVp)7ymdW z+l1dqT@OLI>(d-mbF(Fca4$1aLTxCXj+A8NlBIH9O>)fJ%U^y$3?i>nSy%TAt({xR zK6KO?@)-@Ye@iytd}nMNe+Br>+#`3r7hm=agh_b4jWvt28jqUD(=oKjNh?ekHz?J6 z2QXSkEG(|oU>OfvOpXF#w#SeO8siU+I$FwBOnjYS6ijc$%O)Tt118wA?olr$QPV}iBO1?Bw>=lyEkQZMG2;ApTqQs zT$Up3@eTHhA~eq%YiI`J&94r{U%JK(rZ4EvlzYrR;@81a739-76o2E~y|qisQ~iLV6agmZQowqpO#SGQ7b( zSHLM6c3RM^{?5K)|3YdCud1Jo&mMTS{%oNy9H>k!`HtKMA`_6~_BVgF)UJSiU&Hv_ z`zlMC3^Pleq9vxt5XlMoB;Jzg%LlKQf5LO)U%#fG>n9pBe%B>TAQWF}X_YTIV!D)T zWV9x97meY?9Gsm^g<6iCNd>HrV-g-zmGpH#iUT?z`%+E%ozVE48F7sySE;pDifBuA z2Z2m3fe<~osfCbLy`vDKPXEv%T>?0-Ec<@#l2qlz3mgOkAf#{0>Z1gQ^H^-nAT&Y( z|Kn=eK?FBwSP141NWN*ggAr1Bl{Z;T@o`B(6#LwA^~{*WUN+PVrUU+v8!LBmkr938 zJt&mFdR|wi8GB1qcx5(nsBPSlv+7EI()>X6RoRpAs`m8Z_Jt^7CQ`7!sRMaF8h=y} zk@xzE(s|em`z&eNqvU*Q&zG>F9d8W8?FH*}HwjJc`gp%BV&&84Hl0i^Q8P|t-B!iX zFllt4T53jRRS%NjR6YYYS@H}{3muIE9&pNNvR6geua}I>JwF@8>*keRa|mfiwB771 zTsw7BwfGhJ0gW!2&Le2SG2tqZJ|$0H&d z4JeiaH`1=Pml{CqlZ7(gM>nl%c{Gbmm{btIHVJsITr3rP{*Jc^5t1IR)1)q`80+-f z-6dNv>+@i-_wURu&EoI&mY=&~r?k5C{&f z{z6Q4%~#uqQ7|igy3leU)?v4hJD*RN=-mtg!|LVU@sDkb=DuTZzRnLbLr9vL@^`r+{UsSn%o0{fn=T3|c43RP`8y~Z zbfJnvS{wDEJloC(si_4TIYoqSY9W)5e0l&h6sZps9aZ_sdn^BTUQ0FqnR-$uztg6A z7(DI~v7|&TbWp72bp}3Mkke8p}GjyAVUMK6|J| zhkmCOz`L>L8Y|A|7tL}e?U71s{CQ$*=50TP5qwkWTm41H?SZlI<6J{tV+Ak2o47UU z4H#TBPekw9YCLx$YTaH9UMK?=cb($S{_dRvU|vsng|vWiM_gQT)jJv-s`_jP^?VfH zo^0$_nJwYu*GSG(5zG`!>J+7JO1c_6Nf}kA@v^1@X2$^n+b45XO+A>OZfjo3$u9=A zG3;A?THE>WWtaYB9&hql?>7^=V;Gy9^O4D?9&v&O`w5Hq$`*VO(AsVT(omslvpZYy zU62Sg^eP_}Tkm)^e*Wr(WSGV`LYI`7=v^8$0}JEas0&x1+72v=Fw`yX!hoBN6a)sd z{2_gkrCoRL%3J*@cb7=c4b6ivT4v#Kj6Cb`YSta6`;P1ay4%3Z%MarAU;9aqR? z504@_bGT(P(EXCJHQF&^G{voOfwdjPAhsFKoEo1SgU|j%STnr0y26ooI|7!Nqk&O0 z->WL!P+C}A>cloGCzKzgp#49BJ-i(zs?T_dDZlz|OJt0Fq84|~th?&Fz}aACzof$K zK?)kIQ5BVcwQy~sh1xUY_NQEE#+}RQnmZ2$Wh^uyQXLw7GiCUget;j8356YvVk|7GX;L3QpV&JQPc~{TDg$#tWFxsD>Xr08Y_|s=E$XaL_ zJ!?4`YDtqOE=q@R5%8{+GdpOxP5cbxAUMfbM4Kq13l4Ralqxn+Zmfmlgw|g)K9`6C zC_C9Svefkr9tgAIio7$6Q0o`M==-T`9Xsi$^LDD=*XZKuWyvTncfaJ}ozC<|BMu!W zQ!YRRex+Pvf*_Z5Q~&9Fv{3|B~oY)W50a~7%ph%H9t z>(FnqlKh9nmx@a_hll^b%D>Y}@*m^ufS(J02=#u4P3Avb+uyVD|0-9_Kc|ZPn~x~f z)zRY@&5gfb!~f-y|Ksq)u8)6SANyOY0H}fY7prEemSZ$xb5Gxj1ZOXEPkMluj2w>i zfTH55zN(@Ev1FSF3+oPMw?gwnz;uzeC(tYsWnl`RTaq*m=LvI@A9KQ*x>Tj_o6&wM zCvCEot>iU5jhvEFbWx92`B2kgH^17GM?Yq}x@Ex(92MH}dM3`V~6CmRh2`$l-1ampC-JQ$WR|{ce zHtxPL*QZ90ktbd}jr~P4fRkoP5fKU%QC{}ah?cDsvh4FuX6=4-tTBwTBVY7TWtI!B zo*vva7;^+8U*68-@Ilufe<9;44g6l8+~Y)Emx5GH%od&O(1KQrssL47q6K+k`kl0H zsc_|ydWN@&4Uf2lv!v``@6>g&)4I8?-jqpS%0+z$$zz>B88JbWmK(z;RY`Tvbla%EuyQ_eju51&GyCF4@0)sBz5~zKNjim^mEZlmRv?8>LtCn z9QUKXd_$n~X_lW%p^x$8>u$2>FB*Xq9fzW!w7&Z_`Zo9z>**tl>d_-A9B<*BJ(*MM zE6Z!6tsC$2;NK5sXA|WXdmRz`FXkhF@`)@(H@tR(go zF@C$zifXAP9b=^w+PT&zX%|08Ij?YpYU{HhnjcAm#HT1If_0tU)83m|KI+*@D;lpW zk);4u#?eUQOQMLhw1f$D1`hs!Fx%5_v65vKRge9Vav;)@mcUay zVK?Bs;UQUB*rg^a$w)iuQ)WciYbQZ z(>qo?_^sQ(ST9Z+zREnN9?tj`%a8u_1P<}kL6DoDXmcP9jz7i#!S5{dP8O&+;a&lZ zQ|#Zt#qPw6qW8E+1E#tuw`&GaJIWJ+u%s$ycUhCn{>9#$P8fXy1wK&K1ur;^dI!qk z^iO~&p0NL}vOHCdT=W>xr{2aW^Y@`nub1Pm=}hEUx-Xxs>ceU4HF>u_-$268d&+VF zo1rdHbVY;tB=a|$Ha>StgX>b{lHxq z5yP_C928%q8q&X@ZaY}WHh<^UKF2AsgENXrr$182To*r4(ehe^n0hSZH}DHRTX?fm zrdcQ0!)@ScG% z;yVLqkP+O^_TgUvyWVv1=08R~x3%%3uWkMx_TD?FslDC%1_Wu+LJ=uagAj^h(gf+fhN=`3AT+6=3Q83akzPVCD!r%_DL%QMIp=-Pocn#w+-IMC z?|VP*?3w(RHIwyQ>o=3NuIu`KKB=A1U06te#ncZ{Z$@S}$rxXrmBaqY)*UzN9uR8f zjXF*lifO)r(TM{-Iuos8!3R$K5U}LW|1;p53`g&^j^hQMpwHo1U=dn6s(xqr~a!TBx`aA`?T&XdFy zPZ-?1?7i{WCKp<)qUr^XNsyd*pdV^&RHuswIfd8xeKt(rwu**{_dE_Dj&ZE(xfb#3 zj`gLGgKkt?YWNJHRfg-BME$mcpfkSxx#*5aA|c82p8>G_`vz;!#Q8s$E^76k=(rK5 zmA@6g`}b%6--P@AF^m0OV#&WB#`t$3UhUv> zjl@Kg0ze|QU^dBx&kzL?-xbJU~wMbww!7ry>-X{NCwm&6}TCiNr;86)Qv zuEkohB_Sy3f@w%0d=TPTPc37h22(KQ*T9{pXGN~)FK@Q%ZpODM_V)$fafGB!2Zj-> zk!ZI-!;SYwXL9!P&eI2<-EQF*w9-JivYYG)rgjZotG`HU5aYQ?Tn&Md*C}}V-Dbx( zM&o8eR-rYr#ZsK@C!uKyZLeJL+18$8{>h<&FFUxi4o(_eAq&E$Q?7*Dd((b*x1y>E zoamK2<%aI#0Of4sbxEh8E4liqAKrT~2V`Cn6R#_3`;<^(LYC~#%hMz%$SNF)A%h6L zB{@zuAYs5w*KIYUimPYBdUD~OX}hy6m3>$UZaRGkT}bGF2}hi1S`u#ibf=(u~}ZD9Bc z+U$H_!Y1&R`@+w>TP7;9*{(&z@qu~DH{+R7+Z)(|Cs;4;p@ax z_~FiM)j|4eJ0zs!v8jJ_?n7$b7=>(3FZ=7yl;s9HJoR6SkB@aUn8l1;G^L`@J(S~9 z4$Hf6-_i1sd^b@vP+7}Dw&qz=gWQ{SDBLwE-or|kzFPraPK-j9Rf~B({6zxb$h?+d z=N$g(ezTxV{nXKslyyeN#&yxHY~+{NhiMLlN9 zC~BIfWd=6hHx#W133-#~I&)~BMIvT*Ah?3_Vd3oFfvX$Y5*7m_C2bfBdeXE6V+oVz z>yBo7udBwCQyYUu@z2^e-37H2r-dn+kU|a-tI1%JE;~mn6h!60JA{OAvBDxBusEUM zQzptP8Su(ir-jIfF9wpF>KDgcq~-Ma$DboXkQ z5Cd`W$VHp#@l~(@59NZq6r`nDt>#dJaPZfIg4Pc=CSG#Xteewo#4 zu!^0J8lE&`^+D*Ts!ex}g{9Hct&Nh(R7?cKr=dtnB2DChKMx=d6N9#vTauW1a?U9> z)pZ&6ldDS_O4~si6h27G9z&!0u+uyw$=(QwrQ+4`xxI6_bz&}EMi@)ZZ(KNW6-jQ5 zG~jd###0-h9+2oaD17Pk<>~O=KrB{Iti*qENczbEfrTKC zOIb@<0cC+fyediL31}YuC_$3I-0LfUvhL~G*{q2hdh=t!Je>}_SMsjeqN|IaNw4im z35Z~z&TgM(^1v?`e4*ZO-}9)rD-uL1)>4Ri#WTZH04Ye0p=G|j zYYy2t_eeg)i;#inw*R8`f`Z2L$!Zf;9Ob}AZ8qhv>$b&c9(Yq+kqQJcvDrL`YLR{@ ze^Fnn2$tl#THPNN#ZJPQdYRQpKr40_Hhm!;fc`{LYCGs&59iEomUOJ|sAdk-`;u~G zoz35M%jkTGL|vzzGw%716P!_2CWnUhNI;aH(v_9-!d#?&L+*MQQ=PH5_sEn4Q3cF` z<%br?EWcbcLZr1_d;kQE01Cp-nVeiBvfT6LseQw+o%xRW+xYK0vo_9gY$oZCAl6Z1 zW&}%ne9?^PQ}ulsFm+3Tx+Bm@5GYc!+B|B0(yUQv#GhP<7_y3I3v?CpH)wj=w4dXi zfZaU*La?ogesR}QzT!D|Z$hCWdkOf#-9$_`+YJdt%Fab~+lL#7I&UjzlB1^tUo*7fWZne>qhE1%XOnWX2JU-*qkp5yxVW%qLQH?j0tFO+X zmBO-w;8MuPTf!nJ8r9*|A2|C(0@wL`_u{7s|L`o6;*r_Q#)U_NyBx>1TCBqVNv*N(Ds972Rbm3&W>M zZ?S56<>Rw6xsN>0_KPc1J5xB)y1+$n9wf3FjjXdvYoNTU9#zXH{KoDG?ZVy_JE}0W zB$*wnX;=KA=zDDk0!ifOX$UeL$^H}ch=1P%{asPAL`LpE058rxdy4!+*7kQ|$v-N7 z{#)&p|MB(^Gt@zYzmpsD-w?n5v&n(q7f}6g9OQqVr8DTA+Mbp7QnMpGW6D#+vb<*1 zlNOvHSPptCY-LBebeZ|>Q*EXoT7NlLTlu!Ls<<%z4qwP*{yl(U9$5td=0bba3J8oo zg72Q5vwA3zn7{xu(K8EqqzGd?&{}W`Sz%+z>h5nUF4WH=&W;^B%|`HPb{sKuV?;#E z`o3vW#vp^`Vv!vWB$tkbCM+Fo<;9mN82}^C5Uo7Z4K7qIFNvHfC;faH{1l&KlTRFb z^#d*M=-giWWreap{Yk8iT<|&e&lcw9d(+&{{G|9sX$r;nE>&HzORPf1h0B)&&#sr9 zYVYTX*y=go9rONNBi^gh^JRoXw66F`ro_mk1Iei{UNLbQ&(K+vT3v%s@K^FvI;d)K z2cSmp2mBaC_ZFTx5c{o;)#~^qghl4ErJsfT=?y?Pd z?vkuw;Qn-m1!BTVn|%(gar2tsU|cL z(Y{)yYq%0RD!eGbe7P50OG%-u6pF3jV4-0J5?C;46u?>=o6tnL;I`JG2cwyc@(Df< z2Ls-s?dpXzYFpY~bg#`jwzuN3Vu6gvw|1MQ(<1X(Pr@JN<4d1>LpJ5=#31y`4q?hg&8pD|?#e*mEo@pgq+^jVHD4FE9BhIeI_&M0MvUbR z<9=KjV1Xi~xvhQn)w@Kb7n)9Voul1mVWya}XL-u|<;F3Zg$5-bZRvr^H>z{Z#+M=Z zb?q@{Ilc?)1s4f}TS5NL-)ua%VK(#>O9JZH)`l2e(^KG@9!u*+XP`hQ6_4OEilWE2 z%Xd79%wO-g<1yq+acjf*H$&*Gk6$A~+9vE~=X|0)iXhD)>h2HWA$wm}WaW#WL#QDY zLlvh-j!X$rG~ftL!4RdhnV_2L15$WHbqXs|NF@rRjfNxG#6)^r_sCM0cJzwH#I+QMn50tTx^}tIVj?O4 zSILcsdkxro*?mVNl@@Br%SgGfJXvXWHA`p-9XRE}5-hbDuyob#$26E`Img(^(8K~c z=ANw{E0<-3b7P^LaV`5{`uO3HqoMHz0%Q|uPDN@KL@R;siyp5&JQt_8N!R}&89uMx zZ)j5t9W_;m3(H1!L>AQ4c-1y}_=M>^3@};)QFxn1U5Ar#@lIl~2R1RgHiCCgG=O&f zD#`x^d|3NWoCxRJS|Z0aht~@Lo%EH*ttnjQ8=q-axXpO~w z*RzW*XYCq+JUrFZ=LB2VjQi^7#JhHbmHYFch1>L78d+%ts^J^!>LFeE%tDZib{2a6 zWd?jUL*HQ2!63`X85Z;k7T#FfI{E9b|Kc!ia$y1NDKjD;iT9Oxz3G`oxCl?0~B3;IHx zk{xRNokcqV#c$JKGu*3D)S}kU>57KKyGkwjKEz3V7rdl@z>bn*c+u<%y8W`BUVENJ zFM^->Bb+^_6B{|EQHr=RHcutR!6Gt&`g8~C|kiV!PDCP2+>>3Vl)heXQw zPgb{|%m2J4t4d-(_=D154@TT|=GZ?h+f}9d#r#aV-Z=V)K^e>t1Q-t8H6$W9Swk(+ zZufm1blqdGPklQXI65$HKH2=5wLVt}4*}DG`3)m27FSr&y(nuny`dlA*!1zG(t3BtZ~Y(3|(onxfRTJy;p$ZWK;Nr{Xdhk*I%PSdxD zy;~;{OQ^A_J>dhAOUi417}uMMoKZ7xLG767{Z`BQJMX}H*{Sa(&%aYX5N`NJ*R3(B z*~Mvs&$!-YW!CCI9k|+n<)87ECyqzBV!GEo1m9TWB*CwgfEew#EBDVtjR5tn6W_~w zavG0a6cUas;wQKM4<8~1{Qvk3ZjZoS^$&ig28)QX?uM`+&*G1MoB1QaDmLAYW!^T1 zd06E{`>XppevA4`KDM|{!8fdW{ZiNYbm=so{#eN;ZLG>n=TcZopsv?ts5KpO$5EKt z(?HY>#LCDM4L3e8w$-$J_ZO6&2kcz=%({DP#B6*dB76b5330f)N9SQBp2in6y(ozsI8S+AOTp^h)S{OuD(Qy)#n0f`7b%*-rO~ z+%S5{r;Vmee>X16?#oIECsM4>)hGl{17(YfQg`($Y2Tg=fS`bML=k!zwz7bb&bZFf z;hKgK?*Sne1?Q`p9*pPTY942Z6hF`%n5lc#3{4GHsKlfyn!|Hc+XWd}(n$KFg^`*F zV5JR86oFy2MSY%ipq8jzB5yC&FYg)gSSAY7vV+BMOXkvx!q7%k<*VD!P1vZkTujro1#daSDEDh0`d~zLeiX-Zk*7SNtl61`5Uuu|4$VyH>_$hBDDsw4w0p~PaB9IXk`LNGjqj*{p9JSzSkmzJ zvfYUh$<$&E1l8A}TRm)ytDV^~)$0vL^Od{A;kEdhXP$W*v3o|YKw=;RC|U{hcH>R` z+nm(vn4dwmCrPwM%cCL5dW~>lk5`If!mgr*x94;XD0sRzwt6g8!6_Xs)3wtuSUmru z8osWXVz@{eu=N=m{!P1*6fKqgH;Br;_S>`m505lvsG*G1hr=rq4hpo6Ua!q?O6(RQ z5!1yHv@Y1|lf}u&^%8wA2{FcBPKG&L!Krew=~uACkt=u?f#> z6ax;M8%9CnyP~jwsug*4ZdPM0_&Rc}uzGI0mO!s`;IJ0V(s_j=#3d(#TGfp?=z%1BkiGJ0UW~P2pu*?vEu>b`Fl<4KEhxoda zziEz-PDfiC>!+3htyKwM88Ka+cNDSW>92Im5w3#rpu9GBiz<-D!>pI45tip@0a4$g6?cuEX^fELu&}%JWg;T?exq)h2U?!a;_RCFoq!+6fT9yz1KW6&g$= zH;Z^G%)8_Z-BLs{tt$d%YJprgztXxykb7$TCVqn=^Nto};61JJG_e6Q#XSLE5@#H4 zZI-NF(b2mX53J@y==wq+&{fR@@i34QNPsm*zIhqZLvLlOsHk1jh#`dGNWGrwPH zQ^a)>8FV$9)nb2ow|X|Dvgcm2fr7{M`E5B+&1&7ELohxtiSJp({!>8*EgxT~%-o zFuV%l$r`9PCJF-Fp3iOQWo$5)wPdhf3`H1RTeqz0x$<=9Gu^E^hLMNYwx=xtojrH! zbnNpTqU3J2OY%0m= ziGS_4oVr8jh=g1o2pfpbaM47KieZL7_q)rfi6W!O#ZK>837W&&yT&`b!30okTAti% zZwn!_#zIRd%;#bUSIZPl(~^s;u@mxxTe+xyf0)E&MglY`@MkDA=c#i(h@_#BONk4q z$p)mGUXV}5-rNOkc!>ZJ4Rr+sR}o14ixG#mK3)n=x`xxTFB65$;(T(KkU#g&Gw2*n z)4ZPIOrQh$WczEQC86Ji`rSZW+89BLAGP%kxi%RXH=!ROoLLl&gWWhrW>tTjvPDO? zX2u-xP!W<`D~>P}Mbydl8Ska?57ei7FS{n&k38tNB22Q4HpLimyUjQv*+vTy8=j=P zX>bc;>ARlkmI-v!y21eTn(ymJtWmOC?`PLBU95diIi>=-XjwKAu__b>FDp*!8FN3t z-6oD1kaf5xHr+upIaU&5kGe7C<6E@q40S@f2g3I80w|V&MZ2p0i`O{h7IyT#kE{}L z@qTGmbC;fG$EX%bkIITj&t?KC?Ah&?dXc*kFR0JAM=%&RC--_?Kau^zyH9X&!&mJZ zSy@B#o0^M#!H<*d^DGAx)wP4UBW4meBDGt}5ytPrmG|A}xX^Ma79Oe&aRcyI>2!YOE=bf^V>fBO_UtY_(x>Fno6Hl1$dBv5`5 zM^`YNI&j-HPsF376!cK{WA%p7V!nt28Ep2t?B-IH(3?iiHzpYcjd#?ot~cb{zwlrw zTELBr&3i2|A4iw}JevZ8-7HJRI$peSKXy)Q^9rSS9!1Wx_R#jWCr$N;1K#uaY^U~V zXBPd68y$=z8hC^5Qst6n38J?;BP3nh^v#z@hEa%?~oRAXfpn?x2iG?Tq zn)IO`-GRfv?89X_*peyEqXD%i*X$_ZG()VbnnbWA8GG4y#IJeajAJXa{5%Ck3iymk zbbLFFMisH%70G8GU;9QU?n}av=_Rmz7BoiGDp)oochd1w`Dp|6n8oO>CYpF((W~N zWN~hk6Ee*fQKx`(&!;&GftJ-XBSX5%b(inTopjZUj5XgxSB%ho*?NuVW z)G=CL)?TDr>QNYsG%;$u0Pn6w}(VhbuhTBC#K6`x!Ey1 z%oQ&yT8g*?*8Ei3{>2vBfuA!rpJ((xKlYVJHiqXslz4LGlVOpWfmI1?f(^!)7LeYF zKOdrqSWX_v3&Esm&J8+dcL?2ge=zFgDRTLxl~_YY(lb(OHI!+AjN<@MJWpX!1W969 zcX~+cY1G(Ub1}wWiBEpzqpwO>Z?%|l7tb~?xl9bIVN%7m>Cc5b*nVBg6=>f5l9 z9f!6G!~Y_&aZVD4vs8K}#RD$+K6sq0Gmqd9qUe&@jt z#Tb`D6S>u%K>pSIBJRQgyG{jyG{KxprZ*P5_e!kzHunN7uh4YEb^A_D)A_N9In*8! z2VKfHE=j=Sr*!3}EBj_HB=B`kGp63HJk^!EWZ&(?<+#VL-_2h+`q22NrClw4I;a3Z zdCJjIao6v6z;XZA`Q_ggjs1_o*ay$w$o(N}`#Y=d9~HI#J^1j%ym;G}-)Xkt-;m{7 z`SJgQ(Esl{@$he4_kUo<<2OuvNdG$}lYOf#=L2yS9J#O^F>r43Ckr8~B+kvQMm3pS8S4%CX`cr~U!+M989{{u z0@KF>1&$3_UKh%~c541+fnLd7{9HxUF)cOa zQ(IIra>A@cr^-m5ytgA$f4z4}_1i}v+BBW>1TM%w-+^Cq6Vu59gp`Y6p(Y zD@Kl+4ftihKV8r=}$YdE4p2vri_`sf}r%RXXXc2uYLC z@7*yK`ED0EidB4(dSbO3<*#Dh_-H_CTKp--F_wjDCGTtjK=2J%2C>mSIm+eV z|C*;g>v#9ymFSbvv5TQrtWjd9m43?$A-UY`un9UE3Yz4tXc#mkd0L{PU58V3e%`U# zNiUMKr{%_@)&*TjLJGg-UE7b#Pj+gF9$y$*g-UKg@&LZYvO|0nzwwCxZ+gTq*8$#u zWqN#?!6(J_n2VSfWP42c!}Hdf*wR42_d*(5&m|S6C31#jRkD%Bm*a;`!TcAR zyHD5g+a|WwLB7R6*OuEewV4v_IZJNur4+U@=~x?-1rvfFSdNsp5Zq+)@GrpJNW`fq zvNMcNy&zeQ`+O_6y>RPNijk8U+t?)DM~Xvk=ID9V2X9(P6Glv@%Uq%mLeHJEbEmbn2j} zm5|L8ftBh-BxX*P3Mh52>b(7u)@VY3t)5qCe6$(IPq!r+SYk>C)rDiz_cXQ1Vyi#a zUY{x3Ingv}U+?(o=lzRh`6t85pEw)5fAvog%&p`bLRbwMz1rzSbjx$tC~Ca_SdL3= z)ZD2l!IqZj)fV>m6Q9Ghd6&@joMd*Xe<@`;`EY8OCHDber=HD+T*`Tg%1P%qW zoqgQX2n^hrxYsQR$=1Sk#v30!-?vll*YIquox*?ap1s0K&4T={*XN$Pp|4d|#aoS# zHuqHfEL6F~_AXBJ^fE?a%379Jbn{aYx3m9YRP?Nxl!%zn#m!-bBw?2EkYoZXr1j=& z3P8~{6PDXcy4z{DN)3l+Y^j(xo5)LC7q&+sI7>k)*H(;zm?e|+gUnby)g=kZ6GY`{ z*~x2{J$;pFSc$B#bGBX%(R?g$**ZQ7W#63uu-00s->WrQ@pcn$HXZVj_@LSR&V1%4 z1-0ZMsR!%zr<|TYTaKe?aKi{En|IBQD85_t0_BZ6P|b?oX!KD6#9kN5Gc`<(H508< zO^eir8IwY5HYY$D?}s_{+xYR*(Q7qd)1MMu$b?R6V{bZFE$C=gfF;W@M792;#4`Pg z6FfJm9w@VvFuYns;xbElmLsogW6(@Z-1H|cAELyKZIX*bvPU;6Y@Vfaz#xc8H-%4u zqEK~-ZZM`HN<2y&pT42A*s`gx91kgluZ!`~AXOG|u0Zkp@UHxfJx&stVHfpFGQ`$v z;Nf&EHC+7NoOxn$-FwOD0AUx)x&p5EBRpW$&Uw2C=6lBk{L-tb&B~R4J&pGse79DO zqCP;)<4j_%#0%7lh@EDlwy&5xdWFtStiN>cC)WaYcCkWlE~~8tt*-x)3#17Gxg^{P z33Fc@$*&Ifc3Lh|4_XCuM{?scmJC<*jMTQTT<96S#xa&0=99-uiW7N z>yOp@dB)QK2f5sQuL(|v?D2ojJWB)Ig$s(8W7xRfVR$2N_iRrJfF4b(RyWG=Y{%Z^`9)&hXXUh7D(uk(fCYPB zw9=t)6^b5P^=HdWdpZLzp5r0gmYW2v5D@Mn;&MqS8iy}TK_@Nf<>HFLS_YYVD@#Ku z*SEv%pRkQl`r#k$?7t_~>Tp#Nz4>FUqF+bM(vdJ_`v~1okYQ?w$&jAr)Hf<*3(&4*ecxAEtX4nH)d@%^o6D%&!)t8) zbryR#QO{=Zr;aU1@>w+dtH>G68$RYP9`B;M;~JDkY|hzMK=)s+njSvCTDbH{sJkPR?Lgp zY77#G7PRdS1r?W=c0?^rcI^^c^wBZMnxa96Jl;zXVhCDS`gj9(Qt~IqNv8@5{V1va zaFZ~>fNr!pbW}B0NK`vVJA9ikEESitdSshBck*Yp^lnjxL-cc*<66{+Chre198dC9 ziz0(}!=|3TWk!&Yu=Mx%I)DJpkh~mi1ApYkLYd zcS$aD^M4cwrM0%nAS-pLGqv#5AR0cXdBl{n0XigS%C^0KHo@!3zm!VrLw#}R+w@*_ zzdL?@qx|uoE^fL0v#RH_*zLNCAa9>3hXyORALESxNbTwQ;a^(Vem{~l5N zOAC9+op>##*%$v~=28ahU~q0v{)sySHB{4?B9juyU)Uj7Yk$#Ani1No!&h~duLsZ zhTS}9jQ&p+Ut5v?mw7)25rLB%5@XmQZ%cdJ=n;d&jWMbN>c_T@sfw09A%z0@b`Wj) z^_l9k4Y7;CTcXq4QWH*MVi}wx4uO=q+z?y#~@Vo zyIW0G{mg!jlFo@;oqcM$AGqKg##+mp!e_*o{k3nrSX*o5)jt`4`0(z;o8rD%Sy{Dw zwk~^JE??>KXA4C=?x}Sh;9xMO**-Nn4}*^>txUf7N&awJEGvco;@-}sshtME2f3B^ z==Ah&4YNvH>}KPm*o1bvhD*28{4|xm86PC;scE#(x>jBsbKheOlRtj0 zV?$`83Cs1ISQ~UpA7uDEbqaF*)GNz|MImis9zADzg&d4j;_7j)%`O3V#==9gB^tQm zRqI6c`Ri!bH(TmgWexS5C8lS4^upg6!6bxZzCzv5bLQ4Ks2W9`UyVxySp$tj#GE@r z$i`+vjNt-`Hx1`3O3~qyKOWk!J?(=kF~&3o?#C9s%oKvLiLr^S(X~Ww=a1%7i_e1$ ztL(@lE6tDHc{`9gKY`!79d*89QLhWnN+?8hpfPqNLBdm{rpcN)t#4$1kraIpS2NRD zJqo%*l<1rWsh!6EdF#!@7m$B>vG;&nQC##XNG9MYPN92Qw@4@R%2=Iry6~F=Pm?-N z2s(Aj*F_-$fVYvzuQx>#OwYz~{#y0Mo=~HvQTVf~L=dn|NhmqA?1N8GPI2~txfcGs%kJDiRVi(AI}gft z4=Gg>nhP?>`b9GFIcS1&b<@_nzT$qG!v5X-(Oe+RCU#g*E4k)8Z8F+Q#rY?iFfe~Q zo@21-M^rWnju(wNF-*+H=Pirfyuz4I2|z+;@2QBm&K`$~5S5LXY)K-hl#TS+g%wJ^ z)90Hvfa&+&BN-%5oDkzVIxsHeJ**DVM<&ckKlYlK(0U=>%Mv|Wa>GF4IK08JxO%p5 z3>e~|j-oo_bN2euzamCJouzJ{uQWZZtuOJkPYyOjr(O#Qqh-k`;~%Z@nRRaPWyGQDEa(@w|z()Fo*VyuJc{=9;GUpkI8 zwM2S%%BXAJOc#^GUQYtukI`PIvNAij6?phT^20;R1nyet4mxaM7Lt$XIwwiZ7hxw! z6yx!3z1wx@_w@5k;{@P3H)J0UoE+fSK!~cW*+gP%4%%?Ymf2q<1BlM;o=Thf0)3|d z)4a2Q$#r_^j-(_SMwHNK`S^u>^wxX^IJeOi1gRljF4BAKB+9BDJf3fwvo+=wgBncP zjl|O=#PB*A#qmrI2iAPxja+P_abWf*}15A_4?CUmT}7@ulb}@hlcrn zS`DJNPk(-P-C)z$5^MB|YKWufOTa{qO4OGb73TPg!6@xY65_xFUHPq#|4oGDZ#g`N z7=AfD`0bUvzwtW%o3uuTW4pRP#sm7=__5ftvaA)j0X7xC*m z+nYPdmrvO|*XU>m)shpuv!;VA95ljStp#8ko@ogNZ2xfE-rRO#I(71#qL2CTE;hj@ zYbnUwL6BTvEno~EVnDv7c`(~BhC{Y54`LPfkC349D~0Tqy;TAUSM>@Bt?qZ&@#6f$ z^qgcYWXa%URo>^0yr+=@WDK9q=6;+Q%!&{C%{o2i4)jb)>) zNPP9vrPFnS71aMd(DD-Q3FgPEbCNNil`sf~v}Z+wYjT=*p38TCKmmCB?{? z$NJpp1!|0WpJ#3w%1PbQ9G_SXHRM?gYYJrh6yZ#MVHXR1*r=$4M3sry@nJ~f`Arg2 zv4!o1F&84$fnAE}5<*S_SW+EmzjGY*eswcTZp1t@3ZbTv>W`eM*`jqw6|du5j|8o@ zi(T$#?H#gQx>bV;-eW^VGEVgYPD8 z#Gd7wzOWqGk)PMZY1@iQsw#~fC+gT@@U^~|CD?_X@MHB%lB53^^ye-a?_VW2!@f4h z{vv5qz}u7z#zCygr`f`Job=K+4ZFCsmPE4KJMN<|8OR{t&1LQE*7F&29fImx*nh~g z1sgaNJHZ^9rJ*#Pl3iWNghd8L=Cj!%h>qCkqAU8qcy+sF&6pE&tHT2%O0DkcZMYx$ zg}+O+jtEalAX8#!F;t4H zH1cbFSnXuO6`CF$wp zNgRLrMbF3n)9G4;s>#J-Z>z+{NGMb)K-bL*1e#&@*UMT}xcu?s3SbxyW> z9CJJ3T@_5hrxxe|>?P$78GAO3KNZ$eLohL9F=nk^xy@j*cby>&-)pYFYznhLR1*}5 zMcC=v_WG0_^5Hl-O+aRNxH*b{OlDD_Ogl>4cK@6+i`Rs$_`vU2IVX+{s> zI>rI31rgv!3V=1hz{y^=2ujqX(OTgs+oqPO&Xwr-DN&En!8J=XYCmZ-!F8MK-)>4~ z8Dhje6TGz~vaVj%o3WApP!Y?=l!3^$&A$UTjncxE+1O~M-FaC%m-tkuY|_grt?se07N-?w`{cMUoK{dvTW9Q|c)}1S z>DKNPWSlLq+0J_x)~n3QtfJF*D4^6Z8mlz z+Z%rn^74Nc+#sfMh!ja8bMf`@f8C+^``h{VEB<#gqSya8!9&z5`Z{m?O+z`aeTn$f z|Fbq6apV1S6`Bl3B3Huth??}^Zp#*=h{Ub0PJ_?HFmiXM%T@X0u+3dxIFS$v2yB=p zF`*k11IuQ0pEGpuMk<^S3ILG}(YW#mljsEB6Tg3YQ_N*t~3iZW=aYV{*t&%mz7SAF9DXu+Ju? zsWN>|Tr&!!dlp!^3GQ4B&$a%@bOYDp~5%{_Go4(6cfD%pN# z_~&3}5Qr@8dw1QIS)jA@Ov-6sfK)-VWdtO7>vp&yLwn499KF)LQ>d@5s9Z`!M}1A3 zGiMJOPWRPLO7eq|QZ=mc`i(5%)aeI`4SOpQ(J+U1o(Jd&miZ=3ImCigHDJ}Uh%H9% z1w5yf3+n&KLHTugcM5Vep=8_zOgW}OSD!n5el+p9X+;s!#6{bw6`>n|Vndf7=?-Uz z1WZJpYDY3ELr7>1KKohCt&>O6?{I!AAv78Vpw2$$r8VsydJt`tG>@a&csrNz4`fUi zj*^urlAI0j-;gcCA=92zo^?gL<@ErTF#2c+x%WwfL4KOhaRY_Hh0kw;-XWxE*N@cj zUASsvA_v*<;#NLeq)T4uQUWB68p%S~VYo?mlz)M<46Utpt(FuPM17awYAMnqRcCuzTR1jilR6thKc{n4&#(I@(!2s_Hp3NB#^NwGT@B z3taeH!G%wAJEfW@EL`d+NF81=@BSh=^q!Co-1zg-9s?%uK83kkB5;mW*?~d>rxbCf zm;&l+jc-_SLk-SzLHFjek&w@8?^f9nRq4M)KpAZw zn0qK66+F1f_|l`e^D|IPt3)%lhiRGx9jMoEc&X&ZQ2(9xR^gHX^zN|j-3cK#ecL%* zzQRFzR{k_rIqjl%;0E`#PgAN*iO)1QA}PL%)|*^!@S2@Wcsu)(<%(dYWbx?xWSTan zKpCMcPhQr4D*gXQ5@r_$n1U_!KL~|JF0$D=w6lmQ*dp)c z-!squK^OFh#yurq_G`w9QqaJVz60(u^7x9DRorQ1tp?Bc*|Ry!c9(1koI^5>sVvZY z*0svpTko+l@ldL1VBIn_TXPiJ`+0azk9%|&1=DZw-sJL;TIZhiWq z>!HbC2Z|kuX|=210EyKj>LB+r4QIeAI+nAI`^U6$GeJbhU!z23x%m1Eb4;EI5KFy~ z5AG5YrK%H~>)!7}FA^PpUk*dbsQ5p*6Dz+NT`9I!R0zNl3^qkW*4zprX7;PH};Pl$7iO6FESQgo0U$k6%Dq-Tv`KmK!h+ zNh3QsRWK?z2|dahlAJ#@yhtf%{BC!Tjn~kfQKsNk6)>g!vXJb(YWS~d5-L(sl8Y*2 zzeuVj&t7rv)NtoCU#IPK^~*FEx(ijidh|w!rI+@iNxr@6WOULKDze+Fnu#}!!c3YD zWS0U5yR=j5JM{-=D|~zi!!q6B-F|N?cN2^JaMq;c_aCNqDaj;UNiHUxv6TJ-dp?T5iD?GIL(hgD^1mLJGJZ_|rt(#?;C7X7e(6SZI8U zMDbSzg;&BEWtnyb_Kfw_IdoB{ymcMP%EbMc#<~VrtRJ2*M zlV4-|d(~n(5p4Ialtzj@@tLSFRV_X`M7^53*iw$&k>qZ*ciQ6O02NJHtTM=FT}Yit3~W!OXV$_C z*qmMS*0iYyr}yD(+qkwOsw0-CQN;i(E8&>I{t3kqg3oc}-B>CK_(m zB=c~66S!WxCIEip8MiF60=0oU340+aDJ6q_J>t6V!OCXtBjz~TD$en9Q{Fa=8`B-e zPw6g#g10m@3_FsIyF^8pG{TuK6bo0Fq!~zarH7Kadn1=#oOwjohrMI=o@WpC(t72~ z3ScbO7LHz1_YTP`=;JMBl6q7(&nOR`0LzDMFg;0~SmECAKD?jr9k)DxpZce)@hh)R z5^rJ0UOo70p6zGMi2Ai(B%dx%e7*jQWGgT_{)~C)Fz6Ra(%bDo<(}?6FTbDS?%=GI zmWqbJ;hwj%6Yw2>oBC9`4^4*==O$eV>;g#|qXH!t=xH;0S$gy$Nb3Efn_oe^v*bWK z5pR?*5ZCwb8)WHI!G@?3ehqv2%#>T5d{s0ZH)(kJ>{!e;&(@xHbXptMzkaygOt^a9 zkiKIYc1DxOOA}3 zYigV`O#VKHHN3^d`zgjkJ|1B zX&*d;N8hDzw8~j&9AskVBxQ?K?*YHO!U{9x=L)6J_?%LEmQCBY5*59PCCm#fE%2vD zHK!)PbF))`O`;nEw7lGsp%Vy$d}%E2)k{s%l1r}x7$?Km;ZRo@ry)G%==IY zy{WT@jk-&$CToL<1|O2@(%72??@{N$s`;?5t2(UP; zNSZM*iF-FM*C$dCA~|+TLz-%_r0n+Rx~-}HgKf)iv5l;;o2x6Br;_rW)HEfBE{}Xd zLkyF6ld3LI%O)ps!KsIHTNXuU_tY-=-?+C-t+9X>g+vRIDhPdpl09@gc0C`Qc^`5Z zw^E4-HgMPH4`x>Euc&^WFTlE#oo+##q4|FTzmV)){yIDu`uTxb9E9^ zQhn$py{EI|ENftK3VQ4^DHGd+MY~tLQdQ%|a7KMu1MqCRe*e|8bukZ!tiF^@if3i(|6QH+|LAME!y~cPBnPxI{5T$Iau*$AHq#+D?GUu?p)aL8~-Y zrM0b}#aDN0Orv93di}ioY7VUh{kcakrz2jox=t#Tjw@VxA~AX66*ap^R+YwZj9H}XLs**bLZv zJ2MS6?ev(WIv0{d%n}Efyns_zM@oIwFv)w~PrWJDeZHEQ`BN0|(Nc*PBoD{`FZSLu zs>yD7_zu+&0wf_o=p+P40z!x=%@R@|K;#Yq6cv!FV4+D{JLIp4Fd>)JarvuF1FW;TqY$t-PEOE{_d zL-JKfgzqzT3XJeoJZBvNB)2FrIcWOXkd=7_c~Z7fRCxhaIwIAQF5$6J1JYge^rfxz zKM1@ZHgNh#!K6E?pkOMMm||5_I;L5_D%1?`L5XWf=);XlMTAWQBstp7)tQsJ;x7br zHy(crYsa9n?W3YeP|63QJE#bA<1#Rsf-bO>bmg`uMkUp|haZyJBP10z5yBDtQ7^-a zV>h~12E74iSI$bh0!!cV7nREL#Y&#MbHFkWEeDt@i=bA{w-c7wOhm^)t=#`6(P9Xlj6Er(a@tYR))5M0|Vo}dw$$rRpwP&r1#nPMiyE7esC z**h-#^h`L3yLYM9;Lv+m@vE>jm2WP16{vWl2U##6fhwBiIoVqu3E~XAG6gU^RF!;#TG|WtB9=Pg^YS|2DkRHTqOzLHv@+k46u!*x=K%E2Xtu?q+ZBM1kp{xG>cLNdM^~ zW~>7-J~5u){HYbRr|pD6CQ6H+UL$uhblhvT^v*}!oX{ilh@V3rVr_%^_AbC2e247P zzTmU%v=F4y9Ck}vo*_i1ti(>9ky+J?m=X>XmYpqpFO8vB=(hyo`}pTJ~QkimU1Sq1V4HChnZ zO{ark3t+W$5OZ`9bCE#pxdmMRrt;jWe(8rHcUBr$Y$j`UzNBoD2|<%0((0A7M^>FS zNrP6$W4zWy_WuyO(iFO1_x!U>PPYZucUA%%W6L}S6R{N%rd+XVJqNPTx4xl0yuED7 z`YNVZtXn$etSJI-wmHS`6h^#$(wX?ACMWU%Z&10fvE#Cn`7)S6a!%dJulKXASvp}$ zTvzM2h%_n{WD8G@zI7b;g5sdd@H?Fjb5=hHIf{2`LpJ*QTuZ$Od)C(DF-o zP3&H*q5}~#B5I=jDD=C5%p4CmTAlD|GYbEdQ%$`igOPa`kFz~T$vh#b77VTqDiIae z2rV1>{qCMh9f+zfc>T>7KjEZ|bV*J>maG7gwH4+%pfJ@mY|5gh9YT0Ec>3Ytu8mtO zk+J$>GV-bcE-5Kh9SoX%cLRlj^FeuJ+ebtca5QCr0EOL)VKX1)RkN&=t?O&oHDV)T z;!GCD*rhMS5CWW-l{T#P6)jNB)3E$n;{7b)rtH^DFcP(`I>NH+;D;K)C?VH3DE-xe z$~Iqs4oHwb6ybxrDtwkndF|sES99F{V!!h6&#Z)+%|^HQT7S8`0j~YtF2I9n#nD(t zs7Z&gT}qY@C#)RpU{AYur|&60xb14Qv;NSv?(Yfp>TWCZ4ep@QO~>~sXu{7jc(+ze z!Dl38_PxO4!JPs`pVg=159S)*WkZ?h{7}C4ft&AreX0gOmRGYJW$DWFS#08N$;gVQ!w_5F92 z)}xC1(Mk&apA%QBO8E%aH==AFFkelJ+a_X1|Hdsf`+axmv$u$+e(%dO(}OqT+L>$L7w=LeglBQVisvVMQ zneI%Ya@MA@-gbifHn@E{(f!z3Kbg&o4v`ZpFZ*zkSKg;#Hgwo1PgwR z5K~&@m?K%t@$QZ5+cr}NqpTOK%Z)NEBdK`1Tk8Y?(R~kU)c4*m$v^M?xHW|O>3ClI zp`r$)Z%?Jk@A}=HWcegYhb+E5kYdh97qWa;az3|Q;>L-)?A)vytn0b*smq0<8&*7( z9&`FT{e;>e8pm$dDN8QzmaCsui=;c_@{s+$?=~JoV&m%S(Lu}xL4$Q*+e1h}L^-J$ zMRVW;PoAapQ`yJhK=EQM7oSyZrD8JOs4K`f8?&ui58ZhiKH8Uxu3H&Ocpp^oUa`^a z#HCiUsxUjHOQt_~gAG^1fVu0Abv0=)Hw+cJ8Z6S%*Tks7O?`1((fB z{VarydCuGs5(~wScxUK#o?4VtukoRt?#qmQgHRn^rIATwk3{*`3+@jjllz`qdG?0Q zto-f`;TT&#up^IoMnCt%q>uKb`Sd5_@Er)MHFC~IP1@LNUtHwV1@U_|JG@3UEyA^} zmEGSB(MjIMro9G)(${8v?yqNeW7L`GI`wd}Txj#CZGZgICy~$LNXgjs(1Ocm)AATt zY088ivYLt1Pj@U+Cc!RYgGW1}VpghbLo;T>#;TROm+E{wVG(U(a$Gt`9_Xowv~e#g zxMxhF^VR$gzjg^d?Yr`^l#E7VfmwJljKjNSDhQDHJ087V&BkkjNr38@-Tv!h+4}rkI_XB&aFn^3tclj+lxuU#k#*v7swz3N zR?5MZou!OeRB^-PKtjAp-@LFH0RGPLYmTGh6ZM+LLehFecR}TlNTum3%*UqETfs>} zpfHAuPMNf`8IdC(e*cWPv*sT_ydJCb_6OnhKY&74-|)%s*I($>{r)RT!WbEevdFoQ8YY=X7PiC9#)fI&L^s8}4*nbMC&sN7`u` zlr2|}dIiFgxoiuourz9A<10m0&SZ$Q>hP=Cu;#JQvm0@_*Io^M&sTR#S=Kt!1-AFY z0QZA=#}B;^xubmk^+rrg!?9SP7ZSuAUF!iG#e17#;Xx_Sb(8t0%hHx@6m*fM9gh!{ zHKe_m_HEs?m$5t;gn!a6m}{~pfqm2=-Az1%v-V&!_xGsaZe$}m`yzh#O}Lv)^|&l-6vDodYd`kdidg>G+xT@*&N!^!)9|xa&93PQvaCNVT}d z9TRjlRGd;`M`|IrwveODr8Po}?4^&_K%Nfz`Z;>P`~&#Q)H+}z?yG^J_q1H}GTifM zry<4DHjS*Xo)Aw}?Ck5W>ZZsGWs^2buYc7t@J}<^%oZhRp6Vjqr|Jn#D;FlyA`ww4 zItS)(Q`&HwZt%Bo#h2BFgFeV@_3)5Owa~%GALTEbwNpk7i^s3j@i=Ufhk`_{+>srtUTN^VtIUN&ZjeM;B>tvp9t!dKoxVaOZ8 z_9qH>oLleJ+tAsG<>&Im*KG#*4@K{8INf!>xs#H@$FKLf z`r$Qg^d6B;myVD+QQi57m-Tw#A*rf;jpc?HOwT>|s3;l6y50V>QFrKkBjS96h-1%- zxuf=d*nWLZbq2d>@9Z#t`_$H%mF1T{;U~gf746-(b4wU4MRrmhk0qcirfmir^eR?Q{LKO_?W)d3c?Z z^rDw{4j5B4QTezYoO^L9sIuh`z)LRPt=>$Dt1+SZ++$UGoQHGOl5}MC?KY$ro~!3i z;^qj}AU5Jw{L*Oi2+g-IYbYm_ficyy~zL6|MVLFL3>jFFln^$wd``TP_r|i)8H-%SqHI^Txa#7 zYIh#ROy6nKapMZWY?ME9+^MGJNBDC`AumyG7_pW@VWN-vQqIu6xt@6%S7|32&S z2S5&KpMP1XXXhMReq;UdXy~Wo)Q{3|&&v4#&T3TSSOK&Cp=L*%t-A7lupn1sa+qg+ z_t9?HCim26@cTiD8OQC^uov(7Khy z+m?*@*nti56X)9vm578E?OHicJk@OD!lp3O(ECA1q9^pN!4 z<1RI!GQBj~v2$B{Xsm0TGpaw>pzySN7svjr8m|+{n2`-5#=2^Cbm?X zWZK=~S37?Ii=Tq_zY_nbG8B@s4r&UC-M{S>D*M|Chm!Y1x=uEEOzt|z-L2+oF{mz! zcD|V=p6$BV-!lAxz;MBm!ykaaXhuw<`RdZR&%=a)Z!XGVoz@L&)zv~$pYU`AM%?vyXBxjGLD9}FBXtPe~2sNg8xvXO91c3~N+F1M@z&D58r(hx(n z;rD$q51M$2b$wdhb@-nAJbuvD)H#$_9$#FcCKR?s>oSkA2re$F3E=@R)GNzqe3;>8`O{l$|s>)4E=#cKgWCIWj{t z*xVyCOLN|>;%7k+>~mx_K}ki&$uL&QUZOi_2w z`dJTvzAyKlOWk~VrhaxhFz5TS*L2vZzMQ?+tYk{7il!hsRZ|CFDr^Kv^+XjDjxGHG zEL09qDWhe(mgDJ~j3#gmNZKVWXjvb^dQx=27cOU`q?R?ew~BXxoeJAj3D$CQgD4I&(ar{K~w z$b?zW59>$DFIY<_Gp`J4^oL0KRA%V8ybifrGr0d<47@+(Q1_aF%wpI(9?x{3tflQi zsGbNACC=Sxl6%%0J3j0f>r2r?e5_e;S&Z)E;tbz^4*ArMtA?=w+?(YK$B=v;SC@FpKh53Q(Gd zwv@hz(X$M&JmNECE2d@qYsifn!#6&Y+saor4u5~)t~RA-WYk$-xmmY5o61S>%1?Em zoo^BI^s-SV;%tS}$V!W)_{_6jmLtv2S5{g&HlX28wiM z!DdEh??5US;psM*ED7M{Bv^h)7nqCCd+ z*&qxnXdM|yY0rayz+04P-r9cl*G^&kMt!ZVzw(o$=i78g)4w^R6)w9e;=ON!)a4M7 zg%Hk7HfHP`CN({>eu}k=wV~L&nrg_ojhw?c&nwtJL`OEq=GxDj;@J?vt8qVw}|hQ!$6_TvP(2THg@^rQTYZXTNW;+*evu zlTw0@IQerabtTQ|De4a(e204Sh6R-Z}w`zV6(<_d5t zTB3H7h2zY!^6RG;d8T$@8--6pnQ~{(zLL0-`5SI{c8ZtLQ2m!IB_E0+-kg8tJIT^7 zEe1cED)OR7u2l3q{j%{Ici`9Z(;w9}m6{^&jeLb1{r@Kc_7L ziVuut95b1tMC4S26l>RQ)VoWJunxb5Ek7d(Jr)ReUL5TqmcjBqkNF8Ky&5xg&A%7o z@|jrFAUr{&+P`ILT<;9gd)!}gsC^f|I9}TqTR)u%Jk>7uSnjO1DZzu|e?F8u4U4}S zZC@2OK{C%ub&m{=bgcheTU`IJbLEYBQJD8sNP*%V6`cB$&Br^RJb0!?F&Yc-Q+10> zU=^^bqd;6KcMW=;{SGF(#)?}eK&cIS+F#ez3WLXsQ!#%4OLr7&*7Be1{a9Y}v;`q} z2h~C3Kxu_3pfdJ|&1<SA zHR3NxLtNID+d4k7#(G3nWk%o-gFRl!WtG&wf_HNPI~=sV(mDMq=lo?&WiyWpnCgd8sIL1;F1J$6$1XLy-~Kx&l)wT z(dY!&%faRJ-@fOkzBT+6;xu4E8rPOVu+p%C4Y05I4F))UZQblbYthRz_N;@!`~G-+ zzn<2|*UDE0m;8KPO)X`%7>)N1qUplMdsK8`s*ePu#`WyVtNW~08>U3R5M$$Z{b*8i z_P&sVjAfsj!=;LEw(S#_1zacn`s#P@!jrZb4+vGg9J8a6HD<2w;l^4Zw-tjbk@t|A z_U-@k`tRL&cNwQ%>%UXHyj%8Je>A8VdTG2`c*$$`^yJ)Fwc~sn@{viW_3&C;9ndQZ zk+M#_BbJzRsQyLN4;+ra;rG~oCokCsM4;8rhINMBzC*jZ|3j<}i6t00?s*jOj_p{O zdu=pmOh44QBYd>t^k7zNlX>XlaJLcNAt$-wrAWYFK>Dhj^4nlcuCQ&lw-9&q6Xzk$ z_53Iy)p1g~LMxU=+naPv-AiPl3h;L3UcJGL7p8}X zuMaha93X5w+s1j{`QUUdqal2M=$K(!&y~~X#^xy`=RS-J+Pj+FSnID;}q=h%l=T-rvNrKY`i;ZTJg$gtlgt3ivva!Dl(j+ zg`o9R3s3er_Q23j(=Z`%tM##_t2LoRE^-gXM+V3pW}~A?&vm_LkVlAn1ysV@zclF1 zN5eqhj-IMp!*)Bmm$AG{Z!GH!7FlJUJ@c~GNcXL?M&o4V&sfo=9W5njl_Brx2?rPS zeAdEI8PU{tjv|-s^g(upXL`am;;a8F!x!jMy8p*;WorjfMP=4zvSGqH;d1e%&D-sJ z!(x#c4Z=JCu97)%R}jhg-Q9IHM1sN8A zuF#fd?{(S@$=rzU;4>O&s$493M);vgmznB(LUBwi#cgA#;>6ClcJ~}^Rjm7@} zl3K36Zl3P$K1-cnC@#oDpD5#NO2{lt{&LIBel3ETxdSTSPniM%w5aqy(>>%NV;wV37o z(-J!c&hg8zs==ZQ$It#XvR}6|p=Qm%5rw-Y<3UuGmi^+`(~?bj?M{Y(>ufhQUhU+! zjbAJOtL9qnv#x6-^69mNc1p`ei3#BcNo6e|ia3#Ys9$esT# z=rc~EZsps1!@~Kd;Kq;PQh)0_9u9K`wVPAqM64f3_2u=4mHPE(aV+kawJXY#gh`Eg zFUi}~(~mO!&V-XcW;`^F{_eHqxoswKV|?@ewU1$HT(DRI1e&tW+N_;UU&SN*qS9_t z{i4P)L7O)heyFK&Um*Q5d`l}z7Ib_MP2^BXUy_}J3bO^0sQdE6SYf^kb=6BZy(=#!!g$@X1ip)fHdgtK{j3gziQz(qZaJz7xA+*f^M?bVi? zg-7K|e@M>S3pL*g-e%p(yU9XR(@@fAIX1Y}xm1{_u)c%pLV~M`%HFZ;V??aVDp`_! zAurS#3(aSjb77p*;v4s?P{j))=PSQO+H5rHGVg`o&(5ES^|Xy>NIyzSbp*a=B4W}E zgijv27sp0rt}b}TB7Kwl;6V1vnlIBe#e}j40A5qsLvo865L9g|hN{zYoT6l!I49N> zLeLjZdxZ-OeM#GuY5PSqqruIMo3IO5xxl+Hf@x5eS}=qeh!B1>1!?{^=y#3s$Gm6N^ozSoiBb7oHOA$WR@96Dfz}9kA0u!a-<&KiY z=Q#{A7VnpJ>?`F(dE~a*At*Q21q2`vIROblL3yBrunun>R9g2%sr!CS2Z2*w*6vZt zi-#J&z68wruPLFXj(oiux%_bQ{I{>Nzl1)XZW;VMv-j(sCof|kzUe$QBX#kH`03rQ z^_?mszhz$@LHeZ}di?j^>(@!+YT@U9p8Wgo*cZf&!L`S~eu@9*G5=Yc|H#dMl;K~? zP)Pj&6oBmZLfjJ&Zs}N#kh4c=mUv)ed|mlx-LDp6GJwq<#!oKgP-$qf4M(uAk- z%Ue|%C=!Xi6|W!5(Z_O&p(WLDhQP1eBW{&tiBG~XnUKlF0cOUpL?KrS2g4~DMOy;W zrJjN9N-cgK{SmJ3f@KzE*4y0QtoX%^&^g6RlV~bVPv2tK&vfibIaJD>FL%lc+0NT zRfFdaukX%yFCw*j&<`(ApIS|)xZv?$CXkZJ>9X=(lw?EmAMCoY9&m4|WitvJ@tYYr*h6IU_*dDQ~g_m@bQROaY zq;(Tf{g%2pd3{#2j7}^HQ`Z@B8=hJ1ejW6x;>BV zW>#T9nku#N?1>Y(1h%&UE6AA;BN-A^V|z}bL93hWIk@0bfpIwlX)Z%5oSD3)>H#+qNY-4h%f8hZ>X$XaAu=MxXMap!(TR>fF( z$EL?gi@K6!$hVIwNoOwC8WlxMQr@76ELV6LD=N-@;%6X!-W2hw)XuvG=e$^&Pe$Yi z#}g@8U?X0RTU}&NDJjdw4UkLGOnEV|H|Xs_Qa!bov?>G3jsVeLsfm$DfZLg-5cgi! zWH#2`9R6TuR8Hc)-Lu|&V>_aTe&{>Ab(}^URKMT@69G16gX~{B?{{UMel$#_h^CU1 zy`sMy-KYBZ11K!Vsts`uo2kG54WWgQ7+I-?5-Q49J6UzYKr%mPJ+Sn-9o~&3lUvG; zY@;kU9Nq-`)bi#v6M#$?RD+8Q`g0~9olR5L@{`D5fAI?44}#L5e# z41UmokYl>vaVe#!07~f!zwO~~*ghlpUD~>!U5fZKkOVJ3hQe%K)d0a~8SL!Fw}KJB z?|NQ9!g7$FlQGR%kT%BLTMOaY?TeCFH6z=7T@VyP1m~_+kYRLKDbYl-ecw6whz=+7 zN;wA7j!|~&gK7#%VoI`n^8*(lCDK_$EvQ(L-eb!XG|#gct|7-y1u+8v__(U9Itsb_ zL^9(9k^U?WUt<4ipH?by`j&b_@7N?(LZ3W*N0%UP$Jds0q$cNH2*U3L*@@NHb+uB8 za#-xxUNV=srFq$^8G%;=38s8;OAX^rg6|`VDdlB?Ic-t46cDV$3xbb0fgzK#VDX$| zCQ3{;hZ=+$bntqA0#THSwmM@{QGN!Of6O2sCSV0@O@rFABKVv$R%;E+)7#UbH45ld zFSe~w9GJqj@49)bdlM7bIxTE$FPJrDtAjR1x;243#AssqsnYHOE+-N{Llr|=LmtXb zl8cwLWaK20#1CtQuz_CvI#!6BA?wI)!7YQNs3XrWwjhn3TQyj^nU0`atuU@uRb~oE z!b&+tZ2ZLM4>e*6z$RLl%M{UyU@Sket{;BiERBuirSJz^*)l|7>LW$HQCl1mR;62J zrO9;=wv7|OQYd9yXgn2vR1M`S?61v^pVPn<2}Rm~0OGZ6A^uxtMZxr0h1d*6j9|8# z0K@D@Ol8Y3U;!!%$fEX6ey56d4VaV!CXu>JNdok$h*Gt!mg8<0 zB7#^606J2 zyh>AjIn5Hr(h>Z ztEf~{_(s^A$MxzMi{%Zou;vs8g9utoLebXka>%}Ya%K?*^8(^zGT%cdjOnIn3C1lb zPe;?e6qsW1v`Em_TZBEEBj)Z70ExXvM_ViAwzMG40UK5=4fkYC%=2+a2Y*VY-E6uj z2k>_go+3+-vI^B^E7@N!rJvE%T?e;Fiol9$x|A^n$#z*Cm`qt)|D$-N@dZUSsS9cG zYKTr2$6c>n^Q>&A1rcZj=1Cq?M3g~*qDG}^l5genqUYlx-fP1#svCYm+-vz?k4Tjc zA1vw)XdTs1^*(sBb@9MoSVFGx@jDLG|#N)G?`+u8(isLN3mn*G*08*z8?a-gx`gah6|KD@` zHnft%N3FmYI$r#%G7_$?>7DF4EX4P!;|ROpAO%i zd#h?JBpsA-G5_0Bsghr{9j}S}QH@jH2bWtHUR>1wmZER?e|(@s>0RA-BW8(jFFX$F z2210`V%r%)|84C0KiIp(BlbK`RJVO&uXxP1G8MA5Pw{uxgHUQ)foL7J1tTQeaM0xZ zW;08;3yjm*<3LI@t`=9bHo2gg<%I^N_IW1R#v1M8^BfB!>cx=!iL$)dtiqIG50xMF zR*nJK|X2c3ru{#6f(vp&7z306hU6a_6N5h_FdBRx75L09Y zc{4{^`B|ReD_P-Wu3qnbYc*pTt_6wjTU21&zB|l zq6K`wza)4f;@tw*=WPv+!97j#hKjRaK~d3B4DM^3l>oM})yv(k(f2*FPmr@NoE%5M zM8&}%4)!uI%{|6+Cc9S}!D9@_qSkseAW;zu_oHGQG=#KJG18ExiPu7&;RByVP|5CO zGMS_;4}Z=wv!x>(?d4d;c4{W^f@0DFI&)&2`BGZjV8<$~P$I;f-zN7wx2$ctxj;0m z)Me=sw<46wOlb$4h18r2{UJkJE3*Lg^+9dD3q)&w2IyP0l5n{w^VY*z>F5C^IzR*; z;oNpph>95U^1j3ob+lboi}b*oX7M+#Jq;0AU;8n09x^v3ccZFBb#|%61O5mBJP{-4 zAxYiS+e(yB_ke?K^%VjmBC;O&=rm^;`RsXpcb`}yv)2`Q1|pVd3|HMJ0We5PWav}) zKHY+X?yrg-iMmb}shV7Eb9`(NUq_vu$cKp2!VvbS_63vge{UgSu zZ*4F?kAf<0KEbSs*n>~u(3@H8WLuq)popr^%ajg%8l$%zf;Ic@19g2vEy{Y-b1+%j zYT4j<_m-+w{}R7l7E7e7uK)(rJ#I;Ow6t(3VzK4rk)QQj9aZsIisF|lU0y|7i(ss! z%{n1At4TAZLY`mVZHFj0K-87+Y%xA%fCVlAckfM&$~Pg8oVL~)UTaKis6^||JLZNziEb(^*Qaw5*bTa@qIw(gT?#hX25JN=b!%hjL5?Zb<8qB5Rt{ni zH-W#Lq=L<3Uvu62HkZFCUp9lUxi&BZ&Re7j;w5YNu_qi2;8Y6pgsVPaiaCiBb*J2! zXIbvDpTxTS<4ardQG2Hm4t-L;d5*X1>+j#(^g0R_W>JbH1k;PW*E#J`9HzodTuejC zF|n|j)aZIQCW|WaF5W&yO^1r)N|Usbvx&Vr*-cg&$G*klL!3Adm5Lx`uw02>%5q_X zGZ=D86Bjk}9vB$KhtMO+(?^VH=WC=JZa<+mA}OQq@(lyr-eQ#6Q4xWK35lZd0=T7M zVd=pDCeCD)04a6y_fHj2c-$i;99-});fcYThQ_;nT0#&pZ7`Sa%ExIQhwZhu%_F`j z^zC^DC8=yKEtwU#x>p7#R=c@A6#hUEKe$_KaFPs9v`n%8ta(4q*d1{ZLW{{Hy6a&& zTad8(unKfe%Zan%jd0f#LX?@K+hjG2W)BhB6ZG`rvbbP)7aFNPfpSYdrfgJ{AR9*Q zk^w`{lUqyMqnjP0>MSytS?S&G!-&p`J4hkL?{V_=hr(K$#tp9%`li_G@MCM{%MF4^ z17KL5z6NRrBOn}s3e58cz8pAH*Jp|On6@4ft5%uKOLR2d0AY9Q&5P{Xb-G)f*F|7u z5T@vCW%PqkLD1+X8--Fwy1OL=P{}#K85i`Rf7zJ%Ce(hd>%ph=R#!%~T7s76AHeB9 zfDOO1F*y|b4r8;|K4wZAW1G5kXOoZjbohiBMln=I6PU6uNAs+l5iqMw|A<$w&NLzZ z*DaV2)J|!3k8!c^rH|pCp6dsF@y&e%=}9GVDfU??;%o2hT&D??2b{l?iGP&XtvV-& z4rpdudMW;GY)?NuAZxje$B0_YO(ZpL5a-Y>(!HfL=x}_qrX*9M=LPf=;=v4aLHW1Q#5w?Q%V9s&A>Nss{U()Seu}7B5xJHaqSPc~ zzsNn@q9inY4~Ac$Y3GLLV|j21j7Rz@aEF+a6{7%+HFuIaL!=ei*e9=}+_KIH$<=q; zUKaTgLu|&r(i=dP!8TaP#IfSvkOBb6u6hp$3S|N9MVoTO zG&!zIITW1do&glatS^X0H2cuQ zZ9g{d_7$;N@i5Q6SLN{3GP=RXzP~W1S~cS?GK!L{+)BoxE|bRO4fdUjMW3^iIPhJ% zTXwCh;I=(hotfqHH2)6cY1~opNP(pSxAkbF@YmP|g7=yCAlkbUg^TlA+`W_OmbM~9WKi^BwwyJN> z?iuI5ddVOB@#XA4#eelrFO}(ilh2%D^3A~IL_sNxK;W(-{kIj6|3MZ0rA)@7D9eb& z=+5KrJs8t#^45BF%qM35YBH|db;w!coo;Ca9AI5Y7O+ylFk=P(`K>ehdzG)88YV>u z2cblEqn!TL4CRH3X;(&$mO8sZ@W9*VnL-GIzIIU3Kc5Bv9~AU|ktvEH=1biM2rWqa z?06uqKLQSZ47*Cang(F`-^8Ww^Zp>C8c(Y3Jzl;7qq}?|P#xgu^ z2cv`+S>dz!SLtf9!X+n_+GR2P5+>I?hi^;VGw0_MS64z9p5Qr=<0~w!j?dvGB4HRF z?siZrT9AHtLf@u9b<*(tw@5259@y3cOz_etp1&U~E#P~+YSY1Kc8oTO%2)YyP8G(A zf4$mY|Cex>xA?8qb)!dufnd_94pJ!8S+YZWu_c$n1nx?uzWdN)ohNxm3 zb~{H!P;Kpa@$jBMfcIjumr85*PX)H?q#b%iq*7vaziVP3fFSVYLWiT?S&sE<6I_$^ z*m|$Xr6RPau^_yMHHkTMf+Bgzje@C8KdkwolT0KQz=A7Jz4*FM0}A0;BqRg9l4aOBZ@V_)%-+XWcafEikF_ zb_opc`?b9|j7p)RDR2%v-?WUR07s>{DBZK~kGNDCWP`Sprb+6GnWcSaHQ2?wtgmuD zd4KA7$w?I#3`6mosVNMjg0VzsNkj~`S2PM@sqffE02POIXiMgOKvZY$9|n|njk(Dv zM1FYT8#eQp@X{+%siH*Zdi@QJ?Rh^+bVqPD3W<-APoxfdDccjL|-Ah z*xGhyKG#$q1!bpLX>b{>|8Mwq=06z2|2~Z2k&ap_z^Ob-&Pdf0D@~h-c?;r6mFuEm z&$|^SZq^)tu#ZA&{99amf$pW3d$&FAUo2X zQOH@H4vbE|rV|-qhdYy<-kBfJ106f#=g*DHDp-0WCl4;0l8M(rb=Vv*LCD5pV@5|k zCwa`H6iUk+vRmz%^uc1+LfVguiHO+|SO}sH7g^9N zMsCwqmc&xpP<7Drx3gY9 zECHj{@Jn;aq9`kzXGf1$IM>*1JxZxufF6Lk1yf3?nh?>CDH86Zv8w?Ob=ohnk_tsp zN^rza0+IUsJ=l@b`<#^ypAhEuYXdR4oadWA#Bi&ix;VD5fR}8;!~GffmRu=tKJNYr z?osamQEE`HgB_ioY9p3A3rz#lHJN)oa!|SlFx?fZl91GRM|XD_8FM5cWumA#n*#`t zKJ^EHu1-RU$=Hn<<|LqK9;r0fc*pfPrfPjQVS*z{ryW-V#~IT-)!ym@dEFG8mV+y&hz20=N!pMWW;v@ytx1_?`j?w+$*JU<2^) z^H)?Ondz_#-ayI&@S9xEgCS_gh&E-~cXjDRCwF0xwuf%f6!Yjab9zjqgWx?d{_dzA zW@z7Dut%PqIy}tr-A#nuF6C=@MJCasydcJz+{?Ap{RQT*baFHj9IL1<@`9~o{`H%{ zJCkG3-3Ei_6AxoGFp+Z@AS7;V&yCuaBcGSL9cX(5bKw9vAI{R`_h{N;cK3d9Tmevo z&?1;0{YA_PR8g2vAoy_347967L;!&$Iq`%J=?aLe z5q!R%N2dM`vawWtxe z!iZu&&->cl0Ukx?1dB#*L@Z$b7VY=nBf_vj0ceRWUxVx`HdetUuan?Gi z1JSfuVlU6??DL>8+AwZ%IVa3LlL5FOF2HtSZ+Nd-iBaH0Uq z`q@K=S>6)NYEtBGG17leM&chP$N68{4g^N~H>}tyzyV7rg6O{mBk>P%X}+nAKclvP zFCAI?@o4;AkI%(_oow^}1*qrWQ+)oZ5Q%>XWu$42G}r-O+#kV5@AaYn$f^{{^7@DN z;Gav{b$M4m+Ifp=_tboNi^q3Qh{%b>i2vVaQvTtBPX$fgHm3e`3BgEMp+W@2_WW}p z68{LwfQ+!eE*~vIygJZxoSxsj50K^L1vv0;upg*B1B7R_>{t3>_Sj2d0V-9f|8gm3 zFv#g7#QZ4XF`+RMO%T$0U|1i_+dB?4l1^X>g3h ztJ0KgK-ohlIK~nwEs3#qjiBPVG^F}wH2H-wgFDT^SY2S)xY^j|WnH*?JvlnM9f~`& zsDZd@E9(Cjd^VTl>aYDM{zboBSQ{$F^Ppq1umNdp;UO$vErzmIIt{AOz|CS5i1MBJ zR&80w%@kWiyb6fZFpjM^=Dv|8A@?}_o-|tcKs39lCONW}1neN=a&_d@Gm~sI;cH^( zV6M3xKf?_xgDKH8wgHGBS^Ip>qw(u&)-mR~fI@gw{u9xRwU~G%Is_u)dDU?6JQ~LTY05%TUn{}KzKK_Q!p?hIi;5Lg%4AZl|M*zFp_2NQmIfV1X=+Q zO&5pfYeH&1A3WC?>Y3(D;jIjH($dxHMn^>$vFzyG419vF230@K@xRk34-|$&&I_-k8Zh)-TRI_jRJ|Wsr zn-H9Co|~_xsWW1YKO?DN_U&G;LxLSmQ=z!*-GM0SWz}aYE!Th6h+MOuO!l;5z55OG#W2dq=`K$z*6_0GGsoMZE}C)-3GRJ({@W_4l+>jkacRI-0;=moW}fu)78W z%!|4yjkP;f>+54Ru(xni!2^O>O~l-e+y4)HZyME9w!ZtWgaAqC(gC59ByxeG(Vw`w zx6HKsoGWW>C&Glgn~j;9<6EkegZxA(4F?pt$D zVIlqc5iW(n>Z1{{zj&RQdw*3kdqfn0_Bj-=jj}ZI zHlGNWwmU0P#ypU;rO2a>9H7bCxnewW#@(=Pb)hPKPz$|32@x)5M^_5kvw|c@q`qIk zQzegV22qeM1-oQb+=`Fm#Vt7*b_$B#v=bGzHL*KJr&f#ivO>p8|*YX^dAQ?w-``K<+w$>nvP=~j<-RvT_k zBt=|b`;bR-dy09K)`W`~9uB*aV%m}%!_PNT78TSzoi~xL)iWz^h@de!0)S4nNK750 z`BzGcp+sq{WnQ+H*qU#GvGy_Vt7_AGa;RU2*M1IhzO$a5F0x$enDj&XK4-%FAZyV+ zKWp5j5XdO2oX41NynnsFAk*7KvZ2kzx4ak`Z4%{Wgl zc)O(|rup$KHoEhKYHW#VtA=AO3Fnle+navlfWP({M7cLB^+Zy;rKHVv#Ssl#)Z+6M zTX0;_#Cs>*O6E|+M#1ga#T%fk$leT4W=>Y7@0+Y3i($EeB_wokUgR)5mHR&TnH}nY z{k9}m3A4|+i$8d)IshEkyRps6=!ceq`rg;{4rNn-*<(%9;s~LF&ZH4%E=L^Joic8y zOqUPyPjDm zu2j<10PQ%;0yH)lfyx=rCm%@c!ueaHMWz(EA5?V2+KLY>?u!G62zN1Br#~YV^JDJL zz~P_xcA1VMGdh-C?N$&i0@tJpjKmNKL@5JW0iIUlMA-RZujF$bOeYei^1{)=1#-XS zFm)#Yc8?+t3|{;N&<(hz@g7z{&b;+sZ>jLk@mlW@m6`ymIbuv=`N`I4`>S`EgSVg&dI{pRu*U_9TDJyT}{_@snOXm$~e@ z)lQ5MAh7{IsWSjXf}VHaGMx#JA5h?$oQGqMe5;$&VvgQ-`qAn8v3xCQs?1W_k}E49 zT5pRzd~w43&*qZ&YRbFiTbHedcp`#fn+v3M0U@b>ZkNPY)7VZ8=gq!OdpWZH!N{hM z?@s;cY&2i3Kz@s1=r8Tv`J)@F{;nc|TP&Nm(;nH?MoG;sWS1WtBz=ebv(>m^kc&{ zEX3#7ij-{Q=m>Sszs}!AD~_vqMF4s$uK!${y*yaBY3@0vE!5v=^DCYMzU_vh-0lrl zqgjmM>H9RY@{jUx^{g7Mk*r!3P%`kG5l`g#LCKjBv8`xQOGXAAyY#vu{ z*J(X5lW`~WhrpaI*G1?m{L2F=lVm{AHo z=ly6!S|@8>1YyZVRa^R*xiIpKpxsTlSNLG{DgBW`Tkmu)iaCkuENh$4@}7NO_L(RT zULG$${&`SR2iFhC(e=*_(VX3RYKkxIW@6?)Z0uv>|qdaUX_8H$D4*_Cw6`TU>DAZmsU#7B-k((+5`6Uk*8Fb_H#`IB#TxaExGa@==5~sUj#}R$9DK z?TCdwt6WJmg)m3=1!ShIQQvdpb0*7T$w(io(zw`?$wfD4Es(*Bbd~7H>Fuwx*(mjeVDIF{Yh8S z_O7C6<>x(Dmz%-90N!m@nr5ei8hW2Zgxge<#g4wz+GK_A*gdzu6rQydD@m;-aD3kw zAe0iHr6><$s3DZ$fhl6bT~2MWR^6(xf-6iH-j8;{s$o_nCn@kl&KAUD^Q6m$!ia$N zrao*M4hLpvEmTb0xu__(U}E&QXiFB$QZyM&Du^1=idnhDcpl8jQhbva$5|c9FZA%Z z-gb${A;3=8PMa-$EnEyXKx>!9cXUB&G6Z+qO>XYGS%9GS0EBy#q2c z8Z@$t`9<}$qPgD%CMnB$YE@5FSWRtfLrTxCQ>JOGN1#YNx<3F7Ufz^Ixfs-HG4-h> zXti|Y66?CUcjFwAyPx-7M?RzrFD+q(SNLNhO;7i^`^Ilpwcp3fXwC9~1Hl&M8hKp_ z*iqC-mjg_xc4*cj67<5;4Wi%DuAdi-K*I?ekUmt+8~u2NrRzeUiP{^GoW^HIgV;RC zWvXVU5Kl|FL{;~^OmDiR>832L+CBDOBQ>*m+1DP}46Z4x)3%suN%!dA?Q;WaRFqZP zY@7(B&&B*v4lE^+3oJAA6LTh8l#csIkTwN1eRoW@Ewdd`O99j&PxEQz`>uwEBaQ(( zt-gXKVJ*@}J(OZGlj(Tq9S2w*br3va2}g`e1UyH0E|ppZOkDLUqTI*VYe_j8MDPa7 zC4v)(co9Y`n3;6d8Ti=F+gWXJcEf zm8d+LnKt=ymHp+zyEu-OiiMEoE%;+Tb9nuaQqAdeOMaT}-22icvu)-17mKb{p0YN* zW*%UAll$Zn-OJ2kE(#p(s1wziEDRSi(-2g^+v8fhtc9orz*NG;3GB%fKc{H3-n{5} zR{d!G(3AlE@7Lp7d_rk>K~LKo+8hj#i-yh!oJ9kpX+f`Q%8}skja8*PdSY*C_P}`> zAD?SgR87VT%KZGBIA!a}FokVLoNb-7gXoj1l@?4Cre6z6=U(Kc;ooO4CO?S2t`I!; z6#S=y0vPD(oWFe8^*Uk~O7|J?q~vzmBje2>*e5quxja>Bx(ULk!EUM<;DGBYz?Z9H(Cdk4C*e$UWO*vv?${yYB+*SxtszzUr8Y`9_l z(uGfKc+kq&RRPtdpdL#?0hv#jv)V2?jI(#03FPY=_@Im!yFIkiMqD*JIxr&`p~pK^ zCRvGF!zp9xM(lihw!vO}EW4fq??Cz1!1h%VO)uNJt;{6*2Je$aE>gpUC;_rwlO{{= z)C>RRF)M%uLZl%#^$e!`%5eZUaWsSVrVq6~z9X zqHf=3(<twN@bCz-mKyu;TLZj`~-i@v}&$jo4IwQ%`R}q}odR zvNB?HVjB;WMrSFweaD83JCNjY6FOn{+p_R$%PYhf&WX6XJw#C6+XPANb-oNZ!<{V;HXX`kGN2vJ~KES1_qRT0f;r|`uaiU@xN zdTzRho^s9QL$*x3{pS&XwVUm0@DUx@)KQ!gW<`#)w(No(x@WUZCd&jU9I!toQ6Lyo z3t#H&ms?K0fK_Tq-640Zaq}Ld7tT>hM00916_DCxPfvXZdZd`ONMqS)0G<16JG1DNlT}wm%?kH^bpv1p_N}FmwHT3o=Nl zqk1We#3IdeswWCd%gf?*_cS*_ zXjh|8Uv7wyLW?we0-Ak(oIqpO9G%+s-%J$vJK^ge*$Jp0Oy|@XDHLDG0%)Uv!{3^Y z{~|}2hg!ISUe_R@V%bou%E{U&IZdr9JS9@>QntSd5P)~ZB{W2t&GU^{+#D^`j zH%ae=TLN7|BraZb5dR;Nt-l)Y#U%2`nSzamK}>D1bzgaNhmJEP_1Ld2rgN+3e-DTz z96?kYYX&|t@9YigFt2W1_+i47u5`OSR2t%;cB9%)f1D!N3{}cSwp&`6x#*JJ?G#`6 zwpT^751hWqh zl-bi}F4tl*y<;K#JQS!_&hnEMuiTGFAN*+Z*-G;K11pcPoMocbltQT0K@N5Sk!*h@ z$#r0isMH{ScWQJWd)!_xx-7yXyc>>W=)?07!>Iffw(~b_L{qX8(ym%1tT@go9Wp74t{?S5Tc9cREmOK!pZ9)lmOTIz82R#cNr3vE{5}(3C#epWg=pf zuU@8wZdz^jo%BUng!21U5(q`28I%a|7PLu7N|OrHMj=T!hJdN)FzQ;|Zv7#pJaFX@%=R2vLC=Q(H17hu@JDaHHkeuR}Pa9&V) z#}>-;u%GvuTjm=GEjlzvChCn(dA1@+asyv1$0$WRPFA|-V7$Oj zNq`&qrwwOvY19hcbA$s}LNAD5lS_288KS z+b}=qZe$?cV)4_fQ?@m)p3eCynoFwJ2L;{raiE6B@jPu7=KC5YkPNjqh(c033u6(t z@$zs8Q`^5P{0=q<>UVIh0WJ~#>PhwTHDc)(;PLZ^+n^tAT5>R!NFJNus9(UG)DZc^ zrHfbugjhxE4^R@}t}!*tq=nFURk<Kkk5u?~f)jt;SFm-`md5sL*xfZEK z$KtpWI;JM(l8uP6KA}pEr1X(aH!2TtdG-O@Q3bbw>SpS`pT#3e@R4M?2uJYD6u-G+SNY4g6 zFHGOzYoEA}8gS^RS7uh`f;$etP!&v-VVq9!q;-d)A3e72;e?JD2~FWv-ck8(+!)j2 zlpLOey?m%R%=KdbBI>*w$sW%7iK_h*rd``^kb&6)AzGqbB135lVs_fnK;R0s^RDwE zFC}O6I`GKYQdmju1h|^kh2zeTLOyWmReNTFbd0u*B*Ev6NUiklnNMx{^XOh*D^uYw zN~r&}6o+pK2fqPS@fWS1|8!8nKS;>`JmUXb!ohz!i{e|t!JjYk=Kq#(PzCpBLvS5Q zCpAL}5*u+?CgJ3kqJwBd$no%1VR`rLqwW1*{h1<>h-;A9ngI>ZQ2E+yk>uxlC{EV- zf!ADe4H0a=|0tUUH z@VTG%@U6+UY;d@FtVW)RY0aj21{gVxGe0mu&o#%m`9lgD_aHQ7yZ%}S1jd$~B$nED zfSl8Vu3D|~leNR@K(U*w5V?(;5LJdx$&t$uoqLv(|9x#6zxAC5gh$TpMymowdt-dw zveZhAgb6#1;#De@LaGcpA-=_eM}WWy^ESI?J4&f5s;@-Kul2$;YBzdll|Gu$e5o-- zkN6uK067iBAZxodYKOzw1W4VKoSRk0IPXlO`&9q0BdMqQgHDdLnzB!Lz@ zghq5K>0($sczE*eO~RyuTa@>T4#%0spAhGTssPWxu+l5)5`VZlm~sOwUOOA=aK+#y zRJgXtrhKNOBgPUIjuCN3BG=VF+`el$GtrPX<;(C_f+l%L-o(K55E z#AoiV+Jr3)@Xq#~C{7K()y5gf*;ec+KPsxXq%+@Dh`ZL^U&NGvXmT{EC74aU17I;K zK8P_svQe<~&b+?C2byY4RmAByPG>mw>JhA*P*Nv~c9?iF#|B&T(tEYqFm^;u2Ck~8 z1op^H%idt?y)RVT(<9%RSzs8cz`#5{N0+@xrRM%0(i<96Apqn=>o3V+7hbb;S9TV_Fw5 zNm(V4497h7q45uXAFXUM0Dm%YxXsuquwd`2Q6KU)L6H-5_nxl#sBI^-5Jk(pSnUg5 zn#?nJtIktV*eva>unVXRHt%02R9CN7of2XvF(sB{9zYotx{lrxqm=l(Dv)D zB_A-%sCw|m26O18@E%a0Zzbb7zIj=0btAtDe!z%o*-GU(cQUVYbVIG;@bww_JyVd0 zaCfUA4QF=OxF{nNxpf3=k`rc1(}_?5k6m?n^^u+>gtjnIZ-AT7Wp`=7m6^4j%p4aA z$^O{hOj~i*C!h=C^|aXoN47kUU!>n(wXqmqv2NvG>_L?MsFf z5IK;PNg-Kt*q?`%1QB!-JWl$wnU*p;-T6xJmTj@J*6Uw@Q+xjC64&n*SMZkx!~Y6* z`j-r^=`OvC;zN7IKRvs7^^XrP|DO0fFwu=m1n(CRLiyrHOy1wXY}s1J*y=FmDc*Es$Jzke}rDc ze4FXI%=dC}}m4dTFa}ptzqjB zeI4n(1YDloNd9w7YqW4weOL;^tc&)PV1`Dd;`229V}Yxl?Wa$yGFmv?ojea^`C1+U zalN_5bV=(4lN=)A7ZYeIOW$|;2V*n(L*eXEVM?}Jl4K(?jIwHtttrxnUl*kh#~m8S zo*vo{(@{@4mOxk8Z$GB-J}_!{>w8&YpV)TPHhx+q3gHF^9X^*`=8L1bMP{Wqrre!3 zth@51A`^0vx&T!br*2O*ie_GOq*!LgQjQgH2l9*T7wTaHRv2oTnJ1}|!d%0zDzyDX zd_o{+JDedccRo&*slWZyxr&2cWF)cGXRyZ~h2cg;FYGQhz!TWKz+hIuhC)Qr>eb1C zb1sye3TY!mttZ%bo2;Fwkw-U+N_*zxWd7+#B&wL*jy+B~NLl!cW2<9!%1InSO;L(l zQxoj0TUtCBUvbW#98T9SsSu~Mvr^(qI!F>`S^x!d%>a()ZP%7bN0zhv{$?rYU*4l5 zB=|G!OUN=OFt*C{PV`X8#Vuv+mYQ(u9RvsiDCaOSj>k3I@-k@y9b4#!Jo5Zr26}+8 z?P}F-V9Vz4cFZ-M>$;(IOltxZGJ_jD5e4ch29dHZl%76w!3o9iBIl0fRsk+#DNfIRv_?=)XSyYA-A#$J-Uk0;E3u` zCP&wnsWlh$&hfJ}E)!YHYIyLhib&OQQiw6@>55+I^vLlMd%NhRLD z)pnAC+$em!v=7OKpQx;-2yM8nF>I9slf>}qk^B~1{?|s&e{%qQa{#nGU9^(qSQ7gi z^wh7_b^Xt`r2j<~+;0wmuVi-li`LIK2LS2P*D@jf+M?(9)aJ_RMFM`)`T1L%)U;0m zyjU6a{6BAi_?Mj%|N4pF9030v4uC@Fi4F~;1aDgkGWJQ;W-rL7j|V)igdJv~aY}2+ z8f>^ccMg4T-<#YUhv=3|ROxH&2Og`-s`J64_D_M5v`ouOq-&{7xMR9S?CmfujF8sp zzg0HM8be7RFukb#-Td}8tHGL`9fWbTT9bA~1ShQZ(xNJ-Gq@)f`%*O#${?gDINY{k z1su@=k1(*L&;oK2AEE*dEox0DQGtB7!xszPDwR^lV`x1jyxt`{z` z{xRD~PvvO7zeoSS6LL>zX*s*Y)y6GVFO@bJW`;gQ-j(K)m1bsKb;&HC`7u}9eaI{5 zXc+2}ZL@k7t=6hH5WZPT^k-30(+;FevD+&ZXdS=nPfcjBsr~o#!k6y~24AR(z2s;` zJRb=I z7sq;L3j$=G>8yN<+t0>8{$OgnXay1t&tidbVPrtbz@CNq6At=nuJ=(-_81&Xv1ccx z96V3ZmWjnEkM=;M1brg4@rN#~u78EUwzC`3PDS&g%`^CzCHBJ-Ah&iL%x(;Hu?!01 z4vz0awlD(cnuN=)ggcHS&Xx}+O{K56wDkbi^O8rX8cfr1qo}i5|G}W@vbf(TBOy(A ztArjZv%2R$c*~ebhfgz9s?g~&0^h1x9{jr*;_v0bn4;H>ODb%GqJRPzhKO7UO(VkiD_>W*a9lgNf9n0C|oWhir`~H*FB=5)7msrj)i5jBk1@6Zm-nYExbZPE3@20#s|$bfZ0fxxmNh7G3IzRIT{&B}z8$jBTIR zJhIA=q)zrGrQs>oT+aRBCA(BA7my?jB|D~oXp&7}!*XdlDg9MDIi&2Bbsq(ob}9N% z!gFSN26X|DvJgj&)So?6d)#l$ZPX@b*A@UqsWPFN#zrl{r_GvTi661tunp1z-rqdq z0b$&4U0utff~BSEBnB1Gpw8>zLlfu@yWb#66R)~QSQA3GB}<#%)vglFB{SmAu}G=j z93z<6F?Ibk?C$L$)xr6sicq+<`|JH*0Gyk~)lDtDm7P$`@h`vxAG>_&c~G(+t7y+P z?8b<>z1`iPJO8DT40JQ9lbuXMRFIYcrKw6$M6sI@ya*GyUNJbgSUWxijr$;x!A}3& z8lmO?`N~A*J#)R$1^4DX+xka8Iyl7`GXDf<4jA0Cd7k;|%<%Ha<>_Z(Gx$&Q8&=-d z8{X2or*p5?R`e9({dciP>&#p43TJaa|H~h)$CSOpxL^F7csJ2~=>1;Oo}uaQ{^Um& z>&$^Kz!2cx{5xK}C%ao-efFDenK<*GJsOXp9$S2``2qKT>MjK>TybnZ=$QS5p_$aX zWz(8%A686jHvUJB(r0sj$2JS=B3Il|FWc#IG={%=adhcK zm@lF)tEGZ!x!LF%rNEKtJov~Q9fSsRHs!o+S`a^|wwGq$HV?kg>WaRuNOc6-)d8_x zalim$f#!j|m~ieU802ylK60!6w$8AoTdQLqt0sNa20J~xtm=gs zYv(T(qU*I-121~qPJ!wzU0*AD}3tO zWr~zcF&F3S*Nv)6UMz`P1-EI!rPd5<)NR0@A1;Ijw9xt0-d)pONpAxd_7>jVqjOpN zq&+j{*sb}u^mb$&(^GeLrshQ;iBxCW0jX@GQJ_Q+x>!D_NVV7bu>T_^%-4S8TsX&4 z;@anH+TD5_&X?8NwkuMju@HTVM)&v1myT!42UgVCzGIwI?25jQpYwKFI<5d)>j$<{ zP=tKf+XK#b+{g#x!Zb7pMrvVR2i~Tw{+Y_Slw0X}z!*7FCPoD;fbyt1nkXL2SDE(R z>7>xx1FWpqYPEx%)9nvodz;HpLCM_>XAjsKasnJTsw$W%{8T8D80BH6p+@x6{6Q27 zwaXnWJ~!jJZ>aGxwk>_q5DCpj3=-RHPf`MyXl zvrT%_l1t-I1gDP+Z%Oi<(KF7q&7Ee666Jc5BgX4X_HRcSSR;2z-aH?iytDFs=Fh_n z2IF2IH@90+1;=R+1u9auZIz^^iczGGSB*I0SSvnQ%(HfXc^=^ty`lr@VX+{faLsd^ zjiHA4)v;?H47vx5Zh#k{gE}bGxn^fik9>QF?hfnmeJFjZ?c!|H!%vMPa?`n;;x7Lp zyj$1?`!|?o^Dn?I|98tjU3|1W`n;EB(*1+ToeT65+h`=DX$e26YH{%-17(>B;Z4lm zh_D7zyj)6Jv4HW^1O=Q?)lSB)E{ni>KF-XT#!1MJY<<4=@xI1kJg)G0(drA_rk|eJ^)FI8)f-Jy(bwJr(H%xE=t~HWtsTTB zLe01-tJIFfS(d*~nAMPTx_$4|i0v|LdPIxW)*}NQ#2sb&zPfQu;dqXkpvt>#p2g~> zVN?|ETBCgDd_zOz>{0WYvt3EW2lMd5_Z=K8Yo|AM4n93Hp8~y>7sP6a=91+_wGbWK z-8Buv5hrh4zi@u>K$hf%B+J=v&Fq1UR?%9Q^i1)DD%eLs!gr9_+WuloE!1q_&iYqT zFRItY#HIwDoE+4Do*V*2@r1U!pXUu}VPy??ZFFkK>hMh$9HEqBgwiE(Kx56%2QDmG zop2nqYu(s|aJ=B`x}<&S7Xs{Qe$2esqw)Zhtp}k-q?q0t5w{}of$cpmtb$b*B1Y0x z<)%O0O->4bNjiqgHGY}XvK>vRstwre9_}gDJJoGp@Af97 zrmtr9M&wI%eDh>;8E&68!LLQe<#1P@MGh7J{{6sK)h%(;7huIty9UQ;gS77t zM>`|Z?KP8Ow|E5Ad_-Q6O>08>`NQ`&NnQyUb;}Mu|45$hydQhaL_dCQUs84?T{7s$ z4D}ShR9|JhNS8p0z3DV z9DJZqXE+YSl08~6v*Ui2%v%J$|3k()L;HoVPPg54UKI>(Pa=Nz^0Z--*;szk5Aaqy zs~fsZOs0Mh2qEqX5{Bh$@tbOV(}cgZuW6f$dw2P5)r_mjojrHgkq1kkk7Rk$J=>XU zr<0jh+D)`5H$^@QrtXP!Hf2Yh%sNA6PRr!c&xZYBobB5VUGcwke?6tMop+3&&&kj= zf`Urbz5p+)_RKxN9-Phnf9Ap@a*5RO{l&MRkIb;#0H=i}!|$$r)DghJVT)eAGJkjQ zZWv|zp}p@j+h(7CFefkgpr_iqeKR467&Wf(dVZF%n5Gy$QR(+$DJ>5Pk^55+cIyhe6k22!UT6O zHt)T;Zi}G(=9VwOh`HYMsYkn-=VmE#_C}5PUfIF+FTnA)(|2gSprVQgdMA(eZU(q$ z(Am9$xi^gqcR^XzcfSBCck`DUIzOcB?c8HAb0QpljSOcE6~>HeR{-i81_nYS(_5;it@z<&9^)-K=jn>)Xuw zHnV>FGFVr>c){JD70V}d|EZvxo^;Xy5yc~$d|BEKI$3+2qke8}+hAbA!5tPtiD2hw z#V$5s-t{H@)d^b_)WbZzUG;imA-GxE&6vaRVx?VvqH94CBJk`x<7?F?D$Vq;QwWp~P zF9^wcQ1j~Sj;%zO2569Idj{@S&;v zFg0{CT^Q3ILd>s{lJjDzxgFk&4f5|i#Qo1_TJEu?#Prmp99a}anM#~K@DhNMW*@ii zPy?tVkzKo#M3a}AA4;ob)|;I$0k#>1*E*YN-N-wu_r_wzr1Gk|+=^dpaT6y`zN%`) z@yvLnM5v~$uH?Zt9?$Q<<8f?-A=JAnQxa09=y}dLP#->n5<26EWid+Q zu>jC>h8&}#R?MgZ<9H}hL(VXU^DKM>drBA4_(S3WUV{4xmlWa2*P_CotA8Im-G;2} zjDSga+W}<6aT7CbExNRI>qK2_AIVxy2v0za&V{ZX@vHIFhJpnOw}HsDRxS)XDA&@q zimI#)lk&jA$|9yV&cJo1u{7fT@^Vks!0Q#sj-?csG|$SGUTR-qTkL09f7j1U(uJ*= zN1#-IBhc7L1bY$$?QbcifV1_I)v&tcNM^G?jAcbUeej6U%#}Oem2IgTUUo0UJN&I( z)j-!4cK5U7Vt6yR69C*xyT{UP6>2HIa6qfR{rlLDG{tt#sBwBBR|qZ&2XSfdgeO~X z1LH^oK<3f&@QsCXw-q-7pLX9La%?7JaKu!XB=ypXmvZte^>ku&jGWt@Vj>V!Dg@&1 z!zhXn-w=^?u^fj8*@yM68hM@IPP&bv!WyzSc`Ra2tjx5Zga402iuv(moKi>+fZXX5O#YL|wfIhu<C` ze0xH>iBHF6&4gcw;~dGKJovC zsZnHyB$_(*fjg~`D2c6ugLtSd?*9Q+g*M`%B<>qD}dt@jNZet%_N(^4V{tx=Z0 z8tQw(RBnZ|&UHD+%00tI2EDhGACz)4{77J?y`}+9A7L+8?LO~z5{F!4#?W_Xm7~9YOH~FH4MkIq!edu ze`f`Gy{<9s&G8;#hXIMov6uk*Eg}x+M6|X_nXvS#s+7l+wjgsdiD~kz#zB6fy%n79 z?K|n1E^D^VJz=D(>hi~yEuuQ;M9NWyK74)ptfzM7h>_lH!9B}*RY#Q?MY0kY)w_gyadyQDR011+J*Drr?yQYIAVbGC7KwV z4UU1=mawbKDH3!fc<3e@k59ab4_NTOu{^u;!iMfPl@uJNX|~`dYIMa{WbQO&drQu~ zz=)ixu!IT?^H_`Ol{K)4!Z2`q=|KJy+w?_j3`v1)p>bSb5{*;A+ioIvGTPRrZbwKCsz0scV~B$xMA#j$%a^ z(K}WG;EIYOwsy6|TH#$f!biHz%5jVqyLcn|fmb=|y=%UER7-9^ik=@pfh>4L$dFZ$ zg+6AYGd+F5``F7zjCN*tz`nQ8*>`_rgr;>lS(bo!)vL&y;I|OjoZ)q z28*IP%h&{44idM)nRC@47DCwl2c?py!h5;XMM`5U)1@-CA-}?{)64J&2}pDroEe|n&gme@9d-_#O;#Ovnc394=7qgCuO%=FU+BRV zyQPVWFF!R^0>Su0I!+*o`6B%S$dwGfB%RyexC0Ay=Hf6$OMctgT%3_hY1PPJ8P2 zzft?za1MEAM)4@(`c=)_aAv;?-nq3R?P-=6axy-n!Qy#mI9@lUGYn939B5HE z>&EC-KvS4(!pIUK&*{fZ5x>WUK0e+b?9ubFdPDxewtcavp_welaU`2S1ZY{z zd3j%Fn{`l-sNVyz8tqWYxai5aPQmTkA@^2x`0dD+!JXVP%Spj}j zD;i?e{HW^$5++EDXr{jYbgw)>5KC&Ig1(oXylT#J&Z#Up#;vPD2>k7Fwovz)!h!E_ zW&}br8hWl|Ph{dRiYkO^E-EBUx;OT26CW-U{0vFAgffIt#c zF$XVktJMIt!P0vY%5kF17s&L4I2=HYZB= zs6{uZrB>LWup2S$Mw;^zR~D2UqEM1V>k+ZULaPI;ahhTd(BsN%sLM)?5sZBSShs%vBI~ zO1RSHv3qa-_-mTquWh*hs#y4kJ~7U1(x;^K-hw4k&val3G&`m7A2gf)^rrIv{KomV zJ-7>Bfb)8vmTjJX=XmG4ucZ0?q08W39^+rMe%yO^m}g$!e8exxW%yqwGvxpNf~Z1# z<|j<+f)k6faouZpyVu*LtT#&f=V?6u(?#1|adgr3J0QvH=cns?v>h8j9n_S9b?^Sp7mi#B>$=~pei{!h``^RWF z`PALGMkI5ZtqqN+I)8yb1d#(UZ;ZUpYZ-S-uxBHa@uX+ljCDRGt~a)usfCj=*~E&5 z2K{_OCP``})T&TZP@U>KvNFIAv+Y|OscYYYapYf|A_P(@ZxW!=Lk&nB?;8cj-Ho&t z3vrk(He*;C7qpU4d4zk-R=CL1E*~=48@Z1Q_@^ypTS>U;DoF0gE`LCvMe!KeT*d8+ zt%c(sS_|py!}B8wHU{)W*qkgD-UM#qyNf(7M5D3gvSxY@4vmc`y013|Vob25e6i@7 z6ar~Kp29-<^&?yggV_-n>rVBSYAKyQUQMr9SJ9IDiGhFrsU_&Nb82|in!}7} zynEkF%5$5SS-90Ve6eH9a=1pR;Ltna+TK^UN)Iy$~dGE7>^B3qO|3}elbgE$rPqLk;1 z8)xCw`=dZ!Uc{Q17JQbn17WhCf#IdX$*T-t(Hf-Qk*CF^S@3;bQK^G9SmmA*MNjM> z*H9l+!A*DR%)|3@VdX^K(0Z6jOrZ0boAbQaO&L>(hwdMA%#>9&19yDLq=-{&+8nSr z{BGCC%lfBCKTTjVzD!_l``ZL&xpV?E=%)$HD?cVM|1ZVE=;CHD3-@RaGMcDe@F{Dv zOPU*qX!InJ12n{UEX0QwtlUtbZ@GP8uZoxIhiX%(b+PJ<*Fv_<5^d8g ztjUoRZk+Xfl?>yUCX8RHQUkdhEojc8n{N<2daj6(zzw->0cj$PhB(|HKFLd|T(wE5 zAu2&!z-Wf_4~85zWb|MOffN827tyAMdZCIPf9p3JSv+Xg$^t@A0hm>U3KPiFYAt<3 zW=Zy9v?3H`4|$}7RoH-B)S?5RytqnbasWU8Hkb-^&LWP!>T=*+u=;zb4ant|`8t8E zc>Y~tIZ}@rq)+ZZ7W5meToQ}(t1B;FMag~JVgHUhq;7ox=44MKdhPrO92Igt0@rK& z2V6Xj4xRKmqEvW4PHGI(Qo3wCdSVpf@HFRqf!a> zrE4#t&W-ISr9ZUKT|SWIeyU>b+OkNcExzxX{zXhXCg@jUFh~XIk3Wc8vVI=c<;Bh} z%l|Q0cuAA)+q*Kin$MnYzVhPXlK+1VX%|h$|m<#UCp-yDBO1b4;job(?pOD#yc7N{k9tWst$F84^>E zV(A3lrRO?s!6j(VK(tw~DQ#KRYDLhBdDXAx_}#t993T~Gy$;jH2@?*zQ@mqt-aWTh>rmB)PaymEk@p1sI-6?UfiXo3H>TrZ?8JO^JLU+zUwsW{c+_WC8IqW z8oP=03U6L5d0xzTK&dUeNj3$ZrPs3p%RkLTUYCQh<{WJBsb8Y)k)?FD!(V&pHH!Q0 z`lhmIzX7bu30m{3rX40)I_$^rggMj%8w6=JqPA#V37H6TH;bEnOz$SJ(!5NOptSY= z`Wz&Azj`@2-a>=4OT~NJ!oYyN@r@c6C_yPDZ&o7e!Tm0RWBY~bz54zs>>knyn+z<% zVQ+pZv`=RcWWHa}zK3K~s^6kC7>|?+!C$GP545W*tY5TD54F7|x+PN$_vrZP6K+P$ z!o8*Kjt+?_f!yt!8Z8xc&6RAq^VrC;!%f0PGYsmTvCDVmR!7?3B$#6w;8EwyfeL$z z|Kk&xrSpf&W8&5%=f>SM(lZB?^73gofdDkkWDT(;w?PxHqXkDmdHF?n$IT$Es2)J{qUAr|?*qxb*ar+9aVINnq0{b2&f6{`Gv4p2gNAQ;*pu z0n2s-3xWv{KN>^El}0jDfbUwT%vMT-R|Fu-jg=fq z9uQ0on>UL}i+c)Qlx_*aK%>DlKC@iHHmejRtflh&`r;-Dhr&my77oqPVKW93J#Qo? zFMdZ3i7=dzF$mpFREUwJ7$qjU^-hX5eKGOIO#+i0+x4>j&hI@(^q+L1L~rFXb&RMsj)kHtlo(YoLf-q{ zY?-U2>C{m&uDCU&Q&xRxSsU8Kh|+wo*0sqbm^6^`R957R+YeSJTd;^iUeapTbVpeb z%IjfcvpjE+rgFkVPqUrx-sk0{#amzW1mb|n1 zXLJiFgSv{bN?vF5Yq|N2SiRYPCHlFoipaE5!;a{R+Hwoqpm0iV06RX;FI^6k(-Nek zbHUasoT0c*Uomn2R1Yx%Gj>-1E^ zIYbRq1RGdbKIvdWubl4QC6tTCd!?{iCj!M+sM1@b(k88qRpqL%1KDqRFN zEhMQqIA(d@e5lE0KHPuwg`f<>$_6$H9hC4Is{rrt>`7e_(R;&CyKk=KhEg^{uKwB2 zRV&+y=I<#5Gsp`KF5Y1C@^X)%LAz;)`D$9aguuouq#4tH9`lKYS|FuY#Ij)^=3UNh zEM>9X6)^zYV-H!)r~jS`7Dbi$;dMHZF%^Dzo#G2hE0@b`uirH7Z262Rxc;#EE#Z{Y zkDERM3JdJsvkvF{)$>(9LTgB0%CGu>PCTFB+fT9{bNf@~gNI4WD_f|^569dmv7Mbkk1gc2{v>ECQ=oYnF72V?_vYm~=zWx69TY>D5b<;8>5m2Pj(1{2dIaQ_vV6`^k&aB?sUmhVX^&fpTWM59zJO}&;h4=RH;iTC zONct6cYXS%?xx(hT$(=h4tryl1<-40N^4QX?xrA+$(EU2gxGk|#^L8Wrg2G9y5?K1 zg|P2#tj}n585Zmxwzp_qSHxwRE|e$y&4_Hp-lq}VVz1dJSj8b!WT{bWq)}~lD`log zHrAISh`Znu$3E>Dt1}+&`1CcuCTuCR$@`E^e7D1%-4(u&7?Mif0lB0vB zJw%)=9yma^5jwf^Ys-QGd4CwZyalQE^@h(JOYSm(;K$+0}GO z&N>bKt=E=DZylR4YuDApKR3d{e>dkER5d@JPQ5hQqqq*UGxWXqrQ)j=(WD2v(a|KY zI0&0I^G)NF(3oZ29wk^WN!1=-8YGwLq|a$)oT20_x1sq&zuenwWSmbni+__ukZF!m zNKG+pHbf*p(3AIP(dzOXgc_}{hF3=TD!LFtbCpxb+c}ErUTo`3?^QeHIfVz+scqqK z%25`;(T{jeQ7?5_tHO;)L#D8Cqmi94utd>&54sCDC=@3oL9go}Y z&2p{~{$F+>^)6#n=C*K{O@>a*7Q%Xqf;Z^dVGnZ4{c9S$GF&rt8N7H-Hfqrm!?-)} zOBk@A)c6)7al;R>|Nkwqe|sA|U!yyD=f-A=rg?g9yKvirn|f5c@Hr(aw*EpBFBB(p zHryeARg`zKam~vZQ@u{NFja@d^b@;20&ViVgZZQ0v!8)sQbPFK+<1le$5phHGW8eN zwW{Ubd*iIVrPfp)2*`z&Q-(pHu5ab{x#eRsV2lC4V2Jb=1c8A-00aO)SRFcG>Phvd zMP~4d8!$w6#Awd|hgf5Fx6m3QFKKrc5y5}fwXcD^Wo-jf#Af$KQ-2n`Z9JbU9_K+3H@rk(^Pi%L@ z-Hv}fYvx{ia#$bTN98a%_BEax1MtGnT10LuFCD;`t~_~SZD_`ukv6o z6`G>;VyXOWi~C|<>n)o1h`Cv-p6zKUi0d_SdsOSGa*h_<`SeM{7%6WXis4%c_b^40 zw}c$|pc)nBsH?vtPCtzRuNM`qIbS!_84?Yhu!V6+no}hNb9TRA!hRf8}Uq&l$XNqe%AhX11|t+e_7}d;ExQvxeL0lgD-rm(Hv4ciUGenY!d% z%F3`Ytj`Q)2g|B|SaM0jx7>dBn%mD_?}sjvv2J<0Xr4-YXuoBkO34$?;4%eeY`fAF z+OE5aDA1$D;TxZkKxVO(Tw8+JMGTxc;*@AT!_s1E$YyMm=Z9%bC~v#f5 zo@=NRHt-(3L8Xgz|E@V+n8RooA?P!;7vf-hD^aro?P4!t?C{Yuo^9lI%eYt_Bnao; z!nRwvsScDjZcr(Btm-~{-}Cw2wv}O~VLGNqQm!qFuCYQvsz!DkZm257i3R6l2}V;M zU291SzMbhm!*WU`7>>z%8YmF8bs;N~BvoL_1NP11?wXpcsmzO9HBHZqCUJ<|Y^&G1Tle9d%SnqItFx8UhJ&7+IOhb#R~80X-$IkV;(0qQ};VtCg2Ised149PzBWkM&S!$15Zz}Alppov{Ud@=z)D{I@;9!`yhtHFE4 zTch$v8!)CXy2}jfJmTbS6dumVyri`TOpwWv^zA9YKchk&YxL@qd@NI7b4wAF1v9jj z%>%WZ0pS|*5v)7Bhr9P84<@^$;Y~1`o$J09s?BbE+Q`A7=n+%nzPTtmXG1i9G(M9%-$X4>UO&s%5Lt9n0u}s4UihL1vFyKR8z+h z6?G!57tN2suGizgGQPfc2EiEHZjMO-TVtvNJ$n=g8TXrgwt4G7gZ9!r4%b zxHCz#bFxFCSq(_INJ6~zmb_J;7`B2ak3UP_T4>}CxRNsfjf>OX(vO%TbU!3ma$GOc zvqS*4f_O~Hb`aDqi8oX%Xrr^?b5!E<42)et)}!e5EAe0u2uuV@1~SYOW7b+U7M_j| z@i;-nAP`sprixB1bZvE-7Y!v&dWa$cQrcxqz6+1vJfEWjlgcgNroJQuU^Meli^$FaQug0_Dxd zeyIAE-Fi6@aml=S__{l_=P)%9Mz>W8b9@_BOkjQi7cx7o99qPcDf6RzmmqxVl_Qfq z+>HlhRl)mBm$nBN>I6vUv`)4*J}CGGms+z!&XHy!U+sXr7wkNwdU?-jgFA^H4dtB%y}DODHPo=XUx$6zn=!%)Vz zji%8~9h^ybD*UFGTKjH~fo=FVZIy5PuCB#Ql>_Q+8W09~-(>@T+o%5pqn9JrqG85l zgQ$R@wu$~q+>4k;sdD0GI$7UmV(Om05?WI<6%wNdJfG;#YIqfBnm(vLQAiYYPITR0 z*E{ID)hKGnXF|>-yzz`5Ts+6ks6Uhnn1C({!sQ(?{v~mqdR{@Sl8Q8~H|>k{HWJLb zKq+9Ff2MOXmK2S$s!lU+i!$HzU=PyhemFvA4yGtF_jUWo4PZzn*8lSGB$Yklt&;i+ zlSN%r=Z2;L!t;um7DL*`J0p*+_4C1spkq4aKI)Y-I2v3Hh7qwm5}1-4Gtb8lkYA2K zySk)bU4yzWm~99{oF#OSc(y?}pN;mxeUo-zS*1$47E35e(5E6-|53UP*RBMfr=M9B zIecnsOMH7yzrZ+SfKAYVGAUYK2eWelOE`^?NxQo9_0VDaIYW`R;Z1r)?OI%D;gaB5 zesM_=WF<(s(FHg-vw>3Edg^(U9h6fvgKAD}z+@sNz#X9?EaoF{zohT|yyDjB)~?*F zAet+lm@0fWbk0*L@ir+l)=rhPKjthZ7r#@d?ZZs+ve*yvIaA-!=-F95`UH2@g?Ug_ zCnW2Q{L+$i8HYPwriqmV`08b6Hm!-tU;Pe*f$AsN)}MMtPT4XHU7ofVQ-!7N(VMd; zO9`ROu}dS{$r~X1JS^fd{X_dVget5zb;?^*?lfk7qFK;g7w?0n`_8lz9=RTRKdo*r zNUu6azL%vaKC}pB=gp|++~*PBPH_>z?8~LOOViQl4cN>t%2G=+Jh&+ zTUvwyo)EeP(0}V#P3Lid3fmG{-5~CHED=O9m94OrS+Hv)<7s>c+R=a0BX@|a9vtuW z3Jo_?_qJL!=o1aL@Fy|B;6!5r#%K{0rBYpGPAmk7_cKjV6;`kX#UofTzwIhf_aYM$ z`g--JJCnu+rJFeI<+_FjXVme4Q+OBjfCP)-qKFMJ4KiJq7!+57BD?BuDW+r^Zv(Ws zz-I22`!7zty{uMbbv(<=HR}Uo(;|!pmrBP(J{E6$Im?61l$B2@ik-7dlOCY+OlX39 zdsOretsg<_9&-i{k=LNaN(eBZ{Gk!TRD$pAjrE)h7g6Nql)+1?uM`EDvy@&@`6pjy-hQr;90iiE zPXe~r`b$)Ej#4lD$`)z~r? zEC%SiYT1~HGdp1$Tamm=*D6%Pm^kZ?&W@Lz%Et@}pmCsY^!5B?DhD=!{pS0~SU_3G ziF?QAya>jZ5$?%2FO6^h_5H5CfU&JQt{Qph?Jk23H)1l3E^`NCUu^&O{mN4>;;ZDt z?yxXHTQbOiD-j^*1CXE{LCz&;?)K}E!qtd@_wS)e_pX!PiPE&Mbkp`PF9{3ugws48 zS#?!HF$f|bPom2(v|=RIRQkoEoY_e%t?c{Pkv)la%Wh`^WD$VQ0zkF1%yd7WRNrhP zi1_el@*urHTl}2d3i*xwB(0=oeoKK*lCFN@y2*JQ;T8 z^t;pQhL4ZdCg4w`?mkcX2w0l(r|VYMV&jj-n{YX)z7R(Kz-7zY+ogLwn`e*3uA&@! z3Co(Ea{D9T@hnCD)EO7OkZob)7~Z)Z_G+WWo=PBx;dIS_^61gXV8#yjjB9f zL@W*;-{^fdWgQ-@)0f%rWUTHCuJnQ`P2MRpyp`_YKe->{b@c41*YfWS%n$X|+ue0YkKv87NMysQxLF(69-I9M>WCYCzRL z0zsLj&2lrFK~01Tvx9LgB9fd*gyhG61VSzEO){=av+9oG-W9yQ*?8cXfxL&_eO^%M zkwm7Mg;`UgDZG_lRvgi=7|D^q%|`M)Fzv@BVo+>&X-U{qIZ&fd{msIX#W5uR&`U?X ztyO{u4`COT!KmZ_6wdRuxxpel0t!WN!O8KAb9w{)7f?|j2zfT6Vj7Xi0F?a9^dqOp z-^-o7ZPa_ZcIalQ;@9p+11mb2nuxRRSC7LuwgU(f2asW9Iy}=J?@;6_$<_10Nd3-Z zN1fHR5O*yHy=}Can^Vlm1`it*Pwv8R@j_=N-7jCkq-J3wie?R-6i=5QgpWSJWQ=&( zjkj*(Ixq;Q3~eJ+(~A4vI*tVsVD>9z*UYC4IfpGe+cybxA3;|H0Gpsp)$F#s<`dKN zIc|#xSqIQi2L~ts&_4n*g%gYv{LWF~BU`n2uAe4HpxE`7AqBq^zj*T6%Oj@mFN0!! zX9NENKvXvxrUr^w&Bx3#pBO0ScQ)`Z-14`;w0>?#HF^*p<-_#2)7+jhF?ia~b#J3( zL~+!4LcTPz+{Dzq<|Z&Emg~H~WXFGvo+Q`-8 zn>(xL*^=^@6z5RsARc*}nAs%ZuLd?SQgVvc%_-KXu}Qh5Q5xZ z4Vy?~Yn~c4gA4*Oa?nEMDR`Ky&s>7Y1HeSLS32A9n;knW^nlELm_Y~@y`WmvPVquE2G#H)h86|T0NPWLpW>@% zopC%%!Ydw1fps&bQxy~p6qxj0FmWTS-vd*8ucP39M>{?OFL$ik(s}Be4;ue$0BF%M zpu(a^J~USd{;rUl(TRh#u%aS;S7+yl9X71&YER$;_d6NWZ!3MOUC6D0;D?bDInj=FozW z&&LI>1)R{XsxaomJM(t+tZhlsxiZJ3z|w*P(JHkBMIy4wx4gb+b}cM$H575_w($k4 zCrSC}yiY@FFc?Y$IW>`%;6@)WjkDf@FxcQs{ZLBKQ$Ek?7y0Xx25385HgMNyHp>lM z)Y0uL-7pTJteMgMp5RQMb-nRMj>ra^zwMwD%wN}tVTb|wJaXI}`={9k07X3#3dPOb zwmK@s(iYpXyt!i44AFah2y@mI!EaXb6s?vW&`ntmDT~yV70kcvF&_gs_%?(VWS=?B zN?`>bKqUk|Qs~JJQhI-4^3|n~V#1yc(>PT!g*s3c01Rg`7dckAIUc0Fij_U7yli1w zH%~}4Y#x^5P@ED%XjFss(ud?~4;N3&;N<6l(eI-_Y~LNr?v{+T)GnXn)crWjXb&IHwc zy}>wCj&>7Cv+bH-E|ASaU}iga1t|cbV>Z!se;uVMF|&$s22#p>I`ARe%j*pD6-Hd& zPlHV>5n;}y>=HE)U6ppet2tlQSP8wQhs=xRZAB(3rZHi&!=N+pmW0W0<`_V}J$-Vv zvYaxY9)sAAvx4QXKsx12eN~V#qzeO$6Z?Yd2)f-sR?5g>wzq{huv|i_XG&C-*6XSG zT)DZzr6@&7Mgsm-WT0$`Ar%NmbIr-TgZ9sR!Z%lT-)@zQcc*9C0Z6NJoxw0iCmQ@F zc#0uox6ItB3vuNrs{ zibKO2^oqnx?6FiImKS3~<>ffQNy^yK9Xyc%pDWA0ZRZbr}V(teXzS zs{p9j4q~k(6a5qi;B+y^VnwTu&1l!gf7OKtO|v_V55%7*jw03NI9%Jw!TNjn01~l% zy&fu|`YG`1@B@wks31A6yai$h(@FhL?%Y0O9hO$8V8jJ3gX5kP&ow#$As^~sRGfsM9^Zyf7}E7F=oPGSWuq6T#~*V$u1ep zvN2D6(``SlcF^+tHJ>R(0B=Bhop+7{M_`!GhR!owg#;V^d(({Aw@aK_^e()Xs zk^A&B-{GFaI{$`}ckJCtcU(3e>K*7wWIr4bM{#2JM2UAR<=PpZKdiV5xBg1QpU!?b z18mFgMTdcB4YftX=iRMfzinPbj(dj<0`NNHi2#lXz+Jh(Rf9ZiMJ&-^O@Dxsy?4`8o965JUp;1>r7WM(2wk8?@!Zhq$Z@da^iQ+MR0IDcJ+`ZvX zI%w+OUt=|NkamhP^(ZuI7J&W;+%2vog9=tH(f4yT(YBYpQL$$Wn=TaFpY|YwW^YFQyi+zcvP+J_}x4q$=a11D$Z*_s`Ryzi)DO`Umf<9hScju=xcz;n!N_ z+q%Ad_bil&W}C!|eBt06oZ?Yav!IEtyR4h+mkXB!5Hl5xC#LT0NBBP7YP=IT?u3Jf ztBwH$SwKId8RHQAeFB$?dOnG1GOnQ8P46k&JO-HFK^FHA=U{31;5TVdplMrtrtYkG zTy3q?zfapOr=$h(su}7SSST=BTNlzjEncYF@G_Z$x?NvIvhYdQyO&ZYU`j$(weFGP-JF3N}vbC|@ z%6Vp%EjSR$*;xmX`r&2gdM$yLaUt39D3O{98~F7*m?=d>HXwLGrtK1IMk;V^vaWmM zbZ1!KYaTQfRP7o{l_^2!wuZ1ZW6+oBjeR|r90V`po-KnEx}5SRJ0pqb^!0U+i9{!} zq|Ju@v?NQ+=F7GFG0%EBAwVjGd*bznIgV;8);flkSlI3&QC6Lj{VJLPSISF}huLL# zr=Vj42Adsd&0u@3;-=z0qPQCH)?y#soLAg{)Ofl_9i1Y^YPPQeM^r2zz%$*@)UwBTbdY65#Bg)Ln z#8s7EqS8P*iU%0Q?3Y?ZIEWTuIFeM#2~t;8A>rUe>^q>~k$eLj#swEW<1@M724f_3 zQVhabZ^QO?g)#RhdtTt(Wdl$P!qu7CxoMqmukRdpyi9W3Ii62sN%k8)Ku@uiZ8ru0 z0SJ%-js8bBiBXwL1E4kt6f2`OB6B`y>@JjBJ=B4iI^Xo73Q5bem;&7znt;Iz18#7S z4oL|U+_?&sjSvwS0L!HOCtzfeez|KVr>}(5tJ_yiZrWvaYaiqzz^gP5e_zIb10b}p zpIH?RQ2LqUpyyZZtm#B!8#BJ#+?3TYVM2BSoX(dU_{6e^>uwv85vT(1{n|FeA@;+6 zfxE^}gY2Isg#R4{Sw93W>g8IO1Q3ybp}WS{Oz3_D>YnfVuyAzZrt1GBf0`HFFnSpf z&1j}6PP`+`ue9tp$98@;yOcPPnVXq;d>WKCan4HCOwK_c9eE0k$^PcfE3dlsTFSW5 zG=_NMoSin_)yX`|5!Bb{=`?>2K36}Rn(GF{0-#{=F|#dgwEsmoBh`K&#R}aH_5kO4 z<$&~D7-u=V^KJtuYwg-ewgD=AOB;QPM(pXfrBj=GbrI957G`lBAkeuj&tZ+$8#}a& zuLQbA6RxR}8tnO>Js?1s5!V%@9JyVfIeWk;mGg1pBz%E9>gp8`7wTgs5<*q<%PE`q zO+g4Xx@Z=73Zr__-GUYO&zH}EAq7Vw=x+BdpA-og+y&EuiC(LZF{|5M+hgy#Fo=kO zqhQ!!uxL_|pDSy0?k&3UhG4c&p4(b-_I_KM6MAL>Ec_u?3^pb(8DLq(*-A4S{A;0d z#5Mz-YKhO3sIy0+2QnKpvP=;Y6t7IJ0;IzeW-rzrx`TSKNxM@Llp@YA&fxlHG#y)kN<61A2g5QYXH0drq)__? z8)^v@T7ptrMPRV2Gx|lwLZuM%jBL49x=PStMK)$!Kj>i-2;lNCfM>)PX9$0f#f`|D zJt_8k;I2;57p9T%uEKh@!P7+&&4fru%xVPlrJ>dbphGjg&feKmH2dY~k>FB!K}gxi z4Suy&gaAtgAmy$)>lEGvBgH6qKOF?k3clgDOD-K6RS;>UsZeU~OvqGxG4Pv}ymN$? z;pwCNOGjpO>o15A z{IAe9zI$TKgg0cbEK%&$=&)8_pEc3WQLBzYlcl45Gy~@lJVA9I9(7lPu&43a3KQ<^ zvyG-Gb!`#m@)4|q-=(9`U{EF2R6IA4stRUMiW3#=#dZ3D9{A(T;q@hLN(*RRR4eWrz)Su<8)Q6-o( z-MyXnaa<|OgSoqQk|=iYdtq;U1iCQ)$tgqf8KrND#C3P2SIum=0JX4*W#IfRsD zAzlbgYw!W{02=tjOjZ`Tp@z{=>QcjTO>mApJzwS{0GS(d^{qQ>48YjxJ{aZR0r3&B z>1!bOYu88dX+Eohp=$f^4`i_lhVtlGsCpB`v4!BwPXCav}7hA$!*x z8M~lVhpnio?C8tPzjy{8|5v+T)gHbe^wumKo>elPd? z+xPL0PqggskMjA!GAg`^o%hPGZ&!;mQVJ`&U-eBka67>ie3bC=DZbpqv|8}1B1l<_5j19AqyTG9Lh}z^{L{lYh3FeG53&EJ__@ z)~k0P0nc*NPA~zArOwIP$4L?F-B5goeqBG9oJga(L26Zy>BXQ_mtK9NjhCqz#}=Tg z^uo*S7z&07E1&h<=8Y%ZMaaxOCaM%FVj=>HqAFsTxpoa(7p8)#7xau|9p>ON-v#&N z0OwCXDu|Fj=K8qP?jwLXAt>#fVP3ZvIl8yTSXi}w>)8OBcK1z-;bre3b~-+1nO+tU407+=IPpL9O-eSC(0+E*rQJ ztMxEfpC-vG**WZWc(4Yo8$shxHXdJ@LOPtJRAc(#A?rie0l8Tu7S|%5<9epJw5vnj z@`dB9CQK@X*X#A7r9~VA9UrL7l_7H^QPXVfb(GRS0wo#+)kW0;N4T8U8~+AcN_unV zLFYbW1X`F8adj0Yhn-Ps2<2-x)%9HUvxo`G@rJ$Cj_CGv;5TB?c#93g2{5pkJb&|z$ zzL?vVs4BOOjtoYsIf$4#@21bx+}h+4?;1>7T=Pl}mQ69%!8F9WoXU-0>*_uwSM?m0 z1w%+=Kg)$sy=?MQ6rGqb`p9C>rQw@@9L-OT;VYp1kJm3THmQTMLt zmw#5;y^zvTO$Yc09X=Veihe&0k_FXt&w*K$HVk`gs@{&zx_r7xTHIKjnwZgA3(16P zHXR08m9E2o(d6}JiFgSox@7sJIg4Q*f!vF(l32a{Rhj2vH31z`wkXFa)VzpcfDx%| ztt(x#v-uY_b{i#M1%KYZV8j6vcxw1}j5{U-k5)nX1v1zk!4!4mf*X>+Qtg5jbd zMR9VEvFg!~>qnnX4KJ<+ajlxM&zzFI&4UoYHsMP|)ntnh_}0c~`ZKMs!ca|Fm?%{( zLx|Os61qKo4PdbK-m*3ev?(69bhSGA$DSAUx?TAshhcn5`kyi9lSL2WlrE14pq({StCHx zc^(GLWgrLR>1H6_^j_11F+i$+GvV;k?^6f;?wLpbuFCU6|K=O38voG0`KJDBKlE>Y zMUwj;^lwTGgi|DCT~yp!B1)Xm+Inimd2DNVbR->NlK8HUh8D`(XYHa<{~A zv-#+ZA;7hD%>s&%nh{_*iuEH$$XfK{l8u)=nWo$AjDn1Ueq8`pL6zH}6Wp5IT@#wU zUBbsMAzG(EAA??|s58{v-qF6s{jGTwEQFO>!{9n(WC$H}x16lKnNTc~Y=Fc(W}(@d1n!D1N6|-4a1s%*E7rXAUCm&M}ack5nL6DQN@gC}M{GR|((h5?Hkz zh% zdmWuj195VoxymP?y10|)K6uzh=Tr=fpH%>0HS|b%2g@b+{iE~m8vYXqc?$Rj5;n~j z+s#<&N-Q_4!u$w}LB{;L` zdwbG~YB0}4k~S*+1l7V0D>_Ed1V;H1?MkU5op{N6%OAox|DAsC4`G}?S=;r8FwUQ+ ze*Hrj=O0D5|2tuvcJ7@98LzuM4@2tu**n7xoXIZ^jE+i+#<~GPkyYF~Jei0`Tn|I7 zsmf#x>|1=g6$V!julVGKd?)+%s{4J)DoWl#dvpyloshuYDcvqH@JTf34GroCL<+n;4zzlr9|d#dJPcnY`I z7-v3{(!5-p1d0b_gug8`lkyr62+cQo#Ym7)(@0ok3?-2qY3oi5!T?Pw$)&xPoYfA$ahCm*|uFR+$wJu5AITK)TQ zhY25J{@QE*-f3YIPXDstw^5axns_oEZIR_;YP zNj7A{HK5D7q5Zk=L46`$(fHqyu0QGz`E?30Ul%_s�LdVZ&6=(jI2a!YpoZ&*hLG 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 N;;n?@%+>YL{{eNg!-W6< diff --git a/vendor/assets/foundation-emails/docs/assets/img/cm-email-client-stats.png b/vendor/assets/foundation-emails/docs/assets/img/cm-email-client-stats.png deleted file mode 100644 index 7b76835f1fecff1b3c6b2ab61b6a16c4119ccc65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57258 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 C^K4}R diff --git a/vendor/assets/foundation-emails/docs/assets/img/icons/footer-expo-retina.png b/vendor/assets/foundation-emails/docs/assets/img/icons/footer-expo-retina.png deleted file mode 100644 index 71275576fa5e64c85e8540264501c9477aeb2402..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2137 zcmaJ?X;c$g7LIJP%OVN_8UoECOGropi3v*x#At#LwlrWvND2s0NlXe76jY!^kZwgl zlx{`i5gia1!KFn8L}V2Podc-QG)5G#MR8D32Nb4agFQdmsaI8RIrsbS{qDWzyn^5$ zx`FNnT?7JQz}QM-!!u6xX=}m%4!PwtJXt^i94J(j0Li!#0O7|M#REtN$V~*;0GFS! zs|O$>5bAb3FF-bfT=*CsqxXD2=j7A{HK5{XamjXb@cpyiBmffc=Hbe7$6$~If*S^hClD|$NUS>si*|=!f-43`!V^eXPvr80 zg1t%j2_!ZxaM>5Uqo9%?NK8VbWipwY%)?D2Nkn6aM52lVi*R_5r`pyNQhK1a^pp55CsKC`iBHi{DoF1T}~66FtnU2Mq}LERgzW=S*-tW3W8s( zr4SqVGv2=>mWE}B0W=$siqa%JxNr%!Dpz8XzXaeyB1xD?l)93|;3N?wk|v47NdHg* z(vijG352Qxr_Tr$i^LF0A+C@IFlZDM%;6>w@JSwCL{D6R2M&kBV=P;`V;Y`DVfWHUc>#JB*Gk{{)GYyak(gA*;L;u+G7ZW zMlXZr7bYKh5f!;(ZHPHg$uV|$sPpd7wilga@n;J}_VZ73*DP+>m%U~_ZqS?;pLwY( zXJ@^M)2%UI4a*!#}xAA>bY;^proP5FasyDH@2GCKB zZyvnvTT{>J8)>~%(I{uCZ_D;;l__2St^EdiXg|)GJ|VaU8nwx-&RKEv^kjM7ouMUW#9h5KWA-#1xbR~yy!cQLW)o_tcT!O?oVycFz{qbX&TgiU!7!( zZf0WcmpTv+#_duI-%_|}u!Pm^IHb0jZKQeK(t1*Q)c#iB-$RE^{p>O~Z$C^5CFBoJ z3hPS!S&^s@LrD6uPf3)ww-yxgn&L*5Ebmu+tM(gFwOx`T%R1A`#^0_M;5NM9Z~DW8 zyHBk$qIrwb-hw!imst>$8lhV-^n079<(nC-37zzkqL?XKeROX^LY1{`y~VnMX0`sf zim8on(8Xr`n4l`}%Iuh%sZes-Jd-@gs;t-U;L{)?{-yCsLc_hx9n z7rmqGwvg&)eX#_4&-S?DO-e_|oO$V@(x}DKHa^tmCN(%=UA>8a+6z{(&5kQ4*V_2qpHXIXH(87dkXpIlgtDNl>+b&yWEE6{AI zRPJvd4@%1EFiYkRern0%9A&;Bb>F){R^NN)Z+*<*xW@u=*yH-yO|z#577ulUW*Zi! zTU-o{-!07;lFtmae{}Vh>KA*&CXXugo=I(vRVt}w8=ckW?J7o{`W6VS4}U#3J~Kc% zw1`){3ieGq7fZ~$B^qx$+S1mw`;*4?;K_G8lHvS`N=Z8OViy7af4fsC@A@6C;5-PIGD znXl{0yq@*^7^1yzg!_C=Dxc9>NOxIy#QB!08qGi5L$A_80D}=km#M@o)n(5J2%^8U}fi7AzZCsS=07?@QuLn2Bde0{8v^Kf6`()~Xj@TAnpKdC8`Lf!&sHg;q@=(~U%$M( zT(8_%FTW^V-_X+15@d#vkuFe$ZgFK^Nn(X=Ua>OF1ees}+T7#d8#0MoBXEYLU9GXQxBrqI_HztY@Xxa#7Ppj3o=u^L<)Qdy9y zACy|0Us{w5jJPyqkW~d%&PAz-CHX}m`T04pPz=b(FUc>?$S+WE4mMNJ@J&q4%mWE% zf_3=%T6yLbmn7yTr+T{BDgn*V%gju%ay2wCcC>JIb91&ZGcP^Av7H3zSdi8;h(Fa8>QdGl)fawRsgeP1e2cGm(^ML8S2$--xKP`1+ zU|`(s>Eaktacj+#+uAOHBFE0pyi-&^QS+F_^eNGaQ?k8G?mY?o8E^Ahyy6pk#WE57 z#UCF9xlCTzqZr6`wmJID$F;xu{BGY!pB%dXoZaqkzrMx&j=o(cbKI!I>H=%mK}!oJ z`MU0$`Aj{p|oZM;G#S)^~EXJu6*q-AtMOfayzvWPk9aKlhs0POeq!H;kO&tIE{-K8`n zayj&+a8i*@W0hLDN$!7BzCVi+i`J}ux8l(}^YZ76uj?1H%(?JA^YX0OZYLfuda|5> ZnPGL|1mCRVnaZHT&C}J-Wt~$(69B2)>~R19 diff --git a/vendor/assets/foundation-emails/docs/assets/img/icons/footer-foundation-retina.png b/vendor/assets/foundation-emails/docs/assets/img/icons/footer-foundation-retina.png deleted file mode 100644 index 03d7d06b022fbf980f24fc45c5fa00f75ad0387f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1980 zcmeAS@N?(olHy`uVBq!ia0vp^CLqkg1|*MGNWTVBk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m{l@EB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMwS&*t9 zlvO-#2=9ZF3nBND}m`vLFjeCsTY(OatnYqyQCInmZhe+73JqDfIV%MiQ6rXIL(9V zO~LIJC!BiqfsWA!MJ-ZP!-Rn82gHOYTp$OY^i%VI>AeV;uwVbISkJ(~qUY)27*cWT zO;l`-kE6)EtGS_nLslx)1u6Mn$ePNf`D*>6gUt$p=Y3UtRa}%lzB_6>>CwS%mWL}J zIbP5T6}_tECFo)j5*WI+Z0)sQ`|cD=W`Eo7TW0=UCH~!=o7VT|85=)8bI0=f)6YLc zj7~~SO?f0C^4&>Z=n2zO2REJ=O$Wh%GetZ$FC8Q|SOi(eL;?WB!2cgFwpu zCV{7qg80r{T2v6{_C3 z8^rQNCOoj`nZl60bzU8B472}odH&n^lm1_Ms+`Vwq2EmZ!yU6J&nGiye3mc0&9~ig zX7~YD$zP@iOcKnc_AE?vkl!GukrVYh1&>qa|so%fS^bUX1C1HuB8ub5l7ormo6SP+!#=TJ`cchfe+6 zjV9Ap++Gs8w8ix4qezQvgR6ZJuGbSbXiWETtDID)KYfF;O7>+&&cDlZ_WL~1oWAJn zhLGpACq6E`DE`jQuZzD_^{~~G%i zd9r&`U#sT)$%;9jbJiW?yj>`>tx_gNFY))XH!?!E+IJk*oA^ojwt{+2yQOSeAA_%2 zg;-yUBdfxx&Ok}EZDkCRh6M%Lo4I8~i&nhQKeO|m_?HHrHOTVz3c?VY? z-{Et+g8ofct_@*Z93Yn|D0`MI)1@+L#@pb%LVA~<)H#UcOxv@jv$-ycXUfSh8!Nx~ zJ?!+=wYb&HA|E x`8+m%A`Wx+rCn|pKX>Sr#1jdToqxm<82ki}vbrQLoB^s&Jzf1=);T3K0RW0!5VrsT diff --git a/vendor/assets/foundation-emails/docs/assets/img/icons/footer-foundation.png b/vendor/assets/foundation-emails/docs/assets/img/icons/footer-foundation.png deleted file mode 100644 index 143f9eae3a05bba9992b430fd172f68bf2597573..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1297 zcmeAS@N?(olHy`uVBq!ia0vp^5DSr z1<%~X^wgl##FWaylc_cg49qH-ArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XRMoSU}&gdW~OIo zVrph)sH0$HU}&Uo07PcGh9*{~W>!Y#3Q(W~w5=#5%__*n4QdyVXRDM^Qc_^0uU}qX zu2*iXmtT~wZ)j<02{OaTNEfI=x41H|B(Xv_uUHvof=g;~a#3bMNoIbY0?5R~r2Ntn zTP2`NAzsKWfE$}v3=Jk=fazBx7U&!58GyV5Q|Rl9UukYGTy=3tP%6T`SPd=?sVqp< z4@xc0FD*(2MqHXQ$f^P>=c3falKi5O{QMkPC z!8&|>tvvIJOA_;vQ$1a5m4IgGWoD*WIht7*85@~6yE$8!85+78Sy(zdx;Yy<89N!f zI9phl!t}c2Czs}?=9R$orXcjX;M5CB47mkBn_W_iGRsm^+=}vZ6~Lah%EaOpQ%6f< zH*<40oaRCGreJXkM6ZPbPQCg-$LNEi7AdM>LcsI`V!{(HkONQpsd>QkUIa|o#!R^h z3=E9To-U3d6}PTjy{qk9C~@H9{WQPGLdExbIhv|@OZLRx*fUjHyy&rgK$rcorT-l# za(lH*SfUv;O(^@GP*jIe-}}kWugto+u1>uARq*Yfw&~|Bt`G33yn#e#t$ zPfl_wGpSeWCiHYJU_XB2SohCfEuKZ9o+Zj{vU{@qY}+obd9M2P2W!kvfeXx^UmP;w z6Lew!v#YLwWzmd-c3BtL=0DSUEEgPcHA!>*0qL+WM-;cr-aqk>&?>{GX)>1UXEZlQ z>ipU)G;d?tr{m1mKCh{N#hU+6JK@dIxM#*21RwAC7OfMYcK*;aSr6wWxne6OuiF&q z5O=2KEYtJ~omXbEhkMVO=}r&RePyI#laOlf<$SZk&eaiEx z))5C*gvFenkr8+25s&bW!)*JCzwGfy7MguyD(n0+zKdAqzPSF^u1Edv#$eg{zI}6R zt#&#^1?ats;hy@cD(1GyGtm!+E?)fEs4OXA`LAoivlFayDmI&I%lwUgY|q5Q(ED@Y U@9$@q9sw0np00i_>zopr0GT@0CjbBd diff --git a/vendor/assets/foundation-emails/docs/assets/img/icons/footer-icons-retina.png b/vendor/assets/foundation-emails/docs/assets/img/icons/footer-icons-retina.png deleted file mode 100644 index 17fdedc867689e0cb9025fd81c8b7208b7488d47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6389 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 J{_XZ({|7rMSqlIF diff --git a/vendor/assets/foundation-emails/docs/assets/img/icons/footer-icons.png b/vendor/assets/foundation-emails/docs/assets/img/icons/footer-icons.png deleted file mode 100644 index 39b48e1c08e77c4773504d1ca0b38e4555b8eb8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5662 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 U57zh0{A26p?CEr4>;A+40w#Z+lK=n! diff --git a/vendor/assets/foundation-emails/docs/assets/img/icons/footer-products-retina.png b/vendor/assets/foundation-emails/docs/assets/img/icons/footer-products-retina.png deleted file mode 100644 index 04fee5d23f81e745ab9a4e178bbb8b7722c51e9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2187 zcmaJ@eLU0q9^XhFN@NO zuBUTOhvIbVND|e>C2`&Cq`CTFrfn+-kB~($4^lax5X08^VB|tEgoeR9yyRjwClQdL;sKsOL_;rJzllZ(xHR-p zBGZK__67KYfD;lR>_l)l=R_ih!bN*|qCDhOh(HL)*eJO$NhGDpY3Prx0VqOg7}@b)ij0Pal>U~2Q2d!zB>hw-s9;z*Ta3kFTr?@IJ2IL7-&H95 z>@AhCfZz50Phx3!x){K+04bOv;XsW`*sTdArus?%whWYngJ9Bn6+`);43zRgG0HcL zgmPfAIRcT!;P?^2WKtO-sf;b+01P?}4RK%u0xs2+OmQRlxw;StL_7}X=Sn6K2!3Qb z+11Sr?@J-Ntz+pRCq)Q|Wb0V&?^xW1Sj{j9#ZY8AAQ7YjTz?5DM14$}D%em9-fu&` zPgw4TTJZiGVzH1Itfsa9)#`N*-H*!Hy)?lLgezR)jn+7|dxs$c$>{bd&*Gwg?742$63L-EdW? z1GmR4$*yiz=Zdo7VSGzkJtIzC#4pbJcb2}&i|J_?pu0MPrtE+RW-82HDZSB_L;di2 z?WwL0EAWEho<8_;mI!fmVgHUdM)V8|+Xp)bBJ7L%zp$6+&z;(J&|9gqHPwa%^Ux|f zp*>O2JGMus0-`wAJq{rUyy}u~y?qnvNFOp_C?mzG)rZg(Y1tx5s z>O$q+w|;{B(+&LPOWpi2xG&+y(!Iv<*j8jfNyAV(bsK)c&{El0$qk5AAf7q<$8yVh z6p@lilzH)Do~x#$;}z=?B`M?|K%NbwRB6ox2ukwPQ?2942aUdkpwA=v$ zr<0~~zGG&>qncxVZ9b+U~fRIF{A2Pr_PEp}6MbM)cTcg$a<~F&dX~iA| zk^9t^4|VNE)HyAs*6at)eFcSL{U3_3*1&vK>(tVbAiZ|`BDXgCyh$b5vKUw#?Sjwz z%1_CO9Eq%AF9B~}YDxTZXJaAywra>5onJzyf2-4TWJ_e-p;Fn*?Z;k>Oe#7@b& zw=E#QRza-KL2k=1FEu%$UuSf&ZeER5i8BYU82mNnZsB{xq+U5%WE|VW8}9fe!*|9_ zd%(xERQJZSe^ug|&U744KP#lXHSg{quo=BcO` zjoFspnH?Uq>zhp2-QyIboY@^Y8nak)aM2Spp_09u8eB7~n;4em9sn~(%FeDNV>=G9 zx|PV=qMBr%p^IRplcm+6lyv8SP-JU?xX>aJ@EKB_y)&oJ^pX#!U(4?Nv*8pwxFfi1 zD1Po%#Ic|B8Z(OfTZ

    9m(~VaBm`iTAgyxqZ*gUKaG&cv#<0ub3)cfVrK{_&HU7 zti~>Gh=i84m+x7b9*+IQP)c!#QQ w@96Z)34m)?RAs~ogAjX=dmeT#g=E5EkBWOcUoV-Q()=DU{DSG<`ov}b2Tc!kzyJUM diff --git a/vendor/assets/foundation-emails/docs/assets/img/icons/footer-products.png b/vendor/assets/foundation-emails/docs/assets/img/icons/footer-products.png deleted file mode 100644 index 2506878b1889f52d801cfad3ce8658b00c61902a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1466 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 LGo2c3x2V4WB~VWS diff --git a/vendor/assets/foundation-emails/docs/assets/img/icons/footer-top-icons.png b/vendor/assets/foundation-emails/docs/assets/img/icons/footer-top-icons.png deleted file mode 100644 index 596be27f8288917e7e014284c641eca64e2f793c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4645 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 ZnPGL|1mCRVnaZHT&C}J-Wt~$(69B2)>~R19 diff --git a/vendor/assets/foundation-emails/docs/assets/img/icons/social-retina.png b/vendor/assets/foundation-emails/docs/assets/img/icons/social-retina.png deleted file mode 100644 index 3f2e4a3fd9e69ba20d707a2eaec9ac8d1ec542be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6847 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 V4c9xkS!=(Zj&{zrH*AhY{s&9iWyk;k diff --git a/vendor/assets/foundation-emails/docs/assets/img/logos/sass-logo.svg b/vendor/assets/foundation-emails/docs/assets/img/logos/sass-logo.svg deleted file mode 100644 index 194e860..0000000 --- a/vendor/assets/foundation-emails/docs/assets/img/logos/sass-logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/vendor/assets/foundation-emails/docs/assets/js/codeSample.js b/vendor/assets/foundation-emails/docs/assets/js/codeSample.js deleted file mode 100644 index 734ae26..0000000 --- a/vendor/assets/foundation-emails/docs/assets/js/codeSample.js +++ /dev/null @@ -1,20 +0,0 @@ -!function() { - -var $currentText = $('[data-docs-code-current]'); -var $toggleButtons = $('[data-docs-code-toggle]'); - -$toggleButtons.click(function(e) { - e.preventDefault(); - $('body').toggleClass('is-inky-enabled'); - - if ($('body').hasClass('is-inky-enabled')) { - $currentText.text('Inky'); - $toggleButtons.text('Switch to HTML'); - } - else { - $currentText.text('HTML'); - $toggleButtons.text('Switch to Inky'); - } -}); - -}(); diff --git a/vendor/assets/foundation-emails/docs/assets/js/docs.js b/vendor/assets/foundation-emails/docs/assets/js/docs.js deleted file mode 100644 index 947ba5a..0000000 --- a/vendor/assets/foundation-emails/docs/assets/js/docs.js +++ /dev/null @@ -1 +0,0 @@ -$(document).foundation(); diff --git a/vendor/assets/foundation-emails/docs/assets/scss/_code.scss b/vendor/assets/foundation-emails/docs/assets/scss/_code.scss deleted file mode 100644 index b04942b..0000000 --- a/vendor/assets/foundation-emails/docs/assets/scss/_code.scss +++ /dev/null @@ -1,6 +0,0 @@ -.docs-code-html, -.docs-code-inky { - code { - max-height: 300px; - } -} diff --git a/vendor/assets/foundation-emails/docs/assets/scss/_compatibility.scss b/vendor/assets/foundation-emails/docs/assets/scss/_compatibility.scss deleted file mode 100644 index 6cbf50b..0000000 --- a/vendor/assets/foundation-emails/docs/assets/scss/_compatibility.scss +++ /dev/null @@ -1,157 +0,0 @@ -// Compatability Table -// ------------------- -// A styled table used on the compatability page to show which browsers the framework works with. - -$primary: #002b36; -$secondary: #efefef; -$alert: #cf2a0e; -$warning: #ffae00; -$success: #43AC6A; -$gutter: 40px; -$rad: 5px; - -@mixin font-size($sizeValue){ - font-size: $sizeValue + px; - font-size: ($sizeValue / 10) + rem; -} - -@mixin -breakpoint($point) { - @if $point == smallmobile { - @media (max-width: 200px) { @content; } - } - @if $point == mobile { - @media (max-width: 640px) { @content; } - } - @if $point == tablet { - @media (max-width: 1000px) { @content; } - } - @if $point == smallscreen { - @media (max-width: 1120px) { @content; } - } -} - -.comparison-table { - display: block; - width: 100%; - border-collapse: separate; - thead tr { - color: $primary; - font-weight: bold; - text-transform: uppercase; - td { color: #666 !important; } - td { padding-bottom: 10px; } - td { border: none !important; } - } - tr { - width: 100%; - td { - border-right: 1px solid #ddd; - } - &:first-child { - td { border-top: 1px solid #ddd; } - td:first-child { - - } - td:last-child { - - } - } - &:last-child { - td { border-bottom: 1px solid #ddd; } - td:first-child { - - } - td:last-child { - - } - } - td:first-child { - width: 25%; - padding: 10px; - color: $primary; - font-weight: bold; - border-left: 1px solid #ddd; - } - td.marker.yes { - width: 10%; - text-align: center; - vertical-align: middle; - color: $success; - font-weight: bold; - } - td.marker.mostly { - width: 10%; - text-align: center; - vertical-align: middle; - color: $warning; - font-weight: bold; - } - td.marker.no { - width: 10%; - text-align: center; - vertical-align: middle; - color: $alert-color; - font-size: 1.3rem; - font-weight: bold; - } - } - tr:nth-child(even) { - background: $secondary; - } - @include -breakpoint(smallmobile) { - td, tr td, tr td.marker, tr td:first-child, tr td:first-child + td { - position: relative; - display: block; - width: 100%; - border-top: none; - border-bottom: none; - border-left: 1px solid #ddd; - } - tr:first-child td:first-child { - - } - tr:first-child td:last-child { - border-top-right-radius: 0; - } - tr:last-child td:first-child { - border-bottom-left-radius: 0; - } - tr:last-child td:last-child { - border-bottom: 1px solid #ddd; - } - tr td:first-child { - border-top: 1px solid #ddd; - & + td { - padding: 0 10px 10px; - } - } - tr td.marker { - padding: 10px; - font-weight: bold; - &:before { - content: "Grid: "; - } - & + td.marker:before { - content: "Layout/UI: "; - } - & + td.marker + td.marker:before { - content: "JS: "; - } - } - thead tr td.marker { - display: none; - } - } -} - -td.divider { - background: $dark-gray; - - &:first-child { - border-right: $dark-gray; - } - - &:last-child { - border-left: $dark-gray; - } -} \ No newline at end of file diff --git a/vendor/assets/foundation-emails/docs/assets/scss/_course-callout.scss b/vendor/assets/foundation-emails/docs/assets/scss/_course-callout.scss deleted file mode 100644 index 948708b..0000000 --- a/vendor/assets/foundation-emails/docs/assets/scss/_course-callout.scss +++ /dev/null @@ -1,40 +0,0 @@ -.docs-course-callout { - display: block; - background: #A183D3; - color: $white; - padding: 1rem; - margin-top: 1rem; - - &:hover, - &:focus { - color: $white; - } - - .button { - background: $white; - color: #85769e; - font-weight: bold; - border-radius: 2px; - box-shadow: 0 2px 0 #999; - margin-bottom: 0; - } - - p { - font-size: rem-calc(14); - line-height: 21px; - } -} - -.docs-course-callout-subtitle { - text-transform: uppercase; - font-weight: bold; - letter-spacing: 1px; - font-size: rem-calc(12); - display: block; -} - -.docs-course-callout-title { - font-weight: bold; - margin-bottom: 0.75rem; - display: block; -} diff --git a/vendor/assets/foundation-emails/docs/assets/scss/docs.scss b/vendor/assets/foundation-emails/docs/assets/scss/docs.scss deleted file mode 100644 index 207bf75..0000000 --- a/vendor/assets/foundation-emails/docs/assets/scss/docs.scss +++ /dev/null @@ -1,49 +0,0 @@ -// The CSS for the Foundation docs is stored in an external codebase: -// https://github.com/zurb/foundation-docs -// -// You can test Sass changes locally by running these commands: -// git clone https://github.com/zurb/foundation-docs -// npm link ./foundation-docs -// -// Feel free to submit pull requests to foundation-docs like you would Foundation itself! - -$foundation-palette: ( - primary: #7465be, - secondary: #777, - success: #3adb76, - warning: #ffae00, - alert: #ec5840, -); - -@import 'node_modules/foundation-sites/scss/foundation'; -@import 'node_modules/motion-ui/src/motion-ui'; - -@include foundation-everything; -@include motion-ui-transitions; - -@import 'node_modules/foundation-docs/scss/foundation-docs'; - -@import 'code'; -@import 'compatibility'; -@import 'course-callout'; - -.dropdown.menu > li.is-dropdown-submenu-parent > a { - padding-right: 1rem; -} - -.dropdown.menu > li.is-dropdown-submenu-parent > a::after { - display: none; -} - -.docs-newsletter { - background: #2a2f58; -} - -.zurb-footer-top { - background: #1C1F3A !important; -} - -.callout.secondary.tip { - border: none; - border-left: 5px solid $primary-color; -} diff --git a/vendor/assets/foundation-emails/docs/layouts/component.html b/vendor/assets/foundation-emails/docs/layouts/component.html deleted file mode 100644 index e503ab0..0000000 --- a/vendor/assets/foundation-emails/docs/layouts/component.html +++ /dev/null @@ -1,314 +0,0 @@ -

    diff --git a/vendor/assets/foundation-emails/docs/layouts/default.html b/vendor/assets/foundation-emails/docs/layouts/default.html deleted file mode 100644 index 4bad2d3..0000000 --- a/vendor/assets/foundation-emails/docs/layouts/default.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - Foundation for Emails 2 Docs{{#unlesspage 'index'}} | {{title}}{{/unlesspage}} - - - - - - -
    - - {{> off-canvas}} - -
    - - - - {{> navigation}} - {{> mobile-navigation}} - - - -
    -
    - -{{> body}} -
    -
    - {{> component-list}} - {{> course-callout}} -
    -
    - - {{> footer}} -
    - -
    - - - - - - - - - - - diff --git a/vendor/assets/foundation-emails/docs/pages/alignment.md b/vendor/assets/foundation-emails/docs/pages/alignment.md deleted file mode 100644 index cebbe72..0000000 --- a/vendor/assets/foundation-emails/docs/pages/alignment.md +++ /dev/null @@ -1,215 +0,0 @@ ---- -title: Alignment -description: Centering, images, text, buttons, and menus in HTML emails made easy. ---- - -Foundation includes a handful of helpful alignment classes to add common positioning behaviors to elements. - ---- - -## Text Alignment - -You can align text with the `.text-x` classes. These classes will appy to the large breakpoint as well as the small. - -```inky_example - - - - -

    Left (default)

    -
    - -

    center

    -
    - -

    right

    -
    -
    -
    -``` - -If you need to change text alignment only on the small breakpoint, you can use the `.small-text-x` classes. - - -```inky_example - - - - -

    Left on small

    -
    - -

    Center on small

    -
    - -

    Right on small

    -
    -
    -
    -``` - -You can combine these classes to override the behavior on the small breakpoint. - -```inky_example - - - - -

    Center, small left

    -
    - -

    Right, small center

    -
    -
    -
    -``` - ---- - -## Centering Images - -Just wrap the `
    ` around an image you’ll be good to go. Inky will handle the magic behind the scenes! In the CSS version, you’ll add a `.float-center` class, `align="center"` attribute and wrap a <center> tag to make sure things are centered. - -```inky_example - - - -
    - image of clever meme that made me chuckle -
    -
    -
    -
    -``` - -So to be clear: with Inky you only need to wrap an image in `
    ` tag to reliably center it. - -In the CSS version, our centering recipe includes three ingredients: - -- `.float-center` class on the `` element -- `align="center"` attribute on the `` element -- Wrap the `` with `
    ` tags (needed for Outlook 2007, 2010, and 2011) - -Also, it's not really a float, but the `.float-center` class to an element to engage the automatic margin centering trick. Note that this will only work on elements with an absolute width, which means not a percentage or auto width. - -If you need to center an image only on mobile clients, you can apply the `.small-float-center` class. A good use case would be centering an image smaller than the full column width on devices like an iPhone 5, iPhone 6, and Android 4.4. - -```inky_example - - - - please don't forget me - - -

    What is the deal?

    -

    Sweet beast sun bathe or chase mice rub face on everything or leave dead animals as gifts for mark territory play time.

    -
    -
    -
    -``` - ---- - -## Aligning Images Left and Right - -You can also align images to the left or the right. - -```inky_example - - - - - - - - - -``` - ---- - -## Centering a Button - -Wrap the button with `
    ` tags to center it. - -```inky_example - - - -
    - -
    -
    -
    -
    -``` - ---- - -## Centering Columns - -Tables by nature take up as much space is available to them. Because of this, centering columns can be done by adding empty columns to left and right of the column to be centered. - -```inky_example - - - - - Centering a column - - - - - Centering a column - - - - - Centering a column - - - -``` - -If you don't add a size attribute like `small="x"` then the columns will be equal width. - ---- - -## Centering a Menu - -Centering the menu is a common practice. Wrapping the menu in `
    ` tags will achieve this. - -```inky_example -
    - - Item - Item - Item - -
    -``` - ---- - -## Vertical Alignment - -You can vertically align your content within columns by using `valign` attribute. The available values are `top`, `middle`, and `bottom`. - -```inky_example - - - - - -

    Bottom

    -
    - -

    HEADLINE

    -

    SUBHEADLINE

    -
    - - - -
    -``` -
    diff --git a/vendor/assets/foundation-emails/docs/pages/button.md b/vendor/assets/foundation-emails/docs/pages/button.md deleted file mode 100644 index 2a396ab..0000000 --- a/vendor/assets/foundation-emails/docs/pages/button.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: Button -description: Buttons are convenient tools when you need more traditional actions. To that end, Foundation has many easy to use button styles that you can customize or override to fit your needs. -sass: scss/components/_button.scss ---- - -Creating a bullet-proof button that works in all email clients requires a table nested inside of a table. Put the class `.button` on the outer ``. Inside of the inner table, put an `` with an `href` attribute containing your link. - -In Inky HTML, the ` -``` - -
    -- It's important to add an `href` attribute to your `
    - ---- - -## Sizing - -By default, buttons are sized by the content and padding within them. You can also size a button according to it's parent container (see Expanded section). - -Buttons can be made larger or smaller by adding the class `.tiny`, `.small`, or `.large` to a button's outer `
    `. - -In Inky HTML, add the same class to the ` - - - -``` - -Don't forget the `href=""` ;) - ---- - -## Expanded - -To create an expanded button (full width of it's container), add the class `.expanded` to the outer `
    ` of the button, and wrap a `
    ` tag around the ``. - -In Inky HTML, add the `.expanded` class to the ` - - - -``` - ---- - -## Coloring - -Change the background color of a button by adding the class `.secondary`, `.success`, `.warning`, or `.alert` to the outer `
    ` (or the ` - - - -``` - ---- - -## Radius and Round - -Creating buttons with a radius or rounded edges (like a pill) can be achieved by adding the `.radius` or `.rounded` class to a button. - -*Note - border-radius is not supported on Outlook 2000-2013, Yahoo! Mail, and Android 4+ (Gmail)* - -*Note - In order to create `.radius` and `.rounded` buttons, the border needs to be removed.* - -```inky_example - - - -``` diff --git a/vendor/assets/foundation-emails/docs/pages/callout.md b/vendor/assets/foundation-emails/docs/pages/callout.md deleted file mode 100644 index 4730469..0000000 --- a/vendor/assets/foundation-emails/docs/pages/callout.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: Callout -description: Formerly panels, callouts can be used to create sidebar panels or call out important content in an email. -sass: scss/components/_callout.scss -tags: - - panel - - alert ---- - -## Basics - -A Callout adds a border, background, and some padding. Callouts use a full table structure, with the class `.callout` on the outer `
    ` (for bottom margin) and the `.callout-inner` applied to the innermost ``), add one column using this code: - -```html -
    `. - -When using [Inky](inky.html) HTML, the `` tag will create this structure for you. You can wrap them around a row or inside a column. - -```inky_example - - -

    Not in a callout :(

    -
    - - -

    I'm in a callout!

    -
    -
    -
    - - - - -

    This whole row is in a callout!

    -
    -
    -
    -``` - ---- - -## Coloring Classes - -The color of a callout can be changed by adding the class `.primary`, `.success`, `.warning`, or `.alert` to the element. A callout without a color class will have a white background. - -```inky_example - -

    Successfully avoided Kraken. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.

    -
    - -

    Successfully avoided Kraken. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.

    -
    - - -

    Successfully avoided Kraken. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.

    -
    - - -

    There may be Krakens around. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.

    -
    - - -

    Incoming Kraken! Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.

    -
    -``` diff --git a/vendor/assets/foundation-emails/docs/pages/compatibility.md b/vendor/assets/foundation-emails/docs/pages/compatibility.md deleted file mode 100644 index 48f7c5c..0000000 --- a/vendor/assets/foundation-emails/docs/pages/compatibility.md +++ /dev/null @@ -1,173 +0,0 @@ ---- -title: Compatibility -description: Foundation for Emails is battle-tested in the trickiest email clients, like Microsoft Outlook. ---- - -Foundation for Emails is designed for and tested on numerous email clients and devices. Here's the rundown on what type of compatibility to expect in general. Because email clients have varying CSS support and specific quirks, each individual component will have more information on compatibility. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Email Client/DeviceCompatibility
    Apple Mail:
    Apple Mail 7
    Apple Mail 8
    Outlook:
    Outlook 2000
    Outlook 2002
    Outlook 2003
    Outlook 2007
    Outlook 2010
    Outlook 2011
    Outlook 2013
    Outlook 2016
    Mobile:
    Android 4.4
    Gmail app for Android✓ *
    iPhone 5
    iPhone 6
    iPad
    iPad Mini
    Gmail:
    In Internet Explorer
    In Firefox
    In Chrome
    Google Apps:
    In Internet Explorer
    In Firefox
    In Chrome
    Office 365:
    In Internet Explorer
    In Firefox
    In Chrome
    Outlook.com:
    In Internet Explorer
    In Firefox
    In Chrome
    Yahoo! Mail:
    In Internet Explorer
    In Firefox
    In Chrome
    - - ** *Gmail app for Android:** Works - does not recognize media queries so it will render large breakpoint. diff --git a/vendor/assets/foundation-emails/docs/pages/css-guide.md b/vendor/assets/foundation-emails/docs/pages/css-guide.md deleted file mode 100644 index 6bbd41f..0000000 --- a/vendor/assets/foundation-emails/docs/pages/css-guide.md +++ /dev/null @@ -1,181 +0,0 @@ ---- -title: Getting Started with CSS -description: Get started with the CSS version of Foundation for Emails. ---- - -Foundation for Emails takes the pain out of developing HTML emails by giving you a set of powerful, tested components out of the box. This includes a fully-responsive grid, buttons, callouts, menus, and more. - -In this Getting Started guide, we'll download Foundation for Emails, construct the basic grid, and then inline our email so it's ready to test. - ---- - -## Installing - -If you haven't yet, download the starter files for Foundation for Emails. They include the boilerplate HTML needed for an email, and all of the CSS for Foundation. - -Download Foundation for Emails - -Unzip the folder and open it in your text editor of choice. - ---- - -## File Structure - -Here's a breakdown of the files in the folder you got: - -- `css/foundation-emails.css`: the Foundation for Emails CSS. -- `index.html`: a blank boilerplate to get started. -- `templates/`: a set of pre-made templates following common email layouts. - -We'll be writing a layout from scratch, so open up `index.html`. - ---- - -## Boilerplate - -Inside `index.html`, you can see the boilerplate needed to make an HTML work, with comments explaining what does what. - -```html - - - - - - - - - - - - - - - - - - - -
    -
    - -
    -
    - - -``` - ---- - -## Grid Basics - -Foundation for Emails includes many common elements needed to make HTML emails: a grid, typography styles, buttons, callouts, and more. - -The markup required to create HTML emails that work in all email clients is *complicated*, and involves writing many tables. However, all of Foundation's components are thoroughly tested in every major email client, including the problematic ones like Outlook. The rigid structure ensures your designs don't look off in any email client. - -Let's start by building a basic grid. To do that, we need three pieces: a container, a row, and then some columns. - -### Container - -Most Foundation for Emails components are full tables, including the container. Inside the `
    ` tag of `index.html`, add this table code: - -```html - - - - -
    -``` - -The **container** will wrap the body of your entire email. It applies a maximum width to the body of the email. Every email needs this bit of boilerplate. - -### Row - -Next, let's build the grid itself, starting with the row. **Rows** group columns together into a unit. Inside of your container, add this table: - -```html - - - - -
    -``` - -### Columns - -Columns divide your layout into horizontal sections that sit side-by-side. On small screens, these columns stack on top of each other to save space—unless you set them up to keep their layout on small screens. - -Inside of your row (the innermost `
    - - - - -
    - Column One -
    -``` - -In the above example, we used the classes `.small-12` and `.large-6` to define the size of the column on small vs. large email clients. Foundation uses a 12-column grid, so on mobile clients, the column stretches the full width of the page, and on desktop clients, the column is half the width of the row. - -Since this first column is half-width, we need a second one to go with it. *After* the `` for the first column, add the code for the second column: - -```html - - - - - - -
    - Column One - - Column Two -
    -``` - -You may have noticed the `.first` and `.last` classes on the column. The first column in a row needs the `.first` class, and the last column in a row needs the `.last` class. This is explained more in the [First and Last Classes](grid.html#first-and-last-classes) section of the grid documentation. - -That's a lot of HTML! Let's look at what it is at a high level: - -```html - - - - -``` - -The CSS classes are always on the outermost table element, so that's an easy way to identify where a component starts. The container starts at the table with the `.container` class, the row starts at the table with the `.row` class, and so on. - ---- - -## Inlining - -Now that we have a basic email, the last thing we need to do before we can send it is *inline* it. This is the process of injecting all of the CSS for the email into the HTML, so that it works as a self-contained file. - -Email clients like Gmail and Outlook strip out ` - - - 4 columns, 6 columns on small - 8 columns, 6 columns on small - -``` - ---- - -## Using the Media Query - -The media query will wrap the styles you wish to affect. Because there is only one breakpoint to consider and it's a max-width, your mobile styles or overrides will go in a media query. If you're using the CSS version of Foundation, use this media query to imitate the core breakpoint: - -```scss -/* Small only */ -@media screen and (max-width: 596px) {} -``` - -The Sass version of Foundation uses a convenient variable to set the breakpoint width. Use this media query to imitate the core breakpoint: - -```scss -/* Small only */ -@media only screen and (max-width: #{$global-breakpoint}) {} -``` - -### Example usage - -```scss -.newsletter-title { - text-transform: uppercase; - font-size: 9px; - padding-left: 40px; - font-weight: bold; - - @media only screen and (max-width: #{$global-breakpoint}) { - padding-left: 0; - } -} -``` - -```scss -@media only screen and (max-width: #{$global-breakpoint}) { - p { - font-size: 19px; - font-weight: 600; - } -} -``` - ---- - -## Changing the Breakpoint - -Changing the breakpoint is easy in the Sass version. In the `_settings.scss` you can control the width of this breakpoint. - -```scss -$global-breakpoint: $global-width + $global-gutter; -``` - -The `$global-breakpoint` is a combined width of the `$global-width` and the `$global gutter`. You could hard-code a pixel value here instead of the variables or change the `$global-width` (recommended) as it takes account for the gutter calculation. - -```scss -$global-width: 580px; -``` - - - diff --git a/vendor/assets/foundation-emails/docs/pages/menu.md b/vendor/assets/foundation-emails/docs/pages/menu.md deleted file mode 100644 index 5d55d6b..0000000 --- a/vendor/assets/foundation-emails/docs/pages/menu.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: Menu -description: Use the menu component to create a horizontal or vertical list of links. -sass: scss/components/_menu.scss ---- - -## Basics - -A menu is a `` with a class of `.menu` and a `` inside of it. Each link in the menu is a ` - - - -``` - -### Offset Columns -Because we’ve eliminated the wrapper, offsets are now directly applied to the column itself. - -Version 1 - -``` -
    ` with an `` inside of it. - -In Inky HTML, use the tag `` to make a menu, and the tag `` to make an item. - -```inky_example - - Item - Item - Item - -``` - -
    -- It's important to add an `href` attribute to your ``'s to ensure that Outlook.com will not display `[undefined]` in your rendered email.
    -- Office 365 and Outlook.com require a valid url in the href attribute or you can use the # placeholder. -
    - ---- - -## Vertical Menu - -Menus align horizontally by default. To switch to a vertical menu, add the class `.vertical` to the menu. - -```inky_example - - Item - Item - Item - -``` - ---- - -## Vertical Menu on the Small Breakpoint - -Menus align horizontally by default. To switch to a vertical menu on the small breakpoint only, add the class `.small-vertical` to the menu. This works well because the email clients that support media queries fall into the small breakpoint like iPhones and Android 4.4. - -```inky_example - - Item - Item - Item - -``` \ No newline at end of file diff --git a/vendor/assets/foundation-emails/docs/pages/migration.md b/vendor/assets/foundation-emails/docs/pages/migration.md deleted file mode 100644 index 16ee073..0000000 --- a/vendor/assets/foundation-emails/docs/pages/migration.md +++ /dev/null @@ -1,511 +0,0 @@ ---- -title: Foundation for Emails 2 Migration Guide -description: This guide describes the changes required to migrate a Foundation for Emails template from version 1 (formerly Ink) to Foundation for Emails 2. -tags: - - upgrade ---- - -## What’s new? - -- **Streamlined and updated responsive grid:** We’ve simplified the markup in the new version so it’s faster and easier to code. The new responsive grid in Emails 2 requires fewer tags and classes. It’s also now responsive on Android Native! -- **Inky templating language:** With Inky you can write less code and get more done. The Inky language gets you out of tables and into a simpler, more web-like, HTML. -- **Built with Sass:** Now faster than ever, you can easily make sweeping visual changes to your email that reflect your brand styles - all within one settings file. -- **ZURB Stack:** All kinds of task automation - [Panini](http://foundation.zurb.com/sites/docs/panini.html), our Handlebars templates, compiling Sass, BrowserSync, image compression, and auto inlining are built in to speed up your workflow. - ---- - -## Overview - -First off, you'll want to choose a version to get started with. -
    [CSS version](css-guide.html) or the [Sass version with Inky](sass-guide.html) - -When migrating, the following items can be translated easily from 1 to 2: -- Boilerplate -- Visibility -- Typography -- Text helper classes -- Container -- Panel -- Media Queries - -Other areas may require more changes to work correctly including: -- Grid -- Sub-grid (now part of Grid) -- Button class - -What’s new that you might want to use: -- Menu - Horizontal -- Menu - Vertical - ---- - -## HTML - -With Foundation for Emails 2, confusing and tedious tables are a thing of the past. The new Inky markup will save you time and energy coding your emails. It looks like: - -``` - - - - Content - - - Content - - - -``` - -You can use it to create the grid structure, buttons, and other components. We’ll go into this in detail in the components section. We'll explain more in the
    Grid section. - ---- - -## CSS & Sass - -Foundation for Emails 2 is available in a Sass version which let’s you quickly change common CSS values with some simple variables within the settings. - -These are some CSS classes that are no longer needed for proper spacing: -- `.wrapper` -- `.wrapper-last` -- `.text-pad` -- `.text-pad-left` -- `.text-pad-right` - -Some helper classes have changed: - -`.center` was used in version 1 to center text. - -Version 2 now has more alignment classes: -- `.text-center`: centers text -- `.text-left`: aligns text to the left -- `.text-right`: aligns text to the right -- `.small-text-center`: centers text on the small breakpoint -- `.small-text-left`: left aligns text on the small breakpoint -- `.small-text-right`: right aligns text on the small breakpoint -- `float-center`: centers an image (see the [alignment docs](alignment.html) for best practices.) - ---- - -## Ink 1.0 Components - -### Grid - -#### Old Markup - -In the Ink 1.0, we needed extra tags to support a wrapper element. This used to control the gutter and margins of a column. - -``` - - - - -
    - - - - - -
    - - - - - - -
    - -
    - -
    - -
    -``` - -#### New Markup - -In Foundation for Emails 2, we’ve eliminated another tag in an effort to simplify your markup. Gutters are now directly applied to the column element itself. We still need to identify the last column with a `.last` class, and now the first column element with the `.first` class. If you have columns in the middle of first and last, they don't need a `.first` or `.last` class. - -Also, we stitched `
    `'s to ``'s because that allows Android 4 native to be responsive - win! - -``` - - - - - -
    - - - - -
    - -
    -
    -``` - -#### New Markup (Inky HTML) - -``` - - - - - - - -``` - ---- - -### Sub-grid - -In an effort to unify the thinking across the Foundation family, we’ve removed the sub-columns and moved towards a fully functional small grid. - -#### Old Markup - -``` - - - - -
    - - - - - - - -
    - - - -
    - -
    -``` - -#### New Markup (Plain HTML) - -``` - - - - -
    - - - - - - - - -
    - - - -
    - -
    -``` - -#### New Markup (Inky HTML) - -``` - - - - - - - - - - -``` - ---- - -### Block Grid - -The block grid has a minor syntax change with identifying the number of elements that are displayed in the row. We’ve moved to the convention of `.up-x`, instead of `.x-up`. - -#### Old Markup - -``` - - - - -
    - Thing 1 - - Thing 2 - - Thing 3 -
    -``` - -#### New Markup (Plain HTML) - -``` - - - - -
    - Thing 1 - - Thing 2 - - Thing 3 -
    -``` - -#### New Markup (Inky HTML) - -``` - - Thing 1 - Thing 2 - Thing 3 - -``` - ---- - -### Offset Columns - -Because we’ve eliminated the wrapper, offsets are now directly applied to the column itself. - -#### Old Markup - -``` - - - - -
    - - - - - - -
    - -
    -
    -``` - -#### New Markup (Plain HTML) - -``` - - - - -
    - -
    -``` - -#### New Markup (Inky HTML) - -``` - - - - - -``` - -Offsets now can be used on the small breakpoint or the large, or both. They will shift over a set of columns over from the left. - ---- - -### Buttons - -In the previous version of F4E the text inside of the button was the only clickable element. In F4E 2, we’ve taken a hybrid approach of using padding and borders to increase the clickable area. It requires one more table but the result is a much bigger touch target which is good for usability. - -#### Old Markup - -``` - - - - -
    - Button Label -
    -``` - -#### New Markup (Plain HTML) - -``` - - - - -
    - - - - -
    - I am successful -
    -
    -``` - -#### New Markup (Inky HTML) - -``` - -``` - -Centering a button is easier now, just wrap the button with `
    ` tags. - ---- - -### Panels - -In an effort to unify the terminology across the Foundation family `panels` are now called `callouts`. - -#### Old Markup - -``` - - - - - -
    - Panel content -
    -``` - -#### New Markup (Plain HTML) - -``` - - - - - -
    - -
    -``` - -#### New Markup (Inky HTML) - -``` - - -

    One Word

    -
    - - -

    I'm in a callout!

    -
    -
    -
    - - - - - - -

    This whole row is in a callout!

    -
    - -

    This whole row is in a callout!

    -
    -
    -
    -
    -
    -``` - -You can wrap a callout around a `` or the content inside a ``. - ---- - -## New Components - -### Menu - -#### Old Markup (Plain HTML) - -``` - - - - -
    - - - - - - - -
    -``` - -#### New Markup (Inky HTML) - -``` - - Item One - Item Two - Item Three - -``` - -The menu component can be used to create a simple set of links comonly used in headers, for social icons or in footers. Adding the `.vertical` class will change the orientation. You can even make it vertical on the small breakpoint only with `.small-vertical`. - -### Spacer - -#### New Markup (Inky HTML) - -``` - -``` - -The spacer component creates consistant vertical spacing between or inside of elements. The size `size="x"` attribute allows you to set the height in pixels of vertical spacing you need. - -### Wrapper - -#### New Markup (Inky HTML) - -``` - - content here - -``` - -The wrapper component allows you to wrap content to target CSS within it. You can add classes to it so you can easily create a full with background. - -## Dependencies - -The CSS version works exactly like the one we distributed with Ink 1.0. Check out our [getting started guide](css-guide.html) to learn more. - -To use the Sass version with the Inky markup language you'll want to install the Foundation for Emails project template. We have another [getting started guide](sass-guide.html) just for the Sass version of Foundation. diff --git a/vendor/assets/foundation-emails/docs/pages/panini.md b/vendor/assets/foundation-emails/docs/pages/panini.md deleted file mode 100644 index 3f833f8..0000000 --- a/vendor/assets/foundation-emails/docs/pages/panini.md +++ /dev/null @@ -1,240 +0,0 @@ ---- -title: Panini -description: A flat file compiler that powers our prototyping template. Create pages with consistent layouts and reusable partials with ease. -library: - github: https://github.com/zurb/panini - docs: https://github.com/zurb/panini ---- - -{{{{raw}}}} - -If you've ever created a static site, maybe you had five pages that all shared the same header and footer. You create your first page, and then copy and paste the common elements to the next page. But now if you need to make a change to the header, the change has to be made across multiple files. You can do this with Emails in your campaigns too! - -Panini is a flat file compiler that uses the concepts of templates, pages, and partials—powered by the [Handlebars](http://handlebarsjs.com/) templating language—to streamline the process of creating static prototypes. - -Our [prototyping template](starter-projects.html) uses Panini, along with a host of other tools for processing Sass and images, to make creating optimized templates easy. It's already been configured to utilize all of the features below, but if you want to learn the specifics of how to configure the library, head over to the [Panini GitHub page](https://github.com/zurb/panini). - ---- - -## Basics: Templates & Pages - -A **template** is a common layout that every page in your design shares. It's possible to have multiple templates, but generally you'll only need one, and a page can only use one template. In the prototyping template, the default layout is found under `src/layouts/default.html`. - -Here's what a basic template might look like: - -```handlebars - - - Definitely an Email! - - -
    - {{> body}} -
    - - -``` - -In the middle of the HTML is a bit of Handlebars code: `{{> body}}`. This is where the pages you write are injected when Panini runs, giving you a series of complete HTML files at the end. - -The **pages** make up the guts of your layouts. These files will just have the middle section of the design, since the layout already covers the top and bottom. The prototyping template includes one blank page to get you started, under `src/pages/index.html`. - -A basic page might look like this: - -```html -

    Page Title

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Praesentium ducimus eligendi, reiciendis corporis quam facere quaerat qui, aspernatur molestiae velit, vero ea quisquam laborum corrupti repudiandae totam, at aliquam esse.

    -``` - -Note that there's no `` or `` tags, and no header or footer. This code will be injected into the `{{> body}}` declaration when Panini assembles your pages. - -In the prototyping template, these finished files are compiled into a standalone folder called `dist` (short for "distribution"), which also includes your processed CSS, JavaScript, and images. This folder can easily be uploaded to any ESP (Email Service Provider). - ---- - -## Partials - -Partials are a feature of Handlebars which allow you to inject HTML anywhere in a page or layout. They're really useful when you need to repeat certain chunks of code throughout your pages, or to keep individual files from getting too cluttered with HTML. - -Here's an example of a layout file that divides its key sections into partials: - -```handlebars - - - Definitely STILL an Email! - - - {{> header}} - {{> body}} - {{> footer}} - - -``` - -The `{{> }}` syntax tells Handlebars to look for an HTML file with that name, and inject it at that place. In this example, we have files called `header.html`, `navigation.html`, and `footer.html`. In the prototyping template, these files all exist within `src/partials`. - ---- - -## Page Variables - -Pages have a few built-in variables, which can be used within the page template itself, or within a layout or partial being used in tandem with the page. - -### page - -Prints the name of the current page, without its original file extension. In the below example, if the page is `index.html`, `{{page}}` will become `index`. - -```handlebars -

    You are here: {{page}}

    -``` - -### root - -Use `{{root}}` before a file path to make sure it works no matter what folder the current page is in. - -For example, a path to an external CSS file will need to be different if the current page is at the root level of your site, or in a sub-folder. - -Here's how you'd use it with a `` tag: - -```handlebars - -``` - -If the page is `index.html`, the path will look like this: - -```html - -``` - -If the page is `folder/page.html`, the path will look like this: - -```html - -``` - -The `../` is added only on pages in a sub-folder, so the CSS can still be properly loaded. - ---- - -## Helpers - -Helpers are special functions that manipulate content on the page. In addition to [Handlebars's built-in helpers](http://handlebarsjs.com/builtin_helpers.html), Panini includes a few custom helpers and you can add your own. - -### ifpage - -Displays the HTML inside the helper only on specific pages. In the below example, the HTML inside the helper will only show up on the `index.html` page. - -```handlebars -{{#ifpage 'index'}} -

    This is definitely the Index page.

    -{{/ifpage}} -``` - -You can also check for multiple pages. If *any* name in the list matches the current page, the HTML will appear. - -```handlebars -{{#ifpage 'index' 'about'}} -

    This is definitely either the Index or About page.

    -{{/ifpage}} -``` - -### unlesspage - -The opposite of `#ifpage`, `#unlesspage` will only display the HTML inside of it if the current page is *not* in the parameters. - -```handlebars -{{#unlesspage 'index'}} -

    This is definitely not the Index page.

    -{{/unlesspage}} -``` - -### repeat - -Repeats the content inside of it `n` number of times. Use this to easily print lots of duplicate HTML in a prototype. - -```handlebars -
      - {{#repeat 5}} -
    • Five hundred ninety-nine US dollars
    • - {{/repeat}} -
    -``` - -### markdown - -Converts Markdown into HTML. - -```handlebars -{{#markdown}} -# Heading 1 -Lorem ipsum [dolor sit amet](http://html5zombo.com), consectetur adipisicing elit. Nam dolor, perferendis. Mollitia aut dolorum, est amet libero eos ad facere pariatur, ullam dolorem similique fugit, debitis impedit, eligendi officiis dolores. -{{/markdown}} -``` - -### Custom Helpers - -If you don't see the right helper, you can write your own. Add a javascript file to 'src/helpers', restart npm, then call it in your templates. - -``` -// Example file src/helpers/bold.js -module.exports = function(options) { - // options.fn(this) = Handelbars content between {{#bold}} HERE {{/bold}} - var bolder = '' + options.fn(this) + ''; - return bolder; -} -``` -Then in your projects call your custom `{{#bold}}` helper - -``` -{{#bold}}ideas{{/bold}} -``` - ---- - -## Custom Data - -Custom data can be added to your pages. This data can then be inserted into your HTML through Handlebars. There are two ways to add data to a project. - -To add variables to a specific page only, add it at the top of the page's HTML as a [Front Matter](http://jekyllrb.com/docs/frontmatter/) block. Let's say the below content is inside `src/pages/index.html`. - -```html ---- -title: Page Title -description: Lorem ipsum. ---- - - -``` - -Now, you can insert the values of these variables into the `index.html` page, *or* the `default.html` layout. To insert a variable, wrap the name of the variable in double curly braces, like so: - -```handlebars -

    {{ title }}

    -``` - -Variables can also be added globally by creating an external JSON or YML file, and adding it to the `src/data` folder in your project. Let's create a file called `breakfast.yml`: - -``` -- eggs -- bacon -- toast -``` - -Panini will load in the contents of this YML file as a variable called `{{ breakfast }}`. Because it's an array, we can loop through it using Handlebars's `{{#each}}` helper: - -```handlebars -
      - {{#each breakfast}} -
    • {{ this }}
    • - {{/each}} -
    -``` - -This code will print three `
  • `s, one for each item in the file. - -## Tutorials - -[Staying D.R.Y. with Panini](http://zurb.com/university/lessons/staying-d-r-y-with-panini) -Panini comes with tons of Handlebars helpers built in, like a repeat helper or markdown parser, but in this lesson we’ll take a look at creating a custom month/year helper for an HTML email. - - -{{{{/raw}}}} diff --git a/vendor/assets/foundation-emails/docs/pages/sass-guide.md b/vendor/assets/foundation-emails/docs/pages/sass-guide.md deleted file mode 100644 index 4139199..0000000 --- a/vendor/assets/foundation-emails/docs/pages/sass-guide.md +++ /dev/null @@ -1,179 +0,0 @@ ---- -title: Getting Started with Sass -description: Get started with the Sass-powered ZURB Stack for writing HTML emails. ---- - -Foundation for Emails takes the pain out of developing HTML emails by giving you a set of powerful, tested components out of the box. This includes a fully-responsive grid, buttons, callouts, menus, and more. - -The Sass workflow for Foundation for Emails is backed by the [ZURB Email Stack](zurb-stack.html), an all-in-one build system for creating HTML emails. This workflow requires a bit more up-front setup, but the tooling makes it wicked fast to code, and keeps your code amazingly clean with our new custom HTML tags in Inky. - -The ZURB Stack workflow also includes Handlebars, allowing you to write emails as templates instead of static files. Lastly, you can easily make sweeping design changes with the Sass [settings file](sass.html#the-settings-file). Here’s everything that’s packaged in this template: - -- Inky HTML -- Sass -- Handlebars templates -- BrowserSync -- Image compression -- Inlining - -In this Getting Started guide, we'll download Foundation for Emails, construct the basic grid, and then inline our email so it's ready to test. - ---- - -## Requirements - -To use the Sass version of Foundation for Emails, you need Node.js installed on your computer. Node is compatible with Windows, OS X, and Linux—the [Node.js website](https://nodejs.org/) has installers for every operating system. - ---- - -## Installing - -We'll use the Foundation CLI to set up a new project. If you already have the Foundation CLI installed from Foundation for Sites or Apps, you can skip this first command. - -```bash -npm install --global foundation-cli -``` - -If you run into any permission errors (EACCESS) on OS X or Linux, you can try prefixing the command with `sudo`. - -```bash -sudo npm install --global foundation-cli -``` - -Once the CLI is installed on your machine, it’s super easy to fire up a blank Foundation for Emails project. Move into the folder you store your projects in, and then run this command: - -```bash -foundation new --framework emails -``` - -The CLI will ask you for a project name, which is used as the name of the folder to install in. After that, the project template will be downloaded, and the various dependencies installed. The entire process takes over a minute. - ---- - -## Running the Server - -After your project has been installed, run `cd project`, where `project` is the name of the project just created. Then run: - -```bash -npm start -``` - -This will kick off the build process, which includes HTML parsing, Sass, image compression, and a server. When the initial build finishes, your browser will pop open a new tab pointing to your project. You'll be seeing a blank `index.html` file. - ---- - -## File Structure - -You'll do all of your work in the `src` folder of your project. The various HTML files, Sass files, and images inside of `src` are compiled to a new folder called `dist/` (as in "distribution"), which contains the final HTML and CSS for your emails. These are the files you'll upload to Litmus, Campaign Monitor, etc. for testing, or load into your email campaign service. - -Here's a breakdown of the files in the `src` folder: - -- `assets/`: Sass and image files. -- `layouts/`: Boilerplate HTML that wraps all of your emails. -- `pages/`: HTML files for emails. -- `partials/`: Reusable chunks of HTML that can be injected into pages. - ---- - -## Boilerplate - -Inside `src/layouts/default.html`, you can see the boilerplate needed to make an HTML work. Below we've annotated this boilerplate, explaining what does what. - -{{{{raw}}}} - -```html - - - - - - - - - - - - - - - - - - - - - -
    -
    - - {{> body}} -
    -
    - - -``` - -{{{{/raw}}}} - ---- - -## Grid Basics - -Foundation for Emails includes many common elements needed to make HTML emails: a grid, typography styles, buttons, callouts, and more. - -The markup required to create HTML emails that work in all email clients is *complicated*, and involves writing many tables. However, the ZURB Stack includes Inky, a templating language that converts simple HTML tags to the complex HTML required for the components. - -Let's build a basic grid. - -```html - - - Column One - Column Two - - -``` - -Here we're using all three of the key layout elements: the container, row, and column. - -A **container** will wrap the body of your email. It applies a maximum width to the body of the email. - -**Rows** are used to group sets of **columns** together. Columns divide your layout into horizontal sections that sit side-by-side. On small screens, these columns stack on top of each other to save space—unless you set them up to keep their layout on small screens. - -In the above example, we used the attribute `large` on the `` tag to define a size for that column *on large screens*. Foundation uses a 12-column grid, and since `large="6"`, that means each column will take up half the width of the row. On a small screen, each columns will be full width and the second column will stack underneath. - ---- - -## Inlining - -Now that we have a basic email, the last thing we need to do before we can send it is *inline* it. This is the process of injecting all of the CSS for the email into the HTML, so that it works as a self-contained file. - -Email clients like Gmail and Outlook strip out ` - - - -
    - - - - - - -

    BASIC

    -
    -
    -
    -
    - -
    -``` - -Using this structure outside of the container will yeild a fluid width background that expands to the width of the email client's viewport. - - diff --git a/vendor/assets/foundation-emails/docs/pages/zurb-stack.md b/vendor/assets/foundation-emails/docs/pages/zurb-stack.md deleted file mode 100644 index ecf7e9a..0000000 --- a/vendor/assets/foundation-emails/docs/pages/zurb-stack.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: ZURB Stack -descripiton: The ZURB email stack is a boilerplate that gives you everything you need to develop and test HTML emails. ---- - -Email and web development can get complicated fast. We’ve introduced the ZURB Stack which helps you get started faster and lets you do more - without having to spend time finding the right tool for the job. The ZURB Stack includes: - -- **Gulp.** This is our task runner of choice for Foundation. Gulp lets us queue up tasks to execute. This lets us do cool things like inlining automagically updating your browser. It’s what the Stack is built on. [Find out more about Gulp](http://gulpjs.com/). -- **Sass.** We use Libsass as our CSS preprocessor of choice. If you’re not familiar with Sass, it lets you use variables, nesting, and mixins (to name a few). [Learn more about Sass](http://sass-lang.com/). -- **Inlining.** One of the biggest headaches and time-sucks used to be inlining your HTML email. Well, no more! We’re using gulp-inline to to scan your CSS file and and automatically inject your CSS when you’re ready. Just run `npm run build` in your project when you’re ready to inline. -- **Build Options.** By default the inliner works without removing whitespaces and inlining for you, you have to change your settings in the inliner function (`function inliner(css)`) on your gulpfile.babel.js which is the root of your project. To change these settings go and update this part of the function as you wish: ``` .pipe($.htmlmin, { collapseWhitespace: true, minifyCSS: true }); ```. -- **Panini.** This is our flat file generator for Foundation. Just like it’s real-world counterpart, it takes a set of ingredients and flattens them into one delicious item. This lets you separate things like the header and footer content into partials, letting you focus on your code when you’re building. It’s built off of Handlebars, which let’s you keep things super organized with partial files and repeatable sections. Checkout our [Panini Repo](https://github.com/zurb/panini). -- **BrowserSync.** BrowserSync is awesome. It’s the specific tool in our ZURB Stack that let’s you see your code changes in the browser in real-time. Just save your code and watch the magic happen in your browser. [Learn more about BrowserSync](https://www.browsersync.io/). -- **Image Compression.** Finally, we’ve added gulp-imagemin which intelligently reduces the file-size of your png, jpeg, gif, and svg images. This lets your emails load at lightning speeds! [Check out the gulp-imagemin repo](https://github.com/sindresorhus/gulp-imagemin). - -The ZURB Stack is just a starting place that lets you do all of the things mentioned above! You can totally rip out or add to the ZURB Stack’s gulp file to make your perfect email environment. diff --git a/vendor/assets/foundation-emails/docs/partials/component-list.html b/vendor/assets/foundation-emails/docs/partials/component-list.html deleted file mode 100644 index 9a7ff03..0000000 --- a/vendor/assets/foundation-emails/docs/partials/component-list.html +++ /dev/null @@ -1,40 +0,0 @@ - diff --git a/vendor/assets/foundation-emails/docs/partials/course-callout.html b/vendor/assets/foundation-emails/docs/partials/course-callout.html deleted file mode 100644 index 426c884..0000000 --- a/vendor/assets/foundation-emails/docs/partials/course-callout.html +++ /dev/null @@ -1,6 +0,0 @@ - - ZURB Master Class - Responsive Emails -

    In this online class, you’ll learn how to rapidly design and develop responsive emails that look beautiful on just about every screen, browser, and email client out there—even Outlook.

    - View Class -
    diff --git a/vendor/assets/foundation-emails/docs/partials/footer.html b/vendor/assets/foundation-emails/docs/partials/footer.html deleted file mode 100644 index 3bafe2a..0000000 --- a/vendor/assets/foundation-emails/docs/partials/footer.html +++ /dev/null @@ -1,113 +0,0 @@ -
    -
    -
    -
    Stay on top of what’s happening in responsive design.
    -

    Sign up to receive monthly Responsive Reading highlights. Read Last Month's Edition »

    -
    -
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    -
    -
    - - - - diff --git a/vendor/assets/foundation-emails/docs/partials/mobile-navigation.html b/vendor/assets/foundation-emails/docs/partials/mobile-navigation.html deleted file mode 100644 index 9fce5d0..0000000 --- a/vendor/assets/foundation-emails/docs/partials/mobile-navigation.html +++ /dev/null @@ -1,80 +0,0 @@ -
    -
    - - Foundation -
    -
    - - - -
    - - -
    diff --git a/vendor/assets/foundation-emails/docs/partials/navigation.html b/vendor/assets/foundation-emails/docs/partials/navigation.html deleted file mode 100644 index 6d9fc63..0000000 --- a/vendor/assets/foundation-emails/docs/partials/navigation.html +++ /dev/null @@ -1,62 +0,0 @@ - diff --git a/vendor/assets/foundation-emails/docs/partials/off-canvas.html b/vendor/assets/foundation-emails/docs/partials/off-canvas.html deleted file mode 100644 index 80b7e23..0000000 --- a/vendor/assets/foundation-emails/docs/partials/off-canvas.html +++ /dev/null @@ -1,72 +0,0 @@ - - -
    - - -
    diff --git a/vendor/assets/foundation-emails/gulpfile.js b/vendor/assets/foundation-emails/gulpfile.js deleted file mode 100644 index d0624f6..0000000 --- a/vendor/assets/foundation-emails/gulpfile.js +++ /dev/null @@ -1,222 +0,0 @@ -var $ = require('gulp-load-plugins')(); -var gulp = require('gulp'); -var sequence = require('run-sequence'); -var panini = require('panini'); -var supercollider = require('supercollider'); -var rimraf = require('rimraf'); -var browser = require('browser-sync'); -var foundationDocs = require('foundation-docs'); -var octophant = require('octophant'); -var inky = require('inky'); -var siphon = require('siphon-media-query'); -var lazypipe = require('lazypipe'); -var fs = require('fs'); - -// Configuration for the documentation generator -supercollider - .config({ - template: foundationDocs.componentTemplate, - marked: foundationDocs.marked, - handlebars: foundationDocs.handlebars, - keepFm: true, - quiet: false, - pageRoot: 'docs/pages', - data: { - repoName: 'foundation-emails', - editBranch: 'develop' - } - }) - .searchConfig({ - sort: ['page', 'component', 'sass variable', 'sass mixin', 'sass function', 'js class', 'js function', 'js plugin option', 'js event'], - pageTypes: { - library: function(item) { - return !!(item.library); - } - } - }) - .adapter('sass') - .adapter('js'); - -// Cleans the build folder -gulp.task('clean', function(cb) { - rimraf('_build', cb); -}); - -// Copies static documentation assets -gulp.task('copy', function() { - return gulp.src(['docs/assets/**/*', '!docs/assets/scss/**/*', '!docs/assets/js/**/*']) - .pipe(gulp.dest('_build/assets')); -}); - -// Builds documentation pages -gulp.task('html', function() { - return gulp.src('docs/pages/**/*') - .pipe($.cached('docs')) - .pipe(supercollider.init()) - .pipe(panini({ - root: 'docs/pages/', - layouts: 'docs/layouts/', - partials: 'docs/partials/', - helpers: foundationDocs.handlebarsHelpers - })) - .pipe(gulp.dest('_build')) - .on('finish', function() { - supercollider.buildSearch('_build/data/search.json', function() {}); - }); -}); - -gulp.task('sass', ['sass:docs', 'sass:foundation']); - -// Compiles documentation-specific CSS -gulp.task('sass:docs', function() { - return gulp.src('docs/assets/scss/docs.scss') - .pipe($.sass({ includePaths: [process.cwd()] }).on('error', $.sass.logError)) - .pipe($.autoprefixer({ - browsers: ['last 2 versions', 'ie >= 9'] - })) - .pipe(gulp.dest('_build/assets/css')); -}); - -// Compiles Foundation-specific CSS -gulp.task('sass:foundation', function() { - return gulp.src('scss/foundation-emails.scss') - .pipe($.sass().on('error', $.sass.logError)) - .pipe(gulp.dest('_build/assets/css')); -}); - -// Compiles documentation JavaScript -gulp.task('javascript:docs', function() { - return gulp.src(['node_modules/foundation-docs/js/*.js', 'docs/assets/js/**/*.js']) - .pipe($.concat('docs.js')) - .pipe(gulp.dest('_build/assets/js')); -}); - -// Generates a Sass settings file from the current codebase -gulp.task('settings', function() { - octophant('scss/**/*.scss', { - title: 'Foundation for Emails Settings', - output: 'scss/settings/_settings.scss', - sort: ['global', 'grid', 'block-grid', 'type'] - }); -}); - -// Lints the Sass codebase -gulp.task('lint', function() { - return gulp.src('scss/**/*.scss') - .pipe($.sassLint()) - .pipe($.sassLint.format()) - .pipe($.sassLint.failOnError()); -}); - -// Creates a BrowserSync server -gulp.task('server', ['build'], function() { - browser.init({ - server: './_build' - }); -}); - -// Uploads the documentation to the live server -gulp.task('deploy:docs', ['build'], function() { - return gulp.src('./_build/**') - .pipe($.prompt.confirm('Make sure everything looks right before you deploy.')) - .pipe($.rsync({ - root: './_build', - hostname: 'deployer@72.32.134.77', - destination: '/home/deployer/sites/foundation-emails-march16' - })); -}); - -// Runs the entire build process -gulp.task('build', function(cb) { - sequence('clean', ['copy', 'html', 'sass', 'javascript:docs'], cb); -}); - -// Runs the build process, spins up a server, and watches for file changes -gulp.task('default', ['server'], function() { - gulp.watch('docs/**/*', ['html', browser.reload]); - gulp.watch(['docs/assets/scss/**/*', 'node_modules/foundation-docs/scss/**/*'], ['sass:docs', browser.reload]); - gulp.watch('scss/**/*.scss', ['sass:foundation', browser.reload]); -}); - -gulp.task('test', ['sass', 'test:compile'], function() { - browser.init({ server: 'test/visual/_build', directory: true }); - gulp.watch('scss/**/*.scss', ['sass:foundation', browser.reload]); - gulp.watch('test/visual/pages/*.html', ['test:compile', browser.reload]); -}); - -gulp.task('test:compile', function() { - gulp.src('test/visual/pages/*.html') - .pipe($.wrap({ src: 'test/visual/_template.html' })) - .pipe(inky()) - .pipe(inliner('_build/assets/css/foundation-emails.css')) - .pipe(gulp.dest('test/visual/_build')); -}); - -gulp.task('templates', function() { - return gulp.src('templates/*.html') - .pipe($.wrap({ src: 'test/visual/_template.html' })) - .pipe(inky()) - .pipe($.prettify({ indent_size: 2 })) - .pipe(gulp.dest('.templates')) - .pipe($.zip('all-templates.zip')) - .pipe(gulp.dest('.templates')); -}); - -gulp.task('download:build:index', function() { - return gulp.src('test/visual/_template.html', { base: 'test/visual' }) - .pipe($.injectString.replace('<%= contents %>', '')) - .pipe($.injectString.replace('../assets/', '')) - .pipe($.rename('index.html')) - .pipe(gulp.dest('.download')); -}); - -gulp.task('download:build:templates', ['templates'], function() { - return gulp.src('.templates/*.html') - .pipe(gulp.dest('.download/templates')); -}); - -gulp.task('download:build:css', ['sass:foundation'], function() { - return gulp.src('_build/assets/css/foundation-emails.css') - .pipe(gulp.dest('.download/css')); -}) - -gulp.task('download:build', ['download:build:index', 'download:build:templates', 'download:build:css'], function() { - return gulp.src('.download/**/*') - .pipe($.zip('foundation-emails.zip')) - .pipe(gulp.dest('.')); -}); - -gulp.task('download', ['download:build'], function(done) { - return gulp.src('foundation-emails.zip') - .pipe($.rsync({ - hostname: 'deployer@72.32.134.77', - destination: '/home/deployer/sites/foundation-sites-6-marketing/downloads/' - })); -}); - -gulp.task('dist', ['sass:foundation'], function() { - return gulp.src('_build/assets/css/foundation-emails.css') - .pipe(gulp.dest('dist')) - .pipe($.cssnano()) - .pipe($.rename('foundation-emails.min.css')) - .pipe(gulp.dest('dist')); -}); - -function inliner(css) { - var css = fs.readFileSync(css).toString(); - var mqCss = siphon(css); - - var pipe = lazypipe() - .pipe($.inlineCss, { - applyStyleTags: false, - removeStyleTags: false, - removeLinkTags: false - }) - .pipe($.injectString.replace, '', '') - .pipe($.htmlmin, { - collapseWhitespace: false, - minifyCSS: false - }); - - return pipe(); -} diff --git a/vendor/assets/foundation-emails/migration.md b/vendor/assets/foundation-emails/migration.md deleted file mode 100644 index 330ba8a..0000000 --- a/vendor/assets/foundation-emails/migration.md +++ /dev/null @@ -1,457 +0,0 @@ -# Foundation for Emails 2 Migration Guide - -- [What’s new?](https://github.com/zurb/foundation-emails/blob/master/migration.md#whats-new) -- [Overview](https://github.com/zurb/foundation-emails/blob/master/migration.md#overview) -- [HTML](https://github.com/zurb/foundation-emails/blob/master/migration.md#html) -- [CSS/Sass](https://github.com/zurb/foundation-emails/blob/master/migration.md#csssass) -- [Components](https://github.com/zurb/foundation-emails/blob/master/migration.md#components) - - [Grid](https://github.com/zurb/foundation-emails/blob/master/migration.md#grid) - - [Buttons](https://github.com/zurb/foundation-emails/blob/master/migration.md#buttons) - - [Callout](https://github.com/zurb/foundation-emails/blob/master/migration.md#panels-are-now-callouts) - - [Menu](https://github.com/zurb/foundation-emails/blob/master/migration.md#menu) -- [Dependencies](https://github.com/zurb/foundation-emails/blob/master/migration.md#dependencies) - -#### This guide describes the changes required to migrate a Foundation for Emails template from version 1 (formerly Ink) to 2. - -## What’s new? - -- **Streamlined and updated responsive grid:** We’ve simplified the markup in the new version so it’s faster and easier to code. The new responsive grid in Emails 2 requires fewer tags and classes. It’s also now responsive on Android Native! -- **Inky templating language:** With Inky you can write less code and get more done. The Inky language gets you out of tables and into a simpler, more web-like, HTML. -- **Built with Sass:** Now faster than ever, you can easily make sweeping visual changes to your email that reflect your brand styles - all within one settings file. -- **ZURB Stack:** All kinds of task automation - [Panini](http://foundation.zurb.com/sites/docs/panini.html), our Handlebars templates, compiling Sass, BrowserSync, image compression, and auto inlining are built in to speed up your workflow. - -## Overview - -When migrating, the following items can be translated easily from 1 to 2: -- Boilerplate -- Visibility -- Typography -- Text helper classes -- Button class -- Container -- Panel -- Media Queries - -Other areas may require more changes to work correctly including: -- Grid -- Sub-grid (now part of Grid) - -What’s new that you might want to use: -- Menu - Horizontal -- Menu - Vertical - -## HTML - -With Foundation for Emails 2, confusing and tedious tables are a thing of the past. The new Inky markup will save you time and energy coding your emails. It looks like: - -``` - - - - - - -``` - -You can use it to create the grid structure, buttons, and other components. We’ll go into this in detail in the components section. We'll explain more in the [Grid section](https://github.com/zurb/foundation-emails/blob/master/migration.md#grid). - -## CSS/Sass - -Foundation for Emails 2 is available in a Sass version which let’s you quickly change common CSS values with some simple variables within the settings. - -These are some CSS classes that are no longer needed for proper spacing: -- .wrapper -- .wrapper-last -- .text-pad -- .text-pad-left -- .text.pad-right - -*** -## Components -*** - -### Grid - -Version 1 -In the previous version, we needed extra tags to support a wrapper element. This used to control the gutter and margins of a column. - -``` - - - - -
    - - - - - -
    - - - - - - -
    - -
    - -
    - -
    -``` - -Version 2 (CSS version) -In F4E 2, we’ve eliminated another a tag in an effort to simplify your markup. Gutters are now directly applied to the column element itself. We still need to identify the last column with a last class, however we also need to identify the first column element with the first class. - -``` - - - - - -
    - - - - -
    - -
    -
    -``` - -Version 2 (Inky markup) - -``` - - - - - - - -``` - -### Sub-grid is now a small grid -In an effort to unify the thinking across the Foundation family, we’ve removed the sub-columns and moved towards a fully functional small grid. - -Version 1 - -``` - - - - -
    - - - - - - - -
    - - - -
    - -
    -``` - -Version 2 (CSS version) - -``` - - - - -
    - - - - - - - - -
    - - - -
    - -
    -``` - -Version 2 (Inky markup) - -``` - - - - - - - - - - -``` - -### Block Grid -The block grid has a minor syntax change with identifying the number of elements that are displayed in the row. We’ve moved to the convention of `.up-x`, instead of `.ex-up`. - - -Version 1 - -``` - - - - -
    - Thing 1 - - Thing 2 - - Thing 3 -
    -``` - -Version 2 (CSS version) - -``` - - - - - - -
    Thing 1Thing 2Thing 3
    -``` - -Version 2 (Inky markup) - -``` - -
  • Thing 1Thing 2Thing 3
    - - - -
    - - - - - - -
    - -
    -
    -``` - -Version 2 (CSS version) - -``` - - - - -
    - -
    -``` - -Version 2 (Inky markup) - -``` - - - - - -``` - -## Buttons -In the previous version of F4E the text inside of the button was the only clickable element. In F4E 2, we’ve taken the hybrid approach of using padding and borders to increase the clickable area - -Version 1 - -``` - - - - -
    - Button Label -
    -``` - -Version 2 (CSS version) - -``` - - - - -
    - - - - -
    - I am successful -
    -
    -``` - -Version 2 (Inky markup) - -``` - -``` - -The button markup has changed to make the touch targets better. Now the whole button is clickable. It requires more table markup but you should use Inky anyways which is much simpler. - -## Panels are now Callouts -In an effort to unify the terminology across the Foundation family panels are now called callouts. - -Version 1 - -``` - - - - - -
    - Panel content -
    -``` - -Version 2 (CSS version) - -``` - - - - - -
    - -
    -``` - -Version 2 (Inky markup) - -``` - - -

    One Word

    -
    - - -

    2sdafkhasdfkjhas dkfjh askdjfh askjdhf aksjdhf aksjdhf kajshdf

    -
    -
    -
    - - - - - - - -

    One Word

    -
    - -

    2sdafkhasdfkjhas dkfjh askdjfh askjdhf aksjdhf aksjdhf kajshdf

    -
    -
    - -
    -
    -
    -``` - -Callouts used to only be applicable to a ``. In Foundation for Emails 2, you can wrap a callout around a `` or the content inside a ``. - -*** -## NEW -*** - -### Menu - -Version 2 (CSS version) - -``` - - - - -
    - - - - - - - -
    -``` - -Version 2 (Inky markup) - -``` - - Item One - Item Two - Item Three - -``` - -The menu component can be used to create a simple set of links comonly used in headers, for social icons or in footers. Adding the `.vertical` class will change the orientation. - -## Dependencies - -**CSS:** - -- Text Editor - -**Sass version:** - -- Text Editor -- Git -- Node - -To use the Sass version with the Inky markup language you'll want to insall the Foundation for Emails project template. You'll find the [installation instructions here](https://github.com/zurb/foundation-emails/tree/v2.0#getting-started). diff --git a/vendor/assets/foundation-emails/package.json b/vendor/assets/foundation-emails/package.json deleted file mode 100644 index 7df5fc3..0000000 --- a/vendor/assets/foundation-emails/package.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "name": "foundation-emails", - "version": "2.2.1", - "description": "A framework for responsive emails made by ZURB", - "keywords": [ - "responsive", - "emails" - ], - "author": "ZURB (http://foundation.zurb.com)", - "scripts": { - "start": "gulp", - "test:visual": "gulp test", - "deploy:dist": "gulp dist", - "deploy:settings": "gulp settings", - "deploy:download": "gulp download", - "deploy:templates": "gulp templates", - "deploy:docs": "gulp deploy:docs" - }, - "repository": "https://github.com/zurb/foundation-emails", - "bugs": "https://github.com/zurb/foundation-emails/issues", - "devDependencies": { - "browser-sync": "^2.9.10", - "cheerio": "^0.19.0", - "clipboard-js": "^0.2.0", - "foundation-docs": "zurb/foundation-docs", - "foundation-sites": "^6.2.0", - "gulp": "^3.8.11", - "gulp-autoprefixer": "^2.3.1", - "gulp-cached": "^1.1.0", - "gulp-concat": "^2.6.0", - "gulp-cssnano": "^2.1.1", - "gulp-htmlmin": "^1.3.0", - "gulp-if": "^2.0.0", - "gulp-inject-string": "^1.1.0", - "gulp-inline-css": "^2.0.0", - "gulp-load-plugins": "^1.0.0-rc.1", - "gulp-prettify": "^0.4.0", - "gulp-prompt": "^0.1.2", - "gulp-rename": "^1.2.2", - "gulp-rsync": "0.0.5", - "gulp-sass": "^2.1.0", - "gulp-sass-lint": "^1.1.1", - "gulp-sourcemaps": "^1.6.0", - "gulp-wrap": "^0.11.0", - "gulp-zip": "^3.2.0", - "inky": "^1.3.6", - "lazypipe": "^1.0.1", - "motion-ui": "^1.1.1", - "multiline": "^1.0.2", - "octophant": "^1.0.0", - "panini": "^1.2.0", - "rimraf": "^2.4.2", - "run-sequence": "^1.1.2", - "siphon-media-query": "^1.0.0", - "supercollider": "^1.4.0", - "typeahead.js": "^0.11.1", - "zeroclipboard": "^2.2.0" - }, - "license": "MIT", - "eyeglass": { - "name": "foundation-emails", - "sassDir": "scss", - "needs": "^0.8.0" - } -} - - diff --git a/vendor/assets/foundation-emails/scss/_global.scss b/vendor/assets/foundation-emails/scss/_global.scss deleted file mode 100755 index 1d17692..0000000 --- a/vendor/assets/foundation-emails/scss/_global.scss +++ /dev/null @@ -1,95 +0,0 @@ -// Foundation for Emails by ZURB -// foundation.zurb.com -// Licensed under MIT Open Source - -//// -/// @group global -//// - -/// Primary color for interactive components like links and buttons. -/// @type Color -$primary-color: #2199e8 !default; - -/// Secondary color, used with components that support the `.secondary` class. -/// @type Color -$secondary-color: #777777 !default; - -/// Color to indicate a positive status or action, used with the `.success` class. -/// @type Color -$success-color: #3adb76 !default; - -/// Color to indicate a caution status or action, used with the `.warning` class. -/// @type Color -$warning-color: #ffae00 !default; - -/// Color to indicate a negative status or action, used with the `.alert` class. -/// @type Color -$alert-color: #ec5840 !default; - -/// Color used for light gray UI items within Foundation. -/// @type Color -$light-gray: #f3f3f3 !default; - -/// Color used for medium gray UI items within Foundation. -/// @type Color -$medium-gray: #cacaca !default; - -/// Color used for dark gray UI items within Foundation. -/// @type Color -$dark-gray: #8a8a8a !default; - -/// Color used for black ui items within Foundation -/// @type Color -$black: #0a0a0a !default; - -/// Color used for white ui items within Foundation -/// @type Color -$white: #fefefe !default; - -/// Color used code. -/// @type Color -$pre-color: #ff6908 !default; - -/// Width of the container. -/// @type Number -$global-width: 580px !default; - -/// Width of the container on small screens. -/// @type Length -$global-width-small: 95% !default; - -/// Gutter for grid elements. -/// @type length -$global-gutter: 16px !default; - -/// Body background color. -/// @type Length -$body-background: $light-gray !default; - -/// Color for the container background -/// @type Color -$container-background: $white !default; - -/// Global padding. -/// @type Number -$global-padding: 16px !default; - -/// Global margin. Margin requires a capital 'M' to workin Outlook.com -/// @type Number -$global-margin: 16px !default; - -/// Global raidus of radius-corners. -/// @type Number -$global-radius: 3px !default; - -/// Global rounded radius of rounded-corners. -/// @type Number -$global-rounded: 500px !default; - -/// Global media query to switch from desktop to mobile styles. -/// @type String -$global-breakpoint: $global-width + $global-gutter !default; - -.wrapper { - width: 100%; -} diff --git a/vendor/assets/foundation-emails/scss/components/_alignment.scss b/vendor/assets/foundation-emails/scss/components/_alignment.scss deleted file mode 100755 index cee59e5..0000000 --- a/vendor/assets/foundation-emails/scss/components/_alignment.scss +++ /dev/null @@ -1,88 +0,0 @@ -// Foundation for Emails by ZURB -// zurb.com/ink/ -// Licensed under MIT Open Source - -//// -/// @group alignment -//// - -table, -th, -td, -h1, -h2, -h3, -h4, -h5, -h6, -p, -span { - &.text-center { - text-align: center; - } - - &.text-left { - text-align: left; - } - - &.text-right { - text-align: right; - } -} - -span.text-center { - display: block; - width: 100%; - text-align: center; -} - -@media only screen and (max-width: #{$global-breakpoint}) { - .small-float-center { - margin: 0 auto !important; - float: none !important; - text-align: center !important; - } - - .small-text-center { - text-align: center !important; - } - - .small-text-left { - text-align: left !important; - } - - .small-text-right { - text-align: right !important; - } -} - -img.float-left { - float: left; - text-align: left; -} - -img.float-right { - float: right; - text-align: right; -} - -img.float-center, -img.text-center { - margin: 0 auto; - Margin: 0 auto; - float: none; - text-align: center; -} - -table, -td, -th { - &.float-center { - margin: 0 auto; - Margin: 0 auto; - float: none; - text-align: center; - } -} - - diff --git a/vendor/assets/foundation-emails/scss/components/_button.scss b/vendor/assets/foundation-emails/scss/components/_button.scss deleted file mode 100755 index d57bbc2..0000000 --- a/vendor/assets/foundation-emails/scss/components/_button.scss +++ /dev/null @@ -1,311 +0,0 @@ -// Foundation for Emails by ZURB -// zurb.com/ink/ -// Licensed under MIT Open Source - -//// -/// @group button -//// - -/// Padding inside buttons at various sizes. -/// @type Map -$button-padding: ( - tiny: 4px 8px 4px 8px, - small: 5px 10px 5px 10px, - default: 8px 16px 8px 16px, - large: 10px 20px 10px 20px, -) !default; - -/// Font sizes of buttons at various sizes. -/// @type Map -$button-font-size: ( - tiny: 10px, - small: 12px, - default: 16px, - large: 20px, -) !default; - -/// Text color of buttons. -/// @type Color -$button-color: $white !default; - -/// Text color of buttons with a light background. -/// @type Color -$button-color-alt: $medium-gray !default; - -/// Font weight of buttons. -/// @type Weight -$button-font-weight: bold !default; - -/// Margin around buttons. -/// @type List -$button-margin: 0 0 $global-margin 0 !default; - -/// Background color of buttons. -/// @type Color -$button-background: $primary-color !default; - -/// Border around buttons. -/// @type Border -$button-border: 2px solid $button-background !default; - -/// Border radius of buttons. Not supported by all email clients. -/// @type Number -$button-radius: $global-radius !default; - -/// Border radius of rounded buttons. Not supported by all email clients. -/// @type Number -$button-rounded: $global-rounded !default; - -table.button { - width: auto; - margin: $button-margin; - Margin: $button-margin; - - table { - - td { - text-align: left; - color: $button-color; - background: $button-background; - border: $button-border; - - a { - font-family: $body-font-family; - font-size: map-get($button-font-size, default); - font-weight: $button-font-weight; - color: $button-color; - text-decoration: none; - display: inline-block; - padding: map-get($button-padding, default); - border: 0 solid $button-background; - border-radius: $button-radius; - } - } - } - - &.radius table td { - border-radius: $button-radius; - border: none; - } - - &.rounded table td { - border-radius: $button-rounded; - border: none; - } -} - -table.button:hover table tr td a, -table.button:active table tr td a, -table.button table tr td a:visited, -table.button.tiny:hover table tr td a, -table.button.tiny:active table tr td a, -table.button.tiny table tr td a:visited, -table.button.small:hover table tr td a, -table.button.small:active table tr td a, -table.button.small table tr td a:visited, -table.button.large:hover table tr td a, -table.button.large:active table tr td a, -table.button.large table tr td a:visited { - color: $button-color; -} - -table.button.tiny { - table { - td, - a { - padding: map-get($button-padding, tiny); - } - - a { - font-size: map-get($button-font-size, tiny); - font-weight: normal; - } - } -} - -table.button.small { - table { - td, - a { - padding: map-get($button-padding, small); - font-size: map-get($button-font-size, small); - } - } -} - -table.button.large { - table { - a { - padding: map-get($button-padding, large); - font-size: map-get($button-font-size, large); - } - } -} - -table.button.expand, -table.button.expanded { - width: 100% !important; - - table { - width: 100%; - - a { - text-align: center; - width: 100%; - padding-left: 0; - padding-right: 0; - } - } - - center { - min-width: 0; - } -} - -table.button:hover, -table.button:visited, -table.button:active { - table { - td { - background: darken($button-background, 10%); - color: $button-color; - } - } -} - -table.button:hover, -table.button:visited, -table.button:active { - table { - a { - border: 0 solid darken($button-background, 10%); - } - } -} - -table.button.secondary { - table { - td { - background: $secondary-color; - color: $button-color; - border: 0px solid $secondary-color; - } - - a { - color: $button-color; - border: 0 solid $secondary-color; - } - } -} - -table.button.secondary:hover { - table { - td { - background: lighten($secondary-color, 10%); - color: $button-color; - } - - a { - border: 0 solid lighten($secondary-color, 10%); - } - } -} - -table.button.secondary:hover { - table { - td a { - color: $button-color; - } - } -} - -table.button.secondary:active { - table { - td a { - color: $button-color; - } - } -} - -table.button.secondary { - table { - td a:visited { - color: $button-color; - } - } -} - -table.button.success { - table { - td { - background: $success-color; - border: 0px solid $success-color; - } - - a { - border: 0 solid $success-color; - } - } -} - -table.button.success:hover { - table { - td { - background: darken($success-color, 10%); - } - - a { - border: 0 solid darken($success-color, 10%); - } - } -} - -table.button.alert { - table { - td { - background: $alert-color; - border: 0px solid $alert-color; - } - - a { - border: 0 solid $alert-color; - } - } -} - -table.button.alert:hover { - table { - td { - background: darken($alert-color, 10%); - } - - a { - border: 0 solid darken($alert-color, 10%); - } - } -} - -table.button.warning { - table { - td { - background: $warning-color; - border: 0px solid $warning-color; - } - - a { - border: 0px solid $warning-color; - } - } -} - -table.button.warning:hover { - table { - td { - background: darken($warning-color, 10%); - } - - a { - border: 0px solid darken($warning-color, 10%); - } - } -} diff --git a/vendor/assets/foundation-emails/scss/components/_callout.scss b/vendor/assets/foundation-emails/scss/components/_callout.scss deleted file mode 100644 index 17ae6dd..0000000 --- a/vendor/assets/foundation-emails/scss/components/_callout.scss +++ /dev/null @@ -1,85 +0,0 @@ -// Foundation for Emails by ZURB -// zurb.com/ink/ -// Licensed under MIT Open Source - -//// -/// @group callout -//// - -/// Background color of a callout. -/// @type Color -$callout-background: $white !default; - -/// Fade value for callout backgrounds. -/// @type Number -$callout-background-fade: 85% !default; - -/// Padding inside a callout. -/// @type Length -$callout-padding: 10px !default; - -/// Bottom margin of a callout. -/// @type Length -$callout-margin-bottom: $global-margin !default; - -/// Border around a callout. -/// @type Border -$callout-border: 1px solid darken($callout-background, 20%) !default; - -/// Border around a callout with the `.success` class. -/// @type Border -$callout-border-secondary: 1px solid darken($secondary-color, 20%) !default; - -/// Border around a callout with the `.success` class. -/// @type Border -$callout-border-success: 1px solid darken($success-color, 20%) !default; - -/// Border around a callout with the `.warning` class. -/// @type Border -$callout-border-warning: 1px solid darken($warning-color, 20%) !default; - -/// Border around a callout with the `.alert` class. -/// @type Border -$callout-border-alert: 1px solid darken($alert-color, 20%) !default; - -table.callout { - margin-bottom: $callout-margin-bottom; - Margin-bottom: $callout-margin-bottom; -} - -th.callout-inner { - width: 100%; - border: $callout-border; - padding: $callout-padding; - background: $callout-background; - - &.primary { - background: scale-color($primary-color, $lightness: $callout-background-fade); - border: $callout-border-secondary; - color: $black; - } - - &.secondary { - background: scale-color($secondary-color, $lightness: $callout-background-fade); - border: $callout-border-secondary; - color: $black; - } - - &.success { - background: scale-color($success-color, $lightness: $callout-background-fade); - border: $callout-border-success; - color: $white; - } - - &.warning { - background: scale-color($warning-color, $lightness: $callout-background-fade); - border: $callout-border-warning; - color: $white; - } - - &.alert { - background: scale-color($alert-color, $lightness: $callout-background-fade); - border: $callout-border-alert; - color: $white; - } -} diff --git a/vendor/assets/foundation-emails/scss/components/_code.scss b/vendor/assets/foundation-emails/scss/components/_code.scss deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/assets/foundation-emails/scss/components/_media-query.scss b/vendor/assets/foundation-emails/scss/components/_media-query.scss deleted file mode 100755 index 52c94fa..0000000 --- a/vendor/assets/foundation-emails/scss/components/_media-query.scss +++ /dev/null @@ -1,139 +0,0 @@ -// Foundation for Emails by ZURB -// zurb.com/ink/ -// Licensed under MIT Open Source - -//// -/// @group media-query -//// - -@media only screen and (max-width: #{$global-breakpoint}) { - table.body img { - width: auto; - height: auto; - } - - table.body center { - min-width: 0 !important; - } - - table.body .container { - width: $global-width-small !important; - } - - //If it supports border-box, why not? Am I right? - //Also, by default pad that to the global-gutter variable - table.body .columns, - table.body .column { - height: auto !important; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - padding-left: $global-gutter !important; - padding-right: $global-gutter !important; - - // Nested columns won't double the padding - .column, - .columns { - padding-left: 0 !important; - padding-right: 0 !important; - } - } - - // Collpased columns have no gutter. - .collapse { - table.body & .columns, - table.body & .column { - padding-left: 0 !important; - padding-right: 0 !important; - } - } - - // Basic grid rules - @for $i from 1 through $grid-column-count { - td.small-#{$i}, - th.small-#{$i} { - display: inline-block !important; - width: -zf-grid-calc-pct($i, $grid-column-count) !important; - } - } - - //If it's the last column in column count (12 by default), - //give it block and 100% width to knock down the wimpy columns to their own row. - .columns td.small-#{$grid-column-count}, - .column td.small-#{$grid-column-count}, - .columns th.small-#{$grid-column-count}, - .column th.small-#{$grid-column-count} { - display: block !important; - width: 100% !important; - } - - @for $i from 1 through ($grid-column-count - 1) { - table.body td.small-offset-#{$i}, - table.body th.small-offset-#{$i} { - //1.5 takes in effect a whole empty cell. - margin-left: -zf-grid-calc-pct($i, $grid-column-count) !important; - Margin-left: -zf-grid-calc-pct($i, $grid-column-count) !important; - } - } - - table.body table.columns td.expander, - table.body table.columns th.expander { - display: none !important; - } - - table.body .right-text-pad, - table.body .text-pad-right { - padding-left: $text-padding !important; - } - - table.body .left-text-pad, - table.body .text-pad-left { - padding-right: $text-padding !important; - } - - //menu - table.menu { - width: 100% !important; - - td, - th { - width: auto !important; - display: inline-block !important; - } - - &.vertical, - &.small-vertical { - td, - th { - display: block !important; - } - } - } - - // Centers the menus! - table.menu[align="center"] { - width: auto !important; - } - - // expands buttons for small only - table.button.small-expand, - table.button.small-expanded { - width: 100% !important; - - table { - width: 100%; - - a { - text-align: center !important; - width: 100% !important; - padding-left: 0 !important; - padding-right: 0 !important; - } - } - - center { - min-width: 0; - } - } -} - diff --git a/vendor/assets/foundation-emails/scss/components/_menu.scss b/vendor/assets/foundation-emails/scss/components/_menu.scss deleted file mode 100644 index ff4f912..0000000 --- a/vendor/assets/foundation-emails/scss/components/_menu.scss +++ /dev/null @@ -1,67 +0,0 @@ -// Foundation for Emails by ZURB -// zurb.com/ink/ -// Licensed under MIT Open Source - -//// -/// @group menu -//// - -/// Padding inside a menu item. -/// @type Length -$menu-item-padding: 10px !default; - -/// Right-hand spacing of items in menus with the `.simple` class. -/// @type Length -$menu-item-gutter: 10px !default; - -/// This is the color of the menu item links. -/// @type Color -$menu-item-color: $primary-color !default; - -table.menu { - width: $global-width; - - td.menu-item, - th.menu-item { - padding: $menu-item-padding; - padding-right: $menu-item-gutter; - - a { - color: $menu-item-color; - } - } -} - -// Doesn't work on the pesky ESPs like outlook 2000 -table.menu.vertical { - td.menu-item, - th.menu-item { - padding: $menu-item-padding; - padding-right: 0; - display: block; - - a { - width: 100%; - } - } - - // Nested lists need some more padding to the left - td.menu-item, - th.menu-item { - table.menu.vertical { - td.menu-item, - th.menu-item { - padding-left: $menu-item-padding; - } - } - } -} - -table.menu.text-center a { - text-align: center; -} - -//Centers the menus! -.menu[align="center"] { - width: auto !important; -} \ No newline at end of file diff --git a/vendor/assets/foundation-emails/scss/components/_normalize.scss b/vendor/assets/foundation-emails/scss/components/_normalize.scss deleted file mode 100755 index 285e310..0000000 --- a/vendor/assets/foundation-emails/scss/components/_normalize.scss +++ /dev/null @@ -1,90 +0,0 @@ -// Foundation for Emails by ZURB -// zurb.com/ink/ -// Licensed under MIT Open Source - -//// -/// @group normalize -//// - -$paragraph-margin-bottom: 10px !default; - -#outlook a { - padding: 0; -} - -body { - width: 100% !important; - min-width: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; - margin: 0; - Margin: 0; - padding: 0; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; -} - -.ExternalClass { - width: 100%; - - &, - p, - span, - font, - td, - div { - line-height: 100%; - } -} - -#backgroundTable { - margin: 0; - Margin: 0; - padding: 0; - width: 100% !important; - line-height: 100% !important; -} - -img { - outline: none; - text-decoration: none; - -ms-interpolation-mode: bicubic; - width: auto; - max-width: 100%; - clear: both; - display: block; -} - -center { - width: 100%; - min-width: $global-width; -} - -a img { - border: none; -} - -p { - margin: 0 0 0 $paragraph-margin-bottom; - Margin: 0 0 0 $paragraph-margin-bottom; -} - -table { - border-spacing: 0; - border-collapse: collapse; -} - -td { - word-wrap: break-word; - -webkit-hyphens: auto; - -moz-hyphens: auto; - hyphens: auto; - border-collapse: collapse !important; -} - -table, tr, td { - padding: 0; - vertical-align: top; - text-align: left; -} diff --git a/vendor/assets/foundation-emails/scss/components/_outlook-first.scss b/vendor/assets/foundation-emails/scss/components/_outlook-first.scss deleted file mode 100755 index 2e03732..0000000 --- a/vendor/assets/foundation-emails/scss/components/_outlook-first.scss +++ /dev/null @@ -1,11 +0,0 @@ -// Foundation for Emails by ZURB -// zurb.com/ink/ -// Licensed under MIT Open Source - -//// -/// @group outlook -//// - -body.outlook p { - display: inline !important; -} diff --git a/vendor/assets/foundation-emails/scss/components/_thumbnail.scss b/vendor/assets/foundation-emails/scss/components/_thumbnail.scss deleted file mode 100644 index 2120503..0000000 --- a/vendor/assets/foundation-emails/scss/components/_thumbnail.scss +++ /dev/null @@ -1,49 +0,0 @@ -// Foundation for Emails by ZURB -// zurb.com/ink/ -// Licensed under MIT Open Source - -//// -/// @group thumbnail -//// - -/// Border around thumbnail images. -/// @type Border -$thumbnail-border: solid 4px $white !default; - -/// Bottom margin for thumbnail images. -/// @type Length -$thumbnail-margin-bottom: $global-margin !default; - -/// Box shadow under thumbnail images. -/// @type Shadow -$thumbnail-shadow: 0 0 0 1px rgba($black, 0.2) !default; - -/// Box shadow under thumbnail images. -/// @type Shadow -$thumbnail-shadow-hover: 0 0 6px 1px rgba($primary-color, 0.5) !default; - -/// Transition proprties for thumbnail images. -/// @type Transition -$thumbnail-transition: box-shadow 200ms ease-out !default; - -/// Default radius for thumbnail images. -/// @type Number -$thumbnail-radius: $global-radius !default; - -/// Adds thumbnail styles to an element. -.thumbnail { - border: $thumbnail-border; - box-shadow: $thumbnail-shadow; - display: inline-block; - line-height: 0; - max-width: 100%; - transition: $thumbnail-transition; - border-radius: $thumbnail-radius; - margin-bottom: $thumbnail-margin-bottom; - - &:hover, - &:focus { - box-shadow: $thumbnail-shadow-hover; - } -} - diff --git a/vendor/assets/foundation-emails/scss/components/_typography.scss b/vendor/assets/foundation-emails/scss/components/_typography.scss deleted file mode 100755 index d68417a..0000000 --- a/vendor/assets/foundation-emails/scss/components/_typography.scss +++ /dev/null @@ -1,339 +0,0 @@ -// Foundation for Emails by ZURB -// zurb.com/ink/ -// Licensed under MIT Open Source - -//// -/// @group typography -//// - -/// Global font color. -/// @type Color -$global-font-color: $black !default; - -/// Global font family. -/// @type Font -$body-font-family: Helvetica, Arial, sans-serif !default; - -/// Global font weight. -/// @type Keyword -$global-font-weight: normal !default; - -/// Global font weight. -/// @type Keyword -$header-color: inherit !default; - -/// Global line height. -/// @type Number -$global-line-height: 1.3 !default; - -/// Font size of body text. -/// @type Number -$global-font-size: 16px !default; - -/// Line height of body text. -/// @type Number -$body-line-height: $global-line-height !default; - -/// Font family of headings. -/// @type List -$header-font-family: $body-font-family !default; - -/// Font family of headings. -/// @type List -$header-font-weight: $global-font-weight !default; - -/// Font size of `

    ` elements. -/// @type Number -$h1-font-size: 34px !default; - -/// Font size of `

    ` elements. -/// @type Number -$h2-font-size: 30px !default; - -/// Font size of `

    ` elements. -/// @type Number -$h3-font-size: 28px !default; - -/// Font size of `

    ` elements. -/// @type Number -$h4-font-size: 24px !default; - -/// Font size of `

    ` elements. -/// @type Number -$h5-font-size: 20px !default; - -/// Font size of `
    ` elements. -/// @type Number -$h6-font-size: 18px !default; - -/// Margin bottom of `

    ` through `

    ` elements. -/// @type Number -$header-margin-bottom: 10px !default; - -/// Margin bottom of paragraphs. -/// @type Number -$paragraph-margin-bottom: 10px !default; - -/// Default font size for ``. -/// @type Number -$small-font-size: 80% !default; - -/// Color of `` elements when placed inside headers. -/// @type Color -$small-font-color: $medium-gray !default; - -/// Font size of lead paragraphs. -/// @type Number -$lead-font-size: $global-font-size * 1.25 !default; - -/// Line height of lead paragraphs. -/// @type Number -$lead-line-height: 1.6 !default; - -/// Padding inside paragraphs. -/// @type Number -$text-padding: 10px !default; - -/// Default line height for subheaders. -/// @type Number -$subheader-lineheight: 1.4 !default; - -/// Default font color for subheaders. -/// @type Color -$subheader-color: $dark-gray !default; - -/// Default font weight for subheaders. -/// @type String -$subheader-font-weight: $global-font-weight !default; - -/// Default top margin for subhheaders. -/// @type Number -$subheader-margin-top: 4px !default; - -/// Default bottom margin for subheaders. -/// @type Number -$subheader-margin-bottom: 8px !default; - -/// Maximum width of a divider. -/// @type Number -$hr-width: $global-width !default; - -/// Default border for a divider. -/// @type List -$hr-border: 1px solid $black !default; - -/// Default margin for a divider. -/// @type Number | List -$hr-margin: 20px auto !default; - -/// Text decoration for anchors. -/// @type Keyword -$anchor-text-decoration: none !default; - -/// Text color of anchors. -/// @type Color -$anchor-color: $primary-color !default; - -/// Text color of anchors to visited links. -/// @type Color -$anchor-color-visited: $anchor-color !default; - -/// Text color of anchors on hover. -/// @type Color -$anchor-color-hover: darken($primary-color, 10%) !default; - -/// Text color of active anchors. -/// @type Color -$anchor-color-active: $anchor-color-hover !default; - -/// Default font size for statistic numbers. -/// @type Number -$stat-font-size: 40px !default; - -body, -table.body, -h1, -h2, -h3, -h4, -h5, -h6, -p, -td, -th, -a { - color: $global-font-color; - font-family: $body-font-family; - font-weight: $global-font-weight; - padding: 0; - margin: 0; - Margin: 0; - text-align: left; - line-height: $global-line-height; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - color: $header-color; - word-wrap: normal; - font-family: $header-font-family; - font-weight: $header-font-weight; - margin-bottom: $header-margin-bottom; - Margin-bottom: $header-margin-bottom; -} - -h1 { - font-size: $h1-font-size; -} - -h2 { - font-size: $h2-font-size; -} - -h3 { - font-size: $h3-font-size; -} - -h4 { - font-size: $h4-font-size; -} - -h5 { - font-size: $h5-font-size; -} - -h6 { - font-size: $h6-font-size; -} - -body, -table.body, -p, -td, -th { - font-size: $global-font-size; - line-height: $body-line-height; -} - -p { - margin-bottom: $paragraph-margin-bottom; - Margin-bottom: $paragraph-margin-bottom; - - &.lead { - font-size: $lead-font-size; - line-height: $lead-line-height; - } - - &.subheader { - margin-top: $subheader-margin-top; - margin-bottom: $subheader-margin-bottom; - Margin-top: $subheader-margin-top; - Margin-bottom: $subheader-margin-bottom; - font-weight: $subheader-font-weight; - line-height: $subheader-lineheight; - color: $subheader-color; - } -} - -small { - font-size: $small-font-size; - color: $small-font-color; -} - -a { - color: $anchor-color; - text-decoration: $anchor-text-decoration; - - &:hover { - color: $anchor-color-hover; - } - - &:active { - color: $anchor-color-active; - } - - &:visited { - color: $anchor-color-visited; - } -} - -h1 a, -h1 a:visited, -h2 a, -h2 a:visited, -h3 a, -h3 a:visited, -h4 a, -h4 a:visited, -h5 a, -h5 a:visited, -h6 a, -h6 a:visited { - color: $anchor-color; -} - -pre { - background: $light-gray; - margin: 30px 0; - Margin: 30px 0; - - code { - color: $medium-gray; - - span.callout { - color: $dark-gray; - font-weight: bold; - } - - span.callout-strong { - color: $pre-color; - font-weight: bold; - } - } -} - -// Horizontal rule -table.hr { - width: 100%; - - th { - height: 0; - max-width: $hr-width; - border-top: 0; - border-right: 0; - border-bottom: $hr-border; - border-left: 0; - margin: $hr-margin; - Margin: $hr-margin; - clear: both; - } -} - -// Use to style a large number to display a statistic -.stat { - font-size: $stat-font-size; - line-height: 1; - - p + & { - margin-top: -16px; - Margin-top: -16px; - } -} - -// preheader styles -span.preheader { - display: none !important; - visibility: hidden; - mso-hide: all !important; - font-size: 1px; - color: $body-background; // needs to match background color of it's container - line-height: 1px; - max-height: 0px; - max-width: 0px; - opacity: 0; - overflow: hidden; -} \ No newline at end of file diff --git a/vendor/assets/foundation-emails/scss/components/_visibility.scss b/vendor/assets/foundation-emails/scss/components/_visibility.scss deleted file mode 100644 index 7af167a..0000000 --- a/vendor/assets/foundation-emails/scss/components/_visibility.scss +++ /dev/null @@ -1,66 +0,0 @@ -// Foundation for Emails by ZURB -// zurb.com/ink/ -// Licensed under MIT Open Source - -//// -/// @group visibility -//// - -.hide-for-large { - display: none !important; - mso-hide: all; // hide selected elements in Outlook 2007-2013 - overflow: hidden; - max-height: 0; - font-size: 0; - width: 0; - line-height: 0; - - @media only screen and (max-width: #{$global-breakpoint}) { - display: block !important; - width: auto !important; - overflow: visible !important; - max-height: none !important; - font-size: inherit !important; - line-height: inherit !important; - } -} - -table.body table.container .hide-for-large * { - mso-hide: all; // hide selected elements in Outlook 2007-2013 -} - -table.body table.container .hide-for-large, -table.body table.container .row.hide-for-large { - @media only screen and (max-width: #{$global-breakpoint}) { - display: table !important; - width: 100% !important; - } -} - -table.body table.container .callout-inner.hide-for-large { - @media only screen and (max-width: #{$global-breakpoint}) { - display: table-cell !important; - width: 100% !important; - } -} - -table.body table.container .show-for-large { - @media only screen and (max-width: #{$global-breakpoint}) { - display: none !important; - width: 0; - mso-hide: all; // hide selected elements in Outlook 2007-2013 - overflow: hidden; - } -} - -// [todo] add image resets -// img { -// max-height: 0; -// width: 0; -// } -// in media query -// img { -// max-height: none !important; -// width: auto !important; -// } - diff --git a/vendor/assets/foundation-emails/scss/foundation-emails.scss b/vendor/assets/foundation-emails/scss/foundation-emails.scss deleted file mode 100644 index 03ccb41..0000000 --- a/vendor/assets/foundation-emails/scss/foundation-emails.scss +++ /dev/null @@ -1,19 +0,0 @@ -// Foundation for Emails by ZURB -// foundation.zurb.com -// Licensed under MIT Open Source - -@import - 'util/util', - 'global', - 'components/normalize', - 'grid/grid', - 'grid/block-grid', - 'components/alignment', - 'components/visibility', - 'components/typography', - 'components/button', - 'components/callout', - 'components/thumbnail', - 'components/menu', - 'components/outlook-first', - 'components/media-query'; diff --git a/vendor/assets/foundation-emails/scss/grid/_block-grid.scss b/vendor/assets/foundation-emails/scss/grid/_block-grid.scss deleted file mode 100755 index 0a38192..0000000 --- a/vendor/assets/foundation-emails/scss/grid/_block-grid.scss +++ /dev/null @@ -1,32 +0,0 @@ -// Foundation for Emails by ZURB -// zurb.com/ink/ -// Licensed under MIT Open Source - -//// -/// @group block-grid -//// - -/// The highest number of `.x-up` classes available when using the block grid CSS. -/// @type Number -$block-grid-max: 8 !default; - -/// Gutter between elements in a block grid. -/// @type Number -$block-grid-gutter: $global-gutter !default; - -.block-grid { - width: 100%; - max-width: $global-width; - - td { - display: inline-block; - padding: $block-grid-gutter / 2; - } -} - -// Sizing classes -@for $i from 2 through $block-grid-max { - .up-#{$i} td { - width: floor(($global-width - $i * $block-grid-gutter) / $i) !important; - } -} diff --git a/vendor/assets/foundation-emails/scss/grid/_grid.scss b/vendor/assets/foundation-emails/scss/grid/_grid.scss deleted file mode 100755 index ea81daa..0000000 --- a/vendor/assets/foundation-emails/scss/grid/_grid.scss +++ /dev/null @@ -1,172 +0,0 @@ -// Foundation for Emails by ZURB -// zurb.com/ink/ -// Licensed under MIT Open Source - -//// -/// @group grid -//// - -/// Default number of columns for an email. -/// @type Number -$grid-column-count: 12 !default; - -/// Default padding for the bottom of a column. -/// @type Number -$column-padding-bottom: $global-padding !default; - -/// Default border radius for the container. Use a px value -/// @type Number -$container-radius: 0 !default; - -//For viewing email in browser -@media only screen { - html { - min-height: 100%; - background: $body-background; - } -} - -table { - &.body { - background: $body-background; - height: 100%; - width: 100%; - } - - &.container { - background: $container-background; - width: $global-width; - margin: 0 auto; - Margin: 0 auto; - text-align: inherit; - } - - &.row { - padding: 0; - width: 100%; - position: relative; - } - - &.spacer { - width: 100%; - td { - mso-line-height-rule: exactly; - } - } -} - -table.container table.row { - display: table; -} - -td.columns, -td.column, -th.columns, -th.column { - margin: 0 auto; - Margin: 0 auto; - padding-left: $global-gutter; - padding-bottom: $column-padding-bottom; - - // Prevents Nested columns from double the padding - .column, - .columns { - padding-left: 0 !important; - padding-right: 0 !important; - - center { - min-width: none !important; - } - } -} - -td.columns.last, -td.column.last, -th.columns.last, -th.column.last { - padding-right: $global-gutter; -} - -//makes sure nested tables are 100% width -td.columns, -td.column, -th.columns, -th.column { - table:not(.button) { - width: 100%; - } -} - -@for $i from 1 through $grid-column-count { - td.large-#{$i}, - th.large-#{$i} { - width: -zf-grid-calc-px($i, $grid-column-count, $global-width); - padding-left: $global-gutter / 2; - padding-right: $global-gutter / 2; - } - - td.large-#{$i}.first, - th.large-#{$i}.first { - padding-left: $global-gutter; - } - - td.large-#{$i}.last, - th.large-#{$i}.last { - padding-right: $global-gutter; - } - - //Collapsed logic - .collapse { - > tbody > tr > td.large-#{$i}, - > tbody > tr > th.large-#{$i} { - padding-right: 0; - padding-left: 0; - width: -zf-grid-calc-px($i, $grid-column-count, $global-width) + $global-gutter; - } - - //Gotta give it that extra love for the first and last columns. - td.large-#{$i}.first, - th.large-#{$i}.first, - td.large-#{$i}.last, - th.large-#{$i}.last { - width: -zf-grid-calc-px($i, $grid-column-count, $global-width) + ($global-gutter * 1.5); - } - } - - td.large-#{$i} center, - th.large-#{$i} center { - min-width: -zf-grid-calc-px($i, $grid-column-count, $global-width) - ($global-gutter * 2); - } - - .body .columns td.large-#{$i}, - .body .column td.large-#{$i}, - .body .columns th.large-#{$i}, - .body .column th.large-#{$i} { - width: -zf-grid-calc-pct($i, $grid-column-count); - } -} - -@for $i from 1 through ($grid-column-count - 1) { - td.large-offset-#{$i}, - td.large-offset-#{$i}.first, - td.large-offset-#{$i}.last, - th.large-offset-#{$i}, - th.large-offset-#{$i}.first, - th.large-offset-#{$i}.last { - //1.5 takes in effect a whole empty cell. - padding-left: -zf-grid-calc-px($i, $grid-column-count, $global-width) + $global-gutter * 2; - } -} - -td.expander, -th.expander { - visibility: hidden; - width: 0; - padding: 0 !important; -} - -// adds radius to container -table.container.radius { - border-radius: $container-radius; - border-collapse: separate; -} diff --git a/vendor/assets/foundation-emails/scss/settings/_settings.scss b/vendor/assets/foundation-emails/scss/settings/_settings.scss deleted file mode 100644 index 57c3d0f..0000000 --- a/vendor/assets/foundation-emails/scss/settings/_settings.scss +++ /dev/null @@ -1,147 +0,0 @@ -// Foundation for Emails Settings -// ------------------------------ -// -// Table of Contents: -// -// 1. Global -// 2. Grid -// 3. Block Grid -// 4. Typography -// 5. Button -// 6. Callout -// 7. Menu -// 8. Thumbnail - - -// 1. Global -// --------- - -$primary-color: #2199e8; -$secondary-color: #777777; -$success-color: #3adb76; -$warning-color: #ffae00; -$alert-color: #ec5840; -$light-gray: #f3f3f3; -$medium-gray: #cacaca; -$dark-gray: #8a8a8a; -$black: #0a0a0a; -$white: #fefefe; -$pre-color: #ff6908; -$global-width: 580px; -$global-width-small: 95%; -$global-gutter: 16px; -$body-background: $light-gray; -$container-background: $white; -$global-padding: 16px; -$global-margin: 16px; -$global-radius: 3px; -$global-rounded: 500px; -$global-breakpoint: $global-width + $global-gutter; - -// 2. Grid -// ------- - -$grid-column-count: 12; -$column-padding-bottom: $global-padding; -$container-radius: 0; - -// 3. Block Grid -// ------------- - -$block-grid-max: 8; -$block-grid-gutter: $global-gutter; - -// 4. Typography -// ------------- - -$global-font-color: $black; -$body-font-family: Helvetica, Arial, sans-serif; -$global-font-weight: normal; -$header-color: inherit; -$global-line-height: 1.3; -$global-font-size: 16px; -$body-line-height: $global-line-height; -$header-font-family: $body-font-family; -$header-font-weight: $global-font-weight; -$h1-font-size: 34px; -$h2-font-size: 30px; -$h3-font-size: 28px; -$h4-font-size: 24px; -$h5-font-size: 20px; -$h6-font-size: 18px; -$header-margin-bottom: 10px; -$paragraph-margin-bottom: 10px; -$small-font-size: 80%; -$small-font-color: $medium-gray; -$lead-font-size: $global-font-size * 1.25; -$lead-line-height: 1.6; -$text-padding: 10px; -$subheader-lineheight: 1.4; -$subheader-color: $dark-gray; -$subheader-font-weight: $global-font-weight; -$subheader-margin-top: 4px; -$subheader-margin-bottom: 8px; -$hr-width: $global-width; -$hr-border: 1px solid $black; -$hr-margin: 20px auto; -$anchor-text-decoration: none; -$anchor-color: $primary-color; -$anchor-color-visited: $anchor-color; -$anchor-color-hover: darken($primary-color, 10%); -$anchor-color-active: $anchor-color-hover; -$stat-font-size: 40px; - -// 5. Button -// --------- - -$button-padding: ( - tiny: 4px 8px 4px 8px, - small: 5px 10px 5px 10px, - default: 8px 16px 8px 16px, - large: 10px 20px 10px 20px, -); -$button-font-size: ( - tiny: 10px, - small: 12px, - default: 16px, - large: 20px, -); -$button-color: $white; -$button-color-alt: $medium-gray; -$button-font-weight: bold; -$button-margin: 0 0 $global-margin 0; -$button-background: $primary-color; -$button-border: 2px solid $button-background; -$button-radius: $global-radius; -$button-rounded: $global-rounded; - -// 6. Callout -// ---------- - -$callout-background: $white; -$callout-background-fade: 85%; -$callout-padding: 10px; -$callout-margin-bottom: $global-margin; -$callout-border: 1px solid darken($callout-background, 20%); -$callout-border-secondary: 1px solid darken($secondary-color, 20%); -$callout-border-success: 1px solid darken($success-color, 20%); -$callout-border-warning: 1px solid darken($warning-color, 20%); -$callout-border-alert: 1px solid darken($alert-color, 20%); - -// 7. Menu -// ------- - -$menu-item-padding: 10px; -$menu-item-gutter: 10px; -$menu-item-color: $primary-color; - -// 8. Thumbnail -// ------------ - -$thumbnail-border: solid 4px $white; -$thumbnail-margin-bottom: $global-margin; -$thumbnail-shadow: 0 0 0 1px rgba($black, 0.2); -$thumbnail-shadow-hover: 0 0 6px 1px rgba($primary-color, 0.5); -$thumbnail-transition: box-shadow 200ms ease-out; -$thumbnail-radius: $global-radius; - diff --git a/vendor/assets/foundation-emails/scss/util/_util.scss b/vendor/assets/foundation-emails/scss/util/_util.scss deleted file mode 100755 index faabca5..0000000 --- a/vendor/assets/foundation-emails/scss/util/_util.scss +++ /dev/null @@ -1,22 +0,0 @@ -// Foundation for Emails by ZURB -// foundation.zurb.com -// Licensed under MIT Open Source - -/// Calculates a percentage value for a grid column width. -/// @access private -/// @param {number} $colNumber - Column count of the column. -/// @param {number} $totalColumns - Column count of the entire row. -/// @returns {number} A percentage width value. -@function -zf-grid-calc-pct($colNumber, $totalColumns) { - @return floor(percentage(($colNumber / $totalColumns)) * 1000000) / 1000000; -} - -/// Calculates a pixel value for a grid column width. -/// @access private -/// @param {number} $columnNumber - Column count of the column. -/// @param {number} $totalColumns - Column count of the entire row. -/// @param {number} $containerWidth - Width of the surrounding container, in pixels. -/// @returns {number} A pixel width value. -@function -zf-grid-calc-px($columnNumber, $totalColumns, $containerWidth) { - @return ($containerWidth / $totalColumns * $columnNumber - $global-gutter); -} diff --git a/vendor/assets/foundation-emails/templates/basic.html b/vendor/assets/foundation-emails/templates/basic.html deleted file mode 100644 index e1f1224..0000000 --- a/vendor/assets/foundation-emails/templates/basic.html +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - -

    BASIC

    -
    -
    -
    -
    - - - - - - - - -

    Hi, Susan Calvin

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Magni, iste, amet consequatur a veniam.

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut optio nulla et, fugiat. Maiores accusantium nostrum asperiores provident, quam modi ex inventore dolores id aspernatur architecto odio minima perferendis, explicabo. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima quos quasi itaque beatae natus fugit provident delectus, magnam laudantium odio corrupti sit quam. Optio aut ut repudiandae velit distinctio asperiores?

    - -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Reprehenderit repellendus natus, sint ea optio dignissimos asperiores inventore a molestiae dolorum placeat repellat excepturi mollitia ducimus unde doloremque ad, alias eos!

    -
    -
    -
    - - - - - - -
    Connect With Us:
    - - - -
    - -
    Contact Info:
    -

    Phone: 408-341-0600

    -
    - - - - diff --git a/vendor/assets/foundation-emails/templates/drip.html b/vendor/assets/foundation-emails/templates/drip.html deleted file mode 100644 index 5487677..0000000 --- a/vendor/assets/foundation-emails/templates/drip.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - -
    - -
    - - - - - -

    Responsive Emails

    -

    15 sections | 567 Min

    -
    -
    - -
    - - - -

    Hey you! It's you! Just a heads up, we just added this hot new class that will teach you how to NOT be a lame as a duck. Not the metaphorical lame duck, either, but a real duck that was actually lame, maybe from stepping on a land mine or something. Anyways, Foundation for Emails makes coding HTML emails like calling the Navy SEALS to invade a Pre-school, with pre-schoolers, armed with Crayolas.

    -
    - -
    -
    -
    - - - -
    \ No newline at end of file diff --git a/vendor/assets/foundation-emails/templates/hero.html b/vendor/assets/foundation-emails/templates/hero.html deleted file mode 100644 index a5a773c..0000000 --- a/vendor/assets/foundation-emails/templates/hero.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - -

    HERO

    -
    -
    -
    -
    - - - - - - - -

    Hi, Elijah Baily

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nisi impedit sapiente delectus molestias quia.

    - - -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Veniam assumenda, praesentium qui vitae voluptate dolores. Click it!

    -
    -

    Title Ipsum This is a note.

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nisi repellat, harum. Quas nobis id aut, aspernatur, sequi tempora laborum corporis cum debitis, ullam, dolorem dolore quisquam aperiam! Accusantium, ullam, nesciunt. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ducimus consequuntur commodi, aut sed, quas quam optio accusantium recusandae nesciunt, architecto veritatis. Voluptatibus sunt esse dolor ipsum voluptates, assumenda quisquam.

    - - - -
    -
    - - - - - - - -
    Connect With Us:
    - - - -
    - -
    Contact Info:
    -

    Phone: 408-341-0600

    -

    Email: foundation@zurb.com

    -
    -
    -
    - -
    - - Terms - Privacy - Unsubscribe - -
    - -
    diff --git a/vendor/assets/foundation-emails/templates/marketing.html b/vendor/assets/foundation-emails/templates/marketing.html deleted file mode 100644 index 9358a57..0000000 --- a/vendor/assets/foundation-emails/templates/marketing.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - -
    - -
    -
    - -

    Do Something Radical With This App.

    - -
    -
    - - - - - -

    It's Never Been Easier to Do Things.

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consequatur pariatur unde magni repudiandae totam, accusamus facere eligendi. Ad nobis eius porro saepe et ab, aliquid, sed mollitia cumque suscipit aperiam.

    -
    -
    - - -
    - -
    -
    Feature One
    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Rerum, quod quam unde earum.

    -
    - -
    - -
    -
    Feature Two
    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Rerum, quod quam unde earum.

    -
    - -
    - -
    -
    Feature Three
    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Rerum, quod quam unde earum.

    -
    -
    - - - - - -

    What Are You Waiting For? Get Started Today.

    - - - - -
    -
    - - - - - -
    diff --git a/vendor/assets/foundation-emails/templates/newsletter-2.html b/vendor/assets/foundation-emails/templates/newsletter-2.html deleted file mode 100644 index 8965c83..0000000 --- a/vendor/assets/foundation-emails/templates/newsletter-2.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - -
    - -
    -
    -
    - - -

    This is a title

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quam at, nihil quas harum mollitia dolores odio. Inventore delectus nihil soluta quos, magni doloribus, voluptas aspernatur explicabo atque perspiciatis possimus voluptates.

    -

    Learn more

    -
    - - - -
    - - -

    Sub Section Title

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quod eum eius numquam sint dolore voluptatibus beatae ab ad, dignissimos fugiat? Nisi odio commodi debitis eveniet tenetur provident aliquid tempora placeat.

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quod eum eius numquam sint dolore voluptatibus beatae ab ad, dignissimos fugiat? Nisi odio commodi debitis eveniet tenetur provident aliquid tempora placeat.

    -
    - -

    Sub Section Title

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quod eum eius numquam sint dolore voluptatibus beatae ab ad, dignissimos fugiat? Nisi odio commodi debitis eveniet tenetur provident aliquid tempora placeat.

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quod eum eius numquam sint dolore voluptatibus beatae ab ad, dignissimos fugiat? Nisi odio commodi debitis eveniet tenetur provident aliquid tempora placeat.

    -
    -
    - - -

    You received this email because you're signed up to receive updates from us. Click here to unsubscribe.

    -
    -
    -
    diff --git a/vendor/assets/foundation-emails/templates/newsletter.html b/vendor/assets/foundation-emails/templates/newsletter.html deleted file mode 100644 index bbcc934..0000000 --- a/vendor/assets/foundation-emails/templates/newsletter.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - -

    The Insider

    -
    - -
    - - - -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ipsa itaque illo doloribus soluta expedita dolores commodi fuga odit.

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Architecto reiciendis eos magni deleniti accusamus tempore, consectetur! Maxime amet, exercitationem nihil fugit eius esse voluptatum ab incidunt minima, saepe reiciendis ipsum.

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Architecto reiciendis eos magni deleniti accusamus tempore, consectetur! Maxime amet, exercitationem nihil fugit eius esse voluptatum ab incidunt minima, saepe reiciendis ipsum.

    - - - -

    More Reading:

    - -
    - -

    Get Involved:

    - -
    -
    - -

    You received this email because you're signed up to get updates from us. Click here to unsubscribe.

    -
    -
    -
    diff --git a/vendor/assets/foundation-emails/templates/order.html b/vendor/assets/foundation-emails/templates/order.html deleted file mode 100644 index def3831..0000000 --- a/vendor/assets/foundation-emails/templates/order.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - -

    Thanks for your order.

    -

    Thanks for shopping with us! Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ad earum ducimus, non, eveniet neque dolores voluptas architecto sed, voluptatibus aut dolorem odio. Cupiditate a recusandae, illum cum voluptatum modi nostrum.

    - - - - - - -

    - Payment Method
    - Dubloons -

    -

    - Email Address
    - thecapn@pirates.org -

    -

    - Order ID
    - 239235983749636 -

    -
    - -

    - Shipping Method
    - Boat (1–2 weeks)
    - Shipping Address
    - Captain Price
    - 123 Maple Rd
    - Campbell, CA 95112 -

    -
    -
    -
    - -

    Order Details

    - - - - - - - - - - -
    Item#Price
    Ship's Cannon2$100
    Ship's Cannon2$100
    Ship's Cannon2$100
    Subtotal:$600
    - -
    - -

    What's Next?

    - -

    Our carrier raven will prepare your order for delivery. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Modi necessitatibus itaque debitis laudantium doloribus quasi nostrum distinctio suscipit, magni soluta eius animi voluptatem qui velit eligendi quam praesentium provident culpa?

    -
    -
    - - - - - -

    - Call us at 800.555.1923
    - Email us at support@discount.boat -

    -
    - -

    - 123 Maple Rd
    - Campbell, CA 95112 -

    -
    -
    -
    diff --git a/vendor/assets/foundation-emails/templates/password.html b/vendor/assets/foundation-emails/templates/password.html deleted file mode 100644 index efbbd5e..0000000 --- a/vendor/assets/foundation-emails/templates/password.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - -

    Pirate Retirement Services

    -
    -
    - - - - - -
    - -
    - - - -

    Forgot Your Password?

    - - - -

    It happens. Click the link below to reset your password.

    - - -
    - -

    You're getting this email because you've signed up for email updates. If you want to opt-out of future emails, unsubscribe here.

    -
    -
    - - -
    diff --git a/vendor/assets/foundation-emails/templates/sidebar-hero.html b/vendor/assets/foundation-emails/templates/sidebar-hero.html deleted file mode 100644 index 71cc088..0000000 --- a/vendor/assets/foundation-emails/templates/sidebar-hero.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - -

    SIDEBAR HERO

    -
    -
    -
    -
    - - - - - - - -

    Hi, Elijah Baily

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nisi impedit sapiente delectus molestias quia.

    -
    - -
    - -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Veniam assumenda, praesentium qui vitae voluptate dolores. Click it!

    -
    -
    -
    - - -

    Hello, Han Fastolfe

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Laboriosam nobis velit, aliquid pariatur at fugit. Omnis at quae, libero iusto quisquam animi blanditiis neque, alias minima corporis, ab in explicabo?

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Maxime dignissimos voluptas minus, cupiditate voluptatem, voluptatum iste molestiae consectetur temporibus quae dolore nam possimus reprehenderit blanditiis laborum iusto sit. Perspiciatis, dolor.

    - - Lorem ipsum dolor sit amet, consectetur adipisicing elit. Culpa quas optio totam quidem, placeat sunt, sit iusto fugit. Harum omnis deleniti enim nihil iure, quis laudantium veniam velit animi debitis. Click It! - -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolores minus eius amet alias odit accusantium, fugit perspiciatis nulla suscipit nisi. Laborum aliquid, voluptatum consectetur fugiat maxime architecto enim molestias aperiam!

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ex eveniet veritatis, magnam ipsam et vero necessitatibus. Deserunt facilis impedit, adipisci illo laboriosam assumenda fugiat dolorum nam odio aliquid, sit est.

    - -
    - - -
    Header
    -

    Sub-header

    - - Just a Plain Link » - Just a Plain Link » - Just a Plain Link » - Just a Plain Link » - Just a Plain Link » - Just a Plain Link » - Just a Plain Link » - -
    - -
    CONNECT WITH US:
    - - - -

    CONTACT INFO:

    -

    Phone: 408-341-0600

    -

    Email: foundation@zurb.com

    -
    -
    -
    - -
    - - Terms - Privacy - Unsubscribe - -
    - -
    diff --git a/vendor/assets/foundation-emails/templates/sidebar.html b/vendor/assets/foundation-emails/templates/sidebar.html deleted file mode 100644 index 022d01e..0000000 --- a/vendor/assets/foundation-emails/templates/sidebar.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - - - - -

    SIDEBAR

    -
    -
    -
    -
    - - - - - - - -

    Hello, Han Fastolfe

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Laboriosam nobis velit, aliquid pariatur at fugit. Omnis at quae, libero iusto quisquam animi blanditiis neque, alias minima corporis, ab in explicabo?

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Maxime dignissimos voluptas minus, cupiditate voluptatem, voluptatum iste molestiae consectetur temporibus quae dolore nam possimus reprehenderit blanditiis laborum iusto sit. Perspiciatis, dolor.

    - - Lorem ipsum dolor sit amet, consectetur adipisicing elit. Culpa quas optio totam quidem, placeat sunt, sit iusto fugit. Harum omnis deleniti enim nihil iure, quis laudantium veniam velit animi debitis. Click It! - -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolores minus eius amet alias odit accusantium, fugit perspiciatis nulla suscipit nisi. Laborum aliquid, voluptatum consectetur fugiat maxime architecto enim molestias aperiam!

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ex eveniet veritatis, magnam ipsam et vero necessitatibus. Deserunt facilis impedit, adipisci illo laboriosam assumenda fugiat dolorum nam odio aliquid, sit est.

    - -
    - - -
    Header
    -

    Sub-header

    - - Just a Plain Link » - Just a Plain Link » - Just a Plain Link » - Just a Plain Link » - Just a Plain Link » - Just a Plain Link » - Just a Plain Link » - -
    - -
    CONNECT WITH US:
    - - - -

    CONTACT INFO:

    -

    Phone: 408-341-0600

    -

    Email: foundation@zurb.com

    -
    -
    -
    - - -
    - - Terms - Privacy - Unsubscribe - -
    -
    -
    -
    diff --git a/vendor/assets/foundation-emails/templates/welcome.html b/vendor/assets/foundation-emails/templates/welcome.html deleted file mode 100644 index 145a978..0000000 --- a/vendor/assets/foundation-emails/templates/welcome.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - -

    Welcome to Kraken Academy

    - -
    - - About - Course List - Campus Map - Contact - -
    - -
    -
    -
    - - - - - - - -
    - -
    - - - -

    An exciting future of terrorizing sailors awaits you at Kraken Academy.

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque culpa vel architecto, perspiciatis eius cum autem quidem, sunt consequuntur, impedit dolor vitae illum nobis sint nihil aliquid? Assumenda, amet, officia.

    - -
    - - krakenacademy.com - Facebook - Twitter - (408)-555-0123 - -
    - -
    -
    - - -
    From 4318750f82cce474d5eee5c9623a4ab53a38cbfe Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Mon, 15 Aug 2016 17:55:54 -0500 Subject: [PATCH 127/205] $global-width working --- app/assets/stylesheets/mailers/custom-mailer-styles.scss | 2 +- app/assets/stylesheets/mailers/foundation_global_overrides.scss | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/mailers/custom-mailer-styles.scss b/app/assets/stylesheets/mailers/custom-mailer-styles.scss index b64991b..f928ac5 100644 --- a/app/assets/stylesheets/mailers/custom-mailer-styles.scss +++ b/app/assets/stylesheets/mailers/custom-mailer-styles.scss @@ -3,7 +3,7 @@ } .email-container { - max-width:600px; + // max-width:600px; background-color: green; .email-title { font-family: 'HalisR', Helvetica Neue, Helvetica, Ariel, sans-serif !important; diff --git a/app/assets/stylesheets/mailers/foundation_global_overrides.scss b/app/assets/stylesheets/mailers/foundation_global_overrides.scss index e5dc53b..eee6c74 100644 --- a/app/assets/stylesheets/mailers/foundation_global_overrides.scss +++ b/app/assets/stylesheets/mailers/foundation_global_overrides.scss @@ -1,3 +1,4 @@ // manny, put stuff here to override foundation settings $success-color: salmon; +$global-width: 900px; From b5014890aba2f4ccd1806a3ae4350a406c77b2bd Mon Sep 17 00:00:00 2001 From: "Manny.Muriel" Date: Tue, 16 Aug 2016 14:29:50 -0700 Subject: [PATCH 128/205] Updated Design for Reminder Email --- .../mailers/custom-mailer-styles.scss | 24 ++++++++++++------- .../mailers/foundation_global_overrides.scss | 6 +++-- app/views/candidate_mailer/reminder.html.inky | 6 ++--- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/app/assets/stylesheets/mailers/custom-mailer-styles.scss b/app/assets/stylesheets/mailers/custom-mailer-styles.scss index f928ac5..fb9a721 100644 --- a/app/assets/stylesheets/mailers/custom-mailer-styles.scss +++ b/app/assets/stylesheets/mailers/custom-mailer-styles.scss @@ -1,17 +1,23 @@ -.pd-logo { - font-size: 28px; -} + .email-container { - // max-width:600px; - background-color: green; - .email-title { - font-family: 'HalisR', Helvetica Neue, Helvetica, Ariel, sans-serif !important; + .email-heading th { + font-family: 'Lato', Helvetica Neue, Helvetica, Ariel, sans-serif; .prft-slash { font-size: 100px; - font-weight: 100; - // color: #EF0734; + font-weight: 200; color: $success-color; + vertical-align: middle; + } + .email-title { + text-transform: uppercase; + font-weight: 700; + font-size:20px; + vertical-align: sub; } } + .email-body { + font-family: 'Lato', Helvetica Neue, Helvetica, Ariel, sans-serif; + font-weight:300; + } } diff --git a/app/assets/stylesheets/mailers/foundation_global_overrides.scss b/app/assets/stylesheets/mailers/foundation_global_overrides.scss index eee6c74..5bc7bc8 100644 --- a/app/assets/stylesheets/mailers/foundation_global_overrides.scss +++ b/app/assets/stylesheets/mailers/foundation_global_overrides.scss @@ -1,4 +1,6 @@ // manny, put stuff here to override foundation settings -$success-color: salmon; -$global-width: 900px; +$success-color: #EF0734; +$global-width: 600px; +$body-font-family: inherit; +$body-background: #ffffff; \ No newline at end of file diff --git a/app/views/candidate_mailer/reminder.html.inky b/app/views/candidate_mailer/reminder.html.inky index 8cee384..8f8b4de 100644 --- a/app/views/candidate_mailer/reminder.html.inky +++ b/app/views/candidate_mailer/reminder.html.inky @@ -1,13 +1,13 @@ \ No newline at end of file From 23bf29d9485bdc7c2d73bba88da6480dde802f3d Mon Sep 17 00:00:00 2001 From: "Manny.Muriel" Date: Thu, 18 Aug 2016 13:37:25 -0700 Subject: [PATCH 130/205] Applied email template to all emails --- .../mailers/custom-mailer-styles.scss | 5 +- app/views/candidate_mailer/submitted.html.erb | 26 --------- .../candidate_mailer/submitted.html.inky | 47 ++++++++++++++++ app/views/candidate_mailer/welcome.html.erb | 45 --------------- app/views/candidate_mailer/welcome.html.inky | 54 ++++++++++++++++++ .../candidate_created.html.erb | 32 ----------- .../candidate_created.html.inky | 55 +++++++++++++++++++ .../candidate_submitted.html.erb | 26 --------- .../candidate_submitted.html.inky | 47 ++++++++++++++++ .../candidate_submission.html.erb | 18 ------ .../candidate_submission.html.inky | 47 ++++++++++++++++ 11 files changed, 254 insertions(+), 148 deletions(-) delete mode 100644 app/views/candidate_mailer/submitted.html.erb create mode 100644 app/views/candidate_mailer/submitted.html.inky delete mode 100644 app/views/candidate_mailer/welcome.html.erb create mode 100644 app/views/candidate_mailer/welcome.html.inky delete mode 100644 app/views/recruiter_mailer/candidate_created.html.erb create mode 100644 app/views/recruiter_mailer/candidate_created.html.inky delete mode 100644 app/views/recruiter_mailer/candidate_submitted.html.erb create mode 100644 app/views/recruiter_mailer/candidate_submitted.html.inky delete mode 100644 app/views/reviewer_mailer/candidate_submission.html.erb create mode 100644 app/views/reviewer_mailer/candidate_submission.html.inky diff --git a/app/assets/stylesheets/mailers/custom-mailer-styles.scss b/app/assets/stylesheets/mailers/custom-mailer-styles.scss index b59f5e9..4f5f2f4 100644 --- a/app/assets/stylesheets/mailers/custom-mailer-styles.scss +++ b/app/assets/stylesheets/mailers/custom-mailer-styles.scss @@ -21,10 +21,13 @@ a { } .email-body * { font-family: 'Lato', Helvetica Neue, Helvetica, Ariel, sans-serif; - font-weight:300; font-size: 16px; line-height: 1.5em; padding-bottom: 20px; + font-weight:300; + strong { + font-weight:500; + } } .email-copyright { font-family: 'Lato', Helvetica Neue, Helvetica, Ariel, sans-serif; diff --git a/app/views/candidate_mailer/submitted.html.erb b/app/views/candidate_mailer/submitted.html.erb deleted file mode 100644 index 11e4679..0000000 --- a/app/views/candidate_mailer/submitted.html.erb +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - -
    -
    PERFICIENT/digital Skills Assessment Test
    -


    -
    -

    Dear <%= @candidate.name %>,

    -

    Thank you for taking the Skills Assessment Test. Your recruiter will be in touch.

    -
    -


    -


    -
     
    -
    diff --git a/app/views/candidate_mailer/submitted.html.inky b/app/views/candidate_mailer/submitted.html.inky new file mode 100644 index 0000000..ce31cf0 --- /dev/null +++ b/app/views/candidate_mailer/submitted.html.inky @@ -0,0 +1,47 @@ + \ No newline at end of file diff --git a/app/views/candidate_mailer/welcome.html.erb b/app/views/candidate_mailer/welcome.html.erb deleted file mode 100644 index 63218f4..0000000 --- a/app/views/candidate_mailer/welcome.html.erb +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - -
    -
    PERFICIENT/digital
    -


    -
    -

    Hello there! You have been invited to take our Skills Assessment Test.

    -

    -
    -

    - Please visit <%= link_to nil, login_url(@candidate.test_hash) %> to begin your test. -

    -
    -

    -

    - Or, visit <%= link_to nil, root_url %> and enter your Test ID to begin your test. - Your Test ID is: <%= @candidate.test_hash %>.

    - Once we have evaluated your answers, your recruiter will be in touch. Good luck! -

    -
    -


    -


    -
     
    -
    diff --git a/app/views/candidate_mailer/welcome.html.inky b/app/views/candidate_mailer/welcome.html.inky new file mode 100644 index 0000000..898b63b --- /dev/null +++ b/app/views/candidate_mailer/welcome.html.inky @@ -0,0 +1,54 @@ + \ No newline at end of file diff --git a/app/views/recruiter_mailer/candidate_created.html.erb b/app/views/recruiter_mailer/candidate_created.html.erb deleted file mode 100644 index 8132ca9..0000000 --- a/app/views/recruiter_mailer/candidate_created.html.erb +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - -
    -
    PERFICIENT/digital Skills Assessment Test
    -


    -
    -

    The following candidate has been invited to take the Skills Assessment Test:

    -

    - Candidate name: <%= @candidate.name %>
    - Candidate email: <%= @candidate.email %>
    - Candidate ID: <%= @candidate.test_hash %>
    - Years of experience: <%= @candidate.experience %> Years
    -

    - -

    You will be notified when the candidate has finished taking the test.

    -
    -


    -


    -
     
    -
    diff --git a/app/views/recruiter_mailer/candidate_created.html.inky b/app/views/recruiter_mailer/candidate_created.html.inky new file mode 100644 index 0000000..84c94c3 --- /dev/null +++ b/app/views/recruiter_mailer/candidate_created.html.inky @@ -0,0 +1,55 @@ + \ No newline at end of file diff --git a/app/views/recruiter_mailer/candidate_submitted.html.erb b/app/views/recruiter_mailer/candidate_submitted.html.erb deleted file mode 100644 index 2745ce3..0000000 --- a/app/views/recruiter_mailer/candidate_submitted.html.erb +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - -
    -
    PERFICIENT/digital Skills Assessment Test
    -


    -
    -

    <%= @candidate.name %> has completed the Skills Assessment Test.

    -

    Martin Ridgway will let you know if we would like to interview this candidate.

    -
    -


    -


    -
     
    -
    diff --git a/app/views/recruiter_mailer/candidate_submitted.html.inky b/app/views/recruiter_mailer/candidate_submitted.html.inky new file mode 100644 index 0000000..5bda573 --- /dev/null +++ b/app/views/recruiter_mailer/candidate_submitted.html.inky @@ -0,0 +1,47 @@ + \ No newline at end of file diff --git a/app/views/reviewer_mailer/candidate_submission.html.erb b/app/views/reviewer_mailer/candidate_submission.html.erb deleted file mode 100644 index f18337c..0000000 --- a/app/views/reviewer_mailer/candidate_submission.html.erb +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - -
    -
    PERFICIENT/digital Skills Assessment Test Results
    -


    -
    -

    Candidate <%= @candidate.test_hash %> has completed the Skills Assessment Test.

    -

    You can view the results here: <%= link_to nil, review_test_url(@candidate.test_hash) %>.

    -
    diff --git a/app/views/reviewer_mailer/candidate_submission.html.inky b/app/views/reviewer_mailer/candidate_submission.html.inky new file mode 100644 index 0000000..d556685 --- /dev/null +++ b/app/views/reviewer_mailer/candidate_submission.html.inky @@ -0,0 +1,47 @@ + \ No newline at end of file From 4743cd48f9ab77732b1c45d5aadd5b4d1d81f2e2 Mon Sep 17 00:00:00 2001 From: Derek Montgomery Date: Thu, 18 Aug 2016 16:35:37 -0500 Subject: [PATCH 131/205] Refactored reminder layout stuff into layout view --- app/views/candidate_mailer/reminder.html.inky | 74 ++++--------------- app/views/layouts/mailer.html.erb | 43 ++++++++++- 2 files changed, 56 insertions(+), 61 deletions(-) diff --git a/app/views/candidate_mailer/reminder.html.inky b/app/views/candidate_mailer/reminder.html.inky index 499b6d8..9919514 100644 --- a/app/views/candidate_mailer/reminder.html.inky +++ b/app/views/candidate_mailer/reminder.html.inky @@ -1,58 +1,16 @@ - - \ No newline at end of file + + + diff --git a/app/views/layouts/mailer.html.erb b/app/views/layouts/mailer.html.erb index dfe995b..d35af10 100644 --- a/app/views/layouts/mailer.html.erb +++ b/app/views/layouts/mailer.html.erb @@ -3,16 +3,53 @@ - <%= stylesheet_link_tag "mailers/foundation_vendor_manifest" %> - +
    From 5b85a3c41a76cd463b72aad1e21120918549c3c5 Mon Sep 17 00:00:00 2001 From: Derek Montgomery Date: Thu, 18 Aug 2016 16:36:20 -0500 Subject: [PATCH 132/205] mailer layout ERB -> inky --- app/views/layouts/{mailer.html.erb => mailer.html.inky} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename app/views/layouts/{mailer.html.erb => mailer.html.inky} (100%) diff --git a/app/views/layouts/mailer.html.erb b/app/views/layouts/mailer.html.inky similarity index 100% rename from app/views/layouts/mailer.html.erb rename to app/views/layouts/mailer.html.inky From a67c859b6f187ceee3aa3cbabd71c2eb7cb08d16 Mon Sep 17 00:00:00 2001 From: "Manny.Muriel" Date: Thu, 18 Aug 2016 15:10:41 -0700 Subject: [PATCH 133/205] Email layout templatized. --- .../candidate_mailer/submitted.html.inky | 53 ++------------- app/views/candidate_mailer/welcome.html.inky | 67 ++++--------------- .../candidate_created.html.inky | 65 ++++-------------- .../candidate_submitted.html.inky | 53 ++------------- .../candidate_submission.html.inky | 53 ++------------- 5 files changed, 43 insertions(+), 248 deletions(-) diff --git a/app/views/candidate_mailer/submitted.html.inky b/app/views/candidate_mailer/submitted.html.inky index ce31cf0..10d6e6d 100644 --- a/app/views/candidate_mailer/submitted.html.inky +++ b/app/views/candidate_mailer/submitted.html.inky @@ -1,47 +1,6 @@ -
    - <%= yield %> +
    - - - - -
    - - - - - - - - - - - -
    - <%= image_tag("yellowslant-left.jpg", alt:"Perficient Digital") %> - -   - - <%= image_tag("yellowslant-right.jpg", alt:"Perficient Digital") %> -
    -
    -
    - \ No newline at end of file + + + \ No newline at end of file diff --git a/app/views/candidate_mailer/welcome.html.inky b/app/views/candidate_mailer/welcome.html.inky index 898b63b..e3fe143 100644 --- a/app/views/candidate_mailer/welcome.html.inky +++ b/app/views/candidate_mailer/welcome.html.inky @@ -1,54 +1,13 @@ - \ No newline at end of file + + + \ No newline at end of file diff --git a/app/views/recruiter_mailer/candidate_created.html.inky b/app/views/recruiter_mailer/candidate_created.html.inky index 84c94c3..0a9cc9e 100644 --- a/app/views/recruiter_mailer/candidate_created.html.inky +++ b/app/views/recruiter_mailer/candidate_created.html.inky @@ -1,55 +1,14 @@ - \ No newline at end of file +

    You will be notified when the candidate has finished taking the test.

    + + \ No newline at end of file diff --git a/app/views/recruiter_mailer/candidate_submitted.html.inky b/app/views/recruiter_mailer/candidate_submitted.html.inky index 5bda573..c4c8b4b 100644 --- a/app/views/recruiter_mailer/candidate_submitted.html.inky +++ b/app/views/recruiter_mailer/candidate_submitted.html.inky @@ -1,47 +1,6 @@ - \ No newline at end of file + + + \ No newline at end of file diff --git a/app/views/reviewer_mailer/candidate_submission.html.inky b/app/views/reviewer_mailer/candidate_submission.html.inky index d556685..4f61e26 100644 --- a/app/views/reviewer_mailer/candidate_submission.html.inky +++ b/app/views/reviewer_mailer/candidate_submission.html.inky @@ -1,47 +1,6 @@ - \ No newline at end of file + + + \ No newline at end of file From 5cd89ffedd618cefd9fefc99d530bde01fccb9e6 Mon Sep 17 00:00:00 2001 From: "Manny.Muriel" Date: Thu, 18 Aug 2016 16:02:34 -0700 Subject: [PATCH 134/205] Added word-break to mobile. --- app/assets/stylesheets/mailers/custom-mailer-styles.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/stylesheets/mailers/custom-mailer-styles.scss b/app/assets/stylesheets/mailers/custom-mailer-styles.scss index 4f5f2f4..35af3f1 100644 --- a/app/assets/stylesheets/mailers/custom-mailer-styles.scss +++ b/app/assets/stylesheets/mailers/custom-mailer-styles.scss @@ -25,6 +25,7 @@ a { line-height: 1.5em; padding-bottom: 20px; font-weight:300; + word-break: break-all; strong { font-weight:500; } From 4a3b29eb2abb5673339e3dd966a9119513df2dbf Mon Sep 17 00:00:00 2001 From: "Manny.Muriel" Date: Thu, 18 Aug 2016 16:03:22 -0700 Subject: [PATCH 135/205] word break fix --- app/assets/stylesheets/mailers/custom-mailer-styles.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/mailers/custom-mailer-styles.scss b/app/assets/stylesheets/mailers/custom-mailer-styles.scss index 35af3f1..b341ff3 100644 --- a/app/assets/stylesheets/mailers/custom-mailer-styles.scss +++ b/app/assets/stylesheets/mailers/custom-mailer-styles.scss @@ -25,7 +25,7 @@ a { line-height: 1.5em; padding-bottom: 20px; font-weight:300; - word-break: break-all; + word-break: break-word; strong { font-weight:500; } From c6f5577670b9833aef0a848c0ce1b5e23a466257 Mon Sep 17 00:00:00 2001 From: "Manny.Muriel" Date: Fri, 19 Aug 2016 15:50:17 -0700 Subject: [PATCH 136/205] QA Fixes. Litmus Testing --- app/assets/images/yellowborder.jpg | Bin 0 -> 1501 bytes .../mailers/custom-mailer-styles.scss | 6 +++++- app/views/candidate_mailer/welcome.html.inky | 11 ++++++++--- app/views/layouts/mailer.html.inky | 2 +- 4 files changed, 14 insertions(+), 5 deletions(-) create mode 100644 app/assets/images/yellowborder.jpg diff --git a/app/assets/images/yellowborder.jpg b/app/assets/images/yellowborder.jpg new file mode 100644 index 0000000000000000000000000000000000000000..84e2269af76592db9aba159b8e21db77687c6395 GIT binary patch literal 1501 zcmb_cO>fgc5MA3XvWVDpUfFuDxxn)Lvsd#O;~? z!;J$RK!_g!^wc|opJ2wW6Sp))m0;wR-j3(Zn_15~{hA)5?Zct1I$ZlPyPjx?7kD_f*u>lSBQ0rhd2$VK<`y_M z4~d5@ZX;7=Uzl60PD0Gq`9{^26q#L9d8w|-&Dts}i&8@nYl5U!B}Id$CbETbpcXp2 zTHn|#v|!ibil)ZnF+Wy#67B(4RRvKNWVs3v)#$*Ft)%KlE0YWcj_lA4Vwd=AmeJZF zqqxOEr6(KN81Mh7Wz0MqtM0>zLJpxO%JgZ zlW?1m{mChA4MK1_WG z$|$R^oIupm2;k(=RCL0dD8FbIzxdz zQ-KqEo22OFS*d^B-35gOsGpjr`#Gdb$dr(#ue6H*ri2tV^->JgzE@-@Av1wx6H7

    Email: foundation@zurb.com

    - -

    {{ title }}

    - -

    {{ description }}

    - -
    - -{{!-- Start container for docs and table of contents --}} -
    - -{{!-- Start container for table of contents --}} - -{{!-- End container for table of contents --}} - -{{!-- Start container for docs --}} -
    - -{{ docs }} - -{{#if sass}} -
    - -
    - {{#heading 2}}Sass Reference{{/heading}} - - {{#if sass.variable}} -
    - {{#heading 3 'sass-variables'}}Variables{{/heading}} - -

    The default styles of this component can be customized using these Sass variables in your project's settings file.

    - - - - - - {{#each sass.variable}} - - - - - - - {{/each}} -
    NameTypeDefault ValueDescription
    ${{this.context.name}}{{sassTypes this.type}}{{sassValue this.context.value}}{{md this.description}}
    -
    - {{/if}} - - {{#if sass.mixin}} - {{#if sass.variable}}
    {{/if}} - -
    - {{#heading 3 'sass-mixins'}}Mixins{{/heading}} - -

    We use these mixins to build the final CSS output of this component. You can use the mixins yourself to build your own class structure out of our components.

    - - {{#each sass.mixin}} -
    - {{#heading 4}}{{this.context.name}}{{/heading}} - - {{#if this.since}} -

    Added in {{this.since.0.version}}

    - {{/if}} - - {{#if this.deprecated}} -

    Deprecated in {{this.deprecated}}

    - {{/if}} - -
    -
    {{writeMixin this}}
    -
    - - {{md this.description}} - - {{externalLink this.link}} - - {{#if this.parameter}} - - - - - {{#each this.parameter}} - - - - - - - {{/each}} -
    ParameterTypeDefault ValueDescription
    ${{this.name}}{{sassTypes this.type}}{{sassValue this.default}}{{md this.description}}
    - {{/if}} -
    - - {{#unless @last}}
    {{/unless}} - - {{#if sass.function}} -
    - {{/if}} - - {{/each}} -
    - {{/if}} - - {{#if sass.function}} -
    - -
    - {{#heading 3 'sass-functions'}}Functions{{/heading}} - - {{#each sass.function}} -
    - {{#heading 4}}{{this.context.name}}{{/heading}} - - {{#if this.since}} -

    Added in {{this.since.0.version}}

    - {{/if}} - - {{#if this.deprecated}} -

    Deprecated in {{this.deprecated.version}}

    - {{/if}} - -
    -
    {{writeFunction this}}
    -
    - - {{md this.description}} - - {{externalLink this.link}} - - {{#if this.parameter}} - - - - - {{#each this.parameter}} - - - - - - - {{/each}} -
    ParameterTypeDefault ValueDescription
    ${{this.name}}{{sassTypes this.type}}{{sassValue this.default}}{{md this.description}}
    - {{/if}} -
    - - {{#unless @last}}
    {{/unless}} - {{/each}} -
    - {{/if}} - -
    -{{/if}} - -{{#if js}} -
    - -
    - {{#heading 2}}JavaScript Reference{{/heading}} - - {{#each js.class}} -
    - {{#heading 3 'js-class'}}Foundation.{{this.name}}{{/heading}} - - {{md this.description}} - -
    var elem = new Foundation.{{this.name}}(element, options);
    - - {{#if this.fires}} -

    Fires these events: - {{#each this.fires}} - {{this}} - {{/each}} -

    - {{/if}} - - {{#if this.params}} - - - - - {{#each this.params}} - - - - - - {{/each}} -
    NameTypeDescription
    {{this.name}}{{this.type.names.[0]}}{{this.description}}
    - {{/if}} -
    - {{/each}} - -
    - - {{#if js.member}} -
    - {{#heading 3 'js-options'}}Plugin Options{{/heading}} - -

    Use these options to customize an instance of {{title}}. Plugin options can be set as individual data attributes, one combined data-options attribute, or as an object passed to the plugin's constructor. Learn more about how JavaScript plugins are initialized.

    - - - - - - {{#each js.member}} - - - - - - {{/each}} -
    NameDescriptionExample
    {{this.name}}{{this.description}}Sample!
    -
    - {{/if}} - -
    - - {{#if js.event}} -
    - {{#heading 3 'js-events'}}Events{{/heading}} - -

    These events will fire from any element with a {{title}} plugin attached.

    - - - - - - {{#each js.event}} - - - - - {{/each}} -
    NameDescription
    {{this.name}}.zf.{{../title}}{{this.description}}
    -
    - {{/if}} - -
    - - {{#if js.function}} -
    - {{#heading 3 'js-functions'}}Functions{{/heading}} - - {{#each js.function}} -
    - {{#heading 4 'js-class'}}{{../../js.class.0.name}}.{{this.name}}{{/heading}} - - {{md this.description}} - - {{#if this.fires}} -

    Fires these events: - {{#each this.fires}} - {{this}} - {{/each}} -

    - {{/if}} - - {{#if this.params}} - - - - - {{#each this.params}} - - - - - - {{/each}} -
    NameTypeDescription
    {{this.name}}{{this.type.names.[0]}}{{this.description}}
    - {{/if}} - - {{#unless @last}}
    {{/unless}} -
    - {{/each}} -
    - {{/if}} -
    -{{/if}} - -{{#if sass}} -
    - -
    - {{#heading 2 'building-blocks'}}Building Blocks using {{title}}{{/heading}} - -

    Building Blocks is a ZURB-curated resource with useful code snippets that use Foundation components. Here are a few for this component:

    - -
    - -
    -
    -{{/if}} - -
    -{{!-- End container for docs --}} - -
    -{{!-- End container for docs and table of contents --}} - -

    Email: foundation@zurb.com

    + +

    {{ title }}

    + +

    {{ description }}

    + +
    + +{{!-- Start container for docs and table of contents --}} +
    + +{{!-- Start container for table of contents --}} + +{{!-- End container for table of contents --}} + +{{!-- Start container for docs --}} +
    + +{{ docs }} + +{{#if sass}} +
    + +
    + {{#heading 2}}Sass Reference{{/heading}} + + {{#if sass.variable}} +
    + {{#heading 3 'sass-variables'}}Variables{{/heading}} + +

    The default styles of this component can be customized using these Sass variables in your project's settings file.

    + + + + + + {{#each sass.variable}} + + + + + + + {{/each}} +
    NameTypeDefault ValueDescription
    ${{this.context.name}}{{sassTypes this.type}}{{sassValue this.context.value}}{{md this.description}}
    +
    + {{/if}} + + {{#if sass.mixin}} + {{#if sass.variable}}
    {{/if}} + +
    + {{#heading 3 'sass-mixins'}}Mixins{{/heading}} + +

    We use these mixins to build the final CSS output of this component. You can use the mixins yourself to build your own class structure out of our components.

    + + {{#each sass.mixin}} +
    + {{#heading 4}}{{this.context.name}}{{/heading}} + + {{#if this.since}} +

    Added in {{this.since.0.version}}

    + {{/if}} + + {{#if this.deprecated}} +

    Deprecated in {{this.deprecated}}

    + {{/if}} + +
    +
    {{writeMixin this}}
    +
    + + {{md this.description}} + + {{externalLink this.link}} + + {{#if this.parameter}} + + + + + {{#each this.parameter}} + + + + + + + {{/each}} +
    ParameterTypeDefault ValueDescription
    ${{this.name}}{{sassTypes this.type}}{{sassValue this.default}}{{md this.description}}
    + {{/if}} +
    + + {{#unless @last}}
    {{/unless}} + + {{#if sass.function}} +
    + {{/if}} + + {{/each}} +
    + {{/if}} + + {{#if sass.function}} +
    + +
    + {{#heading 3 'sass-functions'}}Functions{{/heading}} + + {{#each sass.function}} +
    + {{#heading 4}}{{this.context.name}}{{/heading}} + + {{#if this.since}} +

    Added in {{this.since.0.version}}

    + {{/if}} + + {{#if this.deprecated}} +

    Deprecated in {{this.deprecated.version}}

    + {{/if}} + +
    +
    {{writeFunction this}}
    +
    + + {{md this.description}} + + {{externalLink this.link}} + + {{#if this.parameter}} + + + + + {{#each this.parameter}} + + + + + + + {{/each}} +
    ParameterTypeDefault ValueDescription
    ${{this.name}}{{sassTypes this.type}}{{sassValue this.default}}{{md this.description}}
    + {{/if}} +
    + + {{#unless @last}}
    {{/unless}} + {{/each}} +
    + {{/if}} + +
    +{{/if}} + +{{#if js}} +
    + +
    + {{#heading 2}}JavaScript Reference{{/heading}} + + {{#each js.class}} +
    + {{#heading 3 'js-class'}}Foundation.{{this.name}}{{/heading}} + + {{md this.description}} + +
    var elem = new Foundation.{{this.name}}(element, options);
    + + {{#if this.fires}} +

    Fires these events: + {{#each this.fires}} + {{this}} + {{/each}} +

    + {{/if}} + + {{#if this.params}} + + + + + {{#each this.params}} + + + + + + {{/each}} +
    NameTypeDescription
    {{this.name}}{{this.type.names.[0]}}{{this.description}}
    + {{/if}} +
    + {{/each}} + +
    + + {{#if js.member}} +
    + {{#heading 3 'js-options'}}Plugin Options{{/heading}} + +

    Use these options to customize an instance of {{title}}. Plugin options can be set as individual data attributes, one combined data-options attribute, or as an object passed to the plugin's constructor. Learn more about how JavaScript plugins are initialized.

    + + + + + + {{#each js.member}} + + + + + + {{/each}} +
    NameDescriptionExample
    {{this.name}}{{this.description}}Sample!
    +
    + {{/if}} + +
    + + {{#if js.event}} +
    + {{#heading 3 'js-events'}}Events{{/heading}} + +

    These events will fire from any element with a {{title}} plugin attached.

    + + + + + + {{#each js.event}} + + + + + {{/each}} +
    NameDescription
    {{this.name}}.zf.{{../title}}{{this.description}}
    +
    + {{/if}} + +
    + + {{#if js.function}} +
    + {{#heading 3 'js-functions'}}Functions{{/heading}} + + {{#each js.function}} +
    + {{#heading 4 'js-class'}}{{../../js.class.0.name}}.{{this.name}}{{/heading}} + + {{md this.description}} + + {{#if this.fires}} +

    Fires these events: + {{#each this.fires}} + {{this}} + {{/each}} +

    + {{/if}} + + {{#if this.params}} + + + + + {{#each this.params}} + + + + + + {{/each}} +
    NameTypeDescription
    {{this.name}}{{this.type.names.[0]}}{{this.description}}
    + {{/if}} + + {{#unless @last}}
    {{/unless}} +
    + {{/each}} +
    + {{/if}} +
    +{{/if}} + +{{#if sass}} +
    + +
    + {{#heading 2 'building-blocks'}}Building Blocks using {{title}}{{/heading}} + +

    Building Blocks is a ZURB-curated resource with useful code snippets that use Foundation components. Here are a few for this component:

    + +
    + +
    +
    +{{/if}} + +
    +{{!-- End container for docs --}} + +
    +{{!-- End container for docs and table of contents --}} + +