j1-template 2023.2.6 → 2023.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/_includes/themes/j1/layouts/content_generator_news_panel_posts.html +2 -1
- data/_includes/themes/j1/layouts/content_generator_post.html +2 -2
- data/_includes/themes/j1/layouts/layout_metadata_generator.html +41 -38
- data/_includes/themes/j1/procedures/blocks/footer/boxes/about_box.proc +1 -1
- data/_includes/themes/j1/procedures/blocks/footer/boxes/contacts_box.proc +1 -1
- data/_includes/themes/j1/procedures/blocks/footer/boxes/issue.proc +1 -1
- data/_includes/themes/j1/procedures/blocks/footer/boxes/links_box.proc +1 -1
- data/_includes/themes/j1/procedures/blocks/footer/boxes/news_box.proc +1 -1
- data/_includes/themes/j1/procedures/layouts/default_writer.proc +1 -3
- data/_includes/themes/j1/procedures/layouts/module_writer.proc +7 -23
- data/_includes/themes/j1/procedures/layouts/resource_writer.proc +8 -8
- data/_layouts/compress.html +26 -21
- data/_layouts/default.html +36 -30
- data/assets/data/banner.html +5 -2
- data/assets/data/footer.html +15 -3
- data/assets/data/masterslider.html +1 -0
- data/assets/data/menu.html +4 -4
- data/assets/data/panel.html +6 -3
- data/assets/data/quicklinks.html +138 -149
- data/assets/error_pages/HTTP204.html +3 -3
- data/assets/error_pages/HTTP400.html +3 -3
- data/assets/error_pages/HTTP401.html +3 -3
- data/assets/error_pages/HTTP403.html +3 -3
- data/assets/error_pages/HTTP404.html +3 -3
- data/assets/error_pages/HTTP444.html +3 -3
- data/assets/error_pages/HTTP445.html +3 -3
- data/assets/error_pages/HTTP446.html +5 -5
- data/assets/error_pages/HTTP447.html +7 -7
- data/assets/error_pages/HTTP448.html +7 -7
- data/assets/error_pages/HTTP500.html +3 -3
- data/assets/error_pages/HTTP501.html +3 -3
- data/assets/error_pages/HTTP502.html +3 -3
- data/assets/error_pages/HTTP503.html +3 -3
- data/assets/themes/j1/adapter/js/advertising.js +109 -116
- data/assets/themes/j1/adapter/js/analytics.js +1 -1
- data/assets/themes/j1/adapter/js/asciidoctor.js +1 -1
- data/assets/themes/j1/adapter/js/attic.js +22 -14
- data/assets/themes/j1/adapter/js/bmd.js +1 -1
- data/assets/themes/j1/adapter/js/carousel.js +5 -4
- data/assets/themes/j1/adapter/js/clipboard.js +1 -1
- data/assets/themes/j1/adapter/js/comments.js +5 -5
- data/assets/themes/j1/adapter/js/cookieConsent.js +1 -1
- data/assets/themes/j1/adapter/js/customFunctions.js +1 -1
- data/assets/themes/j1/adapter/js/customModule.js +1 -1
- data/assets/themes/j1/adapter/js/dropdowns.js +4 -2
- data/assets/themes/j1/adapter/js/fab.js +9 -6
- data/assets/themes/j1/adapter/js/framer.js +1 -1
- data/assets/themes/j1/adapter/js/iconPicker.js +227 -0
- data/assets/themes/j1/adapter/js/j1.js +401 -76
- data/assets/themes/j1/adapter/js/justifiedGallery.js +9 -3
- data/assets/themes/j1/adapter/js/justifiedGalleryCustomizer.js +2 -2
- data/assets/themes/j1/adapter/js/lightbox.js +4 -3
- data/assets/themes/j1/adapter/js/logger.js +1 -1
- data/assets/themes/j1/adapter/js/lunr.js +1 -1
- data/assets/themes/j1/adapter/js/masonry.js +4 -3
- data/assets/themes/j1/adapter/js/masterslider.js +30 -57
- data/assets/themes/j1/adapter/js/mmenu.js +2 -2
- data/assets/themes/j1/adapter/js/navigator.js +7 -5
- data/assets/themes/j1/adapter/js/nbinteract.js +9 -9
- data/assets/themes/j1/adapter/js/particles.js +2 -2
- data/assets/themes/j1/adapter/js/rangeSlider.js +2 -2
- data/assets/themes/j1/adapter/js/rouge.js +2 -2
- data/assets/themes/j1/adapter/js/rtable.js +1 -1
- data/assets/themes/j1/adapter/js/rtextResizer.js +1 -1
- data/assets/themes/j1/adapter/js/scroller.js +97 -109
- data/assets/themes/j1/adapter/js/slick.js +28 -18
- data/assets/themes/j1/adapter/js/themeToggler.js +259 -0
- data/assets/themes/j1/adapter/js/themer.js +17 -8
- data/assets/themes/j1/adapter/js/toccer.js +9 -6
- data/assets/themes/j1/adapter/js/translator.js +4 -2
- data/assets/themes/j1/adapter/js/waves.js +6 -4
- data/assets/themes/j1/core/css/themes/bootstrap/bootstrap.css +1322 -417
- data/assets/themes/j1/core/css/themes/bootstrap/bootstrap.min.css +3 -3
- data/assets/themes/j1/core/css/themes/unodark/bootstrap.css +1983 -1266
- data/assets/themes/j1/core/css/themes/unodark/bootstrap.min.css +3 -3
- data/assets/themes/j1/core/css/themes/unolight/bootstrap.css +10268 -9402
- data/assets/themes/j1/core/css/themes/unolight/bootstrap.min.css +10 -10
- data/assets/themes/j1/core/css/vendor.css +0 -14
- data/assets/themes/j1/core/css/vendor.min.css +1 -1
- data/assets/themes/j1/modules/advertising/js/adInitializer.js +160 -0
- data/assets/themes/j1/modules/backstretch/js/backstretch.js +6 -4
- data/assets/themes/j1/modules/backstretch/js/backstretch.min.js +1 -1
- data/assets/themes/j1/modules/deeplAPI/js/deeplAPI.js +1 -1
- data/assets/themes/j1/modules/deeplAPI/js/deeplAPI.min.js +1 -1
- data/assets/themes/j1/modules/iconPicker/README.md +266 -0
- data/assets/themes/j1/modules/iconPicker/css/universal-icon-picker.css +419 -0
- data/assets/themes/j1/modules/iconPicker/css/universal-icon-picker.min.css +17 -0
- data/assets/themes/j1/modules/iconPicker/icons-libraries/font-awesome-brands.json +467 -0
- data/assets/themes/j1/modules/iconPicker/icons-libraries/font-awesome-brands.min.json +1 -0
- data/assets/themes/j1/modules/iconPicker/icons-libraries/font-awesome-regular.json +169 -0
- data/assets/themes/j1/modules/iconPicker/icons-libraries/font-awesome-regular.min.json +1 -0
- data/assets/themes/j1/modules/iconPicker/icons-libraries/font-awesome-solid.json +1136 -0
- data/assets/themes/j1/modules/iconPicker/icons-libraries/font-awesome-solid.min.json +1 -0
- data/assets/themes/j1/modules/iconPicker/icons-libraries/font-awesome.json +1772 -0
- data/assets/themes/j1/modules/iconPicker/icons-libraries/font-awesome.min.json +1 -0
- data/assets/themes/j1/modules/iconPicker/icons-libraries/mdi-icons-light.json +292 -0
- data/assets/themes/j1/modules/iconPicker/icons-libraries/mdi-icons-light.min.json +1 -0
- data/assets/themes/j1/modules/iconPicker/icons-libraries/mdi-icons-regular.json +7312 -0
- data/assets/themes/j1/modules/iconPicker/icons-libraries/mdi-icons-regular.min.json +1 -0
- data/assets/themes/j1/modules/iconPicker/images/magnifying-glass-solid.svg +1 -0
- data/assets/themes/j1/modules/iconPicker/images/star-of-life-solid.svg +3 -0
- data/assets/themes/j1/modules/iconPicker/images/xmark-solid.svg +3 -0
- data/assets/themes/j1/modules/iconPicker/js/universal-icon-picker.js +493 -0
- data/assets/themes/j1/modules/iconPicker/js/universal-icon-picker.min.js +17 -0
- data/assets/themes/j1/modules/jquery/AUTHORS.txt +372 -0
- data/assets/themes/j1/modules/jquery/LICENSE.txt +43 -0
- data/assets/themes/j1/modules/jquery/css/images/ui-icons_444444_256x240.png +0 -0
- data/assets/themes/j1/modules/jquery/css/images/ui-icons_555555_256x240.png +0 -0
- data/assets/themes/j1/modules/jquery/css/images/ui-icons_777620_256x240.png +0 -0
- data/assets/themes/j1/modules/jquery/css/images/ui-icons_777777_256x240.png +0 -0
- data/assets/themes/j1/modules/jquery/css/images/ui-icons_cc0000_256x240.png +0 -0
- data/assets/themes/j1/modules/jquery/css/images/ui-icons_ffffff_256x240.png +0 -0
- data/assets/themes/j1/modules/jquery/css/jquery-ui/jquery-ui.css +92 -92
- data/assets/themes/j1/modules/jquery/css/jquery-ui/jquery-ui.min.css +4 -4
- data/assets/themes/j1/modules/jquery/css/jquery-ui/jquery-ui.structure.css +88 -88
- data/assets/themes/j1/modules/jquery/css/jquery-ui/jquery-ui.structure.min.css +2 -2
- data/assets/themes/j1/modules/jquery/css/jquery-ui/jquery-ui.theme.css +4 -4
- data/assets/themes/j1/modules/jquery/css/jquery-ui/jquery-ui.theme.min.css +2 -2
- data/assets/themes/j1/modules/jquery/js/jquery-ui.js +13683 -13678
- data/assets/themes/j1/modules/jquery/js/jquery-ui.min.js +3 -3
- data/assets/themes/j1/modules/jquery/js/jquery.js +1029 -1203
- data/assets/themes/j1/modules/jquery/js/jquery.min.js +2 -2
- data/assets/themes/j1/modules/jquery/js/jquery.min.map +1 -1
- data/assets/themes/j1/modules/jquery-3.5.1/css/jquery-ui/jquery-ui.css +1315 -0
- data/assets/themes/j1/modules/jquery-3.5.1/css/jquery-ui/jquery-ui.min.css +7 -0
- data/assets/themes/j1/modules/jquery-3.5.1/css/jquery-ui/jquery-ui.structure.css +886 -0
- data/assets/themes/j1/modules/jquery-3.5.1/css/jquery-ui/jquery-ui.structure.min.css +5 -0
- data/assets/themes/j1/modules/jquery-3.5.1/css/jquery-ui/jquery-ui.theme.css +446 -0
- data/assets/themes/j1/modules/jquery-3.5.1/css/jquery-ui/jquery-ui.theme.min.css +5 -0
- data/assets/themes/j1/modules/jquery-3.5.1/js/extensions/hasClass.js +37 -0
- data/assets/themes/j1/modules/jquery-3.5.1/js/extensions/hasClass.min.js +17 -0
- data/assets/themes/j1/modules/jquery-3.5.1/js/extensions/removeClass.js +42 -0
- data/assets/themes/j1/modules/jquery-3.5.1/js/extensions/removeClass.min.js +17 -0
- data/assets/themes/j1/modules/jquery-3.5.1/js/jquery-ui.js +19057 -0
- data/assets/themes/j1/modules/jquery-3.5.1/js/jquery-ui.min.js +6 -0
- data/assets/themes/j1/modules/jquery-3.5.1/js/jquery.js +10872 -0
- data/assets/themes/j1/modules/jquery-3.5.1/js/jquery.min.js +2 -0
- data/assets/themes/j1/modules/jquery-3.5.1/js/jquery.min.map +1 -0
- data/assets/themes/j1/modules/jquery-3.5.1/js/require.js +2145 -0
- data/assets/themes/j1/modules/jquery-3.5.1/js/require.min.js +5 -0
- data/assets/themes/j1/modules/lightGallery/js/modules/j1/j1-video.js +2 -2
- data/assets/themes/j1/modules/lightGallery/js/modules/j1/j1-video.min.js +1 -1
- data/assets/themes/j1/modules/masterslider/css/theme/uno.css +9 -9
- data/assets/themes/j1/modules/masterslider/css/theme/uno.min.css +1 -1
- data/assets/themes/j1/modules/mmenuLight/css/theme/uno/mmenu.css +2 -2
- data/assets/themes/j1/modules/mmenuLight/css/theme/uno/mmenu.min.css +1 -1
- data/assets/themes/j1/modules/rouge/css/uno.dark/theme.css +136 -47
- data/assets/themes/j1/modules/rouge/css/uno.light/theme.css +9 -9
- data/assets/themes/j1/modules/scroller/js/scroller.js +76 -69
- data/assets/themes/j1/modules/scroller/js/scroller.min.js +1 -1
- data/assets/themes/j1/modules/translator/js/translator.js +1 -1
- data/assets/themes/j1/modules/translator/js/translator.min.js +1 -1
- data/lib/j1/version.rb +1 -1
- data/lib/starter_web/Gemfile +2 -2
- data/lib/starter_web/README.md +5 -5
- data/lib/starter_web/_config.yml +4 -1
- data/lib/starter_web/_data/blocks/banner.yml +8 -5
- data/lib/starter_web/_data/blocks/defaults/footer.yml +3 -3
- data/lib/starter_web/_data/blocks/footer.yml +9 -5
- data/lib/starter_web/_data/blocks/panel.yml +41 -38
- data/lib/starter_web/_data/j1_config.yml +68 -58
- data/lib/starter_web/_data/layouts/collection.yml +1 -0
- data/lib/starter_web/_data/layouts/default.yml +1 -1
- data/lib/starter_web/_data/layouts/home.yml +9 -9
- data/lib/starter_web/_data/layouts/news_panel_posts.yml +1 -0
- data/lib/starter_web/_data/layouts/page.yml +2 -1
- data/lib/starter_web/_data/layouts/post.yml +1 -0
- data/lib/starter_web/_data/layouts/raw.yml +1 -0
- data/lib/starter_web/_data/modules/advertising.yml +134 -61
- data/lib/starter_web/_data/modules/analytics.yml +2 -2
- data/lib/starter_web/_data/modules/attics.yml +4 -7
- data/lib/starter_web/_data/modules/defaults/advertising.yml +2 -1
- data/lib/starter_web/_data/modules/defaults/attics.yml +3 -3
- data/lib/starter_web/_data/modules/defaults/iconPicker.yml +42 -0
- data/lib/starter_web/_data/modules/defaults/navigator.yml +15 -13
- data/lib/starter_web/_data/modules/defaults/theme_toggler.yml +42 -0
- data/lib/starter_web/_data/modules/iconPicker.yml +64 -0
- data/lib/starter_web/_data/modules/masonry.yml +1 -1
- data/lib/starter_web/_data/modules/masterslider.yml +5 -5
- data/lib/starter_web/_data/modules/navigator_menu.yml +150 -41
- data/lib/starter_web/_data/modules/scroller.yml +8 -8
- data/lib/starter_web/_data/modules/theme_toggler.yml +29 -0
- data/lib/starter_web/_data/modules/themer.yml +0 -6
- data/lib/starter_web/_data/resources.yml +53 -52
- data/lib/starter_web/_data/templates/feed.xml +1 -1
- data/lib/starter_web/_includes/attributes.asciidoc +57 -50
- data/lib/starter_web/_plugins/asciidoctor/google-ad-block.rb +47 -0
- data/lib/starter_web/_plugins/index/lunr.rb +1 -1
- data/lib/starter_web/assets/images/icons/mdi/mdi.svg +1 -0
- data/lib/starter_web/assets/images/icons/mdi/mdil.svg +1 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/alexander-redl.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/alina-grubnyak.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/andrea-badino.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/brad-neathery.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/bruno-figueiredo.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/clem-onojeghuo.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/core_web_vitals_best.png +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/crawford-jolly.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/eleni-afiontzi.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/fly-d.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/guillaume-bolduc.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/harpal-singh.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/hayden-mills-2.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/j1-content-mockup-1.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/j1-content-mockup-2.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/j1-content-mockup-3.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/j1-starter-mockup-1.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/john-schnobrich-2.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/josep-martins.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/josh-liu.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/kelly-sikkemal.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/kira-auf-der-heide.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/kristopher-roller.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/kristopher-roller.webp +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/matthaeus.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/melanie-deziel.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/milad-fakurian.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/mohammad-rahmani.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/nasa.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/quino-al-2.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/1920x1280/recha-oktaviani.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/building-blocks-1920x1280.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/christina-1920x1280.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/cookies-1920x1200.jpg +0 -0
- data/lib/starter_web/assets/images/modules/attics/katie-moum-1920x1280.jpg +0 -0
- data/lib/starter_web/assets/images/pages/core_web_vitals/core_web_vitals_best.jpg +0 -0
- data/lib/starter_web/assets/images/pages/core_web_vitals/core_web_vitals_best.png +0 -0
- data/lib/starter_web/assets/images/pages/core_web_vitals/core_web_vitals_best_full.png +0 -0
- data/lib/starter_web/assets/images/pages/html_validator/appdevtools-html-validator.jpg +0 -0
- data/lib/starter_web/assets/images/pages/html_validator/freeformatter-html-validator.jpg +0 -0
- data/lib/starter_web/assets/images/pages/html_validator/w3c-nu-checker.jpg +0 -0
- data/lib/starter_web/assets/images/pages/html_validator/w3c-validator.jpg +0 -0
- data/lib/starter_web/collections/_biography/a-life-in-questions.adoc +8 -9
- data/lib/starter_web/collections/_biography/becoming.adoc +22 -9
- data/lib/starter_web/collections/_biography/born-to-run.adoc +27 -9
- data/lib/starter_web/collections/_biography/forty-autumns.adoc +19 -12
- data/lib/starter_web/collections/_biography/not-dead-yet.adoc +24 -14
- data/lib/starter_web/collections/_biography/princess-diarist-the.adoc +23 -14
- data/lib/starter_web/collections/_biography/when-breath-becomes-air.adoc +24 -11
- data/lib/starter_web/collections/_fantasy/harry-potter-deathly-hallows.adoc +14 -10
- data/lib/starter_web/collections/_fantasy/harry-potter-philosophers-stone.adoc +11 -8
- data/lib/starter_web/collections/_fantasy/mistborn-trilogy.adoc +7 -8
- data/lib/starter_web/collections/_fantasy/ready-player-one.adoc +17 -14
- data/lib/starter_web/collections/_fantasy/sword-of-destiny.adoc +12 -13
- data/lib/starter_web/collections/_fantasy/terry-pratchet-diary.adoc +15 -15
- data/lib/starter_web/collections/_people/diana-petersen.adoc +2 -0
- data/lib/starter_web/collections/_people/larry-parker.adoc +2 -0
- data/lib/starter_web/collections/_people/parveen-anand.adoc +2 -0
- data/lib/starter_web/collections/_portfolio/branding.adoc +5 -0
- data/lib/starter_web/collections/_portfolio/graphic_design.adoc +5 -0
- data/lib/starter_web/collections/_portfolio/identity.adoc +5 -0
- data/lib/starter_web/collections/_portfolio/illustration.adoc +5 -0
- data/lib/starter_web/collections/_portfolio/photography.adoc +5 -0
- data/lib/starter_web/collections/_portfolio/web_design.adoc +5 -0
- data/lib/starter_web/collections/_romance/breath-of-snow-and-ashes-a.adoc +8 -5
- data/lib/starter_web/collections/_romance/dressmaker-the.adoc +14 -14
- data/lib/starter_web/collections/_romance/fiery-cross-the.adoc +12 -9
- data/lib/starter_web/collections/_romance/it-ends-with-us.adoc +14 -11
- data/lib/starter_web/collections/_romance/outlander-novel.adoc +48 -25
- data/lib/starter_web/collections/_romance/virgins-outlander-short-story.adoc +30 -15
- data/lib/starter_web/index.html +6 -14
- data/lib/starter_web/package.json +3 -3
- data/lib/starter_web/pages/public/about/features.adoc +1 -4
- data/lib/starter_web/pages/public/about/reporting_issues.adoc +1 -3
- data/lib/starter_web/pages/public/blog/navigator/archive/allview.html +0 -5
- data/lib/starter_web/pages/public/blog/navigator/archive/categoryview.html +0 -4
- data/lib/starter_web/pages/public/blog/navigator/archive/dateview.html +0 -5
- data/lib/starter_web/pages/public/blog/navigator/archive/tagview.html +0 -5
- data/lib/starter_web/pages/public/blog/navigator/index.html +2 -6
- data/lib/starter_web/pages/public/features/general.adoc +0 -4
- data/lib/starter_web/pages/public/features/template.adoc +0 -4
- data/lib/starter_web/pages/public/learn/bookshelf/article_previewer/viewer_all_books.adoc +1 -3
- data/lib/starter_web/pages/public/learn/bookshelf/article_previewer/viewer_biography.adoc +1 -1
- data/lib/starter_web/pages/public/learn/bookshelf/article_previewer/viewer_fantasy.adoc +1 -1
- data/lib/starter_web/pages/public/learn/bookshelf/article_previewer/viewer_romance.adoc +1 -2
- data/lib/starter_web/pages/public/learn/bookshelf/jekyll_collections.adoc +75 -66
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/attributes.asciidoc +58 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/accordion.asciidoc +34 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/alerts.asciidoc +15 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/badges.asciidoc +9 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/body.asciidoc +14 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/breadcrumbs.asciidoc +14 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/buttons.asciidoc +75 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/cards.asciidoc +22 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/carousel.asciidoc +37 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/close.asciidoc +15 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/code.asciidoc +14 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/color_system.asciidoc +353 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/components.asciidoc +69 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/dropdowns.asciidoc +53 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/figures.asciidoc +5 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/forms.asciidoc +270 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/grid.asciidoc +49 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/links.asciidoc +21 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/list_groups.asciidoc +28 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/modals.asciidoc +43 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/navbar.asciidoc +45 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/navs.asciidoc +28 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/offcanvas.asciidoc +16 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/options.asciidoc +30 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/pagination.asciidoc +40 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/paragraph.asciidoc +5 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/placeholders.asciidoc +5 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/popovers.asciidoc +28 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/position.asciidoc +8 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/progress_bars.asciidoc +12 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/spacing.asciidoc +14 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/spinners.asciidoc +12 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/tables.asciidoc +55 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/thumbnails.asciidoc +9 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/toasts.asciidoc +18 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/tooltips.asciidoc +28 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/typography.asciidoc +115 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/documents/z_index.asciidoc +26 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/tables/_table.asciidoc +9 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/_includes/tables/accordion.asciidoc +87 -0
- data/lib/starter_web/pages/public/learn/bs_sass_variables/bs_sass_variables.adoc +262 -0
- data/lib/starter_web/pages/public/learn/cheatsheet/gem.adoc +255 -0
- data/lib/starter_web/pages/public/learn/cheatsheet/git.adoc +1458 -0
- data/lib/starter_web/pages/public/learn/cheatsheet/j1.adoc +63 -0
- data/lib/starter_web/pages/public/learn/cheatsheet/yaml.adoc +514 -0
- data/lib/starter_web/pages/public/learn/core_web_vitals/_includes/attributes.asciidoc +59 -0
- data/lib/starter_web/pages/public/learn/core_web_vitals/_includes/documents/100_chapter.asciidoc +541 -0
- data/lib/starter_web/pages/public/learn/core_web_vitals/_includes/documents/200_chapter.asciidoc +33 -0
- data/lib/starter_web/pages/public/learn/core_web_vitals/_includes/tables/build_command_options.asciidoc +72 -0
- data/lib/starter_web/pages/public/learn/core_web_vitals/_includes/tables/files_and_folders.asciidoc +66 -0
- data/lib/starter_web/pages/public/learn/core_web_vitals/_includes/tables/global_configuration_options.asciidoc +63 -0
- data/lib/starter_web/pages/public/learn/core_web_vitals/_includes/tables/global_variables.asciidoc +26 -0
- data/lib/starter_web/pages/public/learn/core_web_vitals/_includes/tables/page_variables.asciidoc +54 -0
- data/lib/starter_web/pages/public/learn/core_web_vitals/_includes/tables/serve_command_options.asciidoc +45 -0
- data/lib/starter_web/pages/public/learn/core_web_vitals/_includes/tables/site_variables.asciidoc +59 -0
- data/lib/starter_web/pages/public/learn/core_web_vitals/core_web_vitals.adoc +442 -0
- data/lib/starter_web/pages/public/learn/roundtrip/_includes/attributes.asciidoc +1 -1
- data/lib/starter_web/pages/public/learn/roundtrip/_includes/documents/100_gistblock.asciidoc +3 -4
- data/lib/starter_web/pages/public/learn/roundtrip/asciidoc_extensions.adoc +2 -2
- data/lib/starter_web/pages/public/learn/roundtrip/icon_fonts.adoc +10 -10
- data/lib/starter_web/pages/public/learn/roundtrip/lunr_search.adoc +0 -2
- data/lib/starter_web/pages/public/learn/roundtrip/present_images.adoc +8 -2
- data/lib/starter_web/pages/public/learn/roundtrip/responsive_tables.adoc +3 -7
- data/lib/starter_web/pages/public/learn/where_to_go.adoc +39 -45
- data/lib/starter_web/pages/public/legal/en/100_copyright.adoc +2 -6
- data/lib/starter_web/pages/public/legal/en/200_impress.adoc +0 -1
- data/lib/starter_web/pages/public/legal/en/300_privacy.adoc +2 -6
- data/lib/starter_web/pages/public/legal/en/400_comment_policy.adoc +2 -6
- data/lib/starter_web/pages/public/panels/intro_panel/panel.adoc +0 -2
- data/lib/starter_web/pages/public/plans/plans.adoc +0 -2
- data/lib/starter_web/pages/public/previewer/preview_bootstrap_theme.adoc +93 -7
- data/lib/starter_web/utilsrv/_defaults/package.json +1 -1
- data/lib/starter_web/utilsrv/package.json +1 -1
- metadata +133 -24
- data/_includes/themes/j1/modules/ads/google_ad_content_home.html +0 -11
- data/_includes/themes/j1/modules/ads/google_ad_top_home.html +0 -11
- data/assets/themes/j1/core/css/nbinteract-tutorial/styles.css +0 -1711
- data/assets/themes/j1/core/css/nbinteract-tutorial/styles.min.css +0 -1
- data/assets/themes/j1/modules/advertising/js/google/adInitializer.js +0 -127
- data/assets/themes/j1/modules/deeplAPI/js/deeplAPI.2.js +0 -460
- data/assets/themes/j1/modules/mdiPreviewer/css/previewer.css +0 -97
- data/assets/themes/j1/modules/mdiPreviewer/css/previewer.min.css +0 -15
- data/assets/themes/j1/modules/mdiPreviewer/js/previewer.js +0 -115
- data/assets/themes/j1/modules/mdiPreviewer/js/previewer.min.js +0 -15
- data/assets/themes/j1/modules/mdilPreviewer/css/previewer.css +0 -97
- data/assets/themes/j1/modules/mdilPreviewer/css/previewer.min.css +0 -15
- data/assets/themes/j1/modules/mdilPreviewer/js/previewer.js +0 -125
- data/assets/themes/j1/modules/mdilPreviewer/js/previewer.min.js +0 -15
- data/lib/starter_web/_includes/themes/j1/modules/ads/google_ad_content_home.html +0 -11
- data/lib/starter_web/_includes/themes/j1/modules/ads/google_ad_top_home.html +0 -11
- /data/lib/starter_web/assets/images/{promo → quotes/promo}/home/screenshot.jpg +0 -0
- /data/lib/starter_web/assets/images/{promo → quotes/promo}/jekyll/jekyll-faq.jpg +0 -0
- /data/lib/starter_web/assets/images/{promo → quotes/promo}/jekyll/jekyll-generator.jpg +0 -0
- /data/lib/starter_web/assets/images/{promo → quotes/promo}/jekyll/jekyll-generator.png +0 -0
- /data/lib/starter_web/assets/images/{promo → quotes/promo}/jekyll/jekyll-og.png +0 -0
- /data/lib/starter_web/assets/images/{promo → quotes/promo}/jekyll/scalable/jekyll-faq.psd +0 -0
@@ -0,0 +1,63 @@
|
|
1
|
+
|
2
|
+
.Global Configuration Options
|
3
|
+
[cols="2a,2a,2a,6a", width="100%", options="header", role="rtable mt-4"]
|
4
|
+
|===
|
5
|
+
|Setting |Option |Flag |Description
|
6
|
+
|
7
|
+
|*Site Source*
|
8
|
+
|`source: DIR`
|
9
|
+
|`-s, --source DIR`
|
10
|
+
|Change the directory where Jekyll will read files
|
11
|
+
|
12
|
+
|*Site Destination*
|
13
|
+
|`destination: DIR` +
|
14
|
+
|`-d, --destination DIR`
|
15
|
+
|Change the directory where Jekyll will write files
|
16
|
+
|
17
|
+
|*Safe*
|
18
|
+
|`safe: BOOL`
|
19
|
+
|`--safe`
|
20
|
+
|Disable non-whitelisted plugins, caching to disk, and ignore symbolic links.
|
21
|
+
|
22
|
+
|*Exclude*
|
23
|
+
|`exclude: [DIR, FILE, ...]`
|
24
|
+
|`na`
|
25
|
+
|Exclude directories and/or files from the conversion. These exclusions
|
26
|
+
are relative to the site's source directory and cannot be outside the
|
27
|
+
source directory.
|
28
|
+
|
29
|
+
|*Include*
|
30
|
+
|`include: [DIR, FILE, ...]`
|
31
|
+
|`na`
|
32
|
+
|Force inclusion of directories and/or files in the conversion.
|
33
|
+
The file `.htaccess` is a good example since dotfiles are excluded
|
34
|
+
by default.
|
35
|
+
|
36
|
+
|*Keep files*
|
37
|
+
|`keep_files: [DIR, FILE, ...]`
|
38
|
+
|`na`
|
39
|
+
|When clobbering the site destination, keep the selected files. Useful
|
40
|
+
for files that are not generated by jekyll; e.g. files or assets that
|
41
|
+
are generated by your build tool. The paths are relative to the
|
42
|
+
`destination`.
|
43
|
+
|
44
|
+
|*Time Zone*
|
45
|
+
|`timezone: TIMEZONE`
|
46
|
+
|`na`
|
47
|
+
|Set the time zone for site generation. This sets the `TZ` environment
|
48
|
+
variable, which Ruby uses to handle time and date creation and
|
49
|
+
manipulation. Any entry from the
|
50
|
+
https://en.wikipedia.org/wiki/Tz_database[IANA Time Zone Database, {browser-window--new}]
|
51
|
+
is valid, e.g. `America/New_York`. A list of all available values can be
|
52
|
+
found from
|
53
|
+
https://en.wikipedia.org/wiki/List_of_tz_database_time_zones[here, {browser-window--new}].
|
54
|
+
The default is the local time zone, as set by your operating system.
|
55
|
+
|
56
|
+
|*Encoding*
|
57
|
+
|`encoding: ENCODING`
|
58
|
+
|`na`
|
59
|
+
|Set the encoding of files by name (only available for Ruby 1.9 or later).
|
60
|
+
The default value is `utf-8` starting in 2.0.0, and `nil` before 2.0.0,
|
61
|
+
which will yield the Ruby default of `ASCII-8BIT`.
|
62
|
+
|
63
|
+
|===
|
data/lib/starter_web/pages/public/learn/core_web_vitals/_includes/tables/global_variables.asciidoc
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
.Global Variables
|
3
|
+
[cols="4a,8a", width="100%", options="header", role="rtable mt-4"]
|
4
|
+
|===
|
5
|
+
|Variable |Description
|
6
|
+
|
7
|
+
|`site`
|
8
|
+
|Sitewide configuration settings from `_config.yml`.
|
9
|
+
|
10
|
+
|`page`
|
11
|
+
|Page specific information. Custom variables set via the YAML Front Matter
|
12
|
+
will be available here.
|
13
|
+
|
14
|
+
|`layout`
|
15
|
+
|Layout specific information. Custom variables set via the YAML Front Matter
|
16
|
+
in layouts will be available here.
|
17
|
+
|
18
|
+
|`content`
|
19
|
+
|In layout files, the rendered content of the Post or Page being wrapped.
|
20
|
+
Not defined in Post or Page files.
|
21
|
+
|
22
|
+
|`paginator`
|
23
|
+
|When the `paginate` configuration option is set, this variable becomes
|
24
|
+
available for use.
|
25
|
+
|
26
|
+
|===
|
data/lib/starter_web/pages/public/learn/core_web_vitals/_includes/tables/page_variables.asciidoc
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
|
2
|
+
.Page Variables
|
3
|
+
[cols="4a,8a", width="100%", options="header", role="rtable mt-4"]
|
4
|
+
|===
|
5
|
+
|Variable |Description
|
6
|
+
|
7
|
+
|`page.content`
|
8
|
+
|The content of the Page, rendered or un-rendered depending upon what Liquid
|
9
|
+
is being processed and what `page` is.
|
10
|
+
|
11
|
+
|`page.title`
|
12
|
+
|The title of the Page.
|
13
|
+
|
14
|
+
|`page.excerpt`
|
15
|
+
|The un-rendered excerpt of the Page.
|
16
|
+
|
17
|
+
|`page.url`
|
18
|
+
|The URL of the Post without the domain, but with a leading slash, e.g.
|
19
|
+
`/2008/12/14/my-post.html`
|
20
|
+
|
21
|
+
|`page.date`
|
22
|
+
|The Date assigned to the Post. This can be overridden in a
|
23
|
+
Post's front matter by specifying a new date/time in the format
|
24
|
+
`YYYY-MM-DD HH:MM:SS` (assuming UTC), or `YYYY-MM-DD HH:MM:SS +/-TTTT`
|
25
|
+
(to specify a time zone using an offset from UTC. e.g.
|
26
|
+
`2008-12-14 10:30:00 +0900`).
|
27
|
+
|
28
|
+
|`page.id`
|
29
|
+
|An identifier unique to the Post (useful in RSS feeds). e.g.
|
30
|
+
`/2008/12/14/my-post`
|
31
|
+
|
32
|
+
|`page.categories`
|
33
|
+
|The list of categories to which this post belongs. Categories are derived
|
34
|
+
from the directory structure above the `_posts` directory. For example, a
|
35
|
+
post at `/work/code/_posts/2008-12-24-closures.md` would have this field set
|
36
|
+
to `['work', 'code']`. These can also be specified in the *YAML Front Matter*.
|
37
|
+
|
38
|
+
|`page.tags`
|
39
|
+
|The list of tags to which this post belongs. These can be specified in the
|
40
|
+
*YAML Front Matter*.
|
41
|
+
|
42
|
+
|`page.path`
|
43
|
+
|The path to the raw post or page. Example usage: Linking back to the page or
|
44
|
+
post's source on GitHub. This can be overridden in the *YAML Front Matter*.
|
45
|
+
|
46
|
+
|`page.next`
|
47
|
+
|The next post relative to the position of the current post in `site.posts`.
|
48
|
+
Returns `nil` for the last entry.
|
49
|
+
|
50
|
+
|`page.previous`
|
51
|
+
|The previous post relative to the position of the current post in
|
52
|
+
`site.posts`. Returns `nil` for the first entry.
|
53
|
+
|
54
|
+
|===
|
@@ -0,0 +1,45 @@
|
|
1
|
+
|
2
|
+
.Serve Command Options
|
3
|
+
[cols="2a,2a,2a,6a", width="100%", options="header", role="rtable mt-4"]
|
4
|
+
|===
|
5
|
+
|Setting |Option |Flag |Description
|
6
|
+
|
7
|
+
|
8
|
+
|*Local Server Port*
|
9
|
+
|`port: PORT`
|
10
|
+
|`--port PORT`
|
11
|
+
|Listen on the given port.
|
12
|
+
|
13
|
+
|*Local Server Hostname*
|
14
|
+
|`host: HOSTNAME`
|
15
|
+
|`--host HOSTNAME`
|
16
|
+
|Listen at the given hostname.
|
17
|
+
|
18
|
+
|*Base URL*
|
19
|
+
|`baseurl: URL`
|
20
|
+
|`--baseurl URL`
|
21
|
+
|Serve the website from the given base URL
|
22
|
+
|
23
|
+
|*Detach*
|
24
|
+
|`detach: BOOL`
|
25
|
+
|`-B, --detach`
|
26
|
+
|Detach the server from the terminal to run the Jekyll executeable
|
27
|
+
in background.
|
28
|
+
NOTE: The parameter Detach is *not* available on _Windows_.
|
29
|
+
|
30
|
+
|*Skip the initial site build*
|
31
|
+
|`na`
|
32
|
+
|`--skip-initial-build`
|
33
|
+
|Skips the initial site build which occurs before the server is started
|
34
|
+
|
35
|
+
|*X.509 (SSL) Private Key*
|
36
|
+
|`na`
|
37
|
+
|`--ssl-key`
|
38
|
+
|SSL Private Key if HTTPS connections are used
|
39
|
+
|
40
|
+
|*X.509 (SSL) Certificate*
|
41
|
+
|`na`
|
42
|
+
|`--ssl-cert`
|
43
|
+
|SSL Public certificate if HTTPS connections are used
|
44
|
+
|
45
|
+
|===
|
data/lib/starter_web/pages/public/learn/core_web_vitals/_includes/tables/site_variables.asciidoc
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
|
2
|
+
.Site Variables
|
3
|
+
[cols="4a,8a", width="100%", options="header", role="rtable mt-4"]
|
4
|
+
|===
|
5
|
+
|Variable |Description
|
6
|
+
|
7
|
+
|`site.time`
|
8
|
+
|The current time (when you run the `jekyll` command).
|
9
|
+
|
10
|
+
|`site.pages`
|
11
|
+
|A list of all Pages.
|
12
|
+
|
13
|
+
|`site.posts`
|
14
|
+
|A reverse chronological list of all Posts.
|
15
|
+
|
16
|
+
|`site.related_posts`
|
17
|
+
|If the page being processed is a Post, this contains a list of up to ten
|
18
|
+
related Posts. By default, these are the ten most recent posts. For high
|
19
|
+
quality but slow to compute results, run the `jekyll` command with the `--lsi`
|
20
|
+
(https://en.wikipedia.org/wiki/Latent_semantic_analysis#Latent_semantic_indexing[latent semantic indexing])
|
21
|
+
option. Also note GitHub Pages does not support the `lsi` option when
|
22
|
+
generating sites.
|
23
|
+
|
24
|
+
|`site.static_files`
|
25
|
+
|A list of all (i.e. files not processed by Jekyll's converters or the Liquid
|
26
|
+
renderer). Each file has three properties: `path`, `modified_time` and
|
27
|
+
`extname`.
|
28
|
+
|
29
|
+
|`site.html_pages`
|
30
|
+
|A subset of `site.pages` listing those which end in `.html`.
|
31
|
+
|
32
|
+
|`site.html_files`
|
33
|
+
|A subset of `site.static_files` listing those which end in `.html`.
|
34
|
+
|
35
|
+
|`site.collections`
|
36
|
+
|A list of all the collections.
|
37
|
+
|
38
|
+
|`site.data`
|
39
|
+
|A list containing the data loaded from the YAML files located in the
|
40
|
+
`_data` directory.
|
41
|
+
|
42
|
+
|`site.documents`
|
43
|
+
|A list of all the documents in every collection.
|
44
|
+
|
45
|
+
|`site.categories.CATEGORY`
|
46
|
+
|The list of all Posts in category `CATEGORY`.
|
47
|
+
|
48
|
+
|`site.tags.TAG`
|
49
|
+
|The list of all Posts with tag `TAG`.
|
50
|
+
|
51
|
+
|`site.[CONFIGURATION_DATA]`
|
52
|
+
|All the variables set via the command line and your `_config.yml` are
|
53
|
+
available through the `site` variable. For example, if you have
|
54
|
+
`url: http://mysite.com` in your configuration file, then in your Posts and
|
55
|
+
Pages it will be stored in `site.url`. Jekyll does not parse changes to
|
56
|
+
`_config.yml` in `watch` mode, you must restart Jekyll to see changes to
|
57
|
+
variables.
|
58
|
+
|
59
|
+
|===
|
@@ -0,0 +1,442 @@
|
|
1
|
+
---
|
2
|
+
title: Core Web Vitals
|
3
|
+
tagline: Improve the user experience
|
4
|
+
date: 2023-06-07 00:00:00 +100
|
5
|
+
description: >
|
6
|
+
Optimizing the user experience you offer on your website is essential
|
7
|
+
for the success of any online business. Google does use different user
|
8
|
+
experience-related metrics to rank web pages for SEO and has continued
|
9
|
+
to provide multiple tools to measure and improve web performance.
|
10
|
+
|
11
|
+
keywords: >
|
12
|
+
Jekyll, Theme, JekyllOne, Turorial, SEO, Optimizing, User Experience,
|
13
|
+
Core Web Vitals, Speed Index
|
14
|
+
|
15
|
+
categories: [ Tutorial ]
|
16
|
+
tags: [ SEO, FCP, LCP, TBT, CLS, Speed Index ]
|
17
|
+
|
18
|
+
image:
|
19
|
+
path: /assets/images/modules/attics/leon-1920x1280.jpg
|
20
|
+
width: 1920
|
21
|
+
height: 1280
|
22
|
+
alt: Photo by Leon
|
23
|
+
|
24
|
+
fab_menu_id: open_toc
|
25
|
+
regenerate: true
|
26
|
+
permalink: /pages/public/learn/core_web_vitals/
|
27
|
+
|
28
|
+
resources: [ animate, clipboard, lightbox, rouge]
|
29
|
+
resource_options:
|
30
|
+
- attic:
|
31
|
+
slides:
|
32
|
+
- url: /assets/images/modules/attics/leon-1920x1280.jpg
|
33
|
+
alt: Photo by Leon
|
34
|
+
---
|
35
|
+
|
36
|
+
// Page Initializer
|
37
|
+
// =============================================================================
|
38
|
+
// Enable the Liquid Preprocessor
|
39
|
+
:page-liquid:
|
40
|
+
|
41
|
+
// Set (local) page attributes here
|
42
|
+
// -----------------------------------------------------------------------------
|
43
|
+
// :page--attr: <attr-value>
|
44
|
+
|
45
|
+
// Load Liquid procedures
|
46
|
+
// -----------------------------------------------------------------------------
|
47
|
+
{% capture load_attributes %}themes/{{site.template.name}}/procedures/global/attributes_loader.proc{%endcapture%}
|
48
|
+
|
49
|
+
// Load page attributes
|
50
|
+
// -----------------------------------------------------------------------------
|
51
|
+
{% include {{load_attributes}} scope="all" %}
|
52
|
+
|
53
|
+
|
54
|
+
// Page content
|
55
|
+
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
56
|
+
[role="dropcap"]
|
57
|
+
Optimizing the user experience you provide on your website is essential to
|
58
|
+
the success of any online business. Google uses various user experience-related
|
59
|
+
metrics to rank websites for SEO and continues to provide several tools to
|
60
|
+
measure and improve web performance.
|
61
|
+
|
62
|
+
// Include sub-documents (if any)
|
63
|
+
// -----------------------------------------------------------------------------
|
64
|
+
// See: https://css-tricks.com/improve-largest-contentful-paint-lcp-on-your-website-with-ease/
|
65
|
+
|
66
|
+
== Core Web Vitals
|
67
|
+
|
68
|
+
In its recent attempt to make measuring and understanding a good user
|
69
|
+
experience easier, _Google_ has standardized the site's user experience
|
70
|
+
metrics. These standardized metrics, called *Core Web Vitals*, help
|
71
|
+
evaluate the *real-world* user experience of a website.
|
72
|
+
|
73
|
+
*Core Web Vitals* is a set of specific website performance metrics introduced
|
74
|
+
by Google to measure and quantify the user experience of a web page. They
|
75
|
+
focus on key aspects of web *page loading*, *interactivity*, and
|
76
|
+
*visual stability*, which are crucial for providing a good user experience.
|
77
|
+
|
78
|
+
The Core Web Vitals *metrics* are:
|
79
|
+
|
80
|
+
* First Contentful Paint (FCP): `FCP` measures how long it takes the browser
|
81
|
+
to render the *first piece of DOM content* after a user navigates to your
|
82
|
+
page. Images, non-white `<canvas>` elements, and SVGs on your page are
|
83
|
+
considered DOM content; anything inside an iframe isn't included.
|
84
|
+
Values should less than *1.8 seconds*.
|
85
|
+
|
86
|
+
* Largest Contentful Paint (LCP): LCP measures the loading speed of
|
87
|
+
the main content on a web page. It represents the time taken for the
|
88
|
+
largest visible element, such as an image or a block of text, to be
|
89
|
+
rendered within the viewport. To provide a good user experience, the
|
90
|
+
`LCP` should occur within the first *2.5 seconds* of the page starting
|
91
|
+
to load.
|
92
|
+
|
93
|
+
* Total Blocking Time: `TBT` measures the total amount of time that a page
|
94
|
+
is blocked from responding to user input, such as mouse clicks, screen
|
95
|
+
taps, or keyboard presses. The sum is calculated by adding the blocking
|
96
|
+
portion of all *long tasks* between *First Contentful Paint* (FCP) and
|
97
|
+
*Time to Interactive*. Any task that executes for more than *50 ms* is a
|
98
|
+
*long task*. Values for `TBT` should in total less than
|
99
|
+
*200 milliseconds*.
|
100
|
+
|
101
|
+
* Cumulative Layout Shift (CLS): `CLS` measures the *visual* stability
|
102
|
+
of a web page. It quantifies how much the page layout *shifts* during
|
103
|
+
the loading process. Layout shifts can be disruptive, causing users
|
104
|
+
to accidentally click on the wrong elements or lose their place on
|
105
|
+
the page. A good user experience aims for a `CLS` score of less than
|
106
|
+
*0.1*.
|
107
|
+
|
108
|
+
Very good (excellent) website performance values for *Core Web Vitals*
|
109
|
+
takes a lot of work to achieve. Values like the screenshot below require
|
110
|
+
much work in the optimization and even then, can only rarely be achieved.
|
111
|
+
|
112
|
+
.Excellent performance values (Lighthouse)
|
113
|
+
lightbox::core_web_vitals_best_full[ 800, {data-image--core_web_vitals_best_full}, role="mt-3"]
|
114
|
+
|
115
|
+
Nevertheless, it makes sense to achieve the best possible performance. The
|
116
|
+
ranking of a website will improve a lot, and above all: the readers will
|
117
|
+
appreciate it and visit such sites again.
|
118
|
+
|
119
|
+
|
120
|
+
== J1 Template Build-in Optimizations
|
121
|
+
|
122
|
+
Optimizations of the *Core Web Vitals* are already done for all pages
|
123
|
+
the template system.
|
124
|
+
|
125
|
+
Bla ...
|
126
|
+
|
127
|
+
First Contentful Paint (FCP::
|
128
|
+
Bla ...
|
129
|
+
|
130
|
+
Largest Contentful Paint (LCP)::
|
131
|
+
Bla ...
|
132
|
+
|
133
|
+
Total Blocking Time::
|
134
|
+
Bla ...
|
135
|
+
|
136
|
+
Cumulative Layout Shift (CLS)::
|
137
|
+
Bla ...
|
138
|
+
|
139
|
+
|
140
|
+
== Optimizise LCP
|
141
|
+
|
142
|
+
The Largest Contentful Paint or short *LCP* is one of the Core Web Vitals
|
143
|
+
metrics that measure when the largest *content element* becomes *visible* in
|
144
|
+
the browser. While other metrics like *TTFB* (time to first byte) and
|
145
|
+
First Contentful Paint (*FCP*) also help measure page experience, they don't
|
146
|
+
indicate when the page has become *meaningful* to the user.
|
147
|
+
|
148
|
+
Typically, the page provides only a less context information to the user
|
149
|
+
until the largest element becomes fully visible. LCP is, therefore, more
|
150
|
+
representative of user expectations. As a Core Web Vital metric, LCP accounts
|
151
|
+
for *25%* of the total performance ccore, making it one of the most important
|
152
|
+
metrics to optimize a page.
|
153
|
+
|
154
|
+
As per Google, the types of elements considered for Largest Contentful
|
155
|
+
Paint are:
|
156
|
+
|
157
|
+
* `<img>` elements
|
158
|
+
* `<image>` elements inside an `<svg>` element
|
159
|
+
* `<video>` elements (the poster image is used)
|
160
|
+
* An element with a background image loaded via the https://developer.mozilla.org/en-US/docs/Web/CSS/url[url()]
|
161
|
+
function (as opposed to a
|
162
|
+
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Images/Using_CSS_gradients[CSS])
|
163
|
+
gradient
|
164
|
+
* https://developer.mozilla.org/en-US/docs/Web/HTML/Block-level_elements[Block-level]
|
165
|
+
elements containing text nodes or other inline-level text elements.
|
166
|
+
|
167
|
+
Now, there are multiple ways to measure the LCP of your page. The easiest
|
168
|
+
ways to measure it online is available on
|
169
|
+
https://imagekit.io/blog/improve-google-pagespeed-insights-score-for-images/?utm_source=css-tricks&utm_medium=sponsored_content&utm_campaign=csstricks_LCP[PageSpeed Insights, {browser-window--new}].
|
170
|
+
|
171
|
+
Other Tools:
|
172
|
+
|
173
|
+
* Google Chrome Developer Tools (Lighthouse)
|
174
|
+
* Search Console (Core Web Vitals Report)
|
175
|
+
|
176
|
+
For example, *Google PageSpeed Insights* in
|
177
|
+
its report indicates the element considered for calculating the LCP.
|
178
|
+
|
179
|
+
// image::https://i0.wp.com/css-tricks.com/wp-content/uploads/2021/09/LCP_Image.jpg?resize=1601%2C1201&ssl=1[image,width=558,height=419]
|
180
|
+
|
181
|
+
Now that you know what is LCP and what our target should be let’s look at
|
182
|
+
ways to improve LCP on our website. The underlying principle of reducing
|
183
|
+
LCP in all of the techniques mentioned below is to reduce the data downloaded
|
184
|
+
on the user’s device and reduce the time it takes to send and execute that
|
185
|
+
content.
|
186
|
+
|
187
|
+
=== Optimizing Images
|
188
|
+
|
189
|
+
On most websites, the above-the-fold content usually contains a large
|
190
|
+
image which gets considered for LCP. It could either be a hero image, a
|
191
|
+
banner, or a carousel. It is, therefore, crucial that you optimize these
|
192
|
+
images for a better LCP.
|
193
|
+
|
194
|
+
// image::https://i0.wp.com/css-tricks.com/wp-content/uploads/2021/09/optimised-vs-unoptimised.jpeg?resize=1600%2C681&ssl=1[image,width=1600,height=681]
|
195
|
+
|
196
|
+
To optimize your images, you should use a third-party image CDN like
|
197
|
+
ImageKit.io. The advantage of using a third-party
|
198
|
+
https://imagekit.io/blog/what-is-image-cdn-guide/?utm_source=css-tricks&utm_medium=sponsored_content&utm_campaign=csstricks_LCP[image CDN, {browser-window--new}]
|
199
|
+
is that you can focus on your actual business and leave image
|
200
|
+
optimization to the image CDN.
|
201
|
+
|
202
|
+
The image CDN would stay at the edge of technology evolution, and you
|
203
|
+
always get the best possible features with minimum ongoing investment.
|
204
|
+
|
205
|
+
ImageKit is a complete real-time image CDN that integrates with any
|
206
|
+
existing cloud storage like AWS S3, Azure, Google Cloud Storage, etc. It
|
207
|
+
even comes with its integrated image storage and manager called the
|
208
|
+
Media Library.
|
209
|
+
|
210
|
+
Here is how ImageKit can help you improve your LCP score.
|
211
|
+
|
212
|
+
==== Images in Lighter Formats
|
213
|
+
|
214
|
+
ImageKit detects if the user’s browser supports modern lighter formats
|
215
|
+
like WebP or AVIF and automatically delivers the image in the *lightest*
|
216
|
+
possible format in real-time. Formats like WebP are over 30% lighter
|
217
|
+
compared to their JPEG equivalents.
|
218
|
+
|
219
|
+
////
|
220
|
+
[role="mb-5"]
|
221
|
+
image::https://i0.wp.com/css-tricks.com/wp-content/uploads/2021/09/webp_jpg_image_size_comparison.jpeg?resize=1200%2C691&ssl=1[image,width=1200,height=691]
|
222
|
+
////
|
223
|
+
|
224
|
+
==== Automatically Compress Images
|
225
|
+
|
226
|
+
Not just converting the image to the correct format, ImageKit also
|
227
|
+
compresses your image to a smaller size. In doing so, it balances the
|
228
|
+
image’s visual quality and the output size.
|
229
|
+
|
230
|
+
You get the option to alter the compression level (or quality) in
|
231
|
+
real-time by just changing a URL parameter, thereby balancing your
|
232
|
+
business requirements of visual quality and load time.
|
233
|
+
|
234
|
+
// image::https://i0.wp.com/css-tricks.com/wp-content/uploads/2021/09/image-compression-comparison_quality.jpeg?resize=1750%2C860&ssl=1[image,width=1750,height=860]
|
235
|
+
|
236
|
+
==== Real-time Transformations for Images
|
237
|
+
|
238
|
+
Google uses mobile-first indexing for almost all websites. It is
|
239
|
+
therefore essential to optimize LCP for mobile more than that for
|
240
|
+
desktop. Every image needs to be scaled down to as per the layout’s
|
241
|
+
requirement.
|
242
|
+
|
243
|
+
For example, you would need the image in a smaller size on the product
|
244
|
+
listing page and a larger size on the product detail page. This resizing
|
245
|
+
ensures that you are not sending any additional bytes than what is
|
246
|
+
required for that particular page.
|
247
|
+
|
248
|
+
ImageKit allows you to transform
|
249
|
+
https://imagekit.io/responsive-images/?utm_source=css-tricks&utm_medium=sponsored_content&utm_campaign=csstricks_LCP[responsive images, {browser-window--new}]
|
250
|
+
in real-time just by adding the corresponding transformation in
|
251
|
+
the image URL. For example, the following image is resized to width
|
252
|
+
200px and height 300px by adding the height and width transformation
|
253
|
+
parameters in its URL.
|
254
|
+
|
255
|
+
////
|
256
|
+
[role="mb-5"]
|
257
|
+
image::https://i0.wp.com/css-tricks.com/wp-content/uploads/2021/09/eiffel-tower-example_200400.jpg?resize=200%2C400&ssl=1[image,width=200,height=400]
|
258
|
+
////
|
259
|
+
|
260
|
+
==== Caching Images
|
261
|
+
|
262
|
+
Image CDNs use a global
|
263
|
+
https://imagekit.io/blog/what-is-content-delivery-network-cdn-guide/?utm_source=css-tricks&utm_medium=sponsored_content&utm_campaign=csstricks_LCP[Content Delivery Network, {browser-window--new}]
|
264
|
+
(CDN) to deliver the images. Using a CDN ensures that images load from a
|
265
|
+
location closer to the user instead of your server, which could be halfway
|
266
|
+
across the globe.
|
267
|
+
|
268
|
+
// image::https://i0.wp.com/css-tricks.com/wp-content/uploads/2021/09/CDN_server_user.jpg?resize=702%2C250&ssl=1[image,width=702,height=250]
|
269
|
+
|
270
|
+
ImageKit, for example, uses AWS Cloudfront as its CDN, which has over
|
271
|
+
220 deliver nodes globally. A vast majority of the images get loaded in
|
272
|
+
less than 50ms. Additionally, it uses the proper caching directives to
|
273
|
+
cache the images on the user’s device, CDN nodes, and even its
|
274
|
+
processing network for a faster load time.
|
275
|
+
|
276
|
+
This helps to improve LCP on your website.
|
277
|
+
|
278
|
+
|
279
|
+
=== Client-side Optimization
|
280
|
+
|
281
|
+
==== Preload Critical Resources
|
282
|
+
|
283
|
+
There are certain cases where the browser may not prioritize loading a
|
284
|
+
visually important resource that impacts LCP. For example, a banner
|
285
|
+
image above the fold could be specified as a background image inside a
|
286
|
+
CSS file. Since the browser would never know about this image until the
|
287
|
+
CSS file is downloaded and parsed along with the DOM tree, it will not
|
288
|
+
prioritize loading it.
|
289
|
+
|
290
|
+
For such resources, you can preload them by adding a `<link>` tag with a
|
291
|
+
`rel= "preload"` attribute to the head section of your HTML document.
|
292
|
+
|
293
|
+
[source, html]
|
294
|
+
----
|
295
|
+
<!-- Example of preloading -->
|
296
|
+
<link rel="preload" src="banner_image.jpg" />
|
297
|
+
----
|
298
|
+
|
299
|
+
While you can preload multiple resources in a document, you should
|
300
|
+
always restrict it to above-the-fold images or videos, page-wide font
|
301
|
+
files, or critical CSS and JS files.
|
302
|
+
|
303
|
+
==== Preconnect Third-party Origins
|
304
|
+
|
305
|
+
If you use third-party domains to deliver critical above-the-fold
|
306
|
+
content like JS, CSS, or images, then you would benefit by indicating to
|
307
|
+
the browser that a connection to that third-party domain needs to be
|
308
|
+
made as soon as possible. This is done using the `rel="preconnect"`
|
309
|
+
attribute of the `<link>` tag.
|
310
|
+
|
311
|
+
[source, html]
|
312
|
+
----
|
313
|
+
<link rel="preconnect" href="https://static.example.com" />
|
314
|
+
----
|
315
|
+
|
316
|
+
With `preconnect` in place, the browser can save the domain connection
|
317
|
+
time when it downloads the actual resource later.
|
318
|
+
|
319
|
+
Subdomains like static.example.com, of your main website domain
|
320
|
+
example.com are also third-party domains in this context.
|
321
|
+
|
322
|
+
You can also use the _dns-prefetch_ as a fallback in browsers that don’t
|
323
|
+
support preconnect. This directive instructs the browser to complete the
|
324
|
+
DNS resolution to the third-party domain even if it cannot establish a
|
325
|
+
proper connection.
|
326
|
+
|
327
|
+
==== Compress Text Files
|
328
|
+
|
329
|
+
Any text-based data you load on your webpage should be compressed when
|
330
|
+
transferred over the network using a compression algorithm like gzip or
|
331
|
+
Brotli. SVGs, JSONs, API responses, JS and CSS files, and your main
|
332
|
+
page’s HTML are good candidates for compression using these algorithms.
|
333
|
+
This compression significantly reduces the amount of data that will get
|
334
|
+
downloaded on page load, therefore bringing down the LCP.
|
335
|
+
|
336
|
+
==== Remove Render-blocking Resources
|
337
|
+
|
338
|
+
When the browser receives the HTML page from your server, it parses the
|
339
|
+
DOM tree. If there is any external stylesheet or JS file in the DOM, the
|
340
|
+
browser has to pause for them before moving ahead with the parsing of
|
341
|
+
the remaining DOM tree.
|
342
|
+
|
343
|
+
These JS and CSS files are called render-blocking resources and delay
|
344
|
+
the LCP time. Here are some ways to reduce the blocking time for JS and
|
345
|
+
CSS files:
|
346
|
+
|
347
|
+
==== Remove Unnecessary Bundles
|
348
|
+
|
349
|
+
Avoid shipping huge bundles of JS and CSS files to the browser if they
|
350
|
+
are not needed. If the CSS can be downloaded a lot later, or a JS
|
351
|
+
functionality is not needed on a particular page, there is no reason to
|
352
|
+
load it up front and block the render in the browser.
|
353
|
+
|
354
|
+
Suppose you cannot split a particular file into smaller bundles, but it
|
355
|
+
is not critical to the functioning of the page either. In that case, you
|
356
|
+
can use the defer attribute of the script tag to indicate to the browser
|
357
|
+
that it can go ahead with the DOM parsing and continue to execute the JS
|
358
|
+
file at a later stage. Adding the defer attribute removes any blocker
|
359
|
+
for DOM parsing. The LCP, therefore, goes down.
|
360
|
+
|
361
|
+
==== Use Inline CSS
|
362
|
+
|
363
|
+
Critical CSS comprises the style definitions needed for the DOM that
|
364
|
+
appears in the first fold of your page. If the style definitions for
|
365
|
+
this part of the page are inline, i.e., in each element’s `style`
|
366
|
+
attribute, the browser has no dependency on the external CSS to style
|
367
|
+
these elements. Therefore, it can render the page quickly, and the LCP
|
368
|
+
goes down.
|
369
|
+
|
370
|
+
==== Minify Content
|
371
|
+
|
372
|
+
You should always minify the CSS and JS files before loading them in the
|
373
|
+
browser. CSS and JS files contain whitespace to make them legible, but
|
374
|
+
they are unnecessary for code execution. So, you can remove them, which
|
375
|
+
reduces the file size on production. Smaller file size means that the
|
376
|
+
files can load quickly, thereby reducing your LCP time.
|
377
|
+
|
378
|
+
Compression techniques, as discussed earlier, use data compression
|
379
|
+
algorithms to bring down the file size delivered over the network. Gzip
|
380
|
+
and Brotli are two compression algorithms.
|
381
|
+
https://imagekit.io/blog/what-and-why-brotli-compression/?utm_source=css-tricks&utm_medium=sponsored_content&utm_campaign=csstricks_LCP[Brotli compression, {browser-window--new}]
|
382
|
+
offers a superior compression ratio compared to Gzip and is
|
383
|
+
now supported on all major browsers, servers, and CDNs.
|
384
|
+
|
385
|
+
|
386
|
+
=== Server-side Optimization
|
387
|
+
|
388
|
+
A lot of computation, DB queries, and page construction happens on the
|
389
|
+
server. You should analyze the requests going to your servers and
|
390
|
+
identify the possible bottlenecks for responding to the requests. It
|
391
|
+
could be a DB query slowing things down or the building of the page on
|
392
|
+
your server.
|
393
|
+
|
394
|
+
You can apply best practices like caching of DB responses, pre-rendering
|
395
|
+
of pages, amongst others, to reduce the time it takes for your server to
|
396
|
+
respond to requests.
|
397
|
+
|
398
|
+
Of course, if the above does not improve the response time, you might
|
399
|
+
need to increase your server capacity to handle the number of requests
|
400
|
+
coming in.
|
401
|
+
|
402
|
+
==== Reduce Response Times
|
403
|
+
|
404
|
+
If your server takes long to respond to a request, then the time it
|
405
|
+
takes to render the page on the screen also goes up. It, therefore,
|
406
|
+
negatively affects every page speed metric, including LCP. To improve
|
407
|
+
your server response times, here is what you should do.
|
408
|
+
|
409
|
+
==== Content Delivery Network (CDN)
|
410
|
+
|
411
|
+
We have already seen above that using an image CDN like ImageKit
|
412
|
+
improves the loading time for your images. Your users get the content
|
413
|
+
delivered from a CDN node close to their location in milliseconds.
|
414
|
+
|
415
|
+
// image::https://i0.wp.com/css-tricks.com/wp-content/uploads/2021/09/with-cdn.jpg?resize=452%2C250&ssl=1[image,width=452,height=250]
|
416
|
+
|
417
|
+
You should extend the same to other content on your website. Using a CDN
|
418
|
+
for your static content like JS, CSS, and font files will significantly
|
419
|
+
speed up their load time. ImageKit does support the delivery of static
|
420
|
+
content through its systems.
|
421
|
+
|
422
|
+
You can also try to use a CDN for your HTML and APIs to cache those
|
423
|
+
responses on the CDN nodes. Given the dynamic nature of such content,
|
424
|
+
using a CDN for HTML or APIs can be a lot more complex than using a CDN
|
425
|
+
for static content.
|
426
|
+
|
427
|
+
////
|
428
|
+
=== Conclusion
|
429
|
+
|
430
|
+
Core Web Vitals, which include LCP, have become a significant search
|
431
|
+
ranking factor and strongly correlate with the user experience.
|
432
|
+
Therefore, if you run an online business, you should optimize these
|
433
|
+
vitals to ensure the success of the same.
|
434
|
+
|
435
|
+
The above techniques have a significant impact on optimizing LCP. Using
|
436
|
+
ImageKit as your image CDN will give you a quick headstart.
|
437
|
+
|
438
|
+
https://imagekit.io/registration/?utm_source=css-tricks&utm_medium=sponsored_content&utm_campaign=csstricks_LCP[Sign-up for an forever free account, {browser-window--new}],
|
439
|
+
upload your images to the ImageKit storage,
|
440
|
+
or connect your origin, and start delivering optimized images in
|
441
|
+
minutes.
|
442
|
+
////
|