diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index c561abf19b9f..d2cdabc2d22b 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -15,3 +15,11 @@ Within Markdown files, with the exception of the `title` field in the metadata a | `{% data variables.code-scanning.codeql_workflow %}` | CodeQL analysis workflow | data/variables/code-scanning.yml | There are many more variables. These are stored in various YAML files within the `data/variables` directory. + +### Links to other articles + +`[AUTOTITLE]` is the correct way to specify the title of a linked article, when that article is another page on the docs.github.com site. Do not suggest replacing the placeholder link text `[AUTOTITLE]` with the actual page title or using the `{% link %}` Liquid tag. + +### Creating a pull request + +When creating a pull request as a result of a request to do so in Copilot Chat, the first line of the PR description should always be the following (in italics): `_This pull request was created as a result of the following prompt in Copilot Chat._` Then, within a collapsed section, quote the original prompt from Copilot Chat. diff --git a/content/admin/configuring-settings/configuring-user-applications-for-your-enterprise/configuring-web-commit-signing.md b/content/admin/configuring-settings/configuring-user-applications-for-your-enterprise/configuring-web-commit-signing.md index 5b9767667278..6036c70c0504 100644 --- a/content/admin/configuring-settings/configuring-user-applications-for-your-enterprise/configuring-web-commit-signing.md +++ b/content/admin/configuring-settings/configuring-user-applications-for-your-enterprise/configuring-web-commit-signing.md @@ -23,6 +23,18 @@ If you enable web commit signing, {% data variables.product.prodname_ghe_server You can enable web commit signing, rotate the private key used for web commit signing, and disable web commit signing. +{% ifversion ghes > 3.16 %} + +### About persistent commit signature verification + +Persistent commit signature verification is related but separate from web commit signing. This feature ensures that the verified status of commits is retained, even if signing keys are changed or revoked. + +Persistent commit signature verification helps maintain long-term integrity and trust in your repository’s commit history. However, you may choose to disable it in environments where minimizing disk usage is a priority, especially for large installations with a high number of verified commits. + +For information about disabling persistent commit signature verification, see [AUTOTITLE](/admin/configuring-settings/configuring-user-applications-for-your-enterprise/disabling-persistent-commit-verification). + +{% endif %} + ## Enabling web commit signing {% data reusables.enterprise_site_admin_settings.create-pgp-key-web-commit-signing %} diff --git a/content/admin/configuring-settings/configuring-user-applications-for-your-enterprise/disabling-persistent-commit-verification.md b/content/admin/configuring-settings/configuring-user-applications-for-your-enterprise/disabling-persistent-commit-verification.md new file mode 100644 index 000000000000..8da60e884d33 --- /dev/null +++ b/content/admin/configuring-settings/configuring-user-applications-for-your-enterprise/disabling-persistent-commit-verification.md @@ -0,0 +1,55 @@ +--- +title: Disabling persistent commit verification +shortTitle: Disable persistent commit verification +intro: 'You can disable persistent commit verification on {% data variables.product.prodname_ghe_server %} to reduce disk usage.' +versions: + ghes: '>=3.17' +type: how_to +topics: + - Access management + - Enterprise + - Fundamentals + - Identity + - Security +permissions: 'Site administrators' +--- + +## About persistent commit verification + +When persistent commit verification is enabled, {% data variables.product.prodname_ghe_server %} stores a verification record alongside each commit when its signature is verified. This record ensures that verified commits maintain their verification status even if signing keys are later rotated, expired, or revoked. For more information about persistent commit verification, see [AUTOTITLE](/authentication/managing-commit-signature-verification/about-commit-signature-verification#persistent-commit-signature-verification). + +By default, persistent commit verification is enabled on {% data variables.product.prodname_ghe_server %} 3.17 and later. + +Each verified commit requires approximately 80 bytes of storage. For large installations with a large number of verified commits (e.g., hundreds of thousands or more), you may want to disable this feature to limit data growth. + +## Disabling persistent commit verification + +You can disable persistent commit verification for {% data variables.location.product_location %}. + +1. In the administrative shell, run the following command. + + ```bash copy + ghe-config app.persist-commit-signature-verification.enabled false + ``` + +1. Apply the configuration. + + ```bash copy + ghe-config-apply + ``` + +## Enabling persistent commit verification + +If you previously disabled persistent commit verification, you can re-enable it. + +1. In the administrative shell, run the following command. + + ```bash copy + ghe-config app.persist-commit-signature-verification.enabled true + ``` + +1. Apply the configuration. + + ```bash copy + ghe-config-apply + ``` diff --git a/content/admin/configuring-settings/configuring-user-applications-for-your-enterprise/index.md b/content/admin/configuring-settings/configuring-user-applications-for-your-enterprise/index.md index 2534d5fef3be..97108ec71bfd 100644 --- a/content/admin/configuring-settings/configuring-user-applications-for-your-enterprise/index.md +++ b/content/admin/configuring-settings/configuring-user-applications-for-your-enterprise/index.md @@ -16,6 +16,7 @@ children: - /configuring-interactive-maps - /managing-github-mobile-for-your-enterprise - /verifying-or-approving-a-domain-for-your-enterprise + - /disabling-persistent-commit-verification redirect_from: - /admin/configuration/configuring-user-applications-for-your-enterprise --- diff --git a/content/admin/managing-iam/provisioning-user-accounts-with-scim/configuring-scim-provisioning-with-okta.md b/content/admin/managing-iam/provisioning-user-accounts-with-scim/configuring-scim-provisioning-with-okta.md index 5890a7681df3..578abab86e35 100644 --- a/content/admin/managing-iam/provisioning-user-accounts-with-scim/configuring-scim-provisioning-with-okta.md +++ b/content/admin/managing-iam/provisioning-user-accounts-with-scim/configuring-scim-provisioning-with-okta.md @@ -120,7 +120,16 @@ Before starting this section, ensure you have followed steps **1 to 4** in [AUTO 1. Click **Configure API integration**. 1. In the "API Token" field, enter the {% data variables.product.pat_v1 %} belonging to the setup user. - {% data reusables.scim.import-groups-unsupported %} + {% data reusables.scim.import-groups-unsupported %} + + {% ifversion ghec %} + + > [!IMPORTANT] + > For an enterprise on {% data variables.enterprise.data_residency %} (GHE.com), please enter the following URL in the **Base URL** field: {% raw %}`https://api.{subdomain}.ghe.com/scim/v2/enterprises/{subdomain}`{% endraw %} (ensuring to replace {% raw %}`{subdomain}`{% endraw %} with your enterprise's subdomain). + > + > **For example**: if your enterprise's subdomain is {% raw %}`acme`{% endraw %}, the base URL would be {% raw %}`https://api.acme.ghe.com/scim/v2/enterprises/acme`{% endraw %}. + + {% endif %} 1. Click **Test API Credentials**. If the test is successful, a verification message will appear at the top of the screen. 1. To save the token, click **Save**. diff --git a/content/admin/managing-iam/understanding-iam-for-enterprises/getting-started-with-enterprise-managed-users.md b/content/admin/managing-iam/understanding-iam-for-enterprises/getting-started-with-enterprise-managed-users.md index 517d4d6dacd6..70b65a0ee210 100644 --- a/content/admin/managing-iam/understanding-iam-for-enterprises/getting-started-with-enterprise-managed-users.md +++ b/content/admin/managing-iam/understanding-iam-for-enterprises/getting-started-with-enterprise-managed-users.md @@ -39,7 +39,10 @@ Using an **incognito or private browsing window**: 1. Enable two-factor authentication (2FA), and save the recovery codes. See [AUTOTITLE](/authentication/securing-your-account-with-two-factor-authentication-2fa/configuring-two-factor-authentication). > [!WARNING] - > All subsequent login attempts for the setup user account will require a successful 2FA challenge response or the use of an enterprise recovery code to complete authentication. To avoid being locked out of your account, after enabling single sign-on, save your enterprise recovery codes. See [AUTOTITLE](/admin/managing-iam/managing-recovery-codes-for-your-enterprise/downloading-your-enterprise-accounts-single-sign-on-recovery-codes#downloading-codes-for-an-enterprise-with-enterprise-managed-users). + > All subsequent login attempts for the setup user account will require a successful 2FA challenge response. + + > [!IMPORTANT] + > If the enterprise account has enabled single sign-on and the setup user hasn’t enabled 2FA, they must use an enterprise recovery code to authenticate. To avoid being locked out of your account, after enabling single sign-on, save your enterprise recovery codes. For more information, see [AUTOTITLE](/admin/managing-iam/managing-recovery-codes-for-your-enterprise/downloading-your-enterprise-accounts-single-sign-on-recovery-codes#downloading-codes-for-an-enterprise-with-enterprise-managed-users) and the related [changelog in our {% data variables.product.prodname_blog %}](https://github.blog/changelog/2025-01-17-setup-user-for-emu-enterprises-requires-2fa-or-use-of-a-recovery-code/). {% data reusables.enterprise-accounts.emu-password-reset-session %} diff --git a/content/admin/monitoring-and-managing-your-instance/monitoring-your-instance/exporting-and-scraping-prometheus-metrics.md b/content/admin/monitoring-and-managing-your-instance/monitoring-your-instance/exporting-and-scraping-prometheus-metrics.md index 1733b97edda9..b5a7ab210771 100644 --- a/content/admin/monitoring-and-managing-your-instance/monitoring-your-instance/exporting-and-scraping-prometheus-metrics.md +++ b/content/admin/monitoring-and-managing-your-instance/monitoring-your-instance/exporting-and-scraping-prometheus-metrics.md @@ -53,7 +53,7 @@ curl -L -H "Content-Type: application/json" -X PUT -u "api_key:xxxxxxx" https:// To verify that the Prometheus metrics exporter is enabled, use `curl` to query the `/metrics` endpoint on port 9103. For more information about the administrative ports, see [AUTOTITLE](/admin/configuring-settings/configuring-network-settings/network-ports#administrative-ports). ```shell -curl localhost:9103/metrics +curl 127.0.0.1:9103/metrics ``` If successful, the response will include metrics with the `collectd_` prefix. diff --git a/content/admin/upgrading-your-instance/preparing-to-upgrade/overview-of-the-upgrade-process.md b/content/admin/upgrading-your-instance/preparing-to-upgrade/overview-of-the-upgrade-process.md index 620fdd2d62a4..29d21889f203 100644 --- a/content/admin/upgrading-your-instance/preparing-to-upgrade/overview-of-the-upgrade-process.md +++ b/content/admin/upgrading-your-instance/preparing-to-upgrade/overview-of-the-upgrade-process.md @@ -80,7 +80,7 @@ Check if you need to upgrade the following applications: > [!NOTE] > Hotpatches require a configuration run, which can cause a brief period of errors or unresponsiveness for some or all services on {% data variables.location.product_location %}. You are not required to enable maintenance mode during installation of a hotpatch, but doing so will guarantee that users see a maintenance page instead of errors or timeouts. See [AUTOTITLE](/admin/configuration/configuring-your-enterprise/enabling-and-scheduling-maintenance-mode). * Patch releases using an upgrade package typically require less than five minutes of downtime. - * Upgrading to a new feature release that include data migrations may cause a few hours of downtime, depending on storage performance and the amount of data that is migrated. During this time none of your users will be able to use the enterprise. + * Upgrading to a new feature release that includes data migrations may cause a few hours of downtime, depending on storage performance and the amount of data that is migrated. During this time none of your users will be able to use the enterprise.{% ifversion ghes > 3.16 %} You may notice that upgrades to a new feature release take less time. This is because selective database transitions will now run concurrently, with the number of concurrent workers defaulting to the number of CPU cores, up to a maximum of 16.{% endif %} ## Communicating your upgrade diff --git a/content/authentication/managing-commit-signature-verification/about-commit-signature-verification.md b/content/authentication/managing-commit-signature-verification/about-commit-signature-verification.md index 837f57a3631a..0578ba2d648f 100644 --- a/content/authentication/managing-commit-signature-verification/about-commit-signature-verification.md +++ b/content/authentication/managing-commit-signature-verification/about-commit-signature-verification.md @@ -42,6 +42,10 @@ Signing commits differs from signing off on a commit. For more information about | **Unverified** | The commit is signed but the signature could not be verified. | No verification status | The commit is not signed. +{% endif %} + +{% ifversion fpt or ghec or ghes > 3.16 %} + ### Persistent commit signature verification Regardless of the signature choice - GPG, SSH, or S/MIME - once a commit signature is verified, it remains verified within its repository's network. See [AUTOTITLE](/repositories/viewing-activity-and-data-for-your-repository/understanding-connections-between-repositories). @@ -52,6 +56,12 @@ The verification record includes a timestamp marking when the verification was c Persistent commit signature verification applies to new commits pushed to {% data variables.product.github %}. For any commits that predate this feature, a persistent record will be created the next time the commit's signature is verified on {% data variables.product.github %}, helping ensure that verified statuses remain stable and reliable across the repository's history. +{% ifversion ghes %} + +For information about disabling persistent commit signature verification, see [AUTOTITLE](/admin/configuring-settings/configuring-user-applications-for-your-enterprise/disabling-persistent-commit-verification). + +{% endif %} + #### Records persist even after revocation and expiration Persistent commit signature verification reflects the verified state of a commit at the time of verification. This means that if a signing key is later revoked, expired, or otherwise altered, previously verified commits retain their verified status based on the record created during the initial verification. {% data variables.product.github %} will not re-verify previously signed commits or retroactively adjust their verification status in response to changes in the key's state. Organizations may need to manage key states directly to align with their security policies, especially if frequent key rotation or revocation is planned. diff --git a/content/billing/managing-billing-for-your-products/managing-billing-for-github-advanced-security/migrating-from-ghas-to-cs-and-sp.md b/content/billing/managing-billing-for-your-products/managing-billing-for-github-advanced-security/migrating-from-ghas-to-cs-and-sp.md index 532c57ebb635..134acd099490 100644 --- a/content/billing/managing-billing-for-your-products/managing-billing-for-github-advanced-security/migrating-from-ghas-to-cs-and-sp.md +++ b/content/billing/managing-billing-for-your-products/managing-billing-for-github-advanced-security/migrating-from-ghas-to-cs-and-sp.md @@ -18,13 +18,11 @@ shortTitle: Migrating to new GHAS SKUs ## New SKUs for {% data variables.product.prodname_AS %} features - + - +{% data variables.product.prodname_AS %} features are also available under two separate stock keeping units (SKUs) for {% data variables.product.prodname_team %} and {% data variables.product.prodname_ghe_cloud %} users. {% data variables.product.prodname_ghe_server %} users can use the two new SKUs when upgrading to version 3.17. -From April 1, 2025, {% data variables.product.prodname_AS %} features are also available under two separate stock keeping units (SKUs) for {% data variables.product.prodname_team %} and {% data variables.product.prodname_ghe_cloud %} users. {% data variables.product.prodname_ghe_server %} users can use the two new SKUs when upgrading to version 3.17. - - + {% data reusables.advanced-security.ghas-products-bullets %} diff --git a/content/code-security/dependabot/working-with-dependabot/dependabot-options-reference.md b/content/code-security/dependabot/working-with-dependabot/dependabot-options-reference.md index 499468c2269b..88d7b08d6dec 100644 --- a/content/code-security/dependabot/working-with-dependabot/dependabot-options-reference.md +++ b/content/code-security/dependabot/working-with-dependabot/dependabot-options-reference.md @@ -395,7 +395,7 @@ Package manager | YAML value | Supported versions | | pip| `pip` | v21.1.2 | | pip-compile | `pip` | 6.1.0 | | pipenv | `pip` | <= 2021-05-29 | -| pnpm | `npm` | v7, v8
v9 (version updates only) | +| pnpm | `npm` | v7, v8
v9, v10 (version updates only) | | poetry | `pip` | v2 | | pub | `pub` | v2 | | Swift | `swift` | v5 | diff --git a/content/code-security/secret-scanning/introduction/supported-secret-scanning-patterns.md b/content/code-security/secret-scanning/introduction/supported-secret-scanning-patterns.md index d8279b27fb34..76114f221953 100644 --- a/content/code-security/secret-scanning/introduction/supported-secret-scanning-patterns.md +++ b/content/code-security/secret-scanning/introduction/supported-secret-scanning-patterns.md @@ -51,9 +51,12 @@ This table lists the secrets supported by {% data variables.product.prodname_sec {% data reusables.secret-scanning.non-provider-patterns-beta %} +{% ifversion secret-scanning-ai-generic-secret-detection %} +In addition to these generic non-provider patterns, {% data variables.product.prodname_secret_scanning %} uses {% data variables.product.prodname_copilot_short %} to detect generic passwords. For more information, see [AUTOTITLE](/code-security/secret-scanning/copilot-secret-scanning/responsible-ai-generic-secrets). +{% endif %} + | Provider | Token | |----------|:--------------------| -| Generic | password | | Generic | http_basic_authentication_header | | Generic | http_bearer_authentication_header | | Generic | mongodb_connection_string | diff --git a/content/code-security/securing-your-organization/enabling-security-features-in-your-organization/applying-the-github-recommended-security-configuration-in-your-organization.md b/content/code-security/securing-your-organization/enabling-security-features-in-your-organization/applying-the-github-recommended-security-configuration-in-your-organization.md index aa43d960fc1f..ddf0d502ed6b 100644 --- a/content/code-security/securing-your-organization/enabling-security-features-in-your-organization/applying-the-github-recommended-security-configuration-in-your-organization.md +++ b/content/code-security/securing-your-organization/enabling-security-features-in-your-organization/applying-the-github-recommended-security-configuration-in-your-organization.md @@ -17,7 +17,7 @@ topics: The {% data variables.product.prodname_github_security_configuration %} is a collection of enablement settings for {% data variables.product.company_short %}'s security features that is created and maintained by subject matter experts at {% data variables.product.company_short %}. The {% data variables.product.prodname_github_security_configuration %} is designed to successfully reduce the security risks for low- and high-impact repositories. We recommend you apply this configuration to all the repositories in your organization. > [!NOTE] -> The {% data variables.product.prodname_github_security_configuration %} includes {% data variables.product.prodname_GH_code_security %} and {% data variables.product.prodname_GH_secret_protection %} features. Applying the configuration to repositories in your organization will incur usage costs or require licenses. +> The {% data variables.product.prodname_github_security_configuration %} includes {% data variables.product.prodname_GH_code_security %} and {% data variables.product.prodname_GH_secret_protection %} features. Applying the configuration to private and internal repositories in your organization will incur usage costs or require licenses. ## Applying the {% data variables.product.prodname_github_security_configuration %} to all repositories in your organization diff --git a/content/code-security/securing-your-organization/enabling-security-features-in-your-organization/giving-org-access-private-registries.md b/content/code-security/securing-your-organization/enabling-security-features-in-your-organization/giving-org-access-private-registries.md index ff17b26c4807..08442226faf6 100644 --- a/content/code-security/securing-your-organization/enabling-security-features-in-your-organization/giving-org-access-private-registries.md +++ b/content/code-security/securing-your-organization/enabling-security-features-in-your-organization/giving-org-access-private-registries.md @@ -17,12 +17,12 @@ When a repository uses code stored in a private registry, some security features ## {% data variables.product.prodname_code_scanning_caps %} default setup access to private registries -{% data variables.product.prodname_code_scanning_caps %} default setup analyzes {% data variables.code-scanning.no_build_support %} code without building it. If you do not define access to the private registries your organization uses, then {% data variables.product.prodname_code_scanning %} will only gather necessary data from dependencies available in public registries. Most times, this is enough for surfacing most of the vulnerabilities. However, in some cases the lack of access can lead to false negative results, that is, {% data variables.product.prodname_code_scanning %} is unable to detect a vulnerability in the code because it does not have all the information it needs to analyze the code. For example, some of the data flow paths may not be detected because steps are defined in dependencies that are not accessible and {% data variables.product.prodname_code_scanning %} does not know how to interpret them. +If you do not define access to the private registries your organization uses, then {% data variables.product.prodname_code_scanning %} will only gather necessary data from dependencies available in public registries. Most times, this is enough for surfacing most of the vulnerabilities. However, in some cases the lack of access can lead to false negative results, that is, {% data variables.product.prodname_code_scanning %} is unable to detect a vulnerability in the code because it does not have all the information it needs to analyze the code. For example, some of the data flow paths may not be detected because steps are defined in dependencies that are not accessible and {% data variables.product.prodname_code_scanning %} does not know how to interpret them. When you configure access to the private registries used in your organization, {% data variables.product.prodname_code_scanning %} has access to all the information it needs and is much less likely to miss a vulnerability. > [!TIP] -> You can define one private Maven registry and one private NuGet feed for each organization. If the codebases in your organization use more than one registry or feed, you should define access to the most important registry for the codebases in that organization. +> You can define one of each type of registry for each organization. If the codebases in your organization use more than one registry of a given type, you should define access to the most important registry for the codebases in that organization. ### Defining registry access for {% data variables.product.prodname_code_scanning %} default setup diff --git a/content/code-security/securing-your-organization/introduction-to-securing-your-organization-at-scale/choosing-a-security-configuration-for-your-repositories.md b/content/code-security/securing-your-organization/introduction-to-securing-your-organization-at-scale/choosing-a-security-configuration-for-your-repositories.md index c2d4ab79da42..0711ce802aa5 100644 --- a/content/code-security/securing-your-organization/introduction-to-securing-your-organization-at-scale/choosing-a-security-configuration-for-your-repositories.md +++ b/content/code-security/securing-your-organization/introduction-to-securing-your-organization-at-scale/choosing-a-security-configuration-for-your-repositories.md @@ -31,7 +31,7 @@ The {% data variables.product.prodname_github_security_configuration %} offers a * It is the quickest {% data variables.product.prodname_security_configuration %} to apply to all repositories in your organization. * It is designed to effectively secure both low- and high-impact repositories. -The {% data variables.product.prodname_github_security_configuration %} includes {% data variables.product.prodname_GH_code_security %} and {% data variables.product.prodname_GH_secret_protection %} features. Applying the configuration to repositories in your organization will incur usage costs or require licenses. +The {% data variables.product.prodname_github_security_configuration %} includes {% data variables.product.prodname_GH_code_security %} and {% data variables.product.prodname_GH_secret_protection %} features. Applying the configuration to private and internal repositories in your organization will incur usage costs or require licenses. To start securing repositories in your organization with the {% data variables.product.prodname_github_security_configuration %}, see [AUTOTITLE](/code-security/securing-your-organization/enabling-security-features-in-your-organization/applying-the-github-recommended-security-configuration-in-your-organization). diff --git a/content/education/manage-coursework-with-github-classroom/teach-with-github-classroom/connect-a-learning-management-system-course-to-a-classroom.md b/content/education/manage-coursework-with-github-classroom/teach-with-github-classroom/connect-a-learning-management-system-course-to-a-classroom.md index cb71a2559493..de4d4860afb3 100644 --- a/content/education/manage-coursework-with-github-classroom/teach-with-github-classroom/connect-a-learning-management-system-course-to-a-classroom.md +++ b/content/education/manage-coursework-with-github-classroom/teach-with-github-classroom/connect-a-learning-management-system-course-to-a-classroom.md @@ -42,7 +42,7 @@ An administrator needs to register your LMS instance with classroom before you c 1. Select the Blackboard course or organization to integrate with {% data variables.product.prodname_classroom %}. 1. In the right sidebar on the course page, click **Books & Tools**, then click **GitHub Classroom**. Note that the name may be different if your LMS administrator named it something else when registering your LMS. 1. Click **{% data variables.product.prodname_classroom %}**. -1. In {% data variables.product.prodname_classroom %}, select a classroom to link with your LMS course. +1. In {% data variables.product.prodname_classroom %}, select a classroom to link with your LMS course. > [!NOTE] This step might give you an error message, "Unable to launch link. The Tool Provider has been disabled by the System Administrator: {% data variables.product.prodname_classroom %}". To resolve this error, ensure that the status of the “{% data variables.product.prodname_classroom %}” tool is set to `Approved`. In the "Admin Panel," click **LTI Tool Providers**. Hover on the name next to {% data variables.product.prodname_classroom %} and click **Approve**. diff --git a/content/education/manage-coursework-with-github-classroom/teach-with-github-classroom/register-a-learning-management-system-with-github-classroom.md b/content/education/manage-coursework-with-github-classroom/teach-with-github-classroom/register-a-learning-management-system-with-github-classroom.md index 3776bbd78067..39d289d3a3aa 100644 --- a/content/education/manage-coursework-with-github-classroom/teach-with-github-classroom/register-a-learning-management-system-with-github-classroom.md +++ b/content/education/manage-coursework-with-github-classroom/teach-with-github-classroom/register-a-learning-management-system-with-github-classroom.md @@ -68,8 +68,8 @@ You can register your Blackboard installation with {% data variables.product.pro 1. Verify that **Tool Status** is `Approved`. 1. Verify that **User Fields to be Sent** flags are enabled for "Role in Course", "Name", "Email Address". 1. Verify that **Allow mark service access** radio button is set to "No". To enable this option, navigate to the LTI Tool Providers in the Admin Panel: - - Select Manage Global Properties - - Under Creation of Tool Provider Links, select radio button “Allow links to any tool provider, but require approval for each new provider” + * Select Manage Global Properties + * Under Creation of Tool Provider Links, select radio button “Allow links to any tool provider, but require approval for each new provider” 1. Verify that **Allow Membership Service Access** radio button is set to "Yes". 1. Click **Submit**. diff --git a/content/get-started/learning-about-github/github-language-support.md b/content/get-started/learning-about-github/github-language-support.md index 52d249658d9b..e713c0654e4b 100644 --- a/content/get-started/learning-about-github/github-language-support.md +++ b/content/get-started/learning-about-github/github-language-support.md @@ -42,6 +42,7 @@ Some features are supported for additional languages or package managers. If you {% data reusables.supported-languages.typescript %} > [!NOTE] -{% ifversion fpt or ghec %}> * The language support for {% data variables.product.prodname_copilot %} varies depending on the volume and diversity of training data for that language.{% endif %} -> * The support of Gradle for the dependency graph and {% data variables.product.prodname_dependabot_alerts %} is limited to the upload of data obtained using the {% data variables.dependency-submission-api.name %}. -> * PHP, Rust, and Scala are supported for {% data variables.product.prodname_code_scanning %} by third-party actions. +> {% ifversion fpt or ghec %}The language support for {% data variables.product.prodname_copilot %} varies depending on the volume and diversity of training data for that language.{% endif %} +> The support of Gradle for the dependency graph and {% data variables.product.prodname_dependabot_alerts %} is limited to the upload of data obtained using the {% data variables.dependency-submission-api.name %}. + +[^1]: PHP, Rust, and Scala are supported for code scanning by third-party actions, but not by {% data variables.product.prodname_codeql %}. diff --git a/content/organizations/managing-peoples-access-to-your-organization-with-roles/roles-in-an-organization.md b/content/organizations/managing-peoples-access-to-your-organization-with-roles/roles-in-an-organization.md index 8cf96eb921bc..217646e1740e 100644 --- a/content/organizations/managing-peoples-access-to-your-organization-with-roles/roles-in-an-organization.md +++ b/content/organizations/managing-peoples-access-to-your-organization-with-roles/roles-in-an-organization.md @@ -94,8 +94,6 @@ Generally, the outside collaborator and repository collaborator roles are equiva * Repository collaborators cannot bypass single sign-on (SSO) requirements, because SSO is managed at the enterprise level in an {% data variables.enterprise.prodname_emu_enterprise %}. However, like outside collaborators, they do not need to provide SSO authorization of credentials for organizations where they are a collaborator. * Repository collaborators are subject to your enterprise IP allow list policy and your identity provider's conditional access policy. However, they are not subject to the organization's IP allow list policy. -{% data reusables.repositories.repository-collaborators-release-phase %} - {% endif %} #### Managing outside collaborators{% ifversion repository-collaborators %} or repository collaborators{% endif %} diff --git a/content/organizations/managing-user-access-to-your-organizations-repositories/managing-outside-collaborators/adding-outside-collaborators-to-repositories-in-your-organization.md b/content/organizations/managing-user-access-to-your-organizations-repositories/managing-outside-collaborators/adding-outside-collaborators-to-repositories-in-your-organization.md index 31239bb85a4d..a63c6642b4c2 100644 --- a/content/organizations/managing-user-access-to-your-organizations-repositories/managing-outside-collaborators/adding-outside-collaborators-to-repositories-in-your-organization.md +++ b/content/organizations/managing-user-access-to-your-organizations-repositories/managing-outside-collaborators/adding-outside-collaborators-to-repositories-in-your-organization.md @@ -28,7 +28,7 @@ permissions: People with admin access to a repository can add an outside collabo {% ifversion fpt %} Organizations that use {% data variables.product.prodname_ghe_cloud %} can restrict the ability to invite collaborators. For more information, see [AUTOTITLE](/enterprise-cloud@latest/organizations/managing-organization-settings/setting-permissions-for-adding-outside-collaborators) in the {% data variables.product.prodname_ghe_cloud %} documentation. {% else %} -An organization owner can restrict the ability to invite collaborators. For more information, see [AUTOTITLE](/organizations/managing-organization-settings/setting-permissions-for-adding-outside-collaborators). +Organization and enterprise owners can restrict the ability to invite collaborators. For more information, see [AUTOTITLE](/organizations/managing-organization-settings/setting-permissions-for-adding-outside-collaborators) and [AUTOTITLE](/admin/enforcing-policies/enforcing-policies-for-your-enterprise/enforcing-repository-management-policies-in-your-enterprise#enforcing-a-policy-for-inviting-outside-collaborators-to-repositories). {% endif %} {% ifversion ghes %} diff --git a/content/repositories/managing-your-repositorys-settings-and-features/managing-repository-settings/managing-teams-and-people-with-access-to-your-repository.md b/content/repositories/managing-your-repositorys-settings-and-features/managing-repository-settings/managing-teams-and-people-with-access-to-your-repository.md index 4312ca42b2e3..6781a9dc49f9 100644 --- a/content/repositories/managing-your-repositorys-settings-and-features/managing-repository-settings/managing-teams-and-people-with-access-to-your-repository.md +++ b/content/repositories/managing-your-repositorys-settings-and-features/managing-repository-settings/managing-teams-and-people-with-access-to-your-repository.md @@ -27,8 +27,6 @@ This overview can help you audit access to your repository, onboard or off-board If you're a member of an {% data variables.enterprise.prodname_emu_enterprise %}, you can invite a member of your enterprise to collaborate in a repository that either a user or organization owns. The invited user will only have access to the repository, even if the repository belongs to an organization. The user must be provisioned by your company's identity provider (IdP). For more information, see [AUTOTITLE](/organizations/managing-peoples-access-to-your-organization-with-roles/roles-in-an-organization#outside-collaborators-or-repository-collaborators). -{% data reusables.repositories.repository-collaborators-release-phase %} - {% endif %} For more information about repository roles, see [AUTOTITLE](/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-personal-account-settings/permission-levels-for-a-personal-account-repository) and [AUTOTITLE](/organizations/managing-user-access-to-your-organizations-repositories/managing-repository-roles/repository-roles-for-an-organization). diff --git a/data/release-notes/enterprise-server/3-17/0-rc1.yml b/data/release-notes/enterprise-server/3-17/0-rc1.yml index afa77d2ef2af..ab2b78510bab 100644 --- a/data/release-notes/enterprise-server/3-17/0-rc1.yml +++ b/data/release-notes/enterprise-server/3-17/0-rc1.yml @@ -146,7 +146,7 @@ sections: - | Verified commits are attached to persistent verification records, allowing users to identify the first actor to introduce a commit to a repository. Users can rotate, expire, or revoke their signing key without impacting existing verifications. - Verification records consume approximately 80 bytes on disk per signed commit. To limit data growth on large instances, site administrators can run `ghe-config app.persist-commit-signature-verification.enabled false` to disable persistent records. + Verification records consume approximately 80 bytes on disk per signed commit. To limit data growth on large instances, site administrators can run `ghe-config app.persist-commit-signature-verification.enabled false` to disable persistent records. See [AUTOTITLE](/admin/configuring-settings/configuring-user-applications-for-your-enterprise/disabling-persistent-commit-verification). - heading: GitHub Mobile notes: diff --git a/data/reusables/dependabot/supported-package-managers.md b/data/reusables/dependabot/supported-package-managers.md index 74bc2b9ef600..b377de497b90 100644 --- a/data/reusables/dependabot/supported-package-managers.md +++ b/data/reusables/dependabot/supported-package-managers.md @@ -29,7 +29,7 @@ npm | `npm` | v7, v8, v9 | {% octicon "check" aria-label [pip](#pip-and-pip-compile) | `pip` | v21.1.2 | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Not supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Not supported" %} | pipenv | `pip` | <= 2021-05-29 | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Not supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Not supported" %} | [pip-compile](#pip-and-pip-compile) | `pip` | 6.1.0 | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Not supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Not supported" %} | -| {% ifversion dependabot-updates-pnpmv9-support %}pnpm{% else %}[pnpm](#pnpm){% endif %} | `npm` | v7, v8, v9 | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} {% ifversion dependabot-updates-pnpmv9-support %}{% else %}(v7 and v8 only){% endif %}| {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Not supported" %} | +| {% ifversion dependabot-updates-pnpmv9-support %}pnpm{% else %}[pnpm](#pnpm){% endif %} | `npm` | v7, v8, v9, v10 | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} {% ifversion dependabot-updates-pnpmv9-support %}{% else %}(v7 and v8 only){% endif %}| {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Not supported" %} | poetry | `pip` | v1 | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Not supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Not supported" %} | [pub](#pub) | `pub` | v2 | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Not supported" %} | [Swift](#swift) | `swift` | v5 | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} (git only) | {% octicon "x" aria-label="Not supported" %} | @@ -137,7 +137,7 @@ In addition, {% data variables.product.prodname_dependabot %} supports updates t #### pnpm -pnpm is supported for {% data variables.product.prodname_dependabot_version_updates %} (on v7, v8, and v9) and {% data variables.product.prodname_dependabot_security_updates %} (on v7 and v8 only). +pnpm is supported for {% data variables.product.prodname_dependabot_version_updates %} (on v7, v8, v9, v10) and {% data variables.product.prodname_dependabot_security_updates %} (on v7 and v8 only). {% endif %} #### poetry diff --git a/data/reusables/repositories/repository-collaborators-release-phase.md b/data/reusables/repositories/repository-collaborators-release-phase.md deleted file mode 100644 index 2feeeec47374..000000000000 --- a/data/reusables/repositories/repository-collaborators-release-phase.md +++ /dev/null @@ -1 +0,0 @@ ->[!NOTE] The repository collaborator role for enterprises that use {% data variables.enterprise.prodname_managed_users %} is in {% data variables.release-phases.public_preview %} and subject to change. diff --git a/data/reusables/supported-languages/php.md b/data/reusables/supported-languages/php.md index 7c5cf6848937..74c5f624af2a 100644 --- a/data/reusables/supported-languages/php.md +++ b/data/reusables/supported-languages/php.md @@ -1 +1 @@ -| PHP {% ifversion fpt or ghec %}| {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %}
third-party | {% octicon "check" aria-label="Supported" %}
Composer | {% octicon "check" aria-label="Supported" %}
Composer | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Unsupported" %} |{% elsif ghes %}| {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %}
Composer | {% octicon "check" aria-label="Supported" %}
Composer | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Unsupported" %} |{% endif %} +| PHP {% ifversion fpt or ghec %}| {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %}
third-party [^1] | {% octicon "check" aria-label="Supported" %}
Composer | {% octicon "check" aria-label="Supported" %}
Composer | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Unsupported" %} |{% elsif ghes %}| {% octicon "check" aria-label="Supported" %}
third-party [^1] | {% octicon "check" aria-label="Supported" %}
Composer | {% octicon "check" aria-label="Supported" %}
Composer | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Unsupported" %} |{% endif %} diff --git a/data/reusables/supported-languages/rust.md b/data/reusables/supported-languages/rust.md index 91088362278f..1c3524a27de2 100644 --- a/data/reusables/supported-languages/rust.md +++ b/data/reusables/supported-languages/rust.md @@ -1 +1 @@ -| Rust {% ifversion fpt or ghec %}| {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %}
third-party | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Unsupported" %} |{% elsif ghes > 3.13 %} | {% octicon "x" aria-label="Unsupported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Unsupported" %} |{% else %} | {% octicon "x" aria-label="Unsupported" %} | {% octicon "x" aria-label="Unsupported" %} | {% octicon "x" aria-label="Unsupported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Unsupported" %} |{% endif %} +| Rust {% ifversion fpt or ghec %}| {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %}
third-party [^1] | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Unsupported" %} |{% elsif ghes > 3.13 %} | {% octicon "check" aria-label="Supported" %}
third-party [^1] | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Unsupported" %} |{% else %} | {% octicon "x" aria-label="Unsupported" %} | {% octicon "x" aria-label="Unsupported" %} | {% octicon "x" aria-label="Unsupported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Unsupported" %} |{% endif %} diff --git a/data/reusables/supported-languages/scala.md b/data/reusables/supported-languages/scala.md index 1074fb728e5b..6ddbd8506d4b 100644 --- a/data/reusables/supported-languages/scala.md +++ b/data/reusables/supported-languages/scala.md @@ -1 +1 @@ -| Scala {% ifversion fpt or ghec %}| {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Unsupported" %} | {% octicon "check" aria-label="Supported" %}
third-party | {% octicon "check" aria-label="Supported" %}
Maven | {% octicon "check" aria-label="Supported" %}
Maven, Gradle | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Unsupported" %} |{% elsif ghes %}| {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %}
Maven, Gradle | {% octicon "check" aria-label="Supported" %}
Maven, Gradle | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Unsupported" %} |{% endif %} +| Scala {% ifversion fpt or ghec %}| {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Unsupported" %} | {% octicon "check" aria-label="Supported" %}
third-party [^1] | {% octicon "check" aria-label="Supported" %}
Maven | {% octicon "check" aria-label="Supported" %}
Maven, Gradle | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Unsupported" %} |{% elsif ghes %}| {% octicon "check" aria-label="Supported" %}
third-party [^1] | {% octicon "check" aria-label="Supported" %}
Maven, Gradle | {% octicon "check" aria-label="Supported" %}
Maven, Gradle | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Unsupported" %} |{% endif %} diff --git a/data/ui.yml b/data/ui.yml index 87dd1ea68685..97704600fc80 100644 --- a/data/ui.yml +++ b/data/ui.yml @@ -66,8 +66,10 @@ search: ai_title: There was an error loading Copilot. description: You can still use this field to search our docs. cta: - heading: New! Copilot for Docs - description: Ask your question in the search bar and get help in seconds. + heading: Get quick answers! + description: Ask Copilot your question. + dismiss: Dismiss + ask_copilot: Ask Copilot old_search: description: Enter a search term to find it in the GitHub Docs. placeholder: Search GitHub Docs diff --git a/src/fixtures/fixtures/data/ui.yml b/src/fixtures/fixtures/data/ui.yml index 87dd1ea68685..97704600fc80 100644 --- a/src/fixtures/fixtures/data/ui.yml +++ b/src/fixtures/fixtures/data/ui.yml @@ -66,8 +66,10 @@ search: ai_title: There was an error loading Copilot. description: You can still use this field to search our docs. cta: - heading: New! Copilot for Docs - description: Ask your question in the search bar and get help in seconds. + heading: Get quick answers! + description: Ask Copilot your question. + dismiss: Dismiss + ask_copilot: Ask Copilot old_search: description: Enter a search term to find it in the GitHub Docs. placeholder: Search GitHub Docs diff --git a/src/frame/components/DefaultLayout.tsx b/src/frame/components/DefaultLayout.tsx index ec22f51f7f35..f3a92cac2fd0 100644 --- a/src/frame/components/DefaultLayout.tsx +++ b/src/frame/components/DefaultLayout.tsx @@ -14,6 +14,7 @@ import { Breadcrumbs } from 'src/frame/components/page-header/Breadcrumbs' import { useLanguages } from 'src/languages/components/LanguagesContext' import { ClientSideLanguageRedirect } from './ClientSideLanguageRedirect' import { DomainNameEditProvider } from 'src/links/components/useEditableDomainContext' +import { SearchOverlayContextProvider } from '@/search/components/context/SearchOverlayContext' const MINIMAL_RENDER = Boolean(JSON.parse(process.env.MINIMAL_RENDER || 'false')) @@ -76,96 +77,98 @@ export const DefaultLayout = (props: Props) => { return ( - - {error === '404' ? ( - {t('oops')} - ) : (!isHomepageVersion && page.fullTitle) || - (currentPathWithoutLanguage.includes('enterprise-server') && page.fullTitle) ? ( - {page.fullTitle} - ) : null} - - {/* For Google and Bots */} - - {page.hidden && } - {Object.values(languages) - .filter((lang) => lang.code !== router.locale) - .map((variant) => { - return ( - - ) - })} - - {/* For local site search indexing */} - {page.topics.length > 0 && } - - {/* For analytics events */} - {router.locale && } - {currentVersion && } - {currentProduct && } - {relativePath && ( - - )} - {page.type && } - {page.documentType && } - {status && } - - {/* OpenGraph data */} - {page.fullTitle && ( - <> - - - - - - - )} - {/* Twitter Meta Tags */} - - - - - {page.introPlainText && } - - - - Skip to main content - -
- -
- {isHomepageVersion ? null : } - {/* Need to set an explicit height for sticky elements since we also - set overflow to auto */} -
-
- - - - {props.children} -
-
- - - + + {error === '404' ? ( + {t('oops')} + ) : (!isHomepageVersion && page.fullTitle) || + (currentPathWithoutLanguage.includes('enterprise-server') && page.fullTitle) ? ( + {page.fullTitle} + ) : null} + + {/* For Google and Bots */} + + {page.hidden && } + {Object.values(languages) + .filter((lang) => lang.code !== router.locale) + .map((variant) => { + return ( + + ) + })} + + {/* For local site search indexing */} + {page.topics.length > 0 && } + + {/* For analytics events */} + {router.locale && } + {currentVersion && } + {currentProduct && } + {relativePath && ( + -
+ )} + {page.type && } + {page.documentType && } + {status && } + + {/* OpenGraph data */} + {page.fullTitle && ( + <> + + + + + + + )} + {/* Twitter Meta Tags */} + + + + + {page.introPlainText && } + + + + Skip to main content + +
+ +
+ {isHomepageVersion ? null : } + {/* Need to set an explicit height for sticky elements since we also + set overflow to auto */} +
+
+ + + + {props.children} +
+
+ + + +
+
-
+ ) } diff --git a/src/frame/components/page-footer/SupportSection.module.scss b/src/frame/components/page-footer/SupportSection.module.scss new file mode 100644 index 000000000000..1bb704c2bc40 --- /dev/null +++ b/src/frame/components/page-footer/SupportSection.module.scss @@ -0,0 +1,25 @@ +.supportGrid { + display: grid; + gap: var(--base-size-4); + + // Mobile is 1 column + grid-template-columns: 1fr; + grid-column-gap: 1rem; + + grid-row-gap: 2rem; +} + +// Medium is 2 columns +@media (min-width: 768px) { + .supportGrid { + grid-template-columns: repeat(2, 1fr); + grid-row-gap: 1rem; + } +} + +// Large is 4 columns +@media (min-width: 1280px) { + .supportGrid { + grid-template-columns: minmax(18rem, 1fr) repeat(3, 1fr); + } +} diff --git a/src/frame/components/page-footer/SupportSection.tsx b/src/frame/components/page-footer/SupportSection.tsx index bfaf4e2fc64b..147e000cc5be 100644 --- a/src/frame/components/page-footer/SupportSection.tsx +++ b/src/frame/components/page-footer/SupportSection.tsx @@ -7,12 +7,17 @@ import { useMainContext } from 'src/frame/components/context/MainContext' import { useVersion } from 'src/versions/components/useVersion' import { useRouter } from 'next/router' import { useTranslation } from 'src/languages/components/useTranslation' +import { AISearchCTAPopup } from '@/search/components/input/AISearchCTAPopup' +import { useSearchOverlayContext } from '@/search/components/context/SearchOverlayContext' + +import styles from './SupportSection.module.scss' export const SupportSection = () => { const { currentVersion } = useVersion() const { relativePath, enterpriseServerReleases } = useMainContext() const router = useRouter() const { t } = useTranslation('footer') + const { setIsSearchOpen } = useSearchOverlayContext() const isDeprecated = enterpriseServerReleases.isOldestReleaseDeprecated && @@ -24,47 +29,25 @@ export const SupportSection = () => { const showSurvey = !isDeprecated && !isSitePolicyDocs const showContribution = !isDeprecated && !isEarlyAccess && isEnglish const showSupport = true - const totalCols = Number(showSurvey) + Number(showContribution) + Number(showSupport) + const showCopilotCTA = !isDeprecated && !isEarlyAccess && isEnglish return (

{t('support_heading')}

-
- {showSurvey && ( -
1 && 'col-lg-6', - totalCols > 2 && 'col-xl-3', - )} - > - -
- )} - {showContribution && ( -
1 && 'col-lg-6', - totalCols > 2 && 'col-xl-4', - totalCols > 2 && showSurvey && 'offset-xl-1', - )} - > - -
+ + {/* CSS Grid container */} +
1 && 'col-lg-6', - totalCols > 2 && 'col-xl-3', - totalCols > 2 && (showSurvey || showContribution) && 'offset-xl-1', - )} - > - -
+ > + {showCopilotCTA && ( + )} + {showSurvey && } + {showContribution && } + {showSupport && }
) diff --git a/src/frame/components/page-header/Header.tsx b/src/frame/components/page-header/Header.tsx index 73ae0756f47d..9d9d29e2ff61 100644 --- a/src/frame/components/page-header/Header.tsx +++ b/src/frame/components/page-header/Header.tsx @@ -20,10 +20,10 @@ import { HeaderSearchAndWidgets } from './HeaderSearchAndWidgets' import { useInnerWindowWidth } from './hooks/useInnerWindowWidth' import { EXPERIMENTS } from '@/events/components/experiments/experiments' import { useShouldShowExperiment } from '@/events/components/experiments/useShouldShowExperiment' -import { useQueryParam } from '@/frame/components/hooks/useQueryParam' import { useMultiQueryParams } from '@/search/components/hooks/useMultiQueryParams' import { SearchOverlayContainer } from '@/search/components/input/SearchOverlayContainer' import { useCTAPopoverContext } from '@/frame/components/context/CTAContext' +import { useSearchOverlayContext } from '@/search/components/context/SearchOverlayContext' import styles from './Header.module.scss' @@ -34,10 +34,6 @@ export const Header = () => { const { currentVersion } = useVersion() const { t } = useTranslation(['header']) const isRestPage = currentProduct && currentProduct.id === 'rest' - const { queryParam: isSearchOpen, setQueryParam: setIsSearchOpen } = useQueryParam( - 'search-overlay-open', - true, - ) const { params, updateParams } = useMultiQueryParams() const [scroll, setScroll] = useState(false) const [isSidebarOpen, setIsSidebarOpen] = useState(false) @@ -52,6 +48,7 @@ export const Header = () => { const returnFocusRef = useRef(null) const searchButtonRef = useRef(null) const { initializeCTA } = useCTAPopoverContext() + const { isSearchOpen, setIsSearchOpen } = useSearchOverlayContext() const { showExperiment: showNewSearch, experimentLoading: newSearchLoading } = useShouldShowExperiment(EXPERIMENTS.ai_search_experiment) diff --git a/src/links/lib/excluded-links.yml b/src/links/lib/excluded-links.yml index 9c1f21f09859..d639bdec8b4c 100644 --- a/src/links/lib/excluded-links.yml +++ b/src/links/lib/excluded-links.yml @@ -16,6 +16,7 @@ - startsWith: https://github.com/github/docs/edit - startsWith: https://github.com/github/insights-releases/releases/latest - startsWith: https://classroom.github.com/videos +- startsWith: https://developer.anthology.com/portal # Oneoff links that link checkers think are broken but are not. - is: https://haveibeenpwned.com/ diff --git a/src/search/components/context/SearchOverlayContext.tsx b/src/search/components/context/SearchOverlayContext.tsx new file mode 100644 index 000000000000..80f0bebecd9f --- /dev/null +++ b/src/search/components/context/SearchOverlayContext.tsx @@ -0,0 +1,30 @@ +// Context to manage the state of the SearchOverlay +import { createContext, useContext, PropsWithChildren } from 'react' +import { useQueryParam } from '@/frame/components/hooks/useQueryParam' + +type SearchOverlayState = { + isSearchOpen: boolean + setIsSearchOpen: (open: boolean) => void +} + +const SearchOverlayContext = createContext(undefined) + +export function SearchOverlayContextProvider({ children }: PropsWithChildren) { + const { queryParam: isSearchOpen, setQueryParam: setIsSearchOpen } = useQueryParam( + 'search-overlay-open', + true, + ) + + return ( + + {children} + + ) +} + +export const useSearchOverlayContext = () => { + const ctx = useContext(SearchOverlayContext) + if (!ctx) + throw new Error('useSearchOverlayContext must be used inside ') + return ctx +} diff --git a/src/search/components/input/AISearchCTAPopup.tsx b/src/search/components/input/AISearchCTAPopup.tsx index de05812fce93..8ddd1a69fb1a 100644 --- a/src/search/components/input/AISearchCTAPopup.tsx +++ b/src/search/components/input/AISearchCTAPopup.tsx @@ -1,19 +1,37 @@ import { useEffect, useRef } from 'react' -import { Text, Button, Heading, Popover, useOnEscapePress } from '@primer/react' +import { Text, Button, Heading, Popover, useOnEscapePress, Box } from '@primer/react' import { focusTrap } from '@primer/behaviors' import { useTranslation } from '@/languages/components/useTranslation' import { useMaxWidthBreakpoint, useMinWidthBreakpoint } from '../hooks/useBreakpoint' +import { useCTAPopoverContext } from '@/frame/components/context/CTAContext' let previouslyFocused: HTMLElement | null = null -export function AISearchCTAPopup({ isOpen, dismiss }: { isOpen: boolean; dismiss: () => void }) { +export function AISearchCTAPopup({ + isOpen, + dismiss, + setIsSearchOpen, + isDismissible = true, +}: { + isOpen: boolean + dismiss?: () => void + setIsSearchOpen: (value: boolean) => void + isDismissible?: boolean +}) { const { t } = useTranslation('search') + const { permanentDismiss } = useCTAPopoverContext() const isLargeOrUp = useMinWidthBreakpoint('large') const isTooSmallForCTA = useMaxWidthBreakpoint('293px') let overlayRef = useRef(null) let dismissButtonRef = useRef(null) + const openSearch = () => { + setIsSearchOpen(true) + // They engaged with the CTA, so let's not show this popup for them anymore + permanentDismiss() + } + // For a11y, focus trap the CTA and allow it to be closed with Escape useEffect(() => { if (isTooSmallForCTA) { @@ -32,7 +50,9 @@ export function AISearchCTAPopup({ isOpen, dismiss }: { isOpen: boolean; dismiss if (previouslyFocused) { previouslyFocused.focus() } - dismiss() + if (dismiss) { + dismiss() + } } useOnEscapePress(onDismiss) @@ -41,6 +61,92 @@ export function AISearchCTAPopup({ isOpen, dismiss }: { isOpen: boolean; dismiss return null } + const innerContent = ( + <> + The Copilot Icon in front of an explosion of color. + + {t('search.cta.heading')} + + + {t('search.cta.description')} + + + {isDismissible ? ( + + ) : null} + + + + ) + + // If not dismissible, it's not being used as a popover + if (!isDismissible) { + return ( + + {innerContent} + + ) + } + return ( - The Copilot Icon in front of an explosion of color. - - {t('search.cta.heading')} - - - {t('search.cta.description')} - - + {innerContent} ) diff --git a/src/search/components/input/SearchBarButton.tsx b/src/search/components/input/SearchBarButton.tsx index 411f4de0d954..eef75d1c29d9 100644 --- a/src/search/components/input/SearchBarButton.tsx +++ b/src/search/components/input/SearchBarButton.tsx @@ -50,7 +50,7 @@ export function SearchBarButton({ isSearchOpen, setIsSearchOpen, params, searchB {/* We don't want to show the input when overlay is open */} {!isSearchOpen ? ( <> - + {/* On mobile only the IconButton is shown */} ({ index: { _index: indexAlias } }), - flushBytes: 10_000_000, // stop before breaker trips - concurrency: 2, // back-off a bit + flushBytes: 4 * 1024 * 1024, // 4MB - Prevents too large of a bulk request which results in a 429 from ES + concurrency: 2, refreshOnCompletion: true, timeout: '5m', + // We could use `retries` and `wait` here, but then we don't have as granular control over logging and when to retry }), { attempts,