diff --git a/.gitignore b/.gitignore
index 38b70a50be..3c6b64ebd4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,4 +18,3 @@ _freeze
_site
.DS_Store
*.lock
-*.html
diff --git a/.markdownlintignore b/.markdownlintignore
new file mode 100644
index 0000000000..13986d2f8f
--- /dev/null
+++ b/.markdownlintignore
@@ -0,0 +1 @@
+/book/_extensions/
diff --git a/book/.gitignore b/book/.gitignore
index 416be9cda3..bfef5d35c7 100644
--- a/book/.gitignore
+++ b/book/.gitignore
@@ -1,2 +1,4 @@
/.quarto/
*.rmarkdown
+*.html
+!_extensions/**/*.html
diff --git a/book/_extensions/coatless/webr/_extension.yml b/book/_extensions/coatless/webr/_extension.yml
new file mode 100644
index 0000000000..2c95d6eb0f
--- /dev/null
+++ b/book/_extensions/coatless/webr/_extension.yml
@@ -0,0 +1,8 @@
+name: webr
+title: Embedded webr code cells
+author: James Joseph Balamuta
+version: 0.4.2-dev.3
+quarto-required: ">=1.2.198"
+contributes:
+ filters:
+ - webr.lua
diff --git a/book/_extensions/coatless/webr/qwebr-cell-elements.js b/book/_extensions/coatless/webr/qwebr-cell-elements.js
new file mode 100644
index 0000000000..5037bdc350
--- /dev/null
+++ b/book/_extensions/coatless/webr/qwebr-cell-elements.js
@@ -0,0 +1,274 @@
+// Supported Evaluation Types for Context
+globalThis.EvalTypes = Object.freeze({
+ Interactive: 'interactive',
+ Setup: 'setup',
+ Output: 'output',
+});
+
+// Function that obtains the font size for a given element
+globalThis.qwebrCurrentFontSizeOnElement = function(element, cssProperty = 'font-size') {
+
+ const currentFontSize = parseFloat(
+ window
+ .getComputedStyle(element)
+ .getPropertyValue(cssProperty)
+ );
+
+ return currentFontSize;
+}
+
+// Function to determine font scaling
+globalThis.qwebrScaledFontSize = function(div, qwebrOptions) {
+ // Determine if we should compute font-size using RevealJS's `--r-main-font-size`
+ // or if we can directly use the document's `font-size`.
+ const cssProperty = document.body.classList.contains('reveal') ?
+ "--r-main-font-size" : "font-size";
+
+ // Get the current font size on the div element
+ const elementFontSize = qwebrCurrentFontSizeOnElement(div, cssProperty);
+
+ // Determine the scaled font size value
+ const scaledFontSize = ((qwebrOptions['editor-font-scale'] ?? 1) * elementFontSize) ?? 17.5;
+
+ return scaledFontSize;
+}
+
+
+// Function that dispatches the creation request
+globalThis.qwebrCreateHTMLElement = function (
+ cellData
+) {
+
+ // Extract key components
+ const evalType = cellData.options.context;
+ const qwebrCounter = cellData.id;
+
+ // We make an assumption that insertion points are defined by the Lua filter as:
+ // qwebr-insertion-location-{qwebrCounter}
+ const elementLocator = document.getElementById(`qwebr-insertion-location-${qwebrCounter}`);
+
+ // Figure out the routine to use to insert the element.
+ let qwebrElement;
+ switch ( evalType ) {
+ case EvalTypes.Interactive:
+ qwebrElement = qwebrCreateInteractiveElement(qwebrCounter, cellData.options);
+ break;
+ case EvalTypes.Output:
+ qwebrElement = qwebrCreateNonInteractiveOutputElement(qwebrCounter, cellData.options);
+ break;
+ case EvalTypes.Setup:
+ qwebrElement = qwebrCreateNonInteractiveSetupElement(qwebrCounter, cellData.options);
+ break;
+ default:
+ qwebrElement = document.createElement('div');
+ qwebrElement.textContent = 'Error creating `quarto-webr` element';
+ }
+
+ // Insert the dynamically generated object at the document location.
+ elementLocator.appendChild(qwebrElement);
+};
+
+// Function that setups the interactive element creation
+globalThis.qwebrCreateInteractiveElement = function (qwebrCounter, qwebrOptions) {
+
+ // Create main div element
+ var mainDiv = document.createElement('div');
+ mainDiv.id = 'qwebr-interactive-area-' + qwebrCounter;
+ mainDiv.className = `qwebr-interactive-area`;
+ if (qwebrOptions.classes) {
+ mainDiv.className += " " + qwebrOptions.classes
+ }
+
+ // Add a unique cell identifier that users can customize
+ if (qwebrOptions.label) {
+ mainDiv.setAttribute('data-id', qwebrOptions.label);
+ }
+
+ // Create toolbar div
+ var toolbarDiv = document.createElement('div');
+ toolbarDiv.className = 'qwebr-editor-toolbar';
+ toolbarDiv.id = 'qwebr-editor-toolbar-' + qwebrCounter;
+
+ // Create a div to hold the left buttons
+ var leftButtonsDiv = document.createElement('div');
+ leftButtonsDiv.className = 'qwebr-editor-toolbar-left-buttons';
+
+ // Create a div to hold the right buttons
+ var rightButtonsDiv = document.createElement('div');
+ rightButtonsDiv.className = 'qwebr-editor-toolbar-right-buttons';
+
+ // Create Run Code button
+ var runCodeButton = document.createElement('button');
+ runCodeButton.className = 'btn btn-default qwebr-button qwebr-button-run';
+ runCodeButton.disabled = true;
+ runCodeButton.type = 'button';
+ runCodeButton.id = 'qwebr-button-run-' + qwebrCounter;
+ runCodeButton.textContent = '🟡 Loading webR...';
+ runCodeButton.title = `Run code (Shift + Enter)`;
+
+ // Append buttons to the leftButtonsDiv
+ leftButtonsDiv.appendChild(runCodeButton);
+
+ // Create Reset button
+ var resetButton = document.createElement('button');
+ resetButton.className = 'btn btn-light btn-xs qwebr-button qwebr-button-reset';
+ resetButton.type = 'button';
+ resetButton.id = 'qwebr-button-reset-' + qwebrCounter;
+ resetButton.title = 'Start over';
+ resetButton.innerHTML = '';
+
+ // Create Copy button
+ var copyButton = document.createElement('button');
+ copyButton.className = 'btn btn-light btn-xs qwebr-button qwebr-button-copy';
+ copyButton.type = 'button';
+ copyButton.id = 'qwebr-button-copy-' + qwebrCounter;
+ copyButton.title = 'Copy code';
+ copyButton.innerHTML = '';
+
+ // Append buttons to the rightButtonsDiv
+ rightButtonsDiv.appendChild(resetButton);
+ rightButtonsDiv.appendChild(copyButton);
+
+ // Create console area div
+ var consoleAreaDiv = document.createElement('div');
+ consoleAreaDiv.id = 'qwebr-console-area-' + qwebrCounter;
+ consoleAreaDiv.className = 'qwebr-console-area';
+
+ // Create editor div
+ var editorDiv = document.createElement('div');
+ editorDiv.id = 'qwebr-editor-' + qwebrCounter;
+ editorDiv.className = 'qwebr-editor';
+
+ // Create output code area div
+ var outputCodeAreaDiv = document.createElement('div');
+ outputCodeAreaDiv.id = 'qwebr-output-code-area-' + qwebrCounter;
+ outputCodeAreaDiv.className = 'qwebr-output-code-area';
+ outputCodeAreaDiv.setAttribute('aria-live', 'assertive');
+
+ // Create pre element inside output code area
+ var preElement = document.createElement('pre');
+ preElement.style.visibility = 'hidden';
+ outputCodeAreaDiv.appendChild(preElement);
+
+ // Create output graph area div
+ var outputGraphAreaDiv = document.createElement('div');
+ outputGraphAreaDiv.id = 'qwebr-output-graph-area-' + qwebrCounter;
+ outputGraphAreaDiv.className = 'qwebr-output-graph-area';
+
+ // Append buttons to the toolbar
+ toolbarDiv.appendChild(leftButtonsDiv);
+ toolbarDiv.appendChild(rightButtonsDiv);
+
+ // Append all elements to the main div
+ mainDiv.appendChild(toolbarDiv);
+ consoleAreaDiv.appendChild(editorDiv);
+ consoleAreaDiv.appendChild(outputCodeAreaDiv);
+ mainDiv.appendChild(consoleAreaDiv);
+ mainDiv.appendChild(outputGraphAreaDiv);
+
+ return mainDiv;
+}
+
+// Function that adds output structure for non-interactive output
+globalThis.qwebrCreateNonInteractiveOutputElement = function(qwebrCounter, qwebrOptions) {
+ // Create main div element
+ var mainDiv = document.createElement('div');
+ mainDiv.id = 'qwebr-noninteractive-area-' + qwebrCounter;
+ mainDiv.className = `qwebr-noninteractive-area`;
+ if (qwebrOptions.classes) {
+ mainDiv.className += " " + qwebrOptions.classes
+ }
+
+ // Add a unique cell identifier that users can customize
+ if (qwebrOptions.label) {
+ mainDiv.setAttribute('data-id', qwebrOptions.label);
+ }
+
+ // Create a status container div
+ var statusContainer = createLoadingContainer(qwebrCounter);
+
+ // Create output code area div
+ var outputCodeAreaDiv = document.createElement('div');
+ outputCodeAreaDiv.id = 'qwebr-output-code-area-' + qwebrCounter;
+ outputCodeAreaDiv.className = 'qwebr-output-code-area';
+ outputCodeAreaDiv.setAttribute('aria-live', 'assertive');
+
+ // Create pre element inside output code area
+ var preElement = document.createElement('pre');
+ preElement.style.visibility = 'hidden';
+ outputCodeAreaDiv.appendChild(preElement);
+
+ // Create output graph area div
+ var outputGraphAreaDiv = document.createElement('div');
+ outputGraphAreaDiv.id = 'qwebr-output-graph-area-' + qwebrCounter;
+ outputGraphAreaDiv.className = 'qwebr-output-graph-area';
+
+ // Append all elements to the main div
+ mainDiv.appendChild(statusContainer);
+ mainDiv.appendChild(outputCodeAreaDiv);
+ mainDiv.appendChild(outputGraphAreaDiv);
+
+ return mainDiv;
+};
+
+// Function that adds a stub in the page to indicate a setup cell was used.
+globalThis.qwebrCreateNonInteractiveSetupElement = function(qwebrCounter, qwebrOptions) {
+ // Create main div element
+ var mainDiv = document.createElement('div');
+ mainDiv.id = `qwebr-noninteractive-setup-area-${qwebrCounter}`;
+ mainDiv.className = `qwebr-noninteractive-setup-area`;
+ if (qwebrOptions.classes) {
+ mainDiv.className += " " + qwebrOptions.classes
+ }
+
+
+ // Add a unique cell identifier that users can customize
+ if (qwebrOptions.label) {
+ mainDiv.setAttribute('data-id', qwebrOptions.label);
+ }
+
+ // Create a status container div
+ var statusContainer = createLoadingContainer(qwebrCounter);
+
+ // Append status onto the main div
+ mainDiv.appendChild(statusContainer);
+
+ return mainDiv;
+}
+
+
+// Function to create loading container with specified ID
+globalThis.createLoadingContainer = function(qwebrCounter) {
+
+ // Create a status container
+ const container = document.createElement('div');
+ container.id = `qwebr-non-interactive-loading-container-${qwebrCounter}`;
+ container.className = 'qwebr-non-interactive-loading-container qwebr-cell-needs-evaluation';
+
+ // Create an R project logo to indicate its a code space
+ const rProjectIcon = document.createElement('i');
+ rProjectIcon.className = 'fa-brands fa-r-project fa-3x qwebr-r-project-logo';
+
+ // Setup a loading icon from font awesome
+ const spinnerIcon = document.createElement('i');
+ spinnerIcon.className = 'fa-solid fa-spinner fa-spin fa-1x qwebr-icon-status-spinner';
+
+ // Add a section for status text
+ const statusText = document.createElement('p');
+ statusText.id = `qwebr-status-text-${qwebrCounter}`;
+ statusText.className = `qwebr-status-text qwebr-cell-needs-evaluation`;
+ statusText.innerText = 'Loading webR...';
+
+ // Incorporate an inner container
+ const innerContainer = document.createElement('div');
+
+ // Append elements to the inner container
+ innerContainer.appendChild(spinnerIcon);
+ innerContainer.appendChild(statusText);
+
+ // Append elements to the main container
+ container.appendChild(rProjectIcon);
+ container.appendChild(innerContainer);
+
+ return container;
+}
\ No newline at end of file
diff --git a/book/_extensions/coatless/webr/qwebr-cell-initialization.js b/book/_extensions/coatless/webr/qwebr-cell-initialization.js
new file mode 100644
index 0000000000..828bc94a6e
--- /dev/null
+++ b/book/_extensions/coatless/webr/qwebr-cell-initialization.js
@@ -0,0 +1,110 @@
+// Handle cell initialization initialization
+qwebrCellDetails.map(
+ (entry) => {
+ // Handle the creation of the element
+ qwebrCreateHTMLElement(entry);
+ // In the event of interactive, initialize the monaco editor
+ if (entry.options.context == EvalTypes.Interactive) {
+ qwebrCreateMonacoEditorInstance(entry);
+ }
+ }
+);
+
+// Identify non-interactive cells (in order)
+const filteredEntries = qwebrCellDetails.filter(entry => {
+ const contextOption = entry.options && entry.options.context;
+ return ['output', 'setup'].includes(contextOption) || (contextOption == "interactive" && entry.options && entry.options.autorun === 'true');
+});
+
+// Condition non-interactive cells to only be run after webR finishes its initialization.
+qwebrInstance.then(
+ async () => {
+ const nHiddenCells = filteredEntries.length;
+ var currentHiddenCell = 0;
+
+
+ // Modify button state
+ qwebrSetInteractiveButtonState(`🟡 Running hidden code cells ...`, false);
+
+ // Begin processing non-interactive sections
+ // Due to the iteration policy, we must use a for() loop.
+ // Otherwise, we would need to switch to using reduce with an empty
+ // starting promise
+ for (const entry of filteredEntries) {
+
+ // Determine cell being examined
+ currentHiddenCell = currentHiddenCell + 1;
+ const formattedMessage = `Evaluating hidden cell ${currentHiddenCell} out of ${nHiddenCells}`;
+
+ // Update the document status header
+ if (qwebrShowStartupMessage) {
+ qwebrUpdateStatusHeader(formattedMessage);
+ }
+
+ // Display the update in non-active areas
+ qwebrUpdateStatusMessage(formattedMessage);
+
+ // Extract details on the active cell
+ const evalType = entry.options.context;
+ const cellCode = entry.code;
+ const qwebrCounter = entry.id;
+
+ if (['output', 'setup'].includes(evalType)) {
+ // Disable further global status updates
+ const activeContainer = document.getElementById(`qwebr-non-interactive-loading-container-${qwebrCounter}`);
+ activeContainer.classList.remove('qwebr-cell-needs-evaluation');
+ activeContainer.classList.add('qwebr-cell-evaluated');
+
+ // Update status on the code cell
+ const activeStatus = document.getElementById(`qwebr-status-text-${qwebrCounter}`);
+ activeStatus.innerText = " Evaluating hidden code cell...";
+ activeStatus.classList.remove('qwebr-cell-needs-evaluation');
+ activeStatus.classList.add('qwebr-cell-evaluated');
+ }
+
+ switch (evalType) {
+ case 'interactive':
+ // TODO: Make this more standardized.
+ // At the moment, we're overriding the interactive status update by pretending its
+ // output-like.
+ const tempOptions = entry.options;
+ tempOptions["context"] = "output"
+ // Run the code in a non-interactive state that is geared to displaying output
+ await qwebrExecuteCode(`${cellCode}`, qwebrCounter, tempOptions);
+ break;
+ case 'output':
+ // Run the code in a non-interactive state that is geared to displaying output
+ await qwebrExecuteCode(`${cellCode}`, qwebrCounter, entry.options);
+ break;
+ case 'setup':
+ const activeDiv = document.getElementById(`qwebr-noninteractive-setup-area-${qwebrCounter}`);
+ // Run the code in a non-interactive state with all output thrown away
+ await mainWebR.evalRVoid(`${cellCode}`);
+ break;
+ default:
+ break;
+ }
+
+ if (['output', 'setup'].includes(evalType)) {
+ // Disable further global status updates
+ const activeContainer = document.getElementById(`qwebr-non-interactive-loading-container-${qwebrCounter}`);
+ // Disable visibility
+ activeContainer.style.visibility = 'hidden';
+ activeContainer.style.display = 'none';
+ }
+ }
+ }
+).then(
+ () => {
+ // Release document status as ready
+
+ if (qwebrShowStartupMessage) {
+ qwebrStartupMessage.innerText = "🟢 Ready!"
+ }
+
+ qwebrSetInteractiveButtonState(
+ ` Run Code`,
+ true
+ );
+ }
+);
\ No newline at end of file
diff --git a/book/_extensions/coatless/webr/qwebr-compute-engine.js b/book/_extensions/coatless/webr/qwebr-compute-engine.js
new file mode 100644
index 0000000000..f4ad17b9f9
--- /dev/null
+++ b/book/_extensions/coatless/webr/qwebr-compute-engine.js
@@ -0,0 +1,280 @@
+// Function to verify a given JavaScript Object is empty
+globalThis.qwebrIsObjectEmpty = function (arr) {
+ return Object.keys(arr).length === 0;
+}
+
+// Global version of the Escape HTML function that converts HTML
+// characters to their HTML entities.
+globalThis.qwebrEscapeHTMLCharacters = function(unsafe) {
+ return unsafe
+ .replace(/&/g, "&")
+ .replace(//g, ">")
+ .replace(/"/g, """)
+ .replace(/'/g, "'");
+ };
+
+// Passthrough results
+globalThis.qwebrIdentity = function(x) {
+ return x;
+};
+
+// Append a comment
+globalThis.qwebrPrefixComment = function(x, comment) {
+ return `${comment}${x}`;
+};
+
+// Function to parse the pager results
+globalThis.qwebrParseTypePager = async function (msg) {
+
+ // Split out the event data
+ const { path, title, deleteFile } = msg.data;
+
+ // Process the pager data by reading the information from disk
+ const paged_data = await mainWebR.FS.readFile(path).then((data) => {
+ // Obtain the file content
+ let content = new TextDecoder().decode(data);
+
+ // Remove excessive backspace characters until none remain
+ while(content.match(/.[\b]/)){
+ content = content.replace(/.[\b]/g, '');
+ }
+
+ // Returned cleaned data
+ return content;
+ });
+
+ // Unlink file if needed
+ if (deleteFile) {
+ await mainWebR.FS.unlink(path);
+ }
+
+ // Return extracted data with spaces
+ return paged_data;
+}
+
+// Function to run the code using webR and parse the output
+globalThis.qwebrComputeEngine = async function(
+ codeToRun,
+ elements,
+ options) {
+
+ // Call into the R compute engine that persists within the document scope.
+ // To be prepared for all scenarios, the following happens:
+ // 1. We setup a canvas device to write to by making a namespace call into the {webr} package
+ // 2. We use values inside of the options array to set the figure size.
+ // 3. We capture the output stream information (STDOUT and STERR)
+ // 4. We disable the current device's image creation.
+ // 5. Piece-wise parse the results into the different output areas
+
+ // Create a pager variable for help/file contents
+ let pager = [];
+
+ // Handle how output is processed
+ let showMarkup = options.results === "markup" && options.output !== "asis";
+ let processOutput;
+
+ if (showMarkup) {
+ processOutput = qwebrEscapeHTMLCharacters;
+ } else {
+ processOutput = qwebrIdentity;
+ }
+
+ // ----
+ // Convert from Inches to Pixels by using DPI (dots per inch)
+ // for bitmap devices (dpi * inches = pixels)
+ let fig_width = options["fig-width"] * options["dpi"]
+ let fig_height = options["fig-height"] * options["dpi"]
+
+ // Initialize webR
+ await mainWebR.init();
+
+ // Setup a webR canvas by making a namespace call into the {webr} package
+ // Evaluate the R code
+ // Remove the active canvas silently
+ const result = await mainWebRCodeShelter.captureR(
+ `webr::canvas(width=${fig_width}, height=${fig_height}, capture = TRUE)
+ .webr_cvs_id <- dev.cur()
+ ${codeToRun}
+ invisible(dev.off(.webr_cvs_id))
+ `, {
+ withAutoprint: true,
+ captureStreams: true,
+ captureConditions: false//,
+ // env: webR.objs.emptyEnv, // maintain a global environment for webR v0.2.0
+ });
+
+ // -----
+
+ // Start attempting to parse the result data
+ processResultOutput:try {
+
+ // Avoid running through output processing
+ if (options.results === "hide" || options.output === "false") {
+ break processResultOutput;
+ }
+
+ // Merge output streams of STDOUT and STDErr (messages and errors are combined.)
+ // Require both `warning` and `message` to be true to display `STDErr`.
+ const out = result.output
+ .filter(
+ evt => evt.type === "stdout" ||
+ ( evt.type === "stderr" && (options.warning === "true" && options.message === "true"))
+ )
+ .map((evt, index) => {
+ const className = `qwebr-output-code-${evt.type}`;
+ const outputResult = qwebrPrefixComment(processOutput(evt.data), options.comment);
+ return `${outputResult}
`;
+ })
+ .join("\n");
+
+
+ // Clean the state
+ // We're now able to process pager events.
+ // As a result, we cannot maintain a true 1-to-1 output order
+ // without individually feeding each line
+ const msgs = await mainWebR.flush();
+
+ // Use `map` to process the filtered "pager" events asynchronously
+ const pager = await Promise.all(
+ msgs.filter(msg => msg.type === 'pager').map(
+ async (msg) => {
+ return await qwebrParseTypePager(msg);
+ }
+ )
+ );
+
+ // Nullify the output area of content
+ elements.outputCodeDiv.innerHTML = "";
+ elements.outputGraphDiv.innerHTML = "";
+
+ // Design an output object for messages
+ const pre = document.createElement("pre");
+ if (/\S/.test(out)) {
+ // Display results as HTML elements to retain output styling
+ const div = document.createElement("div");
+ div.innerHTML = out;
+
+ // Calculate a scaled font-size value
+ const scaledFontSize = qwebrScaledFontSize(
+ elements.outputCodeDiv, options);
+
+ // Override output code cell size
+ pre.style.fontSize = `${scaledFontSize}px`;
+ pre.appendChild(div);
+ } else {
+ // If nothing is present, hide the element.
+ pre.style.visibility = "hidden";
+ }
+
+ elements.outputCodeDiv.appendChild(pre);
+
+ // Determine if we have graphs to display
+ if (result.images.length > 0) {
+ // Create figure element
+ const figureElement = document.createElement('figure');
+
+ // Place each rendered graphic onto a canvas element
+ result.images.forEach((img) => {
+ // Construct canvas for object
+ const canvas = document.createElement("canvas");
+
+ // Set canvas size to image
+ canvas.width = img.width;
+ canvas.height = img.height;
+
+ // Apply output truncations
+ canvas.style.width = options["out-width"] ? options["out-width"] : `${fig_width}px`;
+ if (options["out-height"]) {
+ canvas.style.height = options["out-height"];
+ }
+
+ // Apply styling
+ canvas.style.display = "block";
+ canvas.style.margin = "auto";
+
+ // Draw image onto Canvas
+ const ctx = canvas.getContext("2d");
+ ctx.drawImage(img, 0, 0, img.width, img.height);
+
+ // Append canvas to figure output area
+ figureElement.appendChild(canvas);
+ });
+
+ if (options['fig-cap']) {
+ // Create figcaption element
+ const figcaptionElement = document.createElement('figcaption');
+ figcaptionElement.innerText = options['fig-cap'];
+ // Append figcaption to figure
+ figureElement.appendChild(figcaptionElement);
+ }
+
+ elements.outputGraphDiv.appendChild(figureElement);
+ }
+
+ // Display the pager data
+ if (pager) {
+ // Use the `pre` element to preserve whitespace.
+ pager.forEach((paged_data, index) => {
+ let pre_pager = document.createElement("pre");
+ pre_pager.innerText = paged_data;
+ pre_pager.classList.add("qwebr-output-code-pager");
+ pre_pager.setAttribute("id", `qwebr-output-code-pager-editor-${elements.id}-result-${index + 1}`);
+ elements.outputCodeDiv.appendChild(pre_pager);
+ });
+ }
+ } finally {
+ // Clean up the remaining code
+ mainWebRCodeShelter.purge();
+ }
+}
+
+// Function to execute the code (accepts code as an argument)
+globalThis.qwebrExecuteCode = async function (
+ codeToRun,
+ id,
+ options = {}) {
+
+ // If options are not passed, we fall back on the bare minimum to handle the computation
+ if (qwebrIsObjectEmpty(options)) {
+ options = {
+ "context": "interactive",
+ "fig-width": 7, "fig-height": 5,
+ "out-width": "700px", "out-height": "",
+ "dpi": 72,
+ "results": "markup",
+ "warning": "true", "message": "true",
+ };
+ }
+
+ // Next, we access the compute areas values
+ const elements = {
+ runButton: document.getElementById(`qwebr-button-run-${id}`),
+ outputCodeDiv: document.getElementById(`qwebr-output-code-area-${id}`),
+ outputGraphDiv: document.getElementById(`qwebr-output-graph-area-${id}`),
+ id: id,
+ }
+
+ // Disallowing execution of other code cells
+ document.querySelectorAll(".qwebr-button-run").forEach((btn) => {
+ btn.disabled = true;
+ });
+
+ if (options.context == EvalTypes.Interactive) {
+ // Emphasize the active code cell
+ elements.runButton.innerHTML = ' Run Code';
+ }
+
+ // Evaluate the code and parse the output into the document
+ await qwebrComputeEngine(codeToRun, elements, options);
+
+ // Switch to allowing execution of code
+ document.querySelectorAll(".qwebr-button-run").forEach((btn) => {
+ btn.disabled = false;
+ });
+
+ if (options.context == EvalTypes.Interactive) {
+ // Revert to the initial code cell state
+ elements.runButton.innerHTML = ' Run Code';
+ }
+}
diff --git a/book/_extensions/coatless/webr/qwebr-document-engine-initialization.js b/book/_extensions/coatless/webr/qwebr-document-engine-initialization.js
new file mode 100644
index 0000000000..1d447e8bdb
--- /dev/null
+++ b/book/_extensions/coatless/webr/qwebr-document-engine-initialization.js
@@ -0,0 +1,94 @@
+// Function to install a single package
+async function qwebrInstallRPackage(packageName) {
+ await mainWebR.evalRVoid(`webr::install('${packageName}');`);
+}
+
+// Function to load a single package
+async function qwebrLoadRPackage(packageName) {
+ await mainWebR.evalRVoid(`require('${packageName}', quietly = TRUE)`);
+}
+
+// Generic function to process R packages
+async function qwebrProcessRPackagesWithStatus(packages, processType, displayStatusMessageUpdate = true) {
+ // Switch between contexts
+ const messagePrefix = processType === 'install' ? 'Installing' : 'Loading';
+
+ // Modify button state
+ qwebrSetInteractiveButtonState(`🟡 ${messagePrefix} package ...`, false);
+
+ // Iterate over packages
+ for (let i = 0; i < packages.length; i++) {
+ const activePackage = packages[i];
+ const formattedMessage = `${messagePrefix} package ${i + 1} out of ${packages.length}: ${activePackage}`;
+
+ // Display the update in header
+ if (displayStatusMessageUpdate) {
+ qwebrUpdateStatusHeader(formattedMessage);
+ }
+
+ // Display the update in non-active areas
+ qwebrUpdateStatusMessage(formattedMessage);
+
+ // Run package installation
+ if (processType === 'install') {
+ await qwebrInstallRPackage(activePackage);
+ } else {
+ await qwebrLoadRPackage(activePackage);
+ }
+ }
+
+ // Clean slate
+ if (processType === 'load') {
+ await mainWebR.flush();
+ }
+}
+
+// Start a timer
+const initializeWebRTimerStart = performance.now();
+
+// Encase with a dynamic import statement
+globalThis.qwebrInstance = import(qwebrCustomizedWebROptions.baseURL + "webr.mjs").then(
+ async ({ WebR, ChannelType }) => {
+ // Populate WebR options with defaults or new values based on `webr` meta
+ globalThis.mainWebR = new WebR(qwebrCustomizedWebROptions);
+
+ // Initialization WebR
+ await mainWebR.init();
+
+ // Setup a shelter
+ globalThis.mainWebRCodeShelter = await new mainWebR.Shelter();
+
+ // Setup a pager to allow processing help documentation
+ await mainWebR.evalRVoid('webr::pager_install()');
+
+ // Override the existing install.packages() to use webr::install()
+ await mainWebR.evalRVoid('webr::shim_install()');
+
+ // Specify the repositories to pull from
+ // Note: webR does not use the `repos` option, but instead uses `webr_pkg_repos`
+ // inside of `install()`. However, other R functions still pull from `repos`.
+ await mainWebR.evalRVoid(`
+ options(
+ webr_pkg_repos = c(${qwebrPackageRepoURLS.map(repoURL => `'${repoURL}'`).join(',')}),
+ repos = c(${qwebrPackageRepoURLS.map(repoURL => `'${repoURL}'`).join(',')})
+ )
+ `);
+
+ // Check to see if any packages need to be installed
+ if (qwebrSetupRPackages) {
+ // Obtain only a unique list of packages
+ const uniqueRPackageList = Array.from(new Set(qwebrInstallRPackagesList));
+
+ // Install R packages one at a time (either silently or with a status update)
+ await qwebrProcessRPackagesWithStatus(uniqueRPackageList, 'install', qwebrShowStartupMessage);
+
+ if (qwebrAutoloadRPackages) {
+ // Load R packages one at a time (either silently or with a status update)
+ await qwebrProcessRPackagesWithStatus(uniqueRPackageList, 'load', qwebrShowStartupMessage);
+ }
+ }
+ }
+);
+
+// Stop timer
+const initializeWebRTimerEnd = performance.now();
diff --git a/book/_extensions/coatless/webr/qwebr-document-settings.js b/book/_extensions/coatless/webr/qwebr-document-settings.js
new file mode 100644
index 0000000000..70495cf667
--- /dev/null
+++ b/book/_extensions/coatless/webr/qwebr-document-settings.js
@@ -0,0 +1,26 @@
+// Document level settings ----
+
+// Determine if we need to install R packages
+globalThis.qwebrInstallRPackagesList = [{{INSTALLRPACKAGESLIST}}];
+
+// Specify possible locations to search for the repository
+globalThis.qwebrPackageRepoURLS = [{{RPACKAGEREPOURLS}}];
+
+// Check to see if we have an empty array, if we do set to skip the installation.
+globalThis.qwebrSetupRPackages = !(qwebrInstallRPackagesList.indexOf("") !== -1);
+globalThis.qwebrAutoloadRPackages = {{AUTOLOADRPACKAGES}};
+
+// Display a startup message?
+globalThis.qwebrShowStartupMessage = {{SHOWSTARTUPMESSAGE}};
+globalThis.qwebrShowHeaderMessage = {{SHOWHEADERMESSAGE}};
+
+// Describe the webR settings that should be used
+globalThis.qwebrCustomizedWebROptions = {
+ "baseURL": "{{BASEURL}}",
+ "serviceWorkerUrl": "{{SERVICEWORKERURL}}",
+ "homedir": "{{HOMEDIR}}",
+ "channelType": "{{CHANNELTYPE}}"
+};
+
+// Store cell data
+globalThis.qwebrCellDetails = {{QWEBRCELLDETAILS}};
diff --git a/book/_extensions/coatless/webr/qwebr-document-status.js b/book/_extensions/coatless/webr/qwebr-document-status.js
new file mode 100644
index 0000000000..c13a5f5277
--- /dev/null
+++ b/book/_extensions/coatless/webr/qwebr-document-status.js
@@ -0,0 +1,92 @@
+// Declare startupMessageQWebR globally
+globalThis.qwebrStartupMessage = document.createElement("p");
+
+
+// Function to set the button text
+globalThis.qwebrSetInteractiveButtonState = function(buttonText, enableCodeButton = true) {
+ document.querySelectorAll(".qwebr-button-run").forEach((btn) => {
+ btn.innerHTML = buttonText;
+ btn.disabled = !enableCodeButton;
+ });
+}
+
+// Function to update the status message in non-interactive cells
+globalThis.qwebrUpdateStatusMessage = function(message) {
+ document.querySelectorAll(".qwebr-status-text.qwebr-cell-needs-evaluation").forEach((elem) => {
+ elem.innerText = message;
+ });
+}
+
+// Function to update the status message
+globalThis.qwebrUpdateStatusHeader = function(message) {
+ qwebrStartupMessage.innerHTML = `
+
+ ${message}`;
+}
+
+// Function that attaches the document status message and diagnostics
+function displayStartupMessage(showStartupMessage, showHeaderMessage) {
+ if (!showStartupMessage) {
+ return;
+ }
+
+ // Get references to header elements
+ const headerHTML = document.getElementById("title-block-header");
+ const headerRevealJS = document.getElementById("title-slide");
+
+ // Create the outermost div element for metadata
+ const quartoTitleMeta = document.createElement("div");
+ quartoTitleMeta.classList.add("quarto-title-meta");
+
+ // Create the first inner div element
+ const firstInnerDiv = document.createElement("div");
+ firstInnerDiv.setAttribute("id", "qwebr-status-message-area");
+
+ // Create the second inner div element for "WebR Status" heading and contents
+ const secondInnerDiv = document.createElement("div");
+ secondInnerDiv.setAttribute("id", "qwebr-status-message-title");
+ secondInnerDiv.classList.add("quarto-title-meta-heading");
+ secondInnerDiv.innerText = "WebR Status";
+
+ // Create another inner div for contents
+ const secondInnerDivContents = document.createElement("div");
+ secondInnerDivContents.setAttribute("id", "qwebr-status-message-body");
+ secondInnerDivContents.classList.add("quarto-title-meta-contents");
+
+ // Describe the WebR state
+ qwebrStartupMessage.innerText = "🟡 Loading...";
+ qwebrStartupMessage.setAttribute("id", "qwebr-status-message-text");
+ // Add `aria-live` to auto-announce the startup status to screen readers
+ qwebrStartupMessage.setAttribute("aria-live", "assertive");
+
+ // Append the startup message to the contents
+ secondInnerDivContents.appendChild(qwebrStartupMessage);
+
+ // Add a status indicator for COOP and COEP Headers if needed
+ if (showHeaderMessage) {
+ const crossOriginMessage = document.createElement("p");
+ crossOriginMessage.innerText = `${crossOriginIsolated ? '🟢' : '🟡'} COOP & COEP Headers`;
+ crossOriginMessage.setAttribute("id", "qwebr-coop-coep-header");
+ secondInnerDivContents.appendChild(crossOriginMessage);
+ }
+
+ // Combine the inner divs and contents
+ firstInnerDiv.appendChild(secondInnerDiv);
+ firstInnerDiv.appendChild(secondInnerDivContents);
+ quartoTitleMeta.appendChild(firstInnerDiv);
+
+ // Determine where to insert the quartoTitleMeta element
+ if (headerHTML || headerRevealJS) {
+ // Append to the existing "title-block-header" element or "title-slide" div
+ (headerHTML || headerRevealJS).appendChild(quartoTitleMeta);
+ } else {
+ // If neither headerHTML nor headerRevealJS is found, insert after "webr-monaco-editor-init" script
+ const monacoScript = document.getElementById("qwebr-monaco-editor-init");
+ const header = document.createElement("header");
+ header.setAttribute("id", "title-block-header");
+ header.appendChild(quartoTitleMeta);
+ monacoScript.after(header);
+ }
+}
+
+displayStartupMessage(qwebrShowStartupMessage, qwebrShowHeaderMessage);
\ No newline at end of file
diff --git a/book/_extensions/coatless/webr/qwebr-monaco-editor-element.js b/book/_extensions/coatless/webr/qwebr-monaco-editor-element.js
new file mode 100644
index 0000000000..24552861ed
--- /dev/null
+++ b/book/_extensions/coatless/webr/qwebr-monaco-editor-element.js
@@ -0,0 +1,171 @@
+// Global array to store Monaco Editor instances
+globalThis.qwebrEditorInstances = [];
+
+// Function that builds and registers a Monaco Editor instance
+globalThis.qwebrCreateMonacoEditorInstance = function (cellData) {
+
+ const initialCode = cellData.code;
+ const qwebrCounter = cellData.id;
+ const qwebrOptions = cellData.options;
+
+ // Retrieve the previously created document elements
+ let runButton = document.getElementById(`qwebr-button-run-${qwebrCounter}`);
+ let resetButton = document.getElementById(`qwebr-button-reset-${qwebrCounter}`);
+ let copyButton = document.getElementById(`qwebr-button-copy-${qwebrCounter}`);
+ let editorDiv = document.getElementById(`qwebr-editor-${qwebrCounter}`);
+
+ // Load the Monaco Editor and create an instance
+ let editor;
+ require(['vs/editor/editor.main'], function () {
+ editor = monaco.editor.create(editorDiv, {
+ value: initialCode,
+ language: 'r',
+ theme: 'vs-light',
+ automaticLayout: true, // Works wonderfully with RevealJS
+ scrollBeyondLastLine: false,
+ minimap: {
+ enabled: false
+ },
+ fontSize: qwebrScaledFontSize(editorDiv, qwebrOptions),
+ renderLineHighlight: "none", // Disable current line highlighting
+ hideCursorInOverviewRuler: true, // Remove cursor indictor in right hand side scroll bar
+ readOnly: qwebrOptions['read-only'] ?? false,
+ quickSuggestions: qwebrOptions['editor-quick-suggestions'] ?? false
+ });
+
+ // Store the official counter ID to be used in keyboard shortcuts
+ editor.__qwebrCounter = qwebrCounter;
+
+ // Store the official div container ID
+ editor.__qwebrEditorId = `qwebr-editor-${qwebrCounter}`;
+
+ // Store the initial code value and options
+ editor.__qwebrinitialCode = initialCode;
+ editor.__qwebrOptions = qwebrOptions;
+
+ // Set at the model level the preferred end of line (EOL) character to LF.
+ // This prevent `\r\n` from being given to the webR engine if the user is on Windows.
+ // See details in: https://github.com/coatless/quarto-webr/issues/94
+ // Associated error text:
+ // Error: :1:7 unexpected input
+
+ // Retrieve the underlying model
+ const model = editor.getModel();
+ // Set EOL for the model
+ model.setEOL(monaco.editor.EndOfLineSequence.LF);
+
+ // Dynamically modify the height of the editor window if new lines are added.
+ let ignoreEvent = false;
+ const updateHeight = () => {
+ // Increment editor height by 2 to prevent vertical scroll bar from appearing
+ const contentHeight = editor.getContentHeight() + 2;
+
+ // Retrieve editor-max-height option
+ const maxEditorHeight = qwebrOptions['editor-max-height'];
+
+ // If editor-max-height is missing, allow infinite growth. Otherwise, threshold.
+ const editorHeight = !maxEditorHeight ? contentHeight : Math.min(contentHeight, maxEditorHeight);
+
+ // We're avoiding a width change
+ //editorDiv.style.width = `${width}px`;
+ editorDiv.style.height = `${editorHeight}px`;
+ try {
+ ignoreEvent = true;
+
+ // The key to resizing is this call
+ editor.layout();
+ } finally {
+ ignoreEvent = false;
+ }
+ };
+
+ // Helper function to check if selected text is empty
+ function isEmptyCodeText(selectedCodeText) {
+ return (selectedCodeText === null || selectedCodeText === undefined || selectedCodeText === "");
+ }
+
+ // Registry of keyboard shortcuts that should be re-added to each editor window
+ // when focus changes.
+ const addWebRKeyboardShortCutCommands = () => {
+ // Add a keydown event listener for Shift+Enter to run all code in cell
+ editor.addCommand(monaco.KeyMod.Shift | monaco.KeyCode.Enter, () => {
+
+ // Retrieve all text inside the editor
+ qwebrExecuteCode(editor.getValue(), editor.__qwebrCounter, editor.__qwebrOptions);
+ });
+
+ // Add a keydown event listener for CMD/Ctrl+Enter to run selected code
+ editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter, () => {
+
+ // Get the selected text from the editor
+ const selectedText = editor.getModel().getValueInRange(editor.getSelection());
+ // Check if no code is selected
+ if (isEmptyCodeText(selectedText)) {
+ // Obtain the current cursor position
+ let currentPosition = editor.getPosition();
+ // Retrieve the current line content
+ let currentLine = editor.getModel().getLineContent(currentPosition.lineNumber);
+
+ // Propose a new position to move the cursor to
+ let newPosition = new monaco.Position(currentPosition.lineNumber + 1, 1);
+
+ // Check if the new position is beyond the last line of the editor
+ if (newPosition.lineNumber > editor.getModel().getLineCount()) {
+ // Add a new line at the end of the editor
+ editor.executeEdits("addNewLine", [{
+ range: new monaco.Range(newPosition.lineNumber, 1, newPosition.lineNumber, 1),
+ text: "\n",
+ forceMoveMarkers: true,
+ }]);
+ }
+
+ // Run the entire line of code.
+ qwebrExecuteCode(currentLine, editor.__qwebrCounter, editor.__qwebrOptions);
+
+ // Move cursor to new position
+ editor.setPosition(newPosition);
+ } else {
+ // Code to run when Ctrl+Enter is pressed with selected code
+ qwebrExecuteCode(selectedText, editor.__qwebrCounter, editor.__qwebrOptions);
+ }
+ });
+ }
+
+ // Register an on focus event handler for when a code cell is selected to update
+ // what keyboard shortcut commands should work.
+ // This is a workaround to fix a regression that happened with multiple
+ // editor windows since Monaco 0.32.0
+ // https://github.com/microsoft/monaco-editor/issues/2947
+ editor.onDidFocusEditorText(addWebRKeyboardShortCutCommands);
+
+ // Register an on change event for when new code is added to the editor window
+ editor.onDidContentSizeChange(updateHeight);
+
+ // Manually re-update height to account for the content we inserted into the call
+ updateHeight();
+
+ // Store the editor instance in the global dictionary
+ qwebrEditorInstances[editor.__qwebrCounter] = editor;
+
+ });
+
+ // Add a click event listener to the run button
+ runButton.onclick = function () {
+ qwebrExecuteCode(editor.getValue(), editor.__qwebrCounter, editor.__qwebrOptions);
+ };
+
+ // Add a click event listener to the reset button
+ copyButton.onclick = function () {
+ // Retrieve current code data
+ const data = editor.getValue();
+
+ // Write code data onto the clipboard.
+ navigator.clipboard.writeText(data || "");
+ };
+
+ // Add a click event listener to the copy button
+ resetButton.onclick = function () {
+ editor.setValue(editor.__qwebrinitialCode);
+ };
+
+}
\ No newline at end of file
diff --git a/book/_extensions/coatless/webr/qwebr-monaco-editor-init.html b/book/_extensions/coatless/webr/qwebr-monaco-editor-init.html
new file mode 100644
index 0000000000..af846d8ec0
--- /dev/null
+++ b/book/_extensions/coatless/webr/qwebr-monaco-editor-init.html
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/book/_extensions/coatless/webr/qwebr-styling.css b/book/_extensions/coatless/webr/qwebr-styling.css
new file mode 100644
index 0000000000..2ee49bd83c
--- /dev/null
+++ b/book/_extensions/coatless/webr/qwebr-styling.css
@@ -0,0 +1,173 @@
+.monaco-editor pre {
+ background-color: unset !important;
+}
+
+.qwebr-editor-toolbar {
+ width: 100%;
+ display: flex;
+ justify-content: space-between;
+ box-sizing: border-box;
+}
+
+.qwebr-editor-toolbar-left-buttons, .qwebr-editor-toolbar-right-buttons {
+ display: flex;
+}
+
+.qwebr-non-interactive-loading-container.qwebr-cell-needs-evaluation, .qwebr-non-interactive-loading-container.qwebr-cell-evaluated {
+ justify-content: center;
+ display: flex;
+ background-color: rgba(250, 250, 250, 0.65);
+ border: 1px solid rgba(233, 236, 239, 0.65);
+ border-radius: 0.5rem;
+ margin-top: 15px;
+ margin-bottom: 15px;
+}
+
+.qwebr-r-project-logo {
+ color: #2767B0; /* R Project's blue color */
+}
+
+.qwebr-icon-status-spinner {
+ color: #7894c4;
+}
+
+.qwebr-icon-run-code {
+ color: #0d9c29
+}
+
+body.quarto-light .qwebr-output-code-stdout {
+ color: #111;
+}
+
+body.quarto-dark .qwebr-output-code-stdout {
+ color: #EEE;
+}
+
+.qwebr-output-code-stderr {
+ color: #db4133;
+}
+
+body.quarto-light .qwebr-editor {
+ border: 1px solid #EEEEEE;
+}
+
+body.quarto-light .qwebr-editor-toolbar {
+ background-color: #EEEEEE;
+ padding: 0.2rem 0.5rem;
+}
+
+body.quarto-dark .qwebr-editor {
+ border: 1px solid #111;
+}
+
+body.quarto-dark .qwebr-editor-toolbar {
+ background-color: #111;
+ padding: 0.2rem 0.5rem;
+}
+
+.qwebr-button {
+ display: inline-block;
+ font-weight: 400;
+ line-height: 1;
+ text-decoration: none;
+ text-align: center;
+ padding: 0.375rem 0.75rem;
+ font-size: .9rem;
+ border-radius: 0.25rem;
+ transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;
+}
+
+body.quarto-light .qwebr-button {
+ background-color: #EEEEEE;
+ color: #000;
+ border-color: #dee2e6;
+ border: 1px solid rgba(0,0,0,0);
+}
+
+body.quarto-dark .qwebr-button {
+ background-color: #111;
+ color: #EEE;
+ border-color: #dee2e6;
+ border: 1px solid rgba(0,0,0,0);
+}
+
+body.quarto-light .qwebr-button:hover {
+ color: #000;
+ background-color: #d9dce0;
+ border-color: #c8ccd0;
+}
+
+body.quarto-dark .qwebr-button:hover {
+ color: #d9dce0;
+ background-color: #323232;
+ border-color: #d9dce0;
+}
+
+.qwebr-button:disabled,.qwebr-button.disabled,fieldset:disabled .qwebr-button {
+ pointer-events: none;
+ opacity: .65
+}
+
+.qwebr-button-reset {
+ color: #696969; /*#4682b4;*/
+}
+
+.qwebr-button-copy {
+ color: #696969;
+}
+
+
+/* Custom styling for RevealJS Presentations*/
+
+/* Reset the style of the interactive area */
+.reveal div.qwebr-interactive-area {
+ display: block;
+ box-shadow: none;
+ max-width: 100%;
+ max-height: 100%;
+ margin: 0;
+ padding: 0;
+}
+
+/* Provide space to entries */
+.reveal div.qwebr-output-code-area pre div {
+ margin: 1px 2px 1px 10px;
+}
+
+/* Collapse the inside code tags to avoid extra space between line outputs */
+.reveal pre div code.qwebr-output-code-stdout, .reveal pre div code.qwebr-output-code-stderr {
+ padding: 0;
+ display: contents;
+}
+
+body.reveal.quarto-light pre div code.qwebr-output-code-stdout {
+ color: #111;
+}
+
+body.reveal.quarto-dark pre div code.qwebr-output-code-stdout {
+ color: #EEEEEE;
+}
+
+.reveal pre div code.qwebr-output-code-stderr {
+ color: #db4133;
+}
+
+
+/* Create a border around console and output (does not effect graphs) */
+body.reveal.quarto-light div.qwebr-console-area {
+ border: 1px solid #EEEEEE;
+ box-shadow: 2px 2px 10px #EEEEEE;
+}
+
+body.reveal.quarto-dark div.qwebr-console-area {
+ border: 1px solid #111;
+ box-shadow: 2px 2px 10px #111;
+}
+
+
+/* Cap output height and allow text to scroll */
+/* TODO: Is there a better way to fit contents/max it parallel to the monaco editor size? */
+.reveal div.qwebr-output-code-area pre {
+ max-height: 400px;
+ overflow: scroll;
+}
diff --git a/book/_extensions/coatless/webr/qwebr-theme-switch.js b/book/_extensions/coatless/webr/qwebr-theme-switch.js
new file mode 100644
index 0000000000..efefc66602
--- /dev/null
+++ b/book/_extensions/coatless/webr/qwebr-theme-switch.js
@@ -0,0 +1,42 @@
+// Function to update Monaco Editors when body class changes
+function updateMonacoEditorsOnBodyClassChange() {
+ // Select the body element
+ const body = document.querySelector('body');
+
+ // Options for the observer (which mutations to observe)
+ const observerOptions = {
+ attributes: true, // Observe changes to attributes
+ attributeFilter: ['class'] // Only observe changes to the 'class' attribute
+ };
+
+ // Callback function to execute when mutations are observed
+ const bodyClassChangeCallback = function(mutationsList, observer) {
+ for(let mutation of mutationsList) {
+ if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
+ // Class attribute has changed
+ // Update all Monaco Editors on the page
+ updateMonacoEditorTheme();
+ }
+ }
+ };
+
+ // Create an observer instance linked to the callback function
+ const observer = new MutationObserver(bodyClassChangeCallback);
+
+ // Start observing the target node for configured mutations
+ observer.observe(body, observerOptions);
+}
+
+// Function to update all instances of Monaco Editors on the page
+function updateMonacoEditorTheme() {
+ // Determine what VS Theme to use
+ const vsThemeToUse = document.body.classList.contains("quarto-dark") ? 'vs-dark' : 'vs' ;
+
+ // Iterate through all initialized Monaco Editors
+ qwebrEditorInstances.forEach( function(editorInstance) {
+ editorInstance.updateOptions({ theme: vsThemeToUse });
+ });
+}
+
+// Call the function to start observing changes to body class
+updateMonacoEditorsOnBodyClassChange();
\ No newline at end of file
diff --git a/book/_extensions/coatless/webr/template.qmd b/book/_extensions/coatless/webr/template.qmd
new file mode 100644
index 0000000000..79b63a18d8
--- /dev/null
+++ b/book/_extensions/coatless/webr/template.qmd
@@ -0,0 +1,36 @@
+---
+title: "WebR-enabled code cell"
+format: html
+engine: knitr
+#webr:
+# show-startup-message: false # Disable display of webR initialization state
+# show-header-message: true # Display whether COOP&COEP headers are set for speed.
+# packages: ['ggplot2', 'dplyr'] # Pre-install dependencies
+# autoload-packages: false # Disable automatic library calls on R packages specified in packages.
+# repos: # Specify repositories to check for custom packages
+# - https://github-username.github.io/reponame
+# - https://username.r-universe.dev
+# channel-type: 'post-message' # Specify a specific communication channel type.
+# home-dir: "/home/rstudio" # Customize where the working directory is
+# base-url: '' # Base URL used for downloading R WebAssembly binaries
+# service-worker-url: '' # URL from where to load JavaScript worker scripts when loading webR with the ServiceWorker communication channel.
+filters:
+- webr
+---
+
+## Demo
+
+This is a webr-enabled code cell in a Quarto HTML document.
+
+```{webr-r}
+1 + 1
+```
+
+```{webr-r}
+fit = lm(mpg ~ am, data = mtcars)
+summary(fit)
+```
+
+```{webr-r}
+plot(pressure)
+```
diff --git a/book/_extensions/coatless/webr/webr-serviceworker.js b/book/_extensions/coatless/webr/webr-serviceworker.js
new file mode 100644
index 0000000000..ab830893d9
--- /dev/null
+++ b/book/_extensions/coatless/webr/webr-serviceworker.js
@@ -0,0 +1 @@
+importScripts('https://webr.r-wasm.org/v0.3.1/webr-serviceworker.js');
diff --git a/book/_extensions/coatless/webr/webr-worker.js b/book/_extensions/coatless/webr/webr-worker.js
new file mode 100644
index 0000000000..a7b3d5c478
--- /dev/null
+++ b/book/_extensions/coatless/webr/webr-worker.js
@@ -0,0 +1 @@
+importScripts('https://webr.r-wasm.org/v0.3.1/webr-worker.js');
diff --git a/book/_extensions/coatless/webr/webr.lua b/book/_extensions/coatless/webr/webr.lua
new file mode 100644
index 0000000000..6cb055999e
--- /dev/null
+++ b/book/_extensions/coatless/webr/webr.lua
@@ -0,0 +1,636 @@
+----
+--- Setup variables for default initialization
+
+-- Define a variable to check if webR is present.
+local missingWebRCell = true
+
+-- Define a variable to check if webR was initialized for the page
+local hasDoneWebRSetup = false
+
+--- Setup default initialization values
+-- Default values taken from:
+-- https://docs.r-wasm.org/webr/latest/api/js/interfaces/WebR.WebROptions.html
+
+-- Define a base compatibile version
+local baseVersionWebR = "0.3.1"
+
+-- Define where WebR can be found
+local baseUrl = "https://webr.r-wasm.org/v".. baseVersionWebR .."/"
+local serviceWorkerUrl = ""
+
+-- Define the webR communication protocol
+local channelType = "ChannelType.Automatic"
+
+-- Define a variable to suppress exporting service workers if not required.
+-- (e.g. skipped for PostMessage or SharedArrayBuffer)
+local hasServiceWorkerFiles = true
+
+-- Define user directory
+local homeDir = "/home/web_user"
+
+-- Define whether a startup message should be displayed
+local showStartUpMessage = "true"
+
+-- Define whether header type messages should be displayed
+local showHeaderMessage = "false"
+
+-- Define a default repository URL
+local defaultRepoURL = "'https://repo.r-wasm.org/'"
+
+-- Define possible repo URLs
+local rPackageRepoURLS = defaultRepoURL
+
+-- Define an empty string if no packages need to be installed.
+local installRPackagesList = "''"
+
+-- Define whether R packages should automatically be loaded
+local autoloadRPackages = "true"
+----
+
+--- Setup variables for tracking number of code cells
+
+-- Define a counter variable
+local qwebrCounter = 0
+
+-- Initialize a table to store the CodeBlock elements
+local qwebrCapturedCodeBlocks = {}
+
+-- Initialize a table that contains the default cell-level options
+local qwebRDefaultCellOptions = {
+ ["context"] = "interactive",
+ ["warning"] = "true",
+ ["message"] = "true",
+ ["results"] = "markup",
+ ["output"] = "true",
+ ["comment"] = "",
+ ["label"] = "",
+ ["autorun"] = "",
+ ["read-only"] = "false",
+ ["classes"] = "",
+ ["dpi"] = 72,
+ ["fig-cap"] = "",
+ ["fig-width"] = 7,
+ ["fig-height"] = 5,
+ ["out-width"] = "700px",
+ ["out-height"] = "",
+ ["editor-font-scale"] = 1,
+ ["editor-max-height"] = "",
+ ["editor-quick-suggestions"] = "false"
+}
+
+----
+--- Process initialization
+
+-- Check if variable missing or an empty string
+local function isVariableEmpty(s)
+ return s == nil or s == ''
+end
+
+-- Check if variable is present
+local function isVariablePopulated(s)
+ return not isVariableEmpty(s)
+end
+
+-- Copy the top level value and its direct children
+-- Details: http://lua-users.org/wiki/CopyTable
+local function shallowcopy(original)
+ -- Determine if its a table
+ if type(original) == 'table' then
+ -- Copy the top level to remove references
+ local copy = {}
+ for key, value in pairs(original) do
+ copy[key] = value
+ end
+ -- Return the copy
+ return copy
+ else
+ -- If original is not a table, return it directly since it's already a copy
+ return original
+ end
+end
+
+-- Custom method for cloning a table with a shallow copy.
+function table.clone(original)
+ return shallowcopy(original)
+end
+
+local function mergeCellOptions(localOptions)
+ -- Copy default options to the mergedOptions table
+ local mergedOptions = table.clone(qwebRDefaultCellOptions)
+
+ -- Override default options with local options
+ for key, value in pairs(localOptions) do
+ if type(value) == "string" then
+ value = value:gsub("[\"']", "")
+ end
+ mergedOptions[key] = value
+ end
+
+ -- Return the customized options
+ return mergedOptions
+end
+
+-- Convert the communication channel meta option into a WebROptions.channelType option
+local function convertMetaChannelTypeToWebROption(input)
+ -- Create a table of conditions
+ local conditions = {
+ ["automatic"] = "ChannelType.Automatic",
+ [0] = "ChannelType.Automatic",
+ ["shared-array-buffer"] = "ChannelType.SharedArrayBuffer",
+ [1] = "ChannelType.SharedArrayBuffer",
+ ["service-worker"] = "ChannelType.ServiceWorker",
+ [2] = "ChannelType.ServiceWorker",
+ ["post-message"] = "ChannelType.PostMessage",
+ [3] = "ChannelType.PostMessage",
+ }
+ -- Subset the table to obtain the communication channel.
+ -- If the option isn't found, return automatic.
+ return conditions[input] or "ChannelType.Automatic"
+end
+
+
+-- Parse the different webr options set in the YAML frontmatter, e.g.
+--
+-- ```yaml
+-- ----
+-- webr:
+-- base-url: https://webr.r-wasm.org/[version]
+-- service-worker-url: path/to/workers/{webr-serviceworker.js, webr-worker.js}
+-- ----
+-- ```
+--
+--
+function setWebRInitializationOptions(meta)
+
+ -- Let's explore the meta variable data!
+ -- quarto.log.output(meta)
+
+ -- Retrieve the webr options from meta
+ local webr = meta.webr
+
+ -- Does this exist? If not, just return meta as we'll just use the defaults.
+ if isVariableEmpty(webr) then
+ return meta
+ end
+
+ -- Allow modification of code cells global defaults
+ if isVariablePopulated(webr["cell-options"]) then
+ for index, value in pairs(webr["cell-options"]) do
+ qwebRDefaultCellOptions[index] = pandoc.utils.stringify(value)
+ end
+ end
+
+
+ -- The base URL used for downloading R WebAssembly binaries
+ -- https://webr.r-wasm.org/[version]/webr.mjs
+ -- Documentation:
+ -- https://docs.r-wasm.org/webr/latest/api/js/interfaces/WebR.WebROptions.html#baseurl
+ if isVariablePopulated(webr["base-url"]) then
+ baseUrl = pandoc.utils.stringify(webr["base-url"])
+ end
+
+ -- The communication channel mode webR uses to connect R with the web browser
+ -- Default: "ChannelType.Automatic"
+ -- Documentation:
+ -- https://docs.r-wasm.org/webr/latest/api/js/interfaces/WebR.WebROptions.html#channeltype
+ if isVariablePopulated(webr["channel-type"]) then
+ channelType = convertMetaChannelTypeToWebROption(pandoc.utils.stringify(webr["channel-type"]))
+
+ -- Starting from webR v0.2.2, service workers are only deployed when explicitly requested.
+ hasServiceWorkerFiles = (channelType == "ChannelType.ServiceWorker")
+ end
+
+ -- The base URL from where to load JavaScript worker scripts when loading webR
+ -- with the ServiceWorker communication channel mode.
+ -- Documentation:
+ -- https://docs.r-wasm.org/webr/latest/api/js/interfaces/WebR.WebROptions.html#serviceworkerurl
+ if isVariablePopulated(webr["service-worker-url"]) then
+ serviceWorkerUrl = pandoc.utils.stringify(webr["service-worker-url"])
+ end
+
+ -- The WebAssembly user's home directory and initial working directory. Default: '/home/web_user'
+ -- Documentation:
+ -- https://docs.r-wasm.org/webr/latest/api/js/interfaces/WebR.WebROptions.html#homedir
+ if isVariablePopulated(webr['home-dir']) then
+ homeDir = pandoc.utils.stringify(webr["home-dir"])
+ end
+
+ -- Display a startup message indicating the WebR state at the top of the document.
+ if isVariablePopulated(webr['show-startup-message']) then
+ showStartUpMessage = pandoc.utils.stringify(webr["show-startup-message"])
+ end
+
+ -- Display a startup message indicating the WebR state at the top of the document.
+ if isVariablePopulated(webr['show-header-message']) then
+ showHeaderMessage = pandoc.utils.stringify(webr["show-header-message"])
+ if showHeaderMessage == "true" then
+ showStartUpMessage = "true"
+ end
+ end
+
+ -- Attempt to install different packages.
+ if isVariablePopulated(webr["repos"]) then
+ -- Create a custom list
+ local repoURLList = {}
+
+ -- Iterate through each list item and enclose it in quotes
+ for _, repoURL in pairs(webr["repos"]) do
+ table.insert(repoURLList, "'" .. pandoc.utils.stringify(repoURL) .. "'")
+ end
+
+ -- Add default repo URL
+ table.insert(repoURLList, defaultRepoURL)
+
+ -- Combine URLs
+ rPackageRepoURLS = table.concat(repoURLList, ", ")
+ end
+
+ -- Attempt to install different packages.
+ if isVariablePopulated(webr["packages"]) then
+ -- Create a custom list
+ local package_list = {}
+
+ -- Iterate through each list item and enclose it in quotes
+ for _, package_name in pairs(webr["packages"]) do
+ table.insert(package_list, "'" .. pandoc.utils.stringify(package_name) .. "'")
+ end
+
+ installRPackagesList = table.concat(package_list, ", ")
+
+ if isVariablePopulated(webr['autoload-packages']) then
+ autoloadRPackages = pandoc.utils.stringify(webr["autoload-packages"])
+ end
+
+ end
+
+ return meta
+end
+
+
+-- Obtain a template file
+local function readTemplateFile(template)
+ -- Establish a hardcoded path to where the .html partial resides
+ -- Note, this should be at the same level as the lua filter.
+ -- This is crazy fragile since Lua lacks a directory representation (!?!?)
+ -- https://quarto.org/docs/extensions/lua-api.html#includes
+ local path = quarto.utils.resolve_path(template)
+
+ -- Let's hopefully read the template file...
+
+ -- Open the template file
+ local file = io.open(path, "r")
+
+ -- Check if null pointer before grabbing content
+ if not file then
+ error("\nWe were unable to read the template file `" .. template .. "` from the extension directory.\n\n" ..
+ "Double check that the extension is fully available by comparing the \n" ..
+ "`_extensions/coatless/webr` directory with the main repository:\n" ..
+ "https://github.com/coatless/quarto-webr/tree/main/_extensions/webr\n\n" ..
+ "You may need to modify `.gitignore` to allow the extension files using:\n" ..
+ "!_extensions/*/*/*\n")
+ return nil
+ end
+
+ -- *a or *all reads the whole file
+ local content = file:read "*a"
+
+ -- Close the file
+ file:close()
+
+ -- Return contents
+ return content
+end
+
+----
+
+-- Define a function to replace keywords given by {{ WORD }}
+-- Is there a better lua-approach?
+local function substitute_in_file(contents, substitutions)
+
+ -- Substitute values in the contents of the file
+ contents = contents:gsub("{{%s*(.-)%s*}}", substitutions)
+
+ -- Return the contents of the file with substitutions
+ return contents
+end
+
+-- Define a function that escape control sequence
+local function escapeControlSequences(str)
+ -- Perform a global replacement on the control sequence character
+ return str:gsub("[\\%c]", function(c)
+ if c == "\\" then
+ -- Escape backslash
+ return "\\\\"
+ end
+ end)
+end
+
+----
+
+-- Pass document-level data into the header to initialize the document.
+local function initializationWebRDocumentSettings()
+
+ -- Setup different WebR specific initialization variables
+ local substitutions = {
+ ["SHOWSTARTUPMESSAGE"] = showStartUpMessage, -- tostring()
+ ["SHOWHEADERMESSAGE"] = showHeaderMessage,
+ ["BASEURL"] = baseUrl,
+ ["CHANNELTYPE"] = channelType,
+ ["SERVICEWORKERURL"] = serviceWorkerUrl,
+ ["HOMEDIR"] = homeDir,
+ ["INSTALLRPACKAGESLIST"] = installRPackagesList,
+ ["AUTOLOADRPACKAGES"] = autoloadRPackages,
+ ["RPACKAGEREPOURLS"] = rPackageRepoURLS,
+ ["QWEBRCELLDETAILS"] = quarto.json.encode(qwebrCapturedCodeBlocks)
+ -- ["VERSION"] = baseVersionWebR
+ }
+
+ -- Make sure we perform a copy
+ local initializationTemplate = readTemplateFile("qwebr-document-settings.js")
+
+ -- Make the necessary substitutions
+ local initializedWebRConfiguration = substitute_in_file(initializationTemplate, substitutions)
+
+ return initializedWebRConfiguration
+end
+
+local function generateHTMLElement(tag)
+ -- Store a map containing opening and closing tabs
+ local tagMappings = {
+ js = { opening = "" },
+ css = { opening = "" }
+ }
+
+ -- Find the tag
+ local tagMapping = tagMappings[tag]
+
+ -- If present, extract tag and return
+ if tagMapping then
+ return tagMapping.opening, tagMapping.closing
+ else
+ quarto.log.error("Invalid tag specified")
+ end
+end
+
+-- Custom functions to include values into Quarto
+-- https://quarto.org/docs/extensions/lua-api.html#includes
+
+local function includeTextInHTMLTag(location, text, tag)
+
+ -- Obtain the HTML element opening and closing tag
+ local openingTag, closingTag = generateHTMLElement(tag)
+
+ -- Insert the file into the document using the correct opening and closing tags
+ quarto.doc.include_text(location, openingTag .. text .. closingTag)
+
+end
+
+local function includeFileInHTMLTag(location, file, tag)
+
+ -- Obtain the HTML element opening and closing tag
+ local openingTag, closingTag = generateHTMLElement(tag)
+
+ -- Retrieve the file contents
+ local fileContents = readTemplateFile(file)
+
+ -- Insert the file into the document using the correct opening and closing tags
+ quarto.doc.include_text(location, openingTag .. fileContents .. closingTag)
+
+end
+
+-- Setup WebR's pre-requisites once per document.
+local function ensureWebRSetup()
+
+ -- If we've included the initialization, then bail.
+ if hasDoneWebRSetup then
+ return
+ end
+
+ -- Otherwise, let's include the initialization script _once_
+ hasDoneWebRSetup = true
+
+ -- Embed Support Files to Avoid Resource Registration Issues
+ -- Note: We're not able to use embed-resources due to the web assembly binary and the potential for additional service worker files.
+ quarto.doc.include_text("in-header", [[
+
+
+ ]])
+
+ -- Insert the extension styling for defined elements
+ includeFileInHTMLTag("in-header", "qwebr-styling.css", "css")
+
+ -- Insert the customized startup procedure
+ includeTextInHTMLTag("in-header", initializationWebRDocumentSettings(), "js")
+
+ -- Insert JS routine to add document status header
+ includeFileInHTMLTag("in-header", "qwebr-document-status.js", "js")
+
+ -- Insert the extension element creation scripts
+ includeFileInHTMLTag("in-header", "qwebr-cell-elements.js", "js")
+
+ -- Insert JS routine to bring webR online
+ includeFileInHTMLTag("in-header", "qwebr-document-engine-initialization.js", "js")
+
+ -- Insert the cell data at the end of the document
+ includeFileInHTMLTag("after-body", "qwebr-cell-initialization.js", "js")
+
+ -- Insert the extension computational engine that calls webR
+ includeFileInHTMLTag("in-header", "qwebr-compute-engine.js", "js")
+
+ -- Insert the monaco editor initialization
+ quarto.doc.include_file("before-body", "qwebr-monaco-editor-init.html")
+
+ includeFileInHTMLTag("before-body", "qwebr-theme-switch.js", "js")
+
+ -- Insert the extension styling for defined elements
+ includeFileInHTMLTag("before-body", "qwebr-monaco-editor-element.js", "js")
+
+ -- If the ChannelType requires service workers, register and copy them into the
+ -- output directory.
+ if hasServiceWorkerFiles then
+ -- Copy the two web workers into the directory
+ -- https://quarto.org/docs/extensions/lua-api.html#dependencies
+ quarto.doc.add_html_dependency({
+ name = "webr-worker",
+ version = baseVersionWebR,
+ seviceworkers = {"webr-worker.js"}, -- Kept to avoid error text.
+ serviceworkers = {"webr-worker.js"}
+ })
+
+ quarto.doc.add_html_dependency({
+ name = "webr-serviceworker",
+ version = baseVersionWebR,
+ seviceworkers = {"webr-serviceworker.js"}, -- Kept to avoid error text.
+ serviceworkers = {"webr-serviceworker.js"}
+ })
+ end
+
+end
+
+local function qwebrJSCellInsertionCode(counter)
+ local insertionLocation = '\n'
+ local noscriptWarning = ''
+ return insertionLocation .. noscriptWarning
+end
+
+-- Remove lines with only whitespace until the first non-whitespace character is detected.
+local function removeEmptyLinesUntilContent(codeText)
+ -- Iterate through each line in the codeText table
+ for _, value in ipairs(codeText) do
+ -- Detect leading whitespace (newline, return character, or empty space)
+ local detectedWhitespace = string.match(value, "^%s*$")
+
+ -- Check if the detectedWhitespace is either an empty string or nil
+ -- This indicates whitespace was detected
+ if isVariableEmpty(detectedWhitespace) then
+ -- Delete empty space
+ table.remove(codeText, 1)
+ else
+ -- Stop the loop as we've now have content
+ break
+ end
+ end
+
+ -- Return the modified table
+ return codeText
+end
+
+-- Extract Quarto code cell options from the block's text
+local function extractCodeBlockOptions(block)
+
+ -- Access the text aspect of the code block
+ local code = block.text
+
+ -- Define two local tables:
+ -- the block's attributes
+ -- the block's code lines
+ local cellOptions = {}
+ local newCodeLines = {}
+
+ -- Iterate over each line in the code block
+ for line in code:gmatch("([^\r\n]*)[\r\n]?") do
+ -- Check if the line starts with "#|" and extract the key-value pairing
+ -- e.g. #| key: value goes to cellOptions[key] -> value
+ local key, value = line:match("^#|%s*(.-):%s*(.-)%s*$")
+
+ -- If a special comment is found, then add the key-value pairing to the cellOptions table
+ if key and value then
+ cellOptions[key] = value
+ else
+ -- Otherwise, it's not a special comment, keep the code line
+ table.insert(newCodeLines, line)
+ end
+ end
+
+ -- Merge cell options with default options
+ cellOptions = mergeCellOptions(cellOptions)
+
+ -- Set the codeblock text to exclude the special comments.
+ cellCode = table.concat(newCodeLines, '\n')
+
+ -- Return the code alongside options
+ return cellCode, cellOptions
+end
+
+-- Replace the code cell with a webR editor
+local function enableWebRCodeCell(el)
+
+ -- Let's see what's going on here:
+ -- quarto.log.output(el)
+
+ -- Should display the following elements:
+ -- https://pandoc.org/lua-filters.html#type-codeblock
+
+ -- Verify the element has attributes and the document type is HTML
+ -- not sure if this will work with an epub (may need html:js)
+ if not (el.attr and (quarto.doc.is_format("html") or quarto.doc.is_format("markdown"))) then
+ return el
+ end
+
+ -- Check to see if any form of the {webr} tag is present
+
+ -- Look for the original compute cell type `{webr}`
+ -- If the compute engine is:
+ -- - jupyter: this appears as `{webr}`
+ -- - knitr: this appears as `webr`
+ -- since the later dislikes custom engines
+ local originalEngine = el.attr.classes:includes("{webr}") or el.attr.classes:includes("webr")
+
+ -- Check for the new engine syntax that allows for the cell to be
+ -- evaluated in VS Code or RStudio editor views, c.f.
+ -- https://github.com/quarto-dev/quarto-cli/discussions/4761#discussioncomment-5336636
+ local newEngine = el.attr.classes:includes("{webr-r}")
+
+ if not (originalEngine or newEngine) then
+ return el
+ end
+
+ -- We detected a webR cell
+ missingWebRCell = false
+
+ -- Modify the counter variable each time this is run to create
+ -- unique code cells
+ qwebrCounter = qwebrCounter + 1
+
+ -- Local code cell storage
+ local cellOptions = {}
+ local cellCode = ''
+
+ -- Convert webr-specific option commands into attributes
+ cellCode, cellOptions = extractCodeBlockOptions(el)
+
+ -- Ensure we have a label representation
+ if cellOptions["label"] == '' then
+ cellOptions["label"] = "unnamed-chunk-" .. qwebrCounter
+ end
+ -- Set autorun to false if interactive
+ if cellOptions["autorun"] == "" then
+ if cellOptions["context"] == "interactive" then
+ cellOptions["autorun"] = "false"
+ else
+ cellOptions["autorun"] = "true"
+ end
+ end
+
+ -- Remove space left between options and code contents
+ cellCode = removeEmptyLinesUntilContent(cellCode)
+
+ -- Create a new table for the CodeBlock
+ local codeBlockData = {
+ id = qwebrCounter,
+ code = cellCode,
+ options = cellOptions
+ }
+
+ -- Store the CodeDiv in the global table
+ table.insert(qwebrCapturedCodeBlocks, codeBlockData)
+
+ -- Return an insertion point inside the document
+ return pandoc.RawInline('html', qwebrJSCellInsertionCode(qwebrCounter))
+end
+
+local function stitchDocument(doc)
+
+ -- Do not attach webR as the page lacks any active webR cells
+ if missingWebRCell then
+ return doc
+ end
+
+ -- Make sure we've initialized the code block
+ ensureWebRSetup()
+
+ return doc
+end
+
+return {
+ {
+ Meta = setWebRInitializationOptions
+ },
+ {
+ CodeBlock = enableWebRCodeCell
+ },
+ {
+ Pandoc = stitchDocument
+ }
+}
+
diff --git a/book/_extensions/quarto-ext/fontawesome/_extension.yml b/book/_extensions/quarto-ext/fontawesome/_extension.yml
new file mode 100644
index 0000000000..c0787a8c1d
--- /dev/null
+++ b/book/_extensions/quarto-ext/fontawesome/_extension.yml
@@ -0,0 +1,7 @@
+title: Font Awesome support
+author: Carlos Scheidegger
+version: 1.1.0
+quarto-required: ">=1.2.269"
+contributes:
+ shortcodes:
+ - fontawesome.lua
diff --git a/book/_extensions/quarto-ext/fontawesome/assets/css/all.css b/book/_extensions/quarto-ext/fontawesome/assets/css/all.css
new file mode 100644
index 0000000000..3e24980565
--- /dev/null
+++ b/book/_extensions/quarto-ext/fontawesome/assets/css/all.css
@@ -0,0 +1,7971 @@
+/*!
+ * Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ * Copyright 2023 Fonticons, Inc.
+ */
+.fa {
+ font-family: var(--fa-style-family, "Font Awesome 6 Free");
+ font-weight: var(--fa-style, 900); }
+
+.fa,
+.fa-classic,
+.fa-sharp,
+.fas,
+.fa-solid,
+.far,
+.fa-regular,
+.fab,
+.fa-brands,
+.fal,
+.fa-light,
+.fat,
+.fa-thin,
+.fad,
+.fa-duotone {
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-font-smoothing: antialiased;
+ display: var(--fa-display, inline-block);
+ font-style: normal;
+ font-variant: normal;
+ line-height: 1;
+ text-rendering: auto; }
+
+.fas,
+.fa-classic,
+.fa-solid,
+.far,
+.fa-regular {
+ font-family: 'Font Awesome 6 Free'; }
+
+.fab,
+.fa-brands {
+ font-family: 'Font Awesome 6 Brands'; }
+
+.fa-1x {
+ font-size: 1em; }
+
+.fa-2x {
+ font-size: 2em; }
+
+.fa-3x {
+ font-size: 3em; }
+
+.fa-4x {
+ font-size: 4em; }
+
+.fa-5x {
+ font-size: 5em; }
+
+.fa-6x {
+ font-size: 6em; }
+
+.fa-7x {
+ font-size: 7em; }
+
+.fa-8x {
+ font-size: 8em; }
+
+.fa-9x {
+ font-size: 9em; }
+
+.fa-10x {
+ font-size: 10em; }
+
+.fa-2xs {
+ font-size: 0.625em;
+ line-height: 0.1em;
+ vertical-align: 0.225em; }
+
+.fa-xs {
+ font-size: 0.75em;
+ line-height: 0.08333em;
+ vertical-align: 0.125em; }
+
+.fa-sm {
+ font-size: 0.875em;
+ line-height: 0.07143em;
+ vertical-align: 0.05357em; }
+
+.fa-lg {
+ font-size: 1.25em;
+ line-height: 0.05em;
+ vertical-align: -0.075em; }
+
+.fa-xl {
+ font-size: 1.5em;
+ line-height: 0.04167em;
+ vertical-align: -0.125em; }
+
+.fa-2xl {
+ font-size: 2em;
+ line-height: 0.03125em;
+ vertical-align: -0.1875em; }
+
+.fa-fw {
+ text-align: center;
+ width: 1.25em; }
+
+.fa-ul {
+ list-style-type: none;
+ margin-left: var(--fa-li-margin, 2.5em);
+ padding-left: 0; }
+ .fa-ul > li {
+ position: relative; }
+
+.fa-li {
+ left: calc(var(--fa-li-width, 2em) * -1);
+ position: absolute;
+ text-align: center;
+ width: var(--fa-li-width, 2em);
+ line-height: inherit; }
+
+.fa-border {
+ border-color: var(--fa-border-color, #eee);
+ border-radius: var(--fa-border-radius, 0.1em);
+ border-style: var(--fa-border-style, solid);
+ border-width: var(--fa-border-width, 0.08em);
+ padding: var(--fa-border-padding, 0.2em 0.25em 0.15em); }
+
+.fa-pull-left {
+ float: left;
+ margin-right: var(--fa-pull-margin, 0.3em); }
+
+.fa-pull-right {
+ float: right;
+ margin-left: var(--fa-pull-margin, 0.3em); }
+
+.fa-beat {
+ -webkit-animation-name: fa-beat;
+ animation-name: fa-beat;
+ -webkit-animation-delay: var(--fa-animation-delay, 0s);
+ animation-delay: var(--fa-animation-delay, 0s);
+ -webkit-animation-direction: var(--fa-animation-direction, normal);
+ animation-direction: var(--fa-animation-direction, normal);
+ -webkit-animation-duration: var(--fa-animation-duration, 1s);
+ animation-duration: var(--fa-animation-duration, 1s);
+ -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out);
+ animation-timing-function: var(--fa-animation-timing, ease-in-out); }
+
+.fa-bounce {
+ -webkit-animation-name: fa-bounce;
+ animation-name: fa-bounce;
+ -webkit-animation-delay: var(--fa-animation-delay, 0s);
+ animation-delay: var(--fa-animation-delay, 0s);
+ -webkit-animation-direction: var(--fa-animation-direction, normal);
+ animation-direction: var(--fa-animation-direction, normal);
+ -webkit-animation-duration: var(--fa-animation-duration, 1s);
+ animation-duration: var(--fa-animation-duration, 1s);
+ -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1));
+ animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); }
+
+.fa-fade {
+ -webkit-animation-name: fa-fade;
+ animation-name: fa-fade;
+ -webkit-animation-delay: var(--fa-animation-delay, 0s);
+ animation-delay: var(--fa-animation-delay, 0s);
+ -webkit-animation-direction: var(--fa-animation-direction, normal);
+ animation-direction: var(--fa-animation-direction, normal);
+ -webkit-animation-duration: var(--fa-animation-duration, 1s);
+ animation-duration: var(--fa-animation-duration, 1s);
+ -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));
+ animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
+
+.fa-beat-fade {
+ -webkit-animation-name: fa-beat-fade;
+ animation-name: fa-beat-fade;
+ -webkit-animation-delay: var(--fa-animation-delay, 0s);
+ animation-delay: var(--fa-animation-delay, 0s);
+ -webkit-animation-direction: var(--fa-animation-direction, normal);
+ animation-direction: var(--fa-animation-direction, normal);
+ -webkit-animation-duration: var(--fa-animation-duration, 1s);
+ animation-duration: var(--fa-animation-duration, 1s);
+ -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));
+ animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
+
+.fa-flip {
+ -webkit-animation-name: fa-flip;
+ animation-name: fa-flip;
+ -webkit-animation-delay: var(--fa-animation-delay, 0s);
+ animation-delay: var(--fa-animation-delay, 0s);
+ -webkit-animation-direction: var(--fa-animation-direction, normal);
+ animation-direction: var(--fa-animation-direction, normal);
+ -webkit-animation-duration: var(--fa-animation-duration, 1s);
+ animation-duration: var(--fa-animation-duration, 1s);
+ -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out);
+ animation-timing-function: var(--fa-animation-timing, ease-in-out); }
+
+.fa-shake {
+ -webkit-animation-name: fa-shake;
+ animation-name: fa-shake;
+ -webkit-animation-delay: var(--fa-animation-delay, 0s);
+ animation-delay: var(--fa-animation-delay, 0s);
+ -webkit-animation-direction: var(--fa-animation-direction, normal);
+ animation-direction: var(--fa-animation-direction, normal);
+ -webkit-animation-duration: var(--fa-animation-duration, 1s);
+ animation-duration: var(--fa-animation-duration, 1s);
+ -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ -webkit-animation-timing-function: var(--fa-animation-timing, linear);
+ animation-timing-function: var(--fa-animation-timing, linear); }
+
+.fa-spin {
+ -webkit-animation-name: fa-spin;
+ animation-name: fa-spin;
+ -webkit-animation-delay: var(--fa-animation-delay, 0s);
+ animation-delay: var(--fa-animation-delay, 0s);
+ -webkit-animation-direction: var(--fa-animation-direction, normal);
+ animation-direction: var(--fa-animation-direction, normal);
+ -webkit-animation-duration: var(--fa-animation-duration, 2s);
+ animation-duration: var(--fa-animation-duration, 2s);
+ -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ -webkit-animation-timing-function: var(--fa-animation-timing, linear);
+ animation-timing-function: var(--fa-animation-timing, linear); }
+
+.fa-spin-reverse {
+ --fa-animation-direction: reverse; }
+
+.fa-pulse,
+.fa-spin-pulse {
+ -webkit-animation-name: fa-spin;
+ animation-name: fa-spin;
+ -webkit-animation-direction: var(--fa-animation-direction, normal);
+ animation-direction: var(--fa-animation-direction, normal);
+ -webkit-animation-duration: var(--fa-animation-duration, 1s);
+ animation-duration: var(--fa-animation-duration, 1s);
+ -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ -webkit-animation-timing-function: var(--fa-animation-timing, steps(8));
+ animation-timing-function: var(--fa-animation-timing, steps(8)); }
+
+@media (prefers-reduced-motion: reduce) {
+ .fa-beat,
+ .fa-bounce,
+ .fa-fade,
+ .fa-beat-fade,
+ .fa-flip,
+ .fa-pulse,
+ .fa-shake,
+ .fa-spin,
+ .fa-spin-pulse {
+ -webkit-animation-delay: -1ms;
+ animation-delay: -1ms;
+ -webkit-animation-duration: 1ms;
+ animation-duration: 1ms;
+ -webkit-animation-iteration-count: 1;
+ animation-iteration-count: 1;
+ -webkit-transition-delay: 0s;
+ transition-delay: 0s;
+ -webkit-transition-duration: 0s;
+ transition-duration: 0s; } }
+
+@-webkit-keyframes fa-beat {
+ 0%, 90% {
+ -webkit-transform: scale(1);
+ transform: scale(1); }
+ 45% {
+ -webkit-transform: scale(var(--fa-beat-scale, 1.25));
+ transform: scale(var(--fa-beat-scale, 1.25)); } }
+
+@keyframes fa-beat {
+ 0%, 90% {
+ -webkit-transform: scale(1);
+ transform: scale(1); }
+ 45% {
+ -webkit-transform: scale(var(--fa-beat-scale, 1.25));
+ transform: scale(var(--fa-beat-scale, 1.25)); } }
+
+@-webkit-keyframes fa-bounce {
+ 0% {
+ -webkit-transform: scale(1, 1) translateY(0);
+ transform: scale(1, 1) translateY(0); }
+ 10% {
+ -webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);
+ transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); }
+ 30% {
+ -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));
+ transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); }
+ 50% {
+ -webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);
+ transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); }
+ 57% {
+ -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));
+ transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); }
+ 64% {
+ -webkit-transform: scale(1, 1) translateY(0);
+ transform: scale(1, 1) translateY(0); }
+ 100% {
+ -webkit-transform: scale(1, 1) translateY(0);
+ transform: scale(1, 1) translateY(0); } }
+
+@keyframes fa-bounce {
+ 0% {
+ -webkit-transform: scale(1, 1) translateY(0);
+ transform: scale(1, 1) translateY(0); }
+ 10% {
+ -webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);
+ transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); }
+ 30% {
+ -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));
+ transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); }
+ 50% {
+ -webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);
+ transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); }
+ 57% {
+ -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));
+ transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); }
+ 64% {
+ -webkit-transform: scale(1, 1) translateY(0);
+ transform: scale(1, 1) translateY(0); }
+ 100% {
+ -webkit-transform: scale(1, 1) translateY(0);
+ transform: scale(1, 1) translateY(0); } }
+
+@-webkit-keyframes fa-fade {
+ 50% {
+ opacity: var(--fa-fade-opacity, 0.4); } }
+
+@keyframes fa-fade {
+ 50% {
+ opacity: var(--fa-fade-opacity, 0.4); } }
+
+@-webkit-keyframes fa-beat-fade {
+ 0%, 100% {
+ opacity: var(--fa-beat-fade-opacity, 0.4);
+ -webkit-transform: scale(1);
+ transform: scale(1); }
+ 50% {
+ opacity: 1;
+ -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125));
+ transform: scale(var(--fa-beat-fade-scale, 1.125)); } }
+
+@keyframes fa-beat-fade {
+ 0%, 100% {
+ opacity: var(--fa-beat-fade-opacity, 0.4);
+ -webkit-transform: scale(1);
+ transform: scale(1); }
+ 50% {
+ opacity: 1;
+ -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125));
+ transform: scale(var(--fa-beat-fade-scale, 1.125)); } }
+
+@-webkit-keyframes fa-flip {
+ 50% {
+ -webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));
+ transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } }
+
+@keyframes fa-flip {
+ 50% {
+ -webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));
+ transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } }
+
+@-webkit-keyframes fa-shake {
+ 0% {
+ -webkit-transform: rotate(-15deg);
+ transform: rotate(-15deg); }
+ 4% {
+ -webkit-transform: rotate(15deg);
+ transform: rotate(15deg); }
+ 8%, 24% {
+ -webkit-transform: rotate(-18deg);
+ transform: rotate(-18deg); }
+ 12%, 28% {
+ -webkit-transform: rotate(18deg);
+ transform: rotate(18deg); }
+ 16% {
+ -webkit-transform: rotate(-22deg);
+ transform: rotate(-22deg); }
+ 20% {
+ -webkit-transform: rotate(22deg);
+ transform: rotate(22deg); }
+ 32% {
+ -webkit-transform: rotate(-12deg);
+ transform: rotate(-12deg); }
+ 36% {
+ -webkit-transform: rotate(12deg);
+ transform: rotate(12deg); }
+ 40%, 100% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg); } }
+
+@keyframes fa-shake {
+ 0% {
+ -webkit-transform: rotate(-15deg);
+ transform: rotate(-15deg); }
+ 4% {
+ -webkit-transform: rotate(15deg);
+ transform: rotate(15deg); }
+ 8%, 24% {
+ -webkit-transform: rotate(-18deg);
+ transform: rotate(-18deg); }
+ 12%, 28% {
+ -webkit-transform: rotate(18deg);
+ transform: rotate(18deg); }
+ 16% {
+ -webkit-transform: rotate(-22deg);
+ transform: rotate(-22deg); }
+ 20% {
+ -webkit-transform: rotate(22deg);
+ transform: rotate(22deg); }
+ 32% {
+ -webkit-transform: rotate(-12deg);
+ transform: rotate(-12deg); }
+ 36% {
+ -webkit-transform: rotate(12deg);
+ transform: rotate(12deg); }
+ 40%, 100% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg); } }
+
+@-webkit-keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg); }
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg); } }
+
+@keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg); }
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg); } }
+
+.fa-rotate-90 {
+ -webkit-transform: rotate(90deg);
+ transform: rotate(90deg); }
+
+.fa-rotate-180 {
+ -webkit-transform: rotate(180deg);
+ transform: rotate(180deg); }
+
+.fa-rotate-270 {
+ -webkit-transform: rotate(270deg);
+ transform: rotate(270deg); }
+
+.fa-flip-horizontal {
+ -webkit-transform: scale(-1, 1);
+ transform: scale(-1, 1); }
+
+.fa-flip-vertical {
+ -webkit-transform: scale(1, -1);
+ transform: scale(1, -1); }
+
+.fa-flip-both,
+.fa-flip-horizontal.fa-flip-vertical {
+ -webkit-transform: scale(-1, -1);
+ transform: scale(-1, -1); }
+
+.fa-rotate-by {
+ -webkit-transform: rotate(var(--fa-rotate-angle, none));
+ transform: rotate(var(--fa-rotate-angle, none)); }
+
+.fa-stack {
+ display: inline-block;
+ height: 2em;
+ line-height: 2em;
+ position: relative;
+ vertical-align: middle;
+ width: 2.5em; }
+
+.fa-stack-1x,
+.fa-stack-2x {
+ left: 0;
+ position: absolute;
+ text-align: center;
+ width: 100%;
+ z-index: var(--fa-stack-z-index, auto); }
+
+.fa-stack-1x {
+ line-height: inherit; }
+
+.fa-stack-2x {
+ font-size: 2em; }
+
+.fa-inverse {
+ color: var(--fa-inverse, #fff); }
+
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+readers do not read off random characters that represent icons */
+
+.fa-0::before {
+ content: "\30"; }
+
+.fa-1::before {
+ content: "\31"; }
+
+.fa-2::before {
+ content: "\32"; }
+
+.fa-3::before {
+ content: "\33"; }
+
+.fa-4::before {
+ content: "\34"; }
+
+.fa-5::before {
+ content: "\35"; }
+
+.fa-6::before {
+ content: "\36"; }
+
+.fa-7::before {
+ content: "\37"; }
+
+.fa-8::before {
+ content: "\38"; }
+
+.fa-9::before {
+ content: "\39"; }
+
+.fa-fill-drip::before {
+ content: "\f576"; }
+
+.fa-arrows-to-circle::before {
+ content: "\e4bd"; }
+
+.fa-circle-chevron-right::before {
+ content: "\f138"; }
+
+.fa-chevron-circle-right::before {
+ content: "\f138"; }
+
+.fa-at::before {
+ content: "\40"; }
+
+.fa-trash-can::before {
+ content: "\f2ed"; }
+
+.fa-trash-alt::before {
+ content: "\f2ed"; }
+
+.fa-text-height::before {
+ content: "\f034"; }
+
+.fa-user-xmark::before {
+ content: "\f235"; }
+
+.fa-user-times::before {
+ content: "\f235"; }
+
+.fa-stethoscope::before {
+ content: "\f0f1"; }
+
+.fa-message::before {
+ content: "\f27a"; }
+
+.fa-comment-alt::before {
+ content: "\f27a"; }
+
+.fa-info::before {
+ content: "\f129"; }
+
+.fa-down-left-and-up-right-to-center::before {
+ content: "\f422"; }
+
+.fa-compress-alt::before {
+ content: "\f422"; }
+
+.fa-explosion::before {
+ content: "\e4e9"; }
+
+.fa-file-lines::before {
+ content: "\f15c"; }
+
+.fa-file-alt::before {
+ content: "\f15c"; }
+
+.fa-file-text::before {
+ content: "\f15c"; }
+
+.fa-wave-square::before {
+ content: "\f83e"; }
+
+.fa-ring::before {
+ content: "\f70b"; }
+
+.fa-building-un::before {
+ content: "\e4d9"; }
+
+.fa-dice-three::before {
+ content: "\f527"; }
+
+.fa-calendar-days::before {
+ content: "\f073"; }
+
+.fa-calendar-alt::before {
+ content: "\f073"; }
+
+.fa-anchor-circle-check::before {
+ content: "\e4aa"; }
+
+.fa-building-circle-arrow-right::before {
+ content: "\e4d1"; }
+
+.fa-volleyball::before {
+ content: "\f45f"; }
+
+.fa-volleyball-ball::before {
+ content: "\f45f"; }
+
+.fa-arrows-up-to-line::before {
+ content: "\e4c2"; }
+
+.fa-sort-down::before {
+ content: "\f0dd"; }
+
+.fa-sort-desc::before {
+ content: "\f0dd"; }
+
+.fa-circle-minus::before {
+ content: "\f056"; }
+
+.fa-minus-circle::before {
+ content: "\f056"; }
+
+.fa-door-open::before {
+ content: "\f52b"; }
+
+.fa-right-from-bracket::before {
+ content: "\f2f5"; }
+
+.fa-sign-out-alt::before {
+ content: "\f2f5"; }
+
+.fa-atom::before {
+ content: "\f5d2"; }
+
+.fa-soap::before {
+ content: "\e06e"; }
+
+.fa-icons::before {
+ content: "\f86d"; }
+
+.fa-heart-music-camera-bolt::before {
+ content: "\f86d"; }
+
+.fa-microphone-lines-slash::before {
+ content: "\f539"; }
+
+.fa-microphone-alt-slash::before {
+ content: "\f539"; }
+
+.fa-bridge-circle-check::before {
+ content: "\e4c9"; }
+
+.fa-pump-medical::before {
+ content: "\e06a"; }
+
+.fa-fingerprint::before {
+ content: "\f577"; }
+
+.fa-hand-point-right::before {
+ content: "\f0a4"; }
+
+.fa-magnifying-glass-location::before {
+ content: "\f689"; }
+
+.fa-search-location::before {
+ content: "\f689"; }
+
+.fa-forward-step::before {
+ content: "\f051"; }
+
+.fa-step-forward::before {
+ content: "\f051"; }
+
+.fa-face-smile-beam::before {
+ content: "\f5b8"; }
+
+.fa-smile-beam::before {
+ content: "\f5b8"; }
+
+.fa-flag-checkered::before {
+ content: "\f11e"; }
+
+.fa-football::before {
+ content: "\f44e"; }
+
+.fa-football-ball::before {
+ content: "\f44e"; }
+
+.fa-school-circle-exclamation::before {
+ content: "\e56c"; }
+
+.fa-crop::before {
+ content: "\f125"; }
+
+.fa-angles-down::before {
+ content: "\f103"; }
+
+.fa-angle-double-down::before {
+ content: "\f103"; }
+
+.fa-users-rectangle::before {
+ content: "\e594"; }
+
+.fa-people-roof::before {
+ content: "\e537"; }
+
+.fa-people-line::before {
+ content: "\e534"; }
+
+.fa-beer-mug-empty::before {
+ content: "\f0fc"; }
+
+.fa-beer::before {
+ content: "\f0fc"; }
+
+.fa-diagram-predecessor::before {
+ content: "\e477"; }
+
+.fa-arrow-up-long::before {
+ content: "\f176"; }
+
+.fa-long-arrow-up::before {
+ content: "\f176"; }
+
+.fa-fire-flame-simple::before {
+ content: "\f46a"; }
+
+.fa-burn::before {
+ content: "\f46a"; }
+
+.fa-person::before {
+ content: "\f183"; }
+
+.fa-male::before {
+ content: "\f183"; }
+
+.fa-laptop::before {
+ content: "\f109"; }
+
+.fa-file-csv::before {
+ content: "\f6dd"; }
+
+.fa-menorah::before {
+ content: "\f676"; }
+
+.fa-truck-plane::before {
+ content: "\e58f"; }
+
+.fa-record-vinyl::before {
+ content: "\f8d9"; }
+
+.fa-face-grin-stars::before {
+ content: "\f587"; }
+
+.fa-grin-stars::before {
+ content: "\f587"; }
+
+.fa-bong::before {
+ content: "\f55c"; }
+
+.fa-spaghetti-monster-flying::before {
+ content: "\f67b"; }
+
+.fa-pastafarianism::before {
+ content: "\f67b"; }
+
+.fa-arrow-down-up-across-line::before {
+ content: "\e4af"; }
+
+.fa-spoon::before {
+ content: "\f2e5"; }
+
+.fa-utensil-spoon::before {
+ content: "\f2e5"; }
+
+.fa-jar-wheat::before {
+ content: "\e517"; }
+
+.fa-envelopes-bulk::before {
+ content: "\f674"; }
+
+.fa-mail-bulk::before {
+ content: "\f674"; }
+
+.fa-file-circle-exclamation::before {
+ content: "\e4eb"; }
+
+.fa-circle-h::before {
+ content: "\f47e"; }
+
+.fa-hospital-symbol::before {
+ content: "\f47e"; }
+
+.fa-pager::before {
+ content: "\f815"; }
+
+.fa-address-book::before {
+ content: "\f2b9"; }
+
+.fa-contact-book::before {
+ content: "\f2b9"; }
+
+.fa-strikethrough::before {
+ content: "\f0cc"; }
+
+.fa-k::before {
+ content: "\4b"; }
+
+.fa-landmark-flag::before {
+ content: "\e51c"; }
+
+.fa-pencil::before {
+ content: "\f303"; }
+
+.fa-pencil-alt::before {
+ content: "\f303"; }
+
+.fa-backward::before {
+ content: "\f04a"; }
+
+.fa-caret-right::before {
+ content: "\f0da"; }
+
+.fa-comments::before {
+ content: "\f086"; }
+
+.fa-paste::before {
+ content: "\f0ea"; }
+
+.fa-file-clipboard::before {
+ content: "\f0ea"; }
+
+.fa-code-pull-request::before {
+ content: "\e13c"; }
+
+.fa-clipboard-list::before {
+ content: "\f46d"; }
+
+.fa-truck-ramp-box::before {
+ content: "\f4de"; }
+
+.fa-truck-loading::before {
+ content: "\f4de"; }
+
+.fa-user-check::before {
+ content: "\f4fc"; }
+
+.fa-vial-virus::before {
+ content: "\e597"; }
+
+.fa-sheet-plastic::before {
+ content: "\e571"; }
+
+.fa-blog::before {
+ content: "\f781"; }
+
+.fa-user-ninja::before {
+ content: "\f504"; }
+
+.fa-person-arrow-up-from-line::before {
+ content: "\e539"; }
+
+.fa-scroll-torah::before {
+ content: "\f6a0"; }
+
+.fa-torah::before {
+ content: "\f6a0"; }
+
+.fa-broom-ball::before {
+ content: "\f458"; }
+
+.fa-quidditch::before {
+ content: "\f458"; }
+
+.fa-quidditch-broom-ball::before {
+ content: "\f458"; }
+
+.fa-toggle-off::before {
+ content: "\f204"; }
+
+.fa-box-archive::before {
+ content: "\f187"; }
+
+.fa-archive::before {
+ content: "\f187"; }
+
+.fa-person-drowning::before {
+ content: "\e545"; }
+
+.fa-arrow-down-9-1::before {
+ content: "\f886"; }
+
+.fa-sort-numeric-desc::before {
+ content: "\f886"; }
+
+.fa-sort-numeric-down-alt::before {
+ content: "\f886"; }
+
+.fa-face-grin-tongue-squint::before {
+ content: "\f58a"; }
+
+.fa-grin-tongue-squint::before {
+ content: "\f58a"; }
+
+.fa-spray-can::before {
+ content: "\f5bd"; }
+
+.fa-truck-monster::before {
+ content: "\f63b"; }
+
+.fa-w::before {
+ content: "\57"; }
+
+.fa-earth-africa::before {
+ content: "\f57c"; }
+
+.fa-globe-africa::before {
+ content: "\f57c"; }
+
+.fa-rainbow::before {
+ content: "\f75b"; }
+
+.fa-circle-notch::before {
+ content: "\f1ce"; }
+
+.fa-tablet-screen-button::before {
+ content: "\f3fa"; }
+
+.fa-tablet-alt::before {
+ content: "\f3fa"; }
+
+.fa-paw::before {
+ content: "\f1b0"; }
+
+.fa-cloud::before {
+ content: "\f0c2"; }
+
+.fa-trowel-bricks::before {
+ content: "\e58a"; }
+
+.fa-face-flushed::before {
+ content: "\f579"; }
+
+.fa-flushed::before {
+ content: "\f579"; }
+
+.fa-hospital-user::before {
+ content: "\f80d"; }
+
+.fa-tent-arrow-left-right::before {
+ content: "\e57f"; }
+
+.fa-gavel::before {
+ content: "\f0e3"; }
+
+.fa-legal::before {
+ content: "\f0e3"; }
+
+.fa-binoculars::before {
+ content: "\f1e5"; }
+
+.fa-microphone-slash::before {
+ content: "\f131"; }
+
+.fa-box-tissue::before {
+ content: "\e05b"; }
+
+.fa-motorcycle::before {
+ content: "\f21c"; }
+
+.fa-bell-concierge::before {
+ content: "\f562"; }
+
+.fa-concierge-bell::before {
+ content: "\f562"; }
+
+.fa-pen-ruler::before {
+ content: "\f5ae"; }
+
+.fa-pencil-ruler::before {
+ content: "\f5ae"; }
+
+.fa-people-arrows::before {
+ content: "\e068"; }
+
+.fa-people-arrows-left-right::before {
+ content: "\e068"; }
+
+.fa-mars-and-venus-burst::before {
+ content: "\e523"; }
+
+.fa-square-caret-right::before {
+ content: "\f152"; }
+
+.fa-caret-square-right::before {
+ content: "\f152"; }
+
+.fa-scissors::before {
+ content: "\f0c4"; }
+
+.fa-cut::before {
+ content: "\f0c4"; }
+
+.fa-sun-plant-wilt::before {
+ content: "\e57a"; }
+
+.fa-toilets-portable::before {
+ content: "\e584"; }
+
+.fa-hockey-puck::before {
+ content: "\f453"; }
+
+.fa-table::before {
+ content: "\f0ce"; }
+
+.fa-magnifying-glass-arrow-right::before {
+ content: "\e521"; }
+
+.fa-tachograph-digital::before {
+ content: "\f566"; }
+
+.fa-digital-tachograph::before {
+ content: "\f566"; }
+
+.fa-users-slash::before {
+ content: "\e073"; }
+
+.fa-clover::before {
+ content: "\e139"; }
+
+.fa-reply::before {
+ content: "\f3e5"; }
+
+.fa-mail-reply::before {
+ content: "\f3e5"; }
+
+.fa-star-and-crescent::before {
+ content: "\f699"; }
+
+.fa-house-fire::before {
+ content: "\e50c"; }
+
+.fa-square-minus::before {
+ content: "\f146"; }
+
+.fa-minus-square::before {
+ content: "\f146"; }
+
+.fa-helicopter::before {
+ content: "\f533"; }
+
+.fa-compass::before {
+ content: "\f14e"; }
+
+.fa-square-caret-down::before {
+ content: "\f150"; }
+
+.fa-caret-square-down::before {
+ content: "\f150"; }
+
+.fa-file-circle-question::before {
+ content: "\e4ef"; }
+
+.fa-laptop-code::before {
+ content: "\f5fc"; }
+
+.fa-swatchbook::before {
+ content: "\f5c3"; }
+
+.fa-prescription-bottle::before {
+ content: "\f485"; }
+
+.fa-bars::before {
+ content: "\f0c9"; }
+
+.fa-navicon::before {
+ content: "\f0c9"; }
+
+.fa-people-group::before {
+ content: "\e533"; }
+
+.fa-hourglass-end::before {
+ content: "\f253"; }
+
+.fa-hourglass-3::before {
+ content: "\f253"; }
+
+.fa-heart-crack::before {
+ content: "\f7a9"; }
+
+.fa-heart-broken::before {
+ content: "\f7a9"; }
+
+.fa-square-up-right::before {
+ content: "\f360"; }
+
+.fa-external-link-square-alt::before {
+ content: "\f360"; }
+
+.fa-face-kiss-beam::before {
+ content: "\f597"; }
+
+.fa-kiss-beam::before {
+ content: "\f597"; }
+
+.fa-film::before {
+ content: "\f008"; }
+
+.fa-ruler-horizontal::before {
+ content: "\f547"; }
+
+.fa-people-robbery::before {
+ content: "\e536"; }
+
+.fa-lightbulb::before {
+ content: "\f0eb"; }
+
+.fa-caret-left::before {
+ content: "\f0d9"; }
+
+.fa-circle-exclamation::before {
+ content: "\f06a"; }
+
+.fa-exclamation-circle::before {
+ content: "\f06a"; }
+
+.fa-school-circle-xmark::before {
+ content: "\e56d"; }
+
+.fa-arrow-right-from-bracket::before {
+ content: "\f08b"; }
+
+.fa-sign-out::before {
+ content: "\f08b"; }
+
+.fa-circle-chevron-down::before {
+ content: "\f13a"; }
+
+.fa-chevron-circle-down::before {
+ content: "\f13a"; }
+
+.fa-unlock-keyhole::before {
+ content: "\f13e"; }
+
+.fa-unlock-alt::before {
+ content: "\f13e"; }
+
+.fa-cloud-showers-heavy::before {
+ content: "\f740"; }
+
+.fa-headphones-simple::before {
+ content: "\f58f"; }
+
+.fa-headphones-alt::before {
+ content: "\f58f"; }
+
+.fa-sitemap::before {
+ content: "\f0e8"; }
+
+.fa-circle-dollar-to-slot::before {
+ content: "\f4b9"; }
+
+.fa-donate::before {
+ content: "\f4b9"; }
+
+.fa-memory::before {
+ content: "\f538"; }
+
+.fa-road-spikes::before {
+ content: "\e568"; }
+
+.fa-fire-burner::before {
+ content: "\e4f1"; }
+
+.fa-flag::before {
+ content: "\f024"; }
+
+.fa-hanukiah::before {
+ content: "\f6e6"; }
+
+.fa-feather::before {
+ content: "\f52d"; }
+
+.fa-volume-low::before {
+ content: "\f027"; }
+
+.fa-volume-down::before {
+ content: "\f027"; }
+
+.fa-comment-slash::before {
+ content: "\f4b3"; }
+
+.fa-cloud-sun-rain::before {
+ content: "\f743"; }
+
+.fa-compress::before {
+ content: "\f066"; }
+
+.fa-wheat-awn::before {
+ content: "\e2cd"; }
+
+.fa-wheat-alt::before {
+ content: "\e2cd"; }
+
+.fa-ankh::before {
+ content: "\f644"; }
+
+.fa-hands-holding-child::before {
+ content: "\e4fa"; }
+
+.fa-asterisk::before {
+ content: "\2a"; }
+
+.fa-square-check::before {
+ content: "\f14a"; }
+
+.fa-check-square::before {
+ content: "\f14a"; }
+
+.fa-peseta-sign::before {
+ content: "\e221"; }
+
+.fa-heading::before {
+ content: "\f1dc"; }
+
+.fa-header::before {
+ content: "\f1dc"; }
+
+.fa-ghost::before {
+ content: "\f6e2"; }
+
+.fa-list::before {
+ content: "\f03a"; }
+
+.fa-list-squares::before {
+ content: "\f03a"; }
+
+.fa-square-phone-flip::before {
+ content: "\f87b"; }
+
+.fa-phone-square-alt::before {
+ content: "\f87b"; }
+
+.fa-cart-plus::before {
+ content: "\f217"; }
+
+.fa-gamepad::before {
+ content: "\f11b"; }
+
+.fa-circle-dot::before {
+ content: "\f192"; }
+
+.fa-dot-circle::before {
+ content: "\f192"; }
+
+.fa-face-dizzy::before {
+ content: "\f567"; }
+
+.fa-dizzy::before {
+ content: "\f567"; }
+
+.fa-egg::before {
+ content: "\f7fb"; }
+
+.fa-house-medical-circle-xmark::before {
+ content: "\e513"; }
+
+.fa-campground::before {
+ content: "\f6bb"; }
+
+.fa-folder-plus::before {
+ content: "\f65e"; }
+
+.fa-futbol::before {
+ content: "\f1e3"; }
+
+.fa-futbol-ball::before {
+ content: "\f1e3"; }
+
+.fa-soccer-ball::before {
+ content: "\f1e3"; }
+
+.fa-paintbrush::before {
+ content: "\f1fc"; }
+
+.fa-paint-brush::before {
+ content: "\f1fc"; }
+
+.fa-lock::before {
+ content: "\f023"; }
+
+.fa-gas-pump::before {
+ content: "\f52f"; }
+
+.fa-hot-tub-person::before {
+ content: "\f593"; }
+
+.fa-hot-tub::before {
+ content: "\f593"; }
+
+.fa-map-location::before {
+ content: "\f59f"; }
+
+.fa-map-marked::before {
+ content: "\f59f"; }
+
+.fa-house-flood-water::before {
+ content: "\e50e"; }
+
+.fa-tree::before {
+ content: "\f1bb"; }
+
+.fa-bridge-lock::before {
+ content: "\e4cc"; }
+
+.fa-sack-dollar::before {
+ content: "\f81d"; }
+
+.fa-pen-to-square::before {
+ content: "\f044"; }
+
+.fa-edit::before {
+ content: "\f044"; }
+
+.fa-car-side::before {
+ content: "\f5e4"; }
+
+.fa-share-nodes::before {
+ content: "\f1e0"; }
+
+.fa-share-alt::before {
+ content: "\f1e0"; }
+
+.fa-heart-circle-minus::before {
+ content: "\e4ff"; }
+
+.fa-hourglass-half::before {
+ content: "\f252"; }
+
+.fa-hourglass-2::before {
+ content: "\f252"; }
+
+.fa-microscope::before {
+ content: "\f610"; }
+
+.fa-sink::before {
+ content: "\e06d"; }
+
+.fa-bag-shopping::before {
+ content: "\f290"; }
+
+.fa-shopping-bag::before {
+ content: "\f290"; }
+
+.fa-arrow-down-z-a::before {
+ content: "\f881"; }
+
+.fa-sort-alpha-desc::before {
+ content: "\f881"; }
+
+.fa-sort-alpha-down-alt::before {
+ content: "\f881"; }
+
+.fa-mitten::before {
+ content: "\f7b5"; }
+
+.fa-person-rays::before {
+ content: "\e54d"; }
+
+.fa-users::before {
+ content: "\f0c0"; }
+
+.fa-eye-slash::before {
+ content: "\f070"; }
+
+.fa-flask-vial::before {
+ content: "\e4f3"; }
+
+.fa-hand::before {
+ content: "\f256"; }
+
+.fa-hand-paper::before {
+ content: "\f256"; }
+
+.fa-om::before {
+ content: "\f679"; }
+
+.fa-worm::before {
+ content: "\e599"; }
+
+.fa-house-circle-xmark::before {
+ content: "\e50b"; }
+
+.fa-plug::before {
+ content: "\f1e6"; }
+
+.fa-chevron-up::before {
+ content: "\f077"; }
+
+.fa-hand-spock::before {
+ content: "\f259"; }
+
+.fa-stopwatch::before {
+ content: "\f2f2"; }
+
+.fa-face-kiss::before {
+ content: "\f596"; }
+
+.fa-kiss::before {
+ content: "\f596"; }
+
+.fa-bridge-circle-xmark::before {
+ content: "\e4cb"; }
+
+.fa-face-grin-tongue::before {
+ content: "\f589"; }
+
+.fa-grin-tongue::before {
+ content: "\f589"; }
+
+.fa-chess-bishop::before {
+ content: "\f43a"; }
+
+.fa-face-grin-wink::before {
+ content: "\f58c"; }
+
+.fa-grin-wink::before {
+ content: "\f58c"; }
+
+.fa-ear-deaf::before {
+ content: "\f2a4"; }
+
+.fa-deaf::before {
+ content: "\f2a4"; }
+
+.fa-deafness::before {
+ content: "\f2a4"; }
+
+.fa-hard-of-hearing::before {
+ content: "\f2a4"; }
+
+.fa-road-circle-check::before {
+ content: "\e564"; }
+
+.fa-dice-five::before {
+ content: "\f523"; }
+
+.fa-square-rss::before {
+ content: "\f143"; }
+
+.fa-rss-square::before {
+ content: "\f143"; }
+
+.fa-land-mine-on::before {
+ content: "\e51b"; }
+
+.fa-i-cursor::before {
+ content: "\f246"; }
+
+.fa-stamp::before {
+ content: "\f5bf"; }
+
+.fa-stairs::before {
+ content: "\e289"; }
+
+.fa-i::before {
+ content: "\49"; }
+
+.fa-hryvnia-sign::before {
+ content: "\f6f2"; }
+
+.fa-hryvnia::before {
+ content: "\f6f2"; }
+
+.fa-pills::before {
+ content: "\f484"; }
+
+.fa-face-grin-wide::before {
+ content: "\f581"; }
+
+.fa-grin-alt::before {
+ content: "\f581"; }
+
+.fa-tooth::before {
+ content: "\f5c9"; }
+
+.fa-v::before {
+ content: "\56"; }
+
+.fa-bangladeshi-taka-sign::before {
+ content: "\e2e6"; }
+
+.fa-bicycle::before {
+ content: "\f206"; }
+
+.fa-staff-snake::before {
+ content: "\e579"; }
+
+.fa-rod-asclepius::before {
+ content: "\e579"; }
+
+.fa-rod-snake::before {
+ content: "\e579"; }
+
+.fa-staff-aesculapius::before {
+ content: "\e579"; }
+
+.fa-head-side-cough-slash::before {
+ content: "\e062"; }
+
+.fa-truck-medical::before {
+ content: "\f0f9"; }
+
+.fa-ambulance::before {
+ content: "\f0f9"; }
+
+.fa-wheat-awn-circle-exclamation::before {
+ content: "\e598"; }
+
+.fa-snowman::before {
+ content: "\f7d0"; }
+
+.fa-mortar-pestle::before {
+ content: "\f5a7"; }
+
+.fa-road-barrier::before {
+ content: "\e562"; }
+
+.fa-school::before {
+ content: "\f549"; }
+
+.fa-igloo::before {
+ content: "\f7ae"; }
+
+.fa-joint::before {
+ content: "\f595"; }
+
+.fa-angle-right::before {
+ content: "\f105"; }
+
+.fa-horse::before {
+ content: "\f6f0"; }
+
+.fa-q::before {
+ content: "\51"; }
+
+.fa-g::before {
+ content: "\47"; }
+
+.fa-notes-medical::before {
+ content: "\f481"; }
+
+.fa-temperature-half::before {
+ content: "\f2c9"; }
+
+.fa-temperature-2::before {
+ content: "\f2c9"; }
+
+.fa-thermometer-2::before {
+ content: "\f2c9"; }
+
+.fa-thermometer-half::before {
+ content: "\f2c9"; }
+
+.fa-dong-sign::before {
+ content: "\e169"; }
+
+.fa-capsules::before {
+ content: "\f46b"; }
+
+.fa-poo-storm::before {
+ content: "\f75a"; }
+
+.fa-poo-bolt::before {
+ content: "\f75a"; }
+
+.fa-face-frown-open::before {
+ content: "\f57a"; }
+
+.fa-frown-open::before {
+ content: "\f57a"; }
+
+.fa-hand-point-up::before {
+ content: "\f0a6"; }
+
+.fa-money-bill::before {
+ content: "\f0d6"; }
+
+.fa-bookmark::before {
+ content: "\f02e"; }
+
+.fa-align-justify::before {
+ content: "\f039"; }
+
+.fa-umbrella-beach::before {
+ content: "\f5ca"; }
+
+.fa-helmet-un::before {
+ content: "\e503"; }
+
+.fa-bullseye::before {
+ content: "\f140"; }
+
+.fa-bacon::before {
+ content: "\f7e5"; }
+
+.fa-hand-point-down::before {
+ content: "\f0a7"; }
+
+.fa-arrow-up-from-bracket::before {
+ content: "\e09a"; }
+
+.fa-folder::before {
+ content: "\f07b"; }
+
+.fa-folder-blank::before {
+ content: "\f07b"; }
+
+.fa-file-waveform::before {
+ content: "\f478"; }
+
+.fa-file-medical-alt::before {
+ content: "\f478"; }
+
+.fa-radiation::before {
+ content: "\f7b9"; }
+
+.fa-chart-simple::before {
+ content: "\e473"; }
+
+.fa-mars-stroke::before {
+ content: "\f229"; }
+
+.fa-vial::before {
+ content: "\f492"; }
+
+.fa-gauge::before {
+ content: "\f624"; }
+
+.fa-dashboard::before {
+ content: "\f624"; }
+
+.fa-gauge-med::before {
+ content: "\f624"; }
+
+.fa-tachometer-alt-average::before {
+ content: "\f624"; }
+
+.fa-wand-magic-sparkles::before {
+ content: "\e2ca"; }
+
+.fa-magic-wand-sparkles::before {
+ content: "\e2ca"; }
+
+.fa-e::before {
+ content: "\45"; }
+
+.fa-pen-clip::before {
+ content: "\f305"; }
+
+.fa-pen-alt::before {
+ content: "\f305"; }
+
+.fa-bridge-circle-exclamation::before {
+ content: "\e4ca"; }
+
+.fa-user::before {
+ content: "\f007"; }
+
+.fa-school-circle-check::before {
+ content: "\e56b"; }
+
+.fa-dumpster::before {
+ content: "\f793"; }
+
+.fa-van-shuttle::before {
+ content: "\f5b6"; }
+
+.fa-shuttle-van::before {
+ content: "\f5b6"; }
+
+.fa-building-user::before {
+ content: "\e4da"; }
+
+.fa-square-caret-left::before {
+ content: "\f191"; }
+
+.fa-caret-square-left::before {
+ content: "\f191"; }
+
+.fa-highlighter::before {
+ content: "\f591"; }
+
+.fa-key::before {
+ content: "\f084"; }
+
+.fa-bullhorn::before {
+ content: "\f0a1"; }
+
+.fa-globe::before {
+ content: "\f0ac"; }
+
+.fa-synagogue::before {
+ content: "\f69b"; }
+
+.fa-person-half-dress::before {
+ content: "\e548"; }
+
+.fa-road-bridge::before {
+ content: "\e563"; }
+
+.fa-location-arrow::before {
+ content: "\f124"; }
+
+.fa-c::before {
+ content: "\43"; }
+
+.fa-tablet-button::before {
+ content: "\f10a"; }
+
+.fa-building-lock::before {
+ content: "\e4d6"; }
+
+.fa-pizza-slice::before {
+ content: "\f818"; }
+
+.fa-money-bill-wave::before {
+ content: "\f53a"; }
+
+.fa-chart-area::before {
+ content: "\f1fe"; }
+
+.fa-area-chart::before {
+ content: "\f1fe"; }
+
+.fa-house-flag::before {
+ content: "\e50d"; }
+
+.fa-person-circle-minus::before {
+ content: "\e540"; }
+
+.fa-ban::before {
+ content: "\f05e"; }
+
+.fa-cancel::before {
+ content: "\f05e"; }
+
+.fa-camera-rotate::before {
+ content: "\e0d8"; }
+
+.fa-spray-can-sparkles::before {
+ content: "\f5d0"; }
+
+.fa-air-freshener::before {
+ content: "\f5d0"; }
+
+.fa-star::before {
+ content: "\f005"; }
+
+.fa-repeat::before {
+ content: "\f363"; }
+
+.fa-cross::before {
+ content: "\f654"; }
+
+.fa-box::before {
+ content: "\f466"; }
+
+.fa-venus-mars::before {
+ content: "\f228"; }
+
+.fa-arrow-pointer::before {
+ content: "\f245"; }
+
+.fa-mouse-pointer::before {
+ content: "\f245"; }
+
+.fa-maximize::before {
+ content: "\f31e"; }
+
+.fa-expand-arrows-alt::before {
+ content: "\f31e"; }
+
+.fa-charging-station::before {
+ content: "\f5e7"; }
+
+.fa-shapes::before {
+ content: "\f61f"; }
+
+.fa-triangle-circle-square::before {
+ content: "\f61f"; }
+
+.fa-shuffle::before {
+ content: "\f074"; }
+
+.fa-random::before {
+ content: "\f074"; }
+
+.fa-person-running::before {
+ content: "\f70c"; }
+
+.fa-running::before {
+ content: "\f70c"; }
+
+.fa-mobile-retro::before {
+ content: "\e527"; }
+
+.fa-grip-lines-vertical::before {
+ content: "\f7a5"; }
+
+.fa-spider::before {
+ content: "\f717"; }
+
+.fa-hands-bound::before {
+ content: "\e4f9"; }
+
+.fa-file-invoice-dollar::before {
+ content: "\f571"; }
+
+.fa-plane-circle-exclamation::before {
+ content: "\e556"; }
+
+.fa-x-ray::before {
+ content: "\f497"; }
+
+.fa-spell-check::before {
+ content: "\f891"; }
+
+.fa-slash::before {
+ content: "\f715"; }
+
+.fa-computer-mouse::before {
+ content: "\f8cc"; }
+
+.fa-mouse::before {
+ content: "\f8cc"; }
+
+.fa-arrow-right-to-bracket::before {
+ content: "\f090"; }
+
+.fa-sign-in::before {
+ content: "\f090"; }
+
+.fa-shop-slash::before {
+ content: "\e070"; }
+
+.fa-store-alt-slash::before {
+ content: "\e070"; }
+
+.fa-server::before {
+ content: "\f233"; }
+
+.fa-virus-covid-slash::before {
+ content: "\e4a9"; }
+
+.fa-shop-lock::before {
+ content: "\e4a5"; }
+
+.fa-hourglass-start::before {
+ content: "\f251"; }
+
+.fa-hourglass-1::before {
+ content: "\f251"; }
+
+.fa-blender-phone::before {
+ content: "\f6b6"; }
+
+.fa-building-wheat::before {
+ content: "\e4db"; }
+
+.fa-person-breastfeeding::before {
+ content: "\e53a"; }
+
+.fa-right-to-bracket::before {
+ content: "\f2f6"; }
+
+.fa-sign-in-alt::before {
+ content: "\f2f6"; }
+
+.fa-venus::before {
+ content: "\f221"; }
+
+.fa-passport::before {
+ content: "\f5ab"; }
+
+.fa-heart-pulse::before {
+ content: "\f21e"; }
+
+.fa-heartbeat::before {
+ content: "\f21e"; }
+
+.fa-people-carry-box::before {
+ content: "\f4ce"; }
+
+.fa-people-carry::before {
+ content: "\f4ce"; }
+
+.fa-temperature-high::before {
+ content: "\f769"; }
+
+.fa-microchip::before {
+ content: "\f2db"; }
+
+.fa-crown::before {
+ content: "\f521"; }
+
+.fa-weight-hanging::before {
+ content: "\f5cd"; }
+
+.fa-xmarks-lines::before {
+ content: "\e59a"; }
+
+.fa-file-prescription::before {
+ content: "\f572"; }
+
+.fa-weight-scale::before {
+ content: "\f496"; }
+
+.fa-weight::before {
+ content: "\f496"; }
+
+.fa-user-group::before {
+ content: "\f500"; }
+
+.fa-user-friends::before {
+ content: "\f500"; }
+
+.fa-arrow-up-a-z::before {
+ content: "\f15e"; }
+
+.fa-sort-alpha-up::before {
+ content: "\f15e"; }
+
+.fa-chess-knight::before {
+ content: "\f441"; }
+
+.fa-face-laugh-squint::before {
+ content: "\f59b"; }
+
+.fa-laugh-squint::before {
+ content: "\f59b"; }
+
+.fa-wheelchair::before {
+ content: "\f193"; }
+
+.fa-circle-arrow-up::before {
+ content: "\f0aa"; }
+
+.fa-arrow-circle-up::before {
+ content: "\f0aa"; }
+
+.fa-toggle-on::before {
+ content: "\f205"; }
+
+.fa-person-walking::before {
+ content: "\f554"; }
+
+.fa-walking::before {
+ content: "\f554"; }
+
+.fa-l::before {
+ content: "\4c"; }
+
+.fa-fire::before {
+ content: "\f06d"; }
+
+.fa-bed-pulse::before {
+ content: "\f487"; }
+
+.fa-procedures::before {
+ content: "\f487"; }
+
+.fa-shuttle-space::before {
+ content: "\f197"; }
+
+.fa-space-shuttle::before {
+ content: "\f197"; }
+
+.fa-face-laugh::before {
+ content: "\f599"; }
+
+.fa-laugh::before {
+ content: "\f599"; }
+
+.fa-folder-open::before {
+ content: "\f07c"; }
+
+.fa-heart-circle-plus::before {
+ content: "\e500"; }
+
+.fa-code-fork::before {
+ content: "\e13b"; }
+
+.fa-city::before {
+ content: "\f64f"; }
+
+.fa-microphone-lines::before {
+ content: "\f3c9"; }
+
+.fa-microphone-alt::before {
+ content: "\f3c9"; }
+
+.fa-pepper-hot::before {
+ content: "\f816"; }
+
+.fa-unlock::before {
+ content: "\f09c"; }
+
+.fa-colon-sign::before {
+ content: "\e140"; }
+
+.fa-headset::before {
+ content: "\f590"; }
+
+.fa-store-slash::before {
+ content: "\e071"; }
+
+.fa-road-circle-xmark::before {
+ content: "\e566"; }
+
+.fa-user-minus::before {
+ content: "\f503"; }
+
+.fa-mars-stroke-up::before {
+ content: "\f22a"; }
+
+.fa-mars-stroke-v::before {
+ content: "\f22a"; }
+
+.fa-champagne-glasses::before {
+ content: "\f79f"; }
+
+.fa-glass-cheers::before {
+ content: "\f79f"; }
+
+.fa-clipboard::before {
+ content: "\f328"; }
+
+.fa-house-circle-exclamation::before {
+ content: "\e50a"; }
+
+.fa-file-arrow-up::before {
+ content: "\f574"; }
+
+.fa-file-upload::before {
+ content: "\f574"; }
+
+.fa-wifi::before {
+ content: "\f1eb"; }
+
+.fa-wifi-3::before {
+ content: "\f1eb"; }
+
+.fa-wifi-strong::before {
+ content: "\f1eb"; }
+
+.fa-bath::before {
+ content: "\f2cd"; }
+
+.fa-bathtub::before {
+ content: "\f2cd"; }
+
+.fa-underline::before {
+ content: "\f0cd"; }
+
+.fa-user-pen::before {
+ content: "\f4ff"; }
+
+.fa-user-edit::before {
+ content: "\f4ff"; }
+
+.fa-signature::before {
+ content: "\f5b7"; }
+
+.fa-stroopwafel::before {
+ content: "\f551"; }
+
+.fa-bold::before {
+ content: "\f032"; }
+
+.fa-anchor-lock::before {
+ content: "\e4ad"; }
+
+.fa-building-ngo::before {
+ content: "\e4d7"; }
+
+.fa-manat-sign::before {
+ content: "\e1d5"; }
+
+.fa-not-equal::before {
+ content: "\f53e"; }
+
+.fa-border-top-left::before {
+ content: "\f853"; }
+
+.fa-border-style::before {
+ content: "\f853"; }
+
+.fa-map-location-dot::before {
+ content: "\f5a0"; }
+
+.fa-map-marked-alt::before {
+ content: "\f5a0"; }
+
+.fa-jedi::before {
+ content: "\f669"; }
+
+.fa-square-poll-vertical::before {
+ content: "\f681"; }
+
+.fa-poll::before {
+ content: "\f681"; }
+
+.fa-mug-hot::before {
+ content: "\f7b6"; }
+
+.fa-car-battery::before {
+ content: "\f5df"; }
+
+.fa-battery-car::before {
+ content: "\f5df"; }
+
+.fa-gift::before {
+ content: "\f06b"; }
+
+.fa-dice-two::before {
+ content: "\f528"; }
+
+.fa-chess-queen::before {
+ content: "\f445"; }
+
+.fa-glasses::before {
+ content: "\f530"; }
+
+.fa-chess-board::before {
+ content: "\f43c"; }
+
+.fa-building-circle-check::before {
+ content: "\e4d2"; }
+
+.fa-person-chalkboard::before {
+ content: "\e53d"; }
+
+.fa-mars-stroke-right::before {
+ content: "\f22b"; }
+
+.fa-mars-stroke-h::before {
+ content: "\f22b"; }
+
+.fa-hand-back-fist::before {
+ content: "\f255"; }
+
+.fa-hand-rock::before {
+ content: "\f255"; }
+
+.fa-square-caret-up::before {
+ content: "\f151"; }
+
+.fa-caret-square-up::before {
+ content: "\f151"; }
+
+.fa-cloud-showers-water::before {
+ content: "\e4e4"; }
+
+.fa-chart-bar::before {
+ content: "\f080"; }
+
+.fa-bar-chart::before {
+ content: "\f080"; }
+
+.fa-hands-bubbles::before {
+ content: "\e05e"; }
+
+.fa-hands-wash::before {
+ content: "\e05e"; }
+
+.fa-less-than-equal::before {
+ content: "\f537"; }
+
+.fa-train::before {
+ content: "\f238"; }
+
+.fa-eye-low-vision::before {
+ content: "\f2a8"; }
+
+.fa-low-vision::before {
+ content: "\f2a8"; }
+
+.fa-crow::before {
+ content: "\f520"; }
+
+.fa-sailboat::before {
+ content: "\e445"; }
+
+.fa-window-restore::before {
+ content: "\f2d2"; }
+
+.fa-square-plus::before {
+ content: "\f0fe"; }
+
+.fa-plus-square::before {
+ content: "\f0fe"; }
+
+.fa-torii-gate::before {
+ content: "\f6a1"; }
+
+.fa-frog::before {
+ content: "\f52e"; }
+
+.fa-bucket::before {
+ content: "\e4cf"; }
+
+.fa-image::before {
+ content: "\f03e"; }
+
+.fa-microphone::before {
+ content: "\f130"; }
+
+.fa-cow::before {
+ content: "\f6c8"; }
+
+.fa-caret-up::before {
+ content: "\f0d8"; }
+
+.fa-screwdriver::before {
+ content: "\f54a"; }
+
+.fa-folder-closed::before {
+ content: "\e185"; }
+
+.fa-house-tsunami::before {
+ content: "\e515"; }
+
+.fa-square-nfi::before {
+ content: "\e576"; }
+
+.fa-arrow-up-from-ground-water::before {
+ content: "\e4b5"; }
+
+.fa-martini-glass::before {
+ content: "\f57b"; }
+
+.fa-glass-martini-alt::before {
+ content: "\f57b"; }
+
+.fa-rotate-left::before {
+ content: "\f2ea"; }
+
+.fa-rotate-back::before {
+ content: "\f2ea"; }
+
+.fa-rotate-backward::before {
+ content: "\f2ea"; }
+
+.fa-undo-alt::before {
+ content: "\f2ea"; }
+
+.fa-table-columns::before {
+ content: "\f0db"; }
+
+.fa-columns::before {
+ content: "\f0db"; }
+
+.fa-lemon::before {
+ content: "\f094"; }
+
+.fa-head-side-mask::before {
+ content: "\e063"; }
+
+.fa-handshake::before {
+ content: "\f2b5"; }
+
+.fa-gem::before {
+ content: "\f3a5"; }
+
+.fa-dolly::before {
+ content: "\f472"; }
+
+.fa-dolly-box::before {
+ content: "\f472"; }
+
+.fa-smoking::before {
+ content: "\f48d"; }
+
+.fa-minimize::before {
+ content: "\f78c"; }
+
+.fa-compress-arrows-alt::before {
+ content: "\f78c"; }
+
+.fa-monument::before {
+ content: "\f5a6"; }
+
+.fa-snowplow::before {
+ content: "\f7d2"; }
+
+.fa-angles-right::before {
+ content: "\f101"; }
+
+.fa-angle-double-right::before {
+ content: "\f101"; }
+
+.fa-cannabis::before {
+ content: "\f55f"; }
+
+.fa-circle-play::before {
+ content: "\f144"; }
+
+.fa-play-circle::before {
+ content: "\f144"; }
+
+.fa-tablets::before {
+ content: "\f490"; }
+
+.fa-ethernet::before {
+ content: "\f796"; }
+
+.fa-euro-sign::before {
+ content: "\f153"; }
+
+.fa-eur::before {
+ content: "\f153"; }
+
+.fa-euro::before {
+ content: "\f153"; }
+
+.fa-chair::before {
+ content: "\f6c0"; }
+
+.fa-circle-check::before {
+ content: "\f058"; }
+
+.fa-check-circle::before {
+ content: "\f058"; }
+
+.fa-circle-stop::before {
+ content: "\f28d"; }
+
+.fa-stop-circle::before {
+ content: "\f28d"; }
+
+.fa-compass-drafting::before {
+ content: "\f568"; }
+
+.fa-drafting-compass::before {
+ content: "\f568"; }
+
+.fa-plate-wheat::before {
+ content: "\e55a"; }
+
+.fa-icicles::before {
+ content: "\f7ad"; }
+
+.fa-person-shelter::before {
+ content: "\e54f"; }
+
+.fa-neuter::before {
+ content: "\f22c"; }
+
+.fa-id-badge::before {
+ content: "\f2c1"; }
+
+.fa-marker::before {
+ content: "\f5a1"; }
+
+.fa-face-laugh-beam::before {
+ content: "\f59a"; }
+
+.fa-laugh-beam::before {
+ content: "\f59a"; }
+
+.fa-helicopter-symbol::before {
+ content: "\e502"; }
+
+.fa-universal-access::before {
+ content: "\f29a"; }
+
+.fa-circle-chevron-up::before {
+ content: "\f139"; }
+
+.fa-chevron-circle-up::before {
+ content: "\f139"; }
+
+.fa-lari-sign::before {
+ content: "\e1c8"; }
+
+.fa-volcano::before {
+ content: "\f770"; }
+
+.fa-person-walking-dashed-line-arrow-right::before {
+ content: "\e553"; }
+
+.fa-sterling-sign::before {
+ content: "\f154"; }
+
+.fa-gbp::before {
+ content: "\f154"; }
+
+.fa-pound-sign::before {
+ content: "\f154"; }
+
+.fa-viruses::before {
+ content: "\e076"; }
+
+.fa-square-person-confined::before {
+ content: "\e577"; }
+
+.fa-user-tie::before {
+ content: "\f508"; }
+
+.fa-arrow-down-long::before {
+ content: "\f175"; }
+
+.fa-long-arrow-down::before {
+ content: "\f175"; }
+
+.fa-tent-arrow-down-to-line::before {
+ content: "\e57e"; }
+
+.fa-certificate::before {
+ content: "\f0a3"; }
+
+.fa-reply-all::before {
+ content: "\f122"; }
+
+.fa-mail-reply-all::before {
+ content: "\f122"; }
+
+.fa-suitcase::before {
+ content: "\f0f2"; }
+
+.fa-person-skating::before {
+ content: "\f7c5"; }
+
+.fa-skating::before {
+ content: "\f7c5"; }
+
+.fa-filter-circle-dollar::before {
+ content: "\f662"; }
+
+.fa-funnel-dollar::before {
+ content: "\f662"; }
+
+.fa-camera-retro::before {
+ content: "\f083"; }
+
+.fa-circle-arrow-down::before {
+ content: "\f0ab"; }
+
+.fa-arrow-circle-down::before {
+ content: "\f0ab"; }
+
+.fa-file-import::before {
+ content: "\f56f"; }
+
+.fa-arrow-right-to-file::before {
+ content: "\f56f"; }
+
+.fa-square-arrow-up-right::before {
+ content: "\f14c"; }
+
+.fa-external-link-square::before {
+ content: "\f14c"; }
+
+.fa-box-open::before {
+ content: "\f49e"; }
+
+.fa-scroll::before {
+ content: "\f70e"; }
+
+.fa-spa::before {
+ content: "\f5bb"; }
+
+.fa-location-pin-lock::before {
+ content: "\e51f"; }
+
+.fa-pause::before {
+ content: "\f04c"; }
+
+.fa-hill-avalanche::before {
+ content: "\e507"; }
+
+.fa-temperature-empty::before {
+ content: "\f2cb"; }
+
+.fa-temperature-0::before {
+ content: "\f2cb"; }
+
+.fa-thermometer-0::before {
+ content: "\f2cb"; }
+
+.fa-thermometer-empty::before {
+ content: "\f2cb"; }
+
+.fa-bomb::before {
+ content: "\f1e2"; }
+
+.fa-registered::before {
+ content: "\f25d"; }
+
+.fa-address-card::before {
+ content: "\f2bb"; }
+
+.fa-contact-card::before {
+ content: "\f2bb"; }
+
+.fa-vcard::before {
+ content: "\f2bb"; }
+
+.fa-scale-unbalanced-flip::before {
+ content: "\f516"; }
+
+.fa-balance-scale-right::before {
+ content: "\f516"; }
+
+.fa-subscript::before {
+ content: "\f12c"; }
+
+.fa-diamond-turn-right::before {
+ content: "\f5eb"; }
+
+.fa-directions::before {
+ content: "\f5eb"; }
+
+.fa-burst::before {
+ content: "\e4dc"; }
+
+.fa-house-laptop::before {
+ content: "\e066"; }
+
+.fa-laptop-house::before {
+ content: "\e066"; }
+
+.fa-face-tired::before {
+ content: "\f5c8"; }
+
+.fa-tired::before {
+ content: "\f5c8"; }
+
+.fa-money-bills::before {
+ content: "\e1f3"; }
+
+.fa-smog::before {
+ content: "\f75f"; }
+
+.fa-crutch::before {
+ content: "\f7f7"; }
+
+.fa-cloud-arrow-up::before {
+ content: "\f0ee"; }
+
+.fa-cloud-upload::before {
+ content: "\f0ee"; }
+
+.fa-cloud-upload-alt::before {
+ content: "\f0ee"; }
+
+.fa-palette::before {
+ content: "\f53f"; }
+
+.fa-arrows-turn-right::before {
+ content: "\e4c0"; }
+
+.fa-vest::before {
+ content: "\e085"; }
+
+.fa-ferry::before {
+ content: "\e4ea"; }
+
+.fa-arrows-down-to-people::before {
+ content: "\e4b9"; }
+
+.fa-seedling::before {
+ content: "\f4d8"; }
+
+.fa-sprout::before {
+ content: "\f4d8"; }
+
+.fa-left-right::before {
+ content: "\f337"; }
+
+.fa-arrows-alt-h::before {
+ content: "\f337"; }
+
+.fa-boxes-packing::before {
+ content: "\e4c7"; }
+
+.fa-circle-arrow-left::before {
+ content: "\f0a8"; }
+
+.fa-arrow-circle-left::before {
+ content: "\f0a8"; }
+
+.fa-group-arrows-rotate::before {
+ content: "\e4f6"; }
+
+.fa-bowl-food::before {
+ content: "\e4c6"; }
+
+.fa-candy-cane::before {
+ content: "\f786"; }
+
+.fa-arrow-down-wide-short::before {
+ content: "\f160"; }
+
+.fa-sort-amount-asc::before {
+ content: "\f160"; }
+
+.fa-sort-amount-down::before {
+ content: "\f160"; }
+
+.fa-cloud-bolt::before {
+ content: "\f76c"; }
+
+.fa-thunderstorm::before {
+ content: "\f76c"; }
+
+.fa-text-slash::before {
+ content: "\f87d"; }
+
+.fa-remove-format::before {
+ content: "\f87d"; }
+
+.fa-face-smile-wink::before {
+ content: "\f4da"; }
+
+.fa-smile-wink::before {
+ content: "\f4da"; }
+
+.fa-file-word::before {
+ content: "\f1c2"; }
+
+.fa-file-powerpoint::before {
+ content: "\f1c4"; }
+
+.fa-arrows-left-right::before {
+ content: "\f07e"; }
+
+.fa-arrows-h::before {
+ content: "\f07e"; }
+
+.fa-house-lock::before {
+ content: "\e510"; }
+
+.fa-cloud-arrow-down::before {
+ content: "\f0ed"; }
+
+.fa-cloud-download::before {
+ content: "\f0ed"; }
+
+.fa-cloud-download-alt::before {
+ content: "\f0ed"; }
+
+.fa-children::before {
+ content: "\e4e1"; }
+
+.fa-chalkboard::before {
+ content: "\f51b"; }
+
+.fa-blackboard::before {
+ content: "\f51b"; }
+
+.fa-user-large-slash::before {
+ content: "\f4fa"; }
+
+.fa-user-alt-slash::before {
+ content: "\f4fa"; }
+
+.fa-envelope-open::before {
+ content: "\f2b6"; }
+
+.fa-handshake-simple-slash::before {
+ content: "\e05f"; }
+
+.fa-handshake-alt-slash::before {
+ content: "\e05f"; }
+
+.fa-mattress-pillow::before {
+ content: "\e525"; }
+
+.fa-guarani-sign::before {
+ content: "\e19a"; }
+
+.fa-arrows-rotate::before {
+ content: "\f021"; }
+
+.fa-refresh::before {
+ content: "\f021"; }
+
+.fa-sync::before {
+ content: "\f021"; }
+
+.fa-fire-extinguisher::before {
+ content: "\f134"; }
+
+.fa-cruzeiro-sign::before {
+ content: "\e152"; }
+
+.fa-greater-than-equal::before {
+ content: "\f532"; }
+
+.fa-shield-halved::before {
+ content: "\f3ed"; }
+
+.fa-shield-alt::before {
+ content: "\f3ed"; }
+
+.fa-book-atlas::before {
+ content: "\f558"; }
+
+.fa-atlas::before {
+ content: "\f558"; }
+
+.fa-virus::before {
+ content: "\e074"; }
+
+.fa-envelope-circle-check::before {
+ content: "\e4e8"; }
+
+.fa-layer-group::before {
+ content: "\f5fd"; }
+
+.fa-arrows-to-dot::before {
+ content: "\e4be"; }
+
+.fa-archway::before {
+ content: "\f557"; }
+
+.fa-heart-circle-check::before {
+ content: "\e4fd"; }
+
+.fa-house-chimney-crack::before {
+ content: "\f6f1"; }
+
+.fa-house-damage::before {
+ content: "\f6f1"; }
+
+.fa-file-zipper::before {
+ content: "\f1c6"; }
+
+.fa-file-archive::before {
+ content: "\f1c6"; }
+
+.fa-square::before {
+ content: "\f0c8"; }
+
+.fa-martini-glass-empty::before {
+ content: "\f000"; }
+
+.fa-glass-martini::before {
+ content: "\f000"; }
+
+.fa-couch::before {
+ content: "\f4b8"; }
+
+.fa-cedi-sign::before {
+ content: "\e0df"; }
+
+.fa-italic::before {
+ content: "\f033"; }
+
+.fa-church::before {
+ content: "\f51d"; }
+
+.fa-comments-dollar::before {
+ content: "\f653"; }
+
+.fa-democrat::before {
+ content: "\f747"; }
+
+.fa-z::before {
+ content: "\5a"; }
+
+.fa-person-skiing::before {
+ content: "\f7c9"; }
+
+.fa-skiing::before {
+ content: "\f7c9"; }
+
+.fa-road-lock::before {
+ content: "\e567"; }
+
+.fa-a::before {
+ content: "\41"; }
+
+.fa-temperature-arrow-down::before {
+ content: "\e03f"; }
+
+.fa-temperature-down::before {
+ content: "\e03f"; }
+
+.fa-feather-pointed::before {
+ content: "\f56b"; }
+
+.fa-feather-alt::before {
+ content: "\f56b"; }
+
+.fa-p::before {
+ content: "\50"; }
+
+.fa-snowflake::before {
+ content: "\f2dc"; }
+
+.fa-newspaper::before {
+ content: "\f1ea"; }
+
+.fa-rectangle-ad::before {
+ content: "\f641"; }
+
+.fa-ad::before {
+ content: "\f641"; }
+
+.fa-circle-arrow-right::before {
+ content: "\f0a9"; }
+
+.fa-arrow-circle-right::before {
+ content: "\f0a9"; }
+
+.fa-filter-circle-xmark::before {
+ content: "\e17b"; }
+
+.fa-locust::before {
+ content: "\e520"; }
+
+.fa-sort::before {
+ content: "\f0dc"; }
+
+.fa-unsorted::before {
+ content: "\f0dc"; }
+
+.fa-list-ol::before {
+ content: "\f0cb"; }
+
+.fa-list-1-2::before {
+ content: "\f0cb"; }
+
+.fa-list-numeric::before {
+ content: "\f0cb"; }
+
+.fa-person-dress-burst::before {
+ content: "\e544"; }
+
+.fa-money-check-dollar::before {
+ content: "\f53d"; }
+
+.fa-money-check-alt::before {
+ content: "\f53d"; }
+
+.fa-vector-square::before {
+ content: "\f5cb"; }
+
+.fa-bread-slice::before {
+ content: "\f7ec"; }
+
+.fa-language::before {
+ content: "\f1ab"; }
+
+.fa-face-kiss-wink-heart::before {
+ content: "\f598"; }
+
+.fa-kiss-wink-heart::before {
+ content: "\f598"; }
+
+.fa-filter::before {
+ content: "\f0b0"; }
+
+.fa-question::before {
+ content: "\3f"; }
+
+.fa-file-signature::before {
+ content: "\f573"; }
+
+.fa-up-down-left-right::before {
+ content: "\f0b2"; }
+
+.fa-arrows-alt::before {
+ content: "\f0b2"; }
+
+.fa-house-chimney-user::before {
+ content: "\e065"; }
+
+.fa-hand-holding-heart::before {
+ content: "\f4be"; }
+
+.fa-puzzle-piece::before {
+ content: "\f12e"; }
+
+.fa-money-check::before {
+ content: "\f53c"; }
+
+.fa-star-half-stroke::before {
+ content: "\f5c0"; }
+
+.fa-star-half-alt::before {
+ content: "\f5c0"; }
+
+.fa-code::before {
+ content: "\f121"; }
+
+.fa-whiskey-glass::before {
+ content: "\f7a0"; }
+
+.fa-glass-whiskey::before {
+ content: "\f7a0"; }
+
+.fa-building-circle-exclamation::before {
+ content: "\e4d3"; }
+
+.fa-magnifying-glass-chart::before {
+ content: "\e522"; }
+
+.fa-arrow-up-right-from-square::before {
+ content: "\f08e"; }
+
+.fa-external-link::before {
+ content: "\f08e"; }
+
+.fa-cubes-stacked::before {
+ content: "\e4e6"; }
+
+.fa-won-sign::before {
+ content: "\f159"; }
+
+.fa-krw::before {
+ content: "\f159"; }
+
+.fa-won::before {
+ content: "\f159"; }
+
+.fa-virus-covid::before {
+ content: "\e4a8"; }
+
+.fa-austral-sign::before {
+ content: "\e0a9"; }
+
+.fa-f::before {
+ content: "\46"; }
+
+.fa-leaf::before {
+ content: "\f06c"; }
+
+.fa-road::before {
+ content: "\f018"; }
+
+.fa-taxi::before {
+ content: "\f1ba"; }
+
+.fa-cab::before {
+ content: "\f1ba"; }
+
+.fa-person-circle-plus::before {
+ content: "\e541"; }
+
+.fa-chart-pie::before {
+ content: "\f200"; }
+
+.fa-pie-chart::before {
+ content: "\f200"; }
+
+.fa-bolt-lightning::before {
+ content: "\e0b7"; }
+
+.fa-sack-xmark::before {
+ content: "\e56a"; }
+
+.fa-file-excel::before {
+ content: "\f1c3"; }
+
+.fa-file-contract::before {
+ content: "\f56c"; }
+
+.fa-fish-fins::before {
+ content: "\e4f2"; }
+
+.fa-building-flag::before {
+ content: "\e4d5"; }
+
+.fa-face-grin-beam::before {
+ content: "\f582"; }
+
+.fa-grin-beam::before {
+ content: "\f582"; }
+
+.fa-object-ungroup::before {
+ content: "\f248"; }
+
+.fa-poop::before {
+ content: "\f619"; }
+
+.fa-location-pin::before {
+ content: "\f041"; }
+
+.fa-map-marker::before {
+ content: "\f041"; }
+
+.fa-kaaba::before {
+ content: "\f66b"; }
+
+.fa-toilet-paper::before {
+ content: "\f71e"; }
+
+.fa-helmet-safety::before {
+ content: "\f807"; }
+
+.fa-hard-hat::before {
+ content: "\f807"; }
+
+.fa-hat-hard::before {
+ content: "\f807"; }
+
+.fa-eject::before {
+ content: "\f052"; }
+
+.fa-circle-right::before {
+ content: "\f35a"; }
+
+.fa-arrow-alt-circle-right::before {
+ content: "\f35a"; }
+
+.fa-plane-circle-check::before {
+ content: "\e555"; }
+
+.fa-face-rolling-eyes::before {
+ content: "\f5a5"; }
+
+.fa-meh-rolling-eyes::before {
+ content: "\f5a5"; }
+
+.fa-object-group::before {
+ content: "\f247"; }
+
+.fa-chart-line::before {
+ content: "\f201"; }
+
+.fa-line-chart::before {
+ content: "\f201"; }
+
+.fa-mask-ventilator::before {
+ content: "\e524"; }
+
+.fa-arrow-right::before {
+ content: "\f061"; }
+
+.fa-signs-post::before {
+ content: "\f277"; }
+
+.fa-map-signs::before {
+ content: "\f277"; }
+
+.fa-cash-register::before {
+ content: "\f788"; }
+
+.fa-person-circle-question::before {
+ content: "\e542"; }
+
+.fa-h::before {
+ content: "\48"; }
+
+.fa-tarp::before {
+ content: "\e57b"; }
+
+.fa-screwdriver-wrench::before {
+ content: "\f7d9"; }
+
+.fa-tools::before {
+ content: "\f7d9"; }
+
+.fa-arrows-to-eye::before {
+ content: "\e4bf"; }
+
+.fa-plug-circle-bolt::before {
+ content: "\e55b"; }
+
+.fa-heart::before {
+ content: "\f004"; }
+
+.fa-mars-and-venus::before {
+ content: "\f224"; }
+
+.fa-house-user::before {
+ content: "\e1b0"; }
+
+.fa-home-user::before {
+ content: "\e1b0"; }
+
+.fa-dumpster-fire::before {
+ content: "\f794"; }
+
+.fa-house-crack::before {
+ content: "\e3b1"; }
+
+.fa-martini-glass-citrus::before {
+ content: "\f561"; }
+
+.fa-cocktail::before {
+ content: "\f561"; }
+
+.fa-face-surprise::before {
+ content: "\f5c2"; }
+
+.fa-surprise::before {
+ content: "\f5c2"; }
+
+.fa-bottle-water::before {
+ content: "\e4c5"; }
+
+.fa-circle-pause::before {
+ content: "\f28b"; }
+
+.fa-pause-circle::before {
+ content: "\f28b"; }
+
+.fa-toilet-paper-slash::before {
+ content: "\e072"; }
+
+.fa-apple-whole::before {
+ content: "\f5d1"; }
+
+.fa-apple-alt::before {
+ content: "\f5d1"; }
+
+.fa-kitchen-set::before {
+ content: "\e51a"; }
+
+.fa-r::before {
+ content: "\52"; }
+
+.fa-temperature-quarter::before {
+ content: "\f2ca"; }
+
+.fa-temperature-1::before {
+ content: "\f2ca"; }
+
+.fa-thermometer-1::before {
+ content: "\f2ca"; }
+
+.fa-thermometer-quarter::before {
+ content: "\f2ca"; }
+
+.fa-cube::before {
+ content: "\f1b2"; }
+
+.fa-bitcoin-sign::before {
+ content: "\e0b4"; }
+
+.fa-shield-dog::before {
+ content: "\e573"; }
+
+.fa-solar-panel::before {
+ content: "\f5ba"; }
+
+.fa-lock-open::before {
+ content: "\f3c1"; }
+
+.fa-elevator::before {
+ content: "\e16d"; }
+
+.fa-money-bill-transfer::before {
+ content: "\e528"; }
+
+.fa-money-bill-trend-up::before {
+ content: "\e529"; }
+
+.fa-house-flood-water-circle-arrow-right::before {
+ content: "\e50f"; }
+
+.fa-square-poll-horizontal::before {
+ content: "\f682"; }
+
+.fa-poll-h::before {
+ content: "\f682"; }
+
+.fa-circle::before {
+ content: "\f111"; }
+
+.fa-backward-fast::before {
+ content: "\f049"; }
+
+.fa-fast-backward::before {
+ content: "\f049"; }
+
+.fa-recycle::before {
+ content: "\f1b8"; }
+
+.fa-user-astronaut::before {
+ content: "\f4fb"; }
+
+.fa-plane-slash::before {
+ content: "\e069"; }
+
+.fa-trademark::before {
+ content: "\f25c"; }
+
+.fa-basketball::before {
+ content: "\f434"; }
+
+.fa-basketball-ball::before {
+ content: "\f434"; }
+
+.fa-satellite-dish::before {
+ content: "\f7c0"; }
+
+.fa-circle-up::before {
+ content: "\f35b"; }
+
+.fa-arrow-alt-circle-up::before {
+ content: "\f35b"; }
+
+.fa-mobile-screen-button::before {
+ content: "\f3cd"; }
+
+.fa-mobile-alt::before {
+ content: "\f3cd"; }
+
+.fa-volume-high::before {
+ content: "\f028"; }
+
+.fa-volume-up::before {
+ content: "\f028"; }
+
+.fa-users-rays::before {
+ content: "\e593"; }
+
+.fa-wallet::before {
+ content: "\f555"; }
+
+.fa-clipboard-check::before {
+ content: "\f46c"; }
+
+.fa-file-audio::before {
+ content: "\f1c7"; }
+
+.fa-burger::before {
+ content: "\f805"; }
+
+.fa-hamburger::before {
+ content: "\f805"; }
+
+.fa-wrench::before {
+ content: "\f0ad"; }
+
+.fa-bugs::before {
+ content: "\e4d0"; }
+
+.fa-rupee-sign::before {
+ content: "\f156"; }
+
+.fa-rupee::before {
+ content: "\f156"; }
+
+.fa-file-image::before {
+ content: "\f1c5"; }
+
+.fa-circle-question::before {
+ content: "\f059"; }
+
+.fa-question-circle::before {
+ content: "\f059"; }
+
+.fa-plane-departure::before {
+ content: "\f5b0"; }
+
+.fa-handshake-slash::before {
+ content: "\e060"; }
+
+.fa-book-bookmark::before {
+ content: "\e0bb"; }
+
+.fa-code-branch::before {
+ content: "\f126"; }
+
+.fa-hat-cowboy::before {
+ content: "\f8c0"; }
+
+.fa-bridge::before {
+ content: "\e4c8"; }
+
+.fa-phone-flip::before {
+ content: "\f879"; }
+
+.fa-phone-alt::before {
+ content: "\f879"; }
+
+.fa-truck-front::before {
+ content: "\e2b7"; }
+
+.fa-cat::before {
+ content: "\f6be"; }
+
+.fa-anchor-circle-exclamation::before {
+ content: "\e4ab"; }
+
+.fa-truck-field::before {
+ content: "\e58d"; }
+
+.fa-route::before {
+ content: "\f4d7"; }
+
+.fa-clipboard-question::before {
+ content: "\e4e3"; }
+
+.fa-panorama::before {
+ content: "\e209"; }
+
+.fa-comment-medical::before {
+ content: "\f7f5"; }
+
+.fa-teeth-open::before {
+ content: "\f62f"; }
+
+.fa-file-circle-minus::before {
+ content: "\e4ed"; }
+
+.fa-tags::before {
+ content: "\f02c"; }
+
+.fa-wine-glass::before {
+ content: "\f4e3"; }
+
+.fa-forward-fast::before {
+ content: "\f050"; }
+
+.fa-fast-forward::before {
+ content: "\f050"; }
+
+.fa-face-meh-blank::before {
+ content: "\f5a4"; }
+
+.fa-meh-blank::before {
+ content: "\f5a4"; }
+
+.fa-square-parking::before {
+ content: "\f540"; }
+
+.fa-parking::before {
+ content: "\f540"; }
+
+.fa-house-signal::before {
+ content: "\e012"; }
+
+.fa-bars-progress::before {
+ content: "\f828"; }
+
+.fa-tasks-alt::before {
+ content: "\f828"; }
+
+.fa-faucet-drip::before {
+ content: "\e006"; }
+
+.fa-cart-flatbed::before {
+ content: "\f474"; }
+
+.fa-dolly-flatbed::before {
+ content: "\f474"; }
+
+.fa-ban-smoking::before {
+ content: "\f54d"; }
+
+.fa-smoking-ban::before {
+ content: "\f54d"; }
+
+.fa-terminal::before {
+ content: "\f120"; }
+
+.fa-mobile-button::before {
+ content: "\f10b"; }
+
+.fa-house-medical-flag::before {
+ content: "\e514"; }
+
+.fa-basket-shopping::before {
+ content: "\f291"; }
+
+.fa-shopping-basket::before {
+ content: "\f291"; }
+
+.fa-tape::before {
+ content: "\f4db"; }
+
+.fa-bus-simple::before {
+ content: "\f55e"; }
+
+.fa-bus-alt::before {
+ content: "\f55e"; }
+
+.fa-eye::before {
+ content: "\f06e"; }
+
+.fa-face-sad-cry::before {
+ content: "\f5b3"; }
+
+.fa-sad-cry::before {
+ content: "\f5b3"; }
+
+.fa-audio-description::before {
+ content: "\f29e"; }
+
+.fa-person-military-to-person::before {
+ content: "\e54c"; }
+
+.fa-file-shield::before {
+ content: "\e4f0"; }
+
+.fa-user-slash::before {
+ content: "\f506"; }
+
+.fa-pen::before {
+ content: "\f304"; }
+
+.fa-tower-observation::before {
+ content: "\e586"; }
+
+.fa-file-code::before {
+ content: "\f1c9"; }
+
+.fa-signal::before {
+ content: "\f012"; }
+
+.fa-signal-5::before {
+ content: "\f012"; }
+
+.fa-signal-perfect::before {
+ content: "\f012"; }
+
+.fa-bus::before {
+ content: "\f207"; }
+
+.fa-heart-circle-xmark::before {
+ content: "\e501"; }
+
+.fa-house-chimney::before {
+ content: "\e3af"; }
+
+.fa-home-lg::before {
+ content: "\e3af"; }
+
+.fa-window-maximize::before {
+ content: "\f2d0"; }
+
+.fa-face-frown::before {
+ content: "\f119"; }
+
+.fa-frown::before {
+ content: "\f119"; }
+
+.fa-prescription::before {
+ content: "\f5b1"; }
+
+.fa-shop::before {
+ content: "\f54f"; }
+
+.fa-store-alt::before {
+ content: "\f54f"; }
+
+.fa-floppy-disk::before {
+ content: "\f0c7"; }
+
+.fa-save::before {
+ content: "\f0c7"; }
+
+.fa-vihara::before {
+ content: "\f6a7"; }
+
+.fa-scale-unbalanced::before {
+ content: "\f515"; }
+
+.fa-balance-scale-left::before {
+ content: "\f515"; }
+
+.fa-sort-up::before {
+ content: "\f0de"; }
+
+.fa-sort-asc::before {
+ content: "\f0de"; }
+
+.fa-comment-dots::before {
+ content: "\f4ad"; }
+
+.fa-commenting::before {
+ content: "\f4ad"; }
+
+.fa-plant-wilt::before {
+ content: "\e5aa"; }
+
+.fa-diamond::before {
+ content: "\f219"; }
+
+.fa-face-grin-squint::before {
+ content: "\f585"; }
+
+.fa-grin-squint::before {
+ content: "\f585"; }
+
+.fa-hand-holding-dollar::before {
+ content: "\f4c0"; }
+
+.fa-hand-holding-usd::before {
+ content: "\f4c0"; }
+
+.fa-bacterium::before {
+ content: "\e05a"; }
+
+.fa-hand-pointer::before {
+ content: "\f25a"; }
+
+.fa-drum-steelpan::before {
+ content: "\f56a"; }
+
+.fa-hand-scissors::before {
+ content: "\f257"; }
+
+.fa-hands-praying::before {
+ content: "\f684"; }
+
+.fa-praying-hands::before {
+ content: "\f684"; }
+
+.fa-arrow-rotate-right::before {
+ content: "\f01e"; }
+
+.fa-arrow-right-rotate::before {
+ content: "\f01e"; }
+
+.fa-arrow-rotate-forward::before {
+ content: "\f01e"; }
+
+.fa-redo::before {
+ content: "\f01e"; }
+
+.fa-biohazard::before {
+ content: "\f780"; }
+
+.fa-location-crosshairs::before {
+ content: "\f601"; }
+
+.fa-location::before {
+ content: "\f601"; }
+
+.fa-mars-double::before {
+ content: "\f227"; }
+
+.fa-child-dress::before {
+ content: "\e59c"; }
+
+.fa-users-between-lines::before {
+ content: "\e591"; }
+
+.fa-lungs-virus::before {
+ content: "\e067"; }
+
+.fa-face-grin-tears::before {
+ content: "\f588"; }
+
+.fa-grin-tears::before {
+ content: "\f588"; }
+
+.fa-phone::before {
+ content: "\f095"; }
+
+.fa-calendar-xmark::before {
+ content: "\f273"; }
+
+.fa-calendar-times::before {
+ content: "\f273"; }
+
+.fa-child-reaching::before {
+ content: "\e59d"; }
+
+.fa-head-side-virus::before {
+ content: "\e064"; }
+
+.fa-user-gear::before {
+ content: "\f4fe"; }
+
+.fa-user-cog::before {
+ content: "\f4fe"; }
+
+.fa-arrow-up-1-9::before {
+ content: "\f163"; }
+
+.fa-sort-numeric-up::before {
+ content: "\f163"; }
+
+.fa-door-closed::before {
+ content: "\f52a"; }
+
+.fa-shield-virus::before {
+ content: "\e06c"; }
+
+.fa-dice-six::before {
+ content: "\f526"; }
+
+.fa-mosquito-net::before {
+ content: "\e52c"; }
+
+.fa-bridge-water::before {
+ content: "\e4ce"; }
+
+.fa-person-booth::before {
+ content: "\f756"; }
+
+.fa-text-width::before {
+ content: "\f035"; }
+
+.fa-hat-wizard::before {
+ content: "\f6e8"; }
+
+.fa-pen-fancy::before {
+ content: "\f5ac"; }
+
+.fa-person-digging::before {
+ content: "\f85e"; }
+
+.fa-digging::before {
+ content: "\f85e"; }
+
+.fa-trash::before {
+ content: "\f1f8"; }
+
+.fa-gauge-simple::before {
+ content: "\f629"; }
+
+.fa-gauge-simple-med::before {
+ content: "\f629"; }
+
+.fa-tachometer-average::before {
+ content: "\f629"; }
+
+.fa-book-medical::before {
+ content: "\f7e6"; }
+
+.fa-poo::before {
+ content: "\f2fe"; }
+
+.fa-quote-right::before {
+ content: "\f10e"; }
+
+.fa-quote-right-alt::before {
+ content: "\f10e"; }
+
+.fa-shirt::before {
+ content: "\f553"; }
+
+.fa-t-shirt::before {
+ content: "\f553"; }
+
+.fa-tshirt::before {
+ content: "\f553"; }
+
+.fa-cubes::before {
+ content: "\f1b3"; }
+
+.fa-divide::before {
+ content: "\f529"; }
+
+.fa-tenge-sign::before {
+ content: "\f7d7"; }
+
+.fa-tenge::before {
+ content: "\f7d7"; }
+
+.fa-headphones::before {
+ content: "\f025"; }
+
+.fa-hands-holding::before {
+ content: "\f4c2"; }
+
+.fa-hands-clapping::before {
+ content: "\e1a8"; }
+
+.fa-republican::before {
+ content: "\f75e"; }
+
+.fa-arrow-left::before {
+ content: "\f060"; }
+
+.fa-person-circle-xmark::before {
+ content: "\e543"; }
+
+.fa-ruler::before {
+ content: "\f545"; }
+
+.fa-align-left::before {
+ content: "\f036"; }
+
+.fa-dice-d6::before {
+ content: "\f6d1"; }
+
+.fa-restroom::before {
+ content: "\f7bd"; }
+
+.fa-j::before {
+ content: "\4a"; }
+
+.fa-users-viewfinder::before {
+ content: "\e595"; }
+
+.fa-file-video::before {
+ content: "\f1c8"; }
+
+.fa-up-right-from-square::before {
+ content: "\f35d"; }
+
+.fa-external-link-alt::before {
+ content: "\f35d"; }
+
+.fa-table-cells::before {
+ content: "\f00a"; }
+
+.fa-th::before {
+ content: "\f00a"; }
+
+.fa-file-pdf::before {
+ content: "\f1c1"; }
+
+.fa-book-bible::before {
+ content: "\f647"; }
+
+.fa-bible::before {
+ content: "\f647"; }
+
+.fa-o::before {
+ content: "\4f"; }
+
+.fa-suitcase-medical::before {
+ content: "\f0fa"; }
+
+.fa-medkit::before {
+ content: "\f0fa"; }
+
+.fa-user-secret::before {
+ content: "\f21b"; }
+
+.fa-otter::before {
+ content: "\f700"; }
+
+.fa-person-dress::before {
+ content: "\f182"; }
+
+.fa-female::before {
+ content: "\f182"; }
+
+.fa-comment-dollar::before {
+ content: "\f651"; }
+
+.fa-business-time::before {
+ content: "\f64a"; }
+
+.fa-briefcase-clock::before {
+ content: "\f64a"; }
+
+.fa-table-cells-large::before {
+ content: "\f009"; }
+
+.fa-th-large::before {
+ content: "\f009"; }
+
+.fa-book-tanakh::before {
+ content: "\f827"; }
+
+.fa-tanakh::before {
+ content: "\f827"; }
+
+.fa-phone-volume::before {
+ content: "\f2a0"; }
+
+.fa-volume-control-phone::before {
+ content: "\f2a0"; }
+
+.fa-hat-cowboy-side::before {
+ content: "\f8c1"; }
+
+.fa-clipboard-user::before {
+ content: "\f7f3"; }
+
+.fa-child::before {
+ content: "\f1ae"; }
+
+.fa-lira-sign::before {
+ content: "\f195"; }
+
+.fa-satellite::before {
+ content: "\f7bf"; }
+
+.fa-plane-lock::before {
+ content: "\e558"; }
+
+.fa-tag::before {
+ content: "\f02b"; }
+
+.fa-comment::before {
+ content: "\f075"; }
+
+.fa-cake-candles::before {
+ content: "\f1fd"; }
+
+.fa-birthday-cake::before {
+ content: "\f1fd"; }
+
+.fa-cake::before {
+ content: "\f1fd"; }
+
+.fa-envelope::before {
+ content: "\f0e0"; }
+
+.fa-angles-up::before {
+ content: "\f102"; }
+
+.fa-angle-double-up::before {
+ content: "\f102"; }
+
+.fa-paperclip::before {
+ content: "\f0c6"; }
+
+.fa-arrow-right-to-city::before {
+ content: "\e4b3"; }
+
+.fa-ribbon::before {
+ content: "\f4d6"; }
+
+.fa-lungs::before {
+ content: "\f604"; }
+
+.fa-arrow-up-9-1::before {
+ content: "\f887"; }
+
+.fa-sort-numeric-up-alt::before {
+ content: "\f887"; }
+
+.fa-litecoin-sign::before {
+ content: "\e1d3"; }
+
+.fa-border-none::before {
+ content: "\f850"; }
+
+.fa-circle-nodes::before {
+ content: "\e4e2"; }
+
+.fa-parachute-box::before {
+ content: "\f4cd"; }
+
+.fa-indent::before {
+ content: "\f03c"; }
+
+.fa-truck-field-un::before {
+ content: "\e58e"; }
+
+.fa-hourglass::before {
+ content: "\f254"; }
+
+.fa-hourglass-empty::before {
+ content: "\f254"; }
+
+.fa-mountain::before {
+ content: "\f6fc"; }
+
+.fa-user-doctor::before {
+ content: "\f0f0"; }
+
+.fa-user-md::before {
+ content: "\f0f0"; }
+
+.fa-circle-info::before {
+ content: "\f05a"; }
+
+.fa-info-circle::before {
+ content: "\f05a"; }
+
+.fa-cloud-meatball::before {
+ content: "\f73b"; }
+
+.fa-camera::before {
+ content: "\f030"; }
+
+.fa-camera-alt::before {
+ content: "\f030"; }
+
+.fa-square-virus::before {
+ content: "\e578"; }
+
+.fa-meteor::before {
+ content: "\f753"; }
+
+.fa-car-on::before {
+ content: "\e4dd"; }
+
+.fa-sleigh::before {
+ content: "\f7cc"; }
+
+.fa-arrow-down-1-9::before {
+ content: "\f162"; }
+
+.fa-sort-numeric-asc::before {
+ content: "\f162"; }
+
+.fa-sort-numeric-down::before {
+ content: "\f162"; }
+
+.fa-hand-holding-droplet::before {
+ content: "\f4c1"; }
+
+.fa-hand-holding-water::before {
+ content: "\f4c1"; }
+
+.fa-water::before {
+ content: "\f773"; }
+
+.fa-calendar-check::before {
+ content: "\f274"; }
+
+.fa-braille::before {
+ content: "\f2a1"; }
+
+.fa-prescription-bottle-medical::before {
+ content: "\f486"; }
+
+.fa-prescription-bottle-alt::before {
+ content: "\f486"; }
+
+.fa-landmark::before {
+ content: "\f66f"; }
+
+.fa-truck::before {
+ content: "\f0d1"; }
+
+.fa-crosshairs::before {
+ content: "\f05b"; }
+
+.fa-person-cane::before {
+ content: "\e53c"; }
+
+.fa-tent::before {
+ content: "\e57d"; }
+
+.fa-vest-patches::before {
+ content: "\e086"; }
+
+.fa-check-double::before {
+ content: "\f560"; }
+
+.fa-arrow-down-a-z::before {
+ content: "\f15d"; }
+
+.fa-sort-alpha-asc::before {
+ content: "\f15d"; }
+
+.fa-sort-alpha-down::before {
+ content: "\f15d"; }
+
+.fa-money-bill-wheat::before {
+ content: "\e52a"; }
+
+.fa-cookie::before {
+ content: "\f563"; }
+
+.fa-arrow-rotate-left::before {
+ content: "\f0e2"; }
+
+.fa-arrow-left-rotate::before {
+ content: "\f0e2"; }
+
+.fa-arrow-rotate-back::before {
+ content: "\f0e2"; }
+
+.fa-arrow-rotate-backward::before {
+ content: "\f0e2"; }
+
+.fa-undo::before {
+ content: "\f0e2"; }
+
+.fa-hard-drive::before {
+ content: "\f0a0"; }
+
+.fa-hdd::before {
+ content: "\f0a0"; }
+
+.fa-face-grin-squint-tears::before {
+ content: "\f586"; }
+
+.fa-grin-squint-tears::before {
+ content: "\f586"; }
+
+.fa-dumbbell::before {
+ content: "\f44b"; }
+
+.fa-rectangle-list::before {
+ content: "\f022"; }
+
+.fa-list-alt::before {
+ content: "\f022"; }
+
+.fa-tarp-droplet::before {
+ content: "\e57c"; }
+
+.fa-house-medical-circle-check::before {
+ content: "\e511"; }
+
+.fa-person-skiing-nordic::before {
+ content: "\f7ca"; }
+
+.fa-skiing-nordic::before {
+ content: "\f7ca"; }
+
+.fa-calendar-plus::before {
+ content: "\f271"; }
+
+.fa-plane-arrival::before {
+ content: "\f5af"; }
+
+.fa-circle-left::before {
+ content: "\f359"; }
+
+.fa-arrow-alt-circle-left::before {
+ content: "\f359"; }
+
+.fa-train-subway::before {
+ content: "\f239"; }
+
+.fa-subway::before {
+ content: "\f239"; }
+
+.fa-chart-gantt::before {
+ content: "\e0e4"; }
+
+.fa-indian-rupee-sign::before {
+ content: "\e1bc"; }
+
+.fa-indian-rupee::before {
+ content: "\e1bc"; }
+
+.fa-inr::before {
+ content: "\e1bc"; }
+
+.fa-crop-simple::before {
+ content: "\f565"; }
+
+.fa-crop-alt::before {
+ content: "\f565"; }
+
+.fa-money-bill-1::before {
+ content: "\f3d1"; }
+
+.fa-money-bill-alt::before {
+ content: "\f3d1"; }
+
+.fa-left-long::before {
+ content: "\f30a"; }
+
+.fa-long-arrow-alt-left::before {
+ content: "\f30a"; }
+
+.fa-dna::before {
+ content: "\f471"; }
+
+.fa-virus-slash::before {
+ content: "\e075"; }
+
+.fa-minus::before {
+ content: "\f068"; }
+
+.fa-subtract::before {
+ content: "\f068"; }
+
+.fa-chess::before {
+ content: "\f439"; }
+
+.fa-arrow-left-long::before {
+ content: "\f177"; }
+
+.fa-long-arrow-left::before {
+ content: "\f177"; }
+
+.fa-plug-circle-check::before {
+ content: "\e55c"; }
+
+.fa-street-view::before {
+ content: "\f21d"; }
+
+.fa-franc-sign::before {
+ content: "\e18f"; }
+
+.fa-volume-off::before {
+ content: "\f026"; }
+
+.fa-hands-asl-interpreting::before {
+ content: "\f2a3"; }
+
+.fa-american-sign-language-interpreting::before {
+ content: "\f2a3"; }
+
+.fa-asl-interpreting::before {
+ content: "\f2a3"; }
+
+.fa-hands-american-sign-language-interpreting::before {
+ content: "\f2a3"; }
+
+.fa-gear::before {
+ content: "\f013"; }
+
+.fa-cog::before {
+ content: "\f013"; }
+
+.fa-droplet-slash::before {
+ content: "\f5c7"; }
+
+.fa-tint-slash::before {
+ content: "\f5c7"; }
+
+.fa-mosque::before {
+ content: "\f678"; }
+
+.fa-mosquito::before {
+ content: "\e52b"; }
+
+.fa-star-of-david::before {
+ content: "\f69a"; }
+
+.fa-person-military-rifle::before {
+ content: "\e54b"; }
+
+.fa-cart-shopping::before {
+ content: "\f07a"; }
+
+.fa-shopping-cart::before {
+ content: "\f07a"; }
+
+.fa-vials::before {
+ content: "\f493"; }
+
+.fa-plug-circle-plus::before {
+ content: "\e55f"; }
+
+.fa-place-of-worship::before {
+ content: "\f67f"; }
+
+.fa-grip-vertical::before {
+ content: "\f58e"; }
+
+.fa-arrow-turn-up::before {
+ content: "\f148"; }
+
+.fa-level-up::before {
+ content: "\f148"; }
+
+.fa-u::before {
+ content: "\55"; }
+
+.fa-square-root-variable::before {
+ content: "\f698"; }
+
+.fa-square-root-alt::before {
+ content: "\f698"; }
+
+.fa-clock::before {
+ content: "\f017"; }
+
+.fa-clock-four::before {
+ content: "\f017"; }
+
+.fa-backward-step::before {
+ content: "\f048"; }
+
+.fa-step-backward::before {
+ content: "\f048"; }
+
+.fa-pallet::before {
+ content: "\f482"; }
+
+.fa-faucet::before {
+ content: "\e005"; }
+
+.fa-baseball-bat-ball::before {
+ content: "\f432"; }
+
+.fa-s::before {
+ content: "\53"; }
+
+.fa-timeline::before {
+ content: "\e29c"; }
+
+.fa-keyboard::before {
+ content: "\f11c"; }
+
+.fa-caret-down::before {
+ content: "\f0d7"; }
+
+.fa-house-chimney-medical::before {
+ content: "\f7f2"; }
+
+.fa-clinic-medical::before {
+ content: "\f7f2"; }
+
+.fa-temperature-three-quarters::before {
+ content: "\f2c8"; }
+
+.fa-temperature-3::before {
+ content: "\f2c8"; }
+
+.fa-thermometer-3::before {
+ content: "\f2c8"; }
+
+.fa-thermometer-three-quarters::before {
+ content: "\f2c8"; }
+
+.fa-mobile-screen::before {
+ content: "\f3cf"; }
+
+.fa-mobile-android-alt::before {
+ content: "\f3cf"; }
+
+.fa-plane-up::before {
+ content: "\e22d"; }
+
+.fa-piggy-bank::before {
+ content: "\f4d3"; }
+
+.fa-battery-half::before {
+ content: "\f242"; }
+
+.fa-battery-3::before {
+ content: "\f242"; }
+
+.fa-mountain-city::before {
+ content: "\e52e"; }
+
+.fa-coins::before {
+ content: "\f51e"; }
+
+.fa-khanda::before {
+ content: "\f66d"; }
+
+.fa-sliders::before {
+ content: "\f1de"; }
+
+.fa-sliders-h::before {
+ content: "\f1de"; }
+
+.fa-folder-tree::before {
+ content: "\f802"; }
+
+.fa-network-wired::before {
+ content: "\f6ff"; }
+
+.fa-map-pin::before {
+ content: "\f276"; }
+
+.fa-hamsa::before {
+ content: "\f665"; }
+
+.fa-cent-sign::before {
+ content: "\e3f5"; }
+
+.fa-flask::before {
+ content: "\f0c3"; }
+
+.fa-person-pregnant::before {
+ content: "\e31e"; }
+
+.fa-wand-sparkles::before {
+ content: "\f72b"; }
+
+.fa-ellipsis-vertical::before {
+ content: "\f142"; }
+
+.fa-ellipsis-v::before {
+ content: "\f142"; }
+
+.fa-ticket::before {
+ content: "\f145"; }
+
+.fa-power-off::before {
+ content: "\f011"; }
+
+.fa-right-long::before {
+ content: "\f30b"; }
+
+.fa-long-arrow-alt-right::before {
+ content: "\f30b"; }
+
+.fa-flag-usa::before {
+ content: "\f74d"; }
+
+.fa-laptop-file::before {
+ content: "\e51d"; }
+
+.fa-tty::before {
+ content: "\f1e4"; }
+
+.fa-teletype::before {
+ content: "\f1e4"; }
+
+.fa-diagram-next::before {
+ content: "\e476"; }
+
+.fa-person-rifle::before {
+ content: "\e54e"; }
+
+.fa-house-medical-circle-exclamation::before {
+ content: "\e512"; }
+
+.fa-closed-captioning::before {
+ content: "\f20a"; }
+
+.fa-person-hiking::before {
+ content: "\f6ec"; }
+
+.fa-hiking::before {
+ content: "\f6ec"; }
+
+.fa-venus-double::before {
+ content: "\f226"; }
+
+.fa-images::before {
+ content: "\f302"; }
+
+.fa-calculator::before {
+ content: "\f1ec"; }
+
+.fa-people-pulling::before {
+ content: "\e535"; }
+
+.fa-n::before {
+ content: "\4e"; }
+
+.fa-cable-car::before {
+ content: "\f7da"; }
+
+.fa-tram::before {
+ content: "\f7da"; }
+
+.fa-cloud-rain::before {
+ content: "\f73d"; }
+
+.fa-building-circle-xmark::before {
+ content: "\e4d4"; }
+
+.fa-ship::before {
+ content: "\f21a"; }
+
+.fa-arrows-down-to-line::before {
+ content: "\e4b8"; }
+
+.fa-download::before {
+ content: "\f019"; }
+
+.fa-face-grin::before {
+ content: "\f580"; }
+
+.fa-grin::before {
+ content: "\f580"; }
+
+.fa-delete-left::before {
+ content: "\f55a"; }
+
+.fa-backspace::before {
+ content: "\f55a"; }
+
+.fa-eye-dropper::before {
+ content: "\f1fb"; }
+
+.fa-eye-dropper-empty::before {
+ content: "\f1fb"; }
+
+.fa-eyedropper::before {
+ content: "\f1fb"; }
+
+.fa-file-circle-check::before {
+ content: "\e5a0"; }
+
+.fa-forward::before {
+ content: "\f04e"; }
+
+.fa-mobile::before {
+ content: "\f3ce"; }
+
+.fa-mobile-android::before {
+ content: "\f3ce"; }
+
+.fa-mobile-phone::before {
+ content: "\f3ce"; }
+
+.fa-face-meh::before {
+ content: "\f11a"; }
+
+.fa-meh::before {
+ content: "\f11a"; }
+
+.fa-align-center::before {
+ content: "\f037"; }
+
+.fa-book-skull::before {
+ content: "\f6b7"; }
+
+.fa-book-dead::before {
+ content: "\f6b7"; }
+
+.fa-id-card::before {
+ content: "\f2c2"; }
+
+.fa-drivers-license::before {
+ content: "\f2c2"; }
+
+.fa-outdent::before {
+ content: "\f03b"; }
+
+.fa-dedent::before {
+ content: "\f03b"; }
+
+.fa-heart-circle-exclamation::before {
+ content: "\e4fe"; }
+
+.fa-house::before {
+ content: "\f015"; }
+
+.fa-home::before {
+ content: "\f015"; }
+
+.fa-home-alt::before {
+ content: "\f015"; }
+
+.fa-home-lg-alt::before {
+ content: "\f015"; }
+
+.fa-calendar-week::before {
+ content: "\f784"; }
+
+.fa-laptop-medical::before {
+ content: "\f812"; }
+
+.fa-b::before {
+ content: "\42"; }
+
+.fa-file-medical::before {
+ content: "\f477"; }
+
+.fa-dice-one::before {
+ content: "\f525"; }
+
+.fa-kiwi-bird::before {
+ content: "\f535"; }
+
+.fa-arrow-right-arrow-left::before {
+ content: "\f0ec"; }
+
+.fa-exchange::before {
+ content: "\f0ec"; }
+
+.fa-rotate-right::before {
+ content: "\f2f9"; }
+
+.fa-redo-alt::before {
+ content: "\f2f9"; }
+
+.fa-rotate-forward::before {
+ content: "\f2f9"; }
+
+.fa-utensils::before {
+ content: "\f2e7"; }
+
+.fa-cutlery::before {
+ content: "\f2e7"; }
+
+.fa-arrow-up-wide-short::before {
+ content: "\f161"; }
+
+.fa-sort-amount-up::before {
+ content: "\f161"; }
+
+.fa-mill-sign::before {
+ content: "\e1ed"; }
+
+.fa-bowl-rice::before {
+ content: "\e2eb"; }
+
+.fa-skull::before {
+ content: "\f54c"; }
+
+.fa-tower-broadcast::before {
+ content: "\f519"; }
+
+.fa-broadcast-tower::before {
+ content: "\f519"; }
+
+.fa-truck-pickup::before {
+ content: "\f63c"; }
+
+.fa-up-long::before {
+ content: "\f30c"; }
+
+.fa-long-arrow-alt-up::before {
+ content: "\f30c"; }
+
+.fa-stop::before {
+ content: "\f04d"; }
+
+.fa-code-merge::before {
+ content: "\f387"; }
+
+.fa-upload::before {
+ content: "\f093"; }
+
+.fa-hurricane::before {
+ content: "\f751"; }
+
+.fa-mound::before {
+ content: "\e52d"; }
+
+.fa-toilet-portable::before {
+ content: "\e583"; }
+
+.fa-compact-disc::before {
+ content: "\f51f"; }
+
+.fa-file-arrow-down::before {
+ content: "\f56d"; }
+
+.fa-file-download::before {
+ content: "\f56d"; }
+
+.fa-caravan::before {
+ content: "\f8ff"; }
+
+.fa-shield-cat::before {
+ content: "\e572"; }
+
+.fa-bolt::before {
+ content: "\f0e7"; }
+
+.fa-zap::before {
+ content: "\f0e7"; }
+
+.fa-glass-water::before {
+ content: "\e4f4"; }
+
+.fa-oil-well::before {
+ content: "\e532"; }
+
+.fa-vault::before {
+ content: "\e2c5"; }
+
+.fa-mars::before {
+ content: "\f222"; }
+
+.fa-toilet::before {
+ content: "\f7d8"; }
+
+.fa-plane-circle-xmark::before {
+ content: "\e557"; }
+
+.fa-yen-sign::before {
+ content: "\f157"; }
+
+.fa-cny::before {
+ content: "\f157"; }
+
+.fa-jpy::before {
+ content: "\f157"; }
+
+.fa-rmb::before {
+ content: "\f157"; }
+
+.fa-yen::before {
+ content: "\f157"; }
+
+.fa-ruble-sign::before {
+ content: "\f158"; }
+
+.fa-rouble::before {
+ content: "\f158"; }
+
+.fa-rub::before {
+ content: "\f158"; }
+
+.fa-ruble::before {
+ content: "\f158"; }
+
+.fa-sun::before {
+ content: "\f185"; }
+
+.fa-guitar::before {
+ content: "\f7a6"; }
+
+.fa-face-laugh-wink::before {
+ content: "\f59c"; }
+
+.fa-laugh-wink::before {
+ content: "\f59c"; }
+
+.fa-horse-head::before {
+ content: "\f7ab"; }
+
+.fa-bore-hole::before {
+ content: "\e4c3"; }
+
+.fa-industry::before {
+ content: "\f275"; }
+
+.fa-circle-down::before {
+ content: "\f358"; }
+
+.fa-arrow-alt-circle-down::before {
+ content: "\f358"; }
+
+.fa-arrows-turn-to-dots::before {
+ content: "\e4c1"; }
+
+.fa-florin-sign::before {
+ content: "\e184"; }
+
+.fa-arrow-down-short-wide::before {
+ content: "\f884"; }
+
+.fa-sort-amount-desc::before {
+ content: "\f884"; }
+
+.fa-sort-amount-down-alt::before {
+ content: "\f884"; }
+
+.fa-less-than::before {
+ content: "\3c"; }
+
+.fa-angle-down::before {
+ content: "\f107"; }
+
+.fa-car-tunnel::before {
+ content: "\e4de"; }
+
+.fa-head-side-cough::before {
+ content: "\e061"; }
+
+.fa-grip-lines::before {
+ content: "\f7a4"; }
+
+.fa-thumbs-down::before {
+ content: "\f165"; }
+
+.fa-user-lock::before {
+ content: "\f502"; }
+
+.fa-arrow-right-long::before {
+ content: "\f178"; }
+
+.fa-long-arrow-right::before {
+ content: "\f178"; }
+
+.fa-anchor-circle-xmark::before {
+ content: "\e4ac"; }
+
+.fa-ellipsis::before {
+ content: "\f141"; }
+
+.fa-ellipsis-h::before {
+ content: "\f141"; }
+
+.fa-chess-pawn::before {
+ content: "\f443"; }
+
+.fa-kit-medical::before {
+ content: "\f479"; }
+
+.fa-first-aid::before {
+ content: "\f479"; }
+
+.fa-person-through-window::before {
+ content: "\e5a9"; }
+
+.fa-toolbox::before {
+ content: "\f552"; }
+
+.fa-hands-holding-circle::before {
+ content: "\e4fb"; }
+
+.fa-bug::before {
+ content: "\f188"; }
+
+.fa-credit-card::before {
+ content: "\f09d"; }
+
+.fa-credit-card-alt::before {
+ content: "\f09d"; }
+
+.fa-car::before {
+ content: "\f1b9"; }
+
+.fa-automobile::before {
+ content: "\f1b9"; }
+
+.fa-hand-holding-hand::before {
+ content: "\e4f7"; }
+
+.fa-book-open-reader::before {
+ content: "\f5da"; }
+
+.fa-book-reader::before {
+ content: "\f5da"; }
+
+.fa-mountain-sun::before {
+ content: "\e52f"; }
+
+.fa-arrows-left-right-to-line::before {
+ content: "\e4ba"; }
+
+.fa-dice-d20::before {
+ content: "\f6cf"; }
+
+.fa-truck-droplet::before {
+ content: "\e58c"; }
+
+.fa-file-circle-xmark::before {
+ content: "\e5a1"; }
+
+.fa-temperature-arrow-up::before {
+ content: "\e040"; }
+
+.fa-temperature-up::before {
+ content: "\e040"; }
+
+.fa-medal::before {
+ content: "\f5a2"; }
+
+.fa-bed::before {
+ content: "\f236"; }
+
+.fa-square-h::before {
+ content: "\f0fd"; }
+
+.fa-h-square::before {
+ content: "\f0fd"; }
+
+.fa-podcast::before {
+ content: "\f2ce"; }
+
+.fa-temperature-full::before {
+ content: "\f2c7"; }
+
+.fa-temperature-4::before {
+ content: "\f2c7"; }
+
+.fa-thermometer-4::before {
+ content: "\f2c7"; }
+
+.fa-thermometer-full::before {
+ content: "\f2c7"; }
+
+.fa-bell::before {
+ content: "\f0f3"; }
+
+.fa-superscript::before {
+ content: "\f12b"; }
+
+.fa-plug-circle-xmark::before {
+ content: "\e560"; }
+
+.fa-star-of-life::before {
+ content: "\f621"; }
+
+.fa-phone-slash::before {
+ content: "\f3dd"; }
+
+.fa-paint-roller::before {
+ content: "\f5aa"; }
+
+.fa-handshake-angle::before {
+ content: "\f4c4"; }
+
+.fa-hands-helping::before {
+ content: "\f4c4"; }
+
+.fa-location-dot::before {
+ content: "\f3c5"; }
+
+.fa-map-marker-alt::before {
+ content: "\f3c5"; }
+
+.fa-file::before {
+ content: "\f15b"; }
+
+.fa-greater-than::before {
+ content: "\3e"; }
+
+.fa-person-swimming::before {
+ content: "\f5c4"; }
+
+.fa-swimmer::before {
+ content: "\f5c4"; }
+
+.fa-arrow-down::before {
+ content: "\f063"; }
+
+.fa-droplet::before {
+ content: "\f043"; }
+
+.fa-tint::before {
+ content: "\f043"; }
+
+.fa-eraser::before {
+ content: "\f12d"; }
+
+.fa-earth-americas::before {
+ content: "\f57d"; }
+
+.fa-earth::before {
+ content: "\f57d"; }
+
+.fa-earth-america::before {
+ content: "\f57d"; }
+
+.fa-globe-americas::before {
+ content: "\f57d"; }
+
+.fa-person-burst::before {
+ content: "\e53b"; }
+
+.fa-dove::before {
+ content: "\f4ba"; }
+
+.fa-battery-empty::before {
+ content: "\f244"; }
+
+.fa-battery-0::before {
+ content: "\f244"; }
+
+.fa-socks::before {
+ content: "\f696"; }
+
+.fa-inbox::before {
+ content: "\f01c"; }
+
+.fa-section::before {
+ content: "\e447"; }
+
+.fa-gauge-high::before {
+ content: "\f625"; }
+
+.fa-tachometer-alt::before {
+ content: "\f625"; }
+
+.fa-tachometer-alt-fast::before {
+ content: "\f625"; }
+
+.fa-envelope-open-text::before {
+ content: "\f658"; }
+
+.fa-hospital::before {
+ content: "\f0f8"; }
+
+.fa-hospital-alt::before {
+ content: "\f0f8"; }
+
+.fa-hospital-wide::before {
+ content: "\f0f8"; }
+
+.fa-wine-bottle::before {
+ content: "\f72f"; }
+
+.fa-chess-rook::before {
+ content: "\f447"; }
+
+.fa-bars-staggered::before {
+ content: "\f550"; }
+
+.fa-reorder::before {
+ content: "\f550"; }
+
+.fa-stream::before {
+ content: "\f550"; }
+
+.fa-dharmachakra::before {
+ content: "\f655"; }
+
+.fa-hotdog::before {
+ content: "\f80f"; }
+
+.fa-person-walking-with-cane::before {
+ content: "\f29d"; }
+
+.fa-blind::before {
+ content: "\f29d"; }
+
+.fa-drum::before {
+ content: "\f569"; }
+
+.fa-ice-cream::before {
+ content: "\f810"; }
+
+.fa-heart-circle-bolt::before {
+ content: "\e4fc"; }
+
+.fa-fax::before {
+ content: "\f1ac"; }
+
+.fa-paragraph::before {
+ content: "\f1dd"; }
+
+.fa-check-to-slot::before {
+ content: "\f772"; }
+
+.fa-vote-yea::before {
+ content: "\f772"; }
+
+.fa-star-half::before {
+ content: "\f089"; }
+
+.fa-boxes-stacked::before {
+ content: "\f468"; }
+
+.fa-boxes::before {
+ content: "\f468"; }
+
+.fa-boxes-alt::before {
+ content: "\f468"; }
+
+.fa-link::before {
+ content: "\f0c1"; }
+
+.fa-chain::before {
+ content: "\f0c1"; }
+
+.fa-ear-listen::before {
+ content: "\f2a2"; }
+
+.fa-assistive-listening-systems::before {
+ content: "\f2a2"; }
+
+.fa-tree-city::before {
+ content: "\e587"; }
+
+.fa-play::before {
+ content: "\f04b"; }
+
+.fa-font::before {
+ content: "\f031"; }
+
+.fa-rupiah-sign::before {
+ content: "\e23d"; }
+
+.fa-magnifying-glass::before {
+ content: "\f002"; }
+
+.fa-search::before {
+ content: "\f002"; }
+
+.fa-table-tennis-paddle-ball::before {
+ content: "\f45d"; }
+
+.fa-ping-pong-paddle-ball::before {
+ content: "\f45d"; }
+
+.fa-table-tennis::before {
+ content: "\f45d"; }
+
+.fa-person-dots-from-line::before {
+ content: "\f470"; }
+
+.fa-diagnoses::before {
+ content: "\f470"; }
+
+.fa-trash-can-arrow-up::before {
+ content: "\f82a"; }
+
+.fa-trash-restore-alt::before {
+ content: "\f82a"; }
+
+.fa-naira-sign::before {
+ content: "\e1f6"; }
+
+.fa-cart-arrow-down::before {
+ content: "\f218"; }
+
+.fa-walkie-talkie::before {
+ content: "\f8ef"; }
+
+.fa-file-pen::before {
+ content: "\f31c"; }
+
+.fa-file-edit::before {
+ content: "\f31c"; }
+
+.fa-receipt::before {
+ content: "\f543"; }
+
+.fa-square-pen::before {
+ content: "\f14b"; }
+
+.fa-pen-square::before {
+ content: "\f14b"; }
+
+.fa-pencil-square::before {
+ content: "\f14b"; }
+
+.fa-suitcase-rolling::before {
+ content: "\f5c1"; }
+
+.fa-person-circle-exclamation::before {
+ content: "\e53f"; }
+
+.fa-chevron-down::before {
+ content: "\f078"; }
+
+.fa-battery-full::before {
+ content: "\f240"; }
+
+.fa-battery::before {
+ content: "\f240"; }
+
+.fa-battery-5::before {
+ content: "\f240"; }
+
+.fa-skull-crossbones::before {
+ content: "\f714"; }
+
+.fa-code-compare::before {
+ content: "\e13a"; }
+
+.fa-list-ul::before {
+ content: "\f0ca"; }
+
+.fa-list-dots::before {
+ content: "\f0ca"; }
+
+.fa-school-lock::before {
+ content: "\e56f"; }
+
+.fa-tower-cell::before {
+ content: "\e585"; }
+
+.fa-down-long::before {
+ content: "\f309"; }
+
+.fa-long-arrow-alt-down::before {
+ content: "\f309"; }
+
+.fa-ranking-star::before {
+ content: "\e561"; }
+
+.fa-chess-king::before {
+ content: "\f43f"; }
+
+.fa-person-harassing::before {
+ content: "\e549"; }
+
+.fa-brazilian-real-sign::before {
+ content: "\e46c"; }
+
+.fa-landmark-dome::before {
+ content: "\f752"; }
+
+.fa-landmark-alt::before {
+ content: "\f752"; }
+
+.fa-arrow-up::before {
+ content: "\f062"; }
+
+.fa-tv::before {
+ content: "\f26c"; }
+
+.fa-television::before {
+ content: "\f26c"; }
+
+.fa-tv-alt::before {
+ content: "\f26c"; }
+
+.fa-shrimp::before {
+ content: "\e448"; }
+
+.fa-list-check::before {
+ content: "\f0ae"; }
+
+.fa-tasks::before {
+ content: "\f0ae"; }
+
+.fa-jug-detergent::before {
+ content: "\e519"; }
+
+.fa-circle-user::before {
+ content: "\f2bd"; }
+
+.fa-user-circle::before {
+ content: "\f2bd"; }
+
+.fa-user-shield::before {
+ content: "\f505"; }
+
+.fa-wind::before {
+ content: "\f72e"; }
+
+.fa-car-burst::before {
+ content: "\f5e1"; }
+
+.fa-car-crash::before {
+ content: "\f5e1"; }
+
+.fa-y::before {
+ content: "\59"; }
+
+.fa-person-snowboarding::before {
+ content: "\f7ce"; }
+
+.fa-snowboarding::before {
+ content: "\f7ce"; }
+
+.fa-truck-fast::before {
+ content: "\f48b"; }
+
+.fa-shipping-fast::before {
+ content: "\f48b"; }
+
+.fa-fish::before {
+ content: "\f578"; }
+
+.fa-user-graduate::before {
+ content: "\f501"; }
+
+.fa-circle-half-stroke::before {
+ content: "\f042"; }
+
+.fa-adjust::before {
+ content: "\f042"; }
+
+.fa-clapperboard::before {
+ content: "\e131"; }
+
+.fa-circle-radiation::before {
+ content: "\f7ba"; }
+
+.fa-radiation-alt::before {
+ content: "\f7ba"; }
+
+.fa-baseball::before {
+ content: "\f433"; }
+
+.fa-baseball-ball::before {
+ content: "\f433"; }
+
+.fa-jet-fighter-up::before {
+ content: "\e518"; }
+
+.fa-diagram-project::before {
+ content: "\f542"; }
+
+.fa-project-diagram::before {
+ content: "\f542"; }
+
+.fa-copy::before {
+ content: "\f0c5"; }
+
+.fa-volume-xmark::before {
+ content: "\f6a9"; }
+
+.fa-volume-mute::before {
+ content: "\f6a9"; }
+
+.fa-volume-times::before {
+ content: "\f6a9"; }
+
+.fa-hand-sparkles::before {
+ content: "\e05d"; }
+
+.fa-grip::before {
+ content: "\f58d"; }
+
+.fa-grip-horizontal::before {
+ content: "\f58d"; }
+
+.fa-share-from-square::before {
+ content: "\f14d"; }
+
+.fa-share-square::before {
+ content: "\f14d"; }
+
+.fa-child-combatant::before {
+ content: "\e4e0"; }
+
+.fa-child-rifle::before {
+ content: "\e4e0"; }
+
+.fa-gun::before {
+ content: "\e19b"; }
+
+.fa-square-phone::before {
+ content: "\f098"; }
+
+.fa-phone-square::before {
+ content: "\f098"; }
+
+.fa-plus::before {
+ content: "\2b"; }
+
+.fa-add::before {
+ content: "\2b"; }
+
+.fa-expand::before {
+ content: "\f065"; }
+
+.fa-computer::before {
+ content: "\e4e5"; }
+
+.fa-xmark::before {
+ content: "\f00d"; }
+
+.fa-close::before {
+ content: "\f00d"; }
+
+.fa-multiply::before {
+ content: "\f00d"; }
+
+.fa-remove::before {
+ content: "\f00d"; }
+
+.fa-times::before {
+ content: "\f00d"; }
+
+.fa-arrows-up-down-left-right::before {
+ content: "\f047"; }
+
+.fa-arrows::before {
+ content: "\f047"; }
+
+.fa-chalkboard-user::before {
+ content: "\f51c"; }
+
+.fa-chalkboard-teacher::before {
+ content: "\f51c"; }
+
+.fa-peso-sign::before {
+ content: "\e222"; }
+
+.fa-building-shield::before {
+ content: "\e4d8"; }
+
+.fa-baby::before {
+ content: "\f77c"; }
+
+.fa-users-line::before {
+ content: "\e592"; }
+
+.fa-quote-left::before {
+ content: "\f10d"; }
+
+.fa-quote-left-alt::before {
+ content: "\f10d"; }
+
+.fa-tractor::before {
+ content: "\f722"; }
+
+.fa-trash-arrow-up::before {
+ content: "\f829"; }
+
+.fa-trash-restore::before {
+ content: "\f829"; }
+
+.fa-arrow-down-up-lock::before {
+ content: "\e4b0"; }
+
+.fa-lines-leaning::before {
+ content: "\e51e"; }
+
+.fa-ruler-combined::before {
+ content: "\f546"; }
+
+.fa-copyright::before {
+ content: "\f1f9"; }
+
+.fa-equals::before {
+ content: "\3d"; }
+
+.fa-blender::before {
+ content: "\f517"; }
+
+.fa-teeth::before {
+ content: "\f62e"; }
+
+.fa-shekel-sign::before {
+ content: "\f20b"; }
+
+.fa-ils::before {
+ content: "\f20b"; }
+
+.fa-shekel::before {
+ content: "\f20b"; }
+
+.fa-sheqel::before {
+ content: "\f20b"; }
+
+.fa-sheqel-sign::before {
+ content: "\f20b"; }
+
+.fa-map::before {
+ content: "\f279"; }
+
+.fa-rocket::before {
+ content: "\f135"; }
+
+.fa-photo-film::before {
+ content: "\f87c"; }
+
+.fa-photo-video::before {
+ content: "\f87c"; }
+
+.fa-folder-minus::before {
+ content: "\f65d"; }
+
+.fa-store::before {
+ content: "\f54e"; }
+
+.fa-arrow-trend-up::before {
+ content: "\e098"; }
+
+.fa-plug-circle-minus::before {
+ content: "\e55e"; }
+
+.fa-sign-hanging::before {
+ content: "\f4d9"; }
+
+.fa-sign::before {
+ content: "\f4d9"; }
+
+.fa-bezier-curve::before {
+ content: "\f55b"; }
+
+.fa-bell-slash::before {
+ content: "\f1f6"; }
+
+.fa-tablet::before {
+ content: "\f3fb"; }
+
+.fa-tablet-android::before {
+ content: "\f3fb"; }
+
+.fa-school-flag::before {
+ content: "\e56e"; }
+
+.fa-fill::before {
+ content: "\f575"; }
+
+.fa-angle-up::before {
+ content: "\f106"; }
+
+.fa-drumstick-bite::before {
+ content: "\f6d7"; }
+
+.fa-holly-berry::before {
+ content: "\f7aa"; }
+
+.fa-chevron-left::before {
+ content: "\f053"; }
+
+.fa-bacteria::before {
+ content: "\e059"; }
+
+.fa-hand-lizard::before {
+ content: "\f258"; }
+
+.fa-notdef::before {
+ content: "\e1fe"; }
+
+.fa-disease::before {
+ content: "\f7fa"; }
+
+.fa-briefcase-medical::before {
+ content: "\f469"; }
+
+.fa-genderless::before {
+ content: "\f22d"; }
+
+.fa-chevron-right::before {
+ content: "\f054"; }
+
+.fa-retweet::before {
+ content: "\f079"; }
+
+.fa-car-rear::before {
+ content: "\f5de"; }
+
+.fa-car-alt::before {
+ content: "\f5de"; }
+
+.fa-pump-soap::before {
+ content: "\e06b"; }
+
+.fa-video-slash::before {
+ content: "\f4e2"; }
+
+.fa-battery-quarter::before {
+ content: "\f243"; }
+
+.fa-battery-2::before {
+ content: "\f243"; }
+
+.fa-radio::before {
+ content: "\f8d7"; }
+
+.fa-baby-carriage::before {
+ content: "\f77d"; }
+
+.fa-carriage-baby::before {
+ content: "\f77d"; }
+
+.fa-traffic-light::before {
+ content: "\f637"; }
+
+.fa-thermometer::before {
+ content: "\f491"; }
+
+.fa-vr-cardboard::before {
+ content: "\f729"; }
+
+.fa-hand-middle-finger::before {
+ content: "\f806"; }
+
+.fa-percent::before {
+ content: "\25"; }
+
+.fa-percentage::before {
+ content: "\25"; }
+
+.fa-truck-moving::before {
+ content: "\f4df"; }
+
+.fa-glass-water-droplet::before {
+ content: "\e4f5"; }
+
+.fa-display::before {
+ content: "\e163"; }
+
+.fa-face-smile::before {
+ content: "\f118"; }
+
+.fa-smile::before {
+ content: "\f118"; }
+
+.fa-thumbtack::before {
+ content: "\f08d"; }
+
+.fa-thumb-tack::before {
+ content: "\f08d"; }
+
+.fa-trophy::before {
+ content: "\f091"; }
+
+.fa-person-praying::before {
+ content: "\f683"; }
+
+.fa-pray::before {
+ content: "\f683"; }
+
+.fa-hammer::before {
+ content: "\f6e3"; }
+
+.fa-hand-peace::before {
+ content: "\f25b"; }
+
+.fa-rotate::before {
+ content: "\f2f1"; }
+
+.fa-sync-alt::before {
+ content: "\f2f1"; }
+
+.fa-spinner::before {
+ content: "\f110"; }
+
+.fa-robot::before {
+ content: "\f544"; }
+
+.fa-peace::before {
+ content: "\f67c"; }
+
+.fa-gears::before {
+ content: "\f085"; }
+
+.fa-cogs::before {
+ content: "\f085"; }
+
+.fa-warehouse::before {
+ content: "\f494"; }
+
+.fa-arrow-up-right-dots::before {
+ content: "\e4b7"; }
+
+.fa-splotch::before {
+ content: "\f5bc"; }
+
+.fa-face-grin-hearts::before {
+ content: "\f584"; }
+
+.fa-grin-hearts::before {
+ content: "\f584"; }
+
+.fa-dice-four::before {
+ content: "\f524"; }
+
+.fa-sim-card::before {
+ content: "\f7c4"; }
+
+.fa-transgender::before {
+ content: "\f225"; }
+
+.fa-transgender-alt::before {
+ content: "\f225"; }
+
+.fa-mercury::before {
+ content: "\f223"; }
+
+.fa-arrow-turn-down::before {
+ content: "\f149"; }
+
+.fa-level-down::before {
+ content: "\f149"; }
+
+.fa-person-falling-burst::before {
+ content: "\e547"; }
+
+.fa-award::before {
+ content: "\f559"; }
+
+.fa-ticket-simple::before {
+ content: "\f3ff"; }
+
+.fa-ticket-alt::before {
+ content: "\f3ff"; }
+
+.fa-building::before {
+ content: "\f1ad"; }
+
+.fa-angles-left::before {
+ content: "\f100"; }
+
+.fa-angle-double-left::before {
+ content: "\f100"; }
+
+.fa-qrcode::before {
+ content: "\f029"; }
+
+.fa-clock-rotate-left::before {
+ content: "\f1da"; }
+
+.fa-history::before {
+ content: "\f1da"; }
+
+.fa-face-grin-beam-sweat::before {
+ content: "\f583"; }
+
+.fa-grin-beam-sweat::before {
+ content: "\f583"; }
+
+.fa-file-export::before {
+ content: "\f56e"; }
+
+.fa-arrow-right-from-file::before {
+ content: "\f56e"; }
+
+.fa-shield::before {
+ content: "\f132"; }
+
+.fa-shield-blank::before {
+ content: "\f132"; }
+
+.fa-arrow-up-short-wide::before {
+ content: "\f885"; }
+
+.fa-sort-amount-up-alt::before {
+ content: "\f885"; }
+
+.fa-house-medical::before {
+ content: "\e3b2"; }
+
+.fa-golf-ball-tee::before {
+ content: "\f450"; }
+
+.fa-golf-ball::before {
+ content: "\f450"; }
+
+.fa-circle-chevron-left::before {
+ content: "\f137"; }
+
+.fa-chevron-circle-left::before {
+ content: "\f137"; }
+
+.fa-house-chimney-window::before {
+ content: "\e00d"; }
+
+.fa-pen-nib::before {
+ content: "\f5ad"; }
+
+.fa-tent-arrow-turn-left::before {
+ content: "\e580"; }
+
+.fa-tents::before {
+ content: "\e582"; }
+
+.fa-wand-magic::before {
+ content: "\f0d0"; }
+
+.fa-magic::before {
+ content: "\f0d0"; }
+
+.fa-dog::before {
+ content: "\f6d3"; }
+
+.fa-carrot::before {
+ content: "\f787"; }
+
+.fa-moon::before {
+ content: "\f186"; }
+
+.fa-wine-glass-empty::before {
+ content: "\f5ce"; }
+
+.fa-wine-glass-alt::before {
+ content: "\f5ce"; }
+
+.fa-cheese::before {
+ content: "\f7ef"; }
+
+.fa-yin-yang::before {
+ content: "\f6ad"; }
+
+.fa-music::before {
+ content: "\f001"; }
+
+.fa-code-commit::before {
+ content: "\f386"; }
+
+.fa-temperature-low::before {
+ content: "\f76b"; }
+
+.fa-person-biking::before {
+ content: "\f84a"; }
+
+.fa-biking::before {
+ content: "\f84a"; }
+
+.fa-broom::before {
+ content: "\f51a"; }
+
+.fa-shield-heart::before {
+ content: "\e574"; }
+
+.fa-gopuram::before {
+ content: "\f664"; }
+
+.fa-earth-oceania::before {
+ content: "\e47b"; }
+
+.fa-globe-oceania::before {
+ content: "\e47b"; }
+
+.fa-square-xmark::before {
+ content: "\f2d3"; }
+
+.fa-times-square::before {
+ content: "\f2d3"; }
+
+.fa-xmark-square::before {
+ content: "\f2d3"; }
+
+.fa-hashtag::before {
+ content: "\23"; }
+
+.fa-up-right-and-down-left-from-center::before {
+ content: "\f424"; }
+
+.fa-expand-alt::before {
+ content: "\f424"; }
+
+.fa-oil-can::before {
+ content: "\f613"; }
+
+.fa-t::before {
+ content: "\54"; }
+
+.fa-hippo::before {
+ content: "\f6ed"; }
+
+.fa-chart-column::before {
+ content: "\e0e3"; }
+
+.fa-infinity::before {
+ content: "\f534"; }
+
+.fa-vial-circle-check::before {
+ content: "\e596"; }
+
+.fa-person-arrow-down-to-line::before {
+ content: "\e538"; }
+
+.fa-voicemail::before {
+ content: "\f897"; }
+
+.fa-fan::before {
+ content: "\f863"; }
+
+.fa-person-walking-luggage::before {
+ content: "\e554"; }
+
+.fa-up-down::before {
+ content: "\f338"; }
+
+.fa-arrows-alt-v::before {
+ content: "\f338"; }
+
+.fa-cloud-moon-rain::before {
+ content: "\f73c"; }
+
+.fa-calendar::before {
+ content: "\f133"; }
+
+.fa-trailer::before {
+ content: "\e041"; }
+
+.fa-bahai::before {
+ content: "\f666"; }
+
+.fa-haykal::before {
+ content: "\f666"; }
+
+.fa-sd-card::before {
+ content: "\f7c2"; }
+
+.fa-dragon::before {
+ content: "\f6d5"; }
+
+.fa-shoe-prints::before {
+ content: "\f54b"; }
+
+.fa-circle-plus::before {
+ content: "\f055"; }
+
+.fa-plus-circle::before {
+ content: "\f055"; }
+
+.fa-face-grin-tongue-wink::before {
+ content: "\f58b"; }
+
+.fa-grin-tongue-wink::before {
+ content: "\f58b"; }
+
+.fa-hand-holding::before {
+ content: "\f4bd"; }
+
+.fa-plug-circle-exclamation::before {
+ content: "\e55d"; }
+
+.fa-link-slash::before {
+ content: "\f127"; }
+
+.fa-chain-broken::before {
+ content: "\f127"; }
+
+.fa-chain-slash::before {
+ content: "\f127"; }
+
+.fa-unlink::before {
+ content: "\f127"; }
+
+.fa-clone::before {
+ content: "\f24d"; }
+
+.fa-person-walking-arrow-loop-left::before {
+ content: "\e551"; }
+
+.fa-arrow-up-z-a::before {
+ content: "\f882"; }
+
+.fa-sort-alpha-up-alt::before {
+ content: "\f882"; }
+
+.fa-fire-flame-curved::before {
+ content: "\f7e4"; }
+
+.fa-fire-alt::before {
+ content: "\f7e4"; }
+
+.fa-tornado::before {
+ content: "\f76f"; }
+
+.fa-file-circle-plus::before {
+ content: "\e494"; }
+
+.fa-book-quran::before {
+ content: "\f687"; }
+
+.fa-quran::before {
+ content: "\f687"; }
+
+.fa-anchor::before {
+ content: "\f13d"; }
+
+.fa-border-all::before {
+ content: "\f84c"; }
+
+.fa-face-angry::before {
+ content: "\f556"; }
+
+.fa-angry::before {
+ content: "\f556"; }
+
+.fa-cookie-bite::before {
+ content: "\f564"; }
+
+.fa-arrow-trend-down::before {
+ content: "\e097"; }
+
+.fa-rss::before {
+ content: "\f09e"; }
+
+.fa-feed::before {
+ content: "\f09e"; }
+
+.fa-draw-polygon::before {
+ content: "\f5ee"; }
+
+.fa-scale-balanced::before {
+ content: "\f24e"; }
+
+.fa-balance-scale::before {
+ content: "\f24e"; }
+
+.fa-gauge-simple-high::before {
+ content: "\f62a"; }
+
+.fa-tachometer::before {
+ content: "\f62a"; }
+
+.fa-tachometer-fast::before {
+ content: "\f62a"; }
+
+.fa-shower::before {
+ content: "\f2cc"; }
+
+.fa-desktop::before {
+ content: "\f390"; }
+
+.fa-desktop-alt::before {
+ content: "\f390"; }
+
+.fa-m::before {
+ content: "\4d"; }
+
+.fa-table-list::before {
+ content: "\f00b"; }
+
+.fa-th-list::before {
+ content: "\f00b"; }
+
+.fa-comment-sms::before {
+ content: "\f7cd"; }
+
+.fa-sms::before {
+ content: "\f7cd"; }
+
+.fa-book::before {
+ content: "\f02d"; }
+
+.fa-user-plus::before {
+ content: "\f234"; }
+
+.fa-check::before {
+ content: "\f00c"; }
+
+.fa-battery-three-quarters::before {
+ content: "\f241"; }
+
+.fa-battery-4::before {
+ content: "\f241"; }
+
+.fa-house-circle-check::before {
+ content: "\e509"; }
+
+.fa-angle-left::before {
+ content: "\f104"; }
+
+.fa-diagram-successor::before {
+ content: "\e47a"; }
+
+.fa-truck-arrow-right::before {
+ content: "\e58b"; }
+
+.fa-arrows-split-up-and-left::before {
+ content: "\e4bc"; }
+
+.fa-hand-fist::before {
+ content: "\f6de"; }
+
+.fa-fist-raised::before {
+ content: "\f6de"; }
+
+.fa-cloud-moon::before {
+ content: "\f6c3"; }
+
+.fa-briefcase::before {
+ content: "\f0b1"; }
+
+.fa-person-falling::before {
+ content: "\e546"; }
+
+.fa-image-portrait::before {
+ content: "\f3e0"; }
+
+.fa-portrait::before {
+ content: "\f3e0"; }
+
+.fa-user-tag::before {
+ content: "\f507"; }
+
+.fa-rug::before {
+ content: "\e569"; }
+
+.fa-earth-europe::before {
+ content: "\f7a2"; }
+
+.fa-globe-europe::before {
+ content: "\f7a2"; }
+
+.fa-cart-flatbed-suitcase::before {
+ content: "\f59d"; }
+
+.fa-luggage-cart::before {
+ content: "\f59d"; }
+
+.fa-rectangle-xmark::before {
+ content: "\f410"; }
+
+.fa-rectangle-times::before {
+ content: "\f410"; }
+
+.fa-times-rectangle::before {
+ content: "\f410"; }
+
+.fa-window-close::before {
+ content: "\f410"; }
+
+.fa-baht-sign::before {
+ content: "\e0ac"; }
+
+.fa-book-open::before {
+ content: "\f518"; }
+
+.fa-book-journal-whills::before {
+ content: "\f66a"; }
+
+.fa-journal-whills::before {
+ content: "\f66a"; }
+
+.fa-handcuffs::before {
+ content: "\e4f8"; }
+
+.fa-triangle-exclamation::before {
+ content: "\f071"; }
+
+.fa-exclamation-triangle::before {
+ content: "\f071"; }
+
+.fa-warning::before {
+ content: "\f071"; }
+
+.fa-database::before {
+ content: "\f1c0"; }
+
+.fa-share::before {
+ content: "\f064"; }
+
+.fa-arrow-turn-right::before {
+ content: "\f064"; }
+
+.fa-mail-forward::before {
+ content: "\f064"; }
+
+.fa-bottle-droplet::before {
+ content: "\e4c4"; }
+
+.fa-mask-face::before {
+ content: "\e1d7"; }
+
+.fa-hill-rockslide::before {
+ content: "\e508"; }
+
+.fa-right-left::before {
+ content: "\f362"; }
+
+.fa-exchange-alt::before {
+ content: "\f362"; }
+
+.fa-paper-plane::before {
+ content: "\f1d8"; }
+
+.fa-road-circle-exclamation::before {
+ content: "\e565"; }
+
+.fa-dungeon::before {
+ content: "\f6d9"; }
+
+.fa-align-right::before {
+ content: "\f038"; }
+
+.fa-money-bill-1-wave::before {
+ content: "\f53b"; }
+
+.fa-money-bill-wave-alt::before {
+ content: "\f53b"; }
+
+.fa-life-ring::before {
+ content: "\f1cd"; }
+
+.fa-hands::before {
+ content: "\f2a7"; }
+
+.fa-sign-language::before {
+ content: "\f2a7"; }
+
+.fa-signing::before {
+ content: "\f2a7"; }
+
+.fa-calendar-day::before {
+ content: "\f783"; }
+
+.fa-water-ladder::before {
+ content: "\f5c5"; }
+
+.fa-ladder-water::before {
+ content: "\f5c5"; }
+
+.fa-swimming-pool::before {
+ content: "\f5c5"; }
+
+.fa-arrows-up-down::before {
+ content: "\f07d"; }
+
+.fa-arrows-v::before {
+ content: "\f07d"; }
+
+.fa-face-grimace::before {
+ content: "\f57f"; }
+
+.fa-grimace::before {
+ content: "\f57f"; }
+
+.fa-wheelchair-move::before {
+ content: "\e2ce"; }
+
+.fa-wheelchair-alt::before {
+ content: "\e2ce"; }
+
+.fa-turn-down::before {
+ content: "\f3be"; }
+
+.fa-level-down-alt::before {
+ content: "\f3be"; }
+
+.fa-person-walking-arrow-right::before {
+ content: "\e552"; }
+
+.fa-square-envelope::before {
+ content: "\f199"; }
+
+.fa-envelope-square::before {
+ content: "\f199"; }
+
+.fa-dice::before {
+ content: "\f522"; }
+
+.fa-bowling-ball::before {
+ content: "\f436"; }
+
+.fa-brain::before {
+ content: "\f5dc"; }
+
+.fa-bandage::before {
+ content: "\f462"; }
+
+.fa-band-aid::before {
+ content: "\f462"; }
+
+.fa-calendar-minus::before {
+ content: "\f272"; }
+
+.fa-circle-xmark::before {
+ content: "\f057"; }
+
+.fa-times-circle::before {
+ content: "\f057"; }
+
+.fa-xmark-circle::before {
+ content: "\f057"; }
+
+.fa-gifts::before {
+ content: "\f79c"; }
+
+.fa-hotel::before {
+ content: "\f594"; }
+
+.fa-earth-asia::before {
+ content: "\f57e"; }
+
+.fa-globe-asia::before {
+ content: "\f57e"; }
+
+.fa-id-card-clip::before {
+ content: "\f47f"; }
+
+.fa-id-card-alt::before {
+ content: "\f47f"; }
+
+.fa-magnifying-glass-plus::before {
+ content: "\f00e"; }
+
+.fa-search-plus::before {
+ content: "\f00e"; }
+
+.fa-thumbs-up::before {
+ content: "\f164"; }
+
+.fa-user-clock::before {
+ content: "\f4fd"; }
+
+.fa-hand-dots::before {
+ content: "\f461"; }
+
+.fa-allergies::before {
+ content: "\f461"; }
+
+.fa-file-invoice::before {
+ content: "\f570"; }
+
+.fa-window-minimize::before {
+ content: "\f2d1"; }
+
+.fa-mug-saucer::before {
+ content: "\f0f4"; }
+
+.fa-coffee::before {
+ content: "\f0f4"; }
+
+.fa-brush::before {
+ content: "\f55d"; }
+
+.fa-mask::before {
+ content: "\f6fa"; }
+
+.fa-magnifying-glass-minus::before {
+ content: "\f010"; }
+
+.fa-search-minus::before {
+ content: "\f010"; }
+
+.fa-ruler-vertical::before {
+ content: "\f548"; }
+
+.fa-user-large::before {
+ content: "\f406"; }
+
+.fa-user-alt::before {
+ content: "\f406"; }
+
+.fa-train-tram::before {
+ content: "\e5b4"; }
+
+.fa-user-nurse::before {
+ content: "\f82f"; }
+
+.fa-syringe::before {
+ content: "\f48e"; }
+
+.fa-cloud-sun::before {
+ content: "\f6c4"; }
+
+.fa-stopwatch-20::before {
+ content: "\e06f"; }
+
+.fa-square-full::before {
+ content: "\f45c"; }
+
+.fa-magnet::before {
+ content: "\f076"; }
+
+.fa-jar::before {
+ content: "\e516"; }
+
+.fa-note-sticky::before {
+ content: "\f249"; }
+
+.fa-sticky-note::before {
+ content: "\f249"; }
+
+.fa-bug-slash::before {
+ content: "\e490"; }
+
+.fa-arrow-up-from-water-pump::before {
+ content: "\e4b6"; }
+
+.fa-bone::before {
+ content: "\f5d7"; }
+
+.fa-user-injured::before {
+ content: "\f728"; }
+
+.fa-face-sad-tear::before {
+ content: "\f5b4"; }
+
+.fa-sad-tear::before {
+ content: "\f5b4"; }
+
+.fa-plane::before {
+ content: "\f072"; }
+
+.fa-tent-arrows-down::before {
+ content: "\e581"; }
+
+.fa-exclamation::before {
+ content: "\21"; }
+
+.fa-arrows-spin::before {
+ content: "\e4bb"; }
+
+.fa-print::before {
+ content: "\f02f"; }
+
+.fa-turkish-lira-sign::before {
+ content: "\e2bb"; }
+
+.fa-try::before {
+ content: "\e2bb"; }
+
+.fa-turkish-lira::before {
+ content: "\e2bb"; }
+
+.fa-dollar-sign::before {
+ content: "\24"; }
+
+.fa-dollar::before {
+ content: "\24"; }
+
+.fa-usd::before {
+ content: "\24"; }
+
+.fa-x::before {
+ content: "\58"; }
+
+.fa-magnifying-glass-dollar::before {
+ content: "\f688"; }
+
+.fa-search-dollar::before {
+ content: "\f688"; }
+
+.fa-users-gear::before {
+ content: "\f509"; }
+
+.fa-users-cog::before {
+ content: "\f509"; }
+
+.fa-person-military-pointing::before {
+ content: "\e54a"; }
+
+.fa-building-columns::before {
+ content: "\f19c"; }
+
+.fa-bank::before {
+ content: "\f19c"; }
+
+.fa-institution::before {
+ content: "\f19c"; }
+
+.fa-museum::before {
+ content: "\f19c"; }
+
+.fa-university::before {
+ content: "\f19c"; }
+
+.fa-umbrella::before {
+ content: "\f0e9"; }
+
+.fa-trowel::before {
+ content: "\e589"; }
+
+.fa-d::before {
+ content: "\44"; }
+
+.fa-stapler::before {
+ content: "\e5af"; }
+
+.fa-masks-theater::before {
+ content: "\f630"; }
+
+.fa-theater-masks::before {
+ content: "\f630"; }
+
+.fa-kip-sign::before {
+ content: "\e1c4"; }
+
+.fa-hand-point-left::before {
+ content: "\f0a5"; }
+
+.fa-handshake-simple::before {
+ content: "\f4c6"; }
+
+.fa-handshake-alt::before {
+ content: "\f4c6"; }
+
+.fa-jet-fighter::before {
+ content: "\f0fb"; }
+
+.fa-fighter-jet::before {
+ content: "\f0fb"; }
+
+.fa-square-share-nodes::before {
+ content: "\f1e1"; }
+
+.fa-share-alt-square::before {
+ content: "\f1e1"; }
+
+.fa-barcode::before {
+ content: "\f02a"; }
+
+.fa-plus-minus::before {
+ content: "\e43c"; }
+
+.fa-video::before {
+ content: "\f03d"; }
+
+.fa-video-camera::before {
+ content: "\f03d"; }
+
+.fa-graduation-cap::before {
+ content: "\f19d"; }
+
+.fa-mortar-board::before {
+ content: "\f19d"; }
+
+.fa-hand-holding-medical::before {
+ content: "\e05c"; }
+
+.fa-person-circle-check::before {
+ content: "\e53e"; }
+
+.fa-turn-up::before {
+ content: "\f3bf"; }
+
+.fa-level-up-alt::before {
+ content: "\f3bf"; }
+
+.sr-only,
+.fa-sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ white-space: nowrap;
+ border-width: 0; }
+
+.sr-only-focusable:not(:focus),
+.fa-sr-only-focusable:not(:focus) {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ white-space: nowrap;
+ border-width: 0; }
+:root, :host {
+ --fa-style-family-brands: 'Font Awesome 6 Brands';
+ --fa-font-brands: normal 400 1em/1 'Font Awesome 6 Brands'; }
+
+@font-face {
+ font-family: 'Font Awesome 6 Brands';
+ font-style: normal;
+ font-weight: 400;
+ font-display: block;
+ src: url("../webfonts/FontAwesome6Brands-Regular-400.woff2") format("woff2"), url("../webfonts/FontAwesome6Brands-Regular-400.ttf") format("truetype"); }
+
+.fab,
+.fa-brands {
+ font-weight: 400; }
+
+.fa-monero:before {
+ content: "\f3d0"; }
+
+.fa-hooli:before {
+ content: "\f427"; }
+
+.fa-yelp:before {
+ content: "\f1e9"; }
+
+.fa-cc-visa:before {
+ content: "\f1f0"; }
+
+.fa-lastfm:before {
+ content: "\f202"; }
+
+.fa-shopware:before {
+ content: "\f5b5"; }
+
+.fa-creative-commons-nc:before {
+ content: "\f4e8"; }
+
+.fa-aws:before {
+ content: "\f375"; }
+
+.fa-redhat:before {
+ content: "\f7bc"; }
+
+.fa-yoast:before {
+ content: "\f2b1"; }
+
+.fa-cloudflare:before {
+ content: "\e07d"; }
+
+.fa-ups:before {
+ content: "\f7e0"; }
+
+.fa-wpexplorer:before {
+ content: "\f2de"; }
+
+.fa-dyalog:before {
+ content: "\f399"; }
+
+.fa-bity:before {
+ content: "\f37a"; }
+
+.fa-stackpath:before {
+ content: "\f842"; }
+
+.fa-buysellads:before {
+ content: "\f20d"; }
+
+.fa-first-order:before {
+ content: "\f2b0"; }
+
+.fa-modx:before {
+ content: "\f285"; }
+
+.fa-guilded:before {
+ content: "\e07e"; }
+
+.fa-vnv:before {
+ content: "\f40b"; }
+
+.fa-square-js:before {
+ content: "\f3b9"; }
+
+.fa-js-square:before {
+ content: "\f3b9"; }
+
+.fa-microsoft:before {
+ content: "\f3ca"; }
+
+.fa-qq:before {
+ content: "\f1d6"; }
+
+.fa-orcid:before {
+ content: "\f8d2"; }
+
+.fa-java:before {
+ content: "\f4e4"; }
+
+.fa-invision:before {
+ content: "\f7b0"; }
+
+.fa-creative-commons-pd-alt:before {
+ content: "\f4ed"; }
+
+.fa-centercode:before {
+ content: "\f380"; }
+
+.fa-glide-g:before {
+ content: "\f2a6"; }
+
+.fa-drupal:before {
+ content: "\f1a9"; }
+
+.fa-hire-a-helper:before {
+ content: "\f3b0"; }
+
+.fa-creative-commons-by:before {
+ content: "\f4e7"; }
+
+.fa-unity:before {
+ content: "\e049"; }
+
+.fa-whmcs:before {
+ content: "\f40d"; }
+
+.fa-rocketchat:before {
+ content: "\f3e8"; }
+
+.fa-vk:before {
+ content: "\f189"; }
+
+.fa-untappd:before {
+ content: "\f405"; }
+
+.fa-mailchimp:before {
+ content: "\f59e"; }
+
+.fa-css3-alt:before {
+ content: "\f38b"; }
+
+.fa-square-reddit:before {
+ content: "\f1a2"; }
+
+.fa-reddit-square:before {
+ content: "\f1a2"; }
+
+.fa-vimeo-v:before {
+ content: "\f27d"; }
+
+.fa-contao:before {
+ content: "\f26d"; }
+
+.fa-square-font-awesome:before {
+ content: "\e5ad"; }
+
+.fa-deskpro:before {
+ content: "\f38f"; }
+
+.fa-sistrix:before {
+ content: "\f3ee"; }
+
+.fa-square-instagram:before {
+ content: "\e055"; }
+
+.fa-instagram-square:before {
+ content: "\e055"; }
+
+.fa-battle-net:before {
+ content: "\f835"; }
+
+.fa-the-red-yeti:before {
+ content: "\f69d"; }
+
+.fa-square-hacker-news:before {
+ content: "\f3af"; }
+
+.fa-hacker-news-square:before {
+ content: "\f3af"; }
+
+.fa-edge:before {
+ content: "\f282"; }
+
+.fa-threads:before {
+ content: "\e618"; }
+
+.fa-napster:before {
+ content: "\f3d2"; }
+
+.fa-square-snapchat:before {
+ content: "\f2ad"; }
+
+.fa-snapchat-square:before {
+ content: "\f2ad"; }
+
+.fa-google-plus-g:before {
+ content: "\f0d5"; }
+
+.fa-artstation:before {
+ content: "\f77a"; }
+
+.fa-markdown:before {
+ content: "\f60f"; }
+
+.fa-sourcetree:before {
+ content: "\f7d3"; }
+
+.fa-google-plus:before {
+ content: "\f2b3"; }
+
+.fa-diaspora:before {
+ content: "\f791"; }
+
+.fa-foursquare:before {
+ content: "\f180"; }
+
+.fa-stack-overflow:before {
+ content: "\f16c"; }
+
+.fa-github-alt:before {
+ content: "\f113"; }
+
+.fa-phoenix-squadron:before {
+ content: "\f511"; }
+
+.fa-pagelines:before {
+ content: "\f18c"; }
+
+.fa-algolia:before {
+ content: "\f36c"; }
+
+.fa-red-river:before {
+ content: "\f3e3"; }
+
+.fa-creative-commons-sa:before {
+ content: "\f4ef"; }
+
+.fa-safari:before {
+ content: "\f267"; }
+
+.fa-google:before {
+ content: "\f1a0"; }
+
+.fa-square-font-awesome-stroke:before {
+ content: "\f35c"; }
+
+.fa-font-awesome-alt:before {
+ content: "\f35c"; }
+
+.fa-atlassian:before {
+ content: "\f77b"; }
+
+.fa-linkedin-in:before {
+ content: "\f0e1"; }
+
+.fa-digital-ocean:before {
+ content: "\f391"; }
+
+.fa-nimblr:before {
+ content: "\f5a8"; }
+
+.fa-chromecast:before {
+ content: "\f838"; }
+
+.fa-evernote:before {
+ content: "\f839"; }
+
+.fa-hacker-news:before {
+ content: "\f1d4"; }
+
+.fa-creative-commons-sampling:before {
+ content: "\f4f0"; }
+
+.fa-adversal:before {
+ content: "\f36a"; }
+
+.fa-creative-commons:before {
+ content: "\f25e"; }
+
+.fa-watchman-monitoring:before {
+ content: "\e087"; }
+
+.fa-fonticons:before {
+ content: "\f280"; }
+
+.fa-weixin:before {
+ content: "\f1d7"; }
+
+.fa-shirtsinbulk:before {
+ content: "\f214"; }
+
+.fa-codepen:before {
+ content: "\f1cb"; }
+
+.fa-git-alt:before {
+ content: "\f841"; }
+
+.fa-lyft:before {
+ content: "\f3c3"; }
+
+.fa-rev:before {
+ content: "\f5b2"; }
+
+.fa-windows:before {
+ content: "\f17a"; }
+
+.fa-wizards-of-the-coast:before {
+ content: "\f730"; }
+
+.fa-square-viadeo:before {
+ content: "\f2aa"; }
+
+.fa-viadeo-square:before {
+ content: "\f2aa"; }
+
+.fa-meetup:before {
+ content: "\f2e0"; }
+
+.fa-centos:before {
+ content: "\f789"; }
+
+.fa-adn:before {
+ content: "\f170"; }
+
+.fa-cloudsmith:before {
+ content: "\f384"; }
+
+.fa-pied-piper-alt:before {
+ content: "\f1a8"; }
+
+.fa-square-dribbble:before {
+ content: "\f397"; }
+
+.fa-dribbble-square:before {
+ content: "\f397"; }
+
+.fa-codiepie:before {
+ content: "\f284"; }
+
+.fa-node:before {
+ content: "\f419"; }
+
+.fa-mix:before {
+ content: "\f3cb"; }
+
+.fa-steam:before {
+ content: "\f1b6"; }
+
+.fa-cc-apple-pay:before {
+ content: "\f416"; }
+
+.fa-scribd:before {
+ content: "\f28a"; }
+
+.fa-debian:before {
+ content: "\e60b"; }
+
+.fa-openid:before {
+ content: "\f19b"; }
+
+.fa-instalod:before {
+ content: "\e081"; }
+
+.fa-expeditedssl:before {
+ content: "\f23e"; }
+
+.fa-sellcast:before {
+ content: "\f2da"; }
+
+.fa-square-twitter:before {
+ content: "\f081"; }
+
+.fa-twitter-square:before {
+ content: "\f081"; }
+
+.fa-r-project:before {
+ content: "\f4f7"; }
+
+.fa-delicious:before {
+ content: "\f1a5"; }
+
+.fa-freebsd:before {
+ content: "\f3a4"; }
+
+.fa-vuejs:before {
+ content: "\f41f"; }
+
+.fa-accusoft:before {
+ content: "\f369"; }
+
+.fa-ioxhost:before {
+ content: "\f208"; }
+
+.fa-fonticons-fi:before {
+ content: "\f3a2"; }
+
+.fa-app-store:before {
+ content: "\f36f"; }
+
+.fa-cc-mastercard:before {
+ content: "\f1f1"; }
+
+.fa-itunes-note:before {
+ content: "\f3b5"; }
+
+.fa-golang:before {
+ content: "\e40f"; }
+
+.fa-kickstarter:before {
+ content: "\f3bb"; }
+
+.fa-grav:before {
+ content: "\f2d6"; }
+
+.fa-weibo:before {
+ content: "\f18a"; }
+
+.fa-uncharted:before {
+ content: "\e084"; }
+
+.fa-firstdraft:before {
+ content: "\f3a1"; }
+
+.fa-square-youtube:before {
+ content: "\f431"; }
+
+.fa-youtube-square:before {
+ content: "\f431"; }
+
+.fa-wikipedia-w:before {
+ content: "\f266"; }
+
+.fa-wpressr:before {
+ content: "\f3e4"; }
+
+.fa-rendact:before {
+ content: "\f3e4"; }
+
+.fa-angellist:before {
+ content: "\f209"; }
+
+.fa-galactic-republic:before {
+ content: "\f50c"; }
+
+.fa-nfc-directional:before {
+ content: "\e530"; }
+
+.fa-skype:before {
+ content: "\f17e"; }
+
+.fa-joget:before {
+ content: "\f3b7"; }
+
+.fa-fedora:before {
+ content: "\f798"; }
+
+.fa-stripe-s:before {
+ content: "\f42a"; }
+
+.fa-meta:before {
+ content: "\e49b"; }
+
+.fa-laravel:before {
+ content: "\f3bd"; }
+
+.fa-hotjar:before {
+ content: "\f3b1"; }
+
+.fa-bluetooth-b:before {
+ content: "\f294"; }
+
+.fa-sticker-mule:before {
+ content: "\f3f7"; }
+
+.fa-creative-commons-zero:before {
+ content: "\f4f3"; }
+
+.fa-hips:before {
+ content: "\f452"; }
+
+.fa-behance:before {
+ content: "\f1b4"; }
+
+.fa-reddit:before {
+ content: "\f1a1"; }
+
+.fa-discord:before {
+ content: "\f392"; }
+
+.fa-chrome:before {
+ content: "\f268"; }
+
+.fa-app-store-ios:before {
+ content: "\f370"; }
+
+.fa-cc-discover:before {
+ content: "\f1f2"; }
+
+.fa-wpbeginner:before {
+ content: "\f297"; }
+
+.fa-confluence:before {
+ content: "\f78d"; }
+
+.fa-mdb:before {
+ content: "\f8ca"; }
+
+.fa-dochub:before {
+ content: "\f394"; }
+
+.fa-accessible-icon:before {
+ content: "\f368"; }
+
+.fa-ebay:before {
+ content: "\f4f4"; }
+
+.fa-amazon:before {
+ content: "\f270"; }
+
+.fa-unsplash:before {
+ content: "\e07c"; }
+
+.fa-yarn:before {
+ content: "\f7e3"; }
+
+.fa-square-steam:before {
+ content: "\f1b7"; }
+
+.fa-steam-square:before {
+ content: "\f1b7"; }
+
+.fa-500px:before {
+ content: "\f26e"; }
+
+.fa-square-vimeo:before {
+ content: "\f194"; }
+
+.fa-vimeo-square:before {
+ content: "\f194"; }
+
+.fa-asymmetrik:before {
+ content: "\f372"; }
+
+.fa-font-awesome:before {
+ content: "\f2b4"; }
+
+.fa-font-awesome-flag:before {
+ content: "\f2b4"; }
+
+.fa-font-awesome-logo-full:before {
+ content: "\f2b4"; }
+
+.fa-gratipay:before {
+ content: "\f184"; }
+
+.fa-apple:before {
+ content: "\f179"; }
+
+.fa-hive:before {
+ content: "\e07f"; }
+
+.fa-gitkraken:before {
+ content: "\f3a6"; }
+
+.fa-keybase:before {
+ content: "\f4f5"; }
+
+.fa-apple-pay:before {
+ content: "\f415"; }
+
+.fa-padlet:before {
+ content: "\e4a0"; }
+
+.fa-amazon-pay:before {
+ content: "\f42c"; }
+
+.fa-square-github:before {
+ content: "\f092"; }
+
+.fa-github-square:before {
+ content: "\f092"; }
+
+.fa-stumbleupon:before {
+ content: "\f1a4"; }
+
+.fa-fedex:before {
+ content: "\f797"; }
+
+.fa-phoenix-framework:before {
+ content: "\f3dc"; }
+
+.fa-shopify:before {
+ content: "\e057"; }
+
+.fa-neos:before {
+ content: "\f612"; }
+
+.fa-square-threads:before {
+ content: "\e619"; }
+
+.fa-hackerrank:before {
+ content: "\f5f7"; }
+
+.fa-researchgate:before {
+ content: "\f4f8"; }
+
+.fa-swift:before {
+ content: "\f8e1"; }
+
+.fa-angular:before {
+ content: "\f420"; }
+
+.fa-speakap:before {
+ content: "\f3f3"; }
+
+.fa-angrycreative:before {
+ content: "\f36e"; }
+
+.fa-y-combinator:before {
+ content: "\f23b"; }
+
+.fa-empire:before {
+ content: "\f1d1"; }
+
+.fa-envira:before {
+ content: "\f299"; }
+
+.fa-square-gitlab:before {
+ content: "\e5ae"; }
+
+.fa-gitlab-square:before {
+ content: "\e5ae"; }
+
+.fa-studiovinari:before {
+ content: "\f3f8"; }
+
+.fa-pied-piper:before {
+ content: "\f2ae"; }
+
+.fa-wordpress:before {
+ content: "\f19a"; }
+
+.fa-product-hunt:before {
+ content: "\f288"; }
+
+.fa-firefox:before {
+ content: "\f269"; }
+
+.fa-linode:before {
+ content: "\f2b8"; }
+
+.fa-goodreads:before {
+ content: "\f3a8"; }
+
+.fa-square-odnoklassniki:before {
+ content: "\f264"; }
+
+.fa-odnoklassniki-square:before {
+ content: "\f264"; }
+
+.fa-jsfiddle:before {
+ content: "\f1cc"; }
+
+.fa-sith:before {
+ content: "\f512"; }
+
+.fa-themeisle:before {
+ content: "\f2b2"; }
+
+.fa-page4:before {
+ content: "\f3d7"; }
+
+.fa-hashnode:before {
+ content: "\e499"; }
+
+.fa-react:before {
+ content: "\f41b"; }
+
+.fa-cc-paypal:before {
+ content: "\f1f4"; }
+
+.fa-squarespace:before {
+ content: "\f5be"; }
+
+.fa-cc-stripe:before {
+ content: "\f1f5"; }
+
+.fa-creative-commons-share:before {
+ content: "\f4f2"; }
+
+.fa-bitcoin:before {
+ content: "\f379"; }
+
+.fa-keycdn:before {
+ content: "\f3ba"; }
+
+.fa-opera:before {
+ content: "\f26a"; }
+
+.fa-itch-io:before {
+ content: "\f83a"; }
+
+.fa-umbraco:before {
+ content: "\f8e8"; }
+
+.fa-galactic-senate:before {
+ content: "\f50d"; }
+
+.fa-ubuntu:before {
+ content: "\f7df"; }
+
+.fa-draft2digital:before {
+ content: "\f396"; }
+
+.fa-stripe:before {
+ content: "\f429"; }
+
+.fa-houzz:before {
+ content: "\f27c"; }
+
+.fa-gg:before {
+ content: "\f260"; }
+
+.fa-dhl:before {
+ content: "\f790"; }
+
+.fa-square-pinterest:before {
+ content: "\f0d3"; }
+
+.fa-pinterest-square:before {
+ content: "\f0d3"; }
+
+.fa-xing:before {
+ content: "\f168"; }
+
+.fa-blackberry:before {
+ content: "\f37b"; }
+
+.fa-creative-commons-pd:before {
+ content: "\f4ec"; }
+
+.fa-playstation:before {
+ content: "\f3df"; }
+
+.fa-quinscape:before {
+ content: "\f459"; }
+
+.fa-less:before {
+ content: "\f41d"; }
+
+.fa-blogger-b:before {
+ content: "\f37d"; }
+
+.fa-opencart:before {
+ content: "\f23d"; }
+
+.fa-vine:before {
+ content: "\f1ca"; }
+
+.fa-paypal:before {
+ content: "\f1ed"; }
+
+.fa-gitlab:before {
+ content: "\f296"; }
+
+.fa-typo3:before {
+ content: "\f42b"; }
+
+.fa-reddit-alien:before {
+ content: "\f281"; }
+
+.fa-yahoo:before {
+ content: "\f19e"; }
+
+.fa-dailymotion:before {
+ content: "\e052"; }
+
+.fa-affiliatetheme:before {
+ content: "\f36b"; }
+
+.fa-pied-piper-pp:before {
+ content: "\f1a7"; }
+
+.fa-bootstrap:before {
+ content: "\f836"; }
+
+.fa-odnoklassniki:before {
+ content: "\f263"; }
+
+.fa-nfc-symbol:before {
+ content: "\e531"; }
+
+.fa-ethereum:before {
+ content: "\f42e"; }
+
+.fa-speaker-deck:before {
+ content: "\f83c"; }
+
+.fa-creative-commons-nc-eu:before {
+ content: "\f4e9"; }
+
+.fa-patreon:before {
+ content: "\f3d9"; }
+
+.fa-avianex:before {
+ content: "\f374"; }
+
+.fa-ello:before {
+ content: "\f5f1"; }
+
+.fa-gofore:before {
+ content: "\f3a7"; }
+
+.fa-bimobject:before {
+ content: "\f378"; }
+
+.fa-facebook-f:before {
+ content: "\f39e"; }
+
+.fa-square-google-plus:before {
+ content: "\f0d4"; }
+
+.fa-google-plus-square:before {
+ content: "\f0d4"; }
+
+.fa-mandalorian:before {
+ content: "\f50f"; }
+
+.fa-first-order-alt:before {
+ content: "\f50a"; }
+
+.fa-osi:before {
+ content: "\f41a"; }
+
+.fa-google-wallet:before {
+ content: "\f1ee"; }
+
+.fa-d-and-d-beyond:before {
+ content: "\f6ca"; }
+
+.fa-periscope:before {
+ content: "\f3da"; }
+
+.fa-fulcrum:before {
+ content: "\f50b"; }
+
+.fa-cloudscale:before {
+ content: "\f383"; }
+
+.fa-forumbee:before {
+ content: "\f211"; }
+
+.fa-mizuni:before {
+ content: "\f3cc"; }
+
+.fa-schlix:before {
+ content: "\f3ea"; }
+
+.fa-square-xing:before {
+ content: "\f169"; }
+
+.fa-xing-square:before {
+ content: "\f169"; }
+
+.fa-bandcamp:before {
+ content: "\f2d5"; }
+
+.fa-wpforms:before {
+ content: "\f298"; }
+
+.fa-cloudversify:before {
+ content: "\f385"; }
+
+.fa-usps:before {
+ content: "\f7e1"; }
+
+.fa-megaport:before {
+ content: "\f5a3"; }
+
+.fa-magento:before {
+ content: "\f3c4"; }
+
+.fa-spotify:before {
+ content: "\f1bc"; }
+
+.fa-optin-monster:before {
+ content: "\f23c"; }
+
+.fa-fly:before {
+ content: "\f417"; }
+
+.fa-aviato:before {
+ content: "\f421"; }
+
+.fa-itunes:before {
+ content: "\f3b4"; }
+
+.fa-cuttlefish:before {
+ content: "\f38c"; }
+
+.fa-blogger:before {
+ content: "\f37c"; }
+
+.fa-flickr:before {
+ content: "\f16e"; }
+
+.fa-viber:before {
+ content: "\f409"; }
+
+.fa-soundcloud:before {
+ content: "\f1be"; }
+
+.fa-digg:before {
+ content: "\f1a6"; }
+
+.fa-tencent-weibo:before {
+ content: "\f1d5"; }
+
+.fa-symfony:before {
+ content: "\f83d"; }
+
+.fa-maxcdn:before {
+ content: "\f136"; }
+
+.fa-etsy:before {
+ content: "\f2d7"; }
+
+.fa-facebook-messenger:before {
+ content: "\f39f"; }
+
+.fa-audible:before {
+ content: "\f373"; }
+
+.fa-think-peaks:before {
+ content: "\f731"; }
+
+.fa-bilibili:before {
+ content: "\e3d9"; }
+
+.fa-erlang:before {
+ content: "\f39d"; }
+
+.fa-x-twitter:before {
+ content: "\e61b"; }
+
+.fa-cotton-bureau:before {
+ content: "\f89e"; }
+
+.fa-dashcube:before {
+ content: "\f210"; }
+
+.fa-42-group:before {
+ content: "\e080"; }
+
+.fa-innosoft:before {
+ content: "\e080"; }
+
+.fa-stack-exchange:before {
+ content: "\f18d"; }
+
+.fa-elementor:before {
+ content: "\f430"; }
+
+.fa-square-pied-piper:before {
+ content: "\e01e"; }
+
+.fa-pied-piper-square:before {
+ content: "\e01e"; }
+
+.fa-creative-commons-nd:before {
+ content: "\f4eb"; }
+
+.fa-palfed:before {
+ content: "\f3d8"; }
+
+.fa-superpowers:before {
+ content: "\f2dd"; }
+
+.fa-resolving:before {
+ content: "\f3e7"; }
+
+.fa-xbox:before {
+ content: "\f412"; }
+
+.fa-searchengin:before {
+ content: "\f3eb"; }
+
+.fa-tiktok:before {
+ content: "\e07b"; }
+
+.fa-square-facebook:before {
+ content: "\f082"; }
+
+.fa-facebook-square:before {
+ content: "\f082"; }
+
+.fa-renren:before {
+ content: "\f18b"; }
+
+.fa-linux:before {
+ content: "\f17c"; }
+
+.fa-glide:before {
+ content: "\f2a5"; }
+
+.fa-linkedin:before {
+ content: "\f08c"; }
+
+.fa-hubspot:before {
+ content: "\f3b2"; }
+
+.fa-deploydog:before {
+ content: "\f38e"; }
+
+.fa-twitch:before {
+ content: "\f1e8"; }
+
+.fa-ravelry:before {
+ content: "\f2d9"; }
+
+.fa-mixer:before {
+ content: "\e056"; }
+
+.fa-square-lastfm:before {
+ content: "\f203"; }
+
+.fa-lastfm-square:before {
+ content: "\f203"; }
+
+.fa-vimeo:before {
+ content: "\f40a"; }
+
+.fa-mendeley:before {
+ content: "\f7b3"; }
+
+.fa-uniregistry:before {
+ content: "\f404"; }
+
+.fa-figma:before {
+ content: "\f799"; }
+
+.fa-creative-commons-remix:before {
+ content: "\f4ee"; }
+
+.fa-cc-amazon-pay:before {
+ content: "\f42d"; }
+
+.fa-dropbox:before {
+ content: "\f16b"; }
+
+.fa-instagram:before {
+ content: "\f16d"; }
+
+.fa-cmplid:before {
+ content: "\e360"; }
+
+.fa-facebook:before {
+ content: "\f09a"; }
+
+.fa-gripfire:before {
+ content: "\f3ac"; }
+
+.fa-jedi-order:before {
+ content: "\f50e"; }
+
+.fa-uikit:before {
+ content: "\f403"; }
+
+.fa-fort-awesome-alt:before {
+ content: "\f3a3"; }
+
+.fa-phabricator:before {
+ content: "\f3db"; }
+
+.fa-ussunnah:before {
+ content: "\f407"; }
+
+.fa-earlybirds:before {
+ content: "\f39a"; }
+
+.fa-trade-federation:before {
+ content: "\f513"; }
+
+.fa-autoprefixer:before {
+ content: "\f41c"; }
+
+.fa-whatsapp:before {
+ content: "\f232"; }
+
+.fa-slideshare:before {
+ content: "\f1e7"; }
+
+.fa-google-play:before {
+ content: "\f3ab"; }
+
+.fa-viadeo:before {
+ content: "\f2a9"; }
+
+.fa-line:before {
+ content: "\f3c0"; }
+
+.fa-google-drive:before {
+ content: "\f3aa"; }
+
+.fa-servicestack:before {
+ content: "\f3ec"; }
+
+.fa-simplybuilt:before {
+ content: "\f215"; }
+
+.fa-bitbucket:before {
+ content: "\f171"; }
+
+.fa-imdb:before {
+ content: "\f2d8"; }
+
+.fa-deezer:before {
+ content: "\e077"; }
+
+.fa-raspberry-pi:before {
+ content: "\f7bb"; }
+
+.fa-jira:before {
+ content: "\f7b1"; }
+
+.fa-docker:before {
+ content: "\f395"; }
+
+.fa-screenpal:before {
+ content: "\e570"; }
+
+.fa-bluetooth:before {
+ content: "\f293"; }
+
+.fa-gitter:before {
+ content: "\f426"; }
+
+.fa-d-and-d:before {
+ content: "\f38d"; }
+
+.fa-microblog:before {
+ content: "\e01a"; }
+
+.fa-cc-diners-club:before {
+ content: "\f24c"; }
+
+.fa-gg-circle:before {
+ content: "\f261"; }
+
+.fa-pied-piper-hat:before {
+ content: "\f4e5"; }
+
+.fa-kickstarter-k:before {
+ content: "\f3bc"; }
+
+.fa-yandex:before {
+ content: "\f413"; }
+
+.fa-readme:before {
+ content: "\f4d5"; }
+
+.fa-html5:before {
+ content: "\f13b"; }
+
+.fa-sellsy:before {
+ content: "\f213"; }
+
+.fa-sass:before {
+ content: "\f41e"; }
+
+.fa-wirsindhandwerk:before {
+ content: "\e2d0"; }
+
+.fa-wsh:before {
+ content: "\e2d0"; }
+
+.fa-buromobelexperte:before {
+ content: "\f37f"; }
+
+.fa-salesforce:before {
+ content: "\f83b"; }
+
+.fa-octopus-deploy:before {
+ content: "\e082"; }
+
+.fa-medapps:before {
+ content: "\f3c6"; }
+
+.fa-ns8:before {
+ content: "\f3d5"; }
+
+.fa-pinterest-p:before {
+ content: "\f231"; }
+
+.fa-apper:before {
+ content: "\f371"; }
+
+.fa-fort-awesome:before {
+ content: "\f286"; }
+
+.fa-waze:before {
+ content: "\f83f"; }
+
+.fa-cc-jcb:before {
+ content: "\f24b"; }
+
+.fa-snapchat:before {
+ content: "\f2ab"; }
+
+.fa-snapchat-ghost:before {
+ content: "\f2ab"; }
+
+.fa-fantasy-flight-games:before {
+ content: "\f6dc"; }
+
+.fa-rust:before {
+ content: "\e07a"; }
+
+.fa-wix:before {
+ content: "\f5cf"; }
+
+.fa-square-behance:before {
+ content: "\f1b5"; }
+
+.fa-behance-square:before {
+ content: "\f1b5"; }
+
+.fa-supple:before {
+ content: "\f3f9"; }
+
+.fa-rebel:before {
+ content: "\f1d0"; }
+
+.fa-css3:before {
+ content: "\f13c"; }
+
+.fa-staylinked:before {
+ content: "\f3f5"; }
+
+.fa-kaggle:before {
+ content: "\f5fa"; }
+
+.fa-space-awesome:before {
+ content: "\e5ac"; }
+
+.fa-deviantart:before {
+ content: "\f1bd"; }
+
+.fa-cpanel:before {
+ content: "\f388"; }
+
+.fa-goodreads-g:before {
+ content: "\f3a9"; }
+
+.fa-square-git:before {
+ content: "\f1d2"; }
+
+.fa-git-square:before {
+ content: "\f1d2"; }
+
+.fa-square-tumblr:before {
+ content: "\f174"; }
+
+.fa-tumblr-square:before {
+ content: "\f174"; }
+
+.fa-trello:before {
+ content: "\f181"; }
+
+.fa-creative-commons-nc-jp:before {
+ content: "\f4ea"; }
+
+.fa-get-pocket:before {
+ content: "\f265"; }
+
+.fa-perbyte:before {
+ content: "\e083"; }
+
+.fa-grunt:before {
+ content: "\f3ad"; }
+
+.fa-weebly:before {
+ content: "\f5cc"; }
+
+.fa-connectdevelop:before {
+ content: "\f20e"; }
+
+.fa-leanpub:before {
+ content: "\f212"; }
+
+.fa-black-tie:before {
+ content: "\f27e"; }
+
+.fa-themeco:before {
+ content: "\f5c6"; }
+
+.fa-python:before {
+ content: "\f3e2"; }
+
+.fa-android:before {
+ content: "\f17b"; }
+
+.fa-bots:before {
+ content: "\e340"; }
+
+.fa-free-code-camp:before {
+ content: "\f2c5"; }
+
+.fa-hornbill:before {
+ content: "\f592"; }
+
+.fa-js:before {
+ content: "\f3b8"; }
+
+.fa-ideal:before {
+ content: "\e013"; }
+
+.fa-git:before {
+ content: "\f1d3"; }
+
+.fa-dev:before {
+ content: "\f6cc"; }
+
+.fa-sketch:before {
+ content: "\f7c6"; }
+
+.fa-yandex-international:before {
+ content: "\f414"; }
+
+.fa-cc-amex:before {
+ content: "\f1f3"; }
+
+.fa-uber:before {
+ content: "\f402"; }
+
+.fa-github:before {
+ content: "\f09b"; }
+
+.fa-php:before {
+ content: "\f457"; }
+
+.fa-alipay:before {
+ content: "\f642"; }
+
+.fa-youtube:before {
+ content: "\f167"; }
+
+.fa-skyatlas:before {
+ content: "\f216"; }
+
+.fa-firefox-browser:before {
+ content: "\e007"; }
+
+.fa-replyd:before {
+ content: "\f3e6"; }
+
+.fa-suse:before {
+ content: "\f7d6"; }
+
+.fa-jenkins:before {
+ content: "\f3b6"; }
+
+.fa-twitter:before {
+ content: "\f099"; }
+
+.fa-rockrms:before {
+ content: "\f3e9"; }
+
+.fa-pinterest:before {
+ content: "\f0d2"; }
+
+.fa-buffer:before {
+ content: "\f837"; }
+
+.fa-npm:before {
+ content: "\f3d4"; }
+
+.fa-yammer:before {
+ content: "\f840"; }
+
+.fa-btc:before {
+ content: "\f15a"; }
+
+.fa-dribbble:before {
+ content: "\f17d"; }
+
+.fa-stumbleupon-circle:before {
+ content: "\f1a3"; }
+
+.fa-internet-explorer:before {
+ content: "\f26b"; }
+
+.fa-stubber:before {
+ content: "\e5c7"; }
+
+.fa-telegram:before {
+ content: "\f2c6"; }
+
+.fa-telegram-plane:before {
+ content: "\f2c6"; }
+
+.fa-old-republic:before {
+ content: "\f510"; }
+
+.fa-odysee:before {
+ content: "\e5c6"; }
+
+.fa-square-whatsapp:before {
+ content: "\f40c"; }
+
+.fa-whatsapp-square:before {
+ content: "\f40c"; }
+
+.fa-node-js:before {
+ content: "\f3d3"; }
+
+.fa-edge-legacy:before {
+ content: "\e078"; }
+
+.fa-slack:before {
+ content: "\f198"; }
+
+.fa-slack-hash:before {
+ content: "\f198"; }
+
+.fa-medrt:before {
+ content: "\f3c8"; }
+
+.fa-usb:before {
+ content: "\f287"; }
+
+.fa-tumblr:before {
+ content: "\f173"; }
+
+.fa-vaadin:before {
+ content: "\f408"; }
+
+.fa-quora:before {
+ content: "\f2c4"; }
+
+.fa-square-x-twitter:before {
+ content: "\e61a"; }
+
+.fa-reacteurope:before {
+ content: "\f75d"; }
+
+.fa-medium:before {
+ content: "\f23a"; }
+
+.fa-medium-m:before {
+ content: "\f23a"; }
+
+.fa-amilia:before {
+ content: "\f36d"; }
+
+.fa-mixcloud:before {
+ content: "\f289"; }
+
+.fa-flipboard:before {
+ content: "\f44d"; }
+
+.fa-viacoin:before {
+ content: "\f237"; }
+
+.fa-critical-role:before {
+ content: "\f6c9"; }
+
+.fa-sitrox:before {
+ content: "\e44a"; }
+
+.fa-discourse:before {
+ content: "\f393"; }
+
+.fa-joomla:before {
+ content: "\f1aa"; }
+
+.fa-mastodon:before {
+ content: "\f4f6"; }
+
+.fa-airbnb:before {
+ content: "\f834"; }
+
+.fa-wolf-pack-battalion:before {
+ content: "\f514"; }
+
+.fa-buy-n-large:before {
+ content: "\f8a6"; }
+
+.fa-gulp:before {
+ content: "\f3ae"; }
+
+.fa-creative-commons-sampling-plus:before {
+ content: "\f4f1"; }
+
+.fa-strava:before {
+ content: "\f428"; }
+
+.fa-ember:before {
+ content: "\f423"; }
+
+.fa-canadian-maple-leaf:before {
+ content: "\f785"; }
+
+.fa-teamspeak:before {
+ content: "\f4f9"; }
+
+.fa-pushed:before {
+ content: "\f3e1"; }
+
+.fa-wordpress-simple:before {
+ content: "\f411"; }
+
+.fa-nutritionix:before {
+ content: "\f3d6"; }
+
+.fa-wodu:before {
+ content: "\e088"; }
+
+.fa-google-pay:before {
+ content: "\e079"; }
+
+.fa-intercom:before {
+ content: "\f7af"; }
+
+.fa-zhihu:before {
+ content: "\f63f"; }
+
+.fa-korvue:before {
+ content: "\f42f"; }
+
+.fa-pix:before {
+ content: "\e43a"; }
+
+.fa-steam-symbol:before {
+ content: "\f3f6"; }
+:root, :host {
+ --fa-style-family-classic: 'Font Awesome 6 Free';
+ --fa-font-regular: normal 400 1em/1 'Font Awesome 6 Free'; }
+
+@font-face {
+ font-family: 'Font Awesome 6 Free';
+ font-style: normal;
+ font-weight: 400;
+ font-display: block;
+ src: url("../webfonts/FontAwesome6Free-Regular-400.woff2") format("woff2"), url("../webfonts/FontAwesome6Free-Regular-400.ttf") format("truetype"); }
+
+.far,
+.fa-regular {
+ font-weight: 400; }
+:root, :host {
+ --fa-style-family-classic: 'Font Awesome 6 Free';
+ --fa-font-solid: normal 900 1em/1 'Font Awesome 6 Free'; }
+
+@font-face {
+ font-family: 'Font Awesome 6 Free';
+ font-style: normal;
+ font-weight: 900;
+ font-display: block;
+ src: url("../webfonts/FontAwesome6Free-Solid-900.woff2") format("woff2"), url("../webfonts/FontAwesome6Free-Solid-900.ttf") format("truetype"); }
+
+.fas,
+.fa-solid {
+ font-weight: 900; }
+@font-face {
+ font-family: 'Font Awesome 6 Brands';
+ font-display: block;
+ font-weight: 400;
+ src: url("../webfonts/FontAwesome6Brands-Regular-400.woff2") format("woff2"), url("../webfonts/FontAwesome6Brands-Regular-400.ttf") format("truetype"); }
+
+@font-face {
+ font-family: 'Font Awesome 6 Free';
+ font-display: block;
+ font-weight: 900;
+ src: url("../webfonts/FontAwesome6Free-Solid-900.woff2") format("woff2"), url("../webfonts/FontAwesome6Free-Solid-900.ttf") format("truetype"); }
+
+@font-face {
+ font-family: 'Font Awesome 6 Free';
+ font-display: block;
+ font-weight: 400;
+ src: url("../webfonts/../webfonts/FontAwesome6Free-Regular-400.woff2") format("woff2"), url("../webfonts/FontAwesome6Free-Regular-400.ttf") format("truetype"); }
+@font-face {
+ font-family: 'Font Awesome 6 Free';
+ font-display: block;
+ src: url("../webfonts/FontAwesome6Free-Solid-900.woff2") format("woff2"), url("../webfonts/FontAwesome6Free-Solid-900.ttf") format("truetype"); }
+
+@font-face {
+ font-family: 'Font Awesome 6 Brands';
+ font-display: block;
+ src: url("../webfonts/FontAwesome6Brands-Regular-400.woff2") format("woff2"), url("../webfonts/FontAwesome6Brands-Regular-400.ttf") format("truetype"); }
+
+@font-face {
+ font-family: 'Font Awesome 6 Free';
+ font-display: block;
+ src: url("../webfonts/FontAwesome6Free-Regular-400.woff2") format("woff2"), url("../../webfonts/FontAwesome6Free-Regular-400.ttf") format("truetype");
+ unicode-range: U+F003,U+F006,U+F014,U+F016-F017,U+F01A-F01B,U+F01D,U+F022,U+F03E,U+F044,U+F046,U+F05C-F05D,U+F06E,U+F070,U+F087-F088,U+F08A,U+F094,U+F096-F097,U+F09D,U+F0A0,U+F0A2,U+F0A4-F0A7,U+F0C5,U+F0C7,U+F0E5-F0E6,U+F0EB,U+F0F6-F0F8,U+F10C,U+F114-F115,U+F118-F11A,U+F11C-F11D,U+F133,U+F147,U+F14E,U+F150-F152,U+F185-F186,U+F18E,U+F190-F192,U+F196,U+F1C1-F1C9,U+F1D9,U+F1DB,U+F1E3,U+F1EA,U+F1F7,U+F1F9,U+F20A,U+F247-F248,U+F24A,U+F24D,U+F255-F25B,U+F25D,U+F271-F274,U+F278,U+F27B,U+F28C,U+F28E,U+F29C,U+F2B5,U+F2B7,U+F2BA,U+F2BC,U+F2BE,U+F2C0-F2C1,U+F2C3,U+F2D0,U+F2D2,U+F2D4,U+F2DC; }
+
diff --git a/book/_extensions/quarto-ext/fontawesome/assets/css/latex-fontsize.css b/book/_extensions/quarto-ext/fontawesome/assets/css/latex-fontsize.css
new file mode 100644
index 0000000000..45545ecff3
--- /dev/null
+++ b/book/_extensions/quarto-ext/fontawesome/assets/css/latex-fontsize.css
@@ -0,0 +1,30 @@
+.fa-tiny {
+ font-size: 0.5em;
+}
+.fa-scriptsize {
+ font-size: 0.7em;
+}
+.fa-footnotesize {
+ font-size: 0.8em;
+}
+.fa-small {
+ font-size: 0.9em;
+}
+.fa-normalsize {
+ font-size: 1em;
+}
+.fa-large {
+ font-size: 1.2em;
+}
+.fa-Large {
+ font-size: 1.5em;
+}
+.fa-LARGE {
+ font-size: 1.75em;
+}
+.fa-huge {
+ font-size: 2em;
+}
+.fa-Huge {
+ font-size: 2.5em;
+}
diff --git a/book/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Brands-Regular-400.ttf b/book/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Brands-Regular-400.ttf
new file mode 100644
index 0000000000..34a1436b2c
Binary files /dev/null and b/book/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Brands-Regular-400.ttf differ
diff --git a/book/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Brands-Regular-400.woff2 b/book/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Brands-Regular-400.woff2
new file mode 100644
index 0000000000..d1a319f3ee
Binary files /dev/null and b/book/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Brands-Regular-400.woff2 differ
diff --git a/book/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Free-Regular-400.ttf b/book/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Free-Regular-400.ttf
new file mode 100644
index 0000000000..d0aeac9566
Binary files /dev/null and b/book/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Free-Regular-400.ttf differ
diff --git a/book/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Free-Regular-400.woff2 b/book/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Free-Regular-400.woff2
new file mode 100644
index 0000000000..f3918d2b23
Binary files /dev/null and b/book/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Free-Regular-400.woff2 differ
diff --git a/book/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Free-Solid-900.ttf b/book/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Free-Solid-900.ttf
new file mode 100644
index 0000000000..deab676ff9
Binary files /dev/null and b/book/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Free-Solid-900.ttf differ
diff --git a/book/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Free-Solid-900.woff2 b/book/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Free-Solid-900.woff2
new file mode 100644
index 0000000000..53c1987fe4
Binary files /dev/null and b/book/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Free-Solid-900.woff2 differ
diff --git a/book/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-brands-400.ttf b/book/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-brands-400.ttf
new file mode 100644
index 0000000000..430a02edc6
Binary files /dev/null and b/book/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-brands-400.ttf differ
diff --git a/book/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-brands-400.woff2 b/book/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-brands-400.woff2
new file mode 100644
index 0000000000..4d904aab4f
Binary files /dev/null and b/book/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-brands-400.woff2 differ
diff --git a/book/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-regular-400.ttf b/book/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-regular-400.ttf
new file mode 100644
index 0000000000..23e3febe0d
Binary files /dev/null and b/book/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-regular-400.ttf differ
diff --git a/book/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-regular-400.woff2 b/book/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-regular-400.woff2
new file mode 100644
index 0000000000..80e3b1247c
Binary files /dev/null and b/book/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-regular-400.woff2 differ
diff --git a/book/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-solid-900.ttf b/book/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-solid-900.ttf
new file mode 100644
index 0000000000..da9082420e
Binary files /dev/null and b/book/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-solid-900.ttf differ
diff --git a/book/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-solid-900.woff2 b/book/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-solid-900.woff2
new file mode 100644
index 0000000000..360ba11557
Binary files /dev/null and b/book/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-solid-900.woff2 differ
diff --git a/book/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-v4compatibility.ttf b/book/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-v4compatibility.ttf
new file mode 100644
index 0000000000..e9545ed579
Binary files /dev/null and b/book/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-v4compatibility.ttf differ
diff --git a/book/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-v4compatibility.woff2 b/book/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-v4compatibility.woff2
new file mode 100644
index 0000000000..db5b0b9973
Binary files /dev/null and b/book/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-v4compatibility.woff2 differ
diff --git a/book/_extensions/quarto-ext/fontawesome/fontawesome.lua b/book/_extensions/quarto-ext/fontawesome/fontawesome.lua
new file mode 100644
index 0000000000..ff64dcaa37
--- /dev/null
+++ b/book/_extensions/quarto-ext/fontawesome/fontawesome.lua
@@ -0,0 +1,84 @@
+local function ensureLatexDeps()
+ quarto.doc.use_latex_package("fontawesome5")
+end
+
+local function ensureHtmlDeps()
+ quarto.doc.add_html_dependency({
+ name = 'fontawesome6',
+ version = '0.1.0',
+ stylesheets = {'assets/css/all.css', 'assets/css/latex-fontsize.css'}
+ })
+end
+
+local function isEmpty(s)
+ return s == nil or s == ''
+end
+
+local function isValidSize(size)
+ local validSizes = {
+ "tiny",
+ "scriptsize",
+ "footnotesize",
+ "small",
+ "normalsize",
+ "large",
+ "Large",
+ "LARGE",
+ "huge",
+ "Huge"
+ }
+ for _, v in ipairs(validSizes) do
+ if v == size then
+ return size
+ end
+ end
+ return ""
+end
+
+return {
+ ["fa"] = function(args, kwargs)
+
+ local group = "solid"
+ local icon = pandoc.utils.stringify(args[1])
+ if #args > 1 then
+ group = icon
+ icon = pandoc.utils.stringify(args[2])
+ end
+
+ local title = pandoc.utils.stringify(kwargs["title"])
+ if not isEmpty(title) then
+ title = " title=\"" .. title .. "\""
+ end
+
+ local label = pandoc.utils.stringify(kwargs["label"])
+ if isEmpty(label) then
+ label = " aria-label=\"" .. icon .. "\""
+ else
+ label = " aria-label=\"" .. label .. "\""
+ end
+
+ local size = pandoc.utils.stringify(kwargs["size"])
+
+ -- detect html (excluding epub which won't handle fa)
+ if quarto.doc.is_format("html:js") then
+ ensureHtmlDeps()
+ if not isEmpty(size) then
+ size = " fa-" .. size
+ end
+ return pandoc.RawInline(
+ 'html',
+ ""
+ )
+ -- detect pdf / beamer / latex / etc
+ elseif quarto.doc.is_format("pdf") then
+ ensureLatexDeps()
+ if isEmpty(isValidSize(size)) then
+ return pandoc.RawInline('tex', "\\faIcon{" .. icon .. "}")
+ else
+ return pandoc.RawInline('tex', "{\\" .. size .. "\\faIcon{" .. icon .. "}}")
+ end
+ else
+ return pandoc.Null()
+ end
+ end
+}
diff --git a/book/_extensions/quarto-ext/shinylive/README.md b/book/_extensions/quarto-ext/shinylive/README.md
new file mode 100644
index 0000000000..55bfed2f6f
--- /dev/null
+++ b/book/_extensions/quarto-ext/shinylive/README.md
@@ -0,0 +1,126 @@
+# Shinylive package methods
+
+## Methods
+
+### R
+
+Interaction:
+
+```
+Rscript -e 'shinylive:::quarto_ext()' [methods] [args]
+```
+
+### Python
+
+Interaction:
+
+```
+shinylive [methods] [args]
+```
+
+## CLI Methods
+
+* `extension info`
+ * Package, version, asset version, and script paths information
+* `extension base-htmldeps`
+ * Quarto html dependencies for the base shinylive integration
+* `extension language-resources`
+ * Language specific resource files for the quarto html dependency named `shinylive`
+* `extension app-resources`
+ * App specific resource files for the quarto html dependency named `shinylive`
+
+### CLI Interface
+* `extension info`
+ * Prints information about the extension including:
+ * `version`: The version of the R package
+ * `assets_version`: The version of the web assets
+ * `scripts`: A list of paths scripts that are used by the extension,
+ mainly `codeblock-to-json`
+ * Example
+ ```
+ {
+ "version": "0.1.0",
+ "assets_version": "0.2.0",
+ "scripts": {
+ "codeblock-to-json": "//shinylive-0.2.0/scripts/codeblock-to-json.js"
+ }
+ }
+ ```
+* `extension base-htmldeps`
+ * Prints the language agnostic quarto html dependencies as a JSON array.
+ * The first html dependency is the `shinylive` service workers.
+ * The second html dependency is the `shinylive` base dependencies. This
+ dependency will contain the core `shinylive` asset scripts (JS files
+ automatically sourced), stylesheets (CSS files that are automatically
+ included), and resources (additional files that the JS and CSS files can
+ source).
+ * Example
+ ```
+ [
+ {
+ "name": "shinylive-serviceworker",
+ "version": "0.2.0",
+ "meta": { "shinylive:serviceworker_dir": "." },
+ "serviceworkers": [
+ {
+ "source": "//shinylive-0.2.0/shinylive-sw.js",
+ "destination": "/shinylive-sw.js"
+ }
+ ]
+ },
+ {
+ "name": "shinylive",
+ "version": "0.2.0",
+ "scripts": [{
+ "name": "shinylive/load-shinylive-sw.js",
+ "path": "//shinylive-0.2.0/shinylive/load-shinylive-sw.js",
+ "attribs": { "type": "module" }
+ }],
+ "stylesheets": [{
+ "name": "shinylive/shinylive.css",
+ "path": "//shinylive-0.2.0/shinylive/shinylive.css"
+ }],
+ "resources": [
+ {
+ "name": "shinylive/shinylive.js",
+ "path": "//shinylive-0.2.0/shinylive/shinylive.js"
+ },
+ ... # [ truncated ]
+ ]
+ }
+ ]
+ ```
+* `extension language-resources`
+ * Prints the language-specific resource files as JSON that should be added to the quarto html dependency.
+ * For r-shinylive, this includes the webr resource files
+ * For py-shinylive, this includes the pyodide and pyright resource files.
+ * Example
+ ```
+ [
+ {
+ "name": "shinylive/webr/esbuild.d.ts",
+ "path": "//shinylive-0.2.0/shinylive/webr/esbuild.d.ts"
+ },
+ {
+ "name": "shinylive/webr/libRblas.so",
+ "path": "//shinylive-0.2.0/shinylive/webr/libRblas.so"
+ },
+ ... # [ truncated ]
+ ]
+* `extension app-resources`
+ * Prints app-specific resource files as JSON that should be added to the `"shinylive"` quarto html dependency.
+ * Currently, r-shinylive does not return any resource files.
+ * Example
+ ```
+ [
+ {
+ "name": "shinylive/pyodide/anyio-3.7.0-py3-none-any.whl",
+ "path": "//shinylive-0.2.0/shinylive/pyodide/anyio-3.7.0-py3-none-any.whl"
+ },
+ {
+ "name": "shinylive/pyodide/appdirs-1.4.4-py2.py3-none-any.whl",
+ "path": "//shinylive-0.2.0/shinylive/pyodide/appdirs-1.4.4-py2.py3-none-any.whl"
+ },
+ ... # [ truncated ]
+ ]
+ ```
diff --git a/book/_extensions/quarto-ext/shinylive/_extension.yml b/book/_extensions/quarto-ext/shinylive/_extension.yml
new file mode 100644
index 0000000000..01b4d68b1d
--- /dev/null
+++ b/book/_extensions/quarto-ext/shinylive/_extension.yml
@@ -0,0 +1,8 @@
+name: shinylive
+title: Embedded Shinylive applications
+author: Winston Chang
+version: 0.1.0
+quarto-required: ">=1.2.198"
+contributes:
+ filters:
+ - shinylive.lua
diff --git a/book/_extensions/quarto-ext/shinylive/resources/css/shinylive-quarto.css b/book/_extensions/quarto-ext/shinylive/resources/css/shinylive-quarto.css
new file mode 100644
index 0000000000..3b7cc3aaa2
--- /dev/null
+++ b/book/_extensions/quarto-ext/shinylive/resources/css/shinylive-quarto.css
@@ -0,0 +1,34 @@
+div.output-content,
+div.shinylive-wrapper {
+ background-color: rgba(250, 250, 250, 0.65);
+ border: 1px solid rgba(233, 236, 239, 0.65);
+ border-radius: 0.5rem;
+ box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.04), 0px 3px 7px rgba(0, 0, 0, 0.04),
+ 0px 12px 30px rgba(0, 0, 0, 0.07);
+ margin-top: 32px;
+ margin-bottom: 32px;
+}
+
+div.shinylive-wrapper {
+ margin: 1em 0;
+ border-radius: 8px;
+}
+
+.shinylive-container {
+ background-color: #eeeff2;
+ min-height: auto;
+}
+
+.shinylive-container > div {
+ box-shadow: none;
+}
+
+.editor-container .cm-editor .cm-scroller {
+ font-size: 13px;
+ line-height: 1.5;
+}
+
+iframe.app-frame {
+ /* Override the default margin from Bootstrap */
+ margin-bottom: 0;
+}
diff --git a/book/_extensions/quarto-ext/shinylive/shinylive.lua b/book/_extensions/quarto-ext/shinylive/shinylive.lua
new file mode 100644
index 0000000000..e2828db617
--- /dev/null
+++ b/book/_extensions/quarto-ext/shinylive/shinylive.lua
@@ -0,0 +1,454 @@
+-- Notes:
+-- * 2023/10/04 - Barret:
+-- Always use `callShinyLive()` to call a shinylive extension.
+-- `callPythonShinyLive()` and `callRShinyLive()` should not be used directly.
+-- Instead, always use `callShinyLive()`.
+-- * 2023/10/04 - Barret:
+-- I could not get `error(msg)` to quit the current function execution and
+-- bubble up the stack and stop. Instead, I am using `assert(false, msg)` to
+-- achieve the desired behavior. Multi-line error messages should start with a
+-- `\n` to keep the message in the same readable area.
+
+
+-- `table` to organize flags to have code only run once.
+local hasDoneSetup = { base = false, r = false, python = false, python_version = false }
+-- `table` to store `{ version, assets_version }` for each language's extension.
+-- If both `r` and `python` are used in the same document, then the
+-- `assets_version` for each language must be the same.
+local versions = { r = nil, python = nil }
+-- Global variable for the codeblock-to-json.js script file location
+local codeblockScript = nil
+-- Global hash table to store app specific dependencies to avoid calling
+-- `quarto.doc.attach_to_dependency()` multiple times for the same dependency.
+local appSpecificDeps = {}
+
+-- Display error message and throw error w/ short message
+-- @param msg: string Error message to be displayed
+-- @param short_msg: string Error message to be thrown
+function throw_quarto_error(err_msg, ...)
+ n = select("#", ...)
+ if n > 0 then
+ -- Display any meta information about the error
+ -- Add blank lines after msg for line separation for better readability
+ quarto.log.error(...)
+ else
+ quarto.log.error(err_msg .. "\n\n")
+ end
+ -- Add blank lines after short_msg for line separation for better readability
+ -- Use assert(false, msg) to quit the current function execution and
+ -- bubble up the stack and stop. Barret: I could not get this to work with `error(msg)`.
+ assert(false, err_msg .. "\n")
+end
+
+-- Python specific method to call py-shinylive
+-- @param args: list of string arguments to pass to py-shinylive
+-- @param input: string to pipe into to py-shinylive
+function callPythonShinylive(args, input)
+ -- Try calling `pandoc.pipe('shinylive', ...)` and if it fails, print a message
+ -- about installing shinylive python package.
+ local res
+ local status, err = pcall(
+ function()
+ res = pandoc.pipe("shinylive", args, input)
+ end
+ )
+
+ if not status then
+ throw_quarto_error(
+ "Error running 'shinylive' command. Perhaps you need to install / update the 'shinylive' Python package?",
+ "Error running 'shinylive' command. Perhaps you need to install / update the 'shinylive' Python package?\n",
+ "Error:\n",
+ err
+ )
+ end
+
+ return res
+end
+
+-- R specific method to call {r-shinylive}
+-- @param args: list of string arguments to pass to r-shinylive
+-- @param input: string to pipe into to r-shinylive
+function callRShinylive(args, input)
+ args = { "-e",
+ "shinylive:::quarto_ext()",
+ table.unpack(args) }
+
+ -- Try calling `pandoc.pipe('Rscript', ...)` and if it fails, print a message
+ -- about installing shinylive R package.
+ local res
+ local status, err = pcall(
+ function()
+ res = pandoc.pipe("Rscript", args, input)
+ end
+ )
+
+ if not status then
+ throw_quarto_error(
+ "Error running 'Rscript' command. Perhaps you need to install / update the 'shinylive' R package?",
+ "Error running 'Rscript' command. Perhaps you need to install / update the 'shinylive' R package?\n",
+ "Error:\n",
+ err
+ )
+ end
+
+ return res
+end
+
+-- Returns decoded object
+-- @param language: "python" or "r"
+-- @param args, input: see `callPythonShinylive` and `callRShinylive`
+function callShinylive(language, args, input, parseJson)
+ if input == nil then
+ input = ""
+ end
+ if parseJson == nil then
+ parseJson = true
+ end
+
+ local res
+ -- print("Calling " .. language .. " shinylive with args: ", args)
+ if language == "python" then
+ res = callPythonShinylive(args, input)
+ elseif language == "r" then
+ res = callRShinylive(args, input)
+ else
+ throw_quarto_error("internal - Unknown language: " .. language)
+ end
+
+ if not parseJson then
+ return res
+ end
+
+ -- Remove any unwanted output before the first curly brace or square bracket.
+ -- print("res: " .. string.sub(res, 1, math.min(string.len(res), 100)) .. "...")
+ local curly_start = string.find(res, "{", 0, true)
+ local brace_start = string.find(res, "[", 0, true)
+ local min_start
+ if curly_start == nil then
+ min_start = brace_start
+ elseif brace_start == nil then
+ min_start = curly_start
+ else
+ min_start = math.min(curly_start, brace_start)
+ end
+ if min_start == nil then
+ local res_str = res
+ if string.len(res) > 100 then
+ res_str = string.sub(res, 1, 100) .. "... [truncated]"
+ end
+ throw_quarto_error(
+ "Could not find start curly brace or start brace in " ..
+ language .. " shinylive response. Is JSON being returned from the " .. language .. " `shinylive` package?",
+ "Could not find start curly brace or start brace in " .. language .. " shinylive response.\n",
+ "JSON string being parsed:\n",
+ res_str
+ )
+ end
+ if min_start > 1 then
+ res = string.sub(res, min_start)
+ end
+
+
+ -- Decode JSON object
+ local result
+ local status, err = pcall(
+ function()
+ result = quarto.json.decode(res)
+ end
+ )
+ if not status then
+ throw_quarto_error(
+ "Error decoding JSON response from `shinylive` " .. language .. " package.",
+ "Error decoding JSON response from `shinylive` " .. language .. " package.\n",
+ "JSON string being parsed:\n",
+ res,
+ "Error:\n",
+ err
+ )
+ end
+ return result
+end
+
+function parseVersion(versionTxt)
+ local versionParts = {}
+ for part in string.gmatch(versionTxt, "%d+") do
+ table.insert(versionParts, tonumber(part))
+ end
+ local ret = {
+ major = nil,
+ minor = nil,
+ patch = nil,
+ extra = nil,
+ length = #versionParts,
+ str = versionTxt
+ }
+
+ if ret.length >= 1 then
+ ret.major = versionParts[1]
+ if ret.length >= 2 then
+ ret.minor = versionParts[2]
+ if ret.length >= 3 then
+ ret.patch = versionParts[3]
+ if ret.length >= 4 then
+ ret.extra = versionParts[4]
+ end
+ end
+ end
+ end
+
+ return ret
+end
+
+-- If verA > verB, return 1
+-- If verA == verB, return 0
+-- If verA < verB, return -1
+function compareVersions(verA, verB)
+ if verA.major == nil or verB.major == nil then
+ throw_quarto_error("Trying to compare an invalid version: " .. verA.str .. " or " .. verB.str)
+ end
+
+ for index, key in ipairs({ "major", "minor", "patch", "extra" }) do
+ local partDiff = compareVersionPart(verA[key], verB[key])
+ if partDiff ~= 0 then
+ return partDiff
+ end
+ end
+
+ -- Equal!
+ return 0
+end
+
+function compareVersionPart(aPart, bPart)
+ if aPart == nil and bPart == nil then
+ return 0
+ end
+ if aPart == nil then
+ return -1
+ end
+ if bPart == nil then
+ return 1
+ end
+ if aPart > bPart then
+ return 1
+ elseif aPart < bPart then
+ return -1
+ end
+
+ -- Equal!
+ return 0
+end
+
+function ensurePyshinyliveVersion(language)
+ -- Quit early if not python
+ if language ~= "python" then
+ return
+ end
+ -- Quit early if already completed check
+ if hasDoneSetup.python_version then
+ return
+ end
+ hasDoneSetup.python_version = true
+
+ -- Verify that min python shinylive version is met
+ pyShinyliveVersion = callShinylive(language, { "--version" }, "", false)
+ -- Remove trailing whitespace
+ pyShinyliveVersion = pyShinyliveVersion:gsub("%s+$", "")
+ -- Parse version into table
+ parsedVersion = parseVersion(pyShinyliveVersion)
+
+ -- Verify that the version is at least 0.1.0
+ if
+ (parsedVersion.length < 3) or
+ -- Major and minor values are 0. Ex: 0.0.18
+ (parsedVersion.major == 0 and parsedVersion.minor == 0)
+ then
+ assert(false,
+ "\nThe shinylive Python package must be at least version v0.1.0 to be used in a Quarto document." ..
+ "\n\nInstalled Python Shinylive package version: " .. pyShinyliveVersion ..
+ "\n\nPlease upgrade the Python Shinylive package by running:" ..
+ "\n\tpip install --upgrade shinylive" ..
+ "\n\n(If you are using a virtual environment, please activate it before running the command above.)"
+ )
+ end
+end
+
+-- Do one-time setup for language agnostic html dependencies.
+-- This should only be called once per document
+-- @param language: "python" or "r"
+function ensureBaseSetup(language)
+ -- Quit early if already done
+ if hasDoneSetup.base then
+ return
+ end
+ hasDoneSetup.base = true
+
+ -- Find the path to codeblock-to-json.ts and save it for later use.
+ local infoObj = callShinylive(language, { "extension", "info" })
+ -- Store the path to codeblock-to-json.ts for later use
+ codeblockScript = infoObj.scripts['codeblock-to-json']
+ -- Store the version info for later use
+ versions[language] = { version = infoObj.version, assets_version = infoObj.assets_version }
+
+ -- Add language-agnostic dependencies
+ local baseDeps = getShinyliveBaseDeps(language)
+ for idx, dep in ipairs(baseDeps) do
+ quarto.doc.add_html_dependency(dep)
+ end
+
+ -- Add ext css dependency
+ quarto.doc.add_html_dependency(
+ {
+ name = "shinylive-quarto-css",
+ stylesheets = { "resources/css/shinylive-quarto.css" }
+ }
+ )
+end
+
+-- Do one-time setup for language specific html dependencies.
+-- This should only be called once per document
+-- @param language: "python" or "r"
+function ensureLanguageSetup(language)
+ -- Min version check must be done first
+ ensurePyshinyliveVersion(language)
+
+ -- Make sure the base setup is done before the langage setup
+ ensureBaseSetup(language)
+
+ if hasDoneSetup[language] then
+ return
+ end
+ hasDoneSetup[language] = true
+
+ -- Only get the asset version value if it hasn't been retrieved yet.
+ if versions[language] == nil then
+ local infoObj = callShinylive(language, { "extension", "info" })
+ versions[language] = { version = infoObj.version, assets_version = infoObj.assets_version }
+ end
+ -- Verify that the r-shinylive and py-shinylive supported assets versions match
+ if
+ (versions.r and versions.python) and
+ ---@diagnostic disable-next-line: undefined-field
+ versions.r.assets_version ~= versions.python.assets_version
+ then
+ local parsedRAssetsVersion = parseVersion(versions.r.assets_version)
+ local parsedPythonAssetsVersion = parseVersion(versions.python.assets_version)
+
+ local verDiff = compareVersions(parsedRAssetsVersion, parsedPythonAssetsVersion)
+ local verDiffStr = ""
+ if verDiff == 1 then
+ -- R shinylive supports higher version of assets. Upgrade python shinylive
+ verDiffStr =
+ "The currently installed python shinylive package supports a lower assets version, " ..
+ "therefore we recommend updating your python shinylive package to the latest version."
+ elseif verDiff == -1 then
+ -- Python shinylive supports higher version of assets. Upgrade R shinylive
+ verDiffStr =
+ "The currently installed R shinylive package supports a lower assets version, " ..
+ "therefore we recommend updating your R shinylive package to the latest version."
+ end
+
+ throw_quarto_error(
+ "The shinylive R and Python packages must support the same Shinylive Assets version to be used in the same Quarto document.",
+ "The shinylive R and Python packages must support the same Shinylive Assets version to be used in the same Quarto document.\n",
+ "\n",
+ "Python shinylive package version: ",
+ ---@diagnostic disable-next-line: undefined-field
+ versions.python.version .. " ; Supported assets version: " .. versions.python.assets_version .. "\n",
+ "R shinylive package version: " ..
+ ---@diagnostic disable-next-line: undefined-field
+ versions.r.version .. " ; Supported assets version: " .. versions.r.assets_version .. "\n",
+ "\n",
+ verDiffStr .. "\n",
+ "\n",
+ "To update your R Shinylive package, run:\n",
+ "\tR -e \"install.packages('shinylive')\"\n",
+ "\n",
+ "To update your Python Shinylive package, run:\n",
+ "\tpip install --upgrade shinylive\n",
+ "(If you are using a virtual environment, please activate it before running the command above.)\n",
+ "\n"
+ )
+ end
+
+ -- Add language-specific dependencies
+ local langResources = callShinylive(language, { "extension", "language-resources" })
+ for idx, resourceDep in ipairs(langResources) do
+ -- No need to check for uniqueness.
+ -- Each resource is only be added once and should already be unique.
+ quarto.doc.attach_to_dependency("shinylive", resourceDep)
+ end
+end
+
+function getShinyliveBaseDeps(language)
+ -- Relative path from the current page to the root of the site. This is needed
+ -- to find out where shinylive-sw.js is, relative to the current page.
+ if quarto.project.offset == nil then
+ throw_quarto_error("The `shinylive` extension must be used in a Quarto project directory (with a _quarto.yml file).")
+ end
+ local deps = callShinylive(
+ language,
+ { "extension", "base-htmldeps", "--sw-dir", quarto.project.offset },
+ ""
+ )
+ return deps
+end
+
+return {
+ {
+ CodeBlock = function(el)
+ if not el.attr then
+ -- Not a shinylive codeblock, return
+ return
+ end
+
+ local language
+ if el.attr.classes:includes("{shinylive-r}") then
+ language = "r"
+ elseif el.attr.classes:includes("{shinylive-python}") then
+ language = "python"
+ else
+ -- Not a shinylive codeblock, return
+ return
+ end
+ -- Setup language and language-agnostic dependencies
+ ensureLanguageSetup(language)
+
+ -- Convert code block to JSON string in the same format as app.json.
+ local parsedCodeblockJson = pandoc.pipe(
+ "quarto",
+ { "run", codeblockScript, language },
+ el.text
+ )
+
+ -- This contains "files" and "quartoArgs" keys.
+ local parsedCodeblock = quarto.json.decode(parsedCodeblockJson)
+
+ -- Find Python package dependencies for the current app.
+ local appDeps = callShinylive(
+ language,
+ { "extension", "app-resources" },
+ -- Send as piped input to the shinylive command
+ quarto.json.encode(parsedCodeblock["files"])
+ )
+
+ -- Add app specific dependencies
+ for idx, dep in ipairs(appDeps) do
+ if not appSpecificDeps[dep.name] then
+ appSpecificDeps[dep.name] = true
+ quarto.doc.attach_to_dependency("shinylive", dep)
+ end
+ end
+
+ if el.attr.classes:includes("{shinylive-python}") then
+ el.attributes.engine = "python"
+ el.attr.classes = pandoc.List()
+ el.attr.classes:insert("shinylive-python")
+ elseif el.attr.classes:includes("{shinylive-r}") then
+ el.attributes.engine = "r"
+ el.attr.classes = pandoc.List()
+ el.attr.classes:insert("shinylive-r")
+ end
+ return el
+ end
+ }
+}
diff --git a/book/_quarto-development.yml b/book/_quarto-development.yml
index 8b73c471a1..6de23f8708 100644
--- a/book/_quarto-development.yml
+++ b/book/_quarto-development.yml
@@ -1,3 +1,4 @@
+---
website:
title: TLG Catalog - Dev
navbar:
@@ -12,3 +13,7 @@ website:
- icon: github
href: https://github.com/insightsengineering/tlg-catalog
aria-label: Repository
+
+webr:
+ repos:
+ - https://pharmaverse.r-universe.dev/
\ No newline at end of file
diff --git a/book/_quarto-stable.yml b/book/_quarto-stable.yml
index 84d81dbe0b..9071b4db0e 100644
--- a/book/_quarto-stable.yml
+++ b/book/_quarto-stable.yml
@@ -1,3 +1,4 @@
+---
website:
title: TLG Catalog - Stable
navbar:
@@ -12,3 +13,7 @@ website:
- icon: github
href: https://github.com/insightsengineering/tlg-catalog
aria-label: Repository
+
+webr:
+ repos:
+ - https://insightsengineering.r-universe.dev/
\ No newline at end of file
diff --git a/book/_quarto.yml b/book/_quarto.yml
index 379910034c..1bb7bd4fee 100644
--- a/book/_quarto.yml
+++ b/book/_quarto.yml
@@ -17,7 +17,7 @@ format:
dark:
- darkly
anchor-sections: true
- smooth-scroll: true
+ #smooth-scroll: true # https://github.com/quarto-ext/shinylive/issues/46
code-link: true
code-fold: true
code-overflow: scroll
@@ -40,8 +40,17 @@ execute:
code-line-numbers: true
echo: true
+engine: knitr
+webr:
+ channel-type: "post-message"
+ packages: ["tern", "scda", "scda.2022", "dplyr"]
+ show-startup-message: false
+ autoload-packages: false
+
filters:
- insightsengineering/pattern-strip
+ - shinylive
+ - webr
pattern-strip-patterns:
- "#%s?nolint.*"
- "#%s?styler:.*"
diff --git a/book/test-utils/envir_hook.qmd b/book/_utils/envir_hook.qmd
similarity index 97%
rename from book/test-utils/envir_hook.qmd
rename to book/_utils/envir_hook.qmd
index 913b863414..bd162f3776 100644
--- a/book/test-utils/envir_hook.qmd
+++ b/book/_utils/envir_hook.qmd
@@ -51,7 +51,7 @@ knitr::opts_template$set(
cache = FALSE,
message = FALSE,
R.options = list(
- teal.log_level = "FATAL"
+ teal.log_level = "OFF"
)
)
)
diff --git a/book/test-utils/save_results.qmd b/book/_utils/save_results.qmd
similarity index 85%
rename from book/test-utils/save_results.qmd
rename to book/_utils/save_results.qmd
index 1022412eea..3d28337a8d 100644
--- a/book/test-utils/save_results.qmd
+++ b/book/_utils/save_results.qmd
@@ -1,4 +1,4 @@
-```{r save testenv, include = TRUE, opts.label = "include_if_testing"}
+```{r save testenv, include = FALSE, opts.label = "include_if_testing"}
#| renv.ignore: TRUE
if (exists("tenv")) {
filename <- paste0(gsub("\\.rmarkdown$", "", knitr::current_input(dir = TRUE)), ".rds")
diff --git a/book/_utils/shinylive.qmd b/book/_utils/shinylive.qmd
new file mode 100644
index 0000000000..cf05501d58
--- /dev/null
+++ b/book/_utils/shinylive.qmd
@@ -0,0 +1,49 @@
+
+
+## {{< fa regular terminal sm fw >}} Try this using `shinylive`
+
+::: {.callout-warning appearance="simple" collapse="true"}
+## Experimental use!
+
+[`shinylive`](https://shiny.posit.co/py/docs/shinylive.html) allow you to modify to run `shiny` application entirely in the web browser. Modify the code below and click re-run the app to see the results.
+The performance is slighly worse and some of the features (e.g. downloading) might not work at all.
+:::
+
+
+
+```{r shinylive-constructor, echo = FALSE, results = "asis", opts.label = "skip_if_testing"}
+repo_url <- ifelse(identical(Sys.getenv("QUARTO_PROFILE"), "stable"), "https://insightsengineering.r-universe.dev", "https://pharmaverse.r-universe.dev")
+text <- unlist(c(
+ "```{shinylive-r}",
+ "#| standalone: true",
+ "#| viewerHeight: 800",
+ "#| components: [viewer, editor]",
+ "#| layout: vertical",
+ "",
+ "# -- WEBR HELPERS --",
+ sprintf("options(webr_pkg_repos = c(\"r-universe\" = \"%s\", getOption(\"webr_pkg_repos\")))", repo_url),
+ "if (packageVersion(\"webr\") < \"0.3.0\") {",
+ " .e <- as.environment(\"webr_shims\")",
+ " .e[[\"library\"]] <- function(pkg, ...) {",
+ " package <- as.character(substitute(pkg))",
+ " if (length(find.package(package, quiet = TRUE)) == 0) {",
+ " webr::install(package)",
+ " }",
+ " base::library(package, character.only = TRUE, ...)",
+ " }",
+ "}",
+ "",
+ "# -- APP CODE --",
+ knitr::knit_code$get(c("teal")),
+ "```"
+))
+cat(text, sep = "\n")
+```
diff --git a/book/_utils/webr.qmd b/book/_utils/webr.qmd
new file mode 100644
index 0000000000..29d8635efc
--- /dev/null
+++ b/book/_utils/webr.qmd
@@ -0,0 +1,35 @@
+
+
+## {{< fa regular terminal sm fw >}} Try this using `WebR`
+
+::: {.callout-warning appearance="simple" collapse="true"}
+## Experimental use!
+
+[`WebR`](https://docs.r-wasm.org/webr/latest/) is a tool allowing you to run R code in the web browser. Modify the code below and click run to see the results. Altenatively, copy the code and click [here](https://webr.r-wasm.org/latest/) to open `WebR` in a new tab.
+:::
+
+```{r, echo = FALSE, results = "asis", opts.label = "skip_if_testing"}
+if (!exists("webr_code_labels")) {
+ webr_code_labels <- character(0L)
+}
+if (!all(webr_code_labels %in% knitr::all_labels())) {
+ stop(sprintf(
+ "Not all of provided labels exist in the current document!\nNot found labels are: %s.",
+ paste0(setdiff(webr_code_labels, knitr::all_labels()), collapse = ", ")
+ ))
+}
+
+text <- unlist(c(
+ "```{webr-r}",
+ "#| editor-max-height: 500",
+ "#| autorun: true",
+ lapply(webr_code_labels, knitr::knit_code$get),
+ "```"
+))
+cat(text, sep = "\n")
+```
diff --git a/book/appendix/reproducibility.qmd b/book/appendix/reproducibility.qmd
index 54d4b5b664..ae3ff89c15 100644
--- a/book/appendix/reproducibility.qmd
+++ b/book/appendix/reproducibility.qmd
@@ -4,7 +4,7 @@ title: Reproducibility
------------------------------------------------------------------------
-{{< include ../test-utils/envir_hook.qmd >}}
+{{< include ../_utils/envir_hook.qmd >}}
## Session Info
diff --git a/book/assets/css/style.css b/book/assets/css/style.css
index 40cf475b23..c053bc2537 100644
--- a/book/assets/css/style.css
+++ b/book/assets/css/style.css
@@ -17,4 +17,9 @@
/* -- Giscus content --*/
.giscus {
margin-left: 75px;
+}
+
+/* -- shinylive --*/
+.shinylive-editor {
+ max-height: 500px !important;
}
\ No newline at end of file
diff --git a/book/graphs/efficacy/fstg01.qmd b/book/graphs/efficacy/fstg01.qmd
index 09805ff9f4..02ef1d0e99 100644
--- a/book/graphs/efficacy/fstg01.qmd
+++ b/book/graphs/efficacy/fstg01.qmd
@@ -5,15 +5,16 @@ subtitle: Subgroup Analysis of Best Overall Response
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(tern)
library(nestcolor)
@@ -44,6 +45,9 @@ var_labels(anl_rsp_arms_ab) <- c(anl_labels, is_rsp = "Is Responder")
## Standard Plot
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot1, test = list(plot_v1 = "plot"), fig.width = 20, fig.height = 5, opts.label = ifelse(packageVersion("survival") < "3.5-8" || packageVersion("tern") < "0.9.3.9018", "skip_test_strict", "")}
@@ -65,8 +69,15 @@ plot <- g_forest(tbl = result)
plot
```
+`r webr_code_labels <- c("setup", "plot1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot Specifying Class Variables and
Options for the Treatment Variable
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot2, test = list(plot_v2 = "plot"), fig.width = 20, fig.height = 5, opts.label = ifelse(packageVersion("survival") < "3.5-8" || packageVersion("tern") < "0.9.3.9018", "skip_test_strict", "")}
@@ -106,8 +117,15 @@ plot <- g_forest(tbl = result)
plot
```
+`r webr_code_labels <- c("setup", "plot2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot Selecting Columns and
Changing the Alpha Level
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot3, test = list(plot_v3 = "plot"), fig.width = 10, fig.height = 4, opts.label = ifelse(packageVersion("survival") < "3.5-8" || packageVersion("tern") < "0.9.3.9018", "skip_test_strict", "")}
@@ -129,8 +147,15 @@ plot <- g_forest(tbl = result)
plot
```
+`r webr_code_labels <- c("setup", "plot3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot with Fixed
Symbol Size
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot4, test = list(plot_v4 = "plot"), fig.width = 20, fig.height = 5, opts.label = ifelse(packageVersion("survival") < "3.5-8" || packageVersion("tern") < "0.9.3.9018", "skip_test_strict", "")}
@@ -155,8 +180,15 @@ plot <- g_forest(
plot
```
+`r webr_code_labels <- c("setup", "plot4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot of CR Only, Setting
Values Indicating Response
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot5, test = list(plot_v5 = "plot"), fig.width = 20, fig.height = 5, opts.label = ifelse(packageVersion("survival") < "3.5-8" || packageVersion("tern") < "0.9.3.9018", "skip_test_strict", "")}
@@ -195,10 +227,17 @@ width <- 20
height <- 5
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "plot5")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -206,6 +245,8 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
+
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADRS <- synthetic_cdisc_dataset("latest", "adrs")
})
@@ -261,5 +302,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/graphs/efficacy/fstg02.qmd b/book/graphs/efficacy/fstg02.qmd
index c76c475e71..f7042212f2 100644
--- a/book/graphs/efficacy/fstg02.qmd
+++ b/book/graphs/efficacy/fstg02.qmd
@@ -5,9 +5,9 @@ subtitle: Subgroup Analysis of Survival Duration
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -18,6 +18,7 @@ library(dplyr)
library(forcats)
library(nestcolor)
library(scda)
+library(scda.2022)
preprocess_adtte <- function(adtte) {
# Save variable labels before data processing steps.
@@ -56,6 +57,9 @@ anl <- synthetic_cdisc_dataset("latest", "adtte") %>%
## Standard Plot
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot1, test = list(plot_v1 = "plot"), fig.width = 15, fig.height = 4, opts.label = ifelse(packageVersion("rtables") < "0.6.6.9011", "skip_test_strict", "")}
anl1 <- anl
@@ -78,8 +82,15 @@ plot <- g_forest(tbl = result)
plot
```
+`r webr_code_labels <- c("setup", "plot1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot Specifying Class Variables and
Options for the Treatment Variable
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot2, test = list(plot_v2 = "plot"), fig.width = 15, fig.height = 4, opts.label = ifelse(packageVersion("rtables") < "0.6.6.9011", "skip_test_strict", "")}
anl2 <- anl %>%
@@ -113,8 +124,15 @@ plot <- g_forest(tbl = result)
plot
```
+`r webr_code_labels <- c("setup", "plot2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot Selecting Columns and
Changing the Alpha Level
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot3, test = list(plot_v3 = "plot"), fig.width = 8, fig.height = 4, opts.label = ifelse(packageVersion("rtables") < "0.6.6.9011", "skip_test_strict", "")}
anl3 <- anl
@@ -137,8 +155,15 @@ plot <- g_forest(tbl = result)
plot
```
+`r webr_code_labels <- c("setup", "plot3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot with Fixed
Symbol Size
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot4, test = list(plot_v4 = "plot"), fig.width = 15, fig.height = 4, opts.label = ifelse(packageVersion("rtables") < "0.6.6.9011", "skip_test_strict", "")}
anl4 <- anl
@@ -170,10 +195,17 @@ height <- 4
plot_v3.width <- 8 # nolint: object_name.
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "plot4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -181,8 +213,10 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
library(dplyr)
library(forcats)
+
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADSL <- ADSL %>%
filter(ARM %in% c("B: Placebo", "A: Drug X")) %>%
@@ -244,5 +278,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/graphs/efficacy/kmg01.qmd b/book/graphs/efficacy/kmg01.qmd
index 39c4299c0a..b978e8ab1f 100644
--- a/book/graphs/efficacy/kmg01.qmd
+++ b/book/graphs/efficacy/kmg01.qmd
@@ -5,9 +5,9 @@ subtitle: Kaplan-Meier Plot
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Kaplan-Meier Plot
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
library(nestcolor)
@@ -27,7 +28,9 @@ variables <- list(tte = "AVAL", is_event = "is_event", arm = "ARMCD")
## Standard Plot
-::: {.content-visible when-profile="development"}
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot1, fig.width = 9, fig.height = 6, test = list(plot_v1 = "plot"), opts.label = "skip_test_strict"}
plot <- g_km(
@@ -39,25 +42,16 @@ plot <- g_km(
)
plot
```
-:::
-::: {.content-visible when-profile="stable"}
-
-```{r plot1-stbl, fig.height = 8, test = list(plot_v1 = "plot"), opts.label = "skip_test_strict"}
-plot <- g_km(
- df = anl,
- variables = variables,
- xlab = "Time (Days)",
- ylim = c(0, 1),
- annot_coxph = TRUE
-)
-plot
-```
+`r webr_code_labels <- c("setup", "plot1")`
+{{< include ../../_utils/webr.qmd >}}
:::
## Plot of Failures
-::: {.content-visible when-profile="development"}
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot2, fig.width = 9, fig.height = 6, test = list(plot_v2 = "plot"), opts.label = "skip_test_strict"}
plot <- g_km(
@@ -71,30 +65,16 @@ plot <- g_km(
)
plot
```
-:::
-::: {.content-visible when-profile="stable"}
-
-```{r plot2-stbl, fig.height = 8, test = list(plot_v2 = "plot"), opts.label = "skip_test_strict"}
-plot <- g_km(
- df = anl,
- variables = variables,
- xlab = "Time (Days)",
- yval = "Failure",
- ylim = c(0, 1),
- annot_surv_med = TRUE,
- annot_coxph = TRUE,
- font_size = 7.5,
- position_coxph = c(0.3, 0),
- position_surv_med = c(0.9, 0.3)
-)
-plot
-```
+`r webr_code_labels <- c("setup", "plot2")`
+{{< include ../../_utils/webr.qmd >}}
:::
## Plot Without
Comparative Statistics
-::: {.content-visible when-profile="development"}
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot3, fig.width = 9, fig.height = 6, test = list(plot_v3 = "plot"), opts.label = "skip_test_strict"}
plot <- g_km(
@@ -105,25 +85,16 @@ plot <- g_km(
)
plot
```
-:::
-::: {.content-visible when-profile="stable"}
-
-```{r plot3-stbl, fig.height = 8, test = list(plot_v3 = "plot"), opts.label = "skip_test_strict"}
-plot <- g_km(
- df = anl,
- variables = variables,
- xlab = "Time (Days)",
- ylim = c(0, 1),
- annot_surv_med = TRUE
-)
-plot
-```
+`r webr_code_labels <- c("setup", "plot3")`
+{{< include ../../_utils/webr.qmd >}}
:::
## Plot Without
Censoring Marks
-::: {.content-visible when-profile="development"}
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot4, fig.width = 9, fig.height = 6, test = list(plot_v4 = "plot"), opts.label = "skip_test_strict"}
plot <- g_km(
@@ -136,26 +107,16 @@ plot <- g_km(
)
plot
```
-:::
-::: {.content-visible when-profile="stable"}
-
-```{r plot4-stbl, fig.height = 8, test = list(plot_v4 = "plot"), opts.label = "skip_test_strict"}
-plot <- g_km(
- df = anl,
- variables = variables,
- censor_show = FALSE,
- xlab = "Time (Days)",
- ylim = c(0, 1),
- annot_coxph = TRUE
-)
-plot
-```
+`r webr_code_labels <- c("setup", "plot4")`
+{{< include ../../_utils/webr.qmd >}}
:::
## Plot Modifying
Censoring Marks
-::: {.content-visible when-profile="development"}
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot5, fig.width = 9, fig.height = 6, test = list(plot_v5 = "plot"), opts.label = "skip_test_strict"}
plot <- g_km(
@@ -169,27 +130,16 @@ plot <- g_km(
)
plot
```
-:::
-::: {.content-visible when-profile="stable"}
-
-```{r plot5-stbl, fig.height = 8, test = list(plot_v5 = "plot"), opts.label = "skip_test_strict"}
-plot <- g_km(
- df = anl,
- variables = variables,
- pch = 1,
- size = 2,
- xlab = "Time (Days)",
- ylim = c(0, 1),
- annot_coxph = TRUE
-)
-plot
-```
+`r webr_code_labels <- c("setup", "plot5")`
+{{< include ../../_utils/webr.qmd >}}
:::
## Plot Modifying Options for Statistics,
Tie Handling, Stratification, etc.
-::: {.content-visible when-profile="development"}
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot6, fig.width = 9, fig.height = 6, test = list(plot_v6 = "plot"), opts.label = "skip_test_strict"}
variables$strata <- c("STRATA1", "STRATA2")
@@ -208,27 +158,9 @@ plot <- g_km(
)
plot
```
-:::
-::: {.content-visible when-profile="stable"}
-
-```{r plot6-stbl, test = list(plot_v6 = "plot"), opts.label = "skip_test_strict"}
-variables$strata <- c("STRATA1", "STRATA2")
-plot <- g_km(
- df = anl,
- variables = variables,
- control_surv = control_surv_timepoint(conf_level = 0.8),
- xlab = "Time (Days)",
- ylim = c(0, 1),
- annot_coxph = TRUE,
- control_coxph_pw = control_coxph(
- pval_method = "wald",
- ties = "breslow",
- conf_level = 0.8
- )
-)
-plot
-```
+`r webr_code_labels <- c("setup", "plot6")`
+{{< include ../../_utils/webr.qmd >}}
:::
::: {.content-visible when-profile="development"}
@@ -238,10 +170,13 @@ height <- 6
```
:::
-{{< include ../../test-utils/save_results.qmd >}}
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -249,6 +184,8 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
+
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADTTE <- synthetic_cdisc_dataset("latest", "adtte")
})
@@ -303,5 +240,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/graphs/efficacy/mmrmg01.qmd b/book/graphs/efficacy/mmrmg01.qmd
index 2fd0501670..7a5884d1f0 100644
--- a/book/graphs/efficacy/mmrmg01.qmd
+++ b/book/graphs/efficacy/mmrmg01.qmd
@@ -5,12 +5,12 @@ subtitle: Plots for Mixed-Effect Model Repeated Measures Analysis
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
Given an MMRM fitted with `s_mmrm`, `g_mmrm_lsmeans` displays for each visit the adjusted means within group and/or difference in adjusted means between groups.
`g_mmrm_diagnostic` displays marginal residual plots for evaluating model fit.
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup and
Model Fitting
```{r setup, message = FALSE}
@@ -19,6 +19,7 @@ Given an MMRM fitted with `s_mmrm`, `g_mmrm_lsmeans` displays for each visit the
library(dplyr)
library(tern.mmrm)
library(scda)
+library(scda.2022)
library(nestcolor)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -113,7 +114,7 @@ plot <- g_mmrm_diagnostic(mmrm_results, type = "q-q-residual")
plot
```
-{{< include ../../test-utils/save_results.qmd >}}
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -124,7 +125,9 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
library(dplyr)
+
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADQS <- synthetic_cdisc_dataset("latest", "adqs") %>%
filter(ABLFL != "Y" & ABLFL2 != "Y") %>%
@@ -177,4 +180,5 @@ shinyApp(app$ui, app$server)
```
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/graphs/efficacy/mmrmg02.qmd b/book/graphs/efficacy/mmrmg02.qmd
index 63c4fb47c1..d2d52917fb 100644
--- a/book/graphs/efficacy/mmrmg02.qmd
+++ b/book/graphs/efficacy/mmrmg02.qmd
@@ -5,15 +5,16 @@ subtitle: Forest Plot for Mixed-Effect Model Repeated Measures
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(tern.mmrm)
library(nestcolor)
@@ -57,7 +58,7 @@ For the following part, an MMRM model is fitted for the dataset and from this re
First an MMRM model is fitted for the whole dataset.
-```{r}
+```{r mmrm_results}
#| code-fold: show
mmrm_results <- fit_mmrm(
@@ -135,7 +136,8 @@ width <- 15
height <- 4
```
-{{< include ../../test-utils/save_results.qmd >}}
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/graphs/other/brg01.qmd b/book/graphs/other/brg01.qmd
index 9fbe478cdb..b403549599 100644
--- a/book/graphs/other/brg01.qmd
+++ b/book/graphs/other/brg01.qmd
@@ -5,9 +5,9 @@ subtitle: Bar Chart
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -17,6 +17,7 @@ library(binom)
library(dplyr)
library(ggplot2)
library(scda)
+library(scda.2022)
library(tidyr)
library(tern)
library(nestcolor)
@@ -41,6 +42,9 @@ vl_lb <- var_labels(adlb)
## Plot of Frequency
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot1, test = list(plot_v1 = "plot")}
anl <- adae %>%
filter(AESER == "Y")
@@ -56,8 +60,15 @@ plot <- ggplot(anl, aes(x = .data[["ACTARM"]])) +
plot
```
+`r webr_code_labels <- c("setup", "plot1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot of Percentage
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot2, test = list(plot_v2 = "plot")}
anl <- adae %>%
filter(AESOC == "cl A")
@@ -80,8 +91,15 @@ plot <- ggplot(anl, aes(x = .data[["ACTARM"]])) +
plot
```
+`r webr_code_labels <- c("setup", "plot2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot of Frequency with
Total Number of Subjects
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot3, test = list(plot_v3 = "plot")}
anl <- adae %>%
filter(AESOC == "cl A")
@@ -101,8 +119,15 @@ plot <- ggplot(anl, aes(x = .data[["xvarlabel"]])) +
plot
```
+`r webr_code_labels <- c("setup", "plot3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot of Frequency
with Horizontal Bars
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot4, test = list(plot_v4 = "plot")}
anl <- adae %>%
filter(AESER == "Y")
@@ -118,8 +143,15 @@ plot <- ggplot(anl, aes(x = .data[["ACTARM"]])) +
plot
```
+`r webr_code_labels <- c("setup", "plot4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot of Percentage
and Confidence Intervals
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot5, test = list(plot_v5 = "plot"), opts.label = "skip_test_strict"}
@@ -163,8 +195,15 @@ plot <- ggplot(anl) +
plot
```
+`r webr_code_labels <- c("setup", "plot5")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot of Percentage by
Treatment and Covariate
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot6, test = list(plot_v6 = "plot"), opts.label = "skip_test_strict"}
anl <- adae %>%
@@ -189,8 +228,15 @@ plot <- ggplot(anl, aes(x = .data[["ACTARM"]], fill = .data[["SEX"]])) +
plot
```
+`r webr_code_labels <- c("setup", "plot6")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot of Percentage by
Covariate and Treatment
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot7, test = list(plot_v7 = "plot"), opts.label = "skip_test_strict"}
anl <- adae %>%
@@ -214,8 +260,15 @@ plot <- ggplot(anl, aes(x = .data[["SEX"]], fill = .data[["ACTARM"]])) +
plot
```
+`r webr_code_labels <- c("setup", "plot7")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot of Percentage
with Mean and Median
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot8, test = list(plot_v8 = "plot")}
anl1 <- adlb %>%
filter(AVISIT == "BASELINE", PARAMCD == "CRP" & ANRIND == "HIGH")
@@ -277,8 +330,15 @@ plot <- cowplot::plot_grid(graph, tbl,
plot
```
+`r webr_code_labels <- c("setup", "plot8")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot of Categorical
Variable
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot9, test = list(plot_v9 = "plot"), opts.label = "skip_test_strict"}
anl <- adae
@@ -307,7 +367,11 @@ plot <- ggplot(anl, aes(x = .data[["ACTARM"]], fill = .data[["AETOXGRC"]])) +
plot
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "plot9")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -318,4 +382,5 @@ plot
```
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/graphs/other/bwg01.qmd b/book/graphs/other/bwg01.qmd
index fd3b60d6d0..610b2bbac4 100644
--- a/book/graphs/other/bwg01.qmd
+++ b/book/graphs/other/bwg01.qmd
@@ -5,9 +5,9 @@ subtitle: Box Plot
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Box Plot
# generic code for all plots
library(scda)
+library(scda.2022)
library(dplyr)
library(ggplot2)
library(nestcolor)
@@ -86,6 +87,9 @@ bp_annos <- function(bp, color, annos = 1) {
## Standard Plot
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot1, test = list(plot_v1 = "plot")}
bp_1 <- ggplot(adlb, aes(x = ARMCD, y = AVAL)) +
stat_summary(geom = "boxplot", fun.data = five_num, fill = fc, color = oc) +
@@ -103,8 +107,15 @@ plot <- bp_annos(bp_1, oc)
plot
```
+`r webr_code_labels <- c("setup", "plot1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot Changing
Whiskers
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot2, test = list(plot_v2 = "plot")}
bp_3 <- ggplot(adlb, aes(x = ARMCD, y = AVAL)) +
stat_summary(
@@ -125,8 +136,15 @@ plot <- bp_annos(bp_3, oc)
plot
```
+`r webr_code_labels <- c("setup", "plot2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot Adding
Outliers
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot3, test = list(plot_v3 = "plot")}
bp_4 <- ggplot(adlb, aes(x = ARMCD, y = AVAL)) +
stat_summary(
@@ -148,8 +166,15 @@ plot <- bp_annos(bp_4, oc)
plot
```
+`r webr_code_labels <- c("setup", "plot3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot Specifying Marker
for Outliers and
Adding Patient ID
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot4, test = list(plot_v4 = "plot")}
adlb_o <- adlb %>%
group_by(ARMCD) %>%
@@ -182,8 +207,15 @@ plot <- bp_annos(bp_5, oc)
plot
```
+`r webr_code_labels <- c("setup", "plot4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot Specifying
Marker for Mean
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot5, test = list(plot_v5 = "plot")}
bp_6 <- ggplot(adlb, aes(x = ARMCD, y = AVAL)) +
geom_boxplot(fill = fc, color = oc) +
@@ -201,8 +233,15 @@ plot <- bp_annos(bp_6, oc)
plot
```
+`r webr_code_labels <- c("setup", "plot5")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot by Treatment
and Timepoint
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot6, test = list(plot_v6 = "plot"), opts.label = "skip_test_strict"}
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -238,8 +277,15 @@ plot <- bp_annos(bp_7, oc, 2)
plot
```
+`r webr_code_labels <- c("setup", "plot6")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot by Timepoint
and Treatment
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot7, test = list(plot_v7 = "plot"), opts.label = "skip_test_strict"}
bp_8 <- ggplot(adlb_v, aes(x = ARMCD, y = AVAL)) +
@@ -269,8 +315,15 @@ plot <- bp_annos(bp_8, oc, 2)
plot
```
+`r webr_code_labels <- c("setup", "plot7")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot with
Table Section
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot8, test = list(plot_v8 = "plot")}
# Make wide dataset with summary statistics
adlb_wide <- adlb %>%
@@ -336,8 +389,15 @@ plot <- cowplot::plot_grid(bp_annos(bp_9, oc), tbl_1,
plot
```
+`r webr_code_labels <- c("setup", "plot8")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot with Number of Patients
only in Table Section
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot9, test = list(plot_v9 = "plot")}
tbl_2 <- adlb_long %>%
filter(type == "n") %>%
@@ -356,10 +416,17 @@ plot <- cowplot::plot_grid(bp_annos(bp_9, oc), tbl_2,
plot
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "plot8", "plot9")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app"), eval = packageVersion("teal.modules.general") >= "0.3.0"}
library(teal.modules.general)
@@ -367,7 +434,9 @@ library(teal.modules.general)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
library(tern)
+
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADLB <- synthetic_cdisc_dataset("latest", "adlb")
@@ -458,5 +527,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/graphs/other/cig01.qmd b/book/graphs/other/cig01.qmd
index 35ef0e96f6..0f1f34df26 100644
--- a/book/graphs/other/cig01.qmd
+++ b/book/graphs/other/cig01.qmd
@@ -5,9 +5,9 @@ subtitle: Confidence Interval Plot
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -17,6 +17,7 @@ library(tern)
library(ggplot2)
library(dplyr)
library(scda)
+library(scda.2022)
library(nestcolor)
adlb <- synthetic_cdisc_dataset("latest", "adlb") %>%
@@ -25,6 +26,9 @@ adlb <- synthetic_cdisc_dataset("latest", "adlb") %>%
## Plot of Mean and
95% CIs for Mean
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
The function `stat_mean_ci` from the `tern` package can be used with default values to draw the 95% confidence interval around the mean.
@@ -56,8 +60,15 @@ plot <- ggplot(
plot
```
+`r webr_code_labels <- c("setup", "plot1and2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot of Confidence Interval Using
a Different Stratification Variable
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot3, test = list(plot_v3 = "plot"), opts.label = "skip_test_strict"}
plot <- ggplot(
@@ -87,8 +98,15 @@ plot <- ggplot(
plot
```
+`r webr_code_labels <- c("setup", "plot3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot of Median and
95% CIs for Median
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
The function `stat_median_ci` from the `tern` package works similarly to `stat_mean_ci`.
@@ -120,8 +138,15 @@ plot <- ggplot(
plot
```
+`r webr_code_labels <- c("setup", "plot4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot of Median and 95% CIs for
Median Using Different Alpha Level
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
To modify the confidence level for the estimation of the confidence interval, the call to `stat_mean_ci` (or `stat_median_ci`) can be slightly modified.
@@ -153,8 +178,15 @@ plot <- ggplot(
plot
```
+`r webr_code_labels <- c("setup", "plot5")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table of Mean
and Median
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
The corresponding table is simply obtained using the `rtables` framework:
```{r table6, test = list(table_v6 = "table")}
@@ -165,10 +197,17 @@ table <- build_table(lyt = lyt, df = adlb)
table
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "table6")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -176,6 +215,8 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
+
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADLB <- synthetic_cdisc_dataset("latest", "adlb")
})
@@ -248,5 +289,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/graphs/other/ippg01.qmd b/book/graphs/other/ippg01.qmd
index 5f8c67b909..8881478c4d 100644
--- a/book/graphs/other/ippg01.qmd
+++ b/book/graphs/other/ippg01.qmd
@@ -5,11 +5,11 @@ subtitle: Individual Patient Plot Over Time
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
For illustration purposes, we will subset the `adlb` dataset for safety population in treatment arm A and a specific lab parameter (`ALT`).
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -17,6 +17,7 @@ For illustration purposes, we will subset the `adlb` dataset for safety populati
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
library(ggplot2)
library(nestcolor)
@@ -40,6 +41,9 @@ adlb_f <- adlb %>%
## Standard Plot
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
The user can select different `plotting_choices` depending on their preference.
To demonstrate, separate plots are produced with a maximum of 3 observations each.
@@ -60,8 +64,15 @@ plots <- g_ipp(
plots
```
+`r webr_code_labels <- c("setup", "plots1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot with Patient Baselines as Reference
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
Here, patients' individual baseline values will be shown for reference.
Note that users can provide their own custom theme to the function via the `ggtheme` argument.
@@ -85,18 +96,25 @@ plots <- g_ipp(
plots
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "plots2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
## Data reproducible code
data <- teal_data()
data <- within(data, {
- library(tern)
library(scda)
+ library(scda.2022)
library(dplyr)
# use small sample size
@@ -162,5 +180,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/graphs/other/ltg01.qmd b/book/graphs/other/ltg01.qmd
index 5896e66f58..81e191870a 100644
--- a/book/graphs/other/ltg01.qmd
+++ b/book/graphs/other/ltg01.qmd
@@ -5,19 +5,19 @@ subtitle: Lattice Plot of Laboratory Tests by Treatment Group Over Time
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
Lattice plots are natively handled by R, the examples below rely mostly on the package `ggplot2`.
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(tern)
-library(teal)
library(teal.modules.clinical)
library(ggplot2)
library(dplyr)
@@ -52,6 +52,9 @@ pch <- c(
#### Basic Plot
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot1, test = list(plot_v1 = "plot"), opts.label = "skip_test_strict"}
# General mapping and "lattice" ("facet" in ggplot2 nomenclature).
@@ -71,8 +74,15 @@ plot <- g1
plot
```
+`r webr_code_labels <- c("setup", "plot1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
#### Modifying Facets
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
The units describing rows of panes and the number of patients under each arm is specified by modifying `facet_grid()`:
@@ -87,8 +97,15 @@ plot <- g2
plot
```
+`r webr_code_labels <- c("setup", "plot1", "plot2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
#### Modifying X-Axis
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
The graphic elements are modified through usual `ggplot2` functions.
For instance, the x-axis could be improved as follows:
@@ -103,6 +120,10 @@ plot <- g3
plot
```
+`r webr_code_labels <- c("setup", "plot1", "plot2", "plot3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot of Liver Function Tests
Including Mean, Median, and 95% CIs
The functions `stat_mean_ci` and `stat_median_ci` from the `tern` package allow the addition of mean and/or median confidence intervals.
@@ -140,6 +161,9 @@ pch <- c(
#### Basic Plot
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot4, test = list(plot_v4 = "plot")}
# General mapping and "lattice" ("facet" in ggplot2 nomenclature)
g4 <- {
@@ -167,8 +191,15 @@ plot <- g4
plot
```
+`r webr_code_labels <- c("setup", "pre-processing", "plot4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
#### Adding Mean
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot51, test = list(plot_v51 = "plot"), opts.label = "skip_test_strict"}
# Add the mean along with the 95% CI at every visit.
@@ -184,8 +215,15 @@ plot <- g51 + guides(linetype = guide_legend(title = NULL))
plot
```
+`r webr_code_labels <- c("setup", "pre-processing", "plot4", "plot51")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
#### Adding Median
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot52, test = list(plot_v52 = "plot"), opts.label = "skip_test_strict"}
# Instead of a mean, the median could be more relevant.
@@ -201,8 +239,15 @@ plot <- g52 + guides(linetype = guide_legend(title = "Aggregate"))
plot
```
+`r webr_code_labels <- c("setup", "pre-processing", "plot4", "plot51", "plot52")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
#### Changing Confidence Level
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot53, test = list(plot_v53 = "plot"), opts.label = "skip_test_strict"}
# Change the confidence level of interval for the median.
@@ -219,7 +264,11 @@ plot <- g53 + guides(linetype = guide_legend(title = NULL))
plot
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "pre-processing", "plot4", "plot53")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -231,4 +280,4 @@ plot
{{< include ../../repro.qmd >}}
-:::
+::::
diff --git a/book/graphs/other/mng01.qmd b/book/graphs/other/mng01.qmd
index 522d60b9e2..23b2bef627 100644
--- a/book/graphs/other/mng01.qmd
+++ b/book/graphs/other/mng01.qmd
@@ -5,9 +5,9 @@ subtitle: Mean Plot
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: Mean Plot
library(dplyr)
library(tern)
library(scda)
+library(scda.2022)
library(nestcolor)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -52,6 +53,9 @@ advs_f <- advs %>%
## Plot of Mean
and CI
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot1, test = list(plot_v1 = "plot"), opts.label = "skip_test_strict"}
plot <- g_lineplot(
@@ -62,8 +66,15 @@ plot <- g_lineplot(
plot
```
+`r webr_code_labels <- c("setup", "plot1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot of Mean and CIs of Change
from Baseline (Changing the Input
Analysis Data Set and Analysis Variable)
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot2, test = list(plot_v2 = "plot"), opts.label = "skip_test_strict"}
plot <- g_lineplot(
@@ -76,8 +87,15 @@ plot <- g_lineplot(
plot
```
+`r webr_code_labels <- c("setup", "plot2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot of Mean (+/-SD)
(Changing the Statistics)
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot3, test = list(plot_v3 = "plot"), opts.label = "skip_test_strict"}
plot <- g_lineplot(
@@ -91,8 +109,15 @@ plot <- g_lineplot(
plot
```
+`r webr_code_labels <- c("setup", "plot3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot of Mean and CI
(Modify Alpha Level)
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot4, test = list(plot_v4 = "plot"), opts.label = "skip_test_strict"}
plot <- g_lineplot(
@@ -105,8 +130,15 @@ plot <- g_lineplot(
plot
```
+`r webr_code_labels <- c("setup", "plot4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot of Mean and CI (with Number
of Patients only in Table Section)
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot5, test = list(plot_v5 = "plot"), opts.label = "skip_test_strict"}
plot <- g_lineplot(
@@ -118,8 +150,15 @@ plot <- g_lineplot(
plot
```
+`r webr_code_labels <- c("setup", "plot5")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot of Mean and CI
(with Table Section)
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot6, fig.height = 8, test = list(plot_v6 = "plot"), opts.label = "skip_test_strict"}
plot <- g_lineplot(
@@ -131,12 +170,19 @@ plot <- g_lineplot(
plot
```
+`r webr_code_labels <- c("setup", "plot6")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot of Median and CI (Visits
Condensed in Table Section)
This option is not supported.
## Plot of Mean and
Upper Confidence Limit
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot7, test = list(plot_v7 = "plot"), opts.label = "skip_test_strict"}
plot <- g_lineplot(
@@ -148,10 +194,17 @@ plot <- g_lineplot(
plot
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "plot7")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -159,6 +212,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
library(dplyr)
library(forcats)
@@ -200,5 +254,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/graphs/pharmacokinetic/pkcg01.qmd b/book/graphs/pharmacokinetic/pkcg01.qmd
index 706783f843..15b1842d62 100644
--- a/book/graphs/pharmacokinetic/pkcg01.qmd
+++ b/book/graphs/pharmacokinetic/pkcg01.qmd
@@ -5,9 +5,9 @@ subtitle: Plot of PK Concentration Over Time by Subject
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Plot of PK Concentration Over Time by Subject
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
library(ggplot2)
library(nestcolor)
@@ -24,6 +25,9 @@ adpc <- synthetic_cdisc_dataset("latest", "adpc")
## Plot in Linear Scale
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot1, test = list(plot_v1 = "plot"), opts.label = "skip_test_strict"}
adpc_a <- adpc %>%
@@ -55,8 +59,15 @@ plot <- result[[1]] # only show the first subject
plot
```
+`r webr_code_labels <- c("setup", "plot1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot in Log Scale
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot2, test = list(plot_v2 = "plot"), opts.label = "skip_test_strict"}
adpc_a <- adpc %>%
@@ -89,7 +100,11 @@ plot <- result[[1]] + ggplot2::scale_y_log10(breaks = c(0.001, 0.01, 0.1, 1, 10)
plot
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "plot2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -101,4 +116,4 @@ plot
{{< include ../../repro.qmd >}}
-:::
+::::
diff --git a/book/graphs/pharmacokinetic/pkcg02.qmd b/book/graphs/pharmacokinetic/pkcg02.qmd
index 914456288f..e9ffa4b2f9 100644
--- a/book/graphs/pharmacokinetic/pkcg02.qmd
+++ b/book/graphs/pharmacokinetic/pkcg02.qmd
@@ -5,9 +5,9 @@ subtitle: Plot of PK Concentration Over Time by Cohort/Treatment Group/Dose
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Plot of PK Concentration Over Time by Cohort/Treatment Group/Dose
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
library(ggplot2)
library(nestcolor)
@@ -24,6 +25,9 @@ adpc <- synthetic_cdisc_dataset("latest", "adpc")
## Plot in Linear Scale
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot1, test = list(plot_v1 = "plot"), opts.label = "skip_test_strict"}
adpc_a <- adpc %>%
@@ -55,8 +59,15 @@ plot <- g_ipp(
plot
```
+`r webr_code_labels <- c("setup", "plot1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot in Log Scale
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot2, test = list(plot_v2 = "plot"), opts.label = "skip_test_strict"}
adpc_a <- adpc %>%
@@ -90,7 +101,11 @@ plot <- result + ggplot2::scale_y_log10(breaks = c(0.001, 0.01, 0.1, 1, 10), lab
plot
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "plot2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -102,4 +117,4 @@ plot
{{< include ../../repro.qmd >}}
-:::
+::::
diff --git a/book/graphs/pharmacokinetic/pkcg03.qmd b/book/graphs/pharmacokinetic/pkcg03.qmd
index d279c0a67f..8768a79beb 100644
--- a/book/graphs/pharmacokinetic/pkcg03.qmd
+++ b/book/graphs/pharmacokinetic/pkcg03.qmd
@@ -5,9 +5,9 @@ subtitle: Plot of Mean PK Concentration Over Time by Cohort
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Plot of Mean PK Concentration Over Time by Cohort
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
library(ggplot2)
library(nestcolor)
@@ -32,6 +33,9 @@ adpc <- synthetic_cdisc_dataset("latest", "adpc") %>%
## Plot in Linear Scale
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot1, test = list(plot_v1 = "plot"), opts.label = "skip_test_strict"}
use_title <- "Plot of Mean (+/- SD) Plasma Concentrations Over Time by Treatment, \nPK Evaluable Patients"
@@ -64,8 +68,15 @@ plot <- result + theme(plot.caption = element_text(hjust = 0))
plot
```
+`r webr_code_labels <- c("setup", "plot1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot in Log Scale
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot2, warning = FALSE, test = list(plot_v2 = "plot"), opts.label = "skip_test_strict"}
use_title <- "Plot of Mean (+/- SD) Log-Scale Plasma Concentrations Over Time by Treatment, \nPK Evaluable Patients"
@@ -102,7 +113,11 @@ plot <- result + theme(plot.caption = element_text(hjust = 0)) +
plot
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "plot2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -113,4 +128,5 @@ plot
```
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/graphs/pharmacokinetic/pkpg01.qmd b/book/graphs/pharmacokinetic/pkpg01.qmd
index 7ae011bf8c..3a2447ea4b 100644
--- a/book/graphs/pharmacokinetic/pkpg01.qmd
+++ b/book/graphs/pharmacokinetic/pkpg01.qmd
@@ -5,9 +5,9 @@ subtitle: Plot of Mean Cumulative Percentage (%) of Recovered Drug in Urine
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Plot of Mean Cumulative Percentage (%) of Recovered Drug in Urine
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
library(ggplot2)
library(nestcolor)
@@ -44,6 +45,9 @@ levels(adpp$ARM) <- c(
## Plot with Two Cohorts
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot1, test = list(plot_v1 = "plot"), opts.label = "skip_test_strict"}
use_title <- "Plot of Mean (+/- SD) Cummulative Percentage (%) of Recovered Drug in Urine \nby Analyte, Visit: PK Evaluable Patients" # nolint: line_length.
@@ -80,8 +84,15 @@ plot <- result + theme(plot.caption = element_text(hjust = 0)) +
plot
```
+`r webr_code_labels <- c("setup", "plot1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot with Six Cohorts
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
In this case we need to process the data further by artificially adding more random rows.
Of course this step is not necessary in the case that data already has more cohorts.
@@ -137,7 +148,11 @@ plot <- result + theme(plot.caption = element_text(hjust = 0)) +
plot
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "plot2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -148,4 +163,5 @@ plot
```
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/graphs/pharmacokinetic/pkpg02.qmd b/book/graphs/pharmacokinetic/pkpg02.qmd
index f9d0233b81..87c348bcf9 100644
--- a/book/graphs/pharmacokinetic/pkpg02.qmd
+++ b/book/graphs/pharmacokinetic/pkpg02.qmd
@@ -5,9 +5,9 @@ subtitle: Pharmacokinetic Parameter Summary of Serum PK Parameters by Treatment
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Pharmacokinetic Parameter Summary of Serum PK Parameters by Treatment
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
library(ggplot2)
library(nestcolor)
@@ -51,6 +52,9 @@ y_var <- "AUCinf"
## Summary of Pharmacokinetic
Parameters -- Plasma
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot1, test = list(plot_v1 = "plot"), opts.label = "skip_test_strict"}
# calculate Summary Statistics (mean and sd) for each group
@@ -112,8 +116,15 @@ plot <- ggplot(adpp_adex, aes(x = .data[[x_var]], y = .data[[y_var]])) +
plot
```
+`r webr_code_labels <- c("setup", "plot1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Summary of Plasma Pharmacokinetic
Parameters with Median Points
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot2, test = list(plot_v2 = "plot"), opts.label = "skip_test_strict"}
# calculate median for each group if preferred
@@ -153,7 +164,11 @@ plot <- ggplot(adpp_adex, aes(x = .data[[x_var]], y = .data[[y_var]])) +
plot
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "plot2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -164,4 +179,5 @@ plot
```
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/graphs/pharmacokinetic/pkpg03.qmd b/book/graphs/pharmacokinetic/pkpg03.qmd
index 15246a3227..ecf90046fd 100644
--- a/book/graphs/pharmacokinetic/pkpg03.qmd
+++ b/book/graphs/pharmacokinetic/pkpg03.qmd
@@ -5,9 +5,9 @@ subtitle: Box Plot of Pharmacokinetic Parameters by Visit -- Plasma
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Box Plot of Pharmacokinetic Parameters by Visit -- Plasma
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
library(ggplot2)
library(nestcolor)
@@ -24,6 +25,9 @@ adpp <- synthetic_cdisc_dataset("latest", "adpp")
## Plot of CMAX by Visit
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot1, test = list(plot_v1 = "plot"), opts.label = "skip_test_strict"}
# filtered parameter
@@ -61,8 +65,12 @@ plot <- ggplot(adpp, aes(x = AVISIT, y = AVAL, fill = ACTARM)) +
plot
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "plot1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+::::
diff --git a/book/graphs/pharmacokinetic/pkpg04.qmd b/book/graphs/pharmacokinetic/pkpg04.qmd
index 9e15742f16..8477ee9d0f 100644
--- a/book/graphs/pharmacokinetic/pkpg04.qmd
+++ b/book/graphs/pharmacokinetic/pkpg04.qmd
@@ -5,9 +5,9 @@ subtitle: Box Plot of Pharmacokinetic Parameters by Visit -- Plasma
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Box Plot of Pharmacokinetic Parameters by Visit -- Plasma
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
library(ggplot2)
library(ggrepel)
@@ -25,6 +26,9 @@ adpp <- synthetic_cdisc_dataset("latest", "adpp")
## Plot of CMAX by Visit
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot1, test = list(plot_v1 = "plot"), opts.label = "skip_test_strict"}
# filtered parameter
@@ -63,8 +67,12 @@ plot <- p + geom_point(aes(fill = ACTARM), size = 2, shape = 21, position = posi
plot
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "plot1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+::::
diff --git a/book/graphs/pharmacokinetic/pkpg06.qmd b/book/graphs/pharmacokinetic/pkpg06.qmd
index b48589ef3a..b747bd3f7d 100644
--- a/book/graphs/pharmacokinetic/pkpg06.qmd
+++ b/book/graphs/pharmacokinetic/pkpg06.qmd
@@ -5,9 +5,9 @@ subtitle: Boxplot of Metabolite to Parent Ratios by Treatment
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Boxplot of Metabolite to Parent Ratios by Treatment
library(dplyr)
library(scda)
+library(scda.2022)
library(ggplot2)
library(tidyr)
library(tern)
@@ -64,6 +65,9 @@ outliers <- function(x) {
#### Drug X Boxplot
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot1, test = list(plot_v1 = "plot"), opts.label = "skip_test_strict"}
plot <- ggplot(anl_x, aes(x = PARAMCD, y = ratio, fill = ACTARM)) +
@@ -105,8 +109,15 @@ plot <- ggplot(anl_x, aes(x = PARAMCD, y = ratio, fill = ACTARM)) +
plot
```
+`r webr_code_labels <- c("setup", "plot1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
#### Drug Y Boxplot
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot2, test = list(plot_v2 = "plot"), opts.label = "skip_test_strict"}
plot <- ggplot(anl_y, aes(x = PARAMCD, y = ratio, fill = ACTARM)) +
@@ -148,8 +159,15 @@ plot <- ggplot(anl_y, aes(x = PARAMCD, y = ratio, fill = ACTARM)) +
plot
```
+`r webr_code_labels <- c("setup", "plot2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot with Whiskers at
Minimum and Maximum Values
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot3, test = list(plot_v3 = "plot"), opts.label = "skip_test_strict"}
# whiskers are formed with the minimum and maximum values
@@ -177,8 +195,15 @@ plot <- ggplot(anl_x, aes(x = PARAMCD, y = ratio, fill = ACTARM)) +
plot
```
+`r webr_code_labels <- c("setup", "plot3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Plot with Whiskers at
5th and 95th Percentiles
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r plot4, test = list(plot_v4 = "plot"), opts.label = "skip_test_strict"}
anl_x_without_outliers <- anl_x %>%
@@ -239,7 +264,11 @@ plot <- ggplot(anl_x, aes(PARAMCD, ratio, fill = ACTARM, label = USUBJID)) +
plot
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "plot4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -251,4 +280,4 @@ plot
{{< include ../../repro.qmd >}}
-:::
+::::
diff --git a/book/listings/ADA/adal02.qmd b/book/listings/ADA/adal02.qmd
index bdd99e3eea..8c3c740e08 100644
--- a/book/listings/ADA/adal02.qmd
+++ b/book/listings/ADA/adal02.qmd
@@ -5,9 +5,9 @@ subtitle: Listing of Anti-Drug Antibody Data for Treatment Emergent ADA Positive
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: Listing of Anti-Drug Antibody Data for Treatment Emergent ADA Positive
library(dplyr)
library(rlistings)
library(scda)
+library(scda.2022)
adab <- synthetic_cdisc_dataset("latest", "adab") %>%
filter(NFRLT %% 1 == 0 & NFRLT > 0)
@@ -101,6 +102,9 @@ out <- out %>%
## Standard Listing
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r lsting, test = list(lsting = "lsting")}
lsting <- as_listing(
out,
@@ -127,7 +131,12 @@ Asterisk denotes sample that tested positive for Neutralizing Antibodies."
head(lsting, 20)
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lsting")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/listings/ECG/egl01.qmd b/book/listings/ECG/egl01.qmd
index 7459c9a57d..13dddd91a7 100644
--- a/book/listings/ECG/egl01.qmd
+++ b/book/listings/ECG/egl01.qmd
@@ -5,9 +5,9 @@ subtitle: 'Listing of ECG Data: Safety-Evaluable Patients'
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: 'Listing of ECG Data: Safety-Evaluable Patients'
library(dplyr)
library(scda)
+library(scda.2022)
library(rlistings)
adeg <- synthetic_cdisc_dataset("latest", "adeg")
@@ -82,6 +83,9 @@ out <- anl_eg %>%
## Standard Listing
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r lsting, test = list(lsting = "lsting")}
lsting <- as_listing(
out,
@@ -94,7 +98,12 @@ lsting <- as_listing(
head(lsting, 20)
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lsting")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/listings/adverse-events/ael01.qmd b/book/listings/adverse-events/ael01.qmd
index 206e7b906f..3b407ed324 100644
--- a/book/listings/adverse-events/ael01.qmd
+++ b/book/listings/adverse-events/ael01.qmd
@@ -5,15 +5,16 @@ subtitle: Listing of Preferred Terms, Lowest Level Terms, and Investigator-Speci
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(rlistings)
@@ -33,6 +34,9 @@ var_labels(out) <- c(
## Standard Listing
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r lsting, test = list(lsting = "lsting")}
lsting <- as_listing(
out,
@@ -44,7 +48,12 @@ lsting <- as_listing(
head(lsting, 20)
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lsting")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/listings/adverse-events/ael01_nollt.qmd b/book/listings/adverse-events/ael01_nollt.qmd
index 84720e43e6..2d69881016 100644
--- a/book/listings/adverse-events/ael01_nollt.qmd
+++ b/book/listings/adverse-events/ael01_nollt.qmd
@@ -5,15 +5,16 @@ subtitle: Listing of Preferred Terms and Investigator-Specified Adverse Event Te
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(rlistings)
@@ -32,6 +33,9 @@ var_labels(out) <- c(
## Standard Listing
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r lsting, test = list(lsting = "lsting")}
lsting <- as_listing(
out,
@@ -43,7 +47,12 @@ lsting <- as_listing(
head(lsting, 20)
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lsting")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/listings/adverse-events/ael02.qmd b/book/listings/adverse-events/ael02.qmd
index aa27480be5..166cb605cd 100644
--- a/book/listings/adverse-events/ael02.qmd
+++ b/book/listings/adverse-events/ael02.qmd
@@ -5,9 +5,9 @@ subtitle: Listing of Adverse Events
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Listing of Adverse Events
library(dplyr)
library(scda)
+library(scda.2022)
library(rlistings)
adae <- synthetic_cdisc_dataset("latest", "adae")
@@ -67,6 +68,9 @@ var_labels(out) <- c(
## Standard Listing
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r lsting, test = list(lsting = "lsting")}
lsting <- as_listing(
out,
@@ -86,7 +90,12 @@ lsting <- as_listing(
head(lsting, 20)
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lsting")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/listings/adverse-events/ael02_ed.qmd b/book/listings/adverse-events/ael02_ed.qmd
index eeaba484b8..623606a41e 100644
--- a/book/listings/adverse-events/ael02_ed.qmd
+++ b/book/listings/adverse-events/ael02_ed.qmd
@@ -5,9 +5,9 @@ subtitle: Listing of Adverse Events (for Early Development Studies)
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Listing of Adverse Events (for Early Development Studies)
library(dplyr)
library(scda)
+library(scda.2022)
library(rlistings)
library(lubridate)
@@ -85,6 +86,9 @@ out <- out %>% var_relabel(
## Standard Listing
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r lsting, test = list(lsting = "lsting")}
lsting <- as_listing(
out,
@@ -104,7 +108,12 @@ lsting <- as_listing(
head(lsting, 20)
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lsting")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/listings/adverse-events/ael03.qmd b/book/listings/adverse-events/ael03.qmd
index 34529dad25..6917f7655a 100644
--- a/book/listings/adverse-events/ael03.qmd
+++ b/book/listings/adverse-events/ael03.qmd
@@ -5,15 +5,16 @@ subtitle: Listing of Serious Adverse Events
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(rlistings)
@@ -76,6 +77,9 @@ var_labels(out) <- c(
## Standard Listing
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r lsting, test = list(lsting = "lsting")}
lsting <- as_listing(
out,
@@ -100,7 +104,12 @@ lsting <- as_listing(
head(lsting, 20)
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lsting")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/listings/adverse-events/ael04.qmd b/book/listings/adverse-events/ael04.qmd
index 381288c0c4..23c887c7d6 100644
--- a/book/listings/adverse-events/ael04.qmd
+++ b/book/listings/adverse-events/ael04.qmd
@@ -5,9 +5,9 @@ subtitle: Listing of Patient Deaths
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Listing of Patient Deaths
library(dplyr)
library(scda)
+library(scda.2022)
library(rlistings)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -43,6 +44,9 @@ var_labels(out) <- c(
## Standard Listing
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r lsting, test = list(lsting = "lsting")}
lsting <- as_listing(
out,
@@ -54,7 +58,12 @@ lsting <- as_listing(
head(lsting, 20)
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lsting")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/listings/concomitant-medications/cml01.qmd b/book/listings/concomitant-medications/cml01.qmd
index 9397a26171..65e7ed40eb 100644
--- a/book/listings/concomitant-medications/cml01.qmd
+++ b/book/listings/concomitant-medications/cml01.qmd
@@ -5,9 +5,9 @@ subtitle: Listing of Previous and Concomitant Medications
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Listing of Previous and Concomitant Medications
library(dplyr)
library(scda)
+library(scda.2022)
library(rlistings)
adcm <- synthetic_cdisc_dataset("latest", "adcm")
@@ -54,6 +55,9 @@ var_labels(out) <- c(
## Standard Listing
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r lsting, test = list(lsting = "lsting")}
lsting <- as_listing(
out,
@@ -65,7 +69,12 @@ lsting <- as_listing(
head(lsting, 20)
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lsting")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/listings/concomitant-medications/cml02a_gl.qmd b/book/listings/concomitant-medications/cml02a_gl.qmd
index 8da1741fd7..9df1ec3533 100644
--- a/book/listings/concomitant-medications/cml02a_gl.qmd
+++ b/book/listings/concomitant-medications/cml02a_gl.qmd
@@ -5,15 +5,16 @@ subtitle: Listing of Concomitant Medication Class Level 2, Preferred Name, and I
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(rlistings)
@@ -32,6 +33,9 @@ var_labels(out) <- c(
## Standard Listing
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r lsting, test = list(lsting = "lsting")}
lsting <- as_listing(
out,
@@ -43,7 +47,12 @@ lsting <- as_listing(
head(lsting, 20)
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lsting")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/listings/concomitant-medications/cml02b_gl.qmd b/book/listings/concomitant-medications/cml02b_gl.qmd
index 09d2c9e96c..d047d9b72a 100644
--- a/book/listings/concomitant-medications/cml02b_gl.qmd
+++ b/book/listings/concomitant-medications/cml02b_gl.qmd
@@ -5,15 +5,16 @@ subtitle: Listing of Concomitant Medication Class, Preferred Name, and Investiga
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(rlistings)
@@ -35,6 +36,9 @@ var_labels(out) <- c(
## Standard Listing
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r lsting, test = list(lsting = "lsting")}
lsting <- as_listing(
out,
@@ -46,7 +50,12 @@ lsting <- as_listing(
head(lsting, 20)
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lsting")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/listings/development-safety-update-report/dsur4.qmd b/book/listings/development-safety-update-report/dsur4.qmd
index de00d8253b..d5ad418f94 100644
--- a/book/listings/development-safety-update-report/dsur4.qmd
+++ b/book/listings/development-safety-update-report/dsur4.qmd
@@ -5,15 +5,16 @@ subtitle: Listing of Patients Who Died During Reporting Period
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(rlistings)
@@ -33,6 +34,9 @@ var_labels(out) <- c(
## Standard Listing
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r lsting, test = list(lsting = "lsting")}
lsting <- as_listing(
out,
@@ -45,7 +49,12 @@ lsting <- as_listing(
head(lsting, 20)
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lsting")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/listings/disposition/dsl01.qmd b/book/listings/disposition/dsl01.qmd
index 6cf913b6ef..5fe113e61d 100644
--- a/book/listings/disposition/dsl01.qmd
+++ b/book/listings/disposition/dsl01.qmd
@@ -5,15 +5,16 @@ subtitle: Listing of Patients with Study Drug Withdrawn Due to Adverse Events
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(rlistings)
@@ -42,6 +43,9 @@ var_labels(out) <- c(
## Standard Listing
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r lsting, test = list(lsting = "lsting")}
lsting <- as_listing(
out,
@@ -53,7 +57,12 @@ lsting <- as_listing(
head(lsting, 20)
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lsting")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/listings/disposition/dsl02.qmd b/book/listings/disposition/dsl02.qmd
index 77cdc025c3..67a11e97d5 100644
--- a/book/listings/disposition/dsl02.qmd
+++ b/book/listings/disposition/dsl02.qmd
@@ -5,15 +5,16 @@ subtitle: Listing of Patients Who Discontinued Early from Study
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(rlistings)
@@ -50,6 +51,9 @@ var_labels(out) <- c(
## Standard Listing
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r lsting, test = list(lsting = "lsting")}
lsting <- as_listing(
out,
@@ -61,7 +65,12 @@ lsting <- as_listing(
head(lsting, 20)
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lsting")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/listings/efficacy/oncl01.qmd b/book/listings/efficacy/oncl01.qmd
index 3dd2cc018a..032bebaa89 100644
--- a/book/listings/efficacy/oncl01.qmd
+++ b/book/listings/efficacy/oncl01.qmd
@@ -5,15 +5,16 @@ subtitle: Listing of Individual Efficacy Data
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(rlistings)
@@ -93,6 +94,9 @@ out <- out %>%
## Standard Listing
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r lsting, test = list(lsting = "lsting")}
lsting <- as_listing(
out,
@@ -105,7 +109,12 @@ lsting <- as_listing(
head(lsting, 20)
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lsting")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/listings/exposure/exl01.qmd b/book/listings/exposure/exl01.qmd
index 015e9f08f3..76d9850d5e 100644
--- a/book/listings/exposure/exl01.qmd
+++ b/book/listings/exposure/exl01.qmd
@@ -5,9 +5,9 @@ subtitle: Listing of Exposure to Study Drug
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Listing of Exposure to Study Drug
library(dplyr)
library(scda)
+library(scda.2022)
library(rlistings)
adex <- synthetic_cdisc_dataset("latest", "adex")
@@ -42,6 +43,9 @@ var_labels(out) <- c(
## Standard Listing
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r lsting, test = list(lsting = "lsting")}
lsting <- as_listing(
out,
@@ -53,7 +57,12 @@ lsting <- as_listing(
head(lsting, 20)
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lsting")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/listings/lab-results/lbl01.qmd b/book/listings/lab-results/lbl01.qmd
index 157efca5ca..8edc48dffd 100644
--- a/book/listings/lab-results/lbl01.qmd
+++ b/book/listings/lab-results/lbl01.qmd
@@ -5,9 +5,9 @@ subtitle: Listing of Laboratory Test Results
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Listing of Laboratory Test Results
library(dplyr)
library(scda)
+library(scda.2022)
library(rlistings)
adlb <- synthetic_cdisc_dataset("latest", "adlb")
@@ -66,6 +67,9 @@ out <- out %>%
## Standard Listing
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r lsting, test = list(lsting = "lsting")}
lsting <- as_listing(
out,
@@ -78,7 +82,12 @@ lsting <- as_listing(
head(lsting, 20)
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lsting")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/listings/lab-results/lbl01_rls.qmd b/book/listings/lab-results/lbl01_rls.qmd
index 948faed22f..b1601eb34a 100644
--- a/book/listings/lab-results/lbl01_rls.qmd
+++ b/book/listings/lab-results/lbl01_rls.qmd
@@ -5,9 +5,9 @@ subtitle: Listing of Laboratory Test Results Using Roche Safety Lab Standardizat
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Listing of Laboratory Test Results Using Roche Safety Lab Standardizat
library(dplyr)
library(scda)
+library(scda.2022)
library(rlistings)
adlb <- synthetic_cdisc_dataset("latest", "adlb") %>%
@@ -71,6 +72,9 @@ out <- out %>%
## Standard Listing
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r lsting, test = list(lsting = "lsting")}
lsting <- as_listing(
out,
@@ -83,7 +87,12 @@ lsting <- as_listing(
head(lsting, 20)
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lsting")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/listings/lab-results/lbl02a.qmd b/book/listings/lab-results/lbl02a.qmd
index a30430bf42..d4ffd25287 100644
--- a/book/listings/lab-results/lbl02a.qmd
+++ b/book/listings/lab-results/lbl02a.qmd
@@ -5,9 +5,9 @@ subtitle: Listing of Laboratory Abnormalities (constant units)
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Listing of Laboratory Abnormalities (constant units)
library(dplyr)
library(scda)
+library(scda.2022)
library(rlistings)
adlb <- synthetic_cdisc_dataset("latest", "adlb")
@@ -66,6 +67,9 @@ out <- out %>%
## Standard Listing
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r lsting, test = list(lsting = "lsting")}
lsting <- as_listing(
out,
@@ -78,7 +82,12 @@ lsting <- as_listing(
head(lsting, 20)
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lsting")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/listings/lab-results/lbl02a_rls.qmd b/book/listings/lab-results/lbl02a_rls.qmd
index 65d14b5adb..61e1aa523f 100644
--- a/book/listings/lab-results/lbl02a_rls.qmd
+++ b/book/listings/lab-results/lbl02a_rls.qmd
@@ -5,9 +5,9 @@ subtitle: Listing of Laboratory Abnormalities Defined by Roche Safety Lab Standa
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Listing of Laboratory Abnormalities Defined by Roche Safety Lab Standa
library(dplyr)
library(scda)
+library(scda.2022)
library(rlistings)
adlb <- synthetic_cdisc_dataset("latest", "adlb")
@@ -86,6 +87,9 @@ out <- out %>%
## Standard Listing
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r lsting, test = list(lsting = "lsting")}
lsting <- as_listing(
out,
@@ -98,7 +102,12 @@ lsting <- as_listing(
head(lsting, 20)
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lsting")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/listings/lab-results/lbl02b.qmd b/book/listings/lab-results/lbl02b.qmd
index a19230f450..141c5d935b 100644
--- a/book/listings/lab-results/lbl02b.qmd
+++ b/book/listings/lab-results/lbl02b.qmd
@@ -5,9 +5,9 @@ subtitle: Listing of Laboratory Abnormalities (variable units)
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Listing of Laboratory Abnormalities (variable units)
library(dplyr)
library(scda)
+library(scda.2022)
library(rlistings)
adlb <- synthetic_cdisc_dataset("latest", "adlb")
@@ -67,6 +68,9 @@ out <- out %>%
## Standard Listing
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r lsting, test = list(lsting = "lsting")}
lsting <- as_listing(
out,
@@ -79,7 +83,12 @@ lsting <- as_listing(
head(lsting, 20)
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lsting")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/listings/medical-history/mhl01.qmd b/book/listings/medical-history/mhl01.qmd
index 6338eac5b3..b57f603b52 100644
--- a/book/listings/medical-history/mhl01.qmd
+++ b/book/listings/medical-history/mhl01.qmd
@@ -5,9 +5,9 @@ subtitle: Listing of Medical History and Concurrent Diseases
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Listing of Medical History and Concurrent Diseases
library(dplyr)
library(scda)
+library(scda.2022)
library(rlistings)
admh <- synthetic_cdisc_dataset("latest", "admh")
@@ -46,6 +47,9 @@ var_labels(out) <- c(
## Standard Listing
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r lsting, test = list(lsting = "lsting")}
lsting <- as_listing(
out,
@@ -57,7 +61,12 @@ lsting <- as_listing(
head(lsting, 20)
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lsting")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/listings/pharmacokinetic/pkcl01.qmd b/book/listings/pharmacokinetic/pkcl01.qmd
index a9bc49ae40..e24972fc40 100644
--- a/book/listings/pharmacokinetic/pkcl01.qmd
+++ b/book/listings/pharmacokinetic/pkcl01.qmd
@@ -5,9 +5,9 @@ subtitle: Listing of Drug A Concentration by Treatment Group, Patient and Nomina
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Listing of Drug A Concentration by Treatment Group, Patient and Nomina
library(rlistings)
library(scda)
+library(scda.2022)
library(dplyr)
adpc <- synthetic_cdisc_dataset("latest", "adpc")
@@ -37,6 +38,9 @@ var_labels(out) <- c(
## Standard Listing
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r lsting, test = list(lsting = "lsting")}
lsting <- as_listing(
out,
@@ -53,7 +57,12 @@ lsting <- as_listing(
head(lsting, 20)
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lsting")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/listings/pharmacokinetic/pkcl02.qmd b/book/listings/pharmacokinetic/pkcl02.qmd
index 2ad498801e..238164a630 100644
--- a/book/listings/pharmacokinetic/pkcl02.qmd
+++ b/book/listings/pharmacokinetic/pkcl02.qmd
@@ -5,9 +5,9 @@ subtitle: Listing of Drug A Urine Concentration and Volumes
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: Listing of Drug A Urine Concentration and Volumes
library(dplyr)
library(rlistings)
library(scda)
+library(scda.2022)
drug_a <- "Drug X"
spec <- "URINE"
@@ -71,6 +72,9 @@ out <- out %>% var_relabel(
## Standard Listing
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r lsting, test = list(lsting = "lsting")}
lsting <- as_listing(
out,
@@ -86,7 +90,12 @@ lsting <- as_listing(
head(lsting, 20)
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lsting")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/listings/pharmacokinetic/pkpl01.qmd b/book/listings/pharmacokinetic/pkpl01.qmd
index 6bc8c2d4b8..7bfa1418f6 100644
--- a/book/listings/pharmacokinetic/pkpl01.qmd
+++ b/book/listings/pharmacokinetic/pkpl01.qmd
@@ -5,9 +5,9 @@ subtitle: Listing of Drug A Plasma PK Parameters
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: Listing of Drug A Plasma PK Parameters
library(dplyr)
library(rlistings)
library(scda)
+library(scda.2022)
drug_a <- "Plasma Drug X"
spec <- "Plasma"
@@ -45,6 +46,9 @@ out <- out %>% var_relabel(
## Standard Listing
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r lsting, test = list(lsting = "lsting")}
lsting <- as_listing(
out,
@@ -57,7 +61,12 @@ lsting <- as_listing(
head(lsting, 20)
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lsting")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/listings/pharmacokinetic/pkpl02.qmd b/book/listings/pharmacokinetic/pkpl02.qmd
index ee0bf72bf8..48e9ec5393 100644
--- a/book/listings/pharmacokinetic/pkpl02.qmd
+++ b/book/listings/pharmacokinetic/pkpl02.qmd
@@ -5,9 +5,9 @@ subtitle: Listing of Drug A Urine PK Parameters
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: Listing of Drug A Urine PK Parameters
library(dplyr)
library(rlistings)
library(scda)
+library(scda.2022)
drug_a <- "Plasma Drug X"
spec <- "Urine"
@@ -46,6 +47,9 @@ out <- out %>% var_relabel(
## Standard Listing
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r lsting, test = list(lsting = "lsting")}
lsting <- as_listing(
out,
@@ -58,7 +62,12 @@ lsting <- as_listing(
head(lsting, 20)
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lsting")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/listings/pharmacokinetic/pkpl04.qmd b/book/listings/pharmacokinetic/pkpl04.qmd
index ab912ab34f..8c0ec70255 100644
--- a/book/listings/pharmacokinetic/pkpl04.qmd
+++ b/book/listings/pharmacokinetic/pkpl04.qmd
@@ -5,9 +5,9 @@ subtitle: Listing of Individual Drug A AUCIFO and CMAX Ratios Following Drug A o
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: Listing of Individual Drug A AUCIFO and CMAX Ratios Following Drug A o
library(dplyr)
library(rlistings)
library(scda)
+library(scda.2022)
adpp <- synthetic_cdisc_dataset("latest", "adpp")
@@ -57,6 +58,9 @@ out <- out %>% var_relabel(USUBJID = "Subject ID")
## Standard Listing - CYCLE 1 DAY 1
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r lsting, test = list(lsting = "lsting")}
lsting <- as_listing(
out,
@@ -73,7 +77,12 @@ lsting <- as_listing(
head(lsting, 20)
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lsting")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/listings/vital-signs/vsl01.qmd b/book/listings/vital-signs/vsl01.qmd
index 0afd474e71..a8bce52275 100644
--- a/book/listings/vital-signs/vsl01.qmd
+++ b/book/listings/vital-signs/vsl01.qmd
@@ -5,9 +5,9 @@ subtitle: 'Listing of Vital Signs: Safety-Evaluable Patients'
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: 'Listing of Vital Signs: Safety-Evaluable Patients'
library(dplyr)
library(scda)
+library(scda.2022)
library(rlistings)
advs <- synthetic_cdisc_dataset("latest", "advs")
@@ -115,6 +116,9 @@ out <- anl_vs %>%
## Standard Listing
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r lsting, test = list(lsting = "lsting")}
lsting <- as_listing(
out,
@@ -127,7 +131,12 @@ lsting <- as_listing(
head(lsting, 20)
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lsting")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/tables/ADA/adat01.qmd b/book/tables/ADA/adat01.qmd
index 8cfba9642b..cd9f87b356 100644
--- a/book/tables/ADA/adat01.qmd
+++ b/book/tables/ADA/adat01.qmd
@@ -5,9 +5,9 @@ subtitle: Baseline Prevalence and Incidence of Treatment Emergent ADA
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: Baseline Prevalence and Incidence of Treatment Emergent ADA
library(tern)
library(dplyr)
library(scda)
+library(scda.2022)
library(tibble)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -130,6 +131,9 @@ adab_pb <- df_explicit_na(adab) %>%
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result"), opts.label = ifelse(packageVersion("rtables") < "0.6.6.9011", "skip_test_strict", "")}
# Layout for Baseline Prevalence of NAbs
@@ -237,7 +241,11 @@ main_footer(result) <- "ADA = Anti-Drug Antibodies (is also referred to as ATA,
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -248,4 +256,5 @@ result
```
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/tables/ADA/adat02.qmd b/book/tables/ADA/adat02.qmd
index 9844590d2d..4daf4c1892 100644
--- a/book/tables/ADA/adat02.qmd
+++ b/book/tables/ADA/adat02.qmd
@@ -5,9 +5,9 @@ subtitle: Summary of Patients with Treatment-Induced ADA
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: Summary of Patients with Treatment-Induced ADA
library(tern)
library(dplyr)
library(scda)
+library(scda.2022)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
adab <- synthetic_cdisc_dataset("latest", "adab")
@@ -63,6 +64,9 @@ adab_ti <- adab %>%
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
# Layout for post-baseline evaluable patient variables from adab dataset.
lyt_adab <- basic_table(show_colcounts = TRUE) %>%
@@ -137,7 +141,11 @@ main_footer(result) <- paste(
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -148,4 +156,5 @@ result
```
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/tables/ADA/adat03.qmd b/book/tables/ADA/adat03.qmd
index 9779263c04..8a5b762ae8 100644
--- a/book/tables/ADA/adat03.qmd
+++ b/book/tables/ADA/adat03.qmd
@@ -5,9 +5,9 @@ subtitle: Summary of Serum Concentrations at Timepoints Where ADA Samples Were C
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Summary of Serum Concentrations at Timepoints Where ADA Samples Were C
library(dplyr)
library(scda)
+library(scda.2022)
library(tern)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -41,6 +42,9 @@ anl <- merge(anl, adpc, by = c("USUBJID", "NFRLT")) %>%
## Standard Table (μg/mL)
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
# parameters in columns
adat03_stats <- c("n", "mean", "sd", "median", "min", "max", "cv", "geom_mean", "count_fraction")
@@ -114,7 +118,11 @@ fnotes_at_path(result, rowpath = NULL, colpath = c("multivars", "AVAL_LT")) <- "
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -125,4 +133,5 @@ result
```
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/tables/ADA/adat04a.qmd b/book/tables/ADA/adat04a.qmd
index a523508030..ee8edc7188 100644
--- a/book/tables/ADA/adat04a.qmd
+++ b/book/tables/ADA/adat04a.qmd
@@ -5,9 +5,9 @@ subtitle: Baseline Prevalence and Incidence of Treatment Emergent NAbs
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: Baseline Prevalence and Incidence of Treatment Emergent NAbs
library(tern)
library(dplyr)
library(scda)
+library(scda.2022)
library(tibble)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -157,6 +158,9 @@ adab_pb <- df_explicit_na(adab) %>%
## Summary of Treatment Emergent NAbs
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result"), opts.label = ifelse(packageVersion("rtables") < "0.6.6.9011", "skip_test_strict", "")}
# Layout for Baseline Prevalence of NAbs
@@ -263,7 +267,11 @@ Treatment unaffected = A post-baseline evaluable patient with a positive result
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -274,4 +282,5 @@ result
```
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/tables/ADA/adat04b.qmd b/book/tables/ADA/adat04b.qmd
index d9e6113a06..5fc4dc1f42 100644
--- a/book/tables/ADA/adat04b.qmd
+++ b/book/tables/ADA/adat04b.qmd
@@ -5,9 +5,9 @@ subtitle: Baseline Prevalence and Incidence of NAbs
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: Baseline Prevalence and Incidence of NAbs
library(tern)
library(dplyr)
library(scda)
+library(scda.2022)
library(tibble)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -137,6 +138,9 @@ adab_pb <- left_join(adab_pb_ada, adab_pb_adap, by = mergecol) %>%
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result"), opts.label = ifelse(packageVersion("rtables") < "0.6.6.9011", "skip_test_strict", "")}
# Layout for Baseline Prevalence of NAbs
@@ -222,7 +226,11 @@ Number of patients positive for NAb = the number (and percentage) of post-baseli
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -233,4 +241,5 @@ result
```
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/tables/ECG/egt01.qmd b/book/tables/ECG/egt01.qmd
index c11ed58ad1..66202265cd 100644
--- a/book/tables/ECG/egt01.qmd
+++ b/book/tables/ECG/egt01.qmd
@@ -5,9 +5,9 @@ subtitle: ECG Results and Change from Baseline by Visit
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: ECG Results and Change from Baseline by Visit
library(dplyr)
library(tern)
library(scda)
+library(scda.2022)
# Data should be filtered for the studied Parameter (`PARAM`) and the
# Analysis Visit (`AVISIT`). According to the GDSR template, the values for
@@ -36,6 +37,9 @@ adeg_f <- adeg %>%
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
# Define the split function
split_fun <- drop_split_levels
@@ -79,10 +83,17 @@ result <- build_table(lyt, adeg_f, alt_counts_df = adsl)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app"), eval = packageVersion("teal.modules.clinical") >= "0.9.0.9007"}
library(teal.modules.clinical)
@@ -91,6 +102,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADEG <- synthetic_cdisc_dataset("latest", "adeg")
@@ -140,5 +152,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/ECG/egt02.qmd b/book/tables/ECG/egt02.qmd
index 809e222a77..92e2e3a204 100644
--- a/book/tables/ECG/egt02.qmd
+++ b/book/tables/ECG/egt02.qmd
@@ -5,9 +5,9 @@ subtitle: ECG Abnormalities (EGT02_1 & EGT02_2)
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: ECG Abnormalities (EGT02_1 & EGT02_2)
library(dplyr)
library(scda)
+library(scda.2022)
library(tern)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -37,6 +38,9 @@ adeg_f <- adeg %>%
## ECG Abnormalities Regardless
of Abnormality at Baseline
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
split_fun <- drop_split_levels
@@ -55,8 +59,15 @@ result <- build_table(lyt = lyt, df = adeg_f, alt_counts_df = adsl)
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## ECG Abnormalities Among Subjects
Without Abnormality at Baseline
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
split_fun <- drop_split_levels
@@ -75,10 +86,17 @@ result <- build_table(lyt = lyt, df = adeg_f, alt_counts_df = adsl)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -86,6 +104,8 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
+
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADEG <- synthetic_cdisc_dataset("latest", "adeg")
})
@@ -127,5 +147,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/ECG/egt03.qmd b/book/tables/ECG/egt03.qmd
index e1a183b447..0e5475fe53 100644
--- a/book/tables/ECG/egt03.qmd
+++ b/book/tables/ECG/egt03.qmd
@@ -5,15 +5,16 @@ subtitle: Shift Table of ECG Interval Data -- Baseline Versus Minimum/Maximum Po
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(tern)
library(dplyr)
@@ -49,6 +50,9 @@ var_labels(adeg_f_pbmax) <- adeg_labels
For the EGT03 template, data imputation should be avoided, and missing data explicit and accounted for, so the contingency table sum adds up to the group N.
For illustration purposes, missing data are added to the example dataset.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
set.seed(123, kind = "Mersenne-Twister")
@@ -91,11 +95,18 @@ result <- build_table(
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table of Baseline Versus
Maximum Post-Baseline
For the EGT03 template, data imputation should be avoided, and missing data explicit and accounted for, so the contingency table sum adds up to the group N.
For illustration purpose, missing data are added to the example dataset.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
set.seed(123, kind = "Mersenne-Twister")
@@ -138,18 +149,25 @@ result <- build_table(
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
## Data reproducible code
data <- teal_data()
data <- within(data, {
- library(dplyr)
library(scda)
+ library(scda.2022)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADEG <- synthetic_cdisc_dataset("latest", "adeg")
@@ -205,5 +223,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/ECG/egt04.qmd b/book/tables/ECG/egt04.qmd
index e8b09b7e82..5b7d4a98bb 100644
--- a/book/tables/ECG/egt04.qmd
+++ b/book/tables/ECG/egt04.qmd
@@ -5,9 +5,9 @@ subtitle: Shift Table of Qualitative ECG Assessments
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
For the EGT04 template, data imputation should be avoided, and missing data explicit and accounted for, so the contingency table sum adds up to the group N.
@@ -17,6 +17,7 @@ For illustration purposes, missing data are added to the example dataset.
#| code-fold: show
library(scda)
+library(scda.2022)
library(tern)
library(dplyr)
set.seed(123)
@@ -64,6 +65,9 @@ adeg_f <- adeg_f %>% mutate(postbaseline_label = "Post-Baseline")
The EGT04 template consists of a stacked list of contingency tables, one per group.
For each group, the n's across all cells must add up to the group N in the analysis, and percentages are calculated using N as the denominator.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
# Define the split function
split_fun <- drop_split_levels
@@ -85,7 +89,11 @@ result <- build_table(lyt, adeg_f)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -97,4 +105,4 @@ result
{{< include ../../repro.qmd >}}
-:::
+::::
diff --git a/book/tables/ECG/egt05_qtcat.qmd b/book/tables/ECG/egt05_qtcat.qmd
index 5d0dbef266..9e7b066933 100644
--- a/book/tables/ECG/egt05_qtcat.qmd
+++ b/book/tables/ECG/egt05_qtcat.qmd
@@ -5,9 +5,9 @@ subtitle: ECG Actual Values and Changes from Baseline by Visit
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: ECG Actual Values and Changes from Baseline by Visit
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -74,6 +75,9 @@ adeg_f <- adeg %>%
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
split_fun <- drop_split_levels
@@ -103,10 +107,17 @@ result <- build_table(lyt = lyt, df = adeg_f, alt_counts_df = adsl) %>%
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -114,6 +125,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
library(dplyr)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
@@ -209,5 +221,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/adverse-events/aet01.qmd b/book/tables/adverse-events/aet01.qmd
index f6839ea420..9fdc2a8ee8 100644
--- a/book/tables/adverse-events/aet01.qmd
+++ b/book/tables/adverse-events/aet01.qmd
@@ -5,9 +5,9 @@ subtitle: Safety Summary
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
To illustrate, additional variables such as flags (TRUE/FALSE) for select AEs of interest and select AE baskets are added to the `adae` dataset.
@@ -18,6 +18,7 @@ To illustrate, additional variables such as flags (TRUE/FALSE) for select AEs of
library(tern)
library(dplyr)
library(scda)
+library(scda.2022)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
adae <- synthetic_cdisc_dataset("latest", "adae")
@@ -77,6 +78,9 @@ adae <- adae %>%
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result"), opts.label = ifelse(packageVersion("rtables") < "0.6.6.9011", "skip_test_strict", "")}
aesi_vars <- c("FATAL", "SER", "SERWD", "SERDSM", "RELSER", "WD", "DSM", "REL", "RELWD", "RELDSM", "SEV")
@@ -134,8 +138,15 @@ result <- rbind(
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with Medical
Concepts Section
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
aesi_vars <- c("FATAL", "SER", "SERWD", "SERDSM", "RELSER", "WD", "DSM", "REL", "RELWD", "RELDSM", "CTC35")
basket_vars <- c("SMQ01", "SMQ02", "CQ01")
@@ -201,8 +212,15 @@ result <- rbind(
result
```
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with
Modified Rows
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant3, test = list(result_v3 = "result")}
aesi_vars <- c("FATAL", "SER", "WD", "REL", "CTC35", "CTC45")
# Layout for variables from adsl dataset.
@@ -263,8 +281,15 @@ result <- rbind(
result
```
+`r webr_code_labels <- c("setup", "variant3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with Rows Counting
Events & Additional Sections
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant4, test = list(result_v4 = "result")}
count_subj_vars <- c("FATAL", "SER", "WD", "DSM", "REL", "CTC35")
count_term_vars <- c("SER", "DSM", "REL", "CTC35", "CTC45")
@@ -341,10 +366,17 @@ result <- rbind(
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -352,7 +384,9 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
library(dplyr)
+
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADAE <- synthetic_cdisc_dataset("latest", "adae")
@@ -420,5 +454,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/adverse-events/aet01_aesi.qmd b/book/tables/adverse-events/aet01_aesi.qmd
index 88c9312e34..66f13cfbd8 100644
--- a/book/tables/adverse-events/aet01_aesi.qmd
+++ b/book/tables/adverse-events/aet01_aesi.qmd
@@ -5,9 +5,10 @@ subtitle: Safety Summary (Adverse Events of Special Interest)
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
+
+:::: {.panel-tabset}
-::: panel-tabset
## Data Setup
To illustrate, additional variables such as flags (TRUE/FALSE) for selected AEs of interest.
@@ -19,6 +20,7 @@ Please consult your SAP on how to handle missing AE grades.
library(tern)
library(dplyr)
library(scda)
+library(scda.2022)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
adae <- synthetic_cdisc_dataset("latest", "adae")
@@ -138,6 +140,9 @@ adae <- adae %>%
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
aesi_vars <- c("WD", "DSM", "CONTRT", "ALL_RESOLVED", "NOT_RESOLVED", "SER", "REL")
@@ -167,8 +172,15 @@ result <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with
Optional Lines
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
aesi_vars <- c("WD", "DSM", "CONTRT")
aesi_resolved <- c("ALL_RESOLVED", "ALL_RESOLVED_WD", "ALL_RESOLVED_DSM", "ALL_RESOLVED_CONTRT")
@@ -233,8 +245,15 @@ result <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)
result
```
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table For Studies
with Multiple Drugs
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r variant3, test = list(result_v3 = "result")}
adsl <- synthetic_cdisc_dataset("latest", "adsl")
adae_mult <- synthetic_cdisc_dataset("latest", "adae")
@@ -513,8 +532,16 @@ result <- build_table(lyt_adae_mult, df = adae_mult, alt_counts_df = adsl)
result
```
+
+`r webr_code_labels <- c("variant3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table of AEs
by SMQ
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r variant4, test = list(result_v4 = "result")}
adsl <- synthetic_cdisc_dataset("latest", "adsl")
adae <- synthetic_cdisc_dataset("latest", "adae")
@@ -687,10 +714,17 @@ result <- build_table(lyt_adae, df = adae_smq, alt_counts_df = adsl)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -698,7 +732,9 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
library(dplyr)
+
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADAE <- synthetic_cdisc_dataset("latest", "adae")
ADAE <- filter(ADAE, ANL01FL == "Y" & SAFFL == "Y")
@@ -808,5 +844,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/adverse-events/aet02.qmd b/book/tables/adverse-events/aet02.qmd
index 941f97020c..4afdde78f7 100644
--- a/book/tables/adverse-events/aet02.qmd
+++ b/book/tables/adverse-events/aet02.qmd
@@ -5,9 +5,9 @@ subtitle: Adverse Events
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+::::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: Adverse Events
library(dplyr)
library(tern)
library(scda)
+library(scda.2022)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
adae <- synthetic_cdisc_dataset("latest", "adae")
@@ -35,6 +36,9 @@ split_fun <- drop_split_levels
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(var = "ACTARM") %>%
@@ -70,12 +74,20 @@ lyt <- basic_table(show_colcounts = TRUE) %>%
append_varlabels(adae, "AEDECOD", indent = 1L)
result <- build_table(lyt, df = adae, alt_counts_df = adsl)
+result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
The variable `result` corresponds to the adverse events table.
However, it includes many empty rows accounting for events which were not reported.
The table can be post-processed to prune empty rows and to sort rows, for example by occurrence.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
result <- result %>%
prune_table() %>%
@@ -91,8 +103,15 @@ result <- result %>%
result
```
+`r webr_code_labels <- c("setup", "variant1", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with
Event Totals
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant3, test = list(result_v3 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(var = "ACTARM") %>%
@@ -144,8 +163,15 @@ result <- build_table(lyt, df = adae, alt_counts_df = adsl) %>%
result
```
+`r webr_code_labels <- c("setup", "variant3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with
High-Level Term
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant4, test = list(result_v4 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(var = "ACTARM") %>%
@@ -211,8 +237,15 @@ result <- build_table(lyt, df = adae, alt_counts_df = adsl) %>%
result
```
+`r webr_code_labels <- c("setup", "variant4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with Preferred
Terms Only
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant5, test = list(result_v5 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(var = "ACTARM") %>%
@@ -237,8 +270,15 @@ result <- build_table(lyt, df = adae, alt_counts_df = adsl) %>%
result
```
+`r webr_code_labels <- c("setup", "variant5")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with Fill-In of
Treatment Groups
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant6, test = list(result_v6 = "result")}
adae_5 <- adae %>% dplyr::filter(ACTARM != "C: Combination")
@@ -285,8 +325,15 @@ result <- build_table(lyt, df = adae_5, alt_counts_df = adsl) %>%
result
```
+`r webr_code_labels <- c("setup", "variant6")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table of AEs with an Incidence Rate
$\geq$ 5% in Any Treatment Group (subsetting
preferred terms based on frequency)
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant7, test = list(result_v7 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(var = "ACTARM") %>%
@@ -333,8 +380,15 @@ result <- prune_table(result, keep_rows(row_condition))
result
```
+`r webr_code_labels <- c("setup", "variant7")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table of AEs with an Incidence Rate $\geq$ 5% in
Any Treatment Group (subsetting preferred terms
based on frequency with high-level terms)
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant8, test = list(result_v8 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(var = "ACTARM") %>%
@@ -397,8 +451,15 @@ result <- prune_table(result, keep_rows(row_condition))
result
```
+`r webr_code_labels <- c("setup", "variant8")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table of AEs with an Incidence Rate $\geq$ 10%
in Any Treatment Group (subsetting
preferred terms based on frequency)
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant9, test = list(result_v9 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(var = "ACTARM") %>%
@@ -445,8 +506,15 @@ result <- prune_table(result, keep_rows(row_condition))
result
```
+`r webr_code_labels <- c("setup", "variant9")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table of AEs with an Incidence Rate $\geq$ 3
Patients in Any Treatment Group (subsetting
preferred terms based on number of patients)
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant10, test = list(result_v10 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(var = "ACTARM") %>%
@@ -493,8 +561,15 @@ result <- prune_table(result, keep_rows(row_condition))
result
```
+`r webr_code_labels <- c("setup", "variant10")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table of AEs with a Difference in Incidence Rate $\geq$ 5%
Between Any Treatment (subsetting preferred terms based
on difference in percentage between treatment groups)
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant11, test = list(result_v11 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(var = "ACTARM") %>%
@@ -541,8 +616,15 @@ result <- prune_table(result, keep_rows(row_condition))
result
```
+`r webr_code_labels <- c("setup", "variant11")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table of AEs with an Incidence Rate $\geq$ 5%
in B: Placebo (subsetting preferred terms based
on frequency for a particular treatment group)
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant12, test = list(result_v12 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(var = "ACTARM") %>%
@@ -589,8 +671,15 @@ result <- prune_table(result, keep_rows(row_condition))
result
```
+`r webr_code_labels <- c("setup", "variant12")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table of AEs with a Difference in Incidence Rate $\geq$ 5% Between
Arm A and Arm B or Arm C (displaying preferred terms with a
difference of at least x% between selected treatment groups)
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant13, test = list(result_v13 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(var = "ACTARM") %>%
@@ -636,10 +725,17 @@ result <- prune_table(result, keep_rows(row_condition))
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant13")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -647,6 +743,8 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
+
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADAE <- synthetic_cdisc_dataset("latest", "adae")
@@ -686,5 +784,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/adverse-events/aet02_smq.qmd b/book/tables/adverse-events/aet02_smq.qmd
index afcd7352ac..be1423b7a0 100644
--- a/book/tables/adverse-events/aet02_smq.qmd
+++ b/book/tables/adverse-events/aet02_smq.qmd
@@ -5,9 +5,9 @@ subtitle: Adverse Events by Standardized MedDRA Query
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: Adverse Events by Standardized MedDRA Query
library(dplyr)
library(tern)
library(scda)
+library(scda.2022)
library(stringr)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -70,6 +71,9 @@ adae_smq_1 <- adae_smq_all %>%
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
criteria_fun <- function(tr) !is(tr, "ContentRow") && all_zero_or_na(tr)
@@ -117,8 +121,15 @@ result <- build_table(
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with Customized Queries
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
criteria_fun <- function(tr) {
!is(tr, "ContentRow") && all_zero_or_na(tr) && !grepl("Total number of", obj_label(tr))
@@ -173,10 +184,17 @@ result <- build_table(
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -184,6 +202,8 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
+
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADAE <- synthetic_cdisc_dataset("latest", "adae")
})
@@ -232,5 +252,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/adverse-events/aet03.qmd b/book/tables/adverse-events/aet03.qmd
index 86ae1ddaa4..4f9e670c26 100644
--- a/book/tables/adverse-events/aet03.qmd
+++ b/book/tables/adverse-events/aet03.qmd
@@ -5,17 +5,17 @@ subtitle: Adverse Events by Greatest Intensity
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
-
library(tern)
library(dplyr)
library(scda)
+library(scda.2022)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
adae <- synthetic_cdisc_dataset("latest", "adae")
@@ -33,6 +33,7 @@ adae <- df_explicit_na(adae) %>%
For illustrative purposes, we will create a new factor variable in ADAE, `ASEV`, with all intensity levels including `"LIFE THREATENING"`.
```{r pre-processing}
+#| code-fold: show
adae <- adae %>% mutate(ASEV = as.character(AESEV))
adae$ASEV[1:15] <- "LIFE THREATENING"
adae <- adae %>% mutate(ASEV = factor(ASEV, levels = c("MILD", "MODERATE", "SEVERE", "LIFE THREATENING")))
@@ -40,6 +41,9 @@ adae <- adae %>% mutate(ASEV = factor(ASEV, levels = c("MILD", "MODERATE", "SEVE
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
grade_groups <- list("- Any Intensity -" = c("MILD", "MODERATE", "SEVERE", "LIFE THREATENING"))
@@ -102,10 +106,18 @@ result <- lyt %>%
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+
+`r webr_code_labels <- c("setup", "pre-processing", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -113,6 +125,8 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
+
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADAE <- synthetic_cdisc_dataset("latest", "adae")
})
@@ -150,5 +164,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/adverse-events/aet04.qmd b/book/tables/adverse-events/aet04.qmd
index 885019e99e..54e9356b49 100644
--- a/book/tables/adverse-events/aet04.qmd
+++ b/book/tables/adverse-events/aet04.qmd
@@ -5,9 +5,9 @@ subtitle: Adverse Events by Highest NCI CTCAE Grade
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: Adverse Events by Highest NCI CTCAE Grade
library(dplyr)
library(tern)
library(scda)
+library(scda.2022)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
adae <- synthetic_cdisc_dataset("latest", "adae")
@@ -123,6 +124,9 @@ raw_table <- basic_table(show_colcounts = TRUE) %>%
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ACTARM") %>%
@@ -188,8 +192,15 @@ result <- lyt %>%
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with Fill-In
of Treatment Groups
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
adae2 <- adae %>% filter(ACTARM == "A: Drug X")
@@ -257,8 +268,15 @@ result <- lyt %>%
result
```
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with Fill-In
of Grades
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant3, test = list(result_v3 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ACTARM") %>%
@@ -323,8 +341,15 @@ result <- lyt %>%
result
```
+`r webr_code_labels <- c("setup", "variant3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with Collapsing
of Grades
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant4, test = list(result_v4 = "result")}
grade_groups_1 <- list(
"Grade 1-2" = c("1", "2"),
@@ -395,6 +420,10 @@ result <- lyt %>%
result
```
+`r webr_code_labels <- c("setup", "variant4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Using Worst Grade
Flags from ADAE
```{r variant5}
@@ -405,6 +434,9 @@ result
## Table with an Incidence Rate
$\geq$ 40%, Totals Restricted
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant6, test = list(result_v6 = "result")}
# Simple wrapper to return subset ADAE to a threshold of xx%.
get_adae_trimmed <- function(adsl, adae, cutoff_rate) {
@@ -505,17 +537,20 @@ result <- lyt %>%
result
```
-## Table with an Incidence Rate
$\geq$ X%, Totals Unrestricted
+`r webr_code_labels <- c("setup", "variant6")`
+{{< include ../../_utils/webr.qmd >}}
+:::
-```{r variant7}
-#| code-fold: show
+## Table with an Incidence Rate
$\geq$ X%, Totals Unrestricted
-# Variant 7 was not created.
-# With this variant, the SOC level is not trimmed (even if there are no terms left).
-```
+Variant 7 was not created.
+With this variant, the SOC level is not trimmed (even if there are no terms left).
## Table with an Incidence
Rate $\geq$ 58 Patients
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant8, test = list(result_v8 = "result")}
cutoff <- 58L
row_condition <- has_count_in_any_col(atleast = cutoff, col_names = levels(adsl$ACTARM))
@@ -525,8 +560,15 @@ result <- prune_table(raw_table, keep_content_rows(my_row_condition(row_conditio
result
```
+`r webr_code_labels <- c("setup", "variant8")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with a Difference in
Incidence Rate $\geq$ 10%
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant9, test = list(result_v9 = "result")}
cutoff <- 0.1
row_condition <- has_fractions_difference(atleast = cutoff, col_names = levels(adsl$ACTARM))
@@ -536,18 +578,20 @@ result <- prune_table(raw_table, keep_content_rows(my_row_condition(row_conditio
result
```
-## Table with an Incidence Rate
$\geq$ 5%, SOCs \< 5% Removed
+`r webr_code_labels <- c("setup", "variant9")`
+{{< include ../../_utils/webr.qmd >}}
+:::
-```{r variant10}
-#| code-fold: show
+## Table with an Incidence Rate
$\geq$ 5%, SOCs \< 5% Removed
-# Variant 10 was not done
-# With this variant, SOC levels above the threshold are still in the table even if
-# there are no terms left.
-```
+Variant 10 was not done
+With this variant, SOC levels above the threshold are still in the table even if there are no terms left.
## Table with an Incidence Rate $\geq$ 40%,
All SOCs w/o Preferred Terms Removed
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant11, test = list(result_v11 = "result")}
cutoff <- 0.4
row_condition <- has_fraction_in_any_col(atleast = cutoff, col_names = levels(adsl$ACTARM))
@@ -557,10 +601,17 @@ result <- prune_table(raw_table, keep_content_rows(my_row_condition(row_conditio
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant11")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -568,6 +619,8 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
+
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADAE <- synthetic_cdisc_dataset("latest", "adae")
})
@@ -605,5 +658,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/adverse-events/aet04_pi.qmd b/book/tables/adverse-events/aet04_pi.qmd
index 70f97331fd..ee3863e21a 100644
--- a/book/tables/adverse-events/aet04_pi.qmd
+++ b/book/tables/adverse-events/aet04_pi.qmd
@@ -5,15 +5,16 @@ subtitle: Adverse Events Reported in $\geq$ 10% of Patients by Highest NCI CTCAE
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(tern)
@@ -75,6 +76,9 @@ adae_max <- synthetic_cdisc_dataset("latest", "adae") %>%
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
full_table <- full_table_aet04_pi(adsl, adae_max) %>%
sort_at_path(
@@ -97,12 +101,19 @@ result <- full_table %>%
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with Patients Treated with a Particular Treatment by Highest NCI
CTCAE Grade (specifying a treatment for selecting preferred terms)
Note: User needs to specify the column index for filtering the table.
The current example uses the "Any Grade" column for treatment A: Drug X with a filtering threshold at 0.37; AEs reported in greater than 37% of patients in treatment A: Drug X are shown.
This can be changed by varying the parameter values in the `has_fraction_in_cols` function.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
full_table <- full_table_aet04_pi(adsl, adae_max) %>%
sort_at_path(
@@ -125,12 +136,19 @@ result <- full_table %>%
result
```
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Adverse Events Reported in $\geq$ 5% of Patients by
Highest NCI CTCAE Grade (changing the threshold)
Note: User needs to specify the column index for filtering the table.
The current example uses column indices 1, 4, and 7 with a filtering threshold at 0.40 to demonstrate the filtering ability; AEs reported in greater than 40% of patients are shown.
This can be changed by varying the parameter values in the `has_fraction_in_any_col` function.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant3, test = list(result_v3 = "result")}
full_table <- full_table_aet04_pi(adsl, adae_max) %>%
sort_at_path(
@@ -153,11 +171,18 @@ result <- full_table %>%
result
```
+`r webr_code_labels <- c("setup", "variant3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Adverse Events Reported in $\geq$ 5% of Patients and
$\geq$ 2% Difference Between Treatments by Highest
NCI CTCAE Grade (using more than one condition)
Note: User needs to specify the column index for filtering the table.
The current example uses column indices 1, 4, and 7 to filter for AEs reported in $\geq$ 30% of patients and AEs reported with a $\geq$ 15% difference between treatments to demonstrate the filtering ability; this can be changed by varying the parameter values in the `has_fraction_in_any_col` and `has_fractions_difference` functions.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant4, test = list(result_v4 = "result")}
full_table <- full_table_aet04_pi(adsl, adae_max) %>%
sort_at_path(
@@ -182,12 +207,19 @@ result <- full_table %>%
result
```
+`r webr_code_labels <- c("setup", "variant4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Adverse Events Reported in $\geq$ 10% of Patients for Any Grade
or $\geq$ 5% of Patients for Grade 3-4 by Highest NCI CTCAE
Grade (using different condition depending on the grade)
Note: User needs to specify the column index for filtering the table.
The current example filters using column indices 1, 4, and 7 to include AEs reported in $\geq$ 40% of patients and using column indices 2, 5, and 8 to include grade 3-4 AEs reported in $\geq$ 20% of patients.
These thresholds are chosen to demonstrate the filtering ability; they can be changed by varying parameter values in the `has_fraction_in_any_col` function.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant5, test = list(result_v5 = "result")}
full_table <- full_table_aet04_pi(adsl, adae_max) %>%
sort_at_path(
@@ -212,12 +244,19 @@ result <- full_table %>%
result
```
+`r webr_code_labels <- c("setup", "variant5")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Standard Table with
Modified Grade Grouping
Note: User can specify/modify the grouping of grades, as shown in this example.
In addition, the user needs to specify the column index for filtering the table.
The current example uses the "Any Grade" columns with a filtering threshold at 0.40; this can be changed by varying the parameter values in the `has_fraction_in_any_col` function.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant6, test = list(result_v6 = "result")}
grade_groups <- list(
"Any Grade (%)" = c("1", "2", "3", "4", "5"),
@@ -270,12 +309,19 @@ result <- full_table %>%
result
```
+`r webr_code_labels <- c("setup", "variant6")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Standard Table with
Overlapping Grade Groupings
Note: User needs to specify the column index for filtering the table.
The current example uses column indices 1, 5, and 9 with a filtering threshold at 0.40 to demonstrate the filtering ability; any grade AEs reported in greater than 40% of patients are shown.
This can be changed by varying the parameter values in the `has_fraction_in_any_col` function.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant7, test = list(result_v7 = "result")}
grade_groups <- list(
"Any Grade (%)" = c("1", "2", "3", "4", "5"),
@@ -327,12 +373,19 @@ result <- full_table %>%
result
```
+`r webr_code_labels <- c("setup", "variant7")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Standard Table without SOCs
Note: User needs to specify the column index for filtering the table.
The current example uses column indices 1, 4, and 7 with a filtering threshold at 0.20 to demonstrate the filtering ability; any grade AEs (Preferred Terms Only) reported in greater than 20% of patients are shown.
This can be changed by varying the parameter values in the `has_fraction_in_any_col` function.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant8, test = list(result_v8 = "result")}
grade_groups <- list(
"Any Grade (%)" = c("1", "2", "3", "4", "5"),
@@ -368,10 +421,17 @@ result <- full_table %>%
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant8")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -379,6 +439,8 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
+
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADAE <- synthetic_cdisc_dataset("latest", "adae")
})
@@ -423,5 +485,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/adverse-events/aet05.qmd b/book/tables/adverse-events/aet05.qmd
index 555032da07..fd1aa547e0 100644
--- a/book/tables/adverse-events/aet05.qmd
+++ b/book/tables/adverse-events/aet05.qmd
@@ -5,9 +5,9 @@ subtitle: Adverse Event Rate Adjusted for Patient-Years at Risk -- First Occurre
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Adverse Event Rate Adjusted for Patient-Years at Risk -- First Occurre
library(dplyr)
library(scda)
+library(scda.2022)
library(tern)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -32,6 +33,9 @@ anl <- adaette %>%
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ARM") %>%
@@ -46,10 +50,17 @@ result <- build_table(lyt, anl, alt_counts_df = adsl)
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Setting Type of Confidence Interval
The type of confidence interval can be specified through the `conf_type` argument.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ARM") %>%
@@ -68,10 +79,17 @@ result <- build_table(lyt, anl, alt_counts_df = adsl)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -79,7 +97,9 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
library(dplyr)
+
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADAETTE <- synthetic_cdisc_dataset("latest", "adaette")
@@ -127,5 +147,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/adverse-events/aet05_all.qmd b/book/tables/adverse-events/aet05_all.qmd
index 33131f3ce2..c0ece0e99c 100644
--- a/book/tables/adverse-events/aet05_all.qmd
+++ b/book/tables/adverse-events/aet05_all.qmd
@@ -5,9 +5,9 @@ subtitle: Adverse Event Rate Adjusted for Patient-Years at Risk -- All Occurrenc
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Adverse Event Rate Adjusted for Patient-Years at Risk -- All Occurrenc
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -39,6 +40,9 @@ anl <- full_join(anl_tte, anl_events, by = c("USUBJID", "ARM", "ARMCD"))
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ARM") %>%
@@ -52,10 +56,17 @@ result <- build_table(lyt, anl, alt_counts_df = adsl)
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Setting Type of Confidence Interval
The type of confidence interval can be specified through the `conf_type` argument.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ARM") %>%
@@ -69,10 +80,17 @@ result <- build_table(lyt, anl, alt_counts_df = adsl)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -80,7 +98,9 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
library(dplyr)
+
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADAETTE <- synthetic_cdisc_dataset("latest", "adaette")
@@ -135,5 +155,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/adverse-events/aet06.qmd b/book/tables/adverse-events/aet06.qmd
index ad881e2916..5a9c6e9bfd 100644
--- a/book/tables/adverse-events/aet06.qmd
+++ b/book/tables/adverse-events/aet06.qmd
@@ -5,9 +5,9 @@ subtitle: Adverse Events by Baseline Characteristic
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: Adverse Events by Baseline Characteristic
library(dplyr)
library(tern)
library(scda)
+library(scda.2022)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
adae <- synthetic_cdisc_dataset("latest", "adae")
@@ -72,6 +73,9 @@ adsub_bmi <- df_explicit_na(adsub_bmi)
## Adverse Events by Sex
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
split_fun <- drop_split_levels
@@ -124,8 +128,15 @@ result <- build_table(
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Adverse Events by Other Baseline
Characteristics (e.g. Biomarker Group)
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
split_fun <- drop_split_levels
@@ -178,8 +189,15 @@ result <- build_table(
result
```
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Adverse Events by Baseline Characteristic
from ADSUB (e.g. BMI Category)
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant3, test = list(result_v3 = "result")}
split_fun <- drop_split_levels
@@ -232,8 +250,15 @@ result <- build_table(
result
```
+`r webr_code_labels <- c("setup", "variant3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Adverse Events by Regrouped Baseline
Characteristics (e.g. Race)
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant4, test = list(result_v4 = "result")}
split_fun <- drop_split_levels
@@ -287,8 +312,15 @@ result <- build_table(
result
```
+`r webr_code_labels <- c("setup", "variant4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Adverse Events by Baseline Characteristics
(e.g. Sex) Including High-Level Terms
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant5, test = list(result_v5 = "result")}
split_fun <- drop_split_levels
@@ -361,10 +393,17 @@ result <- build_table(
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant5")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -372,6 +411,8 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
+
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADAE <- synthetic_cdisc_dataset("latest", "adae")
@@ -411,5 +452,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/adverse-events/aet06_smq.qmd b/book/tables/adverse-events/aet06_smq.qmd
index 89b59539f8..dd539e5240 100644
--- a/book/tables/adverse-events/aet06_smq.qmd
+++ b/book/tables/adverse-events/aet06_smq.qmd
@@ -5,9 +5,9 @@ subtitle: Adverse Events by Baseline Characteristic, by SMQ and Preferred Term
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: Adverse Events by Baseline Characteristic, by SMQ and Preferred Term
library(dplyr)
library(tern)
library(scda)
+library(scda.2022)
library(stringr)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -97,6 +98,9 @@ adae_smq_1 <- adae_smq_all %>%
## Adverse Events by Sex,
by SMQ and Preferred Term
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
criteria_fun <- function(tr) !is(tr, "ContentRow") && all_zero_or_na(tr)
@@ -139,8 +143,15 @@ result <- build_table(
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Adverse Events by Sex, by SMQ and
Preferred Term (with Customized Queries)
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
criteria_fun <- function(tr) {
!is(tr, "ContentRow") && all_zero_or_na(tr) && !grepl("Total number of", obj_label(tr))
@@ -191,8 +202,15 @@ result <- build_table(
result
```
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Adverse Events by Other Baseline
Characteristics (e.g. Age Group)
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant3, test = list(result_v3 = "result")}
criteria_fun <- function(tr) !is(tr, "ContentRow") && all_zero_or_na(tr)
@@ -235,10 +253,17 @@ result <- build_table(
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -246,7 +271,9 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
library(dplyr)
+
ADSL <- synthetic_cdisc_dataset("latest", "adsl") %>%
mutate(
AGE65 = case_when(
@@ -316,5 +343,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/adverse-events/aet07.qmd b/book/tables/adverse-events/aet07.qmd
index 147dea78b9..917b1465ec 100644
--- a/book/tables/adverse-events/aet07.qmd
+++ b/book/tables/adverse-events/aet07.qmd
@@ -5,9 +5,9 @@ subtitle: Adverse Events Resulting in Death
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
For illustrative purposes, we will pre-process `AESDTH` in ADAE so there are no deaths in arm A and concatenate `AEBODSYS` and `AEDECOD` as per GDSR output standards for AET07.
@@ -18,6 +18,7 @@ For illustrative purposes, we will pre-process `AESDTH` in ADAE so there are no
library(dplyr)
library(tern)
library(scda)
+library(scda.2022)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
adae <- synthetic_cdisc_dataset("latest", "adae")
@@ -42,6 +43,9 @@ adae_f <- adae %>%
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
# Define the split function
split_fun <- drop_split_levels
@@ -74,8 +78,15 @@ result <- build_table(
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with Fill-In of Treatment Groups without Deaths
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ACTARM") %>%
@@ -105,18 +116,27 @@ result <- build_table(
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
## Data reproducible code
data <- teal_data()
data <- within(data, {
- library(dplyr)
library(scda)
+ library(scda.2022)
+ library(dplyr)
+
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADAE <- synthetic_cdisc_dataset("latest", "adae")
@@ -181,5 +201,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/adverse-events/aet09.qmd b/book/tables/adverse-events/aet09.qmd
index 61e68766c2..b21eef9b85 100644
--- a/book/tables/adverse-events/aet09.qmd
+++ b/book/tables/adverse-events/aet09.qmd
@@ -5,9 +5,9 @@ subtitle: Adverse Events Related to Study Drug
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: Adverse Events Related to Study Drug
library(dplyr)
library(tern)
library(scda)
+library(scda.2022)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
adae <- synthetic_cdisc_dataset("latest", "adae")
@@ -34,6 +35,9 @@ var_labels(adae_f) <- adae_labels
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
# Define the split function
split_fun <- drop_split_levels
@@ -92,8 +96,15 @@ result <- tbl1 %>%
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Including High-Level Terms
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(var = "ARM") %>%
@@ -169,10 +180,17 @@ result <- tbl2 %>%
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -180,6 +198,8 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
+
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADAE <- synthetic_cdisc_dataset("latest", "adae")
@@ -220,5 +240,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/adverse-events/aet09_smq.qmd b/book/tables/adverse-events/aet09_smq.qmd
index 0356812338..e30063dc31 100644
--- a/book/tables/adverse-events/aet09_smq.qmd
+++ b/book/tables/adverse-events/aet09_smq.qmd
@@ -5,9 +5,9 @@ subtitle: Adverse Events Related to Study Drug by Standardized MedDRA Query
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: Adverse Events Related to Study Drug by Standardized MedDRA Query
library(dplyr)
library(tern)
library(scda)
+library(scda.2022)
library(stringr)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -74,6 +75,9 @@ adae_smq_1 <- adae_smq_all %>%
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
criteria_fun <- function(tr) !is(tr, "ContentRow") && all_zero_or_na(tr)
@@ -121,8 +125,15 @@ result <- build_table(
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with Customized Queries
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
criteria_fun <- function(tr) {
!is(tr, "ContentRow") && all_zero_or_na(tr) && !grepl("Total number of", obj_label(tr))
@@ -177,10 +188,17 @@ result <- build_table(
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
Note that filtering AEs for relatedness to study drug is not a necessary data pre-processing step for the module.
It can be achieved using the `teal` module filter panel.
The example here pre-sets the filters using `AEREL = "Y"` in `adae`.
@@ -192,6 +210,8 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
+
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADAE <- synthetic_cdisc_dataset("latest", "adae")
})
@@ -242,5 +262,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/adverse-events/aet10.qmd b/book/tables/adverse-events/aet10.qmd
index 2ec4930945..d5e7bcd518 100644
--- a/book/tables/adverse-events/aet10.qmd
+++ b/book/tables/adverse-events/aet10.qmd
@@ -5,9 +5,9 @@ subtitle: Most Common ($\geq$ 5%) Adverse Events
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: Most Common ($\geq$ 5%) Adverse Events
library(tern)
library(dplyr)
library(scda)
+library(scda.2022)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
adae <- synthetic_cdisc_dataset("latest", "adae")
@@ -29,6 +30,9 @@ adae <- df_explicit_na(adae)
The "All Patients" column is not required in this table but for illustrative purposes we include it to show correct sorting.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(
@@ -62,8 +66,15 @@ result <- sort_at_path(
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Most Common ($\geq$ 35%) Adverse Events (setting threshold)
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(
@@ -97,10 +108,17 @@ result <- sort_at_path(
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
The desired frequency is specified in `prune_freq`.
For illustration, frequency is set to $\geq$ 35%.
@@ -111,6 +129,8 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
+
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADAE <- synthetic_cdisc_dataset("latest", "adae")
@@ -151,5 +171,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/concomitant-medications/cmt01.qmd b/book/tables/concomitant-medications/cmt01.qmd
index ea1703a0d5..aa9420a4b1 100644
--- a/book/tables/concomitant-medications/cmt01.qmd
+++ b/book/tables/concomitant-medications/cmt01.qmd
@@ -5,9 +5,9 @@ subtitle: Concomitant Medications (GNEDrug Legacy Coding)
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: Concomitant Medications (GNEDrug Legacy Coding)
library(dplyr)
library(tern)
library(scda)
+library(scda.2022)
# The following tables require ADCM data structure that follows the legacy concomitant medication coding.
# WHO coding is not used.
@@ -40,6 +41,9 @@ adcm_prior <- adcm %>%
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
# Define the split function
split_fun <- drop_split_levels
@@ -87,8 +91,15 @@ result <- build_table(
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Showing Medications Prior
to the Start of the Study
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(var = "ARM") %>%
@@ -132,7 +143,14 @@ result <- build_table(
result
```
-Table with Subtotal Per
Medication Class Suppressed
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+## Table with Subtotal Per
Medication Class Suppressed
+
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
```{r variant3, test = list(result_v3 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
@@ -173,8 +191,15 @@ result <- build_table(
result
```
+`r webr_code_labels <- c("setup", "variant3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Sorted by Total Column Showing
Additional "All Patients" Column
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant4, test = list(result_v4 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(var = "ARM") %>%
@@ -226,10 +251,17 @@ result <- build_table(
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
Here, `adcm` is processed to keep only one path per treatment.
```{r teal, opts.label = c("skip_if_testing", "app")}
@@ -239,6 +271,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
library(dplyr)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
@@ -285,5 +318,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/concomitant-medications/cmt01a.qmd b/book/tables/concomitant-medications/cmt01a.qmd
index fab56a3792..be7b5e7501 100644
--- a/book/tables/concomitant-medications/cmt01a.qmd
+++ b/book/tables/concomitant-medications/cmt01a.qmd
@@ -5,9 +5,9 @@ subtitle: Concomitant Medications by Medication Class and Preferred Name
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: Concomitant Medications by Medication Class and Preferred Name
library(dplyr)
library(tern)
library(scda)
+library(scda.2022)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
adcm <- synthetic_cdisc_dataset("latest", "adcm")
@@ -36,6 +37,9 @@ adcm <- adcm %>%
## Standard Table,
Safety-Evaluable Patients
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
split_fun <- drop_split_levels
@@ -81,8 +85,15 @@ result <- build_table(lyt = lyt, df = adcm, alt_counts_df = adsl) %>%
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Changing
ATC Class Level
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
split_fun <- drop_split_levels
@@ -128,8 +139,15 @@ result <- build_table(lyt = lyt, df = adcm, alt_counts_df = adsl) %>%
result
```
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with Classes
Sorted by Frequency
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant3, test = list(result_v3 = "result")}
split_fun <- drop_split_levels
@@ -172,8 +190,15 @@ result <- build_table(lyt = lyt, df = adcm, alt_counts_df = adsl) %>%
result
```
+`r webr_code_labels <- c("setup", "variant3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with Total Number of Treatments
per Medication Class Suppressed
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant4, test = list(result_v4 = "result")}
split_fun <- drop_split_levels
@@ -218,10 +243,17 @@ result <- build_table(lyt = lyt, df = adcm, alt_counts_df = adsl) %>%
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -230,8 +262,8 @@ adcm_keys <- c("STUDYID", "USUBJID", "ASTDTM", "CMSEQ", "ATC1", "ATC2", "ATC3",
## Data reproducible code
data <- teal_data()
data <- within(data, {
- library(dplyr)
library(scda)
+ library(scda.2022)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADCM <- synthetic_cdisc_dataset("latest", "adcm")
@@ -278,5 +310,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/concomitant-medications/cmt01b.qmd b/book/tables/concomitant-medications/cmt01b.qmd
index 9b96ff890e..9996b2c2e2 100644
--- a/book/tables/concomitant-medications/cmt01b.qmd
+++ b/book/tables/concomitant-medications/cmt01b.qmd
@@ -5,9 +5,9 @@ subtitle: Concomitant Medications by Medication Class and Preferred Name
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: Concomitant Medications by Medication Class and Preferred Name
library(dplyr)
library(tern)
library(scda)
+library(scda.2022)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
adcm <- synthetic_cdisc_dataset("latest", "adcm")
@@ -35,6 +36,9 @@ adcm <- adcm %>%
## Standard Table with
\> 1 ATC Class Level
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
split_fun <- drop_split_levels
@@ -108,8 +112,15 @@ result <- build_table(
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Changing
Class Levels
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
split_fun <- drop_split_levels
@@ -167,6 +178,10 @@ result <- build_table(
result
```
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with Classes
Sorted by Frequency
```{r variant3}
@@ -177,6 +192,9 @@ result
## Table with Total Number of
Treatments per Medication
Class Suppressed
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant4, test = list(result_v4 = "result")}
split_fun <- drop_split_levels
@@ -249,10 +267,17 @@ result <- build_table(
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -261,8 +286,8 @@ adcm_keys <- c("STUDYID", "USUBJID", "ASTDTM", "CMSEQ", "ATC1", "ATC2", "ATC3",
## Data reproducible code
data <- teal_data()
data <- within(data, {
- library(dplyr)
library(scda)
+ library(scda.2022)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADCM <- synthetic_cdisc_dataset("latest", "adcm")
@@ -308,5 +333,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/concomitant-medications/cmt02_pt.qmd b/book/tables/concomitant-medications/cmt02_pt.qmd
index a91adaae06..34681f53aa 100644
--- a/book/tables/concomitant-medications/cmt02_pt.qmd
+++ b/book/tables/concomitant-medications/cmt02_pt.qmd
@@ -5,9 +5,9 @@ subtitle: Concomitant Medications by Preferred Name (WHODrug Coding)
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: Concomitant Medications by Preferred Name (WHODrug Coding)
library(dplyr)
library(tern)
library(scda)
+library(scda.2022)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
adcm <- synthetic_cdisc_dataset("latest", "adcm")
@@ -37,6 +38,9 @@ adcm <- adcm %>% filter(ATIREL == "CONCOMITANT")
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
split_fun <- drop_split_levels
@@ -65,10 +69,17 @@ result <- build_table(lyt = lyt, df = adcm, alt_counts_df = adsl) %>%
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -77,8 +88,8 @@ adcm_keys <- c("STUDYID", "USUBJID", "ASTDTM", "CMSEQ", "ATC1", "ATC2", "ATC3",
## Data reproducible code
data <- teal_data()
data <- within(data, {
- library(dplyr)
library(scda)
+ library(scda.2022)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADCM <- synthetic_cdisc_dataset("latest", "adcm")
@@ -125,5 +136,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/deaths/dtht01.qmd b/book/tables/deaths/dtht01.qmd
index d637440c8b..c09d889b34 100644
--- a/book/tables/deaths/dtht01.qmd
+++ b/book/tables/deaths/dtht01.qmd
@@ -5,9 +5,9 @@ subtitle: Deaths
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Deaths
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -28,6 +29,9 @@ adsl$DTHCAT <- factor(adsl$DTHCAT, levels = c("ADVERSE EVENT", "PROGRESSIVE DISE
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ACTARM", split_fun = add_overall_level("All Patients", first = FALSE)) %>%
@@ -43,8 +47,15 @@ result <- build_table(lyt, df = adsl)
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Selecting
Sections to Display
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ACTARM", split_fun = add_overall_level("All Patients", first = FALSE)) %>%
@@ -81,8 +92,15 @@ result <- build_table(lyt, df = adsl) %>% prune_table()
result
```
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table for Studies Collecting Death
Information from Public Records
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant3, test = list(result_v3 = "result")}
dthcaus_levels <- levels(adsl[adsl$DTHCAT == "OTHER", ]$DTHCAUS)
@@ -126,8 +144,15 @@ result <- build_table(lyt, df = adsl)
result
```
+`r webr_code_labels <- c("setup", "variant3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Adding Details for "All other causes"
Category for Studies Collecting Death
Information from Public Records
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant4, test = list(result_v4 = "result")}
dthcaus_levels <- levels(adsl[adsl$DTHCAT == "OTHER", ]$DTHCAUS)
@@ -181,7 +206,11 @@ result <- build_table(lyt, df = adsl)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -192,4 +221,5 @@ result
```
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/tables/demography/dmt01.qmd b/book/tables/demography/dmt01.qmd
index 6e019ffa92..773f379e52 100644
--- a/book/tables/demography/dmt01.qmd
+++ b/book/tables/demography/dmt01.qmd
@@ -5,9 +5,9 @@ subtitle: Demographics and Baseline Characteristics
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Demographics and Baseline Characteristics
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
library(tidyr)
@@ -87,6 +88,9 @@ adsl <- adsl %>%
## Table with an Additional
Study-Specific Continuous Variable
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
vars <- c("AGE", "AGEGR1", "SEX", "ETHNIC", "RACE", "BMRKR1")
var_labels <- c(
@@ -110,8 +114,15 @@ result <- basic_table(show_colcounts = TRUE) %>%
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with an Additional
Study-Specific Categorical Variable
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
vars <- c("AGE", "AGEGR1", "SEX", "ETHNIC", "RACE", "BMRKR1_CAT")
var_labels <- c(
@@ -134,8 +145,15 @@ result <- basic_table(show_colcounts = TRUE) %>%
result
```
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with Subgrouping
for Some Analyses
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant3, test = list(result_v3 = "result")}
split_fun <- drop_split_levels
@@ -154,8 +172,15 @@ result <- basic_table(show_colcounts = TRUE) %>%
result
```
+`r webr_code_labels <- c("setup", "variant3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with Additional Vital
Signs Baseline Values
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant4, test = list(result_v4 = "result")}
result <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(var = "ACTARM") %>%
@@ -174,8 +199,15 @@ result <- basic_table(show_colcounts = TRUE) %>%
result
```
+`r webr_code_labels <- c("setup", "variant4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with Additional
Values from ADSUB
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant5, test = list(result_v5 = "result")}
result <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(var = "ACTARM") %>%
@@ -193,10 +225,17 @@ result <- basic_table(show_colcounts = TRUE) %>%
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant5")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -204,6 +243,8 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
+
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
# Include `EOSDY` and `DCSREAS` variables below because they contain missing data.
@@ -236,5 +277,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/disclosures/disclosurest01.qmd b/book/tables/disclosures/disclosurest01.qmd
index 1a9abf6a35..baca277361 100644
--- a/book/tables/disclosures/disclosurest01.qmd
+++ b/book/tables/disclosures/disclosurest01.qmd
@@ -5,16 +5,17 @@ subtitle: Disclosures Outputs
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Patient Disposition Table
(CTgov & EudraCT)
#### Data Setup
-```{r setup, message = FALSE}
+```{r setup1, message = FALSE}
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -91,6 +92,9 @@ adsl0 <- adsl %>%
#### Patient Disposition Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
# Define the split function
split_fun <- keep_split_levels("Y")
@@ -123,13 +127,18 @@ result <- build_table(lyt = lyt, df = adsl0)
result
```
+`r webr_code_labels <- c("setup1", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Demographic Table
(CTgov & EudraCT)
#### Data Setup
-```{r}
+```{r setup2, message = FALSE}
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -159,6 +168,9 @@ adsl <- adsl %>%
#### Demographic Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
vars <- c("AGE", "AGEGRP", "SEX", "RACE", "ETHNIC")
var_labels <- c("Age (yr)", "Age group", "Sex", "Race", "Ethnicity")
@@ -175,13 +187,18 @@ result <- build_table(lyt = lyt, df = adsl)
result
```
+`r webr_code_labels <- c("setup2", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Enrollment by Country
Table (EudraCT only)
#### Data Setup
-```{r}
+```{r setup3, message = FALSE}
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -199,6 +216,9 @@ var_labels(adsl) <- c(adsl_labels)
#### Enrollment by Country Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant3, test = list(result_v3 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ARM") %>%
@@ -210,15 +230,20 @@ result <- build_table(lyt, adsl)
result
```
+`r webr_code_labels <- c("setup3", "variant3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Non-Serious Adverse Events
Reported in $\geq$ 5% of Patients in Any
Treatment Group (CTgov & EudraCT)
#### Data Setup
Trimming function `get_adae_trimmed` is defined to filter AEs with greater than 5% incidence rate.
-```{r}
+```{r setup4, message = FALSE}
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -267,6 +292,9 @@ adae_trim <- get_adae_trimmed(adsl, adae_nonser, cutoff_rate = 0.05)
#### Non-Serious Adverse Events Report in $\geq$ 5% of Patients in Any Treatment Group
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant4, test = list(result_v4 = "result")}
# Define the split function
split_fun <- drop_split_levels
@@ -292,15 +320,20 @@ result <- build_table(lyt, adae_trim)
result
```
+`r webr_code_labels <- c("setup4", "variant4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Serious Adverse Events, Fatal SAEs
and SAEs Related to Study Medication,
by Treatment Group (CTgov & EudraCT)
For illustrative purposes, the `adae` data is filtered by arm "A: Drug X" here.
#### Data Setup
-```{r}
+```{r setup5, message = FALSE}
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
adae <- synthetic_cdisc_dataset("latest", "adae")
@@ -320,6 +353,9 @@ filters_list <- list(
#### Serious Adverse Events, Fatal SAEs and SAEs Related to Study Medication, by Treatment Group
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant5, test = list(result_v5 = "result")}
# Define the split function
split_fun <- drop_split_levels
@@ -351,13 +387,18 @@ result <- build_table(lyt, adae_serious_arm)
result
```
+`r webr_code_labels <- c("setup5", "variant5")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Death Table
(EudraCT only)
#### Data Setup
-```{r}
+```{r setup6, message = FALSE}
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -366,6 +407,9 @@ adae <- synthetic_cdisc_dataset("latest", "adae")
#### Death Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant6, test = list(result_v6 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ARM") %>%
@@ -380,7 +424,12 @@ result <- build_table(lyt, adae, alt_counts_df = adsl)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup6", "variant6")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/tables/disclosures/eudrat01.qmd b/book/tables/disclosures/eudrat01.qmd
index 80007bebfa..60bdc3f53e 100644
--- a/book/tables/disclosures/eudrat01.qmd
+++ b/book/tables/disclosures/eudrat01.qmd
@@ -5,9 +5,9 @@ subtitle: Non-Serious Adverse Events Reported in $\geq$ 5% of Patients in Any Tr
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
Define a trimming function `get_adae_trimmed` to filter for AEs of greater than 5% incidence rate.
@@ -17,6 +17,7 @@ Define a trimming function `get_adae_trimmed` to filter for AEs of greater than
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -65,6 +66,9 @@ adae_trim <- get_adae_trimmed(adsl, adae_nonser, cutoff_rate = 0.05)
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
# Define the split function
split_fun <- drop_split_levels
@@ -90,7 +94,11 @@ result <- build_table(lyt, adae_trim)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -101,4 +109,5 @@ result
```
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/tables/disclosures/eudrat02.qmd b/book/tables/disclosures/eudrat02.qmd
index 06a9658f0c..498c1c6b40 100644
--- a/book/tables/disclosures/eudrat02.qmd
+++ b/book/tables/disclosures/eudrat02.qmd
@@ -5,9 +5,9 @@ subtitle: Serious Adverse Events, Fatal Serious Adverse Events, and Serious Adve
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
For illustrative purposes, the `adae` data is filtered by arm `A: Drug X` here.
@@ -17,6 +17,7 @@ For illustrative purposes, the `adae` data is filtered by arm `A: Drug X` here.
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
adae <- synthetic_cdisc_dataset("latest", "adae")
@@ -36,6 +37,9 @@ filters_list <- list(
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
# Define the split function
split_fun <- drop_split_levels
@@ -67,7 +71,11 @@ result <- build_table(lyt, adae_serious_arm)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -79,4 +87,4 @@ result
{{< include ../../repro.qmd >}}
-:::
+::::
diff --git a/book/tables/disposition/dst01.qmd b/book/tables/disposition/dst01.qmd
index 68f76ec716..da6c08e7b0 100644
--- a/book/tables/disposition/dst01.qmd
+++ b/book/tables/disposition/dst01.qmd
@@ -5,9 +5,9 @@ subtitle: Patient Disposition
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Patient Disposition
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
set.seed(1, kind = "Mersenne-Twister")
@@ -43,6 +44,9 @@ adsl_eotstt_added <- adsl_gp_added %>%
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result1")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(
@@ -65,8 +69,15 @@ result1 <- build_table(lyt = lyt, df = adsl)
result1
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with Grouping of Reasons
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result2")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(
@@ -91,8 +102,15 @@ result2 <- prune_table(tbl) # remove rows containing all zeros
result2
```
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Adding Optional Rows
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant3, test = list(result_v3 = "result3")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(
@@ -114,10 +132,17 @@ result3 <- rbind(result2, tbl)
result3
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -125,6 +150,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
library(dplyr)
set.seed(1, kind = "Mersenne-Twister")
@@ -178,5 +204,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/disposition/pdt01.qmd b/book/tables/disposition/pdt01.qmd
index 2d096e2d9c..22ae587327 100644
--- a/book/tables/disposition/pdt01.qmd
+++ b/book/tables/disposition/pdt01.qmd
@@ -5,9 +5,9 @@ subtitle: Major Protocol Deviations
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: Major Protocol Deviations
library(dplyr)
library(tern)
library(scda)
+library(scda.2022)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
addv <- synthetic_cdisc_dataset("latest", "addv")
@@ -33,6 +34,9 @@ addv <- addv %>%
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
split_fun <- drop_split_levels
@@ -62,18 +66,25 @@ result <- build_table(lyt = lyt, df = addv, alt_counts_df = adsl) %>%
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
## Data reproducible code
data <- teal_data()
data <- within(data, {
- library(dplyr)
library(scda)
+ library(scda.2022)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADDV <- synthetic_cdisc_dataset("latest", "addv")
@@ -114,5 +125,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/disposition/pdt02.qmd b/book/tables/disposition/pdt02.qmd
index fcea9c434d..3ab4ee01ca 100644
--- a/book/tables/disposition/pdt02.qmd
+++ b/book/tables/disposition/pdt02.qmd
@@ -5,15 +5,16 @@ subtitle: Major Protocol Deviations Related to Epidemic/Pandemic
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(tern)
library(dplyr)
@@ -33,6 +34,9 @@ addv_pan <- addv %>%
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ACTARM") %>%
@@ -63,7 +67,11 @@ result <- build_table(lyt, addv_pan, alt_counts_df = adsl)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -74,4 +82,5 @@ result
```
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/tables/efficacy/aovt01.qmd b/book/tables/efficacy/aovt01.qmd
index d8ecc44d65..eb3cc8854d 100644
--- a/book/tables/efficacy/aovt01.qmd
+++ b/book/tables/efficacy/aovt01.qmd
@@ -5,15 +5,16 @@ subtitle: ANCOVA for Multiple End Points
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(tern)
library(dplyr)
@@ -29,6 +30,9 @@ adqs_multi <- filter(adqs, AVISIT == "WEEK 1 DAY 8")
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
# Define the split function
split_fun <- drop_split_levels
@@ -59,10 +63,17 @@ result <- build_table(
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -70,6 +81,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADQS <- synthetic_cdisc_dataset("latest", "adqs")
@@ -131,5 +143,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/efficacy/aovt02.qmd b/book/tables/efficacy/aovt02.qmd
index 5ac6d72fcc..23d6093672 100644
--- a/book/tables/efficacy/aovt02.qmd
+++ b/book/tables/efficacy/aovt02.qmd
@@ -5,18 +5,19 @@ subtitle: ANCOVA with Single End Point and Customized Table
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
This example will focus on data from a single visit "WEEK 1 DAY 8" and a single endpoint "FKSI-FWB".
Only evaluable populations will be analyzed.
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(tern)
library(dplyr)
@@ -37,6 +38,9 @@ adqs_single <- adqs %>%
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ARMCD", ref_group = "ARM A") %>%
@@ -66,10 +70,17 @@ result <- build_table(
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -77,7 +88,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
- library(dplyr)
+ library(scda.2022)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADQS <- synthetic_cdisc_dataset("latest", "adqs")
@@ -138,5 +149,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/efficacy/aovt03.qmd b/book/tables/efficacy/aovt03.qmd
index 6797c9cce2..310e379eef 100644
--- a/book/tables/efficacy/aovt03.qmd
+++ b/book/tables/efficacy/aovt03.qmd
@@ -5,17 +5,18 @@ subtitle: ANCOVA with Consideration of Interaction
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
This example will focus on data from multiple visits and take the interaction between visits and arms into consideration.
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(tern)
library(dplyr)
@@ -31,6 +32,9 @@ adqs_in <- adqs %>%
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
result <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ARMCD", ref_group = "ARM A") %>%
@@ -67,7 +71,11 @@ result <- basic_table(show_colcounts = TRUE) %>%
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -79,4 +87,4 @@ result
{{< include ../../repro.qmd >}}
-:::
+::::
diff --git a/book/tables/efficacy/cfbt01.qmd b/book/tables/efficacy/cfbt01.qmd
index 40a89077e4..15c2ca985f 100644
--- a/book/tables/efficacy/cfbt01.qmd
+++ b/book/tables/efficacy/cfbt01.qmd
@@ -5,15 +5,16 @@ subtitle: Efficacy Data and Change from Baseline by Visit
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(tern)
library(dplyr)
@@ -37,6 +38,9 @@ split_fun <- drop_split_levels
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
afun <- function(x, .var, .spl_context, ...) {
n_fun <- sum(!is.na(x), na.rm = TRUE)
@@ -87,10 +91,17 @@ result <- build_table(lyt, adqs)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -98,6 +109,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADQS <- synthetic_cdisc_dataset("latest", "adqs")
@@ -151,5 +163,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/efficacy/cmht01.qmd b/book/tables/efficacy/cmht01.qmd
index 20180ece99..875aa2a542 100644
--- a/book/tables/efficacy/cmht01.qmd
+++ b/book/tables/efficacy/cmht01.qmd
@@ -5,9 +5,9 @@ subtitle: Cochran-Mantel-Haenszel (CMH) Summary
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Cochran-Mantel-Haenszel (CMH) Summary
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -27,6 +28,9 @@ adqs <- df_explicit_na(adqs)
## Table of Single Parameter
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result"), opts.label = ifelse(packageVersion("survival") < "3.5-8", "skip_test_strict", "")}
anl_01 <- adqs %>%
@@ -75,8 +79,15 @@ result <- build_table(
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table of Multiple Parameters
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result"), opts.label = ifelse(packageVersion("survival") < "3.5-8", "skip_test_strict", "")}
anl_02 <- adqs %>%
@@ -136,10 +147,17 @@ result <- build_table(
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -147,6 +165,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADRS <- synthetic_cdisc_dataset("latest", "adrs")
@@ -189,5 +208,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/efficacy/coxt01.qmd b/book/tables/efficacy/coxt01.qmd
index 226c249c1a..bf00cafdf0 100644
--- a/book/tables/efficacy/coxt01.qmd
+++ b/book/tables/efficacy/coxt01.qmd
@@ -5,19 +5,20 @@ subtitle: Cox Regression
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
Cox models are the most commonly used methods to estimate the magnitude of the effect in survival analyses.
It assumes proportional hazards; that is, it assumes that the ratio of the hazards of the two groups (e.g. two arms) is constant over time.
This ratio is referred to as the "hazard ratio" and is one of the most commonly reported metrics to describe the effect size in survival analysis.
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(tern)
@@ -56,6 +57,9 @@ All variables specified within `variables` must be present in the data used when
To see the same model as a `data.frame` object, these three arguments (as well as the data) can be passed to the `fit_coxreg_univar` function, and the resulting list tidied using `broom::tidy()`.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
variables <- list(
time = "AVAL",
@@ -73,11 +77,18 @@ result <- build_table(lyt = lyt, df = anl)
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Cox Regression
with Interaction Term
The argument `control` can be used to modify standard outputs; `control_coxreg()` helps in adopting the right settings (see `?control_coxreg`).
For instance, `control` is used to include the interaction terms.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
variables <- list(
time = "AVAL",
@@ -99,12 +110,19 @@ result <- build_table(lyt = lyt, df = anl)
result
```
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Cox Regression
Specifying Covariates
The optional argument `at` allows the user to provide the expected level of estimation for the interaction when the predictor is a quantitative variable.
For instance, it might be relevant to choose the age at which the hazard ratio should be estimated.
If no input is provided to `at`, the median value is used in the row name (as in the previous tab).
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant3, test = list(result_v3 = "result")}
variables <- list(
time = "AVAL",
@@ -127,11 +145,18 @@ result <- build_table(lyt = lyt, df = anl)
result
```
+`r webr_code_labels <- c("setup", "variant3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Cox Regression Setting
Strata, Ties, Alpha Level
Additional controls can be customized using `control_coxreg` (see `?control_coxreg`) such as the ties calculation method and the confidence level.
Stratification variables can be added via the `strata` element of the `variables` list.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant4, test = list(result_v4 = "result")}
variables <- list(
time = "AVAL",
@@ -161,10 +186,17 @@ result <- build_table(lyt = lyt, df = anl)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -183,6 +215,7 @@ arm_ref_comp <- list(
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADTTE <- synthetic_cdisc_dataset("latest", "adtte")
@@ -223,5 +256,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/efficacy/coxt02.qmd b/book/tables/efficacy/coxt02.qmd
index c6d63e8161..2692540660 100644
--- a/book/tables/efficacy/coxt02.qmd
+++ b/book/tables/efficacy/coxt02.qmd
@@ -5,7 +5,7 @@ subtitle: Multivariable Cox Regression
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
Analysis based on multivariable Cox models is usually not performed for the Clinical Study Report (CSR) or regulatory documents, serving exploratory purposes only (e.g. for publication).
In practice, the model usually includes only the main effects (without interaction terms).
@@ -13,13 +13,14 @@ It produces the estimates for each of the covariates included in the model.
The analysis follows the same principles (i.e. stratified vs. unstratified analysis and tie handling) as the general Cox model analysis also used in `COXT01`.
Since there is usually no pre-specified hypothesis testing for such analysis, the p-values must be interpreted with caution.
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(tern)
library(broom)
@@ -58,6 +59,9 @@ All variables specified within `variables` must be present in the data used when
To see the same model as a `data.frame` object, these two arguments (as well as the data) can be passed to the `fit_coxreg_multivar` function, and the resulting list tidied using `broom::tidy()`.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
variables <- list(
time = "AVAL",
@@ -74,6 +78,10 @@ result <- build_table(lyt = lyt, df = anl)
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Multivariable Cox Regression
with Interaction Term
The estimation of interaction terms is not supported.
@@ -101,6 +109,9 @@ See the *Multivariable Cox Regression with Interaction Term* tab for more detail
Additional controls can be customized using `control_coxreg` (see `?control_coxreg`) such as the ties calculation method and the confidence level.
Stratification variables can be added via the `strata` element of the `variables` list.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
variables <- list(
time = "AVAL",
@@ -128,14 +139,21 @@ result <- build_table(lyt = lyt, df = anl)
result
```
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Multivariable Cox Regression
with Selection Process for Covariates
See the *Multivariable Cox Regression with Interaction Term* tab.
-{{< include ../../test-utils/save_results.qmd >}}
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -143,6 +161,8 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
+
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADTTE <- synthetic_cdisc_dataset("latest", "adtte")
})
@@ -188,5 +208,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/efficacy/dort01.qmd b/book/tables/efficacy/dort01.qmd
index 9b799c21f2..2d4ab97b2f 100644
--- a/book/tables/efficacy/dort01.qmd
+++ b/book/tables/efficacy/dort01.qmd
@@ -5,15 +5,16 @@ subtitle: Duration of Response
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(tern)
library(dplyr)
@@ -43,6 +44,9 @@ adtte_f <- adtte %>%
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(var = "ARM", ref_group = "A: Drug X") %>%
@@ -94,8 +98,15 @@ result <- build_table(lyt, df = adtte_f, alt_counts_df = adsl) %>%
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Selecting
Sections to Display
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(var = "ARM", ref_group = "A: Drug X") %>%
@@ -149,8 +160,15 @@ result <- build_table(lyt, df = adtte_f, alt_counts_df = adsl) %>%
result
```
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Modifying Analysis Details
like Conf. Type and Alpha Level
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant3, test = list(result_v3 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(var = "ARM", ref_group = "A: Drug X") %>%
@@ -204,8 +222,15 @@ result <- build_table(lyt, df = adtte_f, alt_counts_df = adsl) %>%
result
```
+`r webr_code_labels <- c("setup", "variant3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Modifying Time Point for
the "XX Months duration" Analysis
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant4, test = list(result_v4 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(var = "ARM", ref_group = "A: Drug X") %>%
@@ -257,10 +282,17 @@ result <- build_table(lyt, df = adtte_f, alt_counts_df = adsl) %>%
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -268,7 +300,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
- library(tern)
+ library(scda.2022)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADTTE <- synthetic_cdisc_dataset("latest", "adtte")
@@ -328,5 +360,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/efficacy/lgrt02.qmd b/book/tables/efficacy/lgrt02.qmd
index d0d5451cd7..1023f52fbd 100644
--- a/book/tables/efficacy/lgrt02.qmd
+++ b/book/tables/efficacy/lgrt02.qmd
@@ -5,15 +5,16 @@ subtitle: Multi-Variable Logistic Regression
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(tern)
@@ -45,6 +46,9 @@ adrs <- adrs %>%
## Multi-Variable Logistic Regression
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
model <- fit_logistic(
adrs,
@@ -66,8 +70,15 @@ result <- basic_table() %>%
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Multi-Variable Logistic Regression
with Interaction Term
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
model <- fit_logistic(
adrs,
@@ -94,8 +105,15 @@ result <- basic_table() %>%
result
```
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Multi-Variable Logistic Regression
Specifying Covariates
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant3, test = list(result_v3 = "result")}
model <- fit_logistic(
adrs,
@@ -121,8 +139,15 @@ result <- basic_table() %>%
result
```
+`r webr_code_labels <- c("setup", "variant3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Multi-Variable Logistic Regression Setting
an Event, Alpha Level, and Level for Interaction
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant4, test = list(result_v4 = "result")}
model <- fit_logistic(
adrs,
@@ -150,10 +175,17 @@ result <- basic_table() %>%
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -161,6 +193,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
library(dplyr)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
@@ -211,5 +244,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/efficacy/mmrmt01.qmd b/book/tables/efficacy/mmrmt01.qmd
index 54f6c6b0fc..44ed9bf83d 100644
--- a/book/tables/efficacy/mmrmt01.qmd
+++ b/book/tables/efficacy/mmrmt01.qmd
@@ -5,9 +5,9 @@ subtitle: Tables for Mixed-Effect Model Repeated Measures Analysis
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: Tables for Mixed-Effect Model Repeated Measures Analysis
library(dplyr)
library(tern.mmrm)
library(scda)
+library(scda.2022)
library(broom)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -44,7 +45,7 @@ var_labels(adqs_f) <- var_labels(adqs)
## Least Squares Means
-### Considering the treatment variable in the model
+#### Considering the treatment variable in the model
```{r variant1, test = list(result_v1 = "result"), message = FALSE}
mmrm_results <- fit_mmrm(
@@ -75,7 +76,7 @@ result <- basic_table(show_colcounts = TRUE) %>%
result
```
-### Not considering the treatment variable in the model
+#### Not considering the treatment variable in the model
```{r variant2, test = list(result_v2 = "result")}
mmrm_results_no_arm <- fit_mmrm(
@@ -106,12 +107,12 @@ result <- basic_table(show_colcounts = TRUE) %>%
result
```
-### Adding baseline rows
+#### Adding baseline rows
It may be of interest to summarize some different statistics at the baseline visit or summarize a different variable in the data set not used in the MMRM.
For example, the model may use the variable `CHG` but the baseline visit row may summarize the `AVAL` variable, thus we would need to create two tables and then combine them to accomplish this.
-```{r}
+```{r variant_baseline, test = list(result_baseline = "result")}
# First have the least-square means table.
a <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ARMCD", ref_group = mmrm_results$ref_level) %>%
@@ -138,7 +139,7 @@ col_info(b) <- EmptyColInfo
rbind(b, a)
```
-### Considering visit averages
+#### Considering visit averages
It may also be of interest to summarize several different statistics for an averaged combination of various visits in the MMRM.
For example, you may want to see the statistics for the average of the first 2 visits, or the average statistics of all visits combined.
@@ -210,7 +211,7 @@ Statistics to evaluate choice of covariance structure are being investigated and
as.rtable(mmrm_results, type = "diagnostic")
```
-{{< include ../../test-utils/save_results.qmd >}}
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -221,6 +222,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
library(dplyr)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
@@ -274,4 +276,5 @@ shinyApp(app$ui, app$server)
```
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/tables/efficacy/onct05.qmd b/book/tables/efficacy/onct05.qmd
index 42b583f186..f568ffd8e3 100644
--- a/book/tables/efficacy/onct05.qmd
+++ b/book/tables/efficacy/onct05.qmd
@@ -5,9 +5,9 @@ subtitle: Objective Response Rate by Subgroup
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: Objective Response Rate by Subgroup
library(tern)
library(dplyr)
library(scda)
+library(scda.2022)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
adrs <- synthetic_cdisc_dataset("latest", "adrs")
@@ -49,6 +50,9 @@ var_labels(anl) <- c(anl_labels, rsp = "Is Response")
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result"), opts.label = ifelse(packageVersion("rtables") < "0.6.6.9011", "skip_test_strict", "")}
df <- extract_rsp_subgroups(
@@ -66,8 +70,15 @@ result <- basic_table() %>%
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Specifying
Class Variables
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
Here, the levels of subgroup variables `SEX` and `STRATA1` are reordered.
`STRATA1` is reordered by frequency.
@@ -90,8 +101,15 @@ result <- basic_table() %>%
result
```
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Selecting Columns
and Changing the Alpha Level
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant3, test = list(result_v3 = "result"), opts.label = ifelse(packageVersion("rtables") < "0.6.6.9011", "skip_test_strict", "")}
df <- extract_rsp_subgroups(
@@ -111,8 +129,15 @@ result <- basic_table() %>%
result
```
+`r webr_code_labels <- c("setup", "variant3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Setting Values
Indicating Response
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
Create a new variable `new_rsp` in `anl` data that uses new criteria for responder.
@@ -135,10 +160,17 @@ result <- basic_table() %>%
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
# Use table, embedded in response forest plot module.
library(teal.modules.clinical)
@@ -146,9 +178,8 @@ library(teal.modules.clinical)
## Data reproducible code
data <- teal_data()
data <- within(data, {
- library(dplyr)
- library(forcats)
library(scda)
+ library(scda.2022)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADRS <- synthetic_cdisc_dataset("latest", "adrs")
@@ -207,5 +238,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/efficacy/ratet01.qmd b/book/tables/efficacy/ratet01.qmd
index a480a6ad19..44bc468d63 100644
--- a/book/tables/efficacy/ratet01.qmd
+++ b/book/tables/efficacy/ratet01.qmd
@@ -5,18 +5,19 @@ subtitle: Event Rate Summary for Recurrent Events
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
This example will focus on data from a single visit "WEEK 1 DAY 8" and a single endpoint "FKSI-FWB".
Only evaluable populations will be analyzed.
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(tern)
library(dplyr)
@@ -30,6 +31,9 @@ anl <- df_explicit_na(anl)
## Customized Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result"), eval = packageVersion("tern") >= "0.9.3.9005"}
lyt <- basic_table(show_colcounts = TRUE) %>%
@@ -87,7 +91,11 @@ result <- build_table(
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -98,4 +106,5 @@ result
```
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/tables/efficacy/rbmit01.qmd b/book/tables/efficacy/rbmit01.qmd
index 0b89f9e232..10de92de4b 100644
--- a/book/tables/efficacy/rbmit01.qmd
+++ b/book/tables/efficacy/rbmit01.qmd
@@ -5,9 +5,9 @@ subtitle: Tables for RBMI
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
We use a publicly available example dataset from an antidepressant clinical trial of an active drug versus placebo from the `rbmi` package.
@@ -212,8 +212,8 @@ result <- basic_table() %>%
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+::::
diff --git a/book/tables/efficacy/rspt01.qmd b/book/tables/efficacy/rspt01.qmd
index 579cbcdd10..fafa971171 100644
--- a/book/tables/efficacy/rspt01.qmd
+++ b/book/tables/efficacy/rspt01.qmd
@@ -5,9 +5,9 @@ subtitle: Best Overall Response
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: Best Overall Response
library(dplyr)
library(tern)
library(scda)
+library(scda.2022)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
adrs <- synthetic_cdisc_dataset("latest", "adrs")
@@ -35,7 +36,7 @@ Data pre-processing is done to label the analysis value (`AVALC`) so as to impro
In addition, the *response* is binary defined (`is_rsp`, responder yes/no) depending on the analysis value.
Finally, for comparison purposes, the reference arm is specified.
-```{r}
+```{r pre-processing}
#| code-fold: show
# Pre-Processing
@@ -52,6 +53,9 @@ anl <- anl_adsl %>%
The tabulation layout is built in layers for the analysis of overall response and applied to the pre-processed dataset.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
lyt_01 <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(var = "ARM", ref_group = "A: Drug X") %>%
@@ -79,8 +83,15 @@ result <- build_table(lyt = lyt_01, df = anl)
result
```
+`r webr_code_labels <- c("setup", "pre-processing", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Selecting
Sections to Display
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
Remove (or add) rows of results by removing/adding the corresponding layers from the layout.
For instance, the odds-ratio row is removed by simply removing the `estimate_odds_ratio` call:
@@ -107,11 +118,18 @@ result <- build_table(lyt = lyt_02, df = anl)
result
```
+`r webr_code_labels <- c("setup", "pre-processing", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Modifying Analysis Details like Type of
Confidence Interval, Alpha Level, Test Statistic
The confidence level is controlled by the `conf_level` parameter to the estimation functions.
Similarly, the methods for tests and confidence interval can be modified (see `?estimate_proportion_diff`).
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant3, test = list(result_v3 = "result")}
conf_level <- 0.90
lyt_03 <- basic_table(show_colcounts = TRUE) %>%
@@ -150,8 +168,15 @@ result <- build_table(lyt = lyt_03, df = anl)
result
```
+`r webr_code_labels <- c("setup", "pre-processing", "variant3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with
Stratified Analysis
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
The stratified analysis section can be added by defining the analyses needed with `control_binary_comparison` for the argument `strat_analysis` and identifying the stratification variables to use.
@@ -202,11 +227,18 @@ result <- build_table(lyt = lyt_04, df = anl)
result
```
+`r webr_code_labels <- c("setup", "pre-processing", "variant4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Modifying the Definition
of Overall Response
The definition of *responders* is realized during the pre-processing step.
The layout does not need to be modified and can be reused.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant5, test = list(result_v5 = "result")}
anl <- anl_adsl %>%
left_join(anl_adrs, by = c("STUDYID", "USUBJID")) %>%
@@ -219,10 +251,17 @@ result <- build_table(lyt = lyt_01, df = anl)
result
```
+`r webr_code_labels <- c("setup", "pre-processing", "variant5")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Defining New
Sections to Display
Similarly to in the previous tab, redefinition or relabeling of the result is a pre-processing step and the original table layout can be reused.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant6, test = list(result_v6 = "result")}
anl <- anl_adsl %>%
left_join(anl_adrs, by = c("STUDYID", "USUBJID")) %>%
@@ -243,10 +282,17 @@ result <- build_table(lyt = lyt_01, df = anl)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "pre-processing", "variant6")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -254,6 +300,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
library(dplyr)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
@@ -313,5 +360,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/efficacy/ttet01.qmd b/book/tables/efficacy/ttet01.qmd
index f75ec474aa..db9999beda 100644
--- a/book/tables/efficacy/ttet01.qmd
+++ b/book/tables/efficacy/ttet01.qmd
@@ -5,9 +5,9 @@ subtitle: Time-To-Event Summary
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::::: panel-tabset
+:::::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Time-To-Event Summary
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -43,6 +44,9 @@ adtte_f <- adtte %>%
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(
@@ -97,8 +101,15 @@ result <- build_table(lyt, df = adtte_f, alt_counts_df = adsl) %>%
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Selecting
Sections to Display
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ARM", ref_group = "A: Drug X") %>%
@@ -139,8 +150,15 @@ result <- build_table(lyt, df = adtte_f, alt_counts_df = adsl)
result
```
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Modifying Analysis Details
like Conf. Type, Ties, Alpha Level
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant3, test = list(result_v3 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ARM", ref_group = "A: Drug X") %>%
@@ -207,69 +225,16 @@ result <- build_table(lyt, df = adtte_f, alt_counts_df = adsl) %>%
result
```
-## Table with
Stratified Analysis
-
-::: {.content-visible when-profile="stable"}
-```{r variant4-stable}
-lyt <- basic_table(show_colcounts = TRUE) %>%
- split_cols_by("ARM", ref_group = "A: Drug X") %>%
- analyze_vars(
- vars = "is_event",
- .stats = "count_fraction",
- .labels = c(count_fraction = "Patients with event (%)")
- ) %>%
- split_rows_by(
- "EVNT1",
- split_label = "Earliest contributing event",
- split_fun = keep_split_levels("Patients with event (%)"),
- label_pos = "visible",
- child_labels = "hidden",
- indent_mod = 1L,
- ) %>%
- analyze("EVNTDESC") %>%
- analyze_vars(
- vars = "is_not_event",
- .stats = "count_fraction",
- .labels = c(count_fraction = "Patients without event (%)"),
- nested = FALSE,
- show_labels = "hidden"
- ) %>%
- surv_time(
- vars = "AVAL",
- var_labels = "Time to Event (Months)",
- is_event = "is_event",
- table_names = "time_to_event"
- ) %>%
- coxph_pairwise(
- vars = "AVAL",
- is_event = "is_event",
- var_labels = "Unstratified Analysis",
- table_names = "coxph_unstratified"
- ) %>%
- coxph_pairwise(
- vars = "AVAL",
- is_event = "is_event",
- var_labels = "Stratified Analysis",
- strata = "SEX",
- table_names = "coxph_stratified"
- ) %>%
- surv_timepoint(
- vars = "AVAL",
- var_labels = "Months",
- is_event = "is_event",
- method = "both",
- time_point = 12
- )
+`r webr_code_labels <- c("setup", "variant3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
-result <- build_table(lyt, df = adtte_f, alt_counts_df = adsl) %>%
- prune_table()
+## Table with
Stratified Analysis
-result
-```
-:::
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
-::: {.content-visible when-profile="development"}
-```{r variant4-devel, test = list(result_v4 = "result")}
+```{r variant4, test = list(result_v4 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ARM", ref_group = "A: Drug X") %>%
analyze_vars(
@@ -325,10 +290,16 @@ result <- build_table(lyt, df = adtte_f, alt_counts_df = adsl) %>%
result
```
+
+`r webr_code_labels <- c("setup", "variant4")`
+{{< include ../../_utils/webr.qmd >}}
:::
## Table Modifying Time Point for
the "XX Months" Analysis
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant5, test = list(result_v5 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ARM", ref_group = "A: Drug X") %>%
@@ -380,8 +351,15 @@ result <- build_table(lyt, df = adtte_f, alt_counts_df = adsl) %>%
result
```
+`r webr_code_labels <- c("setup", "variant5")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Requesting
\> 1 p-value
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant6, test = list(result_v6 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ARM", ref_group = "A: Drug X") %>%
@@ -451,10 +429,17 @@ result <- build_table(lyt, df = adtte_f, alt_counts_df = adsl) %>%
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant6")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -462,6 +447,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADTTE <- synthetic_cdisc_dataset("latest", "adtte")
@@ -521,5 +507,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
+{{< include ../../_utils/shinylive.qmd >}}
+:::
+
{{< include ../../repro.qmd >}}
+
:::::
diff --git a/book/tables/exposure/ext01.qmd b/book/tables/exposure/ext01.qmd
index 20a39f6827..da0f71e625 100644
--- a/book/tables/exposure/ext01.qmd
+++ b/book/tables/exposure/ext01.qmd
@@ -5,15 +5,16 @@ subtitle: Study Drug Exposure Table
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(tern)
library(dplyr)
library(tidyr)
@@ -80,6 +81,9 @@ adex <- dplyr::bind_rows(adex, tdurd, tndosmis) %>%
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
# When summary table contains only categorical or only numeric parameters
@@ -96,8 +100,15 @@ result <- build_table(lyt = lyt, df = adex, alt_counts_df = adsl)
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with Optional Analyses
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
# When summary table contains both categorical and numeric parameters,
# developer needs to do pre-processing to transform dataset to wide format.
@@ -143,8 +154,15 @@ result <- build_table(lyt = lyt, df = anl, alt_counts_df = adsl)
result
```
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with User-Specified
Categories for Missed Doses
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant3, test = list(result_v3 = "result")}
# When summary table contains both categorical and numeric parameters,
# developer needs to do pre-processing to transform dataset to wide format.
@@ -195,18 +213,26 @@ result <- build_table(lyt = lyt, df = anl, alt_counts_df = adsl)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
## Data reproducible code
data <- teal_data()
data <- within(data, {
- library(dplyr)
library(scda)
+ library(scda.2022)
+ library(dplyr)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADEX <- synthetic_cdisc_dataset("latest", "adex")
@@ -268,5 +294,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/lab-results/lbt01.qmd b/book/tables/lab-results/lbt01.qmd
index 3420f45642..b1520b4403 100644
--- a/book/tables/lab-results/lbt01.qmd
+++ b/book/tables/lab-results/lbt01.qmd
@@ -5,9 +5,9 @@ subtitle: Laboratory Test Results and Change from Baseline by Visit
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
In order to generate the `LBT01` standard tabulation, the `adlb` dataset may be pre-processed so as to discriminate baseline from follow-up visits.
@@ -16,6 +16,7 @@ In order to generate the `LBT01` standard tabulation, the `adlb` dataset may be
#| code-fold: show
library(scda)
+library(scda.2022)
library(tern)
library(dplyr)
@@ -40,6 +41,9 @@ adlb_f <- adlb %>%
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
# Define the split function
split_fun <- drop_split_levels
@@ -83,10 +87,17 @@ result <- build_table(lyt, adlb_f)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app"), eval = packageVersion("teal.modules.clinical") >= "0.9.0.9007"}
library(teal.modules.clinical)
@@ -95,7 +106,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
- library(dplyr)
+ library(scda.2022)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADLB <- synthetic_cdisc_dataset("latest", "adlb")
@@ -145,5 +156,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/lab-results/lbt02.qmd b/book/tables/lab-results/lbt02.qmd
index e1c254b7d9..7a686daaae 100644
--- a/book/tables/lab-results/lbt02.qmd
+++ b/book/tables/lab-results/lbt02.qmd
@@ -5,9 +5,9 @@ subtitle: Laboratory Test Results by Visit
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Laboratory Test Results by Visit
# Preparation of an illustrative dataset
library(scda)
+library(scda.2022)
library(tern)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -36,6 +37,9 @@ adlb <- df_explicit_na(adlb)
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
# Define the split function
split_fun <- drop_split_levels
@@ -58,10 +62,17 @@ result <- build_table(l,
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -69,7 +80,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
- library(dplyr)
+ library(scda.2022)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADLB <- synthetic_cdisc_dataset("latest", "adlb")
@@ -118,5 +129,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/lab-results/lbt03.qmd b/book/tables/lab-results/lbt03.qmd
index 583c379165..9339774f1f 100644
--- a/book/tables/lab-results/lbt03.qmd
+++ b/book/tables/lab-results/lbt03.qmd
@@ -5,9 +5,9 @@ subtitle: Laboratory Test Results Change from Baseline by Visit
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
For illustration purposes, this example focuses on "C-Reactive Protein Measurement" starting from baseline, while excluding visit at week 1 for subjects who were randomized to the placebo group.
@@ -16,6 +16,7 @@ For illustration purposes, this example focuses on "C-Reactive Protein Measureme
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(tern)
@@ -47,6 +48,9 @@ var_labels(adlb_f) <- c(saved_labels, "")
The `LBT03` template is the result of a junction between the analysis of `AVAL` at baseline and `CHG` at visit time.
`AVAL` is summarized for baseline visits and and `CHG` is summarized for post-baseline visits.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
# Define the split function
split_fun <- drop_split_levels
@@ -69,8 +73,15 @@ result <- build_table(
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
In the final step, a new variable is derived from `AVISIT` that can specify the method of estimation of the evaluated change.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
adlb_f <- adlb_f %>% mutate(AVISIT_header = recode(AVISIT,
"BASELINE" = "BASELINE",
@@ -106,10 +117,17 @@ result <- build_table(
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
Here, we pre-process and manually define the variable "Baseline or Absolute Change from Baseline".
```{r teal, opts.label = c("skip_if_testing", "app")}
@@ -119,7 +137,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
- library(dplyr)
+ library(scda.2022)
ADSL <- df_explicit_na(synthetic_cdisc_dataset("latest", "adsl"))
ADLB <- df_explicit_na(synthetic_cdisc_dataset("latest", "adlb")) %>%
@@ -190,5 +208,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/lab-results/lbt04.qmd b/book/tables/lab-results/lbt04.qmd
index cd51aad114..ad250b5b3c 100644
--- a/book/tables/lab-results/lbt04.qmd
+++ b/book/tables/lab-results/lbt04.qmd
@@ -5,15 +5,16 @@ subtitle: Laboratory Abnormalities Not Present at Baseline
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(tern)
@@ -34,6 +35,9 @@ adlb_f <- adlb %>%
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ACTARM") %>%
@@ -54,10 +58,17 @@ result <- build_table(lyt = lyt, df = adlb_f, alt_counts_df = adsl)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -65,7 +76,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
- library(dplyr)
+ library(scda.2022)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADLB <- synthetic_cdisc_dataset("latest", "adlb") %>%
@@ -109,5 +120,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/lab-results/lbt05.qmd b/book/tables/lab-results/lbt05.qmd
index 2130e29bc4..10938e0654 100644
--- a/book/tables/lab-results/lbt05.qmd
+++ b/book/tables/lab-results/lbt05.qmd
@@ -5,15 +5,16 @@ subtitle: Laboratory Abnormalities with Single and Replicated Marked
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(tern)
@@ -82,6 +83,9 @@ map <- expand.grid(
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ACTARM") %>%
@@ -106,8 +110,15 @@ result <- prune_table(result, keep_rows(has_lbl("Any Abnormality")))
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Showing
All Categories
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ACTARM") %>%
@@ -129,6 +140,10 @@ result <- build_table(lyt, df = adlb_f, alt_counts_df = adsl)
result
```
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with
Study-Specific
MLAs
```{r variant3}
@@ -141,6 +156,9 @@ result
## Table of Lab Abnormalities Showing
All Categories But Only for Parameter
Codes with At Least One Abnormality
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant4, test = list(result_v4 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ACTARM") %>%
@@ -168,7 +186,12 @@ result
# this is an a posteriori approach, though.
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/tables/lab-results/lbt06.qmd b/book/tables/lab-results/lbt06.qmd
index 1c07fac0f4..01fc760e42 100644
--- a/book/tables/lab-results/lbt06.qmd
+++ b/book/tables/lab-results/lbt06.qmd
@@ -5,15 +5,16 @@ subtitle: Laboratory Abnormalities by Visit and Baseline Status
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(tern)
library(dplyr)
@@ -37,6 +38,9 @@ adlb_f_crp <- adlb_f %>% dplyr::filter(PARAMCD == "CRP")
## Standard Table for
Single Lab Test
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
# Define the split function
split_fun <- drop_split_levels
@@ -62,8 +66,15 @@ result <- build_table(
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Standard Table for
Multiple Lab Tests
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
# The following code generates one large table for multiple lab tests.
# If separate tables are needed for each lab test per GDSR standard, use the code for "single lab test".
@@ -90,7 +101,11 @@ result <- build_table(
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -102,4 +117,4 @@ result
{{< include ../../repro.qmd >}}
-:::
+::::
diff --git a/book/tables/lab-results/lbt07.qmd b/book/tables/lab-results/lbt07.qmd
index 026ecf8491..c4a33ebba8 100644
--- a/book/tables/lab-results/lbt07.qmd
+++ b/book/tables/lab-results/lbt07.qmd
@@ -5,15 +5,16 @@ subtitle: Laboratory Test Results with Highest NCI CTCAE Grade Post-Baseline
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(tern)
library(dplyr)
library(forcats)
@@ -71,6 +72,9 @@ map <- expand.grid(
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ACTARM") %>%
@@ -103,10 +107,17 @@ result <- result %>% prune_table()
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -114,6 +125,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
library(dplyr)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
@@ -157,5 +169,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/lab-results/lbt08.qmd b/book/tables/lab-results/lbt08.qmd
index 805ca6f63e..cc6168c44e 100644
--- a/book/tables/lab-results/lbt08.qmd
+++ b/book/tables/lab-results/lbt08.qmd
@@ -5,15 +5,16 @@ subtitle: Laboratory Test Results with Highest NCI CTCAE Grade at Any Time
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(tern)
@@ -50,6 +51,9 @@ In addition, the worst laboratory flags must be selected appropriately to match
For example, if any lab requires a shift table for both directions, then both `worst_flag_low` and `worst_flag_high` must be specified in `h_adlb_worsen`.
If all labs requires a shift table for only one direction, then the matching worst lab flag variable must be selected in `h_adlb_worsen`.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
result <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ARMCD") %>%
@@ -69,7 +73,11 @@ result <- basic_table(show_colcounts = TRUE) %>%
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -81,4 +89,4 @@ result
{{< include ../../repro.qmd >}}
-:::
+::::
diff --git a/book/tables/lab-results/lbt09.qmd b/book/tables/lab-results/lbt09.qmd
index d71e6745fd..c07f6b10f7 100644
--- a/book/tables/lab-results/lbt09.qmd
+++ b/book/tables/lab-results/lbt09.qmd
@@ -5,15 +5,16 @@ subtitle: Liver Laboratory Tests -- Patients with Elevated Post-Baseline AST or
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(tern)
@@ -104,6 +105,9 @@ map <- data.frame(
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
result <- basic_table() %>%
split_cols_by("ARM") %>%
@@ -130,8 +134,15 @@ result <- result %>% trim_rows(criteria = criteria_fun)
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Selecting Sections
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
result <- basic_table() %>%
split_cols_by("ARM") %>%
@@ -164,7 +175,11 @@ result <- result %>% trim_rows(criteria = criteria_fun)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -176,4 +191,4 @@ result
{{< include ../../repro.qmd >}}
-:::
+::::
diff --git a/book/tables/lab-results/lbt10.qmd b/book/tables/lab-results/lbt10.qmd
index 265955e9b5..e95869e190 100644
--- a/book/tables/lab-results/lbt10.qmd
+++ b/book/tables/lab-results/lbt10.qmd
@@ -5,15 +5,16 @@ subtitle: Liver Laboratory Tests -- Patients with Elevated Post-Baseline AST or
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(tern)
@@ -43,6 +44,9 @@ anl <- df_explicit_na(adhy_liver)
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
tbl <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ACTARMCD") %>%
@@ -65,8 +69,15 @@ result <- tbl %>% trim_rows(criteria = criteria_fun)
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Selecting Sections
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
tbl2 <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ACTARMCD") %>%
@@ -89,7 +100,11 @@ result <- tbl2 %>% trim_rows(criteria = criteria_fun)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -101,4 +116,4 @@ result
{{< include ../../repro.qmd >}}
-:::
+::::
diff --git a/book/tables/lab-results/lbt10_bl.qmd b/book/tables/lab-results/lbt10_bl.qmd
index 045ae3cc97..bb10a0451c 100644
--- a/book/tables/lab-results/lbt10_bl.qmd
+++ b/book/tables/lab-results/lbt10_bl.qmd
@@ -5,15 +5,16 @@ subtitle: Liver Laboratory Tests -- Patients with Elevated Post-Baseline AST or
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(tern)
@@ -43,6 +44,9 @@ anl <- df_explicit_na(adhy_liver)
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
tbl <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ACTARMCD") %>%
@@ -65,8 +69,15 @@ result <- tbl %>% trim_rows(criteria = criteria_fun)
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Selecting Sections
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
tbl2 <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ACTARMCD") %>%
@@ -89,7 +100,11 @@ result <- tbl2 %>% trim_rows(criteria = criteria_fun)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -101,4 +116,4 @@ result
{{< include ../../repro.qmd >}}
-:::
+::::
diff --git a/book/tables/lab-results/lbt11.qmd b/book/tables/lab-results/lbt11.qmd
index 42563b3371..e41ab5fc41 100644
--- a/book/tables/lab-results/lbt11.qmd
+++ b/book/tables/lab-results/lbt11.qmd
@@ -5,9 +5,9 @@ subtitle: Time to First Increase in Liver Laboratory Test Result Meeting Hy's La
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Time to First Increase in Liver Laboratory Test Result Meeting Hy's La
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -58,6 +59,9 @@ anl <- adaette %>%
## Time-To-Event Summary
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(var = "ARMCD", ref_group = "ARM A") %>%
@@ -80,8 +84,15 @@ result <- build_table(lyt, df = anl, alt_counts_df = adsl_safl)
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Time-To-Event Summary
Selecting Sections to Display
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(var = "ARMCD", ref_group = "ARM A") %>%
@@ -97,8 +108,15 @@ result <- build_table(lyt, df = anl, alt_counts_df = adsl_safl)
result
```
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Time-To-Event Summary
with Stratified Analysis
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant3, test = list(result_v3 = "result")}
strata <- c("RACE", "SEX")
@@ -130,10 +148,17 @@ result <- build_table(lyt, df = anl, alt_counts_df = adsl_safl)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -141,7 +166,9 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
library(dplyr)
+
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADAETTE <- synthetic_cdisc_dataset("latest", "adaette")
@@ -199,5 +226,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/lab-results/lbt11_bl.qmd b/book/tables/lab-results/lbt11_bl.qmd
index 551e6ad1e3..24a0876d0c 100644
--- a/book/tables/lab-results/lbt11_bl.qmd
+++ b/book/tables/lab-results/lbt11_bl.qmd
@@ -5,9 +5,9 @@ subtitle: Time to First Increase in Liver Laboratory Test Result Meeting Hy's La
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Time to First Increase in Liver Laboratory Test Result Meeting Hy's La
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -58,6 +59,9 @@ anl <- adaette %>%
## Time-To-Event Summary
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(var = "ARMCD", ref_group = "ARM A") %>%
@@ -80,8 +84,15 @@ result <- build_table(lyt, df = anl, alt_counts_df = adsl_safl)
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Time-To-Event Summary
Selecting Sections to Display
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(var = "ARMCD", ref_group = "ARM A") %>%
@@ -97,8 +108,15 @@ result <- build_table(lyt, df = anl, alt_counts_df = adsl_safl)
result
```
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Time-To-Event Summary
with Stratified Analysis
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant3, test = list(result_v3 = "result")}
strata <- c("RACE", "SEX")
@@ -130,10 +148,17 @@ result <- build_table(lyt, df = anl, alt_counts_df = adsl_safl)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -141,6 +166,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
library(dplyr)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
@@ -200,5 +226,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/lab-results/lbt12.qmd b/book/tables/lab-results/lbt12.qmd
index 9828bd537a..dd72221bac 100644
--- a/book/tables/lab-results/lbt12.qmd
+++ b/book/tables/lab-results/lbt12.qmd
@@ -5,15 +5,16 @@ subtitle: Liver Laboratory Tests by Time on Treatment -- Patients with Elevated
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(tern)
@@ -52,6 +53,9 @@ anl <- df_explicit_na(anl)
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
result <- basic_table() %>%
split_cols_by("TITLE") %>%
@@ -70,7 +74,11 @@ result <- result %>% trim_rows(criteria = criteria_fun)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -82,4 +90,4 @@ result
{{< include ../../repro.qmd >}}
-:::
+::::
diff --git a/book/tables/lab-results/lbt12_bl.qmd b/book/tables/lab-results/lbt12_bl.qmd
index e2d108d834..45ad964c79 100644
--- a/book/tables/lab-results/lbt12_bl.qmd
+++ b/book/tables/lab-results/lbt12_bl.qmd
@@ -5,15 +5,16 @@ subtitle: Liver Laboratory Tests by Time on Treatment -- Patients with Elevated
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(tern)
@@ -52,6 +53,9 @@ anl <- df_explicit_na(anl)
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
result <- basic_table() %>%
split_cols_by("TITLE") %>%
@@ -70,7 +74,11 @@ result <- result %>% trim_rows(criteria = criteria_fun)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -82,4 +90,4 @@ result
{{< include ../../repro.qmd >}}
-:::
+::::
diff --git a/book/tables/lab-results/lbt13.qmd b/book/tables/lab-results/lbt13.qmd
index cefa8d9ecf..e6e6a549e3 100644
--- a/book/tables/lab-results/lbt13.qmd
+++ b/book/tables/lab-results/lbt13.qmd
@@ -5,9 +5,9 @@ subtitle: NCI CTCAE Grade Laboratory Abnormalities by Visit and Baseline Grade
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
Please note that for each variant, the `adlb` dataset needs to be filtered on correct flags like `WGRLOVFL`, `WGRHIVFL`, et al., otherwise the layout function will not return the correct counts.
@@ -19,6 +19,7 @@ Otherwise please follow the pre-processing steps below before applying the layou
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(tern)
@@ -39,6 +40,9 @@ adlb <- adlb %>% filter(PARAMCD == "CRP" & SAFFL == "Y")
Note that the worst laboratory flag (below `WGRLOVFL`) must be selected appropriately to match the direction of abnormality (here `Low`).
New grouping variables `ATOXGR_GP` and `BTOXGR_GP` are created to display the correct output.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
adlb_f <- adlb %>% filter(WGRLOVFL == "Y")
@@ -110,11 +114,18 @@ result <- basic_table(show_colcounts = TRUE) %>%
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Standard Table (High)
Note that the worst laboratory flag (below `WGRHIVFL`) must be selected appropriately to match the direction of abnormality (here `High`).
New grouping variables `ATOXGR_GP` and `BTOXGR_GP` are created to display the correct output.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
adlb_f <- adlb %>% filter(WGRHIVFL == "Y")
@@ -186,10 +197,17 @@ result <- basic_table(show_colcounts = TRUE) %>%
result
```
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Without Patients with
Missing Baseline (Low)
Note that missing baseline values are filtered out in the pre-processing step.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant3, test = list(result_v3 = "result")}
adlb_f <- adlb %>% filter(WGRLOVFL == "Y")
@@ -261,10 +279,17 @@ result <- basic_table(show_colcounts = TRUE) %>%
result
```
+`r webr_code_labels <- c("setup", "variant3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with Missing Baseline
Considered as Grade 0 (High)
Note that when `BTOXGR` is missing, the grouping variable `BTOXGR_GP` is now `"Not High"` instead of `"Missing"` compared to *Standard Table (High)*.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant4, test = list(result_v4 = "result")}
adlb_f <- adlb %>% filter(WGRHIVFL == "Y")
@@ -335,10 +360,17 @@ result <- basic_table(show_colcounts = TRUE) %>%
result
```
+`r webr_code_labels <- c("setup", "variant4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with Fill-In
of Grades (High)
Pre-processing is the same as for *Standard Table (High)*, but in order to keep all levels, the `drop` argument in `count_occurrences` is set to `FALSE`.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant5, test = list(result_v5 = "result")}
adlb_f <- adlb %>% filter(WGRHIVFL == "Y")
@@ -412,10 +444,17 @@ result <- basic_table(show_colcounts = TRUE) %>%
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant5")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -423,7 +462,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
- library(dplyr)
+ library(scda.2022)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADLB <- synthetic_cdisc_dataset("latest", "adlb")
@@ -478,5 +517,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/lab-results/lbt14.qmd b/book/tables/lab-results/lbt14.qmd
index 2b85dd1f45..d9c6c7b8ff 100644
--- a/book/tables/lab-results/lbt14.qmd
+++ b/book/tables/lab-results/lbt14.qmd
@@ -5,9 +5,9 @@ subtitle: Laboratory Test Results Shift Table -- Highest NCI CTCAE Grade Post-Ba
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
Please note that for each variant, the `adlb` dataset needs to be filtered on correct flags like `WGRLOFL`, `WGRHIFL`, et al., otherwise the layout function will not return the correct counts.
@@ -19,6 +19,7 @@ Otherwise please follow the pre-processing steps below before applying the layou
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(tern)
@@ -39,6 +40,9 @@ adlb <- adlb %>% filter(SAFFL == "Y")
Note that the worst laboratory flag (below `WGRHIFL`) must be selected appropriately in the pre-processing step.
New grouping variables `ATOXGR_GP` (post-baseline) and `BTOXGR_GP` (baseline) are created to display the correct output.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
adlb_f <- adlb %>% filter(WGRHIFL == "Y")
@@ -91,11 +95,18 @@ result <- basic_table(show_colcounts = TRUE) %>%
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Standard Table (Low)
Note that the worst laboratory flag (below `WGRLOFL`) must be selected appropriately in the pre-processing step.
New grouping variables `ATOXGR_GP` (post-baseline) and `BTOXGR_GP` (baseline) are created to display the correct output.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
adlb_f <- adlb %>% filter(WGRLOFL == "Y")
@@ -148,10 +159,17 @@ result <- basic_table(show_colcounts = TRUE) %>%
result
```
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Without Patients with
Missing Baseline (High)
Note that missing baseline values are filtered out in the pre-processing step.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant3, test = list(result_v3 = "result")}
adlb_f <- adlb %>% filter(WGRHIFL == "Y")
@@ -204,10 +222,17 @@ result <- basic_table(show_colcounts = TRUE) %>%
result
```
+`r webr_code_labels <- c("setup", "variant3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with Missing Baseline
Considered as Grade 0 (Low)
Note that when BTOXGR is missing, the grouping variable `BTOXGR_GP` now is `"Not Low"` instead of `"Missing"` compared to *Standard Table (Low)*.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant4, test = list(result_v4 = "result")}
adlb_f <- adlb %>% filter(WGRLOFL == "Y")
@@ -259,10 +284,17 @@ result <- basic_table(show_colcounts = TRUE) %>%
result
```
+`r webr_code_labels <- c("setup", "variant4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with Fill-In of Grades
Pre-processing is the same as *Standard Table (High)*, but in order to keep all levels, `prune_table()` is not applied.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant5, test = list(result_v5 = "result")}
adlb_f <- adlb %>% filter(WGRHIFL == "Y")
@@ -314,10 +346,17 @@ result <- basic_table(show_colcounts = TRUE) %>%
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant5")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -325,7 +364,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
- library(dplyr)
+ library(scda.2022)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
ADLB <- synthetic_cdisc_dataset("latest", "adlb")
@@ -380,5 +419,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/lab-results/lbt15.qmd b/book/tables/lab-results/lbt15.qmd
index dcf7c6e124..a78095b34e 100644
--- a/book/tables/lab-results/lbt15.qmd
+++ b/book/tables/lab-results/lbt15.qmd
@@ -5,9 +5,9 @@ subtitle: Laboratory Test Shifts to NCI CTCAE Grade 3-4 Post-Baseline
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
Because the `scda` dataset `adlb` doesn't have the `PARCAT1` variable, this variable is created from `LBCAT` in pre-processing.
@@ -16,6 +16,7 @@ Because the `scda` dataset `adlb` doesn't have the `PARCAT1` variable, this vari
#| code-fold: show
library(scda)
+library(scda.2022)
library(tern)
library(dplyr)
library(forcats)
@@ -70,6 +71,9 @@ adlb <- adlb %>% var_relabel(
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
# Argument exclude_base_abn must be TRUE to include patients with normal or abnormal in the opposite
# direction in the denom.
@@ -98,17 +102,31 @@ result <- build_table(lyt, adlb, alt_counts_df = adsl)
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Modifying Cut Point
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
result <- build_table(lyt, adlb_alt_cut, alt_counts_df = adsl)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
The current module `tm_t_abnormality` is only displaying rows that are not all-zero, so the result could be a little different from static output where all-zero rows can be shown.
```{r teal, opts.label = c("skip_if_testing", "app")}
@@ -118,6 +136,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
library(dplyr)
library(forcats)
@@ -181,5 +200,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/medical-history/mht01.qmd b/book/tables/medical-history/mht01.qmd
index 04ab22e3a1..9451aae426 100644
--- a/book/tables/medical-history/mht01.qmd
+++ b/book/tables/medical-history/mht01.qmd
@@ -5,9 +5,9 @@ subtitle: Medical History
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: Medical History
library(tern)
library(dplyr)
library(scda)
+library(scda.2022)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
admh <- synthetic_cdisc_dataset("latest", "admh")
@@ -38,6 +39,9 @@ admh_f <- admh %>%
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
split_fun <- drop_split_levels
@@ -69,8 +73,15 @@ result <- build_table(lyt, admh_f, alt_counts_df = adsl_f) %>%
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table of History
Prior to Study
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
admh_f_prior <- admh_f %>%
filter(ASTDY <= 0)
@@ -81,8 +92,15 @@ result <- build_table(lyt, admh_f_prior, alt_counts_df = adsl_f) %>%
result
```
+`r webr_code_labels <- c("setup", "variant1", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with Total Number
of Conditions Suppressed
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant3, test = list(result_v3 = "result")}
split_fun <- drop_split_levels
@@ -114,6 +132,10 @@ result <- build_table(lyt, admh_f, alt_counts_df = adsl) %>%
result
```
+`r webr_code_labels <- c("setup", "variant3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with Total Number of Conditions Per Body
System After The Summary of Patients
Not currently supported by `rtables`.
@@ -123,6 +145,9 @@ Users, please notify us if this variation is important to you.
Conditions are further sorted by decreasing high level terms and low level terms.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant4, test = list(result_v4 = "result")}
split_fun <- drop_split_levels
@@ -160,10 +185,17 @@ result <- build_table(lyt, admh_f, alt_counts_df = adsl_f) %>%
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -171,6 +203,8 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
+ library(dplyr)
ADSL <- synthetic_cdisc_dataset("latest", "adsl") %>%
filter(SAFFL == "Y")
@@ -209,5 +243,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/pharmacokinetic/pkct01.qmd b/book/tables/pharmacokinetic/pkct01.qmd
index 239985b83e..5e8ed8a624 100644
--- a/book/tables/pharmacokinetic/pkct01.qmd
+++ b/book/tables/pharmacokinetic/pkct01.qmd
@@ -5,15 +5,16 @@ subtitle: Summary Concentration Table
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(tern)
@@ -62,6 +63,9 @@ lyt_rows <- basic_table() %>%
## Standard Table (Stats in Columns)
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
lyt <- lyt_rows %>%
analyze_vars_in_cols(
@@ -93,8 +97,15 @@ main_footer(result) <- "NE: Not Estimable"
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Implementing 1/3 Imputation Rule
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
lyt <- lyt_rows %>%
analyze_vars_in_cols(
@@ -126,8 +137,15 @@ main_footer(result) <- c("NE: Not Estimable", "ND: Not Derived")
result
```
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Implementing 1/2 Imputation Rule
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant3, test = list(result_v3 = "result")}
lyt <- lyt_rows %>%
analyze_vars_in_cols(
@@ -159,7 +177,11 @@ main_footer(result) <- "ND: Not Derived"
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -170,4 +192,5 @@ result
```
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/tables/pharmacokinetic/pkpt02.qmd b/book/tables/pharmacokinetic/pkpt02.qmd
index 7233c69e44..ea6df8e170 100644
--- a/book/tables/pharmacokinetic/pkpt02.qmd
+++ b/book/tables/pharmacokinetic/pkpt02.qmd
@@ -5,15 +5,16 @@ subtitle: Pharmacokinetic Parameter Summary -- Plasma/Serum/Blood PK Parameters
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(tern)
@@ -23,7 +24,7 @@ adpp <- adpp %>% filter(PPSPEC == "Plasma", AVISIT == "CYCLE 1 DAY 1")
## Standard Table -- Plasma
-```{r}
+```{r lyt}
# lyt creation
lyt <- basic_table() %>%
split_cols_by(
@@ -53,6 +54,9 @@ lyt <- basic_table() %>%
#### Plasma Drug X
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result"), opts.label = ifelse(packageVersion("tern") < "0.9.3.9020", "skip_test_strict", "")}
adpp0 <- adpp %>%
@@ -67,8 +71,15 @@ subtitles(result) <- paste("Analyte:", unique(adpp0$PPCAT), "\nVisit:", unique(a
result
```
+`r webr_code_labels <- c("setup", "lyt", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
#### Plasma Drug Y
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result"), opts.label = ifelse(packageVersion("tern") < "0.9.3.9020", "skip_test_strict", "")}
adpp1 <- adpp %>%
@@ -83,7 +94,11 @@ subtitles(result) <- paste("Analyte:", unique(adpp1$PPCAT), "\nVisit:", unique(a
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lyt", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -94,4 +109,4 @@ result
```
{{< include ../../repro.qmd >}}
-:::
+::::
diff --git a/book/tables/pharmacokinetic/pkpt03.qmd b/book/tables/pharmacokinetic/pkpt03.qmd
index d734ea7dbe..9fde0c177c 100644
--- a/book/tables/pharmacokinetic/pkpt03.qmd
+++ b/book/tables/pharmacokinetic/pkpt03.qmd
@@ -5,9 +5,9 @@ subtitle: Pharmacokinetic Parameter Summary of Plasma by Treatment (Stats in Col
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
@@ -15,6 +15,7 @@ subtitle: Pharmacokinetic Parameter Summary of Plasma by Treatment (Stats in Col
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(tern)
@@ -74,7 +75,7 @@ adsl_y_splitvars <- adsl_tmp %>%
## Standard Table
-```{r}
+```{r lyt}
# lyt creation
lyt <- basic_table() %>%
split_rows_by(
@@ -131,6 +132,9 @@ lyt <- basic_table() %>%
#### Plasma Drug X
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
result <- build_table(lyt, df = adpp_x, alt_counts_df = adsl_x_splitvars)
main_title(result) <- paste("Summary of", unique(adpp_x$PPSPEC), "PK Parameter by Treatment Arm, PK Population")
@@ -139,8 +143,15 @@ result <- paginate_table(result, landscape = TRUE)
result
```
+`r webr_code_labels <- c("setup", "lyt", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
#### Plasma Drug X: Remove Rows with 0s
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
result <- build_table(lyt, df = adpp_x, alt_counts_df = adsl_x_splitvars) %>%
prune_table()
@@ -151,8 +162,15 @@ result <- paginate_table(result, landscape = TRUE)
result
```
+`r webr_code_labels <- c("setup", "lyt", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
#### Plasma Drug Y
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant3, test = list(result_v3 = "result")}
result <- build_table(lyt, df = adpp_y, alt_counts_df = adsl_y_splitvars)
main_title(result) <- paste("Summary of", unique(adpp_y$PPSPEC), "PK Parameter by Treatment Arm, PK Population")
@@ -161,7 +179,11 @@ result <- paginate_table(result, landscape = TRUE)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lyt", "variant3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -172,4 +194,5 @@ result
```
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/tables/pharmacokinetic/pkpt04.qmd b/book/tables/pharmacokinetic/pkpt04.qmd
index 1ac4ad5dab..91a7b483e2 100644
--- a/book/tables/pharmacokinetic/pkpt04.qmd
+++ b/book/tables/pharmacokinetic/pkpt04.qmd
@@ -5,15 +5,16 @@ subtitle: Pharmacokinetic Parameter Summary -- Urine PK Parameters (Stats in Row
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(tern)
@@ -23,7 +24,7 @@ adpp <- adpp %>% filter(PPSPEC == "Urine", AVISIT == "CYCLE 1 DAY 1")
## Standard Table
-```{r}
+```{r lyt}
# lyt creation
lyt <- basic_table() %>%
split_cols_by(
@@ -53,6 +54,9 @@ lyt <- basic_table() %>%
#### Plasma Drug X
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result"), opts.label = ifelse(packageVersion("tern") < "0.9.3.9020", "skip_test_strict", "")}
adpp0 <- adpp %>%
@@ -67,8 +71,15 @@ subtitles(result) <- paste("Analyte:", unique(adpp0$PPCAT), "\nVisit:", unique(a
result
```
+`r webr_code_labels <- c("setup", "lyt", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
#### Plasma Drug Y
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result"), opts.label = ifelse(packageVersion("tern") < "0.9.3.9020", "skip_test_strict", "")}
adpp1 <- adpp %>%
@@ -83,7 +94,11 @@ subtitles(result) <- paste("Analyte:", unique(adpp1$PPCAT), "\nVisit:", unique(a
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lyt", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -94,4 +109,5 @@ result
```
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/tables/pharmacokinetic/pkpt05.qmd b/book/tables/pharmacokinetic/pkpt05.qmd
index c83f941cae..767e293f29 100644
--- a/book/tables/pharmacokinetic/pkpt05.qmd
+++ b/book/tables/pharmacokinetic/pkpt05.qmd
@@ -5,15 +5,16 @@ subtitle: Summary of Urinary PK Parameters by Treatment Arm (Stats in Columns)
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(tern)
@@ -23,7 +24,7 @@ adpp <- adpp %>% filter(PPSPEC == "Urine", AVISIT == "CYCLE 1 DAY 1")
## Standard Table
-```{r}
+```{r lyt}
# lyt creation
lyt <- basic_table() %>%
split_rows_by(
@@ -72,6 +73,9 @@ lyt <- basic_table() %>%
#### Plasma Drug X
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result"), opts.label = ifelse(packageVersion("tern") < "0.9.3.9020", "skip_test_strict", "")}
adpp0 <- adpp %>%
@@ -86,8 +90,15 @@ subtitles(result) <- paste("Analyte:", unique(adpp0$PPCAT), "\nVisit:", unique(a
result
```
+`r webr_code_labels <- c("setup", "lyt", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
#### Plasma Drug Y
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result"), opts.label = ifelse(packageVersion("tern") < "0.9.3.9020", "skip_test_strict", "")}
adpp1 <- adpp %>%
@@ -102,7 +113,11 @@ subtitles(result) <- paste("Analyte:", unique(adpp1$PPCAT), "\nVisit:", unique(a
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lyt", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -113,4 +128,5 @@ result
```
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/tables/pharmacokinetic/pkpt06.qmd b/book/tables/pharmacokinetic/pkpt06.qmd
index 02b4afd314..d970631d9f 100644
--- a/book/tables/pharmacokinetic/pkpt06.qmd
+++ b/book/tables/pharmacokinetic/pkpt06.qmd
@@ -5,15 +5,16 @@ subtitle: Pharmacokinetic Parameter Summary -- Dose-Normalized PK Parameters (St
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(tern)
library(stringr)
@@ -25,7 +26,7 @@ adpp <- adpp %>%
## Standard Table
-```{r}
+```{r lyt}
# lyt creation
lyt <- basic_table() %>%
split_cols_by(
@@ -55,6 +56,9 @@ lyt <- basic_table() %>%
#### Plasma Drug X
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result"), opts.label = ifelse(packageVersion("tern") < "0.9.3.9020", "skip_test_strict", "")}
adpp0 <- adpp %>%
@@ -69,8 +73,15 @@ subtitles(result) <- paste("Analyte:", unique(adpp0$PPCAT), "\nVisit:", unique(a
result
```
+`r webr_code_labels <- c("setup", "lyt", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
#### Plasma Drug Y
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result"), opts.label = ifelse(packageVersion("tern") < "0.9.3.9020", "skip_test_strict", "")}
adpp1 <- adpp %>%
@@ -85,7 +96,11 @@ subtitles(result) <- paste("Analyte:", unique(adpp1$PPCAT), "\nVisit:", unique(a
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lyt", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -96,4 +111,5 @@ result
```
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/tables/pharmacokinetic/pkpt07.qmd b/book/tables/pharmacokinetic/pkpt07.qmd
index bd581a1ef8..908d18ea64 100644
--- a/book/tables/pharmacokinetic/pkpt07.qmd
+++ b/book/tables/pharmacokinetic/pkpt07.qmd
@@ -5,15 +5,16 @@ subtitle: Table of Mean Dose-Normalized Selected Pharmacokinetic Parameters (Sta
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(tern)
library(stringr)
@@ -25,7 +26,7 @@ adpp <- adpp %>%
## Standard Table -- Urine
-```{r}
+```{r lyt}
# lyt creation
lyt <- basic_table() %>%
split_rows_by(
@@ -74,6 +75,9 @@ lyt <- basic_table() %>%
#### Plasma Drug X
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result"), opts.label = ifelse(packageVersion("tern") < "0.9.3.9020", "skip_test_strict", "")}
adpp0 <- adpp %>%
@@ -88,8 +92,15 @@ subtitles(result) <- paste("Analyte:", unique(adpp0$PPCAT), "\nVisit:", unique(a
result
```
+`r webr_code_labels <- c("setup", "lyt", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
#### Plasma Drug Y
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result"), opts.label = ifelse(packageVersion("tern") < "0.9.3.9020", "skip_test_strict", "")}
adpp1 <- adpp %>%
@@ -104,7 +115,11 @@ subtitles(result) <- paste("Analyte:", unique(adpp1$PPCAT), "\nVisit:", unique(a
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "lyt", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -115,4 +130,5 @@ result
```
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/tables/pharmacokinetic/pkpt08.qmd b/book/tables/pharmacokinetic/pkpt08.qmd
index 7eb63be5ae..9e73b5067a 100644
--- a/book/tables/pharmacokinetic/pkpt08.qmd
+++ b/book/tables/pharmacokinetic/pkpt08.qmd
@@ -5,9 +5,9 @@ subtitle: Pharmacokinetic Parameter Summary of Cumulative Amount of Drug Elimina
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Pharmacokinetic Parameter Summary of Cumulative Amount of Drug Elimina
library(dplyr)
library(scda)
+library(scda.2022)
library(tern)
adpp <- synthetic_cdisc_dataset("latest", "adpp")
@@ -26,6 +27,9 @@ adpp <- adpp %>%
## Standard Table -- Plasma
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result"), opts.label = ifelse(packageVersion("tern") < "0.9.3.9020", "skip_test_strict", "")}
# create layout
@@ -86,7 +90,11 @@ subtitles(result) <- paste("Analyte:", unique(adpp0$PPCAT), "\nVisit:", unique(a
cat(rtables::toString(result, indent_size = 10))
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -98,4 +106,4 @@ cat(rtables::toString(result, indent_size = 10))
{{< include ../../repro.qmd >}}
-:::
+::::
diff --git a/book/tables/pharmacokinetic/pkpt11.qmd b/book/tables/pharmacokinetic/pkpt11.qmd
index 6c31d5e28c..f45e262449 100644
--- a/book/tables/pharmacokinetic/pkpt11.qmd
+++ b/book/tables/pharmacokinetic/pkpt11.qmd
@@ -5,9 +5,9 @@ subtitle: Pharmacokinetic Parameter Estimated Ratios of Geometric Means and 90%
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
@@ -15,6 +15,7 @@ subtitle: Pharmacokinetic Parameter Estimated Ratios of Geometric Means and 90%
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(tern)
@@ -113,6 +114,9 @@ afun_pk_gmr <- function(
## Standard Table -- Plasma
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
# create layout
lyt <- basic_table() %>%
@@ -159,7 +163,11 @@ subtitles(result) <- paste("Analyte:", unique(adpp0$PPCAT))
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -170,4 +178,5 @@ result
```
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/tables/risk-management-plan/rmpt01.qmd b/book/tables/risk-management-plan/rmpt01.qmd
index 2be1c4efca..1fcd7fcb94 100644
--- a/book/tables/risk-management-plan/rmpt01.qmd
+++ b/book/tables/risk-management-plan/rmpt01.qmd
@@ -5,9 +5,9 @@ subtitle: Duration of Exposure for Risk Management Plan
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Duration of Exposure for Risk Management Plan
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -57,6 +58,9 @@ adsl_f <- adsl %>% filter(adsl$SAFFL == "Y")
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
lyt <- basic_table(
title = "Duration of Exposure: Safety-Evaluable Patients",
@@ -78,10 +82,17 @@ result <- build_table(lyt, df = anl, alt_counts_df = adsl_f)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -89,6 +100,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
library(dplyr)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
@@ -157,5 +169,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/risk-management-plan/rmpt03.qmd b/book/tables/risk-management-plan/rmpt03.qmd
index c20cda635c..dea5539d88 100644
--- a/book/tables/risk-management-plan/rmpt03.qmd
+++ b/book/tables/risk-management-plan/rmpt03.qmd
@@ -5,9 +5,9 @@ subtitle: Extent of Exposure by Age Group and Gender for Risk Management Plan
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Extent of Exposure by Age Group and Gender for Risk Management Plan
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -66,6 +67,9 @@ adsl_f <- adsl %>%
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
lyt <- basic_table(
title = "Extent of Exposure by Age Group and Gender: Safety-Evaluable Patients",
@@ -87,8 +91,15 @@ result <- build_table(lyt, df = anl, alt_counts_df = adsl_f)
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Excluding Empty Age Groups
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
lyt <- basic_table(
title = "Duration of Exposure: Safety-Evaluable Patients",
@@ -111,10 +122,17 @@ result <- build_table(lyt, df = anl, alt_counts_df = adsl_f) %>%
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -122,6 +140,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
library(dplyr)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
@@ -203,5 +222,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/risk-management-plan/rmpt04.qmd b/book/tables/risk-management-plan/rmpt04.qmd
index 2a0f0902e6..eb24a9851d 100644
--- a/book/tables/risk-management-plan/rmpt04.qmd
+++ b/book/tables/risk-management-plan/rmpt04.qmd
@@ -5,9 +5,9 @@ subtitle: Extent of Exposure by Ethnic Origin for Risk Management Plan
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Extent of Exposure by Ethnic Origin for Risk Management Plan
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -49,6 +50,9 @@ adsl_f <- adsl %>% filter(adsl$SAFFL == "Y")
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
lyt <- basic_table(
title = "Extent of Exposure by Ethnic Origin: Safety-Evaluable Patients",
@@ -67,10 +71,17 @@ result <- build_table(lyt, df = anl, alt_counts_df = adsl_f)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -78,6 +89,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
library(dplyr)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
@@ -138,5 +150,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/risk-management-plan/rmpt05.qmd b/book/tables/risk-management-plan/rmpt05.qmd
index 9c0048d281..1774e556cf 100644
--- a/book/tables/risk-management-plan/rmpt05.qmd
+++ b/book/tables/risk-management-plan/rmpt05.qmd
@@ -5,9 +5,9 @@ subtitle: Extent of Exposure by Race for Risk Management Plan
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Extent of Exposure by Race for Risk Management Plan
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -49,6 +50,9 @@ adsl_f <- adsl %>% filter(adsl$SAFFL == "Y")
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
lyt <- basic_table(
title = "Extent of Exposure by Race: Safety-Evaluable Patients",
@@ -69,10 +73,17 @@ result <- build_table(lyt, df = anl, alt_counts_df = adsl_f)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -80,6 +91,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
library(dplyr)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
@@ -140,5 +152,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/risk-management-plan/rmpt06.qmd b/book/tables/risk-management-plan/rmpt06.qmd
index a92629b0d2..eb9dc3a08a 100644
--- a/book/tables/risk-management-plan/rmpt06.qmd
+++ b/book/tables/risk-management-plan/rmpt06.qmd
@@ -5,9 +5,9 @@ subtitle: Seriousness, Outcomes, Severity, Frequency with 95% CI for Risk Manage
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
The `adae` and `adsl` datasets need to undergo data processing before table production.
@@ -19,6 +19,7 @@ Some new variables are added to these datasets to create the desired tables.
library(tern)
library(dplyr)
library(scda)
+library(scda.2022)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
adae <- synthetic_cdisc_dataset("latest", "adae")
@@ -74,6 +75,9 @@ adsl1 <- adsl %>%
Please note that by default the percentage analysis uses Wald's confidence interval with continuity correction and the default confidence interval for percentage is 95%.
To use a different method for confidence interval calculation, the method name needs to be provided to `method` argument.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
lyt_adsl <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ACTARM") %>%
@@ -127,8 +131,15 @@ result <- rbind(
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Selecting
Sections to Display
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
lyt_adsl <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ACTARM") %>%
@@ -177,10 +188,17 @@ result <- rbind(
result
```
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table with Differences
Please note that by default the percentage difference analysis also uses Wald's confidence interval with continuity correction and the default confidence interval is 95%.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant3, test = list(result_v3 = "result")}
lyt_adsl <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ACTARM", ref_group = "A: Drug X") %>%
@@ -243,10 +261,17 @@ result <- rbind(
result
```
+`r webr_code_labels <- c("setup", "variant3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table Modifying Alpha Level and
Type of Confidence Interval
The confidence level can be changed through the `conf_level` argument.
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant4, test = list(result_v4 = "result")}
lyt_adsl <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ACTARM", ref_group = "A: Drug X") %>%
@@ -312,6 +337,10 @@ result <- rbind(
result
```
+`r webr_code_labels <- c("setup", "variant4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## Table by SMQ
```{r}
@@ -320,7 +349,7 @@ result
# In progress
```
-{{< include ../../test-utils/save_results.qmd >}}
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
@@ -331,4 +360,5 @@ result
```
{{< include ../../repro.qmd >}}
-:::
+
+::::
diff --git a/book/tables/safety/enrollment01.qmd b/book/tables/safety/enrollment01.qmd
index 48d098d3ce..ae2200d10d 100644
--- a/book/tables/safety/enrollment01.qmd
+++ b/book/tables/safety/enrollment01.qmd
@@ -5,9 +5,9 @@ subtitle: Enrollment Variants
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -16,6 +16,7 @@ subtitle: Enrollment Variants
library(dplyr)
library(forcats)
library(scda)
+library(scda.2022)
library(tern)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -46,6 +47,9 @@ adsl <- adsl %>%
## ENT01 -- Enrollment by Region,
Country, and Investigator Number
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
# Define the split function
split_fun <- drop_split_levels
@@ -66,8 +70,15 @@ result <- build_table(lyt, adsl) %>%
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## ENT01A -- Enrollment by Country
and Investigator Number
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ARM") %>%
@@ -83,8 +94,15 @@ result <- build_table(lyt, adsl) %>%
result
```
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## ENT02 -- Enrollment by Region, Country,
and Investigator Number/Name
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant3, test = list(result_v3 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ARM") %>%
@@ -102,8 +120,15 @@ result <- build_table(lyt, adsl) %>%
result
```
+`r webr_code_labels <- c("setup", "variant3")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## ENT02A -- Enrollment by Country
and Investigator Number/Name
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant4, test = list(result_v4 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ARM") %>%
@@ -119,10 +144,17 @@ result <- build_table(lyt, adsl) %>%
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant4")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
Note that for this module application, only the variables passed into `by_vars` are used when `row_groups` is selected.
Variables passed into `analyze_vars` are additionally used when `row_groups` is deselected.
@@ -133,9 +165,10 @@ library(teal.modules.clinical)
## Data reproducible code
data <- teal_data()
data <- within(data, {
- library(dplyr)
- library(forcats)
library(scda)
+ library(scda.2022)
+ library(dplyr)
+
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.
@@ -199,5 +232,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/vital-signs/vst01.qmd b/book/tables/vital-signs/vst01.qmd
index ee83c1a25e..b795a7c048 100644
--- a/book/tables/vital-signs/vst01.qmd
+++ b/book/tables/vital-signs/vst01.qmd
@@ -5,9 +5,9 @@ subtitle: Vital Sign Results and Change from Baseline by Visit
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
@@ -15,6 +15,7 @@ subtitle: Vital Sign Results and Change from Baseline by Visit
library(tern)
library(scda)
+library(scda.2022)
library(dplyr)
adsl <- synthetic_cdisc_dataset("latest", "adsl")
@@ -79,6 +80,9 @@ var_labels(advs_f) <- advs_label
## Standard Table
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
split_fun <- drop_split_levels
@@ -120,10 +124,17 @@ result <- build_table(lyt = lyt, df = advs_f, alt_counts_df = adsl)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app"), eval = packageVersion("teal.modules.clinical") >= "0.9.0.9007"}
library(teal.modules.clinical)
@@ -132,6 +143,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
library(dplyr)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
@@ -217,5 +229,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/book/tables/vital-signs/vst02.qmd b/book/tables/vital-signs/vst02.qmd
index 4d0ee5fafd..192f8639ad 100644
--- a/book/tables/vital-signs/vst02.qmd
+++ b/book/tables/vital-signs/vst02.qmd
@@ -5,15 +5,16 @@ subtitle: Vital Sign Abnormalities
------------------------------------------------------------------------
-{{< include ../../test-utils/envir_hook.qmd >}}
+{{< include ../../_utils/envir_hook.qmd >}}
-::: panel-tabset
+:::: {.panel-tabset}
## Data Setup
```{r setup, message = FALSE}
#| code-fold: show
library(scda)
+library(scda.2022)
library(dplyr)
library(tern)
@@ -38,6 +39,9 @@ split_fun <- drop_split_levels
## VST02_1 -- Table of Abnormalities
Regardless of Abnormality at Baseline
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant1, test = list(result_v1 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(var = "ACTARM") %>%
@@ -55,8 +59,15 @@ result <- build_table(lyt = lyt, df = advs_f, alt_counts_df = adsl)
result
```
+`r webr_code_labels <- c("setup", "variant1")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
## VST02_2 -- Table of Abnormalities Among
Subjects Without Abnormality at Baseline
+::: {.panel-tabset .nav-justified group="webr"}
+## {{< fa regular file-lines sm fw >}} Preview
+
```{r variant2, test = list(result_v2 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
split_cols_by(var = "ACTARM") %>%
@@ -74,10 +85,17 @@ result <- build_table(lyt = lyt, df = advs_f, alt_counts_df = adsl)
result
```
-{{< include ../../test-utils/save_results.qmd >}}
+`r webr_code_labels <- c("setup", "variant2")`
+{{< include ../../_utils/webr.qmd >}}
+:::
+
+{{< include ../../_utils/save_results.qmd >}}
## `teal` App
+::: {.panel-tabset .nav-justified}
+## {{< fa regular file-lines fa-sm fa-fw >}} Preview
+
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
@@ -85,6 +103,7 @@ library(teal.modules.clinical)
data <- teal_data()
data <- within(data, {
library(scda)
+ library(scda.2022)
library(dplyr)
ADSL <- synthetic_cdisc_dataset("latest", "adsl")
@@ -130,5 +149,9 @@ app <- init(
shinyApp(app$ui, app$server)
```
-{{< include ../../repro.qmd >}}
+{{< include ../../_utils/shinylive.qmd >}}
:::
+
+{{< include ../../repro.qmd >}}
+
+::::
diff --git a/package/DESCRIPTION b/package/DESCRIPTION
index 1e8b82fcce..4f09a95c5d 100644
--- a/package/DESCRIPTION
+++ b/package/DESCRIPTION
@@ -31,6 +31,7 @@ Suggests:
scales,
scda,
scda.2022,
+ shinylive,
stats,
stringr,
svglite,
diff --git a/package/README.md b/package/README.md
index 375095bf66..7d67ffa967 100644
--- a/package/README.md
+++ b/package/README.md
@@ -23,7 +23,7 @@ As an article author, you need to (i) register the hooks, (ii) use them where ap
(i) Register the hooks
-* At the beggining of the article, add the following: `{{< include ../../test-utils/envir_hook.qmd >}}`.
+* At the beggining of the article, add the following: `{{< include ../../_utils/envir_hook.qmd >}}`.
It will register the `knitr` hooks for further use and will not produce any visible changes to the content.
(ii) Use the hooks
@@ -41,7 +41,7 @@ It will register the `knitr` hooks for further use and will not produce any visi
(iii) Save the results
-* At the end of the article (after all chunks with outputs), add `{{< include ../../test-utils/save_results.qmd >}}` to save all objects as `.Rds` files.
+* At the end of the article (after all chunks with outputs), add `{{< include ../../_utils/save_results.qmd >}}` to save all objects as `.Rds` files.
This logic has been implemented in many articles already. Please refer to the existing ones for examples.