diff --git a/.github/workflows/submit-cran.yaml b/.github/workflows/submit-cran.yaml
new file mode 100644
index 00000000..811b08cc
--- /dev/null
+++ b/.github/workflows/submit-cran.yaml
@@ -0,0 +1,23 @@
+name: Submit to CRAN
+
+on:
+ release:
+ types: [prereleased] # Only trigger on pre-releases
+
+jobs:
+ cran-submission:
+ runs-on: ubuntu-latest
+ name: Submit package to CRAN
+ permissions:
+ contents: read
+ issues: write # Needed to create issues
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Submit R package to CRAN
+ uses: coatless-actions/cran-submission@v1
+ with:
+ pkg-directory: '.' # Directory containing the package
+ check-directory: 'check' # Directory for check outputs
+ error-on: 'warning' # Fail on warnings
+ create-issue: true # Create issues to track submissions
diff --git a/DESCRIPTION b/DESCRIPTION
index a3a72809..7c8fd10f 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -1,6 +1,6 @@
Package: shiny.fluent
Title: Microsoft Fluent UI for Shiny Apps
-Version: 0.4.0
+Version: 0.4.1
Authors@R:
c(
person("Jakub", "Sobolewski", role = c("aut", "cre"), email = "opensource+jakub.sobolewski@appsilon.com"),
@@ -18,7 +18,7 @@ License: LGPL-3
Encoding: UTF-8
LazyData: true
Roxygen: list(markdown = TRUE)
-RoxygenNote: 7.3.1
+RoxygenNote: 7.3.3
Depends:
R (>= 2.10)
Imports:
@@ -34,7 +34,6 @@ Suggests:
DT,
ggplot2,
glue,
- imola,
knitr,
leaflet,
mockery,
diff --git a/NEWS.md b/NEWS.md
index 3556436c..d7c29299 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,3 +1,10 @@
+# shiny.fluent 0.4.1
+
+1. Fixed an invalid link in the `Icon` documentation that failed CRAN's HTML validation.
+2. Links to the Fluent UI docs and the Microsoft Writing Style Guide now point at their
+current locations.
+3. Removed the `imola` dependency from the dashboard example, which now uses plain CSS grid.
+
# shiny.fluent 0.4.0
1. Upgraded `@fluentui/react` to 8.118.2.
diff --git a/R/documentation.R b/R/documentation.R
index 3d291d60..84469f30 100644
--- a/R/documentation.R
+++ b/R/documentation.R
@@ -49,10 +49,10 @@ NULL
#'
#' The Announced component currently has the following documented use cases:
#'
-#' 1. [Quick Actions](#/controls/web/announced/quickactions): Operations such as editing text or deletion that are short enough that they do not require a status during progress.
-#' 2. [Search Results](#/controls/web/announced/searchresults): Appearance of search results such as in contact fields or search boxes.
-#' 3. [Lazy Loading](#/controls/web/announced/lazyloading): "Lazy loading" of page sections that do not appear all at once.
-#' 4. [Bulk Operations](#/controls/web/announced/bulkoperations): Operations that require multiple sub operations, such as the moving of several files.
+#' 1. [Quick Actions](https://developer.microsoft.com/en-us/fluentui#/controls/web/announced/quickactions): Operations such as editing text or deletion that are short enough that they do not require a status during progress.
+#' 2. [Search Results](https://developer.microsoft.com/en-us/fluentui#/controls/web/announced/searchresults): Appearance of search results such as in contact fields or search boxes.
+#' 3. [Lazy Loading](https://developer.microsoft.com/en-us/fluentui#/controls/web/announced/lazyloading): "Lazy loading" of page sections that do not appear all at once.
+#' 4. [Bulk Operations](https://developer.microsoft.com/en-us/fluentui#/controls/web/announced/bulkoperations): Operations that require multiple sub operations, such as the moving of several files.
#'
#'
#' For more details and examples visit the [official docs](https://developer.microsoft.com/en-us/fluentui#/controls/web/Announced).
@@ -130,7 +130,7 @@ NULL
#'
#' ### Content
#'
-#' - Use sentence-style capitalization—only capitalize the first word. For more info, see [Capitalization](https://docs.microsoft.com/style-guide/capitalization) in the Microsoft Writing Style Guide.
+#' - Use sentence-style capitalization—only capitalize the first word. For more info, see [Capitalization](https://learn.microsoft.com/style-guide/capitalization) in the Microsoft Writing Style Guide.
#' - Make sure it's clear what will happen when people interact with the button. Be concise; usually a single verb is best. Include a noun if there is any room for interpretation about what the verb means. For example, "Delete folder" or "Create account".
#'
#' @details
@@ -346,7 +346,7 @@ NULL
#' ### Content
#'
#' - Separate two groups of check boxes with headings rather than positioning them one after the other.
-#' - Use sentence-style capitalization—only capitalize the first word. For more info, see [Capitalization](https://docs.microsoft.com/style-guide/capitalization) in the Microsoft Writing Style Guide.
+#' - Use sentence-style capitalization—only capitalize the first word. For more info, see [Capitalization](https://learn.microsoft.com/style-guide/capitalization) in the Microsoft Writing Style Guide.
#' - Don't use end punctuation (unless the check box label absolutely requires multiple sentences).
#' - Use a sentence fragment for the label, rather than a full sentence.
#' - Make it easy for people to understand what will happen if they select or clear a check box.
@@ -871,7 +871,7 @@ NULL
#'
#' - Use sentence-style capitalization for column headers—only capitalize the first word. For more info, see `[Capitalization]` in the Microsoft Writing Style Guide.
#'
-#' `[capitalization]`: https://docs.microsoft.com/style-guide/capitalization
+#' `[capitalization]`: https://learn.microsoft.com/style-guide/capitalization
#'
#' ### FAQ
#'
@@ -1143,7 +1143,7 @@ NULL
#' - Don’t use periods at the end of titles.
#' - This mandatory content should explain the main information in a clear, concise, and specific statement or question. For example, “Delete this file?” instead of “Are you sure?”
#' - The title shouldn’t be a description of the body content. For example, don’t use “Error” as a title. Instead, use an informative statement like “Your session ended.”
-#' - Use sentence-style capitalization—only capitalize the first word. For more info, see [Capitalization](https://docs.microsoft.com/style-guide/capitalization) in the Microsoft Writing Style Guide.
+#' - Use sentence-style capitalization—only capitalize the first word. For more info, see [Capitalization](https://learn.microsoft.com/style-guide/capitalization) in the Microsoft Writing Style Guide.
#'
#' #### Body copy (Optional)
#'
@@ -1324,7 +1324,7 @@ NULL
#'
#' ### Content
#'
-#' - Use sentence-style capitalization—only capitalize the first word. For more info, see [Capitalization](https://docs.microsoft.com/style-guide/capitalization) in the Microsoft Writing Style Guide.
+#' - Use sentence-style capitalization—only capitalize the first word. For more info, see [Capitalization](https://learn.microsoft.com/style-guide/capitalization) in the Microsoft Writing Style Guide.
#' - The dropdown list label should describe what can be found in the menu.
#' - Use shortened statements or single words as list options.
#' - If there isn't a default option, use "Select an option" as placeholder text.
@@ -1666,9 +1666,9 @@ NULL
#' @description
#' In a user interface, an icon is an image that represents an application, a capability, or some other concept or specific entity with meaning for the user. An icon is usually selectable but can also be a nonselectable image, such as a company's logo.
#'
-#' For a list of icons, visit our [icon documentation](#/styles/web/icons).
+#' For a list of icons, visit our [icon documentation](https://developer.microsoft.com/en-us/fluentui#/styles/web/icons).
#'
-#' Note that icons are not bundled by default and typically must be loaded by calling `initializeIcons` from the `@uifabric/icons` package at the root of your application. See the [icon documentation](#/styles/web/icons#fabric-react) for more details.
+#' Note that icons are not bundled by default and typically must be loaded by calling `initializeIcons` from the `@uifabric/icons` package at the root of your application. See the [icon documentation](https://developer.microsoft.com/en-us/fluentui#/styles/web/icons) for more details.
#'
#'
#' For more details and examples visit the [official docs](https://developer.microsoft.com/en-us/fluentui#/controls/web/Icon).
@@ -1779,7 +1779,7 @@ NULL
#' ### Content
#'
#' - Labels should describe the purpose of the control.
-#' - Use sentence-style capitalization—only capitalize the first word. For more info, see [Capitalization](https://docs.microsoft.com/style-guide/capitalization) in the Microsoft Writing Style Guide.
+#' - Use sentence-style capitalization—only capitalize the first word. For more info, see [Capitalization](https://learn.microsoft.com/style-guide/capitalization) in the Microsoft Writing Style Guide.
#' - Be short and concise.
#' - Use nouns or short noun phrases.
#' - Don't use labels as instructional text. For example, "Click to get started".
@@ -1850,7 +1850,7 @@ NULL
#' - Use descriptive, actionable link text when possible. Avoid using URLs as link text.
#' - Don't use if the action is destructive or irreversible. Links aren't appropriate for commands with significant consequences.
#' - Keep discrete links far enough apart that people can differentiate between them and easily select each one.
-#' - Use sentence-style capitalization—only capitalize the first word. For more info, see [Capitalization](https://docs.microsoft.com/style-guide/capitalization) in the Microsoft Writing Style Guide.
+#' - Use sentence-style capitalization—only capitalize the first word. For more info, see [Capitalization](https://learn.microsoft.com/style-guide/capitalization) in the Microsoft Writing Style Guide.
#'
#' @details
#'
@@ -1885,7 +1885,7 @@ NULL
#'
#' ### Content
#'
-#' - Use sentence-style capitalization—only capitalize the first word. For more info, see [Capitalization](https://docs.microsoft.com/style-guide/capitalization) in the Microsoft Writing Style Guide.
+#' - Use sentence-style capitalization—only capitalize the first word. For more info, see [Capitalization](https://learn.microsoft.com/style-guide/capitalization) in the Microsoft Writing Style Guide.
#'
#' ### FAQ
#'
@@ -2086,7 +2086,7 @@ NULL
#'
#' ### Content
#'
-#' - Use sentence-style capitalization—only capitalize the first word. For more info, see [Capitalization](https://docs.microsoft.com/style-guide/capitalization) in the Microsoft Writing Style Guide.
+#' - Use sentence-style capitalization—only capitalize the first word. For more info, see [Capitalization](https://learn.microsoft.com/style-guide/capitalization) in the Microsoft Writing Style Guide.
#'
#' @details
#'
@@ -2256,7 +2256,7 @@ NULL
#' - Use sentence-style capitalization—only capitalize the first word. For more info, see `[Capitalization]` in the Microsoft Writing Style Guide.
#' - Don’t put a period at the end of the title.
#'
-#' `[capitalization]`: https://docs.microsoft.com/style-guide/capitalization
+#' `[capitalization]`: https://learn.microsoft.com/style-guide/capitalization
#'
#' #### Button labels
#'
@@ -2634,7 +2634,7 @@ NULL
#' ### Content
#'
#' - Use a five-star rating system.
-#' - Use sentence-style capitalization—only capitalize the first word. For more info, see [Capitalization](https://docs.microsoft.com/style-guide/capitalization) in the Microsoft Writing Style Guide.
+#' - Use sentence-style capitalization—only capitalize the first word. For more info, see [Capitalization](https://learn.microsoft.com/style-guide/capitalization) in the Microsoft Writing Style Guide.
#'
#' @details
#'
@@ -3270,7 +3270,7 @@ NULL
#'
#' - Include a short label above the text field to communicate what information should be entered. Don't use placeholder text instead of a label. Placeholder text poses a variety of accessibility issues (including possible problems with color/contrast, and people thinking the form input is already filled out).
#' - When part of a form, make it clear which fields are required vs. optional. If the input is required, add "(required)" to the label. Don't exclusively use "\*" to indicate required inputs as it is often not read by screen readers. For example, "First name (required)".
-#' - Use sentence-style capitalization—only capitalize the first word. For more info, see [Capitalization](https://docs.microsoft.com/style-guide/capitalization) in the Microsoft Writing Style Guide.
+#' - Use sentence-style capitalization—only capitalize the first word. For more info, see [Capitalization](https://learn.microsoft.com/style-guide/capitalization) in the Microsoft Writing Style Guide.
#'
#' @details
#'
diff --git a/README.md b/README.md
index 70d0b43f..0d07c97e 100644
--- a/README.md
+++ b/README.md
@@ -82,6 +82,6 @@ Learn more at [appsilon.com](https://www.appsilon.com/).
Get in touch [opensource@appsilon.com](mailto:opensource@appsilon.com)
-Explore the [Rhinoverse](https://rhinoverse.dev) - a family of R packages built around [Rhino](https://appsilon.github.io/rhino/)!
+Explore the [Rhinoverse](https://www.appsilon.com/rhinoverse) - a family of R packages built around [Rhino](https://appsilon.github.io/rhino/)!
diff --git a/cran-comments.md b/cran-comments.md
index 858617db..a53b8545 100644
--- a/cran-comments.md
+++ b/cran-comments.md
@@ -1,5 +1,14 @@
+## Resubmission
+
+This package was archived on 2026-06-01. The reported problem was an invalid `href` in the
+HTML version of the manual (`#/styles/web/icons#fabric-react` in `Icon.Rd`, flagged by the
+`vnu` HTML validator); all relative links of that form have been replaced with absolute
+URLs. Redirecting URLs have been updated, and `imola` (no longer on CRAN) has been dropped
+from `Suggests`.
+
## R CMD check results
-0 errors | 0 warnings | 1 note
+0 errors | 0 warnings | 0 notes
-* This is a new release.
+* "UI" flagged as possibly misspelled in the Title and Description is part of the product
+ name "Fluent UI".
diff --git a/inst/examples/dashboard/app.R b/inst/examples/dashboard/app.R
index 10b37532..34b9a542 100644
--- a/inst/examples/dashboard/app.R
+++ b/inst/examples/dashboard/app.R
@@ -1,5 +1,4 @@
library(dplyr)
-library(imola)
library(purrr)
library(sass)
library(shiny.fluent)
diff --git a/inst/examples/dashboard/header.R b/inst/examples/dashboard/header.R
index a5486bce..e379fb8d 100644
--- a/inst/examples/dashboard/header.R
+++ b/inst/examples/dashboard/header.R
@@ -51,63 +51,40 @@ command_bar <- CommandBar(
)
+# The grid layout (including the responsive breakpoint) lives in `style.scss`
+# under `.app_header`; the classes below name the grid areas.
header <- function() {
- appsilon_breakpoints <- breakpointSystem(
- "appsilon-breakpoints",
- breakpoint("xs", min = 320),
- breakpoint("s", min = 428),
- breakpoint("m", min = 728),
- breakpoint("l", min = 1024),
- breakpoint("xl", min = 1200)
- )
-
- gridPanel(
+ div(
id = "app_header",
- class = "mobile-collapsed",
- breakpoint_system = appsilon_breakpoints,
- areas = list(
- default = c(
- "logo . info mobile_controls",
- "separator separator separator separator",
- "title title title title",
- "menu menu menu menu",
- "cta cta cta cta"
- ),
- l = "logo separator title mobile_controls . menu info cta"
- ),
- columns = list(
- default = "auto 1fr auto auto",
- l = "auto 1px auto auto 1fr auto auto auto"
- ),
- rows = list(
- default = "auto auto auto auto auto",
- l = "40px"
- ),
- gap = list(
- default = "0px",
- l = "16px"
- ),
- logo = img(src = "appsilon-logo.png", class = "logo"),
- separator = div(class = "app_header_vertical_separator mobile-toggled"),
- title = div(
+ class = "app_header mobile-collapsed",
+ img(src = "appsilon-logo.png", class = "logo"),
+ div(class = "app_header_vertical_separator mobile-toggled separator"),
+ div(
"shiny.fluent",
- class = "app_header_title mobile-toggled"
+ class = "app_header_title mobile-toggled title"
),
command_bar,
- info = IconButton.shinyInput(
- "cta_info",
- class = "cta-icon",
- iconProps = list(iconName = "Info"),
- href = "#!/about"
+ tagAppendAttributes(
+ IconButton.shinyInput(
+ "cta_info",
+ class = "cta-icon",
+ iconProps = list(iconName = "Info"),
+ href = "#!/about"
+ ),
+ class = "info"
),
- cta = PrimaryButton.shinyInput(
- inputId = "cta_talk",
- text = "Let's Talk",
- class = "btn-primary btn-cta mobile-toggled",
- href = "https://appsilon.com/",
- target = "_blank"
+ tagAppendAttributes(
+ PrimaryButton.shinyInput(
+ inputId = "cta_talk",
+ text = "Let's Talk",
+ class = "btn-primary btn-cta mobile-toggled",
+ href = "https://appsilon.com/",
+ target = "_blank"
+ ),
+ class = "cta"
),
- mobile_controls = div(
+ div(
+ class = "mobile_controls",
tags$script("
let header_expand = function() {
document.getElementById('app_header').classList
diff --git a/inst/examples/dashboard/manifest.json b/inst/examples/dashboard/manifest.json
index 348ff348..a1e2c794 100644
--- a/inst/examples/dashboard/manifest.json
+++ b/inst/examples/dashboard/manifest.json
@@ -608,38 +608,6 @@
"Built": "R 4.1.1; x86_64-pc-linux-gnu; 2022-12-16 11:11:38 UTC; unix"
}
},
- "imola": {
- "Source": "RSPM",
- "Repository": "https://packagemanager.rstudio.com/all/latest",
- "GithubRepo": null,
- "GithubUsername": null,
- "GithubRef": null,
- "GithubSha1": null,
- "description": {
- "Package": "imola",
- "Type": "Package",
- "Title": "CSS Layouts (Grid and Flexbox) Implementation for R/Shiny",
- "Version": "0.5.0",
- "Authors@R": "person(\"Pedro\", \"Silva\", email = \"pedrocoutinhosilva@gmail.com\",\n role = c(\"aut\", \"cre\"))",
- "Description": "Allows easy creation of CSS layouts (grid and flexbox)\n directly from R without added CSS.",
- "License": "MIT + file LICENSE",
- "URL": "https://github.com/pedrocoutinhosilva/imola",
- "Encoding": "UTF-8",
- "VignetteBuilder": "knitr",
- "Imports": "shiny, htmltools, magrittr, stringi, glue, yaml",
- "Suggests": "testthat (>= 3.0.0), rvest, devtools, covr, rmarkdown, knitr",
- "RoxygenNote": "7.1.2",
- "Config/testthat/edition": "3",
- "Language": "en-US",
- "NeedsCompilation": "no",
- "Packaged": "2022-04-10 17:12:00 UTC; spark",
- "Author": "Pedro Silva [aut, cre]",
- "Maintainer": "Pedro Silva ",
- "Repository": "RSPM",
- "Date/Publication": "2022-04-19 09:32:30 UTC",
- "Built": "R 4.1.1; ; 2023-03-28 09:10:26 UTC; unix"
- }
- },
"jquerylib": {
"Source": "RSPM",
"Repository": "https://packagemanager.rstudio.com/all/latest",
diff --git a/inst/examples/dashboard/style.scss b/inst/examples/dashboard/style.scss
index d5e1edea..fa222cf7 100644
--- a/inst/examples/dashboard/style.scss
+++ b/inst/examples/dashboard/style.scss
@@ -234,6 +234,39 @@ body {
margin: 10px 0;
}
+.app_header {
+ width: 100%;
+ height: 100%;
+ display: grid;
+ grid-template-areas:
+ "logo . info mobile_controls"
+ "separator separator separator separator"
+ "title title title title"
+ "menu menu menu menu"
+ "cta cta cta cta";
+ grid-template-rows: auto auto auto auto auto;
+ grid-template-columns: auto 1fr auto auto;
+ gap: 0px;
+ align-items: stretch;
+ justify-items: stretch;
+
+ > .logo { grid-area: logo; }
+ > .separator { grid-area: separator; }
+ > .title { grid-area: title; }
+ > .info { grid-area: info; }
+ > .cta { grid-area: cta; }
+ > .mobile_controls { grid-area: mobile_controls; }
+}
+
+@media (min-width: 1024px) {
+ .app_header {
+ grid-template-areas: "logo separator title mobile_controls . menu info cta";
+ grid-template-rows: 40px;
+ grid-template-columns: auto 1px auto auto 1fr auto auto auto;
+ gap: 16px;
+ }
+}
+
#app_header {
padding: 12px 0;
justify-content: center;
diff --git a/man/Announced.Rd b/man/Announced.Rd
index 1cd3343c..030159e4 100644
--- a/man/Announced.Rd
+++ b/man/Announced.Rd
@@ -23,10 +23,10 @@ Some real-world applications of the component include copying, uploading, or mov
The Announced component currently has the following documented use cases:
\enumerate{
-\item \href{#/controls/web/announced/quickactions}{Quick Actions}: Operations such as editing text or deletion that are short enough that they do not require a status during progress.
-\item \href{#/controls/web/announced/searchresults}{Search Results}: Appearance of search results such as in contact fields or search boxes.
-\item \href{#/controls/web/announced/lazyloading}{Lazy Loading}: "Lazy loading" of page sections that do not appear all at once.
-\item \href{#/controls/web/announced/bulkoperations}{Bulk Operations}: Operations that require multiple sub operations, such as the moving of several files.
+\item \href{https://developer.microsoft.com/en-us/fluentui#/controls/web/announced/quickactions}{Quick Actions}: Operations such as editing text or deletion that are short enough that they do not require a status during progress.
+\item \href{https://developer.microsoft.com/en-us/fluentui#/controls/web/announced/searchresults}{Search Results}: Appearance of search results such as in contact fields or search boxes.
+\item \href{https://developer.microsoft.com/en-us/fluentui#/controls/web/announced/lazyloading}{Lazy Loading}: "Lazy loading" of page sections that do not appear all at once.
+\item \href{https://developer.microsoft.com/en-us/fluentui#/controls/web/announced/bulkoperations}{Bulk Operations}: Operations that require multiple sub operations, such as the moving of several files.
}
For more details and examples visit the \href{https://developer.microsoft.com/en-us/fluentui#/controls/web/Announced}{official docs}.
diff --git a/man/Button.Rd b/man/Button.Rd
index 3a2f3a7f..4bcea454 100644
--- a/man/Button.Rd
+++ b/man/Button.Rd
@@ -189,7 +189,7 @@ Note: This increases the time the button will take to mount, but can improve per
\subsection{Content}{
\itemize{
-\item Use sentence-style capitalization—only capitalize the first word. For more info, see \href{https://docs.microsoft.com/style-guide/capitalization}{Capitalization} in the Microsoft Writing Style Guide.
+\item Use sentence-style capitalization—only capitalize the first word. For more info, see \href{https://learn.microsoft.com/style-guide/capitalization}{Capitalization} in the Microsoft Writing Style Guide.
\item Make sure it's clear what will happen when people interact with the button. Be concise; usually a single verb is best. Include a noun if there is any room for interpretation about what the verb means. For example, "Delete folder" or "Create account".
}
}
diff --git a/man/Checkbox.Rd b/man/Checkbox.Rd
index dad8087b..af7b9413 100644
--- a/man/Checkbox.Rd
+++ b/man/Checkbox.Rd
@@ -74,7 +74,7 @@ you need to work using the original docs to achieve the desired result.
\subsection{Content}{
\itemize{
\item Separate two groups of check boxes with headings rather than positioning them one after the other.
-\item Use sentence-style capitalization—only capitalize the first word. For more info, see \href{https://docs.microsoft.com/style-guide/capitalization}{Capitalization} in the Microsoft Writing Style Guide.
+\item Use sentence-style capitalization—only capitalize the first word. For more info, see \href{https://learn.microsoft.com/style-guide/capitalization}{Capitalization} in the Microsoft Writing Style Guide.
\item Don't use end punctuation (unless the check box label absolutely requires multiple sentences).
\item Use a sentence fragment for the label, rather than a full sentence.
\item Make it easy for people to understand what will happen if they select or clear a check box.
diff --git a/man/DetailsList.Rd b/man/DetailsList.Rd
index e06b7d71..eb0297ad 100644
--- a/man/DetailsList.Rd
+++ b/man/DetailsList.Rd
@@ -224,7 +224,7 @@ Falls back to window 'resize' event.
\item Use sentence-style capitalization for column headers—only capitalize the first word. For more info, see \verb{[Capitalization]} in the Microsoft Writing Style Guide.
}
-\verb{[capitalization]}: https://docs.microsoft.com/style-guide/capitalization
+\verb{[capitalization]}: https://learn.microsoft.com/style-guide/capitalization
}
\subsection{FAQ}{
diff --git a/man/Dialog.Rd b/man/Dialog.Rd
index d7c81ce1..3e8d82e6 100644
--- a/man/Dialog.Rd
+++ b/man/Dialog.Rd
@@ -118,7 +118,7 @@ you need to work using the original docs to achieve the desired result.
\item Don’t use periods at the end of titles.
\item This mandatory content should explain the main information in a clear, concise, and specific statement or question. For example, “Delete this file?” instead of “Are you sure?”
\item The title shouldn’t be a description of the body content. For example, don’t use “Error” as a title. Instead, use an informative statement like “Your session ended.”
-\item Use sentence-style capitalization—only capitalize the first word. For more info, see \href{https://docs.microsoft.com/style-guide/capitalization}{Capitalization} in the Microsoft Writing Style Guide.
+\item Use sentence-style capitalization—only capitalize the first word. For more info, see \href{https://learn.microsoft.com/style-guide/capitalization}{Capitalization} in the Microsoft Writing Style Guide.
}
}
diff --git a/man/Dropdown.Rd b/man/Dropdown.Rd
index 3552693b..898d0746 100644
--- a/man/Dropdown.Rd
+++ b/man/Dropdown.Rd
@@ -71,7 +71,7 @@ you need to work using the original docs to achieve the desired result.
\subsection{Content}{
\itemize{
-\item Use sentence-style capitalization—only capitalize the first word. For more info, see \href{https://docs.microsoft.com/style-guide/capitalization}{Capitalization} in the Microsoft Writing Style Guide.
+\item Use sentence-style capitalization—only capitalize the first word. For more info, see \href{https://learn.microsoft.com/style-guide/capitalization}{Capitalization} in the Microsoft Writing Style Guide.
\item The dropdown list label should describe what can be found in the menu.
\item Use shortened statements or single words as list options.
\item If there isn't a default option, use "Select an option" as placeholder text.
diff --git a/man/Icon.Rd b/man/Icon.Rd
index 00b909ac..53c77e63 100644
--- a/man/Icon.Rd
+++ b/man/Icon.Rd
@@ -22,9 +22,9 @@ Object with \code{shiny.tag} class suitable for use in the UI of a Shiny app.
\description{
In a user interface, an icon is an image that represents an application, a capability, or some other concept or specific entity with meaning for the user. An icon is usually selectable but can also be a nonselectable image, such as a company's logo.
-For a list of icons, visit our \href{#/styles/web/icons}{icon documentation}.
+For a list of icons, visit our \href{https://developer.microsoft.com/en-us/fluentui#/styles/web/icons}{icon documentation}.
-Note that icons are not bundled by default and typically must be loaded by calling \code{initializeIcons} from the \verb{@uifabric/icons} package at the root of your application. See the \href{#/styles/web/icons#fabric-react}{icon documentation} for more details.
+Note that icons are not bundled by default and typically must be loaded by calling \code{initializeIcons} from the \verb{@uifabric/icons} package at the root of your application. See the \href{https://developer.microsoft.com/en-us/fluentui#/styles/web/icons}{icon documentation} for more details.
For more details and examples visit the \href{https://developer.microsoft.com/en-us/fluentui#/controls/web/Icon}{official docs}.
The R package cannot handle each and every case, so for advanced use cases
diff --git a/man/Label.Rd b/man/Label.Rd
index dd32146a..bb84f90c 100644
--- a/man/Label.Rd
+++ b/man/Label.Rd
@@ -40,7 +40,7 @@ you need to work using the original docs to achieve the desired result.
\subsection{Content}{
\itemize{
\item Labels should describe the purpose of the control.
-\item Use sentence-style capitalization—only capitalize the first word. For more info, see \href{https://docs.microsoft.com/style-guide/capitalization}{Capitalization} in the Microsoft Writing Style Guide.
+\item Use sentence-style capitalization—only capitalize the first word. For more info, see \href{https://learn.microsoft.com/style-guide/capitalization}{Capitalization} in the Microsoft Writing Style Guide.
\item Be short and concise.
\item Use nouns or short noun phrases.
\item Don't use labels as instructional text. For example, "Click to get started".
diff --git a/man/Link.Rd b/man/Link.Rd
index ac217093..a965af69 100644
--- a/man/Link.Rd
+++ b/man/Link.Rd
@@ -43,7 +43,7 @@ you need to work using the original docs to achieve the desired result.
\item Use descriptive, actionable link text when possible. Avoid using URLs as link text.
\item Don't use if the action is destructive or irreversible. Links aren't appropriate for commands with significant consequences.
\item Keep discrete links far enough apart that people can differentiate between them and easily select each one.
-\item Use sentence-style capitalization—only capitalize the first word. For more info, see \href{https://docs.microsoft.com/style-guide/capitalization}{Capitalization} in the Microsoft Writing Style Guide.
+\item Use sentence-style capitalization—only capitalize the first word. For more info, see \href{https://learn.microsoft.com/style-guide/capitalization}{Capitalization} in the Microsoft Writing Style Guide.
}
}
}
diff --git a/man/List.Rd b/man/List.Rd
index 5a43b3f0..e005684c 100644
--- a/man/List.Rd
+++ b/man/List.Rd
@@ -70,7 +70,7 @@ you need to work using the original docs to achieve the desired result.
\subsection{Content}{
\itemize{
-\item Use sentence-style capitalization—only capitalize the first word. For more info, see \href{https://docs.microsoft.com/style-guide/capitalization}{Capitalization} in the Microsoft Writing Style Guide.
+\item Use sentence-style capitalization—only capitalize the first word. For more info, see \href{https://learn.microsoft.com/style-guide/capitalization}{Capitalization} in the Microsoft Writing Style Guide.
}
}
diff --git a/man/Modal.Rd b/man/Modal.Rd
index 38967ed4..efa975fd 100644
--- a/man/Modal.Rd
+++ b/man/Modal.Rd
@@ -59,7 +59,7 @@ you need to work using the original docs to achieve the desired result.
\subsection{Content}{
\itemize{
-\item Use sentence-style capitalization—only capitalize the first word. For more info, see \href{https://docs.microsoft.com/style-guide/capitalization}{Capitalization} in the Microsoft Writing Style Guide.
+\item Use sentence-style capitalization—only capitalize the first word. For more info, see \href{https://learn.microsoft.com/style-guide/capitalization}{Capitalization} in the Microsoft Writing Style Guide.
}
}
}
diff --git a/man/Panel.Rd b/man/Panel.Rd
index 3ba874bd..cd6e3b99 100644
--- a/man/Panel.Rd
+++ b/man/Panel.Rd
@@ -101,7 +101,7 @@ you need to work using the original docs to achieve the desired result.
\item Don’t put a period at the end of the title.
}
-\verb{[capitalization]}: https://docs.microsoft.com/style-guide/capitalization
+\verb{[capitalization]}: https://learn.microsoft.com/style-guide/capitalization
}
\subsection{Button labels}{
diff --git a/man/Rating.Rd b/man/Rating.Rd
index 7436bafd..eb0ecd7a 100644
--- a/man/Rating.Rd
+++ b/man/Rating.Rd
@@ -69,7 +69,7 @@ you need to work using the original docs to achieve the desired result.
\subsection{Content}{
\itemize{
\item Use a five-star rating system.
-\item Use sentence-style capitalization—only capitalize the first word. For more info, see \href{https://docs.microsoft.com/style-guide/capitalization}{Capitalization} in the Microsoft Writing Style Guide.
+\item Use sentence-style capitalization—only capitalize the first word. For more info, see \href{https://learn.microsoft.com/style-guide/capitalization}{Capitalization} in the Microsoft Writing Style Guide.
}
}
}
diff --git a/man/TextField.Rd b/man/TextField.Rd
index ac1bac26..672c3f0c 100644
--- a/man/TextField.Rd
+++ b/man/TextField.Rd
@@ -108,7 +108,7 @@ When it returns \verb{Promise}: - The resolved value is di
\itemize{
\item Include a short label above the text field to communicate what information should be entered. Don't use placeholder text instead of a label. Placeholder text poses a variety of accessibility issues (including possible problems with color/contrast, and people thinking the form input is already filled out).
\item When part of a form, make it clear which fields are required vs. optional. If the input is required, add "(required)" to the label. Don't exclusively use "\*" to indicate required inputs as it is often not read by screen readers. For example, "First name (required)".
-\item Use sentence-style capitalization—only capitalize the first word. For more info, see \href{https://docs.microsoft.com/style-guide/capitalization}{Capitalization} in the Microsoft Writing Style Guide.
+\item Use sentence-style capitalization—only capitalize the first word. For more info, see \href{https://learn.microsoft.com/style-guide/capitalization}{Capitalization} in the Microsoft Writing Style Guide.
}
}
}
diff --git a/scrape-docs/makeDocs.ts b/scrape-docs/makeDocs.ts
index 1efb8c7d..c042937f 100644
--- a/scrape-docs/makeDocs.ts
+++ b/scrape-docs/makeDocs.ts
@@ -41,6 +41,21 @@ const REPLACE_MAP = [
regex: /(\[(0-9|a-zA-Z|a-zA-Z0-9)\])/gm,
replacement: '`$1`',
},
+ // Absolutize relative links to the Fluent docs SPA. They point nowhere in the R manual,
+ // and the "#/a#b" form is invalid HTML (two fragments), which fails the CRAN vnu check.
+ {
+ regex: /\]\(#\/styles\/web\/icons#fabric-react\)/gm,
+ replacement: '](https://developer.microsoft.com/en-us/fluentui#/styles/web/icons)',
+ },
+ {
+ regex: /\]\(#\//gm,
+ replacement: '](https://developer.microsoft.com/en-us/fluentui#/',
+ },
+ // docs.microsoft.com redirects (301) to learn.microsoft.com, which CRAN flags.
+ {
+ regex: /https:\/\/docs\.microsoft\.com\//gm,
+ replacement: 'https://learn.microsoft.com/',
+ },
// Remove empty @details
{
regex: /#'\s+@details[\n\s]+#'[\n\s]+#'[\n\s]+\\itemize\{\n#'\s\}/gm,
diff --git a/tests/testthat/setup-disable-crashpad.R b/tests/testthat/setup-disable-crashpad.R
index 73e56ee6..043d3f35 100644
--- a/tests/testthat/setup-disable-crashpad.R
+++ b/tests/testthat/setup-disable-crashpad.R
@@ -19,12 +19,35 @@ chromote::set_chrome_args(c(
))
# Make sure the temp folder is removed when testing is complete
-withr::defer({
+withr::defer(
+ {
+ # Shut Chrome down gracefully and wait for the process to exit. Chrome removes
+ # its own temp dirs only on a clean exit, and a process still alive here would
+ # recreate them right after the unlink below.
+ if (chromote::has_default_chromote_object()) {
+ try(chromote::default_chromote_object()$close(wait = 10), silent = TRUE)
+ }
- # Clean up chromote sessions
- gc() # Run R6 finalizer methods
- Sys.sleep(2) # Wait for any supervisors to exit
+ # Clean up chromote sessions
+ gc() # Run R6 finalizer methods
+ Sys.sleep(2) # Wait for any supervisors to exit
- # Delete the Crashpad folder if it exists
- unlink(file.path(tempdir(), "Crashpad"), recursive = TRUE)
-}, envir = testthat::teardown_env())
+ # Delete Chrome leftovers: 'Crashpad' and macOS 'com.google.Chrome.*' dirs.
+ # R CMD check reports detritus in dirname(tempdir()), which is check-private;
+ # outside a check that dir is the shared TMPDIR of a possibly running browser.
+ dirs <- if (testthat::is_checking()) {
+ c(tempdir(), dirname(tempdir()))
+ } else {
+ tempdir()
+ }
+ unlink(
+ list.files(
+ dirs,
+ pattern = "^(Crashpad|com\\.google\\.Chrome)",
+ full.names = TRUE
+ ),
+ recursive = TRUE
+ )
+ },
+ envir = testthat::teardown_env()
+)