diff --git a/.ds.baseline b/.ds.baseline index 56c3afc7df..df4be33a60 100644 --- a/.ds.baseline +++ b/.ds.baseline @@ -161,7 +161,7 @@ "filename": "app/config.py", "hashed_secret": "577a4c667e4af8682ca431857214b3a920883efc", "is_verified": false, - "line_number": 123, + "line_number": 120, "is_secret": false } ], @@ -555,7 +555,7 @@ "filename": "tests/app/main/views/test_register.py", "hashed_secret": "5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8", "is_verified": false, - "line_number": 201, + "line_number": 200, "is_secret": false }, { @@ -563,7 +563,7 @@ "filename": "tests/app/main/views/test_register.py", "hashed_secret": "bb5b7caa27d005d38039e3797c3ddb9bcd22c3c8", "is_verified": false, - "line_number": 274, + "line_number": 273, "is_secret": false } ], @@ -684,5 +684,5 @@ } ] }, - "generated_at": "2024-11-21T23:08:45Z" + "generated_at": "2025-01-13T20:16:58Z" } diff --git a/.github/actions/setup-project/action.yml b/.github/actions/setup-project/action.yml index db1540fad5..9315b71721 100644 --- a/.github/actions/setup-project/action.yml +++ b/.github/actions/setup-project/action.yml @@ -15,7 +15,7 @@ runs: python-version: "3.12.3" - name: Install poetry shell: bash - run: pip install poetry + run: pip install poetry==1.8.5 - name: Install application dependencies shell: bash run: make bootstrap diff --git a/Makefile b/Makefile index ed9baf3942..9e0eeb46e9 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,6 @@ NVMSH := $(shell [ -f "$(HOME)/.nvm/nvm.sh" ] && echo "$(HOME)/.nvm/nvm.sh" || e .PHONY: bootstrap bootstrap: generate-version-file ## Set up everything to run the app - poetry self update poetry self add poetry-dotenv-plugin poetry lock --no-update poetry install --sync --no-root diff --git a/app/__init__.py b/app/__init__.py index 6f9f15e830..54248bda01 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -168,20 +168,12 @@ def _csp(config): def create_app(application): - application.config["FEATURE_BEST_PRACTICES_ENABLED"] = ( - os.getenv("FEATURE_BEST_PRACTICES_ENABLED", "false").lower() == "true" - ) - @application.context_processor def inject_feature_flags(): - feature_best_practices_enabled = application.config.get( - "FEATURE_BEST_PRACTICES_ENABLED", False - ) feature_about_page_enabled = application.config.get( "FEATURE_ABOUT_PAGE_ENABLED", False ) return dict( - FEATURE_BEST_PRACTICES_ENABLED=feature_best_practices_enabled, FEATURE_ABOUT_PAGE_ENABLED=feature_about_page_enabled, ) diff --git a/app/assets/javascripts/sidenav.js b/app/assets/javascripts/sidenav.js new file mode 100644 index 0000000000..24c9f2c5b1 --- /dev/null +++ b/app/assets/javascripts/sidenav.js @@ -0,0 +1,57 @@ +document.addEventListener('DOMContentLoaded', () => { + const sidenavItems = document.querySelectorAll('.usa-sidenav__item > .parent-link'); + let lastPath = window.location.pathname; + let debounceTimeout = null; + + sidenavItems.forEach((link) => { + const parentItem = link.parentElement; + const sublist = parentItem.querySelector('.usa-sidenav__sublist'); + const targetHref = link.getAttribute('href'); + + // initialize the menu to open the correct submenu based on the current route + if (window.location.pathname.startsWith(targetHref)) { + parentItem.classList.add('open'); + link.setAttribute('aria-expanded', 'true'); + } + + link.addEventListener('click', (event) => { + const currentPath = window.location.pathname; + + // prevent default behavior only if navigating to the same route + if (currentPath === targetHref) { + event.preventDefault(); + return; + } + + if (sublist && !parentItem.classList.contains('open')) { + // debounce the menu update to avoid flickering + clearTimeout(debounceTimeout); + debounceTimeout = setTimeout(() => { + parentItem.classList.add('open'); + link.setAttribute('aria-expanded', 'true'); + }, 50); + } + }); + }); + + // handle browser back/forward navigation + window.addEventListener('popstate', () => { + const currentPath = window.location.pathname; + + // sync menu state + sidenavItems.forEach((link) => { + const parentItem = link.parentElement; + const targetHref = link.getAttribute('href'); + + if (currentPath.startsWith(targetHref)) { + parentItem.classList.add('open'); + link.setAttribute('aria-expanded', 'true'); + } else { + parentItem.classList.remove('open'); + link.setAttribute('aria-expanded', 'false'); + } + }); + + lastPath = currentPath; + }); + }); diff --git a/app/assets/sass/uswds/_uswds-theme-custom-styles.scss b/app/assets/sass/uswds/_uswds-theme-custom-styles.scss index 1eaa0bfb55..0bb1aab7eb 100644 --- a/app/assets/sass/uswds/_uswds-theme-custom-styles.scss +++ b/app/assets/sass/uswds/_uswds-theme-custom-styles.scss @@ -198,8 +198,8 @@ td.table-empty-message { word-wrap: break-word; } - border: 1px solid color('gray-cool-10'); - padding: units(2); + // border: 1px solid color('gray-cool-10'); + // padding: units(2); .tick-cross-list-permissions { margin: units(1) 0; @@ -852,21 +852,36 @@ $do-dont-top-bar-width: 1; } } -.linked-content:hover { - cursor: pointer; - transform: scale(1.05); - transition: transform 0.3s ease, background-color 0.3s ease; -} +.linked-card a { + text-decoration: none; + .usa-card__header, .usa-card__media { + @include at-media('tablet') { + padding-top: units(1); + } + } + &:visited { + color: color('ink'); + } + &:focus .usa-card__container { + outline: units(2px) solid color('blue-40v'); + outline-offset: 0.3rem; + } + &:hover .usa-card__container, &:focus .usa-card__container { + border-color: color('blue-60v'); + background: color('blue-60v'); + p, h3 { + color: white; + } + svg { + filter: brightness(0) invert(1); + } + } -li.linked-card:hover > div:first-child:hover { - border-color: #005ea2; -} + &.linked-content:hover, &.linked-content:focus { + cursor: pointer; + transition: transform 0.3s ease, background-color 0.3s ease; + } -li.linked-card:hover h4, -li.linked-card:hover p, -li.linked-card:hover svg, -.best-practices_card_img:hover { - color: #005ea2; } .best-practices_card_img { @@ -876,10 +891,6 @@ li.linked-card:hover svg, margin: 0 auto; } -.best-practices_link { - text-decoration: none; -} - .usa-link--downloadable { position: relative; } @@ -914,17 +925,25 @@ li.linked-card:hover svg, mask-size: 1.75ex 1.75ex; } +nav.nav { + position: sticky; + top: units(3); +} + .usa-sidenav__sublist { display: none; } -.usa-sidenav__item:hover .usa-sidenav__sublist, -.usa-sidenav__item:focus-within .usa-sidenav__sublist { +.usa-sidenav__item.open .usa-sidenav__sublist { display: block; } -.usa-sidenav__item a { - display: block; +.usa-sidenav__sublist .bold { + font-weight: bold; +} + +.usa-sidenav__sublist li[role="menuitem"] { + border-top: 1px solid #dfe1e2; } .icon-list { @@ -957,6 +976,9 @@ li.linked-card:hover svg, .usa-card__container { align-items: center; text-align: center; + border-radius: 4px; + overflow: hidden; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); img { margin: units(4) auto 0; width: units(15); @@ -965,9 +987,17 @@ li.linked-card:hover svg, .usa-card__body { margin-bottom: units(2); } + .blue-bar { + background-color: #005eb8; + height: 1.3em; + width: 100%; + margin: 0; + border-radius: 0; + } } } + .contact-us-card { border: 2px solid color("ink"); padding: units(2); diff --git a/app/config.py b/app/config.py index 1462300472..a82c9a1ab1 100644 --- a/app/config.py +++ b/app/config.py @@ -87,9 +87,6 @@ class Config(object): "tts-benefits-studio@gsa.gov", ], } - FEATURE_BEST_PRACTICES_ENABLED = ( - getenv("FEATURE_BEST_PRACTICES_ENABLED", "false") == "true" - ) FEATURE_ABOUT_PAGE_ENABLED = getenv("FEATURE_ABOUT_PAGE_ENABLED", "false") == "true" diff --git a/app/main/validators.py b/app/main/validators.py index 1dfc97c488..e1292b9598 100644 --- a/app/main/validators.py +++ b/app/main/validators.py @@ -41,14 +41,8 @@ def __call__(self, form, field): if field.data == "": return - from flask import url_for + message = "Enter a public sector email address." - message = """ - Enter a public sector email address or - find out who can use Notify - """.format( - url_for("main.features") - ) if not is_gov_user(field.data.lower()): raise ValidationError(message) diff --git a/app/main/views/index.py b/app/main/views/index.py index 2cc6537c1f..e05e72e870 100644 --- a/app/main/views/index.py +++ b/app/main/views/index.py @@ -15,8 +15,6 @@ from app.main.views.pricing import CURRENT_SMS_RATE from app.main.views.sub_navigation_dictionaries import ( about_notify_nav, - best_practices_nav, - features_nav, using_notify_nav, ) from app.utils.user import user_is_logged_in @@ -25,11 +23,6 @@ # Hook to check for feature flags @main.before_request def check_feature_flags(): - if request.path.startswith("/guides") and not current_app.config.get( - "FEATURE_BEST_PRACTICES_ENABLED", False - ): - abort(404) - if request.path.startswith("/about") and not current_app.config.get( "FEATURE_ABOUT_PAGE_ENABLED", False ): @@ -40,8 +33,8 @@ def check_feature_flags(): def test_feature_flags(): return jsonify( { - "FEATURE_BEST_PRACTICES_ENABLED": current_app.config[ - "FEATURE_BEST_PRACTICES_ENABLED" + "FEATURE_ABOUT_PAGE_ENABLED": current_app.config[ + "FEATURE_ABOUT_PAGE_ENABLED" ] } ) @@ -111,44 +104,6 @@ def callbacks(): return redirect(url_for("main.documentation"), 301) -# --- Features page set --- # - - -@main.route("/features") -@user_is_logged_in -def features(): - return render_template("views/features.html", navigation_links=features_nav()) - - -@main.route("/features/roadmap", endpoint="roadmap") -@user_is_logged_in -def roadmap(): - return render_template("views/roadmap.html", navigation_links=features_nav()) - - -@main.route("/features/sms") -@user_is_logged_in -def features_sms(): - return render_template( - "views/features/text-messages.html", navigation_links=features_nav() - ) - - -@main.route("/features/security", endpoint="security") -@user_is_logged_in -def security(): - return render_template("views/security.html", navigation_links=features_nav()) - - -@main.route("/features/using_notify") -@user_is_logged_in -def using_notify(): - return ( - render_template("views/using-notify.html", navigation_links=features_nav()), - 410, - ) - - @main.route("/using-notify/delivery-status") @user_is_logged_in def message_status(): @@ -203,78 +158,75 @@ def trial_mode_new(): ) -@main.route("/guides/best-practices") +@main.route("/using-notify/best-practices") @user_is_logged_in def best_practices(): return render_template( "views/guides/best-practices.html", - navigation_links=best_practices_nav(), + navigation_links=using_notify_nav(), ) -@main.route("/guides/clear-goals") +@main.route("/using-notify/best-practices/clear-goals") @user_is_logged_in def clear_goals(): return render_template( "views/guides/clear-goals.html", - navigation_links=best_practices_nav(), + navigation_links=using_notify_nav(), ) -@main.route("/guides/rules-and-regulations") +@main.route("/using-notify/best-practices/rules-and-regulations") @user_is_logged_in def rules_and_regulations(): return render_template( "views/guides/rules-and-regulations.html", - navigation_links=best_practices_nav(), + navigation_links=using_notify_nav(), ) -@main.route("/guides/establish-trust") +@main.route("/using-notify/best-practices/establish-trust") @user_is_logged_in def establish_trust(): return render_template( "views/guides/establish-trust.html", - navigation_links=best_practices_nav(), + navigation_links=using_notify_nav(), ) -@main.route("/guides/write-for-action") +@main.route("/using-notify/best-practices/write-for-action") @user_is_logged_in def write_for_action(): return render_template( "views/guides/write-for-action.html", - navigation_links=best_practices_nav(), + navigation_links=using_notify_nav(), ) -@main.route("/guides/multiple-languages") +@main.route("/using-notify/best-practices/multiple-languages") @user_is_logged_in def multiple_languages(): return render_template( "views/guides/multiple-languages.html", - navigation_links=best_practices_nav(), + navigation_links=using_notify_nav(), ) -@main.route("/guides/benchmark-performance") +@main.route("/using-notify/best-practices/benchmark-performance") @user_is_logged_in def benchmark_performance(): return render_template( "views/guides/benchmark-performance.html", - navigation_links=best_practices_nav(), + navigation_links=using_notify_nav(), ) -@main.route("/guides/using-notify/guidance") +@main.route("/using-notify/guidance") @user_is_logged_in def guidance_index(): return render_template( "views/guidance/index.html", navigation_links=using_notify_nav(), - feature_best_practices_enabled=current_app.config[ - "FEATURE_BEST_PRACTICES_ENABLED" - ], ) @@ -282,6 +234,8 @@ def guidance_index(): def contact(): return render_template( "views/contact.html", + navigation_links=about_notify_nav(), + ) @@ -313,6 +267,8 @@ def why_text_messaging(): def join_notify(): return render_template( "views/join-notify.html", + navigation_links=about_notify_nav(), + ) @@ -343,17 +299,29 @@ def send_files_by_email(): ) +@main.route("/studio") +def studio(): + return render_template( + "views/studio.html", + ) + + +@main.route("/acceptable-use-policy") +def acceptable_use_policy(): + return render_template( + "views/acceptable-use-policy.html", + ) + + # --- Redirects --- # -@main.route("/roadmap", endpoint="old_roadmap") @main.route("/information-security", endpoint="information_security") @main.route("/using_notify", endpoint="old_using_notify") @main.route("/information-risk-management", endpoint="information_risk_management") @main.route("/integration_testing", endpoint="old_integration_testing") def old_page_redirects(): redirects = { - "main.old_roadmap": "main.roadmap", "main.information_security": "main.using_notify", "main.old_using_notify": "main.using_notify", "main.information_risk_management": "main.security", diff --git a/app/main/views/send.py b/app/main/views/send.py index 2b7a66f96c..2b36e57239 100644 --- a/app/main/views/send.py +++ b/app/main/views/send.py @@ -483,7 +483,7 @@ def send_one_off_step(service_id, template_id, step_index): link_to_upload=( request.endpoint == "main.send_one_off_step" and step_index == 0 ), - errors=form.errors if form.errors else None + errors=form.errors if form.errors else None, ) diff --git a/app/main/views/sub_navigation_dictionaries.py b/app/main/views/sub_navigation_dictionaries.py index 16991297ab..3b2cf84c17 100644 --- a/app/main/views/sub_navigation_dictionaries.py +++ b/app/main/views/sub_navigation_dictionaries.py @@ -1,88 +1,44 @@ -from flask import current_app - - -def features_nav(): - return [ - { - "name": "Features", - "link": "main.features", - "sub_navigation_items": [ - # { - # "name": "Text messages", - # "link": "main.features_sms", - # }, - ], - }, - { - "name": "Roadmap", - "link": "main.roadmap", - }, - { - "name": "Security", - "link": "main.security", - }, - ] - - def using_notify_nav(): nav_items = [ {"name": "Get started", "link": "main.get_started"}, - {"name": "Guides", "link": "main.best_practices"}, - {"name": "Trial mode", "link": "main.trial_mode_new"}, - {"name": "Tracking usage", "link": "main.pricing"}, - {"name": "Delivery Status", "link": "main.message_status"}, - {"name": "Guidance", "link": "main.guidance_index"}, - ] - if not current_app.config.get("FEATURE_BEST_PRACTICES_ENABLED"): - nav_items = [ - item for item in nav_items if item["link"] != "main.best_practices" - ] - - return nav_items - - -def best_practices_nav(): - return [ { "name": "Best Practices", "link": "main.best_practices", - }, - { - "name": "Clear goals", - "link": "main.clear_goals", - }, - { - "name": "Rules and regulations", - "link": "main.rules_and_regulations", - }, - { - "name": "Establish trust", - "link": "main.establish_trust", "sub_navigation_items": [ { - "name": "Get the word out", - "link": "main.establish_trust#get-the-word-out", + "name": "Clear goals", + "link": "main.clear_goals", }, { - "name": "As people receive texts", - "link": "main.establish_trust#as-people-receive-texts", + "name": "Rules and regulations", + "link": "main.rules_and_regulations", + }, + { + "name": "Establish trust", + "link": "main.establish_trust", + }, + { + "name": "Write for action", + "link": "main.write_for_action", + }, + { + "name": "Multiple languages", + "link": "main.multiple_languages", + }, + { + "name": "Benchmark performance", + "link": "main.benchmark_performance", }, ], }, - { - "name": "Write for action", - "link": "main.write_for_action", - }, - { - "name": "Multiple languages", - "link": "main.multiple_languages", - }, - { - "name": "Benchmark performance", - "link": "main.benchmark_performance", - }, + {"name": "Trial mode", "link": "main.trial_mode_new"}, + {"name": "Tracking usage", "link": "main.pricing"}, + {"name": "Delivery Status", "link": "main.message_status"}, + {"name": "Guidance", "link": "main.guidance_index"}, ] + return nav_items + def about_notify_nav(): return [ @@ -93,20 +49,6 @@ def about_notify_nav(): { "name": "Why text messaging", "link": "main.why_text_messaging", - "sub_sub_navigation_items": [ - { - "name": "Reach people using a common method", - "link": "main.why_text_messaging#reach-people-using-a-common-method", - }, - { - "name": "Improve customer experience", - "link": "main.why_text_messaging#improve-customer-experience", - }, - { - "name": "What texting is best for", - "link": "main.why_text_messaging#what-texting-is-best-for", - }, - ], }, { "name": "Security", @@ -115,7 +57,11 @@ def about_notify_nav(): ], }, { - "name": "Contact", + "name": "Join Notify", + "link": "main.join_notify", + }, + { + "name": "Contact us", "link": "main.contact", }, ] diff --git a/app/navigation.py b/app/navigation.py index 271d6848b3..424d03ae3a 100644 --- a/app/navigation.py +++ b/app/navigation.py @@ -40,12 +40,6 @@ class HeaderNavigation(Navigation): "support": { "support", }, - "features": { - "features", - "features_sms", - "roadmap", - "security", - }, "best_practices": { "best_practices", "clear_goals", @@ -57,7 +51,6 @@ class HeaderNavigation(Navigation): }, "using_notify": { "get_started", - "using_notify", "pricing", "trial_mode_new", "message_status", diff --git a/app/templates/base.html b/app/templates/base.html index 0348832bd2..1d2778a9ee 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -56,28 +56,19 @@ {% for item in navigation_links %}
  • {% if item.sub_navigation_items %} @@ -85,6 +76,8 @@
  • {% endfor %} + +
    diff --git a/app/templates/components/footer.html b/app/templates/components/footer.html index ebc8ebbcca..0de0b5fc9b 100644 --- a/app/templates/components/footer.html +++ b/app/templates/components/footer.html @@ -32,6 +32,9 @@

    Support links

    + +
    -
    - +
    diff --git a/app/templates/components/guides/cards.html b/app/templates/components/guides/cards.html index 1fa6f9a752..372bcb2d67 100644 --- a/app/templates/components/guides/cards.html +++ b/app/templates/components/guides/cards.html @@ -1,18 +1,17 @@ -

    See if Notify is right for you

    -

    Notify.gov is a product of the Public Benefits Studio, a product accelerator inside +

    Notify.gov is a product of the Public Benefits Studio, a product accelerator inside the federal government.

    {% endblock %} diff --git a/app/templates/views/about/why-text-messaging.html b/app/templates/views/about/why-text-messaging.html index 2b19822259..d1b881b7cb 100644 --- a/app/templates/views/about/why-text-messaging.html +++ b/app/templates/views/about/why-text-messaging.html @@ -40,7 +40,7 @@

    Improve customer experience

    Texting not only helps programs reach people using a nearly-universal communication method, it is a cost effective - way to do so. With Notify.gov you can get started for free, allowing you to try out + way to do so. With Notify.gov you can get started for free, allowing you to try out texting to complement your existing communications and outreach strategies.

    What texting is best for

    @@ -72,7 +72,7 @@

    What texting is best for

    ] %} {% for item in card_contents %}
    -
    +

    {{item.card_heading}}

    {{item.p_text}}

    diff --git a/app/templates/views/acceptable-use-policy.html b/app/templates/views/acceptable-use-policy.html new file mode 100644 index 0000000000..ffaa878d8f --- /dev/null +++ b/app/templates/views/acceptable-use-policy.html @@ -0,0 +1,38 @@ +{% extends "base.html" %} + +{% set page_title = "Acceptable Use Policy" %} + +{% block per_page_title %}{{page_title}}{% endblock %} + +{% block content_column_content %} + +
    +

    {{page_title}}

    +

    Use of the application indicates agreement with this acceptable use policy.

    +

    Acceptable uses of Notify.gov for this trial period include:

    +
      +
    • Configuring test services and sending test SMS messages to learn and demonstrate how Notify.gov works.
    • +
    • Reviewing data provided by Notify.gov and configuring available settings.
    • +
    +

    + In order to help us keep Notify.gov secure, we require that you use your account appropriately. When you use Notify.gov, you agree that you’ll respect these rules of behavior: +

    +
      +
    • Conduct only authorized business on the system.
    • +
    • Maintain the confidentiality of your authentication credentials; a Notify.gov operator should never ask you to reveal them. We recommend using a password manager and strong credentials.
    • +
    • Log out when you no longer need session access. Never leave your computer unattended while logged into Notify.gov.
    • +
    • Report all security incidents or suspected incidents (such as improper or suspicious acts) related to Notify.gov systems and networks to Notify.gov support.
    • +
    • Safeguard system resources against waste, loss, abuse, unauthorized use or disclosure, and misappropriation.
    • +
    • Don’t process U.S. classified national security information on the system.
    • +
    • Don’t browse, search or reveal information hosted by Notify.gov except as required to perform your legitimate tasks or assigned duties.
    • +
    • Don’t retrieve information, or in any other way disclose information, for someone who does not have authority to access that information.
    • +
    • Don’t intentionally use a client that makes use of obsolete or insecure encryption algorithms.
    • +
    • Don’t configure your browser to ignore security warnings which may involve your connection with Notify.gov; report warnings that you can’t explain to Notify.gov support.
    • +
    • If you believe you’ve been granted more access than necessary to perform your legitimate tasks or assigned duties, immediately notify Notify.gov support.
    • +
    • Don’t share your account with another person or create anonymous or group accounts. Your account is just for you.
    • +
    +

    Access to systems and networks owned by Notify.gov is governed by, and subject to, all federal laws, including, but not limited to, the Privacy Act, 5 U.S.C. 552a, if the applicable Notify.gov system maintains individual Privacy Act information. Access to Notify.gov systems constitutes consent to the retrieval and disclosure of the information within the scope of your authorized access, subject to the Privacy Act, and applicable state and federal laws.

    +

    Please contact Notify.gov support if you have questions about these rules or don’t understand them.

    +
    + +{% endblock %} diff --git a/app/templates/views/contact.html b/app/templates/views/contact.html index a2cd4f9c71..7eb8b04143 100644 --- a/app/templates/views/contact.html +++ b/app/templates/views/contact.html @@ -15,7 +15,7 @@

    {{page_title}}

    aria-label="For partnership inquiries">
    -

    If you are a current Notify.gov partner and have technical issues or questions, we are available at If you are a current Notify.gov partner and have technical issues or questions, we are available at notify-support@gsa.gov

    diff --git a/app/templates/views/features.html b/app/templates/views/features.html index 8007a06e89..456f168159 100644 --- a/app/templates/views/features.html +++ b/app/templates/views/features.html @@ -11,10 +11,8 @@

    Features

    If you work for the government, you can use Notify.gov to keep your users updated.

    -

    Notify makes it easy to create, customize, and send text messages.

    - +

    Notify makes it easy to create, customize, and send text messages.

    +

    You do not need any technical knowledge to use Notify.

    {% if not current_user.is_authenticated %}

    Create an account for free and try it yourself.

    diff --git a/app/templates/views/guidance/index.html b/app/templates/views/guidance/index.html index 2e63c62123..062bae555b 100644 --- a/app/templates/views/guidance/index.html +++ b/app/templates/views/guidance/index.html @@ -8,245 +8,103 @@ {% endblock %} {% block content_column_content %} +

    Guidance

    + +

    Notify allows you to easily create templates for messages for your recipients. You can customize messages to encourage +your recipient to manage their benefits and increase follow-through.

    +

    Below we explain how to:

    + + + +{# Format content #} +

    Format your content

    + + +

    To create and format your message

    +
      +
    1. All messages start from a template
    2. +
    3. Click "Send Messages". You'll see existing templates.
    4. +
    5. Add a new template or choose an existing template and select Edit.
    6. +
    + +{# Add links #} +

    When composing a text message, links to websites or online applications can help your recipient respond quickly.

    + +
      +
    • Write URLs in full and Notify will convert them into links for you. Note that you cannot hyperlink text in Notify + messages.
    • +
    • For link click tracking, you can consider adding campaign parameters to URLs.
    • +
    • All links should point to a government domain.
    • +
    • Link directly to where your recipient needs to take action, not to more information.
    • +
    + +

    About link-shortening services

    +

    We do not recommend using a third-party link-shortening service because:

    +
      +
    • Your recipient cannot see where the link will take them, which could make them suspect the link is spam/scam.
    • +
    • Your link might stop working if there’s a service outage.
    • +
    • You can no longer control where the redirect goes.
    • +
    + +{# Personalize content #} +

    Personalize your content

    +

    Personalizing your content can increase response rates and help the recipient know the text is legitimate.

    +
      +
    • Including a person's first name increases response rates.
    • +
    • Specific details such as time and location of an appointment or where suspected fraud use occurred encourages action.
    • +
    + +

    To personalize your content

    +
      +
    1. Add a placeholder to your content by placing two brackets around the personalized elements.
    2. +
    3. You can manually enter the personalized content or you can upload a spreadsheet with the details and let Notify do the + work for you. See data preparation.
    4. +
    + +

    Example

    +

    To personalize with the recipient's first name and include a reference number:

    +

    State WIC: Hello ((first name)), your reference is ((ref number)). Please provide this number when you call 555-123-1234 to make an appointment.

    + +

    Note that variations in the length of personalized content can impact the length of specific messages, and may affect +the number of parts used.

    + +{# Add conditional content #} +

    Add conditional content

    +

    Conditional (or optional) content appears only when a recipient meets certain criteria. This feature allows you to make +all or part of the message contingent upon specific criteria associated with the recipient.

    + +

    To add conditional content

    +
      +
    1. Use two brackets and ?? to define the conditional content.
    2. +
    3. You can manually enter the conditional content or you can upload a spreadsheet with the personal details and let Notify + do the work for you. See data preparation.
    4. +
    + +

    Examples

    +
      +
    1. If you only want to show something to people who are under 18: +
      +

      State SNAP: Renewal applications are due by March 15. ((under18??Please get your application signed by a parent or + guardian.))

      +
    2. +
    3. + If you want to make people who are homebound aware of the option of virtual visits (but not other message recipients): +
      +

      State Medicaid: Please call 555-123-1234 to schedule an appointment. ((homebound??Virtual visits are available.))

      +
    4. +
    5. + If you want to send a messages in different languages to different recipients: +
      +

      ((English??We’ve identified unauthorized use on your EBT account. Call the phone number on the back of your card to + cancel or go to your local CSO for immediate replacement.))((Spanish??Hemos identificado un uso no autorizado en su + cuenta EBT. Llame al número de teléfono que aparece en el reverso de su tarjeta para cancelarla o diríjase a su CSO + local para que se la sustituyan inmediatamente.))

      +
    6. +
    + +... -

    Guidance

    - -

    Notify allows you easily to create templates for messages for your recipients. You can customize messages to encourage - your recipient to manage their benefits and increase follow through.

    -

    Below we explain how to:

    - - - - {# Format content #} -

    Format your content

    - {% if not feature_best_practices_enabled %} -

    Effective texts will help your message recipients take the steps needed to secure and keep the benefits and services - they depend on. To craft an effective text:

    - -
      -
    • Choose your messages thoughtfully. Text messages are best to remind/nudge someone to take a specific action or - communicate information at a particular time rather than pushing out broad or overly general information.
    • -
    • Clearly state the issue and expected response. Tell your recipient what you expect from them.
    • -
    • Say only one important thing per message.
    • -
    • Frame the message to encourage action and explain the consequences of not completing the desired action.
    • -
    - {% endif %} -

    To create and format your message

    -
      -
    1. All messages start from a template
    2. -
    3. Click "Send Messages". You'll see existing templates.
    4. -
    5. Add a new template or choose an existing template and select Edit.
    6. -
    - - {% if not feature_best_practices_enabled %} - {# Add links #} - -

    When composing a text message, links to websites or online applications can help your recipient respond quickly.

    - -
      -
    • Write URLs in full and Notify will convert them into links for you. Note that you cannot hyperlink text in Notify - messages.
    • -
    • For link click tracking, you can consider adding campaign parameters to URLs.
    • -
    • All links should point to a government domain.
    • -
    • Link directly to where your recipient needs to take action, not to more information.
    • -
    - -

    About link-shortening services

    -

    We do not recommend using a third-party link-shortening service because:

    -
      -
    • Your recipient cannot see where the link will take them, which could make them suspect the link is spam/scam.
    • -
    • Your link might stop working if there’s a service outage.
    • -
    • You can no longer control where the redirect goes.
    • -
    - {% endif %} - - {# Personalize content #} -

    Personalize your content

    -

    Personalizing your content can increase response rates and help the recipient know the text is legitimate.

    -
      -
    • Including a person's first name increases response rates.
    • -
    • Specific details such as time and location of an appointment or where suspected fraud use occurred encourages action.
    • -
    - -

    To personalize your content

    -
      -
    1. Add a placeholder to your content by placing two brackets around the personalized elements.
    2. -
    3. You can manually enter the personalized content or you can upload a spreadsheet with the details and let Notify do the - work for you. See data preparation.
    4. -
    - -

    Example

    -

    To personalize with the recipient's first name and include a reference number:

    -

    State WIC: Hello ((first name)), your reference is ((ref number)). Please provide this number when you call 555-123-1234 to make an appointment.

    - -

    Note that variations in the length of personalized content can impact the length of specific messages, and may affect - the number of parts used.

    - - {# Add conditional content #} -

    Add conditional content

    -

    Conditional (or optional) content appears only when a recipient meets certain criteria. This feature allows you to make - all or part of the message contingent upon specific criteria associated with the recipient.

    - -

    To add conditional content

    -
      -
    1. Use two brackets and ?? to define the conditional content.
    2. -
    3. You can manually enter the conditional content or you can upload a spreadsheet with the personal details and let Notify - do the work for you. See data preparation.
    4. -
    - -

    Examples

    -
      -
    1. If you only want to show something to people who are under 18: -
      -

      State SNAP: Renewal applications are due by March 15. ((under18??Please get your application signed by a parent or - guardian.))

      -
    2. -
    3. - If you want to make people who are homebound aware of the option of virtual visits (but not other message recipients): -
      -

      State Medicaid: Please call 555-123-1234 to schedule an appointment. ((homebound??Virtual visits are available.))

      -
    4. -
    5. - If you want to send a messages in different languages to different recipients: -
      -

      ((English??We’ve identified unauthorized use on your EBT account. Call the phone number on the back of your card to - cancel or go to your local CSO for immediate replacement.))((Spanish??Hemos identificado un uso no autorizado en su - cuenta EBT. Llame al número de teléfono que aparece en el reverso de su tarjeta para cancelarla o diríjase a su CSO - local para que se la sustituyan inmediatamente.))

      -
    6. -
    - - - {# Identify your program #} -

    Identify your program

    -

    You can help your recipients identify your texts as legitimate by customizing your messages to clearly state who they - are from. Consider using the program or benefit name that is most familiar to your recipients.

    - -

    To customize your program name

    -

    To change the text message sender from the default service name:

    -
      -
    1. Go to the Settings page
    2. -
    3. Select “Start text messages with service name.”
    4. -
    5. Change the service name to a familiar program or benefit.
    6. -
    - - {# Prepare your data #} -

    Prepare your data

    -

    The easiest and most efficient way to personalize your content is by uploading a spreadsheet. Notify can accommodate - many file formats and structures.

    - -

    File format

    -

    Notify can accept files in the following formats: CSV, TSV, ODS, and Microsoft Excel.

    - -

    File structure

    -
      -
    • The phone number must be in the first column (Column A) and must be labeled Phone number.
    • -
    • Each column must have a unique name.
    • -
    • If you are using Excel, you must either disable the”auto-date/time format” for time and date columns or convert the file - to a CSV prior to loading. (If you do not, Excel will display date/time data in a confusing format.)
    • -
    - -

    Formatting personalized content

    -

    If you are sending a message with personalized content, such as the first name of the recipient or the appointment time - and location, the names of the column headings have to match the indicator included in the message template.

    -

    For example, if the personalized content is the first name of the recipient, and we are using the spreadsheet below, the - indicator in the message needs to be ((First name)), not ((firstname)) or ((name)).

    - -

    Formatting conditional content

    -

    If you are sending messages with conditional content, such as content based on the recipient’s preferred language or - location, the flag to receive the content needs to be captured in its own column with a Yes or No (Y/N) flag.

    - -

    Example

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - Example -
    Phone numberFirst nameLast nameSpanishEnglishDateTimeLocation
    123-456-7890LuluPraetherNYNovember 2, 20233:25123 Ford Rd.
    234-567-8901SelaAppelYNNovember 2, 20234:00123 Ford Rd.
    123-456-7890DexterMoseleyNYNovember 2, 20232:00123 Ford Rd.
    -
    - - {% if not feature_best_practices_enabled %} - {# Preventing fraud #} -

    Preventing fraud

    -

    Texting fraud is ever prevalent and while we can’t eliminate the risk, we can reduce the chances that recipients will - fall victim to fraud.

    -
      -
    1. Never send unnecessary or protected private information.
    2. -
    3. Remind your recipients that text messaging is not a secure means of communication and they should not send you private - information via text.
    4. -
    5. Only include links to websites and online applications that are secure.
    6. -
    7. Send an introductory text letting recipients know you will be texting them and to save the number in their phone.
    8. -
    9. Include an auto-response with the name of your organization and a contact phone number.
    10. -
    - -

    Examples

    -
      -
    1. Introductory text: -
      -

      State Transit Dept: We're piloting a new way to get important reminders to our staff. Save this number to your phone, - you'll receive updates from us here.

      -
    2. -
    3. Auto-response text: -
      -

      State Agency: This number is unmonitored. To contact us, call us at 555-123-1234. We will never ask for personal details - in a text. If you have questions about how to protect your privacy, see statename.gov/privacy.

      -
    4. -
    - {% endif %} {% endblock %} diff --git a/app/templates/views/guides/benchmark-performance.html b/app/templates/views/guides/benchmark-performance.html index 5e24dc9cd1..bd2662fbec 100644 --- a/app/templates/views/guides/benchmark-performance.html +++ b/app/templates/views/guides/benchmark-performance.html @@ -8,7 +8,7 @@ {% endblock %} {% block content_column_content %} -{{ breadcrumbs.breadcrumb(page_title, "Guides", "main.best_practices") }} +{{ breadcrumbs.breadcrumb(page_title, "Best Practices", "main.best_practices") }}

    {{page_title}}

    @@ -27,58 +27,46 @@

    What other texting studies have found

    quantity of messages delivered, how people engage with messages, and how they take action.

    -

    Message delivery

    -

    Benchmark: 80% of texts are +

    Message delivery

    +

    Benchmark: 80% of texts are successfully delivered

    -
    -
      -
    • -

      - You may discover that some numbers are temporarily or permanently unavailable due to service being - discontinued, - numbers changing, or being a landline. -

      -
    • -
    -
    +
      +
    • +

      + You may discover that some numbers are temporarily or permanently unavailable due to service being + discontinued, + numbers changing, or being a landline. +

      +
    • +
    +

    Engagement

    +

    Benchmark: Engagement rates with texts ranged from 17% + to 26%

    +
      +
    • +

      + The highest rate of engagement with a text comes within hours of sending. Engagement rates include any kind + of + action taken due to a text, including replying “STOP” to prevent future texts. +

      +
    • +
    -

    Engagement

    -
    -

    Benchmark: Engagement rates with texts ranged from 17% - to 26%

    -
    -
    -
      -
    • -

      - The highest rate of engagement with a text comes within hours of sending. Engagement rates include any kind - of - action taken due to a text, including replying “STOP” to prevent future texts. -

      -
    • -
    -
    - -

    Appointment requests

    -
    -

    Benchmark: Requesting appointments after receiving texts ranged +

    Appointment requests

    +

    Benchmark: Requesting appointments after receiving texts ranged from 4% to 9%

    -
    -
    -
      -
    • -

      - Requesting appointments is a specific type of engagement. Provide a phone number or link to an online - appointment - request form. -

      -
    • -
    -
    - +
      +
    • +

      + Requesting appointments is a specific type of engagement. Provide a phone number or link to an online + appointment + request form. +

      +
    • +

    The Code for America’s Texting @@ -86,63 +74,42 @@

    Appointment requests

    reported specific learnings around appointment reminders, completing document submission, and maintenance reminders.

    -

    Appointment reminders

    -
    -

    Benchmark: Clients were 79% more - likely - to keep - their appointment after receiving a text reminder.

    -
    -
    -
      -
    • -

      You will likely see more completed appointments.

      -
    • -
    -
    - -
    -

    Benchmark: Clients were 55% more - likely - to complete - an interview after receiving an interview reminder

    -
    -
    -
      -
    • -

      You will likely see more completed interviews.

      -
    • -
    -
    +

    Appointment reminders

    +

    Benchmark: Clients were 79% more + likely to keep their appointment after receiving a text reminder.

    +
      +
    • +

      You will likely see more completed appointments.

      +
    • +
    +

    Benchmark: Clients were 55% more + likely to complete an interview after receiving an interview reminder

    +
      +
    • +

      You will likely see more completed interviews.

      +
    • +
    -

    Document submission

    -
    -

    +

    Document submission

    +

    Benchmark: Clients were 6% more likely to complete document submission after receiving a customized list of required documents via text

    -
    -
    -
      -
    • -

      To encourage response, provide a custom list of the needed documents and information about how to submit - them. -

      -
    • -
    -
    +
      +
    • +

      To encourage response, provide a custom list of the needed documents and information about how to submit + them. +

      +
    • +
    -

    Reminders

    -
    -

    Benchmark: Text reminders improved case maintenance rates by 21%

    -
    -
    -
      -
    • -

      You may see less turnover in your case rates.

      -
    • -
    -
    +

    Reminders

    +

    Benchmark: Text reminders improved case maintenance rates by 21%

    +
      +
    • +

      You may see less turnover in your case rates.

      +
    • +
    {% endblock %} diff --git a/app/templates/views/guides/best-practices.html b/app/templates/views/guides/best-practices.html index 4784f72c44..9826e6a33e 100644 --- a/app/templates/views/guides/best-practices.html +++ b/app/templates/views/guides/best-practices.html @@ -15,7 +15,7 @@

    Best Practices

    This set of best practices will help you get an effective texting initiative up and running.

    -

    +

    Key elements of a texting campaign

    @@ -24,37 +24,37 @@

    "svg_src": "goal", "card_heading": "Establish clear goals", "p_text": "Start with a singular purpose. Make explicit what you want to achieve.", - "link": "/guides/clear-goals" + "link": "/using-notify/best-practices/clear-goals" }, { "svg_src": "compliant", "card_heading": "Follow rules & regulations", "p_text": "Understand what is required when texting the public.", - "link": "/guides/rules-and-regulations" + "link": "/using-notify/best-practices/rules-and-regulations" }, { "svg_src": "trust", "card_heading": "Establish trust", "p_text": "Help your audience anticipate and welcome your texts.", - "link": "/guides/establish-trust" + "link": "/using-notify/best-practices/establish-trust" }, { "svg_src": "runner", "card_heading": "Write texts that provoke action", "p_text": "Help your audience know what to do with the information you send.", - "link": "/guides/write-for-action" + "link": "/using-notify/best-practices/write-for-action" }, { "svg_src": "language", "card_heading": "Send texts in multiple languages", "p_text": "What to know as you plan translated texts.", - "link": "/guides/multiple-languages" + "link": "/using-notify/best-practices/multiple-languages" }, { "svg_src": "chart", "card_heading": "Measure performance with benchmarking", "p_text": "Learn how effective your texting program can be.", - "link": "/guides/benchmark-performance" + "link": "/using-notify/best-practices/benchmark-performance" } ] %} diff --git a/app/templates/views/guides/clear-goals.html b/app/templates/views/guides/clear-goals.html index 71ed0e1a36..d1054e3a9f 100644 --- a/app/templates/views/guides/clear-goals.html +++ b/app/templates/views/guides/clear-goals.html @@ -8,7 +8,7 @@ {% endblock %} {% block content_column_content %} -{{ breadcrumbs.breadcrumb(page_title, "Guides", "main.best_practices") }} +{{ breadcrumbs.breadcrumb(page_title, "Best Practices", "main.best_practices") }}

    {{page_title}}

    @@ -162,7 +162,7 @@

    Use a hypothesis framework to plan your campaign

    Review your drafted hypothesis with your team to make sure everyone is aligned on your desired goals. A clear and - concise hypothesis can help you decide how to write text message + concise hypothesis can help you decide how to write text message content that provokes action.

    diff --git a/app/templates/views/guides/establish-trust.html b/app/templates/views/guides/establish-trust.html index 3383315bab..0ab95c73aa 100644 --- a/app/templates/views/guides/establish-trust.html +++ b/app/templates/views/guides/establish-trust.html @@ -10,7 +10,7 @@ {% endblock %} {% block content_column_content %} -{{ breadcrumbs.breadcrumb(page_title, "Guides", "main.best_practices") }} +{{ breadcrumbs.breadcrumb(page_title, "Best Practices", "main.best_practices") }}

    {{page_title}}

    diff --git a/app/templates/views/guides/multiple-languages.html b/app/templates/views/guides/multiple-languages.html index dd9c3727f2..f295df3087 100644 --- a/app/templates/views/guides/multiple-languages.html +++ b/app/templates/views/guides/multiple-languages.html @@ -8,7 +8,7 @@ {% endblock %} {% block content_column_content %} -{{ breadcrumbs.breadcrumb(page_title, "Guides", "main.best_practices") }} +{{ breadcrumbs.breadcrumb(page_title, "Best Practices", "main.best_practices") }}

    {{page_title}}

    diff --git a/app/templates/views/guides/rules-and-regulations.html b/app/templates/views/guides/rules-and-regulations.html index db06ab76e7..5943e462d7 100644 --- a/app/templates/views/guides/rules-and-regulations.html +++ b/app/templates/views/guides/rules-and-regulations.html @@ -8,7 +8,7 @@ {% endblock %} {% block content_column_content %} -{{ breadcrumbs.breadcrumb(page_title, "Guides", "main.best_practices") }} +{{ breadcrumbs.breadcrumb(page_title, "Best Practices", "main.best_practices") }}

    {{page_title}}

    @@ -22,7 +22,7 @@

    What to know about consent and opting out

    If you do need expressed consent, consider including a pre-checked plain language opt-in (i.e. “It’s OK to text me.”) on digital forms. Be sure to ask for an up-to-date phone number and include a question about the recipient’s preferred - language for text messages if you expect to translate your text + language for text messages if you expect to translate your text messages in languages other than English.

    @@ -81,7 +81,7 @@

    Opting out

    There is no policy requirement for senders to communicate opt-out options, but including instructions in introductory and/or + href="../best-practices/establish-trust#as-people-receive-texts"> including instructions in introductory and/or auto-response texts on how to opt out and opt back in are effective ways to establish trust with your audience.

    diff --git a/app/templates/views/guides/write-for-action.html b/app/templates/views/guides/write-for-action.html index d3019596c7..ff382864a7 100644 --- a/app/templates/views/guides/write-for-action.html +++ b/app/templates/views/guides/write-for-action.html @@ -9,7 +9,7 @@ {% endblock %} {% block content_column_content %} -{{ breadcrumbs.breadcrumb(page_title, "Guides", "main.best_practices") }} +{{ breadcrumbs.breadcrumb(page_title, "Best Practices", "main.best_practices") }}

    {{page_title}}

    diff --git a/app/templates/views/join-notify.html b/app/templates/views/join-notify.html index 2c154bf72b..78af499f2b 100644 --- a/app/templates/views/join-notify.html +++ b/app/templates/views/join-notify.html @@ -72,14 +72,14 @@

    How to get star aria-labelledby="summary-box-how-to-get-started">
    -

    Interested in trying Notify.gov before signing an agreement? We can provide qualifying partners with access +

    Interested in trying Notify.gov before signing an agreement? We can provide qualifying partners with access to Trial Mode to review Notify.gov features before deciding. In Trial Mode, you can test sending messages, explore the personalization and customization features, and review sample delivery reports.

    -

    Tell us about your program

    +

    Tell us about your program

    Let’s determine if Notify.gov is a good fit for your organization. To get started, we’ll ask you for information such as: @@ -126,14 +126,14 @@

    Getting Started FAQs

    { "heading": "What if I need more than 250,000 messages?", "p_text": "Plans that include additional messages for a fee will be available soon. We want to design these plans - based on our partners’ needs, so please contact us if you hope to be able to + based on our partners’ needs, so please contact us if you hope to be able to send more messages. We’d like to talk with you.", "position": "b-a1" }, { "heading": "What phone numbers can my agency send to?", "p_text": "Right now, Notify.gov supports sending messages to North American numbers (+1). If you’d like to send to - international numbers, we want to hear from you.", + international numbers, we want to hear from you.", "position": "b-a2", }, { @@ -146,7 +146,7 @@

    Getting Started FAQs

    { "heading": "Can we use API integrations with Notify?", "p_text": "While public API integrations are not yet available, we are working on enabling these. If you're looking - for this feature we want to hear from you.", + for this feature we want to hear from you.", "position": "b-a4", }, { @@ -164,7 +164,7 @@

    Getting Started FAQs

    { "heading": "My OGC is asking about consent, where can I get more information for them?", "p_text": "Text message notifications are governed by the Telephone Consumer Protection Act. Different levels of - government have different consent requirements. Download and share our overview of the TCPA with your legal counsel as a starting point.", diff --git a/app/templates/views/message-status.html b/app/templates/views/message-status.html index 76ac9bb6a4..2432605315 100644 --- a/app/templates/views/message-status.html +++ b/app/templates/views/message-status.html @@ -77,7 +77,7 @@

    About carrier statuses

    Sometimes Notify receives more detailed information from the carriers on the status of messages, and these can be found in the downloadable reports. Not all carriers provide the same level of detail regarding delivery and some delivery statutes have a slight variation in word choice. Notify includes this information in the reports to provide you as much - detail as possible. Remember, for security purposes, detailed information is only available for seven days after a + detail as possible. Remember, for security purposes, detailed information is only available for seven days after a message has been sent.

    Opting out

    diff --git a/app/templates/views/roadmap.html b/app/templates/views/roadmap.html deleted file mode 100644 index f9446aad59..0000000000 --- a/app/templates/views/roadmap.html +++ /dev/null @@ -1,87 +0,0 @@ -{% extends "base.html" %} -{% from "components/table.html" import mapping_table, row, text_field, edit_field, field with context %} -{% from "components/content-metadata.html" import content_metadata %} - -{% block per_page_title %} - Roadmap -{% endblock %} - -{% block content_column_content %} - -

    Roadmap

    - - - - -

    The Notify roadmap shows what we’re working on and what we're planning to do next.

    -

    This roadmap is only a guide. It does not cover everything we do, and some things may change.

    -

    You can contact us if you have any questions about the roadmap or suggestions for new features.

    - -

    What we’re working on

    - -

    Now

    - -

    We are investigating the Notify concept, building on the notifications tool pioneered by the UK.

    -

    To do this, we are convening a pilot with a small set of partners.

    -

    Goals during this stage:

    - -
      -
    • Achieve compliance to begin piloting, such as ATO and privacy standards. - -
    • -
    • Demonstrate that a government-run notifications tool provides a unique value.
    • -
    • Gather data from the pilot to improve the product.
    • -
    - -

    Features prioritized during this stage:

    - -
      -
    • Bulk, individually customizable one-way SMS sending via web UI
    • -
    • Organization permissions settings for various team members to edit/send
    • -
    • Reusable message templates
    • -
    • Seven-day records deletion
    • -
    • Message send/failure analytics
    • -
    - -

    Next

    - -

    If the pilot is successful, we hope to recruit additional partners to improve outcomes for low-income individuals and families.

    - -

    Goals during this stage:

    - -
      -
    • Complement Notify with practical guidance and support services.
    • -
    • Iterate on existing features and implement new features based on what we've learned so far.
    • -
    • Hone our measurement approaches to better quantify impact.
    • -
    - -

    Features prioritized during this stage:

    - -
      -
    • SMS sending via API integration
    • -
    • Self-service account creation
    • -
    • Application status page
    • -
    • Improved scheduled send option
    • -
    - -

    Later

    - -

    In the future, we may decide to expand beyond SMS, or to offer the service government-wide.

    - -

    Features to be considered during this stage:

    - -
      - -
    • Two-way messaging
    • -
    • Multilingual interface and content library options
    • -
    • Recurring scheduled send (such as “Send each Monday for 3 weeks”)
    • -
    - -{% endblock %} diff --git a/app/templates/views/signedout.html b/app/templates/views/signedout.html index 499e8294b4..ac9d11798f 100644 --- a/app/templates/views/signedout.html +++ b/app/templates/views/signedout.html @@ -66,6 +66,7 @@

    Key features

    • +
      Globe on top of a web browserWeb-based
    • +
      Stopwatch with a notification speech bubble with a star insideFast and easy
    • +
      3 status messages, 2 successes and one failureTrack message delivery
      • +
        Speech bubbles with the letter A and the Chinese character for language
      • +
        Lock with code icon inside on top of a web browserSecurity and privacy

        Limited data retention, encryption, and multi-factor - authentication protect user data and manage risk + authentication protect user data and manage risk with
        our security efforts

      • +
        Paper airplane and a notification icon with the number 1 inside +

        {{page_title}}

        +

        The Benefits Studio is a product accelerator inside the federal government. + We collaborate with benefits programs and the people they serve to build and + scale shared tools that reduce burden within the social safety net. +

        +

        + As a part of GSA’s Technology Transformation Services (TTS), the Studio is uniquely + positioned to work between and across agencies and programs, to make it easier and + cheaper for programs with the same challenges to use the same tools. +

        +

        + We focus on benefits programs first, because we believe solving problems for people + who face the highest challenges when interacting with the government will result in + solutions that serve everyone else well, too. +

        +

        + The Studio’s first product offering is Notify.gov, a text message service that helps government agencies at all levels more effectively communicate with the people they serve. +

        +

        We’re currently exploring two new product spaces:

        +
          +
        • Better Document Submission: How might we enable simple digital submission and document processing for benefits agencies?
        • +
        • Automated Enrollment Checks: How might we improve how enrollment information is shared across benefit programs, especially where enrollment in one program provides partial or full eligibility for another program?
        • +
        +

        If you’re interested in providing feedback on where we should go next, reach us at public-benefits-studio@gsa.gov.

        +

        Read more about the Studio:

        + + + +{% endblock %} diff --git a/app/templates/views/using-notify.html b/app/templates/views/using-notify.html index 0679229e78..d0279f4464 100644 --- a/app/templates/views/using-notify.html +++ b/app/templates/views/using-notify.html @@ -21,7 +21,6 @@

        Using Notify

        diff --git a/backstop_data/bitmaps_reference/backstop_test_About_0_document_0_desktop.png b/backstop_data/bitmaps_reference/backstop_test_About_0_document_0_desktop.png new file mode 100644 index 0000000000..5780ccb5eb Binary files /dev/null and b/backstop_data/bitmaps_reference/backstop_test_About_0_document_0_desktop.png differ diff --git a/backstop_data/bitmaps_reference/backstop_test_Add_Service_0_document_0_desktop.png b/backstop_data/bitmaps_reference/backstop_test_Add_Service_0_document_0_desktop.png index c08a67eb22..81fd6f432b 100644 Binary files a/backstop_data/bitmaps_reference/backstop_test_Add_Service_0_document_0_desktop.png and b/backstop_data/bitmaps_reference/backstop_test_Add_Service_0_document_0_desktop.png differ diff --git a/backstop_data/bitmaps_reference/backstop_test_Benchmark_Performance_0_document_0_desktop.png b/backstop_data/bitmaps_reference/backstop_test_Benchmark_Performance_0_document_0_desktop.png index 02cba03789..506d064893 100644 Binary files a/backstop_data/bitmaps_reference/backstop_test_Benchmark_Performance_0_document_0_desktop.png and b/backstop_data/bitmaps_reference/backstop_test_Benchmark_Performance_0_document_0_desktop.png differ diff --git a/backstop_data/bitmaps_reference/backstop_test_Best_Practices_0_document_0_desktop.png b/backstop_data/bitmaps_reference/backstop_test_Best_Practices_0_document_0_desktop.png new file mode 100644 index 0000000000..474f3b122b Binary files /dev/null and b/backstop_data/bitmaps_reference/backstop_test_Best_Practices_0_document_0_desktop.png differ diff --git a/backstop_data/bitmaps_reference/backstop_test_Choose_Service_-_Accounts_0_h1heading-large_0_desktop.png b/backstop_data/bitmaps_reference/backstop_test_Choose_Service_-_Accounts_0_h1heading-large_0_desktop.png index a3370c4331..5597ee2cfb 100644 Binary files a/backstop_data/bitmaps_reference/backstop_test_Choose_Service_-_Accounts_0_h1heading-large_0_desktop.png and b/backstop_data/bitmaps_reference/backstop_test_Choose_Service_-_Accounts_0_h1heading-large_0_desktop.png differ diff --git a/backstop_data/bitmaps_reference/backstop_test_Choose_Service_-_Accounts_1_ausa-buttonhrefadd-service_0_desktop.png b/backstop_data/bitmaps_reference/backstop_test_Choose_Service_-_Accounts_1_ausa-buttonhrefadd-service_0_desktop.png index e65896fd62..8ccf767b15 100644 Binary files a/backstop_data/bitmaps_reference/backstop_test_Choose_Service_-_Accounts_1_ausa-buttonhrefadd-service_0_desktop.png and b/backstop_data/bitmaps_reference/backstop_test_Choose_Service_-_Accounts_1_ausa-buttonhrefadd-service_0_desktop.png differ diff --git a/backstop_data/bitmaps_reference/backstop_test_Clear_Goals_0_document_0_desktop.png b/backstop_data/bitmaps_reference/backstop_test_Clear_Goals_0_document_0_desktop.png index 02cba03789..743c0c45b5 100644 Binary files a/backstop_data/bitmaps_reference/backstop_test_Clear_Goals_0_document_0_desktop.png and b/backstop_data/bitmaps_reference/backstop_test_Clear_Goals_0_document_0_desktop.png differ diff --git a/backstop_data/bitmaps_reference/backstop_test_Contact_0_document_0_desktop.png b/backstop_data/bitmaps_reference/backstop_test_Contact_0_document_0_desktop.png new file mode 100644 index 0000000000..5d264bffef Binary files /dev/null and b/backstop_data/bitmaps_reference/backstop_test_Contact_0_document_0_desktop.png differ diff --git a/backstop_data/bitmaps_reference/backstop_test_Delivery_Status_0_document_0_desktop.png b/backstop_data/bitmaps_reference/backstop_test_Delivery_Status_0_document_0_desktop.png index c774905ce8..860b280cc8 100644 Binary files a/backstop_data/bitmaps_reference/backstop_test_Delivery_Status_0_document_0_desktop.png and b/backstop_data/bitmaps_reference/backstop_test_Delivery_Status_0_document_0_desktop.png differ diff --git a/backstop_data/bitmaps_reference/backstop_test_Establish_Trust_0_document_0_desktop.png b/backstop_data/bitmaps_reference/backstop_test_Establish_Trust_0_document_0_desktop.png index 02cba03789..dd86b7b552 100644 Binary files a/backstop_data/bitmaps_reference/backstop_test_Establish_Trust_0_document_0_desktop.png and b/backstop_data/bitmaps_reference/backstop_test_Establish_Trust_0_document_0_desktop.png differ diff --git a/backstop_data/bitmaps_reference/backstop_test_Features_0_document_0_desktop.png b/backstop_data/bitmaps_reference/backstop_test_Features_0_document_0_desktop.png deleted file mode 100644 index a9f4e51ddf..0000000000 Binary files a/backstop_data/bitmaps_reference/backstop_test_Features_0_document_0_desktop.png and /dev/null differ diff --git a/backstop_data/bitmaps_reference/backstop_test_Get_Started_0_document_0_desktop.png b/backstop_data/bitmaps_reference/backstop_test_Get_Started_0_document_0_desktop.png index 899bcf30f2..2bca251363 100644 Binary files a/backstop_data/bitmaps_reference/backstop_test_Get_Started_0_document_0_desktop.png and b/backstop_data/bitmaps_reference/backstop_test_Get_Started_0_document_0_desktop.png differ diff --git a/backstop_data/bitmaps_reference/backstop_test_Get_Started_Page_-_Highlight_Trial_Mode_0_document_0_desktop.png b/backstop_data/bitmaps_reference/backstop_test_Get_Started_Page_-_Highlight_Trial_Mode_0_document_0_desktop.png index 899bcf30f2..2bca251363 100644 Binary files a/backstop_data/bitmaps_reference/backstop_test_Get_Started_Page_-_Highlight_Trial_Mode_0_document_0_desktop.png and b/backstop_data/bitmaps_reference/backstop_test_Get_Started_Page_-_Highlight_Trial_Mode_0_document_0_desktop.png differ diff --git a/backstop_data/bitmaps_reference/backstop_test_Guidance_0_document_0_desktop.png b/backstop_data/bitmaps_reference/backstop_test_Guidance_0_document_0_desktop.png index 02cba03789..70b55e0a5e 100644 Binary files a/backstop_data/bitmaps_reference/backstop_test_Guidance_0_document_0_desktop.png and b/backstop_data/bitmaps_reference/backstop_test_Guidance_0_document_0_desktop.png differ diff --git a/backstop_data/bitmaps_reference/backstop_test_Homepage_0_document_0_desktop.png b/backstop_data/bitmaps_reference/backstop_test_Homepage_0_document_0_desktop.png index 68997e23a7..686ce6fc53 100644 Binary files a/backstop_data/bitmaps_reference/backstop_test_Homepage_0_document_0_desktop.png and b/backstop_data/bitmaps_reference/backstop_test_Homepage_0_document_0_desktop.png differ diff --git a/backstop_data/bitmaps_reference/backstop_test_Join_Notify_0_document_0_desktop.png b/backstop_data/bitmaps_reference/backstop_test_Join_Notify_0_document_0_desktop.png new file mode 100644 index 0000000000..5d5df03ca2 Binary files /dev/null and b/backstop_data/bitmaps_reference/backstop_test_Join_Notify_0_document_0_desktop.png differ diff --git a/backstop_data/bitmaps_reference/backstop_test_Multiple_Languages_0_document_0_desktop.png b/backstop_data/bitmaps_reference/backstop_test_Multiple_Languages_0_document_0_desktop.png index 02cba03789..2774105e3c 100644 Binary files a/backstop_data/bitmaps_reference/backstop_test_Multiple_Languages_0_document_0_desktop.png and b/backstop_data/bitmaps_reference/backstop_test_Multiple_Languages_0_document_0_desktop.png differ diff --git a/backstop_data/bitmaps_reference/backstop_test_Pricing_0_document_0_desktop.png b/backstop_data/bitmaps_reference/backstop_test_Pricing_0_document_0_desktop.png index b494fe4760..ce776d661d 100644 Binary files a/backstop_data/bitmaps_reference/backstop_test_Pricing_0_document_0_desktop.png and b/backstop_data/bitmaps_reference/backstop_test_Pricing_0_document_0_desktop.png differ diff --git a/backstop_data/bitmaps_reference/backstop_test_Roadmap_0_document_0_desktop.png b/backstop_data/bitmaps_reference/backstop_test_Roadmap_0_document_0_desktop.png deleted file mode 100644 index df7902bd2f..0000000000 Binary files a/backstop_data/bitmaps_reference/backstop_test_Roadmap_0_document_0_desktop.png and /dev/null differ diff --git a/backstop_data/bitmaps_reference/backstop_test_Rules_And_Regulations_0_document_0_desktop.png b/backstop_data/bitmaps_reference/backstop_test_Rules_And_Regulations_0_document_0_desktop.png index 02cba03789..900d7febd9 100644 Binary files a/backstop_data/bitmaps_reference/backstop_test_Rules_And_Regulations_0_document_0_desktop.png and b/backstop_data/bitmaps_reference/backstop_test_Rules_And_Regulations_0_document_0_desktop.png differ diff --git a/backstop_data/bitmaps_reference/backstop_test_Security_0_document_0_desktop.png b/backstop_data/bitmaps_reference/backstop_test_Security_0_document_0_desktop.png index 17e172fa88..f1fea0a9ec 100644 Binary files a/backstop_data/bitmaps_reference/backstop_test_Security_0_document_0_desktop.png and b/backstop_data/bitmaps_reference/backstop_test_Security_0_document_0_desktop.png differ diff --git a/backstop_data/bitmaps_reference/backstop_test_Support_0_document_0_desktop.png b/backstop_data/bitmaps_reference/backstop_test_Support_0_document_0_desktop.png index b1045ba72a..56357f6cc0 100644 Binary files a/backstop_data/bitmaps_reference/backstop_test_Support_0_document_0_desktop.png and b/backstop_data/bitmaps_reference/backstop_test_Support_0_document_0_desktop.png differ diff --git a/backstop_data/bitmaps_reference/backstop_test_Trial_Mode_0_document_0_desktop.png b/backstop_data/bitmaps_reference/backstop_test_Trial_Mode_0_document_0_desktop.png index f1196ee798..67dc252b34 100644 Binary files a/backstop_data/bitmaps_reference/backstop_test_Trial_Mode_0_document_0_desktop.png and b/backstop_data/bitmaps_reference/backstop_test_Trial_Mode_0_document_0_desktop.png differ diff --git a/backstop_data/bitmaps_reference/backstop_test_Why_Text_Messaging_0_document_0_desktop.png b/backstop_data/bitmaps_reference/backstop_test_Why_Text_Messaging_0_document_0_desktop.png new file mode 100644 index 0000000000..072e59d52d Binary files /dev/null and b/backstop_data/bitmaps_reference/backstop_test_Why_Text_Messaging_0_document_0_desktop.png differ diff --git a/backstop_data/bitmaps_reference/backstop_test_Write_For_Action_0_document_0_desktop.png b/backstop_data/bitmaps_reference/backstop_test_Write_For_Action_0_document_0_desktop.png index 02cba03789..b18b2139af 100644 Binary files a/backstop_data/bitmaps_reference/backstop_test_Write_For_Action_0_document_0_desktop.png and b/backstop_data/bitmaps_reference/backstop_test_Write_For_Action_0_document_0_desktop.png differ diff --git a/deploy-config/demo.yml b/deploy-config/demo.yml index 05d167f4b5..2787b130ee 100644 --- a/deploy-config/demo.yml +++ b/deploy-config/demo.yml @@ -7,4 +7,3 @@ cloud_dot_gov_route: notify-demo.app.cloud.gov redis_enabled: 1 nr_agent_id: '1134302465' nr_app_id: '1083160688' -FEATURE_BEST_PRACTICES_ENABLED: true diff --git a/deploy-config/production.yml b/deploy-config/production.yml index 9f5cffc891..c27f93744d 100644 --- a/deploy-config/production.yml +++ b/deploy-config/production.yml @@ -7,4 +7,3 @@ cloud_dot_gov_route: notify.app.cloud.gov redis_enabled: 1 nr_agent_id: '1050708682' nr_app_id: '1050708682' -FEATURE_BEST_PRACTICES_ENABLED: false diff --git a/deploy-config/sandbox.yml b/deploy-config/sandbox.yml index 5cee4f0535..58180f409c 100644 --- a/deploy-config/sandbox.yml +++ b/deploy-config/sandbox.yml @@ -12,4 +12,3 @@ SECRET_KEY: sandbox-notify-secret-key nr_agent_id: '' nr_app_id: '' NR_BROWSER_KEY: '' -FEATURE_BEST_PRACTICES_ENABLED: true diff --git a/deploy-config/staging.yml b/deploy-config/staging.yml index 036f4472ef..0feb07a7f4 100644 --- a/deploy-config/staging.yml +++ b/deploy-config/staging.yml @@ -7,4 +7,3 @@ cloud_dot_gov_route: notify-staging.app.cloud.gov redis_enabled: 1 nr_agent_id: '1134291385' nr_app_id: '1031640326' -FEATURE_BEST_PRACTICES_ENABLED: false diff --git a/gulpfile.js b/gulpfile.js index 068643e749..e1bf8ba5c4 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -81,6 +81,8 @@ const javascripts = () => { paths.src + 'javascripts/main.js', paths.src + 'javascripts/totalMessagesChart.js', paths.src + 'javascripts/activityChart.js', + paths.src + 'javascripts/sidenav.js', + ]) .pipe(plugins.prettyerror()) .pipe( diff --git a/manifest.yml b/manifest.yml index 3e5f13b4c3..8f8bae937a 100644 --- a/manifest.yml +++ b/manifest.yml @@ -62,4 +62,3 @@ applications: LOGIN_DOT_GOV_CERTS_URL: ((LOGIN_DOT_GOV_CERTS_URL)) # feature flagging - FEATURE_BEST_PRACTICES_ENABLED: ((FEATURE_BEST_PRACTICES_ENABLED)) diff --git a/package-lock.json b/package-lock.json index d90a083b66..50641852e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@rollup/plugin-commonjs": "^28.0.2", "@rollup/plugin-node-resolve": "^16.0.0", "@rollup/stream": "^3.0.1", - "@uswds/uswds": "^3.10.0", + "@uswds/uswds": "^3.11.0", "cbor-js": "0.1.0", "d3": "^7.9.0", "govuk_frontend_toolkit": "^9.0.1", @@ -24,7 +24,7 @@ "playwright": "^1.49.1", "python": "^0.0.4", "query-command-supported": "1.0.0", - "sass-embedded": "^1.83.0", + "sass-embedded": "^1.83.4", "textarea-caret": "3.1.0", "timeago": "1.6.7", "vinyl-buffer": "^1.0.1", @@ -33,7 +33,7 @@ "devDependencies": { "@babel/core": "^7.26.0", "@babel/preset-env": "^7.26.0", - "@uswds/compile": "^1.2.0", + "@uswds/compile": "^1.2.1", "backstopjs": "^6.3.25", "better-npm-audit": "^3.11.0", "gulp": "^5.0.0", @@ -50,7 +50,7 @@ "jest-environment-jsdom": "^29.2.2", "jshint": "2.13.6", "jshint-stylish": "2.2.1", - "rollup": "^4.28.1", + "rollup": "^4.30.1", "rollup-plugin-commonjs": "10.1.0", "rollup-plugin-node-resolve": "5.2.0" }, @@ -1692,10 +1692,9 @@ "dev": true }, "node_modules/@bufbuild/protobuf": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-1.10.0.tgz", - "integrity": "sha512-QDdVFLoN93Zjg36NoQPZfsVH9tZew7wKDKyV5qRdj8ntT4wQCOradQjRaTdwMhWUYsgKsvCINKKm87FdEk96Ag==", - "dev": true + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.3.tgz", + "integrity": "sha512-tFQoXHJdkEOSwj5tRIZSPNUuXK3RaR7T1nUrPgbYX1pUbvqqaaZAsfo+NXBPsz5rZMSKVFrgK1WL8Q/MSLvprg==" }, "node_modules/@gulpjs/messages": { "version": "1.1.0", @@ -1809,15 +1808,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/@jest/console/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@jest/console/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -1926,15 +1916,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/@jest/core/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@jest/core/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -2111,15 +2092,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/@jest/reporters/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", @@ -2291,15 +2263,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/@jest/transform/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@jest/transform/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -2378,15 +2341,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/@jest/types/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@jest/types/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -2667,9 +2621,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz", - "integrity": "sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz", + "integrity": "sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==", "cpu": [ "arm" ], @@ -2679,9 +2633,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz", - "integrity": "sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz", + "integrity": "sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==", "cpu": [ "arm64" ], @@ -2691,9 +2645,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz", - "integrity": "sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz", + "integrity": "sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==", "cpu": [ "arm64" ], @@ -2703,9 +2657,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz", - "integrity": "sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz", + "integrity": "sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==", "cpu": [ "x64" ], @@ -2715,9 +2669,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz", - "integrity": "sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz", + "integrity": "sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==", "cpu": [ "arm64" ], @@ -2727,9 +2681,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz", - "integrity": "sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz", + "integrity": "sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==", "cpu": [ "x64" ], @@ -2739,9 +2693,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz", - "integrity": "sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz", + "integrity": "sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==", "cpu": [ "arm" ], @@ -2751,9 +2705,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz", - "integrity": "sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz", + "integrity": "sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==", "cpu": [ "arm" ], @@ -2763,9 +2717,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz", - "integrity": "sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz", + "integrity": "sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==", "cpu": [ "arm64" ], @@ -2775,9 +2729,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz", - "integrity": "sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz", + "integrity": "sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==", "cpu": [ "arm64" ], @@ -2787,9 +2741,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz", - "integrity": "sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz", + "integrity": "sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==", "cpu": [ "loong64" ], @@ -2799,9 +2753,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz", - "integrity": "sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz", + "integrity": "sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==", "cpu": [ "ppc64" ], @@ -2811,9 +2765,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz", - "integrity": "sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz", + "integrity": "sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==", "cpu": [ "riscv64" ], @@ -2823,9 +2777,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz", - "integrity": "sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz", + "integrity": "sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==", "cpu": [ "s390x" ], @@ -2835,9 +2789,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz", - "integrity": "sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz", + "integrity": "sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==", "cpu": [ "x64" ], @@ -2847,9 +2801,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz", - "integrity": "sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz", + "integrity": "sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==", "cpu": [ "x64" ], @@ -2859,9 +2813,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz", - "integrity": "sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz", + "integrity": "sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==", "cpu": [ "arm64" ], @@ -2871,9 +2825,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz", - "integrity": "sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz", + "integrity": "sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==", "cpu": [ "ia32" ], @@ -2883,9 +2837,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz", - "integrity": "sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz", + "integrity": "sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==", "cpu": [ "x64" ], @@ -3107,9 +3061,9 @@ } }, "node_modules/@uswds/compile": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@uswds/compile/-/compile-1.2.0.tgz", - "integrity": "sha512-QgZb1+BzgKUZM8oRHyTSQN6u9nDeAxIYIEocFpE1zkeW6uMaxqqaZdNmyzwCIMGieiXA0rv/DjEItNgkIQofOQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@uswds/compile/-/compile-1.2.1.tgz", + "integrity": "sha512-ODMGF97l8x+eJYp/7U1cB0CnalC5nb+1xEkP0sasG2bJyNqX9U+r7te0YNEURleIfrBOyxGVHVBBAw0gqS0htQ==", "dev": true, "dependencies": { "autoprefixer": "10.4.20", @@ -3120,60 +3074,59 @@ "gulp-replace": "1.1.4", "gulp-sass": "5.1.0", "gulp-svgstore": "9.0.0", - "postcss": "8.4.40", + "postcss": "8.4.49", "postcss-csso": "6.0.1", - "sass-embedded": "1.77.8" - } - }, - "node_modules/@uswds/compile/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" + "sass-embedded": "1.83.0" } }, "node_modules/@uswds/compile/node_modules/sass-embedded": { - "version": "1.77.8", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.77.8.tgz", - "integrity": "sha512-WGXA6jcaoBo5Uhw0HX/s6z/sl3zyYQ7ZOnLOJzqwpctFcFmU4L07zn51e2VSkXXFpQZFAdMZNqOGz/7h/fvcRA==", + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.83.0.tgz", + "integrity": "sha512-/8cYZeL39evUqe0o//193na51Q1VWZ61qhxioQvLJwOtWIrX+PgNhCyD8RSuTtmzc4+6+waFZf899bfp/MCUwA==", "dev": true, "dependencies": { - "@bufbuild/protobuf": "^1.0.0", + "@bufbuild/protobuf": "^2.0.0", "buffer-builder": "^0.2.0", - "immutable": "^4.0.0", + "colorjs.io": "^0.5.0", + "immutable": "^5.0.2", "rxjs": "^7.4.0", "supports-color": "^8.1.1", + "sync-child-process": "^1.0.2", "varint": "^6.0.0" }, + "bin": { + "sass": "dist/bin/sass.js" + }, "engines": { "node": ">=16.0.0" }, "optionalDependencies": { - "sass-embedded-android-arm": "1.77.8", - "sass-embedded-android-arm64": "1.77.8", - "sass-embedded-android-ia32": "1.77.8", - "sass-embedded-android-x64": "1.77.8", - "sass-embedded-darwin-arm64": "1.77.8", - "sass-embedded-darwin-x64": "1.77.8", - "sass-embedded-linux-arm": "1.77.8", - "sass-embedded-linux-arm64": "1.77.8", - "sass-embedded-linux-ia32": "1.77.8", - "sass-embedded-linux-musl-arm": "1.77.8", - "sass-embedded-linux-musl-arm64": "1.77.8", - "sass-embedded-linux-musl-ia32": "1.77.8", - "sass-embedded-linux-musl-x64": "1.77.8", - "sass-embedded-linux-x64": "1.77.8", - "sass-embedded-win32-arm64": "1.77.8", - "sass-embedded-win32-ia32": "1.77.8", - "sass-embedded-win32-x64": "1.77.8" + "sass-embedded-android-arm": "1.83.0", + "sass-embedded-android-arm64": "1.83.0", + "sass-embedded-android-ia32": "1.83.0", + "sass-embedded-android-riscv64": "1.83.0", + "sass-embedded-android-x64": "1.83.0", + "sass-embedded-darwin-arm64": "1.83.0", + "sass-embedded-darwin-x64": "1.83.0", + "sass-embedded-linux-arm": "1.83.0", + "sass-embedded-linux-arm64": "1.83.0", + "sass-embedded-linux-ia32": "1.83.0", + "sass-embedded-linux-musl-arm": "1.83.0", + "sass-embedded-linux-musl-arm64": "1.83.0", + "sass-embedded-linux-musl-ia32": "1.83.0", + "sass-embedded-linux-musl-riscv64": "1.83.0", + "sass-embedded-linux-musl-x64": "1.83.0", + "sass-embedded-linux-riscv64": "1.83.0", + "sass-embedded-linux-x64": "1.83.0", + "sass-embedded-win32-arm64": "1.83.0", + "sass-embedded-win32-ia32": "1.83.0", + "sass-embedded-win32-x64": "1.83.0" } }, "node_modules/@uswds/compile/node_modules/sass-embedded-android-arm": { - "version": "1.77.8", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.77.8.tgz", - "integrity": "sha512-GpGL7xZ7V1XpFbnflib/NWbM0euRzineK0iwoo31/ntWKAXGj03iHhGzkSiOwWSFcXgsJJi3eRA5BTmBvK5Q+w==", + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.83.0.tgz", + "integrity": "sha512-uwFSXzJlfbd4Px189xE5l+cxN8+TQpXdQgJec7TIrb4HEY7imabtpYufpVdqUVwT1/uiis5V4+qIEC4Vl5XObQ==", "cpu": [ "arm" ], @@ -3182,17 +3135,14 @@ "os": [ "android" ], - "bin": { - "sass": "dart-sass/sass" - }, "engines": { "node": ">=14.0.0" } }, "node_modules/@uswds/compile/node_modules/sass-embedded-android-arm64": { - "version": "1.77.8", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.77.8.tgz", - "integrity": "sha512-EmWHLbEx0Zo/f/lTFzMeH2Du+/I4RmSRlEnERSUKQWVp3aBSO04QDvdxfFezgQ+2Yt/ub9WMqBpma9P/8MPsLg==", + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.83.0.tgz", + "integrity": "sha512-GBiCvM4a2rkWBLdYDxI6XYnprfk5U5c81g69RC2X6kqPuzxzx8qTArQ9M6keFK4+iDQ5N9QTwFCr0KbZTn+ZNQ==", "cpu": [ "arm64" ], @@ -3201,17 +3151,14 @@ "os": [ "android" ], - "bin": { - "sass": "dart-sass/sass" - }, "engines": { "node": ">=14.0.0" } }, "node_modules/@uswds/compile/node_modules/sass-embedded-android-ia32": { - "version": "1.77.8", - "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.77.8.tgz", - "integrity": "sha512-+GjfJ3lDezPi4dUUyjQBxlNKXNa+XVWsExtGvVNkv1uKyaOxULJhubVo2G6QTJJU0esJdfeXf5Ca5/J0ph7+7w==", + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.83.0.tgz", + "integrity": "sha512-5ATPdGo2SICqAhiJl/Z8KQ23zH4sGgobGgux0TnrNtt83uHZ+r+To/ubVJ7xTkZxed+KJZnIpolGD8dQyQqoTg==", "cpu": [ "ia32" ], @@ -3220,17 +3167,30 @@ "os": [ "android" ], - "bin": { - "sass": "dart-sass/sass" - }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@uswds/compile/node_modules/sass-embedded-android-riscv64": { + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.83.0.tgz", + "integrity": "sha512-aveknUOB8GZewOzVn2Uwk+DKcncTR50Q6vtzslNMGbYnxtgQNHzy8A1qVEviNUruex+pHofppeMK4iMPFAbiEQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { "node": ">=14.0.0" } }, "node_modules/@uswds/compile/node_modules/sass-embedded-android-x64": { - "version": "1.77.8", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.77.8.tgz", - "integrity": "sha512-YZbFDzGe5NhaMCygShqkeCWtzjhkWxGVunc7ULR97wmxYPQLPeVyx7XFQZc84Aj0lKAJBJS4qRZeqphMqZEJsQ==", + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.83.0.tgz", + "integrity": "sha512-WqIay/72ncyf9Ph4vS742J3a73wZihWmzFUwpn1OD6lme1Aj4eWzWIve5IVnlTEJgcZcDHu6ECID9IZgehJKoA==", "cpu": [ "x64" ], @@ -3239,17 +3199,14 @@ "os": [ "android" ], - "bin": { - "sass": "dart-sass/sass" - }, "engines": { "node": ">=14.0.0" } }, "node_modules/@uswds/compile/node_modules/sass-embedded-darwin-arm64": { - "version": "1.77.8", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.77.8.tgz", - "integrity": "sha512-aifgeVRNE+i43toIkDFFJc/aPLMo0PJ5s5hKb52U+oNdiJE36n65n2L8F/8z3zZRvCa6eYtFY2b7f1QXR3B0LA==", + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.83.0.tgz", + "integrity": "sha512-XQl9QqgxFFIPm/CzHhmppse5o9ocxrbaAdC2/DAnlAqvYWBBtgFqPjGoYlej13h9SzfvNoogx+y9r+Ap+e+hYg==", "cpu": [ "arm64" ], @@ -3258,17 +3215,14 @@ "os": [ "darwin" ], - "bin": { - "sass": "dart-sass/sass" - }, "engines": { "node": ">=14.0.0" } }, "node_modules/@uswds/compile/node_modules/sass-embedded-darwin-x64": { - "version": "1.77.8", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.77.8.tgz", - "integrity": "sha512-/VWZQtcWIOek60Zj6Sxk6HebXA1Qyyt3sD8o5qwbTgZnKitB1iEBuNunyGoAgMNeUz2PRd6rVki6hvbas9hQ6w==", + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.83.0.tgz", + "integrity": "sha512-ERQ7Tvp1kFOW3ux4VDFIxb7tkYXHYc+zJpcrbs0hzcIO5ilIRU2tIOK1OrNwrFO6Qxyf7AUuBwYKLAtIU/Nz7g==", "cpu": [ "x64" ], @@ -3277,17 +3231,14 @@ "os": [ "darwin" ], - "bin": { - "sass": "dart-sass/sass" - }, "engines": { "node": ">=14.0.0" } }, "node_modules/@uswds/compile/node_modules/sass-embedded-linux-arm": { - "version": "1.77.8", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.77.8.tgz", - "integrity": "sha512-2edZMB6jf0whx3T0zlgH+p131kOEmWp+I4wnKj7ZMUeokiY4Up05d10hSvb0Q63lOrSjFAWu6P5/pcYUUx8arQ==", + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.83.0.tgz", + "integrity": "sha512-baG9RYBJxUFmqwDNC9h9ZFElgJoyO3jgHGjzEZ1wHhIS9anpG+zZQvO8bHx3dBpKEImX+DBeLX+CxsFR9n81gQ==", "cpu": [ "arm" ], @@ -3296,17 +3247,14 @@ "os": [ "linux" ], - "bin": { - "sass": "dart-sass/sass" - }, "engines": { "node": ">=14.0.0" } }, "node_modules/@uswds/compile/node_modules/sass-embedded-linux-arm64": { - "version": "1.77.8", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.77.8.tgz", - "integrity": "sha512-6iIOIZtBFa2YfMsHqOb3qake3C9d/zlKxjooKKnTSo+6g6z+CLTzMXe1bOfayb7yxeenElmFoK1k54kWD/40+g==", + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.83.0.tgz", + "integrity": "sha512-syEAVTJt4qhaMLxrSwOWa46zdqHJdnqJkLUK+t9aCr8xqBZLPxSUeIGji76uOehQZ1C+KGFj6n9xstHN6wzOJw==", "cpu": [ "arm64" ], @@ -3315,17 +3263,14 @@ "os": [ "linux" ], - "bin": { - "sass": "dart-sass/sass" - }, "engines": { "node": ">=14.0.0" } }, "node_modules/@uswds/compile/node_modules/sass-embedded-linux-ia32": { - "version": "1.77.8", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.77.8.tgz", - "integrity": "sha512-63GsFFHWN5yRLTWiSef32TM/XmjhCBx1DFhoqxmj+Yc6L9Z1h0lDHjjwdG6Sp5XTz5EmsaFKjpDgnQTP9hJX3Q==", + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.83.0.tgz", + "integrity": "sha512-RRBxQxMpoxu5+XcSSc6QR/o9asEwUzR8AbCS83RaXcdTIHTa/CccQsiAoDDoPlRsMTLqnzs0LKL4CfOsf7zBbA==", "cpu": [ "ia32" ], @@ -3334,17 +3279,14 @@ "os": [ "linux" ], - "bin": { - "sass": "dart-sass/sass" - }, "engines": { "node": ">=14.0.0" } }, "node_modules/@uswds/compile/node_modules/sass-embedded-linux-musl-arm": { - "version": "1.77.8", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.77.8.tgz", - "integrity": "sha512-nFkhSl3uu9btubm+JBW7uRglNVJ8W8dGfzVqh3fyQJKS1oyBC3vT3VOtfbT9YivXk28wXscSHpqXZwY7bUuopA==", + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.83.0.tgz", + "integrity": "sha512-Yc7u2TelCfBab+PRob9/MNJFh3EooMiz4urvhejXkihTiKSHGCv5YqDdtWzvyb9tY2Jb7YtYREVuHwfdVn3dTQ==", "cpu": [ "arm" ], @@ -3358,9 +3300,9 @@ } }, "node_modules/@uswds/compile/node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.77.8", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.77.8.tgz", - "integrity": "sha512-j8cgQxNWecYK+aH8ESFsyam/Q6G+9gg8eJegiRVpA9x8yk3ykfHC7UdQWwUcF22ZcuY4zegrjJx8k+thsgsOVA==", + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.83.0.tgz", + "integrity": "sha512-Y7juhPHClUO2H5O+u+StRy6SEAcwZ+hTEk5WJdEmo1Bb1gDtfHvJaWB/iFZJ2tW0W1e865AZeUrC4OcOFjyAQA==", "cpu": [ "arm64" ], @@ -3374,9 +3316,9 @@ } }, "node_modules/@uswds/compile/node_modules/sass-embedded-linux-musl-ia32": { - "version": "1.77.8", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.77.8.tgz", - "integrity": "sha512-oWveMe+8TFlP8WBWPna/+Ec5TV0CE+PxEutyi0ltSruBds2zxRq9dPVOqrpPcDN9QUx50vNZC0Afgch0aQEd0g==", + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.83.0.tgz", + "integrity": "sha512-arQeYwGmwXV8byx5G1PtSzZWW1jbkfR5qrIHMEbTFSAvAxpqjgSvCvrHMOFd73FcMxVaYh4BX9LQNbKinkbEdg==", "cpu": [ "ia32" ], @@ -3389,10 +3331,26 @@ "node": ">=14.0.0" } }, + "node_modules/@uswds/compile/node_modules/sass-embedded-linux-musl-riscv64": { + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.83.0.tgz", + "integrity": "sha512-E6uzlIWz59rut+Z3XR6mLG915zNzv07ISvj3GUNZENdHM7dF8GQ//ANoIpl5PljMQKp89GnYdvo6kj2gnaBf/g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@uswds/compile/node_modules/sass-embedded-linux-musl-x64": { - "version": "1.77.8", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.77.8.tgz", - "integrity": "sha512-2NtRpMXHeFo9kaYxuZ+Ewwo39CE7BTS2JDfXkTjZTZqd8H+8KC53eBh516YQnn2oiqxSiKxm7a6pxbxGZGwXOQ==", + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.83.0.tgz", + "integrity": "sha512-eAMK6tyGqvqr21r9g8BnR3fQc1rYFj85RGduSQ3xkITZ6jOAnOhuU94N5fwRS852Hpws0lXhET+7JHXgg3U18w==", "cpu": [ "x64" ], @@ -3405,10 +3363,26 @@ "node": ">=14.0.0" } }, + "node_modules/@uswds/compile/node_modules/sass-embedded-linux-riscv64": { + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.83.0.tgz", + "integrity": "sha512-Ojpi78pTv02sy2fUYirRGXHLY3fPnV/bvwuC2i5LwPQw2LpCcFyFTtN0c5h4LJDk9P6wr+/ZB/JXU8tHIOlK+Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@uswds/compile/node_modules/sass-embedded-linux-x64": { - "version": "1.77.8", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.77.8.tgz", - "integrity": "sha512-ND5qZLWUCpOn7LJfOf0gLSZUWhNIysY+7NZK1Ctq+pM6tpJky3JM5I1jSMplNxv5H3o8p80n0gSm+fcjsEFfjQ==", + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.83.0.tgz", + "integrity": "sha512-3iLjlXdoPfgZRtX4odhRvka1BQs5mAXqfCtDIQBgh/o0JnGPzJIWWl9bYLpHxK8qb+uyVBxXYgXpI0sCzArBOw==", "cpu": [ "x64" ], @@ -3417,17 +3391,14 @@ "os": [ "linux" ], - "bin": { - "sass": "dart-sass/sass" - }, "engines": { "node": ">=14.0.0" } }, "node_modules/@uswds/compile/node_modules/sass-embedded-win32-arm64": { - "version": "1.77.8", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.77.8.tgz", - "integrity": "sha512-7L8zT6xzEvTYj86MvUWnbkWYCNQP+74HvruLILmiPPE+TCgOjgdi750709BtppVJGGZSs40ZuN6mi/YQyGtwXg==", + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.83.0.tgz", + "integrity": "sha512-iOHw/8/t2dlTW3lOFwG5eUbiwhEyGWawivlKWJ8lkXH7fjMpVx2VO9zCFAm8RvY9xOHJ9sf1L7g5bx3EnNP9BQ==", "cpu": [ "arm64" ], @@ -3436,17 +3407,14 @@ "os": [ "win32" ], - "bin": { - "sass": "dart-sass/sass.bat" - }, "engines": { "node": ">=14.0.0" } }, "node_modules/@uswds/compile/node_modules/sass-embedded-win32-ia32": { - "version": "1.77.8", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.77.8.tgz", - "integrity": "sha512-7Buh+4bP0WyYn6XPbthkIa3M2vtcR8QIsFVg3JElVlr+8Ng19jqe0t0SwggDgbMX6AdQZC+Wj4F1BprZSok42A==", + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.83.0.tgz", + "integrity": "sha512-2PxNXJ8Pad4geVcTXY4rkyTr5AwbF8nfrCTDv0ulbTvPhzX2mMKEGcBZUXWn5BeHZTBc6whNMfS7d5fQXR9dDQ==", "cpu": [ "ia32" ], @@ -3455,17 +3423,14 @@ "os": [ "win32" ], - "bin": { - "sass": "dart-sass/sass.bat" - }, "engines": { "node": ">=14.0.0" } }, "node_modules/@uswds/compile/node_modules/sass-embedded-win32-x64": { - "version": "1.77.8", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.77.8.tgz", - "integrity": "sha512-rZmLIx4/LLQm+4GW39sRJW0MIlDqmyV0fkRzTmhFP5i/wVC7cuj8TUubPHw18rv2rkHFfBZKZJTCkPjCS5Z+SA==", + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.83.0.tgz", + "integrity": "sha512-muBXkFngM6eLTNqOV0FQi7Dv9s+YRQ42Yem26mosdan/GmJQc81deto6uDTgrYn+bzFNmiXcOdfm+0MkTWK3OQ==", "cpu": [ "x64" ], @@ -3474,32 +3439,14 @@ "os": [ "win32" ], - "bin": { - "sass": "dart-sass/sass.bat" - }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@uswds/compile/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/@uswds/uswds": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@uswds/uswds/-/uswds-3.10.0.tgz", - "integrity": "sha512-LWFTQzp4e3kqtnD/Wsyfx9uGTkn5GEpzhscNWJMIsdWBGKtiu96QT99oRJUmcsB6HbGhR0Th0FtlK/Zzx2WghA==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@uswds/uswds/-/uswds-3.11.0.tgz", + "integrity": "sha512-ze0MNXaZhgXLyNICpclm5g4pOGyU4/FE0DQTP5G19mHWB914vrCJvOxyTo2n1qGVMVwJtf6MtpBCnghAC8WaZA==", "dependencies": { "receptor": "1.0.0", "resolve-id-refs": "0.1.0" @@ -3991,15 +3938,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/babel-jest/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/babel-jest/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -4229,15 +4167,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/backstopjs/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/backstopjs/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -5135,15 +5064,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/create-jest/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/create-jest/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -7272,15 +7192,6 @@ "node": ">= 10.13.0" } }, - "node_modules/gulp-cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/gulp-cli/node_modules/sparkles": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-2.1.0.tgz", @@ -8103,11 +8014,19 @@ "node": ">=0.10.0" } }, - "node_modules/has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha512-+F4GzLjwHNNDEAJW2DC1xXfEoPkRDmUdJ7CBYw4MpqtDwOnqdImJl7GWlpqx+Wko6//J8uKTnIe4wZSv7yCqmw==", - "dev": true, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha512-+F4GzLjwHNNDEAJW2DC1xXfEoPkRDmUdJ7CBYw4MpqtDwOnqdImJl7GWlpqx+Wko6//J8uKTnIe4wZSv7yCqmw==", + "dev": true, "dependencies": { "sparkles": "^1.0.0" }, @@ -8324,10 +8243,9 @@ } }, "node_modules/immutable": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", - "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==", - "dev": true + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", + "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==" }, "node_modules/import-fresh": { "version": "3.3.0", @@ -8756,15 +8674,6 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/istanbul-lib-report/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -8940,15 +8849,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/jest-circus/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-circus/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -9057,15 +8957,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/jest-cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-cli/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -9190,15 +9081,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/jest-config/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-config/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -9275,15 +9157,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/jest-diff/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-diff/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -9382,15 +9255,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/jest-each/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-each/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -9558,15 +9422,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/jest-matcher-utils/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-matcher-utils/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -9648,15 +9503,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/jest-message-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-message-util/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -9791,15 +9637,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/jest-resolve/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-resolve/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -9893,15 +9730,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/jest-runner/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-runner/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -9996,15 +9824,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/jest-runtime/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-runtime/node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", @@ -10106,15 +9925,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/jest-snapshot/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-snapshot/node_modules/semver": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", @@ -10205,15 +10015,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/jest-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-util/node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -10316,15 +10117,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/jest-validate/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-validate/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -10405,15 +10197,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/jest-watcher/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-watcher/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -10441,30 +10224,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/jpeg-js": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", @@ -11965,9 +11724,9 @@ "dev": true }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "node_modules/picomatch": { @@ -12173,9 +11932,9 @@ } }, "node_modules/postcss": { - "version": "8.4.40", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.40.tgz", - "integrity": "sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, "funding": [ { @@ -12193,8 +11952,8 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -12964,9 +12723,9 @@ "license": "Unlicense" }, "node_modules/rollup": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.28.1.tgz", - "integrity": "sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.30.1.tgz", + "integrity": "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==", "dependencies": { "@types/estree": "1.0.6" }, @@ -12978,25 +12737,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.28.1", - "@rollup/rollup-android-arm64": "4.28.1", - "@rollup/rollup-darwin-arm64": "4.28.1", - "@rollup/rollup-darwin-x64": "4.28.1", - "@rollup/rollup-freebsd-arm64": "4.28.1", - "@rollup/rollup-freebsd-x64": "4.28.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.28.1", - "@rollup/rollup-linux-arm-musleabihf": "4.28.1", - "@rollup/rollup-linux-arm64-gnu": "4.28.1", - "@rollup/rollup-linux-arm64-musl": "4.28.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.28.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.28.1", - "@rollup/rollup-linux-riscv64-gnu": "4.28.1", - "@rollup/rollup-linux-s390x-gnu": "4.28.1", - "@rollup/rollup-linux-x64-gnu": "4.28.1", - "@rollup/rollup-linux-x64-musl": "4.28.1", - "@rollup/rollup-win32-arm64-msvc": "4.28.1", - "@rollup/rollup-win32-ia32-msvc": "4.28.1", - "@rollup/rollup-win32-x64-msvc": "4.28.1", + "@rollup/rollup-android-arm-eabi": "4.30.1", + "@rollup/rollup-android-arm64": "4.30.1", + "@rollup/rollup-darwin-arm64": "4.30.1", + "@rollup/rollup-darwin-x64": "4.30.1", + "@rollup/rollup-freebsd-arm64": "4.30.1", + "@rollup/rollup-freebsd-x64": "4.30.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.30.1", + "@rollup/rollup-linux-arm-musleabihf": "4.30.1", + "@rollup/rollup-linux-arm64-gnu": "4.30.1", + "@rollup/rollup-linux-arm64-musl": "4.30.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.30.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1", + "@rollup/rollup-linux-riscv64-gnu": "4.30.1", + "@rollup/rollup-linux-s390x-gnu": "4.30.1", + "@rollup/rollup-linux-x64-gnu": "4.30.1", + "@rollup/rollup-linux-x64-musl": "4.30.1", + "@rollup/rollup-win32-arm64-msvc": "4.30.1", + "@rollup/rollup-win32-ia32-msvc": "4.30.1", + "@rollup/rollup-win32-x64-msvc": "4.30.1", "fsevents": "~2.3.2" } }, @@ -13105,9 +12864,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass-embedded": { - "version": "1.83.0", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.83.0.tgz", - "integrity": "sha512-/8cYZeL39evUqe0o//193na51Q1VWZ61qhxioQvLJwOtWIrX+PgNhCyD8RSuTtmzc4+6+waFZf899bfp/MCUwA==", + "version": "1.83.4", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.83.4.tgz", + "integrity": "sha512-Hf2burRA/y5PGxsg6jB9UpoK/xZ6g/pgrkOcdl6j+rRg1Zj8XhGKZ1MTysZGtTPUUmiiErqzkP5+Kzp95yv9GQ==", "dependencies": { "@bufbuild/protobuf": "^2.0.0", "buffer-builder": "^0.2.0", @@ -13125,32 +12884,32 @@ "node": ">=16.0.0" }, "optionalDependencies": { - "sass-embedded-android-arm": "1.83.0", - "sass-embedded-android-arm64": "1.83.0", - "sass-embedded-android-ia32": "1.83.0", - "sass-embedded-android-riscv64": "1.83.0", - "sass-embedded-android-x64": "1.83.0", - "sass-embedded-darwin-arm64": "1.83.0", - "sass-embedded-darwin-x64": "1.83.0", - "sass-embedded-linux-arm": "1.83.0", - "sass-embedded-linux-arm64": "1.83.0", - "sass-embedded-linux-ia32": "1.83.0", - "sass-embedded-linux-musl-arm": "1.83.0", - "sass-embedded-linux-musl-arm64": "1.83.0", - "sass-embedded-linux-musl-ia32": "1.83.0", - "sass-embedded-linux-musl-riscv64": "1.83.0", - "sass-embedded-linux-musl-x64": "1.83.0", - "sass-embedded-linux-riscv64": "1.83.0", - "sass-embedded-linux-x64": "1.83.0", - "sass-embedded-win32-arm64": "1.83.0", - "sass-embedded-win32-ia32": "1.83.0", - "sass-embedded-win32-x64": "1.83.0" + "sass-embedded-android-arm": "1.83.4", + "sass-embedded-android-arm64": "1.83.4", + "sass-embedded-android-ia32": "1.83.4", + "sass-embedded-android-riscv64": "1.83.4", + "sass-embedded-android-x64": "1.83.4", + "sass-embedded-darwin-arm64": "1.83.4", + "sass-embedded-darwin-x64": "1.83.4", + "sass-embedded-linux-arm": "1.83.4", + "sass-embedded-linux-arm64": "1.83.4", + "sass-embedded-linux-ia32": "1.83.4", + "sass-embedded-linux-musl-arm": "1.83.4", + "sass-embedded-linux-musl-arm64": "1.83.4", + "sass-embedded-linux-musl-ia32": "1.83.4", + "sass-embedded-linux-musl-riscv64": "1.83.4", + "sass-embedded-linux-musl-x64": "1.83.4", + "sass-embedded-linux-riscv64": "1.83.4", + "sass-embedded-linux-x64": "1.83.4", + "sass-embedded-win32-arm64": "1.83.4", + "sass-embedded-win32-ia32": "1.83.4", + "sass-embedded-win32-x64": "1.83.4" } }, "node_modules/sass-embedded-android-arm": { - "version": "1.83.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.83.0.tgz", - "integrity": "sha512-uwFSXzJlfbd4Px189xE5l+cxN8+TQpXdQgJec7TIrb4HEY7imabtpYufpVdqUVwT1/uiis5V4+qIEC4Vl5XObQ==", + "version": "1.83.4", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.83.4.tgz", + "integrity": "sha512-9Z4pJAOgEkXa3VDY/o+U6l5XvV0mZTJcSl0l/mSPHihjAHSpLYnOW6+KOWeM8dxqrsqTYcd6COzhanI/a++5Gw==", "cpu": [ "arm" ], @@ -13163,9 +12922,9 @@ } }, "node_modules/sass-embedded-android-arm64": { - "version": "1.83.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.83.0.tgz", - "integrity": "sha512-GBiCvM4a2rkWBLdYDxI6XYnprfk5U5c81g69RC2X6kqPuzxzx8qTArQ9M6keFK4+iDQ5N9QTwFCr0KbZTn+ZNQ==", + "version": "1.83.4", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.83.4.tgz", + "integrity": "sha512-tgX4FzmbVqnQmD67ZxQDvI+qFNABrboOQgwsG05E5bA/US42zGajW9AxpECJYiMXVOHmg+d81ICbjb0fsVHskw==", "cpu": [ "arm64" ], @@ -13178,9 +12937,9 @@ } }, "node_modules/sass-embedded-android-ia32": { - "version": "1.83.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.83.0.tgz", - "integrity": "sha512-5ATPdGo2SICqAhiJl/Z8KQ23zH4sGgobGgux0TnrNtt83uHZ+r+To/ubVJ7xTkZxed+KJZnIpolGD8dQyQqoTg==", + "version": "1.83.4", + "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.83.4.tgz", + "integrity": "sha512-RsFOziFqPcfZXdFRULC4Ayzy9aK6R6FwQ411broCjlOBX+b0gurjRadkue3cfUEUR5mmy0KeCbp7zVKPLTK+5Q==", "cpu": [ "ia32" ], @@ -13193,9 +12952,9 @@ } }, "node_modules/sass-embedded-android-riscv64": { - "version": "1.83.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.83.0.tgz", - "integrity": "sha512-aveknUOB8GZewOzVn2Uwk+DKcncTR50Q6vtzslNMGbYnxtgQNHzy8A1qVEviNUruex+pHofppeMK4iMPFAbiEQ==", + "version": "1.83.4", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.83.4.tgz", + "integrity": "sha512-EHwh0nmQarBBrMRU928eTZkFGx19k/XW2YwbPR4gBVdWLkbTgCA5aGe8hTE6/1zStyx++3nDGvTZ78+b/VvvLg==", "cpu": [ "riscv64" ], @@ -13208,9 +12967,9 @@ } }, "node_modules/sass-embedded-android-x64": { - "version": "1.83.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.83.0.tgz", - "integrity": "sha512-WqIay/72ncyf9Ph4vS742J3a73wZihWmzFUwpn1OD6lme1Aj4eWzWIve5IVnlTEJgcZcDHu6ECID9IZgehJKoA==", + "version": "1.83.4", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.83.4.tgz", + "integrity": "sha512-0PgQNuPWYy1jEOEPDVsV89KfqOsMLIp9CSbjBY7jRcwRhyVAcigqrUG6bDeNtojHUYKA1kU+Eh/85WxOHUOgBw==", "cpu": [ "x64" ], @@ -13223,9 +12982,9 @@ } }, "node_modules/sass-embedded-darwin-arm64": { - "version": "1.83.0", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.83.0.tgz", - "integrity": "sha512-XQl9QqgxFFIPm/CzHhmppse5o9ocxrbaAdC2/DAnlAqvYWBBtgFqPjGoYlej13h9SzfvNoogx+y9r+Ap+e+hYg==", + "version": "1.83.4", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.83.4.tgz", + "integrity": "sha512-rp2ywymWc3nymnSnAFG5R/8hvxWCsuhK3wOnD10IDlmNB7o4rzKby1c+2ZfpQGowlYGWsWWTgz8FW2qzmZsQRw==", "cpu": [ "arm64" ], @@ -13238,9 +12997,9 @@ } }, "node_modules/sass-embedded-darwin-x64": { - "version": "1.83.0", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.83.0.tgz", - "integrity": "sha512-ERQ7Tvp1kFOW3ux4VDFIxb7tkYXHYc+zJpcrbs0hzcIO5ilIRU2tIOK1OrNwrFO6Qxyf7AUuBwYKLAtIU/Nz7g==", + "version": "1.83.4", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.83.4.tgz", + "integrity": "sha512-kLkN2lXz9PCgGfDS8Ev5YVcl/V2173L6379en/CaFuJJi7WiyPgBymW7hOmfCt4uO4R1y7CP2Uc08DRtZsBlAA==", "cpu": [ "x64" ], @@ -13253,9 +13012,9 @@ } }, "node_modules/sass-embedded-linux-arm": { - "version": "1.83.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.83.0.tgz", - "integrity": "sha512-baG9RYBJxUFmqwDNC9h9ZFElgJoyO3jgHGjzEZ1wHhIS9anpG+zZQvO8bHx3dBpKEImX+DBeLX+CxsFR9n81gQ==", + "version": "1.83.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.83.4.tgz", + "integrity": "sha512-nL90ryxX2lNmFucr9jYUyHHx21AoAgdCL1O5Ltx2rKg2xTdytAGHYo2MT5S0LIeKLa/yKP/hjuSvrbICYNDvtA==", "cpu": [ "arm" ], @@ -13268,9 +13027,9 @@ } }, "node_modules/sass-embedded-linux-arm64": { - "version": "1.83.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.83.0.tgz", - "integrity": "sha512-syEAVTJt4qhaMLxrSwOWa46zdqHJdnqJkLUK+t9aCr8xqBZLPxSUeIGji76uOehQZ1C+KGFj6n9xstHN6wzOJw==", + "version": "1.83.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.83.4.tgz", + "integrity": "sha512-E0zjsZX2HgESwyqw31EHtI39DKa7RgK7nvIhIRco1d0QEw227WnoR9pjH3M/ZQy4gQj3GKilOFHM5Krs/omeIA==", "cpu": [ "arm64" ], @@ -13283,9 +13042,9 @@ } }, "node_modules/sass-embedded-linux-ia32": { - "version": "1.83.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.83.0.tgz", - "integrity": "sha512-RRBxQxMpoxu5+XcSSc6QR/o9asEwUzR8AbCS83RaXcdTIHTa/CccQsiAoDDoPlRsMTLqnzs0LKL4CfOsf7zBbA==", + "version": "1.83.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.83.4.tgz", + "integrity": "sha512-ew5HpchSzgAYbQoriRh8QhlWn5Kw2nQ2jHoV9YLwGKe3fwwOWA0KDedssvDv7FWnY/FCqXyymhLd6Bxae4Xquw==", "cpu": [ "ia32" ], @@ -13298,9 +13057,9 @@ } }, "node_modules/sass-embedded-linux-musl-arm": { - "version": "1.83.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.83.0.tgz", - "integrity": "sha512-Yc7u2TelCfBab+PRob9/MNJFh3EooMiz4urvhejXkihTiKSHGCv5YqDdtWzvyb9tY2Jb7YtYREVuHwfdVn3dTQ==", + "version": "1.83.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.83.4.tgz", + "integrity": "sha512-0RrJRwMrmm+gG0VOB5b5Cjs7Sd+lhqpQJa6EJNEaZHljJokEfpE5GejZsGMRMIQLxEvVphZnnxl6sonCGFE/QQ==", "cpu": [ "arm" ], @@ -13313,9 +13072,9 @@ } }, "node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.83.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.83.0.tgz", - "integrity": "sha512-Y7juhPHClUO2H5O+u+StRy6SEAcwZ+hTEk5WJdEmo1Bb1gDtfHvJaWB/iFZJ2tW0W1e865AZeUrC4OcOFjyAQA==", + "version": "1.83.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.83.4.tgz", + "integrity": "sha512-IzMgalf6MZOxgp4AVCgsaWAFDP/IVWOrgVXxkyhw29fyAEoSWBJH4k87wyPhEtxSuzVHLxKNbc8k3UzdWmlBFg==", "cpu": [ "arm64" ], @@ -13328,9 +13087,9 @@ } }, "node_modules/sass-embedded-linux-musl-ia32": { - "version": "1.83.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.83.0.tgz", - "integrity": "sha512-arQeYwGmwXV8byx5G1PtSzZWW1jbkfR5qrIHMEbTFSAvAxpqjgSvCvrHMOFd73FcMxVaYh4BX9LQNbKinkbEdg==", + "version": "1.83.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.83.4.tgz", + "integrity": "sha512-LLb4lYbcxPzX4UaJymYXC+WwokxUlfTJEFUv5VF0OTuSsHAGNRs/rslPtzVBTvMeG9TtlOQDhku1F7G6iaDotA==", "cpu": [ "ia32" ], @@ -13343,9 +13102,9 @@ } }, "node_modules/sass-embedded-linux-musl-riscv64": { - "version": "1.83.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.83.0.tgz", - "integrity": "sha512-E6uzlIWz59rut+Z3XR6mLG915zNzv07ISvj3GUNZENdHM7dF8GQ//ANoIpl5PljMQKp89GnYdvo6kj2gnaBf/g==", + "version": "1.83.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.83.4.tgz", + "integrity": "sha512-zoKlPzD5Z13HKin1UGR74QkEy+kZEk2AkGX5RelRG494mi+IWwRuWCppXIovor9+BQb9eDWPYPoMVahwN5F7VA==", "cpu": [ "riscv64" ], @@ -13358,9 +13117,9 @@ } }, "node_modules/sass-embedded-linux-musl-x64": { - "version": "1.83.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.83.0.tgz", - "integrity": "sha512-eAMK6tyGqvqr21r9g8BnR3fQc1rYFj85RGduSQ3xkITZ6jOAnOhuU94N5fwRS852Hpws0lXhET+7JHXgg3U18w==", + "version": "1.83.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.83.4.tgz", + "integrity": "sha512-hB8+/PYhfEf2zTIcidO5Bpof9trK6WJjZ4T8g2MrxQh8REVtdPcgIkoxczRynqybf9+fbqbUwzXtiUao2GV+vQ==", "cpu": [ "x64" ], @@ -13373,9 +13132,9 @@ } }, "node_modules/sass-embedded-linux-riscv64": { - "version": "1.83.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.83.0.tgz", - "integrity": "sha512-Ojpi78pTv02sy2fUYirRGXHLY3fPnV/bvwuC2i5LwPQw2LpCcFyFTtN0c5h4LJDk9P6wr+/ZB/JXU8tHIOlK+Q==", + "version": "1.83.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.83.4.tgz", + "integrity": "sha512-83fL4n+oeDJ0Y4KjASmZ9jHS1Vl9ESVQYHMhJE0i4xDi/P3BNarm2rsKljq/QtrwGpbqwn8ujzOu7DsNCMDSHA==", "cpu": [ "riscv64" ], @@ -13388,9 +13147,9 @@ } }, "node_modules/sass-embedded-linux-x64": { - "version": "1.83.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.83.0.tgz", - "integrity": "sha512-3iLjlXdoPfgZRtX4odhRvka1BQs5mAXqfCtDIQBgh/o0JnGPzJIWWl9bYLpHxK8qb+uyVBxXYgXpI0sCzArBOw==", + "version": "1.83.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.83.4.tgz", + "integrity": "sha512-NlnGdvCmTD5PK+LKXlK3sAuxOgbRIEoZfnHvxd157imCm/s2SYF/R28D0DAAjEViyI8DovIWghgbcqwuertXsA==", "cpu": [ "x64" ], @@ -13403,9 +13162,9 @@ } }, "node_modules/sass-embedded-win32-arm64": { - "version": "1.83.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.83.0.tgz", - "integrity": "sha512-iOHw/8/t2dlTW3lOFwG5eUbiwhEyGWawivlKWJ8lkXH7fjMpVx2VO9zCFAm8RvY9xOHJ9sf1L7g5bx3EnNP9BQ==", + "version": "1.83.4", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.83.4.tgz", + "integrity": "sha512-J2BFKrEaeSrVazU2qTjyQdAk+MvbzJeTuCET0uAJEXSKtvQ3AzxvzndS7LqkDPbF32eXAHLw8GVpwcBwKbB3Uw==", "cpu": [ "arm64" ], @@ -13418,9 +13177,9 @@ } }, "node_modules/sass-embedded-win32-ia32": { - "version": "1.83.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.83.0.tgz", - "integrity": "sha512-2PxNXJ8Pad4geVcTXY4rkyTr5AwbF8nfrCTDv0ulbTvPhzX2mMKEGcBZUXWn5BeHZTBc6whNMfS7d5fQXR9dDQ==", + "version": "1.83.4", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.83.4.tgz", + "integrity": "sha512-uPAe9T/5sANFhJS5dcfAOhOJy8/l2TRYG4r+UO3Wp4yhqbN7bggPvY9c7zMYS0OC8tU/bCvfYUDFHYMCl91FgA==", "cpu": [ "ia32" ], @@ -13433,9 +13192,9 @@ } }, "node_modules/sass-embedded-win32-x64": { - "version": "1.83.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.83.0.tgz", - "integrity": "sha512-muBXkFngM6eLTNqOV0FQi7Dv9s+YRQ42Yem26mosdan/GmJQc81deto6uDTgrYn+bzFNmiXcOdfm+0MkTWK3OQ==", + "version": "1.83.4", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.83.4.tgz", + "integrity": "sha512-C9fkDY0jKITdJFij4UbfPFswxoXN9O/Dr79v17fJnstVwtUojzVJWKHUXvF0Zg2LIR7TCc4ju3adejKFxj7ueA==", "cpu": [ "x64" ], @@ -13447,38 +13206,6 @@ "node": ">=14.0.0" } }, - "node_modules/sass-embedded/node_modules/@bufbuild/protobuf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.1.0.tgz", - "integrity": "sha512-+2Mx67Y3skJ4NCD/qNSdBJNWtu6x6Qr53jeNg+QcwiL6mt0wK+3jwHH2x1p7xaYH6Ve2JKOVn0OxU35WsmqI9A==" - }, - "node_modules/sass-embedded/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/sass-embedded/node_modules/immutable": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.2.tgz", - "integrity": "sha512-1NU7hWZDkV7hJ4PJ9dur9gTNQ4ePNPN4k9/0YhwjzykTi/+3Q5pF93YU5QoVj8BuOnhLgaY8gs0U2pj4kSYVcw==" - }, - "node_modules/sass-embedded/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", @@ -13768,9 +13495,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -13988,6 +13715,20 @@ "express": "^4.16.3" } }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", diff --git a/package.json b/package.json index af6ec7118a..73197a4c83 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "@rollup/plugin-commonjs": "^28.0.2", "@rollup/plugin-node-resolve": "^16.0.0", "@rollup/stream": "^3.0.1", - "@uswds/uswds": "^3.10.0", + "@uswds/uswds": "^3.11.0", "cbor-js": "0.1.0", "d3": "^7.9.0", "govuk_frontend_toolkit": "^9.0.1", @@ -40,7 +40,7 @@ "playwright": "^1.49.1", "python": "^0.0.4", "query-command-supported": "1.0.0", - "sass-embedded": "^1.83.0", + "sass-embedded": "^1.83.4", "textarea-caret": "3.1.0", "timeago": "1.6.7", "vinyl-buffer": "^1.0.1", @@ -49,7 +49,7 @@ "devDependencies": { "@babel/core": "^7.26.0", "@babel/preset-env": "^7.26.0", - "@uswds/compile": "^1.2.0", + "@uswds/compile": "^1.2.1", "backstopjs": "^6.3.25", "better-npm-audit": "^3.11.0", "gulp": "^5.0.0", @@ -66,7 +66,7 @@ "jest-environment-jsdom": "^29.2.2", "jshint": "2.13.6", "jshint-stylish": "2.2.1", - "rollup": "^4.28.1", + "rollup": "^4.30.1", "rollup-plugin-commonjs": "10.1.0", "rollup-plugin-node-resolve": "5.2.0" } diff --git a/poetry.lock b/poetry.lock index aff07625dc..213eb0ac37 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. [[package]] name = "ago" @@ -1226,13 +1226,13 @@ files = [ [[package]] name = "jinja2" -version = "3.1.4" +version = "3.1.5" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, - {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, + {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, + {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, ] [package.dependencies] @@ -1936,13 +1936,13 @@ files = [ [[package]] name = "phonenumbers" -version = "8.13.48" +version = "8.13.52" description = "Python version of Google's common library for parsing, formatting, storing and validating international phone numbers." optional = false python-versions = "*" files = [ - {file = "phonenumbers-8.13.48-py2.py3-none-any.whl", hash = "sha256:5c51939acefa390eb74119750afb10a85d3c628dc83fd62c52d6f532fcf5d205"}, - {file = "phonenumbers-8.13.48.tar.gz", hash = "sha256:62d8df9b0f3c3c41571c6b396f044ddd999d61631534001b8be7fdf7ba1b18f3"}, + {file = "phonenumbers-8.13.52-py2.py3-none-any.whl", hash = "sha256:e803210038ece9d208b129e3023dc20e656a820d6bf6f1cb0471d4164f54bada"}, + {file = "phonenumbers-8.13.52.tar.gz", hash = "sha256:fdc371ea6a4da052beb1225de63963d5a2fddbbff2bb53e3a957f360e0185f80"}, ] [[package]] @@ -3134,4 +3134,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.12.2" -content-hash = "870238eefd4342c30a6843c595dde7180180904ad12f6682586916a52ee0a332" +content-hash = "3035525f7fc44291ea02b011d9fa6c0e84501d567417144e4d8fd6beebb11928" diff --git a/pyproject.toml b/pyproject.toml index d02dcbced0..437012c97d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,7 +21,7 @@ flask-wtf = "^1.2" gunicorn = {version = "==22.0.0", extras = ["eventlet"]} humanize = "~=4.10" itsdangerous = "~=2.2" -jinja2 = "~=3.1" +jinja2 = "^3.1.5" newrelic = "*" notifications-python-client = "==10.0.0" pyexcel = "==0.7.0" @@ -50,7 +50,7 @@ jmespath = "^1.0.1" mistune = "0.8.4" numpy = "^1.26.4" ordered-set = "^4.1.0" -phonenumbers = "^8.13.43" +phonenumbers = "^8.13.52" pycparser = "^2.22" python-json-logger = "^2.0.7" redis = "^5.0.8" diff --git a/tests/app/main/views/test_index.py b/tests/app/main/views/test_index.py index 3a4c281b94..db166d21ed 100644 --- a/tests/app/main/views/test_index.py +++ b/tests/app/main/views/test_index.py @@ -2,7 +2,7 @@ import pytest from bs4 import BeautifulSoup -from flask import current_app, url_for +from flask import url_for from freezegun import freeze_time from tests.conftest import SERVICE_ONE_ID, normalize_spaces @@ -83,8 +83,6 @@ def test_hiding_pages_from_search_engines( [ "privacy", "pricing", - "roadmap", - "features", "documentation", "best_practices", "clear_goals", @@ -93,9 +91,7 @@ def test_hiding_pages_from_search_engines( "write_for_action", "multiple_languages", "benchmark_performance", - "security", "message_status", - "features_sms", "how_to_pay", "get_started", "guidance_index", @@ -108,54 +104,33 @@ def test_hiding_pages_from_search_engines( def test_static_pages(client_request, mock_get_organization_by_domain, view, mocker): mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") - # Function to check if a view is feature-flagged and should return 404 when disabled - def is_feature_flagged(view): - feature_flagged_views = [ - "best_practices", - "clear_goals", - "rules_and_regulations", - "establish_trust", - "write_for_action", - "multiple_languages", - "benchmark_performance", - "guidance_index", - ] - return ( - not current_app.config["FEATURE_BEST_PRACTICES_ENABLED"] - and view in feature_flagged_views - ) - request = partial(client_request.get, "main.{}".format(view)) - # If the guidance feature is disabled, expect a 404 for feature-flagged views - if is_feature_flagged(view): - page = request(_expected_status=404) - else: - # Check the page loads when user is signed in - page = request() - assert page.select_one("meta[name=description]") - - # Check it still works when they don’t have a recent service - with client_request.session_transaction() as session: - session["service_id"] = None - request() - - # Check it redirects to the login screen when they sign out - client_request.logout() - with client_request.session_transaction() as session: - session["service_id"] = None - session["user_id"] = None - request( - _expected_status=302, - _expected_redirect="/sign-in?next={}".format( - url_for("main.{}".format(view)) - ), - ) + # Assert the page loads successfully + page = request(_expected_status=200) + assert page.select_one("meta[name=description]") + # Check the behavior when no recent service is set + with client_request.session_transaction() as session: + session["service_id"] = None + request() -def test_guidance_pages_link_to_service_pages_when_signed_in(client_request, mocker): + # Check redirection to login screen when signed out + client_request.logout() + with client_request.session_transaction() as session: + session["service_id"] = None + session["user_id"] = None + request( + _expected_status=302, + _expected_redirect="/sign-in?next={}".format( + url_for("main.{}".format(view)) + ), + ) + +def test_guidance_pages_link_to_service_pages_when_signed_in(client_request, mocker): mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") + request = partial(client_request.get, "main.edit_and_format_messages") selector = ".list-number li a" @@ -177,18 +152,13 @@ def test_guidance_pages_link_to_service_pages_when_signed_in(client_request, moc with client_request.session_transaction() as session: session["service_id"] = None session["user_id"] = None - page = request(_expected_status=302) - assert not page.select_one(selector) + request(_expected_status=302) @pytest.mark.parametrize( ("view", "expected_view"), [ - ("information_risk_management", "security"), ("old_integration_testing", "integration_testing"), - ("old_roadmap", "roadmap"), - ("information_security", "using_notify"), - ("old_using_notify", "using_notify"), ("delivery_and_failure", "message_status"), ("callbacks", "documentation"), ], @@ -206,10 +176,6 @@ def test_old_static_pages_redirect(client_request, view, expected_view, mocker): ) -def test_old_using_notify_page(client_request): - client_request.get("main.using_notify", _expected_status=410) - - def test_css_is_served_from_correct_path(client_request): page = client_request.get("main.documentation") # easy static page diff --git a/tests/app/main/views/test_register.py b/tests/app/main/views/test_register.py index b3d70deb57..952aa82114 100644 --- a/tests/app/main/views/test_register.py +++ b/tests/app/main/views/test_register.py @@ -145,10 +145,9 @@ def test_should_return_200_when_email_is_not_gov_uk( ) assert ( - "Enter a public sector email address or find out who can use Notify" + "Enter a public sector email address." in normalize_spaces(page.select_one(".usa-error-message").text) ) - assert page.select_one(".usa-error-message a")["href"] == url_for("main.features") @pytest.mark.parametrize( diff --git a/tests/app/main/views/test_user_profile.py b/tests/app/main/views/test_user_profile.py index 4fd2004cdf..0d71b07360 100644 --- a/tests/app/main/views/test_user_profile.py +++ b/tests/app/main/views/test_user_profile.py @@ -84,7 +84,7 @@ def test_should_redirect_after_email_change( [ ( "me@example.com", - "Enter a public sector email address or find out who can use Notify", + "Enter a public sector email address.", ), ( "not_valid", diff --git a/tests/app/test_navigation.py b/tests/app/test_navigation.py index 0d75e524f4..ed4d66182b 100644 --- a/tests/app/test_navigation.py +++ b/tests/app/test_navigation.py @@ -19,6 +19,7 @@ { "about_notify", "about_security", + "acceptable_use_policy", "accept_invite", "accept_org_invite", "accessibility_statement", @@ -94,8 +95,6 @@ "email_not_received", "error", "establish_trust", - "features", - "features_sms", "find_services_by_name", "find_users_by_email", "forgot_password", @@ -140,7 +139,6 @@ "notifications_sent_by_service", "old_guest_list", "old_integration_testing", - "old_roadmap", "old_service_dashboard", "old_using_notify", "organization_billing", @@ -169,9 +167,7 @@ "resume_service", "revalidate_email_sent", "revoke_api_key", - "roadmap", "rules_and_regulations", - "security", "security_policy", "send_files_by_email", "send_files_by_email_contact_details", @@ -217,6 +213,7 @@ "sign_in", "sign_out", "start_job", + "studio", "support", "suspend_service", "template_history", @@ -246,7 +243,6 @@ "user_profile_name", "user_profile_password", "user_profile_preferred_timezone", - "using_notify", "verify", "verify_email", "view_job", diff --git a/tests/end_to_end/test_best_practices_content_pages.py b/tests/end_to_end/test_best_practices_content_pages.py deleted file mode 100644 index 5a75f96941..0000000000 --- a/tests/end_to_end/test_best_practices_content_pages.py +++ /dev/null @@ -1,72 +0,0 @@ -import os -import re - -from playwright.sync_api import expect - -from tests.end_to_end.conftest import check_axe_report - -E2E_TEST_URI = os.getenv("NOTIFY_E2E_TEST_URI") - - -def test_best_practices_side_menu(authenticated_page): - page = authenticated_page - - page.goto(f"{E2E_TEST_URI}") - - page.wait_for_load_state("domcontentloaded") - check_axe_report(page) - - response = page.request.get(f"{E2E_TEST_URI}/test/feature-flags") - feature_flags = response.json() - feature_best_practices_enabled = feature_flags.get("FEATURE_BEST_PRACTICES_ENABLED") - - if feature_best_practices_enabled: - page.get_by_role("link", name="Best Practices").click() - expect(page).to_have_title(re.compile("Best Practice")) - - page.get_by_role("link", name="Clear goals", exact=True).click() - expect(page).to_have_title(re.compile("Establish clear goals")) - - page.get_by_role("link", name="Rules and regulations").click() - expect(page).to_have_title(re.compile("Rules and regulations")) - - page.get_by_role("link", name="Establish trust").click() - expect(page).to_have_title(re.compile("Establish trust")) - - page.get_by_role("link", name="Write for action").click() - expect(page).to_have_title(re.compile("Write texts that provoke")) - - page.get_by_role("link", name="Multiple languages").click() - expect(page).to_have_title(re.compile("Text in multiple languages")) - - page.get_by_role("link", name="Benchmark performance").click() - expect(page).to_have_title(re.compile("Measuring performance with")) - - parent_link = page.get_by_role("link", name="Establish trust") - parent_link.hover() - - submenu_item = page.get_by_role("link", name=re.compile("Get the word out")) - submenu_item.click() - - expect(page).to_have_url(re.compile(r"#get-the-word-out")) - - anchor_target = page.locator("#get-the-word-out") - expect(anchor_target).to_be_visible() - anchor_target.click() - - -def test_breadcrumbs_best_practices(authenticated_page): - page = authenticated_page - - page.goto(f"{E2E_TEST_URI}") - - page.wait_for_load_state("domcontentloaded") - check_axe_report(page) - - response = page.request.get(f"{E2E_TEST_URI}/test/feature-flags") - feature_flags = response.json() - feature_best_practices_enabled = feature_flags.get("FEATURE_BEST_PRACTICES_ENABLED") - - if feature_best_practices_enabled: - page.get_by_role("link", name="Clear goals", exact=True).click() - page.locator("ol").get_by_role("link", name="Best Practices").click() diff --git a/urls.js b/urls.js index bd693cc902..767c8f0fdf 100644 --- a/urls.js +++ b/urls.js @@ -8,30 +8,48 @@ const sublinks = [ { label: 'Trial Mode', path: '/using-notify/trial-mode' }, { label: 'Pricing', path: '/using-notify/pricing' }, { label: 'Delivery Status', path: '/using-notify/delivery-status' }, - { label: 'Guidance', path: '/guides/using-notify/guidance' }, - { label: 'Features', path: '/features' }, - { label: 'Roadmap', path: '/features/roadmap' }, - { label: 'Security', path: '/features/security' }, + { label: 'Guidance', path: '/using-notify/guidance' }, { label: 'Support', path: '/support' }, - { label: 'Best Practices', path: '/guides/best-practices' }, - { label: 'Clear Goals', path: '/guides/clear-goals' }, + { label: 'Best Practices', path: '/using-notify/best-practices' }, + { label: 'Clear Goals', path: '/using-notify/best-practices/clear-goals' }, { label: 'Rules And Regulations', - path: '/guides/rules-and-regulations', + path: '/using-notify/best-practices//rules-and-regulations', }, - { label: 'Establish Trust', path: '/guides/establish-trust' }, + { label: 'Establish Trust', path: '/using-notify/best-practices//establish-trust' }, { label: 'Write For Action', - path: '/guides/write-for-action', + path: '/using-notify/best-practices//write-for-action', }, { label: 'Multiple Languages', - path: '/guides/multiple-languages', + path: '/using-notify/best-practices//multiple-languages', }, { label: 'Benchmark Performance', - path: '/guides/benchmark-performance', + path: '/using-notify/best-practices//benchmark-performance', }, + { + label: 'About', + path: '/about', + }, + { + label: 'Why Text Messaging', + path: '/about/why-text-messaging', + }, + { + label: 'Security', + path: '/about/security', + }, + { + label: 'Join Notify', + path: '/join-notify', + }, + { + label: 'Contact', + path: '/contact', + }, + // Add more links here as needed ];