From e62a316924365968a036a0b58268a874c2f37700 Mon Sep 17 00:00:00 2001 From: Warren Chen Date: Wed, 14 Jan 2026 14:27:08 +0900 Subject: [PATCH] Add new image assets and implement horizontal and block list functionality - Added multiple PNG images for various sections of the site. - Introduced JavaScript functionality for horizontal and block lists, allowing smooth scrolling and dynamic arrow visibility based on scroll position. - Created a new template for displaying news articles, including a hero section for the latest article and a list for additional articles. - Enhanced the news list with responsive design and fallback images for articles without cover images. --- ...socialmediasettings_links_bannersnippet.py | 39 +++ ..._logo_headersettings_logo_dark_and_more.py | 29 ++ innovedus_cms/base/models.py | 52 +++- .../base/includes/banner_snippets.html | 27 ++ .../templates/base/includes/home_banner.html | 20 ++ .../base/templatetags/banner_tags.py | 15 + .../migrations/0004_articlepage_not_news.py | 18 ++ innovedus_cms/home/models.py | 34 ++- innovedus_cms/home/static/css/block_list.css | 79 +++++ innovedus_cms/home/static/css/home.css | 74 +++++ .../home/static/css/horizontal_list.css | 112 +++++++ innovedus_cms/home/static/css/news_list.css | 182 +++++++++++ innovedus_cms/home/static/img/picfrm_b139.png | Bin 0 -> 926 bytes innovedus_cms/home/static/img/picfrm_b194.png | Bin 0 -> 1969 bytes innovedus_cms/home/static/img/picfrm_b300.png | Bin 0 -> 2436 bytes innovedus_cms/home/static/img/picfrm_b318.png | Bin 0 -> 2461 bytes innovedus_cms/home/static/img/picfrm_b426.png | Bin 0 -> 2720 bytes innovedus_cms/home/static/img/picfrm_b480.png | Bin 0 -> 2837 bytes innovedus_cms/home/static/img/picfrm_o139.png | Bin 0 -> 938 bytes innovedus_cms/home/static/img/picfrm_o194.png | Bin 0 -> 2031 bytes innovedus_cms/home/static/img/picfrm_o300.png | Bin 0 -> 2499 bytes innovedus_cms/home/static/img/picfrm_o318.png | Bin 0 -> 2518 bytes innovedus_cms/home/static/img/picfrm_o426.png | Bin 0 -> 2784 bytes innovedus_cms/home/static/img/picfrm_o480.png | Bin 0 -> 2894 bytes innovedus_cms/home/static/js/block_list.js | 45 +++ .../home/static/js/horizontal_list.js | 45 +++ .../home/templates/home/home_page.html | 45 ++- .../templates/home/includes/block_list.html | 38 +-- .../home/includes/category_session.html | 16 +- .../home/includes/horizontal_list.html | 47 +-- .../templates/home/includes/news_list.html | 82 +++++ innovedus_cms/mysite/static/css/mysite.css | 288 ++++++++++++++++++ .../mysite/templates/includes/footer.html | 93 ++++-- .../mysite/templates/includes/header.html | 88 ++++-- 34 files changed, 1346 insertions(+), 122 deletions(-) create mode 100644 innovedus_cms/base/migrations/0003_alter_socialmediasettings_links_bannersnippet.py create mode 100644 innovedus_cms/base/migrations/0004_remove_headersettings_logo_headersettings_logo_dark_and_more.py create mode 100644 innovedus_cms/base/templates/base/includes/banner_snippets.html create mode 100644 innovedus_cms/base/templates/base/includes/home_banner.html create mode 100644 innovedus_cms/base/templatetags/banner_tags.py create mode 100644 innovedus_cms/home/migrations/0004_articlepage_not_news.py create mode 100644 innovedus_cms/home/static/css/block_list.css create mode 100644 innovedus_cms/home/static/css/home.css create mode 100644 innovedus_cms/home/static/css/horizontal_list.css create mode 100644 innovedus_cms/home/static/css/news_list.css create mode 100644 innovedus_cms/home/static/img/picfrm_b139.png create mode 100644 innovedus_cms/home/static/img/picfrm_b194.png create mode 100644 innovedus_cms/home/static/img/picfrm_b300.png create mode 100644 innovedus_cms/home/static/img/picfrm_b318.png create mode 100644 innovedus_cms/home/static/img/picfrm_b426.png create mode 100644 innovedus_cms/home/static/img/picfrm_b480.png create mode 100644 innovedus_cms/home/static/img/picfrm_o139.png create mode 100644 innovedus_cms/home/static/img/picfrm_o194.png create mode 100644 innovedus_cms/home/static/img/picfrm_o300.png create mode 100644 innovedus_cms/home/static/img/picfrm_o318.png create mode 100644 innovedus_cms/home/static/img/picfrm_o426.png create mode 100644 innovedus_cms/home/static/img/picfrm_o480.png create mode 100644 innovedus_cms/home/static/js/block_list.js create mode 100644 innovedus_cms/home/static/js/horizontal_list.js create mode 100644 innovedus_cms/home/templates/home/includes/news_list.html diff --git a/innovedus_cms/base/migrations/0003_alter_socialmediasettings_links_bannersnippet.py b/innovedus_cms/base/migrations/0003_alter_socialmediasettings_links_bannersnippet.py new file mode 100644 index 0000000..9314ad7 --- /dev/null +++ b/innovedus_cms/base/migrations/0003_alter_socialmediasettings_links_bannersnippet.py @@ -0,0 +1,39 @@ +# Generated by Django 5.2.7 on 2026-01-09 05:52 + +import django.db.models.deletion +import wagtail.fields +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0002_socialmediasettings_alter_navigationsettings_options_and_more'), + ('wagtailimages', '0027_image_description'), + ] + + operations = [ + migrations.AlterField( + model_name='socialmediasettings', + name='links', + field=wagtail.fields.StreamField([('link', 2)], block_lookup={0: ('wagtail.blocks.ChoiceBlock', [], {'choices': [('facebook', 'Facebook'), ('twitter', 'Twitter'), ('instagram', 'Instagram'), ('threads', 'Threads'), ('linkedin', 'LinkedIn'), ('youtube', 'YouTube')]}), 1: ('wagtail.blocks.URLBlock', (), {}), 2: ('wagtail.blocks.StructBlock', [[('platform', 0), ('url', 1)]], {})}), + ), + migrations.CreateModel( + name='BannerSnippet', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.CharField(blank=True, help_text='識別用 key(例如 home / category)', max_length=50)), + ('title', models.CharField(blank=True, max_length=255)), + ('link_url', models.URLField(blank=True)), + ('link_text', models.CharField(blank=True, max_length=100)), + ('is_active', models.BooleanField(default=True)), + ('sort_order', models.PositiveIntegerField(default=0)), + ('image', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailimages.image')), + ], + options={ + 'verbose_name': 'Banner', + 'verbose_name_plural': 'Banners', + 'ordering': ['sort_order', 'id'], + }, + ), + ] diff --git a/innovedus_cms/base/migrations/0004_remove_headersettings_logo_headersettings_logo_dark_and_more.py b/innovedus_cms/base/migrations/0004_remove_headersettings_logo_headersettings_logo_dark_and_more.py new file mode 100644 index 0000000..d64738e --- /dev/null +++ b/innovedus_cms/base/migrations/0004_remove_headersettings_logo_headersettings_logo_dark_and_more.py @@ -0,0 +1,29 @@ +# Generated by Django 5.2.7 on 2026-01-09 09:01 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0003_alter_socialmediasettings_links_bannersnippet'), + ('wagtailimages', '0027_image_description'), + ] + + operations = [ + migrations.RemoveField( + model_name='headersettings', + name='logo', + ), + migrations.AddField( + model_name='headersettings', + name='logo_dark', + field=models.ForeignKey(blank=True, help_text='淺色底用(深色 logo)', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailimages.image'), + ), + migrations.AddField( + model_name='headersettings', + name='logo_light', + field=models.ForeignKey(blank=True, help_text='深色底用(亮色 logo)', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailimages.image'), + ), + ] diff --git a/innovedus_cms/base/models.py b/innovedus_cms/base/models.py index 99355ee..0824424 100644 --- a/innovedus_cms/base/models.py +++ b/innovedus_cms/base/models.py @@ -29,12 +29,21 @@ from wagtail import blocks @register_setting class HeaderSettings(BaseGenericSetting): - logo = models.ForeignKey( + logo_light = models.ForeignKey( "wagtailimages.Image", null=True, blank=True, on_delete=models.SET_NULL, related_name="+", + help_text="深色底用(亮色 logo)", + ) + logo_dark = models.ForeignKey( + "wagtailimages.Image", + null=True, + blank=True, + on_delete=models.SET_NULL, + related_name="+", + help_text="淺色底用(深色 logo)", ) site_name = models.CharField(max_length=255, blank=True) extra_links = StreamField([ @@ -47,7 +56,8 @@ class HeaderSettings(BaseGenericSetting): panels = [ MultiFieldPanel( [ - FieldPanel("logo"), + FieldPanel("logo_light"), + FieldPanel("logo_dark"), FieldPanel("site_name"), FieldPanel("extra_links"), ], @@ -82,7 +92,7 @@ class SocialLinkBlock(blocks.StructBlock): ("facebook", "Facebook"), ("twitter", "Twitter"), ("instagram", "Instagram"), - ("thread", "Thread"), + ("threads", "Threads"), ("linkedin", "LinkedIn"), ("youtube", "YouTube"), ] @@ -102,6 +112,40 @@ class SocialMediaSettings(BaseGenericSetting): panels = [FieldPanel("links")] +@register_snippet +class BannerSnippet(models.Model): + key = models.CharField(max_length=50, blank=True, help_text="識別用 key(例如 home / category)") + title = models.CharField(max_length=255, blank=True) + image = models.ForeignKey( + "wagtailimages.Image", + null=True, + blank=False, + on_delete=models.SET_NULL, + related_name="+", + ) + link_url = models.URLField(blank=True) + link_text = models.CharField(max_length=100, blank=True) + is_active = models.BooleanField(default=True) + sort_order = models.PositiveIntegerField(default=0) + + panels = [ + FieldPanel("key"), + FieldPanel("title"), + FieldPanel("image"), + FieldPanel("link_url"), + FieldPanel("link_text"), + FieldPanel("is_active"), + FieldPanel("sort_order"), + ] + + class Meta: + ordering = ["sort_order", "id"] + verbose_name = "Banner" + verbose_name_plural = "Banners" + + def __str__(self): + return self.title or f"Banner {self.pk}" + @register_snippet class FooterText( DraftStateMixin, @@ -128,4 +172,4 @@ class FooterText( return {"footer_text": self.body} class Meta(TranslatableMixin.Meta): - verbose_name_plural = "Footer Text" \ No newline at end of file + verbose_name_plural = "Footer Text" diff --git a/innovedus_cms/base/templates/base/includes/banner_snippets.html b/innovedus_cms/base/templates/base/includes/banner_snippets.html new file mode 100644 index 0000000..52f6f39 --- /dev/null +++ b/innovedus_cms/base/templates/base/includes/banner_snippets.html @@ -0,0 +1,27 @@ +{% load wagtailimages_tags banner_tags %} + +{% get_banners banner_key as banners %} +{% if banners %} + +{% endif %} diff --git a/innovedus_cms/base/templates/base/includes/home_banner.html b/innovedus_cms/base/templates/base/includes/home_banner.html new file mode 100644 index 0000000..3490cd2 --- /dev/null +++ b/innovedus_cms/base/templates/base/includes/home_banner.html @@ -0,0 +1,20 @@ +{% load wagtailimages_tags banner_tags %} + +{% get_banners "home" first=True as banner %} +{% if banner %} +
+ {% if banner.link_url %} + + {% image banner.image width-1200 alt=banner.title %} + {% if banner.title %} + {{ banner.title }} + {% endif %} + {% if banner.link_text %} + {{ banner.link_text }} + {% endif %} + + {% else %} + {% image banner.image width-1200 alt=banner.title %} + {% endif %} +
+{% endif %} diff --git a/innovedus_cms/base/templatetags/banner_tags.py b/innovedus_cms/base/templatetags/banner_tags.py new file mode 100644 index 0000000..3b39814 --- /dev/null +++ b/innovedus_cms/base/templatetags/banner_tags.py @@ -0,0 +1,15 @@ +from django import template + +from base.models import BannerSnippet + +register = template.Library() + + +@register.simple_tag +def get_banners(key=None, first=False): + banners = BannerSnippet.objects.filter(is_active=True, image__isnull=False) + if key: + banners = banners.filter(key=key) + if first: + return banners.first() + return banners diff --git a/innovedus_cms/home/migrations/0004_articlepage_not_news.py b/innovedus_cms/home/migrations/0004_articlepage_not_news.py new file mode 100644 index 0000000..5bf324e --- /dev/null +++ b/innovedus_cms/home/migrations/0004_articlepage_not_news.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.7 on 2026-01-09 05:52 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0003_categorypage_latestpage_trendingpage_articlepage_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='articlepage', + name='not_news', + field=models.BooleanField(default=False, help_text='不列入最新消息區塊', verbose_name='Not News'), + ), + ] diff --git a/innovedus_cms/home/models.py b/innovedus_cms/home/models.py index f062e57..1e5f6b0 100644 --- a/innovedus_cms/home/models.py +++ b/innovedus_cms/home/models.py @@ -18,8 +18,9 @@ def _get_env_int(name, default): except ValueError: return default +NEWS_SIZE = _get_env_int("HOMEPAGE_NEWS_SIZE", 8) # Default to 8 articles in news layouts BLOCK_SIZE = _get_env_int("HOMEPAGE_BLOCK_SIZE", 5) # Default to 5 articles in block layout -HORIZON_SIZE = _get_env_int("HOMEPAGE_HORIZON_SIZE", 8) # Default to 8 articles in horizon layout +HORIZON_SIZE = _get_env_int("HOMEPAGE_HORIZON_SIZE", 4) # Default to 8 articles in horizon layout PAGE_SIZE = _get_env_int("HOMEPAGE_PAGE_SIZE", 10) # Default to 10 articles per page for pagination # Mixin for Category-related functionality @@ -85,8 +86,8 @@ class CategoryMixin: # No request means no pagination (e.g., homepage) return { "title": latest_page.title, - "items": ArticlePage.objects.live().order_by("-date")[ - :BLOCK_SIZE + "items": ArticlePage.objects.filter(not_news=False).live().order_by("-date")[ + :NEWS_SIZE ], "url": latest_page.url, } @@ -154,21 +155,24 @@ class HomePage(Page, CategoryMixin): } latest_section = self.get_latest_articles().copy() - latest_section["layout"] = "block" + # latest_section["layout"] = "block" sections["top_section"].append(latest_section) + # NOT NEED TRENDING SECTION CURRENTLY + # ------------------------------------------------------------------ # Exclude latest articles from trending section - latest_items = latest_section.get("items", []) - if hasattr(latest_items, "values_list"): - latest_ids = list(latest_items.values_list("id", flat=True)) - else: - latest_ids = [item.id for item in latest_items] + # latest_items = latest_section.get("items", []) + # if hasattr(latest_items, "values_list"): + # latest_ids = list(latest_items.values_list("id", flat=True)) + # else: + # latest_ids = [item.id for item in latest_items] - trending_section = self.get_trending_articles( - exclude_ids=latest_ids - ).copy() - trending_section["layout"] = "horizon" - sections["top_section"].append(trending_section) + # trending_section = self.get_trending_articles( + # exclude_ids=latest_ids + # ).copy() + # trending_section["layout"] = "horizon" + # sections["top_section"].append(trending_section) + # ------------------------------------------------------------------ # Build category sections categories = CategoryPage.objects.child_of(self).live().in_menu() @@ -271,6 +275,7 @@ class ArticlePage(Page): use_json_field=True, ) trending = models.BooleanField("Trending", default=False, help_text="在熱門區塊顯示") + not_news = models.BooleanField("Not News", default=False, help_text="不列入最新消息區塊") tags = ClusterTaggableManager(through="home.ArticlePageTag", blank=True) search_fields = Page.search_fields + [ @@ -281,6 +286,7 @@ class ArticlePage(Page): content_panels = Page.content_panels + [ FieldPanel("trending"), + FieldPanel("not_news"), FieldPanel("cover_image"), FieldPanel("banner_image"), FieldPanel("date"), diff --git a/innovedus_cms/home/static/css/block_list.css b/innovedus_cms/home/static/css/block_list.css new file mode 100644 index 0000000..a29d2e2 --- /dev/null +++ b/innovedus_cms/home/static/css/block_list.css @@ -0,0 +1,79 @@ +.block-list-wrap { + position: relative; +} + +.block-list-arrow { + position: absolute; + top: 50%; + transform: translateY(-50%); + width: 36px; + height: 36px; + border: 0; + border-radius: 8px; + background: rgba(255, 255, 255, 0.85); + box-shadow: 0 8px 16px rgba(0, 0, 0, 0.18); + cursor: pointer; +} + +.block-list-arrow[data-dir="left"] { + left: 0; +} + +.block-list-arrow[data-dir="right"] { + right: 0; +} + +.block-list-arrow.is-hidden { + opacity: 0; + pointer-events: none; +} + +.block-list { + display: flex; + align-items: stretch; + gap: 20px; + overflow-x: auto; + scroll-snap-type: x mandatory; + list-style: none; + margin: 24px 0; + padding: 12px 48px; +} + +.block-list li { + flex: 0 0 200px; + overflow: hidden; + scroll-snap-align: start; +} + +.block-list li a { + display: flex; + flex-direction: column; + gap: 12px; + color: inherit; + text-decoration: none; + padding: 16px; +} + +.block-list li img { + width: 100%; + height: 200px; + /* object-fit: contain; */ + display: block; + /* background: #f5f5f5; */ + /* border-radius: 8px; */ +} + +.block-list li a:hover, +.block-list li a:focus { + transform: translateY(-2px); +} + +.block-list .empty { + flex: 1 0 auto; + text-align: center; + padding: 24px; + color: #666; + background: #fafafa; + border: 1px dashed #ddd; + border-radius: 12px; +} diff --git a/innovedus_cms/home/static/css/home.css b/innovedus_cms/home/static/css/home.css new file mode 100644 index 0000000..e92c9f7 --- /dev/null +++ b/innovedus_cms/home/static/css/home.css @@ -0,0 +1,74 @@ +.home-page { + max-width: 890px; + margin: 0 auto; + padding: 0 16px; +} + +.home-hero-band { + background-color: #0e1b42; + color: #ffffff; + padding-bottom: 86px; +} + +.home-hero-band a { + color: #ffffff; +} + +.template-homepage .site-header { + background-color: #0e1b42; + color: #ffffff; +} + +.template-homepage .header-inner { + max-width: 1028px; + margin: 0 auto; + /* padding: 0 16px; */ +} + +.template-homepage .main-menu-link { + color: #ffffff; +} + +.template-homepage .header-search .search-input { + /* border-color: #ffffff; */ + background-color: rgba(255, 255, 255, 0.4); +} + +.template-homepage .header-search .search-icon { + color: #ffffff; +} + +.template-homepage .header-search input[type="search"] { + color: #ffffff; +} + +.list-title { + align-items: center; + margin: 10px 0; +} + +.block-title { + display: inline-block; + width: 197px; + height: 87px; + vertical-align: middle; + font-size: 20px; + font-weight: 700; +} + +.block-title span { + padding-left: 21px; + line-height: 87px; +} + +.block-title-divider { + display: inline-flex; + width: 28px; + height: 1px; + transform: translate(-4px, -4px); +} + +.more-link { + text-decoration: none; + font-size: 16px; +} \ No newline at end of file diff --git a/innovedus_cms/home/static/css/horizontal_list.css b/innovedus_cms/home/static/css/horizontal_list.css new file mode 100644 index 0000000..b548f5e --- /dev/null +++ b/innovedus_cms/home/static/css/horizontal_list.css @@ -0,0 +1,112 @@ +.horizontal-list-wrap { + position: relative; +} + +.horizontal-list-arrow { + position: absolute; + top: 50%; + transform: translateY(-50%); + z-index: 2; + display: flex; + align-items: center; + justify-content: center; + width: 52px; + height: 52px; + border: 0; + border-radius: 8px; + background: rgba(255, 255, 255, 0.85); + box-shadow: 0 8px 16px rgba(0, 0, 0, 0.18); + cursor: pointer; +} + +.horizontal-list-arrow[data-dir="left"] { + left: 0; +} + +.horizontal-list-arrow[data-dir="right"] { + right: 0; +} + +.horizontal-list-arrow-icon { + width: 18px; + height: 34px; + display: block; +} + +.horizontal-list-arrow[data-dir="right"] .horizontal-list-arrow-icon { + transform: rotate(180deg); +} + +.horizontal-list-arrow.is-hidden { + opacity: 0; + pointer-events: none; +} + +.horizontal-list { + display: flex; + align-items: stretch; + gap: 24px; + overflow-x: auto; + scroll-snap-type: x mandatory; + list-style: none; + margin: 24px 0; + padding: 12px 48px; + scrollbar-width: none; + -ms-overflow-style: none; +} + +.horizontal-list::-webkit-scrollbar { + display: none; +} + +.horizontal-list li { + flex: 0 0 200px; + overflow: hidden; + scroll-snap-align: start; +} + +.horizontal-list li a { + display: flex; + flex-direction: column; + gap: 12px; + color: inherit; + text-decoration: none; +} + +.horizontal-list li img { + width: 100%; + height: 200px; + display: block; + margin: 0 3px; +} + +.horizontal-list li a:hover, +.horizontal-list li a:focus { + transform: translateY(-2px); +} + +.horizontal-list li a span { + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + font-size: 20px; +} + +.horizontal-list .article-title { + font-size: 20px; +} + +.horizontal-list .article-intro { + font-size: 16px; +} + +.horizontal-list .empty { + flex: 1 0 auto; + text-align: center; + padding: 24px; + color: #666; + background: #fafafa; + border: 1px dashed #ddd; + border-radius: 12px; +} diff --git a/innovedus_cms/home/static/css/news_list.css b/innovedus_cms/home/static/css/news_list.css new file mode 100644 index 0000000..798d250 --- /dev/null +++ b/innovedus_cms/home/static/css/news_list.css @@ -0,0 +1,182 @@ +.news-title, .more-news-title { + background-color: #ffffff; + color: #0e1b42; +} + +.news-hero { + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-areas: + "header header" + "image meta" + "image intro" + "image body"; + gap: 16px; + align-items: start; +} + +.news-hero .news-hero-header { + grid-area: header; + display: flex; + align-items: center; + gap: 12px; +} + +.news-hero .list-title { + grid-area: title; + max-width: 310px; + flex: 0 1 310px; + display: block; +} + +.news-hero .fist-news-title { + grid-area: head; + max-width: 580px; + font-size: 40px; + font-weight: 400; + color: #eb9f13; + margin: 0; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} + +.news-hero .first-news-image { + grid-area: image; + position: relative; + border-radius: 10px; + overflow: hidden; +} + +.news-hero .first-news-image::after { + content: ""; + position: absolute; + left: 0px; + right: 0px; + bottom: 0px; + height: 25px; + background: url("../img/picfrm_b480.png") no-repeat left bottom / cover; + background-size: 480px 25px; + pointer-events: none; +} + +.news-hero .first-news-image img { + display: block; + width:480px; + height:293px; + object-fit:cover; + border-radius: 10px; +} + +.news-hero .fist-news-date { + grid-area: meta; + color: rgba(255, 255, 255, 0.4); +} + +.news-hero .first-news-intro { + grid-area: intro; + font-size: 20px; +} + +.news-hero .first-news-body { + grid-area: body; + font: 12px; +} + +.news-list-items { + display: contents; +} + +.news-list-lower { + margin-top: 24px; + display: flex; + flex-wrap: wrap; + gap: 30px; +} + +.news-list-items a { + display: flex; + flex-direction: column; + gap: 12px; + width: 200px; + text-decoration: none; +} + +.news-list-thumb { + position: relative; + width: 194px; + height: 133px; + border-radius: 10px; + overflow: hidden; +} + +.news-list-thumb::after { + content: ""; + position: absolute; + left: 0px; + right: 0px; + bottom: 0px; + height: 25px; + background: url("../img/picfrm_o194.png") no-repeat left bottom / cover; + background-size: 194px 25px; + pointer-events: none; +} + +.news-list-thumb img { + display: block; + width: 100%; + height: 100%; + object-fit: cover; +} + +.news-list-items a span{ + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} + +.news-list-items .article-title { + font-size: 20px; +} + +.news-list-items .article-date { + color: rgba(255, 255, 255, 0.4); +} + +.more-news { + width: 200px; + display: flex; + flex-direction: column; + gap: 16px; +} + +.more-news .article-title { + font-size: 20px; + display: -webkit-box; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; + overflow: hidden; +} + +@media (max-width: 768px) { + .news-hero { + grid-template-columns: 1fr; + grid-template-areas: + "title" + "image" + "head" + "meta" + "intro" + "body"; + } + + .news-hero .news-hero-header { + display: contents; + } + + .news-hero .list-title { + max-width: none; + } +} diff --git a/innovedus_cms/home/static/img/picfrm_b139.png b/innovedus_cms/home/static/img/picfrm_b139.png new file mode 100644 index 0000000000000000000000000000000000000000..b5d4f6c9dd49bfcc5f3ef29c38a7a362e8df13a4 GIT binary patch literal 926 zcmeAS@N?(olHy`uVBq!ia0y~yU=#zgjX2nVY&p-g~!C?N{=6TY2$k9@E^Je*Q-Besw#IFZ)fdO1G3`;Sk^u$zaabbZua0+}MzC zk%NV!g_~nqK@cmafPhXFP_%&Yppf4x1xBVOSAGEn0X>C?L!P244h|b$Ffy?mVrB8R zSlPtF!69br(BQD6A%RmpbOHn8!A0yqlf?ye9xmY$Qc#Ha!obM%kf}*^PKYBD3rn}0 zf`dYg!-kg0S{@BROPOhDsc8h;!%(1u7o28lHcLHt=_y~q8=$+3tTKaV|9aR8k-2}W zN45U#riNs72ZacQ{$Ed}yv>q1%R>7cmb2a}xzoc~m45&9>(74478Oh^&%{rh^}H1q zH~&taTrc1A^(&YdndXXTd@eMd!E$0;eLZ5?_p05yqPgBIsXBUH!J*;6k8_3p0@kgxkAo}HJ?SsKs^G9-F;nR@qnJ4P`%iu{AAG#r>9YL4FUh*Paqp&HUVMG! z$?VJd(drHl_6uvoJ8Q=H@L4yye0D_H@y%En#}sr`X%4 z=&-Rh)`un-)P0Dqb-VndQ0wVQ_UP5e>x&KS8Mkl9|KQKdYX-_2p00i_>zopr0Na~f A@&Et; literal 0 HcmV?d00001 diff --git a/innovedus_cms/home/static/img/picfrm_b194.png b/innovedus_cms/home/static/img/picfrm_b194.png new file mode 100644 index 0000000000000000000000000000000000000000..bada8a3917d06b2a24fd0670e27fa80bd4e547e3 GIT binary patch literal 1969 zcmXw4dpwhEAHR27YYwYL%d(OXnx4?iv9dYjET^%Ea(Gwd%$~=iFe;~H3aN#6$!V*N zipN>x5t75RQC^2a<*>B$lJU^%z1QdS{Bhma@4mjj>-+g$zw7(?U74;fwkSCjIRF4q z_IB3p002va;$uhz^rb$&atxYavF^5(0DoZL0`z13FRDGw*%`n?F%p2KhX8PC3N%!p z0RS>=7$5`9FzFf_{0D`lv1R^=0VydE`qf_q0NZi))@09k*q7n}_wiG^8Q#ZCgn`Ef zP!me|?|=w2Ez0Z%#)LctAJx_|h0S_9tmPH4#i)5y1NrWrv3r4+n@@9n&mM8SQ}VH3 zJ>Nd8_ECNFds_ThedK%j*CVY&dK*a4-|lOBJw1y4TbR>QP=F~5Z1N=sL>K-hqlAc* z?;`_nwWZ@oC#@efs~U;O4Sdl29|PG>tT1PgDG=lu1k$|~5|=x@jT1I`Ik*4%jJ~Y~ zz>uCU?6#~9gmFdlh{vHfld7!tEA9oE`bZK05;a`Ub)DDx)G}#tO*>*orzMRCdxNLU*bp|I(Ub;%qbhYSG z6LYw@fmmAN)(B75Hqd=0RjPOqIqYcAH~A@SE4_>mY;dL>*fYm*@LVN0Wq>`JZx}h z<6>u6-_m{}m3XA{MiZJr`bBo_5jME4hKrgj<79u(DNt(B<2Z}001#bum+?G{EUei2 zCU(8~=ufv7i4>G}Ds&lJ$Tbf3&lAL_3%bC@Qh8A7)WqgW_mfn^pr~_{jtn%C)P4?3 z!Xum|!~L|P?#6)A{p*E)yzk0=T(F^4zX+$iR7mWPIZYAi6qKqnlO9qs)h+I^MQG_W@0qjw-;u8oTcW|}yx zS1>9eJQ;bdLk@FQoEH0}KFNR_^3qLFX|J->CuWKbIKRHE2Y=@^vlh(sk}nsFN?1mw zGi}_xw)TYJc%S!&A(yGKZAkv1O#epARUXyAt`kbd-84xEb<>9uake4UTF2u%VbE!P zz*X-My|`rlqj0K$-&~BC6Ve%mn>2B-4MDj>wkNggfvb5d-8}4~UIE?7OWtR}?9-Q| z5Xo@uEpE4)sItz^6p{stL}ufx7H*6O)nNEot&LDXQ&rG1&$*66(w#g6I|YnAB`7#l z7|gDk+2xg*Xl&(BZKvRV&ZGxD-}O$s-TL<0hb+YKSl*`Jw7s-9K#3nZYReZ)(*}jO z@*mhS>!jm_ z^gG0>w-KJYIf@~qKGq?r&_1Pk?PA^g6b1Eo?!GKm0oUbixTv7h=<0M7lzZsjL`RK`CD@&O%zv~_vGSX;C7znV@}jkvvw*sw;?IvOzNe{ou9sz1 zXULB9d0SD%iCEvY1c&MR_;50st5?cFc(&y6N#>JX%c|P_3#?Dm* literal 0 HcmV?d00001 diff --git a/innovedus_cms/home/static/img/picfrm_b300.png b/innovedus_cms/home/static/img/picfrm_b300.png new file mode 100644 index 0000000000000000000000000000000000000000..d9d2f5aba78a85bf4a89186d829f4e42a0e2f40c GIT binary patch literal 2436 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 kQ~PU?Z?aIhF65C8xG literal 0 HcmV?d00001 diff --git a/innovedus_cms/home/static/img/picfrm_b426.png b/innovedus_cms/home/static/img/picfrm_b426.png new file mode 100644 index 0000000000000000000000000000000000000000..25675e1da8f1b382af61ea4700361c2fd854d0d5 GIT binary patch literal 2720 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 literal 0 HcmV?d00001 diff --git a/innovedus_cms/home/static/img/picfrm_o139.png b/innovedus_cms/home/static/img/picfrm_o139.png new file mode 100644 index 0000000000000000000000000000000000000000..916760fbb95d8b25bebd9e34ccc87f9bc1e1e1e6 GIT binary patch literal 938 zcmeAS@N?(olHy`uVBq!ia0y~yU=#zgjX2nVQR1$T)6dM?r z)-oJ)QdVeah-pZeI5|jwk%dF7ih+^k2@^~AoGDEl3Jx1CFmosE0*h|Za(p&+-Ya-RwIaN98D4pWRZ&`GN& znHH+8_XfI3BkX|FpE*fB=0~{-9&#uw5Z_?noyIHNJ#ShU#}pld-ny^ds}II@Jlv7O zxlWdmMT99#cHb`BOnLKY4)Lx@R~#4`AF(deyTEq3=;myZ^Nhgou!&l*u6|DSM6-xr zkF)ZQUHOy|%B2vnr6Km)@px_Zh`p7wmrpZ}n^r6&#v*Vd{=lldsE_B@H62|(E#X?9 z;cxM$!W=-=4#MYlXC9ReJNU@DJwH#qMzx3&sJvoD!_k6?n;#eb{qwEx^Dq6H>O$Ke zQ^J++r#S+n?Vb3B$htj$az6ja7xpgSu&!GFlbQaxQiU~w4hgdlY+1K|exCJ)(xjJu zf67c}9Fe$J_8Ta}z$pGlV2aXG`Hr9RsDvIg?hoI`;&Van4WSysowB; z4*UD^)~?rYc*N`v=AU|U++%s~P51lhjtq@PtTkSddgAIo=be&|Uvc+mXvXCC?+#CX z==lDD&e0DxEf#ld&e<_>{E27UuQtUjK<)2G8-H#7=xFVdQ I&MBb@0Am+cB>(^b literal 0 HcmV?d00001 diff --git a/innovedus_cms/home/static/img/picfrm_o194.png b/innovedus_cms/home/static/img/picfrm_o194.png new file mode 100644 index 0000000000000000000000000000000000000000..b2f646a7674c7fe1a8f380ab4043f76a2fe75ef3 GIT binary patch literal 2031 zcmXw4dpy(YAOCJ4?guDYrCQ*2tyML2h%xrj*=;Y^klpiH=2Ma@e)rR?pam9poa7AD_v_9=AH;A!a)i4(U<%nN0LG#L2zdxJw4nh2 z3Z*bW0a{`5y;As3FN|5L@Y4q5pg`2;;12+xc zHJg9!p*SLNQatKvq4?N{ezUkOweAZ#C!}6tV;ha}e?bQjIInOxdmnn@K{WoyJasp{ zpxStoEeJVkT}z)ao$Ms@AzbREq=m6poMnzxo+1oID2+nYp2n_rrnNn3&$*FZcy?r~ zTDk!MLs3<0YACsGGwM{D6SiRTMpf~CS^VQ1iQMO43}@rf{qNSxUL4MvXquM-5CddG3q zn%^lVCJxro)?B02%hD0N>$gJyTu3Z6WImlfWGeSqwi}IImAb@ho2(iDj7kG9Wr5c% zfi2DV^H&p9KIb_r5k&}XMIp{%pL2$-w)K;RbGni~h^jolUFwVuOlJJQ--^AIb zAf2wlAfPjYTl-V>FC8d!>C(4s4H9%WS^BS;C~(*slTd|gK~#su`&)B?b>a*WTw+@m zLc78{j>K;|{|^Cx`x=0B%7C!M4&}*x8{^@Zy?9}xNa>iH@}!luI-jGgo(VyyfPM{> zn3de6dI>dVK_b&J{JFXsUH6qWFC;!^AJl6E6U6hvE#(0= zgAJD>+LEUOlRt>WrYI-^;+Ggh9-)Gs)0^TrdTOws&wDE2~o&2*M;V%j0q0+A7ZtZa(? zqb4vi_&oV*cX>XMDR0viltYiRr3G4+6O>mL_WAm5vHxq8Q9)6XsKt898|jm2Xa(JR z7%Gi>B`i7r)KLogt)73G!lL56;~!*%KqNk$54`{Q4iIxM~$RR;4~=BDmpSysY?e!+I3ZV1xH z?1ox6p%IKkLoY58_IWL#^-aJZ^NUb8%xLoM4z33$x4rIlEO&H~6I~IZR~eRW+ju~; z9Kx-3>(Ei0akL>DO4$^t!iG{|Q9N~ZsMtJ!w$SQ(Q;qh?UzkwUefwcZBf4gJ+UCIe z!96HQ_myff$Uo;Chi_DADe?x00*j%S=k~rnKX5i=D(&U1FEe+elB1SlxmqJdDTP}? zeB+2kCDNhsUbhYeih%otk*M2sF#ImZcElptcwK3IOt#2yQ&|>lY&Pus(eOT&YddJ{ z@lYusoS@S;CtN2bT+14QUKc`WF=0G?;^V%h`ozYI6kd*~WNFPSRG33s$=6t9v$y?~ zIKHiMoqGR_)?X*|XgT mPkTE)S{~lR>JsmLx}sTxuM(Pezmorq0rFuFV!dq literal 0 HcmV?d00001 diff --git a/innovedus_cms/home/static/img/picfrm_o300.png b/innovedus_cms/home/static/img/picfrm_o300.png new file mode 100644 index 0000000000000000000000000000000000000000..045ef82f36bb4b5cc22ad897000783c9ae4abaa4 GIT binary patch literal 2499 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 GkokY@b6Y_G literal 0 HcmV?d00001 diff --git a/innovedus_cms/home/static/img/picfrm_o426.png b/innovedus_cms/home/static/img/picfrm_o426.png new file mode 100644 index 0000000000000000000000000000000000000000..48ca2c7fe395486f25e279122030583b2081e4fe GIT binary patch literal 2784 zcmYjTc|25m8=n~?W2vSnBAKjn8KE?~mfO%^rqI|)xX_PLhGAlo3zmC91ng2|ec zY;z575|PN**DEi{l65Q%?>Wckem?IXXU^|;&hvYo@AvsW&vPb`VrINwNKyy}gY74i zh!!vypB1n^joJtNI>=|o12=e}g|Pvw?9=gYz=r5%M|L+gg((AT6bv5k0Yic&z$FP> zz;Ol~#s}Qt;4=o|-?w~L48DKYu+yO7rQD287)A-f?zz@D%IQVPR_~3R1wM_R!S9izXwk`~ zF+ue)lC|j2nf35wG2Y}-XTh$AwX72gLxUkuxT^&1(!Rp^qWG@em#>aAyTA23pFQtT z-jH3y<8Axri%PB7a&F&91xzsv74-K%jeYkHW{RT|!(tjYx0h9Y-`-&9jU>sEeae3q z1ndC6TL>|$t%B7A@EFC(IkJYQ`pX!uAvWPfc)m)*^(HminKp2$8AomZBEO7~Ze!NKEj zQ@D__sp*yh4A^27oK1qf7ei+=J%d_OM#KzqYF|gTbPR~>nW_P%YIw<$Ach;L+`Rln z&8>&M#@YDw>WgPhJheci?2kh z8F3qLLG;!6vCJmj#bim~kR5|2Pvti^k;+UmZ$ST=TlHuU6KVs<#b#UA0njn~68k7# zxTf%%uHM*5M$`AqE)@9KIS$6p5jk$N$4;0uy_pkv_suQVrO0>8F~h{0V6KpDfS-Fu zT%pKt->6U^mJSU|5zMqz%P}7F|>#F$C>G1go7BLid?}m42RNF0L_OPu-(W zU<3Tyj8pJX$`ttJ$zOJyT8-X#FCdh?TNY&0AZd`w!W4?N;&VQTs6iA?k=3U%?BgUQ za#S=~qkN)5270k6NTGCeX6u2-qlDVeE3#0voZs{+EYaMgDp$R|YA^(3F*GPK29wW} zcaFjKs!-Ltt9O5QbN%X?{}#`PmRP$Ot!V_l_XBKyN<(??!D6IKG4w@&hWZ4TK!&wd z4UJCv8j%uH=mo`wA+b!vxmJ-wz%jc!v^J`^?Q<(MbwbnlAPiB*edU4z|{G}WJ@9&3i@q0~$O++u@2 z9n%1-UI0$^*4@0@d)MT+Z|b_6$?J!v@Z*j%n~x-@m(OKG!uQ5FPeQkpAz3O?;E(fLgY9H%ks**sn{=`IZ_$DTaIV1(&TXQYFqgpZ~X&nS*)PId-Mr4865n=kf9{JB_l ztqN*i0!?6hSqrK{h5{h5rfYX#G`2wc#eQapcA)3@>$uR5^Lh@RQIes&N~ovD{RRDE zXZ`ao8^r+qiX#yY1MS-SVD%sUhow8|IkI-VDVH8K;(=l=@gStfNfe-mU)C`>02`%} zmf+zv|8&6HC#zbUTIrxsrzKOw(z%@DfV8qY^ZYDegQgSO#f`9q+5X_gup7UPaKGzTV0dhLto6r+z^p*}nADI>=~ zKO)9A@Y=8d0g@1HUa3p*<~f1gK<+=m(eXTY4!wJ33n&wFKG7X}l3H@k(-- zCi=vB&SJX-R2tiJP3N}POl9w>5s45`gF~NF$l^-}o<2bM;BSXtbmfA#|@0d@_ImP!kH9gRJ;NIfm}o3Vd9-ivooMLD7lY-FDF zdMj9%z~De#%^!B>=eT7Y`f?2MD_2AmAjrgES~=pRShKPmd`?PdpUiBCXpUp4#9Hr= zr8v7WqJ^5Pv_%AzI+4rnNKLZWpSt__o5;ZhTmTy^-C=(3JCqvpmrHo~d=9 zphSfgqD~q@T4lOFg9FL@u)kQh<*#d) zzfYe^Xxa&RJ2^C3Ig)LYT${5@(k`2}XB-2ayyUO#+-djBuP`50W)2TFGM3{1&&l{4 z&bls`wDzP3=xvbCEEdiwCjlw|!F@G1Q`>+Cpm4nY)e_!jP7VM5J zyMXx647O>8Ij50((8e1TJHQ-Fy?l#XQoK`mL`(SDvRBAh#g%mXP1+1NM+ppkly~;y z(v++rmeZ(NfN)Xq{>pEW;@wp>My;IFJJ6^{k)3s0nX?~E&y;B?vVOois$7!8S{BM2 zsxRU9`XLRm{!fM~ zI4Tr%#~V0EQI>)no;)rQ-gYZK+Vg~JvIh_S7GDZBOiy^Z1~is*{wMxdpX!@&9%L{7<2?7^xx+b5{bI~~`+56# z5XKKbt@l773BWE8tuTJnGl{ rS7QEk*+5y@YjeS)iQDPz)9O0{s+4lG8v4ck;J-_8$UCK-%v88ONN^vYjnGz5XK-)vV^i{shezB1~In5m2}BgjLI@3*|J|- z%W#YQJ_s3&tRwPsZIiK26MpBMx%ZEA&il^1@ArA0@AG}0_x;1#iYO|A6#)Q1)a=4J zTL2Jf2ge#{A@Ke1M*U&%g9x!D8UxjRGV|c%oTsDNO-oDQI5t`S90y8jYpib z?DVW4WXD?w#L9J=A@Nci04@t~#kt8XuSdGO&5n{@k49qVF7CaC?8miV6-2d%%%0YT z!5lBfzq#rV+aEf;JX9qw#PnkEF2Vr+lfwZ8Nfo-n@SZ`DJDV^1yABkaA#Ph-tk=Gk zdj<|C!<+!*nGfpoLpy-%GHr69)dX+w)LvC1-R(FAkdd#4F~HoA7M}sf>+$vK_!m38 zncdga?Xpkoj{A;={eG0SL!fT}0#Qrj2TAadk1sCX9Zz5|0G`KFfx$nZu+UdPEC&=L zAD#?d#<`CalPKi}zO~?+#36uq9~7#cQ6^;q2jQ!T8P)AMnp$k`nVDun)~lv1^F6JI z16nE`?eZr9$Wt6Uc0F+h-L{_Va_D;M<$4&uLIfRGnLN)Y6oOi_h(4XHq1a(7;ggjX z1`+Vco&e}q<&pS6LP(DN*H&dZwo^wX<;tDSvgJ{jK7t(r5oC92hd=R0z1>ZajE!lj zoIOyDOsc=_z-xAgz#Q>l3Rm+ltI0!5Ae~SFnw(E%0#?Fx(@pFBDR9WW>R?(P51?R! z9$b{I>eDf+=+m}!;o;5K()E?3p&Wb2fhpb>F)E`4bNQ&0;JwA0n22B(b&va1r6--j zu_`sr!!~ihT7VH)m`cMd%Np7XmuyNyXz1(4FMjsSWHY2l>X2s^khlu8iI#kAC}h+u zeS|a`y}Kc6_*G{h3sZ^yVwcw1YXmLW_z43HZ;iX~CDx*Z5qCFeW9oRCG;lwJ*-+NL zGjfx}O7o@%YaP>dCa5vw@{ihl27d?hf}~dSqiYp>OR4T~m|qCA$;vH4ORK5*xwMW? zH?)V_=jaS$d*K|1E8_sVUR0D4%-Pm?oDelX&olkWhwQz)6V>V|Im!r*Q_s44w&|0} zz6%h|Dk7lBkkAN6zzHwSzWhG6;~Asbx20tn`91Q8z_hj(tM_~3@M5z<#}m7cWN_us zWdd-ue=Xn>ylLupf_Il%rJf}AW~9p*?3jrXd9%%3)=+xTtyNWUK~88X`#)INokmHJ zh+QJUSF0P2YS8Vu!rhr!ULXHf%k9>9eUyo}bWub~Mz{gg3!~$5mhU@@@fCFe_h$&zz&Fb?QN4fGerxA@r}{_n zpE;E zwo_pCw~=?7VUi1vB8&1t{oe!YQbm($>KmSAitX~(gX}BB-@Rn9gM%Cc;v6V|}zf|h_5U%PVnxOHkgK0hQc+vOLQsFo-|5eTaJzH4l z?(OHiKihFK#8nV4x+J#h^B8VYR5RS++1Qy0Vk#@g$A)SAk44D~iV5{fbdgT6cUxD= zPlJNg&A_vMJ9(qhFB)G87eK8HvPkFFouDO=mEb(9O1L8;wb6IN+E^2BicCr@FDucp zb?L!t&(c=zefa6gu(Pb#Z-s3R*Y3e3V=Wt>@O~<+$U1bP;ij4*ob1zwk7OAv+~CIS zfx0UfcTatg-fSG0K5E}+pwuy%`L&_q3DgE1!{P_5>b@23e=vyXq10EULy<0=$Y@@& zIr#ii^zC;MWF}Z8Yj>B$10#og!;>*?mih!DB)77Jb|dGnH~_EuvvtyGmt*`+LL*p2 zZ|DzKc&SEdZ63kSE`mw9o<9@%YU|7A7`_f0F*@c*U345nxuhVcyfdO1F3+-j!sq_% zZC_?RQGCF#*G@upS#8(d)J_e(ID9$Z2C?k_T^cAvira-4P<0f~@YthM6@@VpMa zu5O3i53Jzc5QdDhXQpk;ml5}F`40i!LZGAS^!8a+;vAxO&QoG<$Qc3q*`k6m=AIe; z#9EIIP$OMIq*yjGUANqim=zN4!voY=C zHvg!UaPr7l4p#0G84PKS08bl(3a{2~`4TZefhV(AB>>u?+TyZ0-R_gNPX5BS1@g{x zj3qWr=OnC8@|!xw(K>$nkMQba?yjy;5$51=EY@m69jQi&J%~BZB?l~uf*8K?K`Rq& zLUqd}vu^w17)-ao*{*FAK_(jB1=BJvlsS*+P#pN>ZI-(_Jpf zcK81{8`EoU{Nk~qB~&(v2X+45c&YmQ%_bHLl)4}GGu+{hFAogA*5a2{)XAXGp?--a zusXtXwS_OEquBng~oaq$P|MrJJZp9P*|$ za{0`l$GzffN{-$%=zcgC)bqhcTZLEzz75$~;#vZ@_AEvR( AlK=n! literal 0 HcmV?d00001 diff --git a/innovedus_cms/home/static/js/block_list.js b/innovedus_cms/home/static/js/block_list.js new file mode 100644 index 0000000..edd7129 --- /dev/null +++ b/innovedus_cms/home/static/js/block_list.js @@ -0,0 +1,45 @@ +(function () { + function initBlockList(block) { + var list = block.querySelector('.block-list'); + var left = block.querySelector('[data-dir="left"]'); + var right = block.querySelector('[data-dir="right"]'); + + if (!list || !left || !right) { + return; + } + + function getScrollAmount() { + return Math.max(200, Math.floor(list.clientWidth * 0.8)); + } + + function updateArrows() { + var maxScroll = list.scrollWidth - list.clientWidth; + var hasOverflow = maxScroll > 1; + var atStart = list.scrollLeft <= 1; + var atEnd = list.scrollLeft >= maxScroll - 1; + + left.classList.toggle('is-hidden', !hasOverflow || atStart); + right.classList.toggle('is-hidden', !hasOverflow || atEnd); + } + + left.addEventListener('click', function () { + list.scrollBy({ left: -getScrollAmount(), behavior: 'smooth' }); + }); + + right.addEventListener('click', function () { + list.scrollBy({ left: getScrollAmount(), behavior: 'smooth' }); + }); + + list.addEventListener('scroll', function () { + window.requestAnimationFrame(updateArrows); + }); + + window.addEventListener('resize', updateArrows); + updateArrows(); + } + + document.addEventListener('DOMContentLoaded', function () { + var blocks = document.querySelectorAll('[data-block-list]'); + blocks.forEach(initBlockList); + }); +})(); diff --git a/innovedus_cms/home/static/js/horizontal_list.js b/innovedus_cms/home/static/js/horizontal_list.js new file mode 100644 index 0000000..3a52dfb --- /dev/null +++ b/innovedus_cms/home/static/js/horizontal_list.js @@ -0,0 +1,45 @@ +(function () { + function initHorizontalList(block) { + var list = block.querySelector('.horizontal-list'); + var left = block.querySelector('[data-dir="left"]'); + var right = block.querySelector('[data-dir="right"]'); + + if (!list || !left || !right) { + return; + } + + function getScrollAmount() { + return Math.max(200, Math.floor(list.clientWidth * 0.8)); + } + + function updateArrows() { + var maxScroll = list.scrollWidth - list.clientWidth; + var hasOverflow = maxScroll > 1; + var atStart = list.scrollLeft <= 1; + var atEnd = list.scrollLeft >= maxScroll - 1; + + left.classList.toggle('is-hidden', !hasOverflow || atStart); + right.classList.toggle('is-hidden', !hasOverflow || atEnd); + } + + left.addEventListener('click', function () { + list.scrollBy({ left: -getScrollAmount(), behavior: 'smooth' }); + }); + + right.addEventListener('click', function () { + list.scrollBy({ left: getScrollAmount(), behavior: 'smooth' }); + }); + + list.addEventListener('scroll', function () { + window.requestAnimationFrame(updateArrows); + }); + + window.addEventListener('resize', updateArrows); + updateArrows(); + } + + document.addEventListener('DOMContentLoaded', function () { + var blocks = document.querySelectorAll('[data-horizontal-list]'); + blocks.forEach(initHorizontalList); + }); +})(); diff --git a/innovedus_cms/home/templates/home/home_page.html b/innovedus_cms/home/templates/home/home_page.html index 718cf8d..6af0092 100644 --- a/innovedus_cms/home/templates/home/home_page.html +++ b/innovedus_cms/home/templates/home/home_page.html @@ -1,20 +1,33 @@ {% extends "base.html" %} +{% load static %} {% block body_class %}template-homepage{% endblock %} +{% block extra_css %} + + + + +{% endblock %} {% block content %} -{% with top_section=sections.top_section %} -

