Skip to content

Add semester-aware archive banner with required date and archive path validation#131

Open
Copilot wants to merge 4 commits intomainfrom
copilot/add-archive-banner-feature
Open

Add semester-aware archive banner with required date and archive path validation#131
Copilot wants to merge 4 commits intomainfrom
copilot/add-archive-banner-feature

Conversation

Copy link
Copy Markdown

Copilot AI commented Apr 17, 2026

Preliminaries

  • I have read CONTRIBUTING.md
  • I have added tests, if applicable
  • I have fixed CI issues
  • I have set reviewer(s), assignee(s), and label(s)

Summary

This change adds an automatic archive state for course sites: when today is outside the configured semester window, a full-width archive banner is shown at the top with a link to current offerings. It also makes semester dates and archive link configuration required and validated so banner behavior is deterministic.

  • Config contract (required semester window + archive path)

    • Added required _config.yml keys: semester_start_date, semester_end_date (ISO YYYY-MM-DD), and class_archive_path.
    • Updated _config.yml comments for class_archive_path to explain usage, keep default /, and suggest /archive.
    • Extended _plugins/config_validator.rb to validate:
      • required key presence
      • ISO-8601 date format
      • semester_start_date <= semester_end_date
      • class_archive_path must be either:
        • an absolute path starting with /, or
        • a full URL
  • Archive banner UI + behavior

    • Added _includes/header_custom.html with hidden-by-default full-width banner.
    • Added JS to show banner only when current date is outside semester range.
    • Banner text is bold white text:
      • This site is archived. Please check: {url}
    • Link target derives from class_archive_path.
  • Styling

    • Added .archive-banner styles in _sass/custom/custom.scss for fixed top placement, full width, and contrast-safe link styling.
    • Updated the banner background to use a Berkeley color variable name ($berkeley-rose-medium) defined in _sass/berkeley/variables.scss.
    • Added body offset class when banner is visible.
  • Tests

    • Added spec/jekyll/config_validator_spec.rb coverage for:
      • required semester dates
      • date format and ordering
      • required class_archive_path
      • valid URL path forms for class_archive_path
<div id="archive-banner" class="archive-banner" role="status">
  This site is archived. Please check:
  <a id="archive-banner-link" class="archive-banner-link" href="#"></a>
</div>
https://github.com/user-attachments/assets/ae0d04e6-f5f5-431d-9ff7-d287ed242657

Copilot AI linked an issue Apr 17, 2026 that may be closed by this pull request
Copilot AI and others added 2 commits April 17, 2026 01:17
Copilot AI changed the title [WIP] Add full-width archive banner with redirect Add semester-aware archive banner with required date config validation Apr 17, 2026
Copilot AI requested a review from cycomachead April 17, 2026 01:20
Comment thread _sass/custom/custom.scss Outdated
left: 0;
z-index: 999;
padding: 0.75rem 1rem;
background-color: #d02670;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, this is wrong / should be a berkeley color, but otherwise... not bad!

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated in 178b839: the archive banner now uses a Berkeley color variable ($berkeley-rose-medium) instead of a hardcoded hex. Screenshot: https://github.com/user-attachments/assets/ae0d04e6-f5f5-431d-9ff7-d287ed242657

@cycomachead
Copy link
Copy Markdown
Contributor

@pancakereport I'm just trying to keep messing around w/copilot and other tools, but I think this is a nearly complete solution to #122. Not tested, but the screenshot it attached (which, that is cool!) looks good and the good itself seems right.

@cycomachead
Copy link
Copy Markdown
Contributor

@copilot

  • Ensure site.class_archive_path is present in the _config file. Add a comment explaining when/why it is used. Default to '/'. Suggest '/archive' is a good option.
  • Validate this value is present. It should either be a valid path starting with / or a full valid URL
  • Use the berkeley color variable name in CSS.

Copy link
Copy Markdown
Author

Copilot AI commented Apr 17, 2026

@copilot

  • Ensure site.class_archive_path is present in the _config file. Add a comment explaining when/why it is used. Default to '/'. Suggest '/archive' is a good option.
    ...

