From 75cafdc359503065decd8ffb07a36059dee04377 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Tue, 19 May 2020 02:14:44 +0530 Subject: [PATCH 01/99] wip --- frappe/modules/full_text_search.py | 38 ++++++++++++++++++++++++++++++ requirements.txt | 1 + 2 files changed, 39 insertions(+) create mode 100644 frappe/modules/full_text_search.py diff --git a/frappe/modules/full_text_search.py b/frappe/modules/full_text_search.py new file mode 100644 index 0000000000..de0ee375b5 --- /dev/null +++ b/frappe/modules/full_text_search.py @@ -0,0 +1,38 @@ +# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors +# MIT License. See license.txt + +from __future__ import unicode_literals +import frappe +import os +from whoosh.index import create_in, open_dir +from whoosh.fields import TEXT, ID, Schema + + +def build_index(index_name, documents): + schema = Schema(title=TEXT(stored=True), path=ID(stored=True), content=TEXT) + + index_dir = os.path.join(frappe.utils.get_bench_path(), "indexes", index_name) + frappe.create_folder(index_dir) + + ix = create_in(index_dir, schema) + writer = ix.writer() + + for document in documents: + writer.add_document( + title=document.title, path=document.path, content=document.content + ) + + writer.commit() + + +def search(index_name, text): + from whoosh.qparser import QueryParser + + index_dir = os.path.join(frappe.utils.get_bench_path(), "indexes", index_name) + ix = open_dir(index_dir) + + with ix.searcher() as searcher: + query = QueryParser("content", ix.schema).parse(text) + results = searcher.search(query) + + return results diff --git a/requirements.txt b/requirements.txt index 431f216afa..5d46f799be 100644 --- a/requirements.txt +++ b/requirements.txt @@ -66,3 +66,4 @@ watchdog==0.8.0 Werkzeug==0.16.1 xlrd==1.2.0 zxcvbn-python==4.4.24 +Whoosh==2.7.4 From a8720d9554ceade97dbd57d9ae80dc92c357e907 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Tue, 19 May 2020 14:24:20 +0530 Subject: [PATCH 02/99] fix: Extract page toc from markdown --- frappe/public/scss/markdown.scss | 38 ++++++++++++++++++++++++++++++++ frappe/utils/data.py | 1 + frappe/website/router.py | 3 +++ 3 files changed, 42 insertions(+) diff --git a/frappe/public/scss/markdown.scss b/frappe/public/scss/markdown.scss index 595b7f96a3..50f46eae19 100644 --- a/frappe/public/scss/markdown.scss +++ b/frappe/public/scss/markdown.scss @@ -122,3 +122,41 @@ main:not(.my-5) .from-markdown { margin-top: 5rem; } } + +.page-toc { + font-size: $font-size-sm; + + h5 { + font-size: $font-size-sm; + margin-bottom: 0.5rem; + color: $gray-500; + } + + > div { + padding-top: 2rem; + position: sticky; + top: 0; + } + + ul { + padding-left: 0; + list-style-type: none; + } + + li > ul { + padding-left: 0.5rem; + } + + a { + display: block; + padding: 0.25rem 0; + + color: $gray-600; + text-decoration: none; + font-weight: 500; + + &:hover { + color: $gray-700; + } + } +} diff --git a/frappe/utils/data.py b/frappe/utils/data.py index a0703c1465..d2ccb42cb8 100644 --- a/frappe/utils/data.py +++ b/frappe/utils/data.py @@ -1129,6 +1129,7 @@ def md_to_html(markdown_text): 'fenced-code-blocks': None, 'tables': None, 'header-ids': None, + 'toc': None, 'highlightjs-lang': None, 'html-classes': { 'table': 'table table-bordered', diff --git a/frappe/website/router.py b/frappe/website/router.py index 4a9db0868f..1e999c1611 100644 --- a/frappe/website/router.py +++ b/frappe/website/router.py @@ -271,6 +271,9 @@ def setup_source(page_info): if page_info.template.endswith('.md'): source = frappe.utils.md_to_html(source) + if page_info.page_toc: + page_info.page_toc_html = source.toc_html + if not page_info.show_sidebar: source = '
' + source + '
' From 501f9a1cf875124ff1cfd614023a3f13504dbca2 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Tue, 19 May 2020 14:24:37 +0530 Subject: [PATCH 03/99] fix: Remove whitespace from breadcrumbs block --- frappe/templates/includes/breadcrumbs.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/templates/includes/breadcrumbs.html b/frappe/templates/includes/breadcrumbs.html index 3fda731372..4cb3ef5c0c 100644 --- a/frappe/templates/includes/breadcrumbs.html +++ b/frappe/templates/includes/breadcrumbs.html @@ -1,4 +1,4 @@ -{% if not no_breadcrumbs and parents %} +{%- if not no_breadcrumbs and parents -%}
-{% endif %} +{%- endif -%} From 256898e23e53960831fe4afa30e50b9d74e4ac59 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Tue, 19 May 2020 14:25:41 +0530 Subject: [PATCH 04/99] feat: Doc page layout (wip) --- frappe/templates/doc.html | 70 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 frappe/templates/doc.html diff --git a/frappe/templates/doc.html b/frappe/templates/doc.html new file mode 100644 index 0000000000..edd85b975b --- /dev/null +++ b/frappe/templates/doc.html @@ -0,0 +1,70 @@ +{% extends base_template_path %} + +{% macro page_content() %} +{%- block page_content -%}{%- endblock -%} +{% endmacro %} + +{% block content %} + +{% macro main_content() %} +
+ + + + asdfasdf + + {% block page_container %} +
+
+ {{ page_content() }} +
+ {%- if page_toc -%} +
+
+
On this page
+ {{ page_toc_html }} +
+ {% include "templates/includes/web_sidebar.html" %} +
+ {%- endif -%} +
+ {% endblock %} +
+{% endmacro %} + +{% macro sidebar() %} +{%- if show_sidebar -%} + +{%- endif -%} +{% endmacro %} + +{% macro container_attributes() -%} +id="page-{{ name or route | e }}" data-path="{{ pathname | e }}" +{%- if page_or_generator=="Generator" %}source-type="Generator" data-doctype="{{ doctype }}"{%- endif %} +{%- if source_content_type %}source-content-type="{{ source_content_type }}"{%- endif %} +{%- endmacro %} + +
+
+ {%- set columns = (sidebar_columns or 2) if show_sidebar else 0 -%} + {%- if not sidebar_right -%} + {{ sidebar() }} + {%- endif -%} +
+ {{ main_content() }} +
+ {%- if sidebar_right -%} + {{ sidebar() }} + {%- endif -%} +
+
+ +{% endblock %} From 28c70a6aedfbf7b8aa61460ad0d7214111072994 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Tue, 19 May 2020 14:26:16 +0530 Subject: [PATCH 05/99] fix: Set font to Inter temporarily --- frappe/public/scss/base.scss | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/frappe/public/scss/base.scss b/frappe/public/scss/base.scss index 36a1df55ac..9f0797eb4e 100644 --- a/frappe/public/scss/base.scss +++ b/frappe/public/scss/base.scss @@ -1,3 +1,10 @@ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap'); + +html, body { + font-family: Inter; +} + + html { height: 100%; } From 5b1dacb6a177bd5a4db41652a080083984a2912a Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Sun, 24 May 2020 07:33:46 +0530 Subject: [PATCH 06/99] feat: Set base_template for routes by regex The default `base_template` for any web route was `templates/web.html` by default. Now, you can set the `base_template` for routes by a regex pattern via hooks (using the key `base_template_map`). For e.g, you can set `templates/doc.html` for routes that match the pattern `docs.*` --- frappe/hooks.py | 6 ++++++ frappe/website/context.py | 2 +- frappe/website/router.py | 39 +++++++++++++++++++++++---------------- 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/frappe/hooks.py b/frappe/hooks.py index 200280f6de..9c63f05b99 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -56,6 +56,12 @@ website_route_rules = [ {"from_route": "/profile", "to_route": "me"}, ] +base_template = "templates/base.html" + +base_template_map = { + r".*": "templates/web.html" +} + write_file_keys = ["file_url", "file_name"] notification_config = "frappe.core.notifications.get_notification_config" diff --git a/frappe/website/context.py b/frappe/website/context.py index 5663199545..9d0f3d2067 100644 --- a/frappe/website/context.py +++ b/frappe/website/context.py @@ -120,7 +120,7 @@ def build_context(context): # determine templates to be used if not context.base_template_path: app_base = frappe.get_hooks("base_template") - context.base_template_path = app_base[0] if app_base else "templates/base.html" + context.base_template_path = app_base[-1] if app_base else "templates/base.html" if context.title_prefix and context.title and not context.title.startswith(context.title_prefix): context.title = '{0} - {1}'.format(context.title_prefix, context.title) diff --git a/frappe/website/router.py b/frappe/website/router.py index 1e999c1611..c915578300 100644 --- a/frappe/website/router.py +++ b/frappe/website/router.py @@ -277,9 +277,12 @@ def setup_source(page_info): if not page_info.show_sidebar: source = '
' + source + '
' + if not page_info.base_template: + page_info.base_template = get_base_template(page_info.route) + # if only content if page_info.template.endswith('.html') or page_info.template.endswith('.md'): - html = extend_from_base_template(page_info, source) + html = source # load css/js files js, css = '', '' @@ -303,22 +306,23 @@ def setup_source(page_info): # show table of contents setup_index(page_info) -def extend_from_base_template(page_info, source): - '''Extend the content with appropriate base template if required. - - For easy composition, the users will only add the content of the page, - not its template. But if the user has explicitly put Jinja blocks, or tags, - or comment tags like - then the system will not try and put it inside the "web.template" +def get_base_template(path=None): ''' + Returns the `base_template` for given `path`. + The default `base_template` for any web route is `templates/web.html` defined in `hooks.py`. + This can be overridden for certain routes in `custom_app/hooks.py` based on regex pattern. + ''' + if not path: + path = frappe.local.request.path - if (('' not in source) and ('{% block' not in source) - and (' - - - asdfasdf - {% block page_container %} -
-
+
+
+ {{ page_content() }}
- {%- if page_toc -%} -
-
-
On this page
- {{ page_toc_html }} -
- {% include "templates/includes/web_sidebar.html" %} -
- {%- endif -%}
{% endblock %}
{% endmacro %} -{% macro sidebar() %} -{%- if show_sidebar -%} - -{%- endif -%} -{% endmacro %} - {% macro container_attributes() -%} id="page-{{ name or route | e }}" data-path="{{ pathname | e }}" {%- if page_or_generator=="Generator" %}source-type="Generator" data-doctype="{{ doctype }}"{%- endif %} {%- if source_content_type %}source-content-type="{{ source_content_type }}"{%- endif %} {%- endmacro %} -
-
- {%- set columns = (sidebar_columns or 2) if show_sidebar else 0 -%} - {%- if not sidebar_right -%} - {{ sidebar() }} +
+
+ {%- if show_sidebar -%} + {%- endif -%} -
+
{{ main_content() }}
- {%- if sidebar_right -%} - {{ sidebar() }} - {%- endif -%} +
+ {%- if page_toc -%} +
+
On this page
+ {{ page_toc_html }} +
+ {%- endif -%} +
diff --git a/frappe/templates/includes/web_sidebar.html b/frappe/templates/includes/web_sidebar.html index d7816eff34..be762b0628 100644 --- a/frappe/templates/includes/web_sidebar.html +++ b/frappe/templates/includes/web_sidebar.html @@ -1,46 +1,71 @@ +{% macro render_sidebar_item(item) %} +
  • + {%- if item.group_title -%} + +
    {{ item.group_title }}
    + {{ render_sidebar_items(item.group_items) }} + + {%- else -%} + + {% if item.type != 'input' %} + {%- set item_route = item.route[1:] if item.route[0] == '/' else item.route -%} + + {{ _(item.title or item.label) }} + + {% else %} +
    + +
    + {% endif %} + + {%- endif -%} +
  • +{% endmacro %} + +{% macro render_sidebar_items(items) %} +{%- if items | len > 0 -%} +
      + {% for item in items -%} + {{ render_sidebar_item(item) }} + {%- endfor %} +
    +{%- endif -%} +{% endmacro %} + +{% macro my_account() %} +{% if frappe.user != 'Guest' %} + +{% endif %} +{% endmacro %} +
    + {% if sidebar_title %} +
  • + {{ sidebar_title }} +
  • + {% endif %}
    diff --git a/frappe/website/js/website.js b/frappe/website/js/website.js index d400e7633c..ac27b677a3 100644 --- a/frappe/website/js/website.js +++ b/frappe/website/js/website.js @@ -329,6 +329,22 @@ $.extend(frappe, { add_switch_to_desk: function() { $('.switch-to-desk').removeClass('hidden'); }, + add_link_to_headings: function() { + $('.from-markdown').find('h2, h3, h4, h5, h6').each((i, $heading) => { + let id = $heading.id; + let $a = $('') + .prop('href', '#' + id) + .attr('aria-hidden', 'true') + .html(` + + + + + `); + $($heading).append($a); + }); + }, setup_lazy_images: function() { // Use IntersectionObserver to only load images that are visible in the viewport // Fallback for browsers that don't support it @@ -445,6 +461,7 @@ $(document).on("page-change", function() { frappe.trigger_ready(); frappe.bind_filters(); frappe.highlight_code_blocks(); + frappe.add_link_to_headings(); frappe.make_navbar_active(); // scroll to hash if (window.location.hash) { From b17b0d9077a694b627a3de5d5abc1d9fbadcc09f Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Wed, 27 May 2020 18:02:16 +0530 Subject: [PATCH 08/99] feat: Doc search --- frappe/modules/full_text_search.py | 56 ++++++++++++++++++++--- frappe/templates/doc.html | 71 ++++++++++++++++++++++++++++-- frappe/www/website_script.py | 2 +- 3 files changed, 119 insertions(+), 10 deletions(-) diff --git a/frappe/modules/full_text_search.py b/frappe/modules/full_text_search.py index de0ee375b5..367c1481e6 100644 --- a/frappe/modules/full_text_search.py +++ b/frappe/modules/full_text_search.py @@ -6,10 +6,46 @@ import frappe import os from whoosh.index import create_in, open_dir from whoosh.fields import TEXT, ID, Schema +from bs4 import BeautifulSoup +from frappe.website.render import render_page +from frappe.utils import set_request +from frappe.utils.global_search import get_routes_to_index + + +def build_index_for_all_routes(): + routes = get_routes_to_index() + documents = [get_document_to_index(route) for route in routes] + build_index("web_routes", documents) + + +def get_document_to_index(route): + frappe.set_user("Guest") + frappe.local.no_cache = True + + try: + set_request(method="GET", path=route) + content = render_page(route) + soup = BeautifulSoup(content, "html.parser") + page_content = soup.find(class_="page_content") + text_content = page_content.text if page_content else "" + title = soup.title.text.strip() if soup.title else route + + frappe.set_user("Administrator") + + return frappe._dict(title=title, content=text_content, path=route) + except ( + frappe.PermissionError, + frappe.DoesNotExistError, + frappe.ValidationError, + Exception, + ): + pass + def build_index(index_name, documents): - schema = Schema(title=TEXT(stored=True), path=ID(stored=True), content=TEXT) + print("Building index " + index_name) + schema = Schema(title=TEXT(stored=True), path=ID(stored=True), content=TEXT(stored=True)) index_dir = os.path.join(frappe.utils.get_bench_path(), "indexes", index_name) frappe.create_folder(index_dir) @@ -18,11 +54,13 @@ def build_index(index_name, documents): writer = ix.writer() for document in documents: - writer.add_document( - title=document.title, path=document.path, content=document.content - ) + if document: + writer.add_document( + title=document.title, path=document.path, content=document.content + ) writer.commit() + print("Done.") def search(index_name, text): @@ -31,8 +69,16 @@ def search(index_name, text): index_dir = os.path.join(frappe.utils.get_bench_path(), "indexes", index_name) ix = open_dir(index_dir) + results = None + out = [] with ix.searcher() as searcher: query = QueryParser("content", ix.schema).parse(text) results = searcher.search(query) + for r in results: + out.append(frappe._dict(title=r['title'], path=r['path'], highlights=r.highlights('content'))) - return results + return out + +@frappe.whitelist(allow_guest=True) +def web_search(query): + return search("web_routes", query) diff --git a/frappe/templates/doc.html b/frappe/templates/doc.html index e1beecefd2..af36c88d0f 100644 --- a/frappe/templates/doc.html +++ b/frappe/templates/doc.html @@ -5,7 +5,7 @@ {% endmacro %} {%- block head_include %} - + {% endblock -%} {%- block navbar -%}{%- endblock -%} @@ -17,11 +17,20 @@ {% block page_container %}
    - @@ -67,3 +76,57 @@ id="page-{{ name or route | e }}" data-path="{{ pathname | e }}"
    {% endblock %} + +{%- block script -%} + +{%- endblock -%} diff --git a/frappe/www/website_script.py b/frappe/www/website_script.py index 9d6ba1065e..6ce17e62e5 100644 --- a/frappe/www/website_script.py +++ b/frappe/www/website_script.py @@ -6,7 +6,7 @@ import frappe from frappe.utils import strip from frappe.website.doctype.website_theme.website_theme import get_active_theme -base_template_path = "templates/www/website_script.js" +base_template_path = "frappe/www/website_script.js" def get_context(context): context.javascript = frappe.db.get_single_value('Website Script', From 11ec3442a3d8032ac78e4149c8be8285b321a651 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 28 May 2020 19:24:04 +0530 Subject: [PATCH 09/99] feat: remove writer introduction from bog settings --- .../website/doctype/blog_settings/blog_settings.json | 8 +------- .../doctype/blog_settings/test_blog_settings.py | 10 ++++++++++ 2 files changed, 11 insertions(+), 7 deletions(-) create mode 100644 frappe/website/doctype/blog_settings/test_blog_settings.py diff --git a/frappe/website/doctype/blog_settings/blog_settings.json b/frappe/website/doctype/blog_settings/blog_settings.json index f0e51de170..a05c0ea5f3 100644 --- a/frappe/website/doctype/blog_settings/blog_settings.json +++ b/frappe/website/doctype/blog_settings/blog_settings.json @@ -7,7 +7,6 @@ "field_order": [ "blog_title", "blog_introduction", - "writers_introduction", "section_break_4", "social_share_settings" ], @@ -22,11 +21,6 @@ "fieldtype": "Small Text", "label": "Blog Introduction" }, - { - "fieldname": "writers_introduction", - "fieldtype": "Small Text", - "label": "Writers Introduction" - }, { "collapsible": 1, "fieldname": "section_break_4", @@ -43,7 +37,7 @@ "idx": 1, "issingle": 1, "links": [], - "modified": "2020-05-04 09:10:41.815238", + "modified": "2020-05-28 18:49:08.356608", "modified_by": "Administrator", "module": "Website", "name": "Blog Settings", diff --git a/frappe/website/doctype/blog_settings/test_blog_settings.py b/frappe/website/doctype/blog_settings/test_blog_settings.py new file mode 100644 index 0000000000..e4ddb85c4b --- /dev/null +++ b/frappe/website/doctype/blog_settings/test_blog_settings.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2020, Frappe Technologies and Contributors +# See license.txt +from __future__ import unicode_literals + +# import frappe +import unittest + +class TestBlogSettings(unittest.TestCase): + pass From 892149af99ae4b81e6005b2b25dfbcf0dc4a9209 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 28 May 2020 19:24:31 +0530 Subject: [PATCH 10/99] feat: give precedence to template --- frappe/website/render.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/frappe/website/render.py b/frappe/website/render.py index c1bca3f5c5..f137a28eaa 100644 --- a/frappe/website/render.py +++ b/frappe/website/render.py @@ -214,14 +214,13 @@ def build_page(path): context = get_context(path) - if context.source: - html = frappe.render_template(context.source, context) - - elif context.template: + if context.template: if path.endswith('min.js'): html = frappe.get_jloader().get_source(frappe.get_jenv(), context.template)[0] else: html = frappe.get_template(context.template).render(context) + elif context.source: + html = frappe.render_template(context.source, context) if '{index}' in html: html = html.replace('{index}', get_toc(context.route)) From 8b08a7d71d8418891869411cbaf7be525f35730e Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 28 May 2020 19:25:10 +0530 Subject: [PATCH 11/99] refactor: blogger doctype * remove blog post count * Set image field --- frappe/website/doctype/blog_post/blog_post.py | 11 ++++------- frappe/website/doctype/blogger/blogger.json | 16 ++++------------ 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/frappe/website/doctype/blog_post/blog_post.py b/frappe/website/doctype/blog_post/blog_post.py index 4596c60710..5516d17780 100644 --- a/frappe/website/doctype/blog_post/blog_post.py +++ b/frappe/website/doctype/blog_post/blog_post.py @@ -39,11 +39,6 @@ class BlogPost(WebsiteGenerator): if self.published and not self.published_on: self.published_on = today() - # update posts - frappe.db.sql("""UPDATE `tabBlogger` SET `posts`=(SELECT COUNT(*) FROM `tabBlog Post` - WHERE IFNULL(`blogger`,'')=`tabBlogger`.`name`) - WHERE `name`=%s""", (self.blogger,)) - self.set_read_time() def on_update(self): @@ -133,8 +128,9 @@ class BlogPost(WebsiteGenerator): def get_list_context(context=None): list_context = frappe._dict( - template = "templates/includes/blog/blog.html", + template = "/templates/includes/blog/blog.html", get_list = get_blog_list, + no_breadcrumbs = True, hide_filters = True, children = get_children(), # show_search = True, @@ -161,7 +157,8 @@ def get_list_context(context=None): else: list_context.parents = [{"name": _("Home"), "route": "/"}] - list_context.update(frappe.get_doc("Blog Settings", "Blog Settings").as_dict(no_default_fields=True)) + list_context.update(frappe.get_doc("Blog Settings").as_dict(no_default_fields=True)) + return list_context def get_children(): diff --git a/frappe/website/doctype/blogger/blogger.json b/frappe/website/doctype/blogger/blogger.json index b8165a5908..f7494e7ec5 100644 --- a/frappe/website/doctype/blogger/blogger.json +++ b/frappe/website/doctype/blogger/blogger.json @@ -13,8 +13,7 @@ "full_name", "user", "bio", - "avatar", - "posts" + "avatar" ], "fields": [ { @@ -51,20 +50,13 @@ }, { "fieldname": "avatar", - "fieldtype": "Attach", + "fieldtype": "Attach Image", "label": "Avatar" - }, - { - "fieldname": "posts", - "fieldtype": "Int", - "in_list_view": 1, - "label": "Posts", - "no_copy": 1, - "read_only": 1 } ], "icon": "fa fa-user", "idx": 1, + "image_field": "avatar", "links": [ { "link_doctype": "Blog Post", @@ -72,7 +64,7 @@ } ], "max_attachments": 1, - "modified": "2020-04-19 08:21:09.684300", + "modified": "2020-05-28 19:22:40.959895", "modified_by": "Administrator", "module": "Website", "name": "Blogger", From ea728d158f630b8f8d3a1a64f9c3d2dd49b994d9 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 28 May 2020 22:07:22 +0530 Subject: [PATCH 12/99] feat: added image extra small option --- frappe/public/scss/website-image.scss | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/frappe/public/scss/website-image.scss b/frappe/public/scss/website-image.scss index 8c32e821fe..d416c05650 100644 --- a/frappe/public/scss/website-image.scss +++ b/frappe/public/scss/website-image.scss @@ -55,6 +55,12 @@ img:after { width: 100%; } +.website-image-extra-small { + @include website-image; + width: 2.5rem; + height: 2.5rem; +} + .website-image-small { @include website-image; width: 5rem; From 5ea0688e40c27473f69743d7a0f1d210ebf7a1ba Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 28 May 2020 22:07:37 +0530 Subject: [PATCH 13/99] feat: added blog.scss --- frappe/public/scss/blog.scss | 48 +++++++++++++++++++++++++++++++++ frappe/public/scss/website.scss | 1 + 2 files changed, 49 insertions(+) create mode 100644 frappe/public/scss/blog.scss diff --git a/frappe/public/scss/blog.scss b/frappe/public/scss/blog.scss new file mode 100644 index 0000000000..86c5b18ceb --- /dev/null +++ b/frappe/public/scss/blog.scss @@ -0,0 +1,48 @@ +.blog-list-item { + @extend .col-12; + + &:not(.featured) { + @extend .col-md-4; + + .blog-list-body { + min-height: 14rem; + } + } + + .blog-list-cover { + @extend .col-12; + } + + .blog-list-body { + @extend .col-12; + @extend .mt-3; + } + + .post-cover-container { + min-height: 12rem; + overflow: hidden; + border-radius: $border-radius; + + img { + min-height: 12rem; + width: 100%; + } + } + + &.featured { + .blog-list-cover { + @extend .col-12; + @extend .col-md-8; + } + + .blog-list-body { + @extend .col-12; + @extend .col-md-4; + @extend .mt-0; + } + + .post-cover-container { + max-height: 22rem; + } + } +} \ No newline at end of file diff --git a/frappe/public/scss/website.scss b/frappe/public/scss/website.scss index 0149ac0d0a..152551c8d1 100644 --- a/frappe/public/scss/website.scss +++ b/frappe/public/scss/website.scss @@ -5,6 +5,7 @@ @import 'multilevel-dropdown'; @import 'website-image'; @import 'page-builder'; +@import 'blog'; @import 'markdown'; @import 'sidebar'; From 78cb3a9c178964bebe0270234b4690fc9b7fb7c7 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 28 May 2020 22:08:08 +0530 Subject: [PATCH 14/99] feat: updated blog listing layout --- frappe/templates/includes/blog/blog.html | 32 ++++++-- frappe/templates/includes/blog/blog_list.html | 25 +++++++ .../blog_post/templates/blog_post_row.html | 73 ++++++++++--------- 3 files changed, 91 insertions(+), 39 deletions(-) create mode 100644 frappe/templates/includes/blog/blog_list.html diff --git a/frappe/templates/includes/blog/blog.html b/frappe/templates/includes/blog/blog.html index 5afaeb6ab8..a841bff627 100644 --- a/frappe/templates/includes/blog/blog.html +++ b/frappe/templates/includes/blog/blog.html @@ -1,15 +1,35 @@ {% extends "templates/web.html" %} - {% block title %}{{ blog_title or _("Blog") }}{% endblock %} -{% block header %}

    {{ blog_title or _("Blog") }}

    {% endblock %} {% block hero %}{% endblock %} {% block page_content %} - - + +{{ web_blocks([ + { + 'template': "Hero", + 'values': { + 'title': blog_title, + 'subtitle': blog_introduction, + }, + 'add_container': 0, + 'add_top_padding': 0, + 'add_bottom_padding': 0, + 'css_class': "py-5" + } + ]) +}} +
    -
    - {% include "templates/includes/list/list.html" %} +
    + {% if not result -%} +
    + {{ no_result_message or _("Nothing to show") }} +
    + {% else %} + {% for item in result %} + {{ item }} + {% endfor %} + {% endif %}
    {% endblock %} diff --git a/frappe/templates/includes/blog/blog_list.html b/frappe/templates/includes/blog/blog_list.html new file mode 100644 index 0000000000..cfe25f3682 --- /dev/null +++ b/frappe/templates/includes/blog/blog_list.html @@ -0,0 +1,25 @@ +{% if sub_title %} +

    {{ sub_title }}

    +{% endif %} +{% if not result -%} +
    + {{ no_result_message or _("Nothing to show") }} +
    +{% else %} +
    + + {% if result_heading_template %}{% include result_heading_template %}{% endif %} + +
    + {% for item in result %} + {{ item }} + {% endfor %} +
    + +
    +{%- endif %} diff --git a/frappe/website/doctype/blog_post/templates/blog_post_row.html b/frappe/website/doctype/blog_post/templates/blog_post_row.html index dffe0ef81d..d197494ae5 100644 --- a/frappe/website/doctype/blog_post/templates/blog_post_row.html +++ b/frappe/website/doctype/blog_post/templates/blog_post_row.html @@ -1,38 +1,45 @@ {%- set post = doc -%} -
    -
    -
    -
    -
    - -
    - {{ post.full_name }} - · - {{ frappe.format_date(post.published_on) }} - {% if post.comments %} - · - {% if post.comments == 1 %} - {{ _('1 comment') }} - {% else %} - {{ _('{0} comments').format(post.comments) }} - {% endif %} - {% endif %} - {% if post.read_time %} - · - {{ _('{0} min read').format(post.read_time) }} - {% endif %} -
    -
    -
    - {% if post.cover_image %} - {{post.title}} - Cover Image - {% endif %} + +{%- if post.featured -%} + {% set col_class="featured" %} +{%- else -%} + {% set col_class="" %} +{%- endif -%} + +
    +
    + {% if post.cover_image %} +
    + + {{post.title}} - Cover Image + +
    + {% endif %} +
    +
    +
    +
    + {%- if post.featured -%} + {{ _('Featured') }} · + {%- endif -%} + {{ post.category.title }} +
    + {%- if post.featured -%} +

    {{ post.title }}

    + {%- else -%} +
    {{ post.title }}
    + {%- endif -%} +

    {{ post.intro }}

    +
    +
    + +
    + {{ post.full_name }} +
    + {{ frappe.format_date(post.published_on) }} + {% if post.read_time %} · {{ post.read_time }} min read {% endif %}
    -
    +
    \ No newline at end of file From 5f4cf98ee20f5aac96fb1cbb947469414cefe44d Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 28 May 2020 22:09:19 +0530 Subject: [PATCH 15/99] feat: added featured checkbox and validation --- frappe/website/doctype/blog_post/blog_post.json | 14 +++++++++++--- frappe/website/doctype/blog_post/blog_post.py | 10 ++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/frappe/website/doctype/blog_post/blog_post.json b/frappe/website/doctype/blog_post/blog_post.json index 3d24879c62..3fb18af2cd 100644 --- a/frappe/website/doctype/blog_post/blog_post.json +++ b/frappe/website/doctype/blog_post/blog_post.json @@ -10,12 +10,13 @@ "title", "published_on", "published", - "read_time", + "featured", "disable_comments", "column_break_3", "blog_category", "blogger", "route", + "read_time", "section_break_5", "blog_intro", "content_type", @@ -143,7 +144,8 @@ { "fieldname": "meta_image", "fieldtype": "Attach Image", - "label": "Meta Image" + "label": "Meta Image", + "mandatory_depends_on": "eval:doc.featured" }, { "fieldname": "section_break_20", @@ -167,6 +169,12 @@ "fieldtype": "Int", "label": "Read Time", "read_only": 1 + }, + { + "default": "0", + "fieldname": "featured", + "fieldtype": "Check", + "label": "Featured" } ], "has_web_view": 1, @@ -175,7 +183,7 @@ "is_published_field": "published", "links": [], "max_attachments": 5, - "modified": "2020-04-30 17:32:41.055883", + "modified": "2020-05-28 21:40:26.068480", "modified_by": "Administrator", "module": "Website", "name": "Blog Post", diff --git a/frappe/website/doctype/blog_post/blog_post.py b/frappe/website/doctype/blog_post/blog_post.py index 5516d17780..0492173ad6 100644 --- a/frappe/website/doctype/blog_post/blog_post.py +++ b/frappe/website/doctype/blog_post/blog_post.py @@ -39,8 +39,18 @@ class BlogPost(WebsiteGenerator): if self.published and not self.published_on: self.published_on = today() + if self.featured: + if not self.meta_image: + frappe.throw(_("A featured post must have a cover image")) + self.reset_featured_for_other_blogs() + self.set_read_time() + def reset_featured_for_other_blogs(self): + all_posts = frappe.get_all("Blog Post", {"featured": 1}) + for post in all_posts: + frappe.db.set_value("Blog Post", post.name, "featured", 0) + def on_update(self): super(BlogPost, self).on_update() clear_cache("writers") From 54cd0191aeee4c68354da79279491b95af8bab4c Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 28 May 2020 22:10:29 +0530 Subject: [PATCH 16/99] feat: update query for new layout --- frappe/website/doctype/blog_post/blog_post.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/frappe/website/doctype/blog_post/blog_post.py b/frappe/website/doctype/blog_post/blog_post.py index 0492173ad6..efa69c55bd 100644 --- a/frappe/website/doctype/blog_post/blog_post.py +++ b/frappe/website/doctype/blog_post/blog_post.py @@ -208,6 +208,9 @@ def get_blog_list(doctype, txt=None, filters=None, limit_start=0, limit_page_len select t1.title, t1.name, t1.blog_category, t1.route, t1.published_on, t1.read_time, t1.published_on as creation, + t1.read_time as read_time, + t1.featured as featured, + t1.meta_image as cover_image, t1.content as content, t1.content_type as content_type, t1.content_html as content_html, @@ -223,7 +226,7 @@ def get_blog_list(doctype, txt=None, filters=None, limit_start=0, limit_page_len where ifnull(t1.published,0)=1 and t1.blogger = t2.name %(condition)s - order by published_on desc, name asc + order by featured desc, published_on desc, name asc limit %(start)s, %(page_len)s""" % { "start": limit_start, "page_len": limit_page_length, "condition": (" and " + " and ".join(conditions)) if conditions else "" @@ -232,9 +235,9 @@ def get_blog_list(doctype, txt=None, filters=None, limit_start=0, limit_page_len posts = frappe.db.sql(query, as_dict=1) for post in posts: - post.content = get_html_content_based_on_type(post, 'content', post.content_type) - post.cover_image = find_first_image(post.content) + if not post.cover_image: + post.cover_image = find_first_image(post.content) post.published = global_date_format(post.creation) post.content = strip_html_tags(post.content) @@ -247,7 +250,7 @@ def get_blog_list(doctype, txt=None, filters=None, limit_start=0, limit_page_len post.avatar = post.avatar or "" post.category = frappe.db.get_value('Blog Category', post.blog_category, - ['route', 'title'], as_dict=True) + ['name', 'route', 'title'], as_dict=True) if post.avatar and (not "http:" in post.avatar and not "https:" in post.avatar) and not post.avatar.startswith("/"): post.avatar = "/" + post.avatar From 33857269efd594298d2f2da9186101b65c93f5a1 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Fri, 29 May 2020 10:35:47 +0530 Subject: [PATCH 17/99] feat: updated styles for blog post --- frappe/public/scss/blog.scss | 43 +++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/frappe/public/scss/blog.scss b/frappe/public/scss/blog.scss index 86c5b18ceb..b24fb631fd 100644 --- a/frappe/public/scss/blog.scss +++ b/frappe/public/scss/blog.scss @@ -7,6 +7,10 @@ .blog-list-body { min-height: 14rem; } + + .post-cover-container { + height: 12rem; + } } .blog-list-cover { @@ -19,7 +23,6 @@ } .post-cover-container { - min-height: 12rem; overflow: hidden; border-radius: $border-radius; @@ -45,4 +48,42 @@ max-height: 22rem; } } +} + +.blog-container { + max-width: 840px; + font-size: 18px; + margin: 0px auto; + font-family: Inter, sans-serif; + + .blog-intro { + font-size: 1.25rem; + font-weight: 300; + } + + .blog-content { + p { + line-height: 1.8; + margin-bottom: 1.2rem; + } + + h1, h2, h3 { + margin-top: 2rem; + } + + h4, h5, h6 { + margin-top: 1.5rem; + } + + img { + border-radius: $border-radius; + } + + blockquote{ + font-weight: 300; + padding: 1.2rem 1.8rem; + border-left: 8px solid $gray-300 ; + background: $gray-100; + } + } } \ No newline at end of file From ee5b7aa84ef5135934c1537ec0503de4093e62eb Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Fri, 29 May 2020 10:36:15 +0530 Subject: [PATCH 18/99] refactor: remove breadcrumbs from blog post --- frappe/website/doctype/blog_post/blog_post.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frappe/website/doctype/blog_post/blog_post.py b/frappe/website/doctype/blog_post/blog_post.py index efa69c55bd..c3f78bff26 100644 --- a/frappe/website/doctype/blog_post/blog_post.py +++ b/frappe/website/doctype/blog_post/blog_post.py @@ -63,6 +63,8 @@ class BlogPost(WebsiteGenerator): if not cint(self.published): raise Exception("This blog has not been published yet!") + context.no_breadcrumbs = True + # temp fields context.full_name = get_fullname(self.owner) context.updated = global_date_format(self.published_on) From 6ffe45e5ce729e92c497666bf9c7b83618e8f787 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Fri, 29 May 2020 10:37:42 +0530 Subject: [PATCH 19/99] refactor: simplify social links --- frappe/website/doctype/blog_post/blog_post.py | 26 ++++++-------- .../blog_post/templates/blog_post.html | 36 +++---------------- .../doctype/blog_settings/blog_settings.json | 20 +++++------ 3 files changed, 24 insertions(+), 58 deletions(-) diff --git a/frappe/website/doctype/blog_post/blog_post.py b/frappe/website/doctype/blog_post/blog_post.py index c3f78bff26..9551c26e15 100644 --- a/frappe/website/doctype/blog_post/blog_post.py +++ b/frappe/website/doctype/blog_post/blog_post.py @@ -99,25 +99,19 @@ class BlogPost(WebsiteGenerator): def fetch_social_links_info(self): + if not frappe.db.get_single_value("Blog Settings", "enable_social_sharing", cache=True): + return [] + url = frappe.local.site + "/" +self.route - social_url_map = { - "twitter": "https://twitter.com/intent/tweet?text=" +self.title + "&url=" + url, - "facebook": "https://www.facebook.com/sharer.php?u=" + url, - "linkedin": "https://www.linkedin.com/sharing/share-offsite/?url=" + url, - "email": "mailto:?subject=" + self.title + "&body=" + url, - } - social_link = [] - for link in frappe.get_cached_doc("Blog Settings").social_share_settings: - social_media = link.social_link_type + social_links = [ + { "icon": "twitter", "link": "https://twitter.com/intent/tweet?text=" + self.title + "&url=" + url }, + { "icon": "facebook", "link": "https://www.facebook.com/sharer.php?u=" + url }, + { "icon": "linkedin", "link": "https://www.linkedin.com/sharing/share-offsite/?url=" + url }, + { "icon": "envelope", "link": "mailto:?subject=" + self.title + "&body=" + url } + ] - social_link.append({ - 'icon': social_media if not social_media == 'email' else 'envelope', - 'url': social_url_map.get(social_media), - 'color': link.color, - 'background': link.background_color - }) - return social_link + return social_links def load_comments(self, context): context.comment_list = get_comment_list(self.doctype, self.name) diff --git a/frappe/website/doctype/blog_post/templates/blog_post.html b/frappe/website/doctype/blog_post/templates/blog_post.html index 12e5ccf2d7..f1c99dd0fd 100644 --- a/frappe/website/doctype/blog_post/templates/blog_post.html +++ b/frappe/website/doctype/blog_post/templates/blog_post.html @@ -24,13 +24,12 @@ {% endif %} {% if social_links %} - {% endif %}
    @@ -54,31 +53,4 @@ -{% endblock %} - -{% block style %} - -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/frappe/website/doctype/blog_settings/blog_settings.json b/frappe/website/doctype/blog_settings/blog_settings.json index a05c0ea5f3..63dae06c68 100644 --- a/frappe/website/doctype/blog_settings/blog_settings.json +++ b/frappe/website/doctype/blog_settings/blog_settings.json @@ -7,8 +7,8 @@ "field_order": [ "blog_title", "blog_introduction", - "section_break_4", - "social_share_settings" + "column_break", + "enable_social_sharing" ], "fields": [ { @@ -22,22 +22,22 @@ "label": "Blog Introduction" }, { - "collapsible": 1, - "fieldname": "section_break_4", - "fieldtype": "Section Break" + "default": "0", + "fieldname": "enable_social_sharing", + "fieldtype": "Check", + "label": "Enable Social Sharing" }, { - "fieldname": "social_share_settings", - "fieldtype": "Table", - "label": "Social Share Settings", - "options": "Social Link Settings" + "collapsible": 1, + "fieldname": "column_break", + "fieldtype": "Column Break" } ], "icon": "fa fa-cog", "idx": 1, "issingle": 1, "links": [], - "modified": "2020-05-28 18:49:08.356608", + "modified": "2020-05-28 22:34:46.679003", "modified_by": "Administrator", "module": "Website", "name": "Blog Settings", From b60fffc60492646f2124dce7ea92629c98a9c086 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Fri, 29 May 2020 10:38:13 +0530 Subject: [PATCH 20/99] feat: updated layout for blog and blogger --- frappe/templates/includes/blog/blogger.html | 2 +- .../blog_post/templates/blog_post.html | 42 +++++++++++-------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/frappe/templates/includes/blog/blogger.html b/frappe/templates/includes/blog/blogger.html index 68df22786d..136d2cdaa9 100644 --- a/frappe/templates/includes/blog/blogger.html +++ b/frappe/templates/includes/blog/blogger.html @@ -1,7 +1,7 @@ {% from "frappe/templates/includes/macros.html" import square_image_with_fallback %}
    - {{ square_image_with_fallback(src=blogger_info.avatar, size='72px', alt=blogger_info.full_name, class='align-self-start mr-3 rounded') }} + {{ square_image_with_fallback(src=blogger_info.avatar, size='90px', alt=blogger_info.full_name, class='align-self-start mr-3 rounded') }}
    {{ blogger_info.full_name }} diff --git a/frappe/website/doctype/blog_post/templates/blog_post.html b/frappe/website/doctype/blog_post/templates/blog_post.html index f1c99dd0fd..f0eb505d61 100644 --- a/frappe/website/doctype/blog_post/templates/blog_post.html +++ b/frappe/website/doctype/blog_post/templates/blog_post.html @@ -8,22 +8,30 @@
    -
    - -

    {{ title }}

    -

    - {{ blog_intro }} -

    -
    - -
    - {{ frappe.format_date(published_on) }} - {% if read_time %} - · - {{ read_time }} min read - {% endif %} - {% if social_links %} -
    + {% if not hide_cta %} + {{ web_blocks([ + { + 'template': "Section With CTA", + 'values': cta, + 'add_container': 0, + 'add_top_padding': 0, + 'add_bottom_padding': 0, + 'css_class': "py-5" + } + ]) + }} + {% endif %} {% if blogger_info %}
    diff --git a/frappe/website/doctype/blog_settings/blog_settings.json b/frappe/website/doctype/blog_settings/blog_settings.json index 63dae06c68..a1c9591837 100644 --- a/frappe/website/doctype/blog_settings/blog_settings.json +++ b/frappe/website/doctype/blog_settings/blog_settings.json @@ -8,7 +8,16 @@ "blog_title", "blog_introduction", "column_break", - "enable_social_sharing" + "enable_social_sharing", + "show_cta_in_blog", + "cta_section", + "title", + "subtitle", + "cta_label", + "cta_url", + "column_break_11", + "cta_description", + "show_confetti" ], "fields": [ { @@ -31,13 +40,64 @@ "collapsible": 1, "fieldname": "column_break", "fieldtype": "Column Break" + }, + { + "default": "0", + "fieldname": "show_cta_in_blog", + "fieldtype": "Check", + "label": "Show CTA in Blog" + }, + { + "depends_on": "eval:doc.show_cta_in_blog", + "fieldname": "cta_section", + "fieldtype": "Section Break", + "label": "CTA" + }, + { + "fieldname": "title", + "fieldtype": "Data", + "label": "Title", + "mandatory_depends_on": "eval:doc.show_cta_in_blog" + }, + { + "fieldname": "subtitle", + "fieldtype": "Data", + "label": "Subtitle", + "mandatory_depends_on": "eval:doc.show_cta_in_blog" + }, + { + "fieldname": "cta_label", + "fieldtype": "Data", + "label": "CTA Label", + "mandatory_depends_on": "eval:doc.show_cta_in_blog" + }, + { + "fieldname": "cta_url", + "fieldtype": "Data", + "label": "CTA URL", + "mandatory_depends_on": "eval:doc.show_cta_in_blog" + }, + { + "fieldname": "column_break_11", + "fieldtype": "Column Break" + }, + { + "fieldname": "cta_description", + "fieldtype": "Data", + "label": "CTA Description" + }, + { + "default": "0", + "fieldname": "show_confetti", + "fieldtype": "Check", + "label": "Show Confetti" } ], "icon": "fa fa-cog", "idx": 1, "issingle": 1, "links": [], - "modified": "2020-05-28 22:34:46.679003", + "modified": "2020-05-29 16:39:44.018100", "modified_by": "Administrator", "module": "Website", "name": "Blog Settings", From 3de8549b0b67f1bfe8ca4ad4b63c9a73d0105f47 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 1 Jun 2020 13:42:23 +0530 Subject: [PATCH 36/99] refactor: allow blogger to read blog settings --- frappe/website/doctype/blog_settings/blog_settings.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/frappe/website/doctype/blog_settings/blog_settings.json b/frappe/website/doctype/blog_settings/blog_settings.json index a1c9591837..1b96054705 100644 --- a/frappe/website/doctype/blog_settings/blog_settings.json +++ b/frappe/website/doctype/blog_settings/blog_settings.json @@ -97,7 +97,7 @@ "idx": 1, "issingle": 1, "links": [], - "modified": "2020-05-29 16:39:44.018100", + "modified": "2020-06-01 13:41:44.150987", "modified_by": "Administrator", "module": "Website", "name": "Blog Settings", @@ -111,6 +111,13 @@ "role": "Website Manager", "share": 1, "write": 1 + }, + { + "email": 1, + "print": 1, + "read": 1, + "role": "Blogger", + "share": 1 } ], "sort_field": "modified", From 7dfb7e0646b1c49ee547fd2cd1f6c547e8c79cb7 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 1 Jun 2020 13:53:03 +0530 Subject: [PATCH 37/99] refactor: remove cover image --- frappe/public/scss/blog.scss | 6 +++--- .../blog_post/templates/blog_post_row.html | 16 ++++++++-------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/frappe/public/scss/blog.scss b/frappe/public/scss/blog.scss index aa6c3b543c..f857270292 100644 --- a/frappe/public/scss/blog.scss +++ b/frappe/public/scss/blog.scss @@ -15,13 +15,13 @@ border-radius: $border-radius; img { - min-height: 12rem; + min-height: 10rem; width: 100%; } } .default-cover { - background: $gray-300; + background: $gray-200; color: $gray-600; display: flex; flex-direction: column; @@ -34,7 +34,7 @@ @extend .col-md-4; .blog-list-body { - min-height: 12rem; + min-height: 14rem; } .post-cover-container { diff --git a/frappe/website/doctype/blog_post/templates/blog_post_row.html b/frappe/website/doctype/blog_post/templates/blog_post_row.html index 5987532c98..a80525c761 100644 --- a/frappe/website/doctype/blog_post/templates/blog_post_row.html +++ b/frappe/website/doctype/blog_post/templates/blog_post_row.html @@ -2,15 +2,15 @@
    - {% if post.cover_image %} - + + {% if post.cover_image %} {{post.title}} - Cover Image - - {% else %} -
    -
    {{ post.title }}
    -
    - {% endif %} + {% else %} +
    +
    {{ post.title }}
    +
    + {% endif %} +
    From 299200da190b1663dc854e26fdc8f81dd8d2fb31 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 1 Jun 2020 14:13:45 +0530 Subject: [PATCH 38/99] refactor: macro for avatar --- frappe/templates/includes/blog/blogger.html | 2 +- frappe/templates/includes/comments/comment.html | 2 +- frappe/templates/includes/macros.html | 16 ++-------------- 3 files changed, 4 insertions(+), 16 deletions(-) diff --git a/frappe/templates/includes/blog/blogger.html b/frappe/templates/includes/blog/blogger.html index 136d2cdaa9..ef8f8257e8 100644 --- a/frappe/templates/includes/blog/blogger.html +++ b/frappe/templates/includes/blog/blogger.html @@ -1,7 +1,7 @@ {% from "frappe/templates/includes/macros.html" import square_image_with_fallback %}
    - {{ square_image_with_fallback(src=blogger_info.avatar, size='90px', alt=blogger_info.full_name, class='align-self-start mr-3 rounded') }} + {{ square_image_with_fallback(src=blogger_info.avatar, size='small', alt=blogger_info.full_name, class='align-self-start mr-3 rounded') }}
    {{ blogger_info.full_name }} diff --git a/frappe/templates/includes/comments/comment.html b/frappe/templates/includes/comments/comment.html index 3fe3d7df58..1deb49bb3e 100644 --- a/frappe/templates/includes/comments/comment.html +++ b/frappe/templates/includes/comments/comment.html @@ -1,7 +1,7 @@ {% from "frappe/templates/includes/macros.html" import square_image_with_fallback %}
    - {{ square_image_with_fallback(src=frappe.get_gravatar(comment.comment_email or comment.sender), size='48px', alt=comment.sender_full_name, class='align-self-start mr-3') }} + {{ square_image_with_fallback(src=frappe.get_gravatar(comment.comment_email or comment.sender), size='extra-small', alt=comment.sender_full_name, class='align-self-start mr-3') }}
    diff --git a/frappe/templates/includes/macros.html b/frappe/templates/includes/macros.html index 3e822b8bf3..767bd59ec9 100644 --- a/frappe/templates/includes/macros.html +++ b/frappe/templates/includes/macros.html @@ -1,18 +1,6 @@ -{% macro square_image_with_fallback(src=None, size=None, alt=None, class="") %} +{% macro square_image_with_fallback(src=None, size='small', alt=None, class="") %} {% if src %} -{{ alt or '' }} + {% else %}
    {% endif %} From e868fac37961e1e505f5fa97575bb033035d4f31 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 1 Jun 2020 15:19:33 +0530 Subject: [PATCH 39/99] refactor: simpler blog layout with cards --- frappe/public/scss/blog.scss | 66 +++---------------- .../blog_post/templates/blog_post_row.html | 57 +++++++--------- 2 files changed, 33 insertions(+), 90 deletions(-) diff --git a/frappe/public/scss/blog.scss b/frappe/public/scss/blog.scss index f857270292..64a27b3193 100644 --- a/frappe/public/scss/blog.scss +++ b/frappe/public/scss/blog.scss @@ -1,62 +1,12 @@ -.blog-list-item { - @extend .col-12; +.card-img-top { + width: 100%; + overflow: hidden; + height: 12rem; + width: auto; - .blog-list-cover { - @extend .col-12; - } - - .blog-list-body { - @extend .col-12; - @extend .mt-3; - } - - .post-cover-container { - overflow: hidden; - border-radius: $border-radius; - - img { - min-height: 10rem; - width: 100%; - } - } - - .default-cover { - background: $gray-200; - color: $gray-600; - display: flex; - flex-direction: column; - justify-content: end; - height: 100%; - padding: 1rem; - } - - &:not(.featured) { - @extend .col-md-4; - - .blog-list-body { - min-height: 14rem; - } - - .post-cover-container { - height: 10rem; - } - } - - &.featured { - .blog-list-cover { - @extend .col-12; - @extend .col-md-8; - } - - .blog-list-body { - @extend .col-12; - @extend .col-md-4; - @extend .mt-0; - } - - .post-cover-container { - max-height: 22rem; - } + img { + width: 100%; + min-height: 100%; } } diff --git a/frappe/website/doctype/blog_post/templates/blog_post_row.html b/frappe/website/doctype/blog_post/templates/blog_post_row.html index a80525c761..bd5b0b382b 100644 --- a/frappe/website/doctype/blog_post/templates/blog_post_row.html +++ b/frappe/website/doctype/blog_post/templates/blog_post_row.html @@ -1,42 +1,35 @@ {%- set post = doc -%} -
    -
    -
    - - {% if post.cover_image %} - {{post.title}} - Cover Image - {% else %} -
    -
    {{ post.title }}
    -
    - {% endif %} -
    +
    +
    +
    + {{post.title}} - Cover Image
    -
    -
    -
    -
    +
    +
    +
    + {%- if post.featured -%} + {{ _('Featured') }} · + {%- endif -%} + {{ post.category.title }} +
    {%- if post.featured -%} - {{ _('Featured') }} · +
    {{ post.title }}
    + {%- else -%} +
    {{ post.title }}
    {%- endif -%} - {{ post.category.title }} +

    {{ post.intro }}

    - {%- if post.featured -%} -

    {{ post.title }}

    - {%- else -%} -
    {{ post.title }}
    - {%- endif -%} -

    {{ post.intro }}

    -
    -
    - -
    - {{ post.full_name }} -
    - {{ frappe.format_date(post.published_on) }} - {% if post.read_time %} · {{ post.read_time }} min read {% endif %} +
    + +
    + {{ post.full_name }} +
    + {{ frappe.format_date(post.published_on) }} + {% if post.read_time %} · {{ post.read_time }} min read {% endif %} +
    +
    \ No newline at end of file From f38e081d04a722a4f38571762037b9eda9eaf8ea Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 1 Jun 2020 17:52:18 +0530 Subject: [PATCH 40/99] refactor: tweak typography --- frappe/public/scss/blog.scss | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/frappe/public/scss/blog.scss b/frappe/public/scss/blog.scss index 64a27b3193..9b78e47e48 100644 --- a/frappe/public/scss/blog.scss +++ b/frappe/public/scss/blog.scss @@ -12,7 +12,7 @@ .blog-container { max-width: 840px; - font-size: 18px; + font-size: 16px; margin: 0px auto; font-family: Inter, sans-serif; @@ -23,10 +23,34 @@ .blog-content { p { - line-height: 1.8; + line-height: 1.625; margin-bottom: 1.2rem; } + h1 { + font-size: 2rem; + } + + h1.blog-header { + font-size: 2.5rem; + } + + h2 { + font-size: 1.75rem; + } + + h3 { + font-size: 1.5rem; + } + + h4 { + font-size: 1.25rem; + } + + h5, h6 { + font-size: 1rem; + } + h1, h2, h3 { margin-top: 2rem; } From 9e358261f1baef3eb84cd43eeb4ab9a41667cde7 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 1 Jun 2020 18:32:29 +0530 Subject: [PATCH 41/99] feat: added section small cta --- frappe/public/scss/page-builder.scss | 44 +++++++++++++++++++ .../section_with_small_cta/__init__.py | 0 .../section_with_small_cta.html | 11 +++++ .../section_with_small_cta.json | 37 ++++++++++++++++ 4 files changed, 92 insertions(+) create mode 100644 frappe/website/web_template/section_with_small_cta/__init__.py create mode 100644 frappe/website/web_template/section_with_small_cta/section_with_small_cta.html create mode 100644 frappe/website/web_template/section_with_small_cta/section_with_small_cta.json diff --git a/frappe/public/scss/page-builder.scss b/frappe/public/scss/page-builder.scss index a028e34158..cc96a2751c 100644 --- a/frappe/public/scss/page-builder.scss +++ b/frappe/public/scss/page-builder.scss @@ -224,6 +224,50 @@ } } +.section-small-cta { + padding: 1.8rem; + background-color: lighten($primary, 42%); + border-radius: 0.75rem; + display: flex; + flex-direction: column; + text-align: center; + + @include media-breakpoint-up(sm) { + flex-direction: column; + text-align: left; + } + + @include media-breakpoint-up(md) { + flex-direction: row; + justify-content: space-between; + + div { + align-self: center; + } + } + + .title { + max-width: 36rem; + font-size: $font-size-xl; + font-weight: 800; + line-height: 1.25; + @include media-breakpoint-up(md) { + font-size: $font-size-2xl; + } + } + .subtitle { + max-width: 36rem; + font-size: $font-size-base; + color: $gray-900; + margin-bottom: 1.2rem; + + @include media-breakpoint-up(md) { + font-size: $font-size-lg; + margin-bottom: 0px; + } + } +} + .section-cta-container { position: relative; .confetti { diff --git a/frappe/website/web_template/section_with_small_cta/__init__.py b/frappe/website/web_template/section_with_small_cta/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frappe/website/web_template/section_with_small_cta/section_with_small_cta.html b/frappe/website/web_template/section_with_small_cta/section_with_small_cta.html new file mode 100644 index 0000000000..e2f8f5d7f6 --- /dev/null +++ b/frappe/website/web_template/section_with_small_cta/section_with_small_cta.html @@ -0,0 +1,11 @@ +
    +
    +
    +

    {{ title }}

    +

    {{ subtitle }}

    +
    + +
    +
    diff --git a/frappe/website/web_template/section_with_small_cta/section_with_small_cta.json b/frappe/website/web_template/section_with_small_cta/section_with_small_cta.json new file mode 100644 index 0000000000..d392830473 --- /dev/null +++ b/frappe/website/web_template/section_with_small_cta/section_with_small_cta.json @@ -0,0 +1,37 @@ +{ + "creation": "2020-06-01 15:56:38.002136", + "docstatus": 0, + "doctype": "Web Template", + "fields": [ + { + "fieldname": "title", + "fieldtype": "Data", + "label": "Title", + "reqd": 0 + }, + { + "fieldname": "subtitle", + "fieldtype": "Small Text", + "label": "Subtitle", + "reqd": 0 + }, + { + "fieldname": "cta_label", + "fieldtype": "Data", + "label": "CTA Label", + "reqd": 0 + }, + { + "fieldname": "cta_url", + "fieldtype": "Data", + "label": "CTA URL", + "reqd": 0 + } + ], + "idx": 0, + "modified": "2020-06-01 17:51:23.073342", + "modified_by": "Administrator", + "name": "Section with Small CTA", + "owner": "Administrator", + "standard": 1 +} \ No newline at end of file From b00fb8bd21dc111c3301ea9789ebef446c2df777 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 1 Jun 2020 18:33:03 +0530 Subject: [PATCH 42/99] refactor: replace cta with small cta --- frappe/website/doctype/blog_post/blog_post.py | 4 +--- .../blog_post/templates/blog_post.html | 2 +- .../doctype/blog_settings/blog_settings.json | 19 +++---------------- 3 files changed, 5 insertions(+), 20 deletions(-) diff --git a/frappe/website/doctype/blog_post/blog_post.py b/frappe/website/doctype/blog_post/blog_post.py index dcd712b634..a696ebc8c2 100644 --- a/frappe/website/doctype/blog_post/blog_post.py +++ b/frappe/website/doctype/blog_post/blog_post.py @@ -112,9 +112,7 @@ class BlogPost(WebsiteGenerator): "title": blog_settings.title, "subtitle": blog_settings.subtitle, "cta_label": blog_settings.cta_label, - "cta_url": blog_settings.cta_url, - "cta_description": blog_settings.cta_description, - "show_confetti": blog_settings.show_confetti + "cta_url": blog_settings.cta_url } return {} diff --git a/frappe/website/doctype/blog_post/templates/blog_post.html b/frappe/website/doctype/blog_post/templates/blog_post.html index f38c3db4b4..862380de47 100644 --- a/frappe/website/doctype/blog_post/templates/blog_post.html +++ b/frappe/website/doctype/blog_post/templates/blog_post.html @@ -48,7 +48,7 @@ {% if not hide_cta %} {{ web_blocks([ { - 'template': "Section With CTA", + 'template': "Section With Small CTA", 'values': cta, 'add_container': 0, 'add_top_padding': 0, diff --git a/frappe/website/doctype/blog_settings/blog_settings.json b/frappe/website/doctype/blog_settings/blog_settings.json index 1b96054705..73ea3ce877 100644 --- a/frappe/website/doctype/blog_settings/blog_settings.json +++ b/frappe/website/doctype/blog_settings/blog_settings.json @@ -13,11 +13,9 @@ "cta_section", "title", "subtitle", - "cta_label", - "cta_url", "column_break_11", - "cta_description", - "show_confetti" + "cta_label", + "cta_url" ], "fields": [ { @@ -80,24 +78,13 @@ { "fieldname": "column_break_11", "fieldtype": "Column Break" - }, - { - "fieldname": "cta_description", - "fieldtype": "Data", - "label": "CTA Description" - }, - { - "default": "0", - "fieldname": "show_confetti", - "fieldtype": "Check", - "label": "Show Confetti" } ], "icon": "fa fa-cog", "idx": 1, "issingle": 1, "links": [], - "modified": "2020-06-01 13:41:44.150987", + "modified": "2020-06-01 15:57:21.564652", "modified_by": "Administrator", "module": "Website", "name": "Blog Settings", From 882b200f32c475ab5fa26b6c9b7129d23d5f6988 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 1 Jun 2020 18:33:25 +0530 Subject: [PATCH 43/99] feat: updated blog typography --- frappe/public/scss/blog.scss | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/frappe/public/scss/blog.scss b/frappe/public/scss/blog.scss index 9b78e47e48..f0b8d9e34f 100644 --- a/frappe/public/scss/blog.scss +++ b/frappe/public/scss/blog.scss @@ -23,7 +23,7 @@ .blog-content { p { - line-height: 1.625; + line-height: 1.8; margin-bottom: 1.2rem; } @@ -47,15 +47,20 @@ font-size: 1.25rem; } - h5, h6 { + h5, + h6 { font-size: 1rem; } - h1, h2, h3 { + h1, + h2, + h3 { margin-top: 2rem; } - h4, h5, h6 { + h4, + h5, + h6 { margin-top: 1.5rem; } @@ -63,11 +68,11 @@ border-radius: $border-radius; } - blockquote{ + blockquote { font-weight: 300; padding: 1.2rem 1.8rem; - border-left: 8px solid $gray-300 ; + border-left: 8px solid $gray-300; background: $gray-100; } } -} \ No newline at end of file +} From 8e815552f648ca295befaa002b522588e32fd5fc Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 1 Jun 2020 19:15:00 +0530 Subject: [PATCH 44/99] feat: use blog_post_list as default --- frappe/model/meta.py | 3 +++ frappe/templates/includes/blog/blog_list.html | 25 ------------------- frappe/website/doctype/blog_post/blog_post.py | 1 - .../blog_post/templates/blog_post_list.html} | 0 frappe/www/list.py | 3 +++ 5 files changed, 6 insertions(+), 26 deletions(-) delete mode 100644 frappe/templates/includes/blog/blog_list.html rename frappe/{templates/includes/blog/blog.html => website/doctype/blog_post/templates/blog_post_list.html} (100%) diff --git a/frappe/model/meta.py b/frappe/model/meta.py index 0c5ec75597..1cc3abba5b 100644 --- a/frappe/model/meta.py +++ b/frappe/model/meta.py @@ -483,6 +483,9 @@ class Meta(Document): def get_row_template(self): return self.get_web_template(suffix='_row') + def get_list_template(self): + return self.get_web_template(suffix='_list') + def get_web_template(self, suffix=''): '''Returns the relative path of the row template for this doctype''' module_name = frappe.scrub(self.module) diff --git a/frappe/templates/includes/blog/blog_list.html b/frappe/templates/includes/blog/blog_list.html deleted file mode 100644 index cfe25f3682..0000000000 --- a/frappe/templates/includes/blog/blog_list.html +++ /dev/null @@ -1,25 +0,0 @@ -{% if sub_title %} -

    {{ sub_title }}

    -{% endif %} -{% if not result -%} -
    - {{ no_result_message or _("Nothing to show") }} -
    -{% else %} -
    - - {% if result_heading_template %}{% include result_heading_template %}{% endif %} - -
    - {% for item in result %} - {{ item }} - {% endfor %} -
    - -
    -{%- endif %} diff --git a/frappe/website/doctype/blog_post/blog_post.py b/frappe/website/doctype/blog_post/blog_post.py index a696ebc8c2..8a0e2323fc 100644 --- a/frappe/website/doctype/blog_post/blog_post.py +++ b/frappe/website/doctype/blog_post/blog_post.py @@ -153,7 +153,6 @@ class BlogPost(WebsiteGenerator): def get_list_context(context=None): list_context = frappe._dict( - template = "/templates/includes/blog/blog.html", get_list = get_blog_list, no_breadcrumbs = True, hide_filters = True, diff --git a/frappe/templates/includes/blog/blog.html b/frappe/website/doctype/blog_post/templates/blog_post_list.html similarity index 100% rename from frappe/templates/includes/blog/blog.html rename to frappe/website/doctype/blog_post/templates/blog_post_list.html diff --git a/frappe/www/list.py b/frappe/www/list.py index 313505b729..03171a74bd 100644 --- a/frappe/www/list.py +++ b/frappe/www/list.py @@ -171,6 +171,9 @@ def get_list_context(context, doctype, web_form_name=None): if not meta.custom and not list_context.row_template: list_context.row_template = meta.get_row_template() + if not meta.custom and not list_context.list_template: + list_context.template = meta.get_list_template() + return list_context def get_list(doctype, txt, filters, limit_start, limit_page_length=20, ignore_permissions=False, From 89b8eea57b50832dc46701b11eefd607ae1d2f57 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 1 Jun 2020 19:29:17 +0530 Subject: [PATCH 45/99] feat: move social share after content --- frappe/website/doctype/blog_post/blog_post.py | 1 + .../blog_post/templates/blog_post.html | 31 ++++++++++++------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/frappe/website/doctype/blog_post/blog_post.py b/frappe/website/doctype/blog_post/blog_post.py index 8a0e2323fc..beffcdca25 100644 --- a/frappe/website/doctype/blog_post/blog_post.py +++ b/frappe/website/doctype/blog_post/blog_post.py @@ -75,6 +75,7 @@ class BlogPost(WebsiteGenerator): context.updated = global_date_format(self.published_on) context.social_links = self.fetch_social_links_info() context.cta = self.fetch_cta() + context.enable_cta = not self.hide_cta and frappe.db.get_single_value("Blog Settings", "show_cta_in_blog", cache=True) if self.blogger: context.blogger_info = frappe.get_doc("Blogger", self.blogger).as_dict() diff --git a/frappe/website/doctype/blog_post/templates/blog_post.html b/frappe/website/doctype/blog_post/templates/blog_post.html index 862380de47..e7e1e5db95 100644 --- a/frappe/website/doctype/blog_post/templates/blog_post.html +++ b/frappe/website/doctype/blog_post/templates/blog_post.html @@ -18,11 +18,6 @@

    {{ blog_intro }}

    - {%-if featured -%} -
    - {{ _("Featured") }} -
    - {%- endif -%}
    {{ frappe.format_date(published_on) }} @@ -32,11 +27,11 @@ {% endif %}
    - {% if social_links %} - {% for link in social_links %} - - {% endfor %} - {% endif %} + {%-if featured -%} +
    + {{ _("Featured") }} +
    + {%- endif -%}
    @@ -45,7 +40,7 @@
    - {% if not hide_cta %} + {% if enable_cta %} {{ web_blocks([ { 'template': "Section With Small CTA", @@ -53,11 +48,23 @@ 'add_container': 0, 'add_top_padding': 0, 'add_bottom_padding': 0, - 'css_class': "py-5" + 'css_class': "my-5" } ]) }} {% endif %} +
    +
    + Published on {{ frappe.format_date(published_on) }} +
    +
    + {% if social_links %} + {% for link in social_links %} + + {% endfor %} + {% endif %} +
    +
    {% if blogger_info %}
    From 9d460eafb3ee3868a0c30032afc2008531fc5cf5 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Mon, 1 Jun 2020 19:48:49 +0530 Subject: [PATCH 46/99] fix: Update text colors - Default heading color gray-900 - Default body color gray-800 - Default markdown body color gray-700 - Remove explicit color styles - Use new gray colors in variables - Add transitions - h1, h2 margin bottom - Reset card title line-height --- frappe/public/scss/base.scss | 2 ++ frappe/public/scss/doc.scss | 3 ++- frappe/public/scss/markdown.scss | 11 ++++++++-- frappe/public/scss/page-builder.scss | 22 +++++++++---------- frappe/public/scss/sidebar.scss | 3 ++- frappe/public/scss/variables.scss | 33 ++++++++++++++-------------- 6 files changed, 43 insertions(+), 31 deletions(-) diff --git a/frappe/public/scss/base.scss b/frappe/public/scss/base.scss index 9f0797eb4e..e596d7bff1 100644 --- a/frappe/public/scss/base.scss +++ b/frappe/public/scss/base.scss @@ -25,6 +25,7 @@ h1 { font-weight: 800; line-height: 1.25; letter-spacing: -0.025em; + margin-bottom: 1rem; @include media-breakpoint-up(sm) { line-height: 2.5rem; @@ -39,6 +40,7 @@ h1 { h2 { font-size: $font-size-xl; font-weight: bold; + margin-bottom: 0.75rem; @include media-breakpoint-up(sm) { font-size: $font-size-2xl; diff --git a/frappe/public/scss/doc.scss b/frappe/public/scss/doc.scss index ed1e828e13..4804ac8450 100644 --- a/frappe/public/scss/doc.scss +++ b/frappe/public/scss/doc.scss @@ -185,9 +185,10 @@ $navbar-height-lg: 4.5rem; color: $gray-600; text-decoration: none; font-weight: 500; + @include transition(); &:hover { - color: $gray-700; + color: $gray-800; } } } diff --git a/frappe/public/scss/markdown.scss b/frappe/public/scss/markdown.scss index d98f36ad5b..a77b8b941e 100644 --- a/frappe/public/scss/markdown.scss +++ b/frappe/public/scss/markdown.scss @@ -1,4 +1,5 @@ .from-markdown { + color: $gray-700; line-height: 1.625; > * + * { @@ -35,7 +36,6 @@ padding: 1.25rem 1rem; font-size: $font-size-sm; font-weight: 500; - color: $gray-900; border: 1px solid $gray-200; border-left: 3px solid $yellow; border-top-left-radius: 0.1rem; @@ -49,10 +49,17 @@ margin-bottom: 0; } + b, strong { + color: $gray-800; + } + + h1, h2, h3, h4, h5, h6 { + color: $gray-900; + } + h1 + p { margin-top: 0.75rem; font-size: $font-size-base; - color: $gray-900; @include media-breakpoint-up(sm) { margin-top: 1.25rem; diff --git a/frappe/public/scss/page-builder.scss b/frappe/public/scss/page-builder.scss index ee8e922d30..01ffbfbf4e 100644 --- a/frappe/public/scss/page-builder.scss +++ b/frappe/public/scss/page-builder.scss @@ -1,5 +1,7 @@ .hero-subtitle { @extend .lead; + font-weight: 400; + color: $gray-600; max-width: 42rem; } @@ -7,7 +9,6 @@ max-width: 56rem; margin-top: 0.5rem; font-size: $font-size-base; - color: $gray-900; @include media-breakpoint-up(lg) { font-size: $font-size-lg; @@ -88,18 +89,16 @@ } .card { - .card-title { - color: $black; - } - - .card-body { - color: $gray-900; - } + @include transition(); &:hover { border-color: $gray-600; } + .card-title { + line-height: 1; + } + &.card-sm { .card-body { padding: 1.5rem; @@ -159,14 +158,17 @@ flex-wrap: nowrap; overflow-x: auto; overflow-y: hidden; + // 1 pixel bottom padding so that the 2px active border is visible + padding-bottom: 1px; .nav-link { - color: $gray-700; + color: $gray-800; font-weight: 500; border: none; padding: 1rem 0.5rem; margin-right: 2rem; white-space: nowrap; + @include transition(); &:hover { color: $primary; @@ -215,7 +217,6 @@ margin: 0 auto; margin-top: 0.5rem; font-size: $font-size-base; - color: $gray-900; @include media-breakpoint-up(md) { font-size: $font-size-lg; } @@ -225,7 +226,6 @@ margin: 0 auto; margin-top: 0.5rem; font-size: $font-size-xs; - color: $gray-900; } } diff --git a/frappe/public/scss/sidebar.scss b/frappe/public/scss/sidebar.scss index cfe9b846e3..4dc8e64631 100644 --- a/frappe/public/scss/sidebar.scss +++ b/frappe/public/scss/sidebar.scss @@ -13,9 +13,10 @@ color: $gray-600; text-decoration: none; font-weight: 500; + @include transition(); &:hover { - color: $gray-700; + color: $gray-900; } } diff --git a/frappe/public/scss/variables.scss b/frappe/public/scss/variables.scss index 7a593aa754..e972115206 100644 --- a/frappe/public/scss/variables.scss +++ b/frappe/public/scss/variables.scss @@ -1,22 +1,23 @@ -$gray-100: #fafbfc !default; -$gray-150: #f5f7fa !default; -$gray-200: #ebecf1 !default; -$gray-300: #d1d8dd !default; -$gray-400: #ced4da !default; -$gray-500: #adb5bd !default; -$gray-600: #8d99a6 !default; -$gray-700: #495057 !default; -$gray-800: #36414c !default; -$gray-900: #2e3338 !default; - -$primary: #2490ef !default; -$primary-light: lighten($primary, 42%); +$gray-50: #F9FAFA !default; +$gray-100: #F4F5F6 !default; +$gray-200: #EEF0F2 !default; +$gray-300: #E2E6E9 !default; +$gray-400: #C8CFD5 !default; +$gray-500: #A6B1B9 !default; +$gray-600: #74808B !default; +$gray-700: #4C5A67 !default; +$gray-800: #313B44 !default; +$gray-900: #192734 !default; $black: #000 !default; +$primary: #2490ef !default; +$primary-light: lighten($primary, 42%) !default; +$light: $gray-50 !default; $body-color: $gray-800 !default; $text-muted: $gray-600 !default; $border-color: $gray-300 !default; +$headings-color: $gray-900 !default; $font-size-xs: 0.75rem !default; $font-size-sm: 0.875rem !default; @@ -35,15 +36,15 @@ $btn-font-size-lg: 1.125rem !default; $btn-line-height-lg: 1 !default; $btn-border-radius-lg: 0.5rem !default; $btn-border-radius: 0.375rem !default; -$btn-font-size: $font-size-sm; +$btn-font-size: $font-size-sm !default; $btn-padding-x: 1rem !default; $btn-padding-y: 0.5rem !default; $btn-font-weight: 500 !default; $navbar-nav-link-padding-x: 1rem !default; -$navbar-padding-y: 1rem; +$navbar-padding-y: 1rem !default; $card-border-radius: 0.75rem !default; -$card-spacer-y: 1rem !default; +$card-spacer-y: 0.5rem !default; $dropdown-font-size: $font-size-sm !default; $dropdown-border-radius: 0.375rem !default; From 5d9d06a7a2c6dd0c67c9d26fd5414433ffd31257 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 1 Jun 2020 19:51:43 +0530 Subject: [PATCH 47/99] refactor: minor blog styling --- frappe/public/scss/blog.scss | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/frappe/public/scss/blog.scss b/frappe/public/scss/blog.scss index f0b8d9e34f..999df7bde0 100644 --- a/frappe/public/scss/blog.scss +++ b/frappe/public/scss/blog.scss @@ -11,8 +11,8 @@ } .blog-container { - max-width: 840px; font-size: 16px; + max-width: 800px; margin: 0px auto; font-family: Inter, sans-serif; @@ -22,11 +22,16 @@ } .blog-content { + line-height: 1.8; + p { - line-height: 1.8; margin-bottom: 1.2rem; } + ul { + margin-top: 1rem; + } + h1 { font-size: 2rem; } @@ -69,10 +74,15 @@ } blockquote { - font-weight: 300; - padding: 1.2rem 1.8rem; - border-left: 8px solid $gray-300; - background: $gray-100; + margin: 2rem auto; + width: 90%; + padding-top: 2rem; + padding-bottom: 2rem; + border-top: 1px solid $gray-200; + border-bottom: 1px solid $gray-200; + text-align: center; + font-size: 1.2rem; + font-weight: 500; } } } From 190ed209747ed0cd8495402e9966a4ea992be983 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 1 Jun 2020 19:55:37 +0530 Subject: [PATCH 48/99] fix: top margin for ordered list --- frappe/public/scss/blog.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/scss/blog.scss b/frappe/public/scss/blog.scss index 999df7bde0..7ecdca3879 100644 --- a/frappe/public/scss/blog.scss +++ b/frappe/public/scss/blog.scss @@ -28,7 +28,7 @@ margin-bottom: 1.2rem; } - ul { + ul, ol { margin-top: 1rem; } From 9a997764a125ad268e2b24834821fcd83a1f414d Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 1 Jun 2020 20:03:10 +0530 Subject: [PATCH 49/99] refactor: use margin instead of padding --- frappe/website/doctype/blog_post/templates/blog_post.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/website/doctype/blog_post/templates/blog_post.html b/frappe/website/doctype/blog_post/templates/blog_post.html index e7e1e5db95..df0300ff23 100644 --- a/frappe/website/doctype/blog_post/templates/blog_post.html +++ b/frappe/website/doctype/blog_post/templates/blog_post.html @@ -8,7 +8,7 @@
    -
    +
    {{ _('Blog') }} / From 315f01833ced5d61a4be9ce070e8363c11c08458 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 1 Jun 2020 20:23:28 +0530 Subject: [PATCH 50/99] fix: fonts --- frappe/public/scss/blog.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/scss/blog.scss b/frappe/public/scss/blog.scss index 7ecdca3879..16266b5da2 100644 --- a/frappe/public/scss/blog.scss +++ b/frappe/public/scss/blog.scss @@ -14,7 +14,6 @@ font-size: 16px; max-width: 800px; margin: 0px auto; - font-family: Inter, sans-serif; .blog-intro { font-size: 1.25rem; @@ -66,6 +65,7 @@ h4, h5, h6 { + font-weight: 600; margin-top: 1.5rem; } From 6f678e26cd5e063475358b81ff303a978daa421d Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 1 Jun 2020 20:27:20 +0530 Subject: [PATCH 51/99] refactor: fonts --- frappe/public/scss/blog.scss | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/frappe/public/scss/blog.scss b/frappe/public/scss/blog.scss index 16266b5da2..92a86d6c95 100644 --- a/frappe/public/scss/blog.scss +++ b/frappe/public/scss/blog.scss @@ -32,41 +32,40 @@ } h1 { + margin-top: 2rem; + font-weight: 800; font-size: 2rem; } h1.blog-header { + margin-top: 2rem; + font-weight: 800; font-size: 2.5rem; } h2 { + margin-top: 2rem; + font-weight: 700; font-size: 1.75rem; } h3 { + margin-top: 2rem; + font-weight: 600; font-size: 1.5rem; } h4 { + font-weight: 500; + margin-top: 1.5rem; font-size: 1.25rem; } h5, h6 { - font-size: 1rem; - } - - h1, - h2, - h3 { - margin-top: 2rem; - } - - h4, - h5, - h6 { - font-weight: 600; + font-weight: 500; margin-top: 1.5rem; + font-size: 1rem; } img { From 8e1830de33964a44e39ac7485f2abd810e2941b4 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 1 Jun 2020 20:46:20 +0530 Subject: [PATCH 52/99] refactor: remove featured tag --- .../blog_post/templates/blog_post.html | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/frappe/website/doctype/blog_post/templates/blog_post.html b/frappe/website/doctype/blog_post/templates/blog_post.html index df0300ff23..2bb4b6025b 100644 --- a/frappe/website/doctype/blog_post/templates/blog_post.html +++ b/frappe/website/doctype/blog_post/templates/blog_post.html @@ -18,21 +18,12 @@

    {{ blog_intro }}

    -
    -
    - {{ frappe.format_date(published_on) }} - {% if read_time %} - · - {{ read_time }} min read - {% endif %} -
    -
    - {%-if featured -%} -
    - {{ _("Featured") }} -
    - {%- endif -%} -
    +
    + {{ frappe.format_date(published_on) }} + {% if read_time %} + · + {{ read_time }} min read + {% endif %}
    From 5cbb72a0eedce3bf6b368a1f5aae034ce2ebb241 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 1 Jun 2020 20:46:29 +0530 Subject: [PATCH 53/99] refactor: style for hr and blockquote --- frappe/public/scss/blog.scss | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/frappe/public/scss/blog.scss b/frappe/public/scss/blog.scss index 92a86d6c95..888d699457 100644 --- a/frappe/public/scss/blog.scss +++ b/frappe/public/scss/blog.scss @@ -31,6 +31,10 @@ margin-top: 1rem; } + hr { + margin: 2rem auto; + } + h1 { margin-top: 2rem; font-weight: 800; @@ -76,9 +80,11 @@ margin: 2rem auto; width: 90%; padding-top: 2rem; - padding-bottom: 2rem; + padding-bottom: 0.8rem; + border-top: 1px solid $gray-200; border-bottom: 1px solid $gray-200; + text-align: center; font-size: 1.2rem; font-weight: 500; From fb74a095385154bac1ab64f82eedad49bc7b24a6 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Tue, 2 Jun 2020 13:08:35 +0530 Subject: [PATCH 54/99] refactor: use custom rules instead of utility classes --- frappe/public/scss/blog.scss | 58 ++++++++++++++++++- .../blog_post/templates/blog_post.html | 8 +-- .../blog_post/templates/blog_post_list.html | 2 +- .../blog_post/templates/blog_post_row.html | 8 +-- 4 files changed, 66 insertions(+), 10 deletions(-) diff --git a/frappe/public/scss/blog.scss b/frappe/public/scss/blog.scss index 888d699457..b2ddece217 100644 --- a/frappe/public/scss/blog.scss +++ b/frappe/public/scss/blog.scss @@ -1,3 +1,43 @@ +.blog-list { + display: flex; + flex-wrap: wrap; + margin-right: -15px; + margin-left: -15px; +} + +.blog-card { + margin-bottom: 3rem; + position: relative; + width: 100%; + padding-right: 15px; + padding-left: 15px; + + flex: 0 0 33.33333%; + max-width: 33.33333%; + + &.featured { + flex: 0 0 66.66667%; + max-width: 66.66667%; + } + + .card-body { + display: flex; + flex-direction: column; + justify-content: space-between; + } + + .blog-card-footer { + display: flex; + align-items: center; + margin-top: 0.5rem; + + .avatar { + margin-right: 0.5rem; + border-radius: 50%; + } + } +} + .card-img-top { width: 100%; overflow: hidden; @@ -15,6 +55,22 @@ max-width: 800px; margin: 0px auto; + .blog-content { + margin-bottom: 1rem; + + .blog-header { + margin-bottom: 3rem; + margin-top: 3rem; + } + } + + .blog-footer { + display: flex; + justify-content: space-between; + color: #8d99a6; + margin-top: 3rem; + } + .blog-intro { font-size: 1.25rem; font-weight: 300; @@ -41,7 +97,7 @@ font-size: 2rem; } - h1.blog-header { + h1.blog-title { margin-top: 2rem; font-weight: 800; font-size: 2.5rem; diff --git a/frappe/website/doctype/blog_post/templates/blog_post.html b/frappe/website/doctype/blog_post/templates/blog_post.html index 2bb4b6025b..d335cb6613 100644 --- a/frappe/website/doctype/blog_post/templates/blog_post.html +++ b/frappe/website/doctype/blog_post/templates/blog_post.html @@ -6,15 +6,15 @@ {% block page_content %}
    -
    +
    -
    +
    -

    {{ title }}

    +

    {{ title }}

    {{ blog_intro }}

    @@ -44,7 +44,7 @@ ]) }} {% endif %} -
    +
    - {% if enable_cta %} + {%- if enable_cta -%} {{ web_blocks([ { 'template': "Section With Small CTA", @@ -43,10 +43,10 @@ } ]) }} - {% endif %} + {%- endif -%}