- 最新文章 -

- {% for section in top_section %} - {% if section.layout == "block" %} - {% include "home/includes/block_list.html" with items=section.items %} - {% elif section.layout == "horizon" %} - {% include "home/includes/horizontal_list.html" with items=section.items %} - {% endif %} - {% endfor %} -{% endwith %} +
+
+
+ {% include "base/includes/home_banner.html" %} + {% with top_section=sections.top_section %} + {% for section in top_section %} + {% include "home/includes/news_list.html" with section=section %} + {% endfor %} + {% endwith %} +
+
+
- {% for section in sections.category_sections %} - {% include "home/includes/category_session.html" with section=section %} - {% endfor %} -{% endblock content %} \ No newline at end of file +
+ {% for section in sections.category_sections %} + {% include "home/includes/category_session.html" with section=section %} + {% endfor %} +
+{% endblock content %} +{% block extra_js %} + + +{% endblock %} diff --git a/innovedus_cms/home/templates/home/includes/block_list.html b/innovedus_cms/home/templates/home/includes/block_list.html index 1bd06ed..932e07b 100644 --- a/innovedus_cms/home/templates/home/includes/block_list.html +++ b/innovedus_cms/home/templates/home/includes/block_list.html @@ -1,19 +1,23 @@ {% load wagtailimages_tags static %} - +
+ + + +
diff --git a/innovedus_cms/home/templates/home/includes/category_session.html b/innovedus_cms/home/templates/home/includes/category_session.html index e12ec5d..177941d 100644 --- a/innovedus_cms/home/templates/home/includes/category_session.html +++ b/innovedus_cms/home/templates/home/includes/category_session.html @@ -1,13 +1,15 @@ {% load wagtailimages_tags static %}
-