Addressed in 178b839: class_archive_path is documented in _config.yml as required (default /, with /archive suggested), validator now requires it and enforces either an absolute path (/...) or full URL, and CSS uses the Berkeley color variable name for the banner. Screenshot: https://github.com/user-attachments/assets/ae0d04e6-f5f5-431d-9ff7-d287ed242657

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • accounts.google.com
    • Triggering command: /proc/self/exe /proc/self/exe --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --no-sandbox --disable-dev-shm-usage --use-angle=swiftshader-webgl --crashpad-handler-pid=18825 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/org.chromium.Chromium.scoped_dir.kt6TzM --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,5534148455961473152,9446371835707166528,262144 --disable-features=IgnoreDuplicateNavs,PaintHolding,Prewarm --variations-seed-version --pseudonymization-salt-handle=7,i,7077806178139630315,11642559095013592427,4 --trace-process-track-uuid=3190708989122997041 --enable-logging (dns block)
    • Triggering command: /opt/google/chrome/chrome /usr/bin/google-chrome --allow-pre-commit-input --disable-REDACTED-networking --disable-REDACTED-timer-throttling --disable-REDACTEDing-occluded-windows --disable-client-side-phishing-detection --disable-default-apps --disable-dev-shm-usage --disable-features=IgnoreDuplicateNavs,Prewarm --disable-hang-monitor --disable-popup-blocking --disable-prompt-on-repost --disable-sync --enable-automation --enable-logging --headless --log-level=0 --no-first-run --no-sandbox --no-service-autorun (dns block)
    • Triggering command: /proc/self/exe /proc/self/exe --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --no-sandbox --disable-dev-shm-usage --use-angle=swiftshader-webgl --crashpad-handler-pid=22998 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/org.chromium.Chromium.scoped_dir.1Lhg37 --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,13544778779020317824,7621558546135516010,262144 --disable-features=IgnoreDuplicateNavs,PaintHolding,Prewarm --variations-seed-version --pseudonymization-salt-handle=7,i,5562529354938662842,17028525667898815845,4 --trace-process-track-uuid=3190708989122997041 --enable-logging (dns block)
  • clients2.google.com
    • Triggering command: /proc/self/exe /proc/self/exe --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --no-sandbox --disable-dev-shm-usage --use-angle=swiftshader-webgl --crashpad-handler-pid=18825 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/org.chromium.Chromium.scoped_dir.kt6TzM --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,5534148455961473152,9446371835707166528,262144 --disable-features=IgnoreDuplicateNavs,PaintHolding,Prewarm --variations-seed-version --pseudonymization-salt-handle=7,i,7077806178139630315,11642559095013592427,4 --trace-process-track-uuid=3190708989122997041 --enable-logging (dns block)
    • Triggering command: /opt/google/chrome/chrome /usr/bin/google-chrome --allow-pre-commit-input --disable-REDACTED-networking --disable-REDACTED-timer-throttling --disable-REDACTEDing-occluded-windows --disable-client-side-phishing-detection --disable-default-apps --disable-dev-shm-usage --disable-features=IgnoreDuplicateNavs,Prewarm --disable-hang-monitor --disable-popup-blocking --disable-prompt-on-repost --disable-sync --enable-automation --enable-logging --headless --log-level=0 --no-first-run --no-sandbox --no-service-autorun (dns block)
    • Triggering command: /proc/self/exe /proc/self/exe --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --no-sandbox --disable-dev-shm-usage --use-angle=swiftshader-webgl --crashpad-handler-pid=22998 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/org.chromium.Chromium.scoped_dir.1Lhg37 --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,13544778779020317824,7621558546135516010,262144 --disable-features=IgnoreDuplicateNavs,PaintHolding,Prewarm --variations-seed-version --pseudonymization-salt-handle=7,i,5562529354938662842,17028525667898815845,4 --trace-process-track-uuid=3190708989122997041 --enable-logging (dns block)
  • content-autofill.googleapis.com
    • Triggering command: /proc/self/exe /proc/self/exe --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --no-sandbox --disable-dev-shm-usage --use-angle=swiftshader-webgl --crashpad-handler-pid=18825 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/org.chromium.Chromium.scoped_dir.kt6TzM --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,5534148455961473152,9446371835707166528,262144 --disable-features=IgnoreDuplicateNavs,PaintHolding,Prewarm --variations-seed-version --pseudonymization-salt-handle=7,i,7077806178139630315,11642559095013592427,4 --trace-process-track-uuid=3190708989122997041 --enable-logging (dns block)
    • Triggering command: /opt/google/chrome/chrome /usr/bin/google-chrome --allow-pre-commit-input --disable-REDACTED-networking --disable-REDACTED-timer-throttling --disable-REDACTEDing-occluded-windows --disable-client-side-phishing-detection --disable-default-apps --disable-dev-shm-usage --disable-features=IgnoreDuplicateNavs,Prewarm --disable-hang-monitor --disable-popup-blocking --disable-prompt-on-repost --disable-sync --enable-automation --enable-logging --headless --log-level=0 --no-first-run --no-sandbox --no-service-autorun (dns block)
    • Triggering command: /proc/self/exe /proc/self/exe --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --no-sandbox --disable-dev-shm-usage --use-angle=swiftshader-webgl --crashpad-handler-pid=22998 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/org.chromium.Chromium.scoped_dir.1Lhg37 --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,13544778779020317824,7621558546135516010,262144 --disable-features=IgnoreDuplicateNavs,PaintHolding,Prewarm --variations-seed-version --pseudonymization-salt-handle=7,i,5562529354938662842,17028525667898815845,4 --trace-process-track-uuid=3190708989122997041 --enable-logging (dns block)
  • dl.google.com
    • Triggering command: /usr/lib/apt/methods/https /usr/lib/apt/methods/https (dns block)
  • fonts.googleapis.com
    • Triggering command: /proc/self/exe /proc/self/exe --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --no-sandbox --disable-dev-shm-usage --use-angle=swiftshader-webgl --crashpad-handler-pid=18825 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/org.chromium.Chromium.scoped_dir.kt6TzM --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,5534148455961473152,9446371835707166528,262144 --disable-features=IgnoreDuplicateNavs,PaintHolding,Prewarm --variations-seed-version --pseudonymization-salt-handle=7,i,7077806178139630315,11642559095013592427,4 --trace-process-track-uuid=3190708989122997041 --enable-logging (dns block)
    • Triggering command: /opt/google/chrome/chrome /usr/bin/google-chrome --allow-pre-commit-input --disable-REDACTED-networking --disable-REDACTED-timer-throttling --disable-REDACTEDing-occluded-windows --disable-client-side-phishing-detection --disable-default-apps --disable-dev-shm-usage --disable-features=IgnoreDuplicateNavs,Prewarm --disable-hang-monitor --disable-popup-blocking --disable-prompt-on-repost --disable-sync --enable-automation --enable-logging --headless --log-level=0 --no-first-run --no-sandbox --no-service-autorun (dns block)
    • Triggering command: /proc/self/exe /proc/self/exe --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --no-sandbox --disable-dev-shm-usage --use-angle=swiftshader-webgl --crashpad-handler-pid=22998 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/org.chromium.Chromium.scoped_dir.1Lhg37 --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,13544778779020317824,7621558546135516010,262144 --disable-features=IgnoreDuplicateNavs,PaintHolding,Prewarm --variations-seed-version --pseudonymization-salt-handle=7,i,5562529354938662842,17028525667898815845,4 --trace-process-track-uuid=3190708989122997041 --enable-logging (dns block)
  • optimizationguide-pa.googleapis.com
    • Triggering command: /proc/self/exe /proc/self/exe --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --no-sandbox --disable-dev-shm-usage --use-angle=swiftshader-webgl --crashpad-handler-pid=18825 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/org.chromium.Chromium.scoped_dir.kt6TzM --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,5534148455961473152,9446371835707166528,262144 --disable-features=IgnoreDuplicateNavs,PaintHolding,Prewarm --variations-seed-version --pseudonymization-salt-handle=7,i,7077806178139630315,11642559095013592427,4 --trace-process-track-uuid=3190708989122997041 --enable-logging (dns block)
    • Triggering command: /opt/google/chrome/chrome /usr/bin/google-chrome --allow-pre-commit-input --disable-REDACTED-networking --disable-REDACTED-timer-throttling --disable-REDACTEDing-occluded-windows --disable-client-side-phishing-detection --disable-default-apps --disable-dev-shm-usage --disable-features=IgnoreDuplicateNavs,Prewarm --disable-hang-monitor --disable-popup-blocking --disable-prompt-on-repost --disable-sync --enable-automation --enable-logging --headless --log-level=0 --no-first-run --no-sandbox --no-service-autorun (dns block)
    • Triggering command: /proc/self/exe /proc/self/exe --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --no-sandbox --disable-dev-shm-usage --use-angle=swiftshader-webgl --crashpad-handler-pid=22998 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/org.chromium.Chromium.scoped_dir.1Lhg37 --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,13544778779020317824,7621558546135516010,262144 --disable-features=IgnoreDuplicateNavs,PaintHolding,Prewarm --variations-seed-version --pseudonymization-salt-handle=7,i,5562529354938662842,17028525667898815845,4 --trace-process-track-uuid=3190708989122997041 --enable-logging (dns block)
  • update.googleapis.com
    • Triggering command: /proc/self/exe /proc/self/exe --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --no-sandbox --disable-dev-shm-usage --use-angle=swiftshader-webgl --crashpad-handler-pid=18825 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/org.chromium.Chromium.scoped_dir.kt6TzM --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,5534148455961473152,9446371835707166528,262144 --disable-features=IgnoreDuplicateNavs,PaintHolding,Prewarm --variations-seed-version --pseudonymization-salt-handle=7,i,7077806178139630315,11642559095013592427,4 --trace-process-track-uuid=3190708989122997041 --enable-logging (dns block)
    • Triggering command: /opt/google/chrome/chrome /usr/bin/google-chrome --allow-pre-commit-input --disable-REDACTED-networking --disable-REDACTED-timer-throttling --disable-REDACTEDing-occluded-windows --disable-client-side-phishing-detection --disable-default-apps --disable-dev-shm-usage --disable-features=IgnoreDuplicateNavs,Prewarm --disable-hang-monitor --disable-popup-blocking --disable-prompt-on-repost --disable-sync --enable-automation --enable-logging --headless --log-level=0 --no-first-run --no-sandbox --no-service-autorun (dns block)
    • Triggering command: /proc/self/exe /proc/self/exe --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --no-sandbox --disable-dev-shm-usage --use-angle=swiftshader-webgl --crashpad-handler-pid=22998 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/org.chromium.Chromium.scoped_dir.1Lhg37 --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,13544778779020317824,7621558546135516010,262144 --disable-features=IgnoreDuplicateNavs,PaintHolding,Prewarm --variations-seed-version --pseudonymization-salt-handle=7,i,5562529354938662842,17028525667898815845,4 --trace-process-track-uuid=3190708989122997041 --enable-logging (dns block)
  • www.google.com
    • Triggering command: /proc/self/exe /proc/self/exe --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --no-sandbox --disable-dev-shm-usage --use-angle=swiftshader-webgl --crashpad-handler-pid=18825 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/org.chromium.Chromium.scoped_dir.kt6TzM --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,5534148455961473152,9446371835707166528,262144 --disable-features=IgnoreDuplicateNavs,PaintHolding,Prewarm --variations-seed-version --pseudonymization-salt-handle=7,i,7077806178139630315,11642559095013592427,4 --trace-process-track-uuid=3190708989122997041 --enable-logging (dns block)
    • Triggering command: /opt/google/chrome/chrome /usr/bin/google-chrome --allow-pre-commit-input --disable-REDACTED-networking --disable-REDACTED-timer-throttling --disable-REDACTEDing-occluded-windows --disable-client-side-phishing-detection --disable-default-apps --disable-dev-shm-usage --disable-features=IgnoreDuplicateNavs,Prewarm --disable-hang-monitor --disable-popup-blocking --disable-prompt-on-repost --disable-sync --enable-automation --enable-logging --headless --log-level=0 --no-first-run --no-sandbox --no-service-autorun (dns block)
    • Triggering command: /proc/self/exe /proc/self/exe --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --no-sandbox --disable-dev-shm-usage --use-angle=swiftshader-webgl --crashpad-handler-pid=22998 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/org.chromium.Chromium.scoped_dir.1Lhg37 --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,13544778779020317824,7621558546135516010,262144 --disable-features=IgnoreDuplicateNavs,PaintHolding,Prewarm --variations-seed-version --pseudonymization-salt-handle=7,i,5562529354938662842,17028525667898815845,4 --trace-process-track-uuid=3190708989122997041 --enable-logging (dns block)
  • www.googleapis.com
    • Triggering command: /proc/self/exe /proc/self/exe --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --no-sandbox --disable-dev-shm-usage --use-angle=swiftshader-webgl --crashpad-handler-pid=18825 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/org.chromium.Chromium.scoped_dir.kt6TzM --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,5534148455961473152,9446371835707166528,262144 --disable-features=IgnoreDuplicateNavs,PaintHolding,Prewarm --variations-seed-version --pseudonymization-salt-handle=7,i,7077806178139630315,11642559095013592427,4 --trace-process-track-uuid=3190708989122997041 --enable-logging (dns block)
    • Triggering command: /opt/google/chrome/chrome /usr/bin/google-chrome --allow-pre-commit-input --disable-REDACTED-networking --disable-REDACTED-timer-throttling --disable-REDACTEDing-occluded-windows --disable-client-side-phishing-detection --disable-default-apps --disable-dev-shm-usage --disable-features=IgnoreDuplicateNavs,Prewarm --disable-hang-monitor --disable-popup-blocking --disable-prompt-on-repost --disable-sync --enable-automation --enable-logging --headless --log-level=0 --no-first-run --no-sandbox --no-service-autorun (dns block)
    • Triggering command: /proc/self/exe /proc/self/exe --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --no-sandbox --disable-dev-shm-usage --use-angle=swiftshader-webgl --crashpad-handler-pid=22998 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/org.chromium.Chromium.scoped_dir.1Lhg37 --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,13544778779020317824,7621558546135516010,262144 --disable-features=IgnoreDuplicateNavs,PaintHolding,Prewarm --variations-seed-version --pseudonymization-salt-handle=7,i,5562529354938662842,17028525667898815845,4 --trace-process-track-uuid=3190708989122997041 --enable-logging (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

Copilot AI changed the title Add semester-aware archive banner with required date config validation Add semester-aware archive banner with required date and archive path validation Apr 17, 2026
Copilot AI requested a review from cycomachead April 17, 2026 06:30
@cycomachead cycomachead marked this pull request as ready for review April 17, 2026 07:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Archive Option?

2 participants