- {% if section.url %} - {{ section.title }} - {% else %} - {{ section.title }} - {% endif %} -

+
+
{{ section.title }}
+ + 查看全部 +
{% if section.layout == "block" %} {% include "home/includes/block_list.html" with items=section.items %} {% elif section.layout == "horizon" %} diff --git a/innovedus_cms/home/templates/home/includes/horizontal_list.html b/innovedus_cms/home/templates/home/includes/horizontal_list.html index 0775831..8f6c7f6 100644 --- a/innovedus_cms/home/templates/home/includes/horizontal_list.html +++ b/innovedus_cms/home/templates/home/includes/horizontal_list.html @@ -1,19 +1,32 @@ {% load wagtailimages_tags static %} - +
+ + + +
diff --git a/innovedus_cms/home/templates/home/includes/news_list.html b/innovedus_cms/home/templates/home/includes/news_list.html new file mode 100644 index 0000000..6479bb0 --- /dev/null +++ b/innovedus_cms/home/templates/home/includes/news_list.html @@ -0,0 +1,82 @@ +{% load wagtailimages_tags static %} + +
+
+
+
+
本日頭條
+ + 查看全部 +
+ {% with first_article=section.items|first %} + {% if first_article %} +
+ {{ first_article.title }} +
+ {% endif %} + {% endwith %} +
+ {% with first_article=section.items|first %} + {% if first_article %} +
+ {{ first_article.date|date:"Y.m.d" }} +
+ + {% if first_article.intro %} +
+ {{ first_article.intro }} +
+ {% endif %} +
+ {{ first_article.body_search_text|truncatechars:120 }} +
+ {% else %} + 目前沒有文章 + {% endif %} + {% endwith %} +
+ + {% if section.items|length >= 2 %} +
+ + +
+
更多頭條
+ {% for article in section.items|slice:"4:8" %} + + {{ article.title }} + + {% endfor %} +
+
+ {% endif %} +
diff --git a/innovedus_cms/mysite/static/css/mysite.css b/innovedus_cms/mysite/static/css/mysite.css index e69de29..fde066a 100644 --- a/innovedus_cms/mysite/static/css/mysite.css +++ b/innovedus_cms/mysite/static/css/mysite.css @@ -0,0 +1,288 @@ +a { + text-decoration: none; +} + +.site-header { + position: relative; + z-index: 10; +} + +.header-inner { + display: flex; + align-items: center; + gap: 24px; + padding: 30px 105px; +} + +.logo { + display: inline-flex; + align-items: center; +} + +.logo--light { + display: none; +} + +.logo--dark { + display: inline-flex; +} + +.template-homepage .logo--light { + display: inline-flex; +} + +.template-homepage .logo--dark { + display: none; +} + +.main-nav { + flex: 1; +} + +.main-menu { + display: flex; + align-items: center; + gap: 24px; + list-style: none; + margin: 0; + padding: 0; +} + +.menu-item { + position: relative; +} + +.main-menu-link { + display: inline-block; + padding: 12px 4px; + font-variation-settings: normal; + color: #0e1b42; + font-family: "Inter:Regular", "Noto Sans JP:Regular", sans-serif; + word-break: break-word; + font-weight: 400; + font-style: normal; + font-size: 14px; + letter-spacing: 0px; + line-height: normal; + --letter-spacing: 0px; +} + +.submenu { + position: absolute; + top: 100%; + left: 50%; + transform: translateX(-50%); + margin-top: -2px; + min-width: 220px; + list-style: none; + padding: 14px 0; + background: #fff; + border-radius: 16px; + box-shadow: 0 12px 30px rgba(0, 0, 0, 0.18); + opacity: 0; + visibility: hidden; + pointer-events: none; + transition: opacity 160ms ease, transform 160ms ease; +} + +.menu-item:hover .submenu, +.menu-item:focus-within .submenu { + opacity: 1; + visibility: visible; + pointer-events: auto; + transform: translateX(-50%) translateY(2px); +} + +.submenu-item a { + display: block; + font-variation-settings: normal; + color: #0e1b42; + font-family: "Inter:Regular", "Noto Sans JP:Regular", sans-serif; + word-break: break-word; + font-weight: 400; + font-style: normal; + font-size: 14px; + letter-spacing: 0px; + line-height: normal; + --letter-spacing: 0px; + padding: 10px 18px; +} + +.submenu-item a:hover, +.submenu-item a:focus { + background: rgba(0, 0, 0, 0.05); +} + + +.header-search .search-input { + display: flex; + align-items: center; + border-style: solid; + /* border-color: #0e1b42; */ + border-width: 1px; +} + +.header-search .search-icon { + display: inline-flex; + align-items: center; + justify-content: center; + width: 28px; + height: 28px; + background: none; + border: 0; + padding: 0; + cursor: pointer; + color: #1b2140; /* icon 顏色 */ +} + +.header-search .search-icon svg { + width: 20px; + height: 20px; +} + +.header-search input[type="search"] { + border: 0; + background: transparent; + outline: none; + color: #fff; + width: 160px; /* 依需要調 */ +} + +@layer figreset { + :root { + font-family: var( --default-font-family,ui-sans-serif,system-ui,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol','Noto Color Emoji' ) + } + + html { + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: transparent; + -webkit-font-smoothing: antialiased; + width: 100% + } + + body { + margin: 0; + width: 100% + } + + body: has([data-page-overflowx='hidden']) { + overflow-x:hidden + } + + body: has([data-page-overflowx='auto']) { + overflow-x:auto + } +} + +footer { + background: #0e1b42; + color: #ffffff; + padding: 24px 0; + font-size: 14px; + display: flex; + justify-content: center; + gap: 48px; + align-items: flex-start; + text-align: left; +} + +footer .company-info { + max-width: 300px; + margin: 0; + padding: 0 16px; +} + +footer .copyright img { + margin: 10px 0; + width: 265px; + height: 37px; +} + +footer .copyright p { + font-size: 10px; + text-align: left; + margin: 0; +} + +.footer-socials { + display: flex; + /* justify-content: center; */ + gap: 12px; + margin: 16px 0; + flex-wrap: wrap; +} + +.footer-socials .icon { + width: 32px; + height: 32px; + --fill-0: #ffffff; +} + +.footer-socials .icon circle { + fill: #ffffff; + fill-opacity: 0.85; +} + +.footer-socials .icon .icon-cutout { + fill: #0e1b42; +} + +footer .footer-links { + padding: 0 16px; +} + +footer .footer-links li { + list-style-type: none; +} + +footer .footer-links a { + font-size: 14px; + color: #ffffff; +} + +footer .footer-divider { + align-self: stretch; + display: flex; + align-items: center; + padding: 0 8px; + width: 1px; + border-left: 1px solid #ffffff; +} + +footer .footer-sections { + display: flex; + gap: 32px; + flex-wrap: wrap; +} + +@media (max-width: 768px) { + footer { + flex-direction: column; + align-items: center; + text-align: center; + } + + footer .company-info, + footer .footer-links { + max-width: 100%; + } + + .footer-socials { + justify-content: center; + } + + footer .footer-sections { + justify-content: center; + } + + footer .footer-divider { + width: 100%; + padding: 12px 0; + border-left: 0; + border-top: 1px solid #ffffff; + } + + footer .copyright p { + text-align: center; + } +} diff --git a/innovedus_cms/mysite/templates/includes/footer.html b/innovedus_cms/mysite/templates/includes/footer.html index ee5cc23..e01dbe0 100644 --- a/innovedus_cms/mysite/templates/includes/footer.html +++ b/innovedus_cms/mysite/templates/includes/footer.html @@ -1,32 +1,73 @@ {% load navigation_tags %} \ No newline at end of file + + + + + + diff --git a/innovedus_cms/mysite/templates/includes/header.html b/innovedus_cms/mysite/templates/includes/header.html index c2f028d..febedd7 100644 --- a/innovedus_cms/mysite/templates/includes/header.html +++ b/innovedus_cms/mysite/templates/includes/header.html @@ -1,45 +1,83 @@ {% load wagtailsettings_tags wagtailimages_tags %} {% get_settings use_default_site=True as settings %} -