Skip to content

Conversation

@Gijsreyn
Copy link
Contributor

@Gijsreyn Gijsreyn commented Dec 19, 2025

Website redesign

This PR introduces a redesign of the DSC Community website with a modern, futuristic theme and improved user experience.

New Features

  • Modern Design System: New futuristic.css stylesheet with CSS custom properties for consistent spacing, typography, and colors
  • Enhanced Navigation: Improved header and footer layouts with better mobile responsiveness
  • Blog Improvements: Better card alignment and rewritten article introductions for clearer content previews
  • Community Section Redesign: Replaced tile-based navigation with streamlined navigation pills in the hero section
  • Guidelines Page: Simplified "All Guidelines" tiles to show only titles with unique, color-coded icons

Files Changed

New Layouts:

  • Section-specific layouts for: blog, community, community_calls, code_of_conduct, configmgt, guidelines, help, resources, styleguidelines
  • New header/footer partials (header-new.html, footer-new.html)
  • Custom 404 page

Updated Content:

  • Rewrote opening paragraphs in 8 blog articles for better excerpts
  • Updated frontmatter weights for proper page ordering in Community section
  • Removed type: "post" from community pages to use correct templates

Configuration:

  • Updated config.toml with corrected menu items
  • Added .prettierignore to prevent auto-formatter from breaking Hugo templates

Here's a screenshot when running locally:

image

This change is Reviewable

@coderabbitai
Copy link

coderabbitai bot commented Dec 19, 2025

Walkthrough

Large site redesign: new CSS design system, site-wide JS (theme, mobile menu, search modal, animations), updated Hugo configuration and navigation, and many new/rewritten Hugo layout templates and content adjustments across blog, community, help, guidelines, resources, and homepage.

Changes

Cohort / File(s) Summary
Prettier / Config
\.prettierignore, config.toml
Added .prettierignore entry to exclude Hugo layouts; config.toml updated with Git metadata, highlight settings, new color params, feature flags (enableSearch, enableDarkMode), expanded Languages.en params, updated menu structure and social links.
Design system
assets/css/futuristic.css
New comprehensive CSS design system: tokens (colors, spacing, typography), dark-mode support, reset/base styles, responsive utilities, components (header, hero, cards, buttons, sidebar, footer), animations and utility classes.
Client JS / Interactivity
assets/js/main.js
New client-side script initializing on DOMContentLoaded: theme persistence and toggle, header scroll effects, mobile menu, search modal with client-side index, keyboard navigation and highlights, smooth anchors, code highlighting init, IntersectionObserver animations; exposes window toggles (theme/menu/search/year).
Base layout & assets
layouts/_default/baseof.html, layouts/404.html
New full HTML skeleton with theme init, meta/OG tags, font preconnect, asset pipeline (minify/fingerprint), Highlight.js integration, skip-to-content, and persistent search modal; added 404 page template.
Header / Footer partials
layouts/partials/header-new.html, layouts/partials/footer-new.html
New sticky header partial with logo, nav (dropdowns), search/theme/mobile actions and accessibility attributes; new footer partial with brand, links, social icons and legal/footer row.
Default templates
layouts/_default/list.html, layouts/_default/single.html
Reworked list and single templates: hero headers, two-column layouts (sidebar nav + main content), TOC injection, article metadata, edit/pagination cards, and revised content structure.
Homepage
layouts/index.html
New homepage with animated hero, features, stats, latest blog posts, community calls preview, and CTAs.
Blog templates
layouts/blog/list.html, layouts/blog/single.html
New blog index with tag filter bar and post grid; blog single with article header (author/date/reading time), tags, share links, and prev/next nav.
Resources templates
layouts/resources/list.html, layouts/resources/single.html
Resources index converted to card/grid layout with client-side filter input and quick-stats; single resource page with helpful links panel.
Community / Maintainers
layouts/community/list.html, layouts/community/single.html, layouts/community/maintainers.html
Community landing with nav pills, CTAs, content area; community single with sidebar nav; maintainers page with two-column layout and maintainers grid.
Community Calls
layouts/community_calls/list.html, layouts/community_calls/single.html
Community Calls index with join actions and year-grouped timeline; single call template with metadata, YouTube link, related resources and prev/next.
Guidelines / Style / Help / Code of Conduct
layouts/guidelines/*, layouts/styleguidelines/*, layouts/help/*, layouts/code_of_conduct/*
New index and single templates across Guidelines, Style Guidelines, Help, and Code of Conduct: hero headers, two-column layouts with sidebar navigation/TOC, cards or lists, CTA sections, and prev/next navigation.
Partials & Misc templates
layouts/blog/*, various new layouts/* templates (many new files: e.g., /blog/*, /configmgt/*, /faq/list.html, etc.)
Numerous added or replaced section templates (faq, configmgt, styleguidelines, code_of_conduct, community_calls, configmgt, help, etc.) implementing consistent hero/sidebar/content patterns and UI components.
Content updates (blog & community)
content/blog/*.md, content/community/*.md, content/help/_index.en.md
Multiple blog posts and community/help pages: rewritten/expanded intros, reflowed sections, front-matter tweaks (some added type: "post"), and front-matter weight adjustments across community pages.

Sequence Diagram(s)

mermaid
sequenceDiagram
participant User
participant Browser
participant mainJS as assets/js/main.js
participant Index as SearchIndex
participant Storage as LocalStorage

User->>Browser: open page / interact (click search, theme toggle)
Browser->>mainJS: DOMContentLoaded -> init (theme from Storage, observers)
mainJS->>Storage: get theme preference
Storage-->>mainJS: return preference
mainJS->>Browser: apply theme, attach handlers
User->>Browser: open search modal / type query
Browser->>mainJS: search input events (debounced)
mainJS->>Index: query client-side index / highlight matches
Index-->>mainJS: results
mainJS->>Browser: render results, manage keyboard navigation

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60–75 minutes

Areas requiring extra attention:

  • assets/js/main.js — search index build, keyboard handling, debouncing, theme persistence, and global window exports
  • assets/css/futuristic.css — token correctness, dark-mode coverage, responsive rules and component consistency
  • layouts/_default/baseof.html — asset pipeline/fingerprinting, theme init timing, accessibility of search modal
  • layouts/_default/list.html and single.html — sidebar active-state logic, TOC injection, pagination conditions
  • config.toml — menu structure consistency versus header partial expectations and feature flags interactions

Pre-merge checks

❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 40.91% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
Title check ❓ Inconclusive The title 'New website layout' is overly vague and does not capture the main change — a comprehensive website redesign with a modern, futuristic theme and multiple layout/styling updates. Use a more specific title that reflects the redesign scope, such as 'Redesign website with futuristic theme and improved layouts' or 'Introduce website redesign with new CSS system and layouts'.
✅ Passed checks (1 passed)
Check name Status Explanation
Description check ✅ Passed The pull request description clearly outlines the redesign objectives, lists new features, details file changes, and explains configuration updates — all directly related to the changeset.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 13

🧹 Nitpick comments (35)
layouts/help/list.html (3)

39-104: Consider extracting repeated inline styles to CSS classes.

The Quick Links section has significant inline styling that duplicates similar patterns across other templates in this PR. Consider extracting common patterns like the link styling (lines 61-69, 76-84, 91-98) into reusable CSS classes in futuristic.css.


162-177: Substring matching for icon selection may be fragile.

Using in .Title performs substring matching, so a page titled "What is DSC Configuration" would match "What is DSC" but also any title containing "Future" anywhere. Consider using eq for exact matches or more specific substrings.

🔎 Suggested improvement
-{{ if in .Title "What is DSC" }}
+{{ if eq .Title "What is DSC" }}
 <i
   class="ri-lightbulb-line"
   style="color: white; font-size: 1.5rem"
 ></i>
-{{ else if in .Title "Future" }}
+{{ else if eq .Title "The Future of DSC" }}

Alternatively, consider using frontmatter to specify icons directly in content files for more flexibility.


259-276: Add noreferrer to external links for privacy.

External links have rel="noopener" which is good for security, but consider adding noreferrer as well to prevent leaking referrer information to external sites.

🔎 Suggested fix
 <a
   href="https://aka.ms/psslack"
   class="btn btn-primary"
   target="_blank"
-  rel="noopener"
+  rel="noopener noreferrer"
 >
content/blog/updating-sampler-github-tasks.md (1)

30-30: Line exceeds 80 character limit.

Per coding guidelines, Markdown lines should wrap at word boundaries when over 80 characters (except for tables/code blocks). This line and several others (e.g., lines 16, 19-21) exceed this limit.

🔎 Example fix for line 30
-In short, the GitHub tasks are now packaged in the `Sampler.GitHubTasks` module which depends upon the [PowerShellForGitHub](https://github.com/microsoft/PowerShellForGitHub/) module.
+In short, the GitHub tasks are now packaged in the `Sampler.GitHubTasks`
+module which depends upon the
+[PowerShellForGitHub](https://github.com/microsoft/PowerShellForGitHub/) module.
layouts/resources/list.html (3)

54-63: Hardcoded statistics may become stale.

The stats "1M+ Total Downloads" and "100+ Contributors" are hardcoded and will require manual updates to stay accurate. Consider either:

  1. Removing these stats if they can't be dynamically generated
  2. Adding a comment noting when they were last updated
  3. Fetching from an API or data file if available

226-250: Consider adding debounce to search for performance.

The filterResources function is called on every keystroke. With a large number of resources, this could cause performance issues. Consider adding a debounce.

🔎 Example with debounce
 <script>
+  let searchTimeout;
   function filterResources(query) {
+    clearTimeout(searchTimeout);
+    searchTimeout = setTimeout(() => {
+      performFilter(query);
+    }, 150);
+  }
+
+  function performFilter(query) {
     const grid = document.getElementById("resourceGrid");
     const cards = grid.querySelectorAll(".resource-card");
     // ... rest of the function
+  }
 </script>

148-167: Add noreferrer to external links.

The GitHub and PowerShell Gallery links have target="_blank" and rel="noopener noreferrer" on line 152, which is correct. However, ensure consistency with the CTA section links (lines 205-217) which are missing noreferrer.

🔎 Fix for CTA GitHub link
 <a
   href="https://github.com/dsccommunity"
   class="btn btn-secondary btn-lg"
   target="_blank"
-  rel="noopener noreferrer"
+  rel="noopener noreferrer"
 >

Note: Line 209 already has the correct rel attribute. The resource card links at lines 151-152 are also correct.

layouts/configmgt/list.html (1)

39-108: Consider extracting repeated inline styles to CSS classes.

The Quick Links section uses extensive inline styles that repeat patterns already defined in futuristic.css. While this works, extracting these to reusable classes would improve maintainability and reduce template verbosity.

For example, the link styling pattern (lines 61-69, 76-84, 95-101) could use a shared class.

config.toml (1)

136-138: Consider updating Twitter social link to X.com.

Twitter has rebranded to X. While the current URL still works via redirect, you may want to update it for consistency with current branding.

🔎 Proposed update
 [[Languages.en.params.socialIcon]]
 icon = "ti-twitter-alt"
-URL = "https://twitter.com/dsccommunity"
+URL = "https://x.com/dsccommunity"
layouts/community/single.html (1)

45-55: Remove or implement commented-out and empty sections.

The commented-out "Table of Contents" block (lines 45-51) and the empty "Quick Links" section (lines 53-55) appear to be incomplete artifacts. Consider either implementing these features or removing them to keep the template clean.

layouts/community_calls/list.html (2)

17-17: Hardcoded Teams meeting link with embedded tenant/user GUIDs.

The Teams meeting URL contains embedded GUIDs (Tid, Oid). If these identifiers change (e.g., meeting recreation, user changes), the link will break. Consider whether this URL should be externalized to config.toml or a data file for easier maintenance.


46-46: Hardcoded phone dial-in details.

The phone number and conference ID are hardcoded. If these change, they'll need template edits. Consider moving these to site params or a data file for centralized management.

layouts/guidelines/list.html (1)

110-124: Consider using CSS variables for icon colors.

The inline hex colors (#a855f7, #ec4899, #f97316) and the gradient color (#059669 on line 85) could be defined as CSS custom properties for consistency with the design system. This would make theme updates easier.

<!-- Example: define in futuristic.css and use here -->
<i class="ri-palette-line" style="color: var(--color-purple); font-size: 1.25rem;"></i>
layouts/code_of_conduct/single.html (1)

126-128: Minor: Template tags formatting.

Line 128 concatenates {{ end }} and {{ with .NextInSection }} on the same line. While functional, separating them improves readability.

           {{ else }}
           <div></div>
-          {{ end }} {{ with .NextInSection }}
+          {{ end }}
+          {{ with .NextInSection }}
           <a
layouts/configmgt/single.html (1)

99-101: Minor: Same template tag formatting as other files.

Same pattern as other single templates - consider separating {{ end }} and {{ with .NextInSection }} onto separate lines for consistency and readability.

layouts/_default/single.html (2)

10-17: Hardcoded RGBA colors in breadcrumb.

The breadcrumb uses hardcoded rgba(255,255,255,...) values. For consistency with the design system and dark mode support, consider using CSS custom properties or existing text color variables.

-          <li><a href="{{ .Site.BaseURL }}" style="color: rgba(255,255,255,0.7);">Home</a></li>
-          <li style="color: rgba(255,255,255,0.5);">/</li>
+          <li><a href="{{ .Site.BaseURL }}" style="color: var(--text-secondary);">Home</a></li>
+          <li style="color: var(--text-tertiary);">/</li>

114-148: Consider moving TOC script to main.js.

The inline TOC generation script could be moved to assets/js/main.js for better maintainability and to follow the separation of concerns established elsewhere in the PR (where main.js handles theme management, search, etc.).

The script itself is well-written with proper null checks and handles the case where headings lack IDs.

layouts/help/single.html (1)

60-130: Consider extracting the article navigation into a partial.

The prev/next navigation block (lines 60-130) with its extensive inline styles is duplicated across multiple templates (help/single.html, guidelines/single.html, configmgt/single.html). Extracting this into a reusable partial like partials/article-nav.html would reduce duplication and ease future styling changes.

🔎 Example partial extraction

Create layouts/partials/article-nav.html:

<nav class="article-nav" style="margin-top: var(--space-12); padding-top: var(--space-6); border-top: 1px solid var(--border-primary); display: flex; justify-content: space-between; gap: var(--space-4); flex-wrap: wrap;">
  {{ with .PrevInSection }}
  <a href="{{ .Permalink }}" class="article-nav-link prev" style="text-decoration: none; display: flex; align-items: center; gap: var(--space-2); color: var(--text-secondary);">
    <i class="ri-arrow-left-line"></i>
    <span>
      <span style="display: block; font-size: var(--text-xs); color: var(--text-tertiary);">Previous</span>
      <span style="color: var(--text-primary); font-weight: 500;">{{ .Title }}</span>
    </span>
  </a>
  {{ else }}
  <div></div>
  {{ end }}
  {{ with .NextInSection }}
  <a href="{{ .Permalink }}" class="article-nav-link next" style="text-decoration: none; display: flex; align-items: center; gap: var(--space-2); color: var(--text-secondary); text-align: right;">
    <span>
      <span style="display: block; font-size: var(--text-xs); color: var(--text-tertiary);">Next</span>
      <span style="color: var(--text-primary); font-weight: 500;">{{ .Title }}</span>
    </span>
    <i class="ri-arrow-right-line"></i>
  </a>
  {{ end }}
</nav>

Then use it with: {{ partial "article-nav.html" . }}

layouts/blog/list.html (1)

69-76: Empty state may be unreachable due to placement.

The empty state block (lines 70-76) checks if eq (len .Data.Pages) 0, but since the grid range (lines 43-66) would simply produce no cards when empty, this works correctly. However, consider moving the empty state check to wrap the entire grid section for clearer intent.

layouts/community/list.html (2)

17-27: Prefer CSS :hover over inline JavaScript for hover effects.

Lines 18-26 use onmouseover/onmouseout handlers for hover styling. This approach is fragile (styles are hardcoded strings), harder to maintain, and doesn't work well with keyboard focus states.

🔎 Proposed fix using CSS

Add a class and use CSS instead:

-        <a href="{{ .Permalink }}" style="display: inline-flex; align-items: center; gap: var(--space-2); padding: var(--space-2) var(--space-4); background: var(--bg-secondary); border: 1px solid var(--border-primary); border-radius: var(--radius-full); color: var(--text-secondary); font-size: var(--text-sm); font-weight: 500; text-decoration: none; transition: all 0.2s ease;" onmouseover="this.style.background='var(--color-primary)'; this.style.color='white'; this.style.borderColor='var(--color-primary)';" onmouseout="this.style.background='var(--bg-secondary)'; this.style.color='var(--text-secondary)'; this.style.borderColor='var(--border-primary)';">
+        <a href="{{ .Permalink }}" class="nav-pill">

Then in your CSS (e.g., futuristic.css):

.nav-pill {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  padding: var(--space-2) var(--space-4);
  background: var(--bg-secondary);
  border: 1px solid var(--border-primary);
  border-radius: var(--radius-full);
  color: var(--text-secondary);
  font-size: var(--text-sm);
  font-weight: 500;
  text-decoration: none;
  transition: all 0.2s ease;
}
.nav-pill:hover, .nav-pill:focus {
  background: var(--color-primary);
  color: white;
  border-color: var(--color-primary);
}

This also adds keyboard accessibility via :focus.


19-24: Icon mapping is duplicated across templates.

The title-to-icon mapping (Maintainers → ri-user-star-line, Committee → ri-group-line, etc.) appears in multiple templates. Consider extracting this into a partial like partials/community-icon.html that accepts a title parameter.

layouts/guidelines/single.html (1)

53-106: Hardcoded "See Also" links may become stale.

The quick links section (lines 76-104) contains hardcoded URLs (/styleguidelines, /resources). If these paths change, this template won't update automatically.

Consider using Hugo's ref function or site configuration to make these links more maintainable:

🔎 Example using site data or ref
<a href="{{ ref . "/styleguidelines" }}" ...>

Or define related links in frontmatter/config and iterate over them.

layouts/partials/header-new.html (2)

137-149: Moon icon visibility managed via inline style.

Line 139 uses style="display: none" to hide the moon icon. This tightly couples the initial state to the HTML. The toggleTheme() function in JS will need to toggle this inline style, which is less maintainable than using CSS classes.

🔎 Proposed approach

Use a class-based approach:

 <svg
   class="moon-icon"
-  style="display: none"
+  class="moon-icon hidden"
   ...

Then toggle the hidden class in JavaScript.


152-169: GitHub link reuses theme-toggle class.

Line 155 applies class="theme-toggle" to the GitHub link. While this may provide consistent styling, it's semantically misleading. Consider using a more generic class like header-action-btn or icon-btn.

layouts/index.html (3)

39-43: Search input accessibility could be improved.

The hero search input (lines 40-43) is readonly and opens a modal on click. Consider adding role="button" and keyboard handling for better accessibility, so users can activate it with Enter/Space.

🔎 Proposed fix
-        <input type="text" placeholder="Search documentation, resources, and more..." onclick="openSearchModal()" readonly>
+        <input type="text" placeholder="Search documentation, resources, and more..." onclick="openSearchModal()" onkeydown="if(event.key==='Enter'||event.key===' ')openSearchModal()" readonly role="button" tabindex="0" aria-label="Open search">

Alternatively, use a <button> styled to look like an input for proper semantics.


66-84: Icon mapping is duplicated across multiple templates.

The .Params.Icon to Remix Icon mapping (lines 66-84) is duplicated in layouts/index.html, layouts/_default/list.html, and elsewhere. Consider extracting this into a partial.

🔎 Example partial

Create layouts/partials/icon-map.html:

{{- $icon := . -}}
{{- if eq $icon "ti-user" -}}<i class="ri-team-line"></i>
{{- else if eq $icon "ti-package" -}}<i class="ri-apps-2-line"></i>
{{- else if eq $icon "ti-book" -}}<i class="ri-book-open-line"></i>
{{- else if eq $icon "ti-rss-alt" -}}<i class="ri-article-line"></i>
{{- else if eq $icon "ti-settings" -}}<i class="ri-settings-3-line"></i>
{{- else if eq $icon "ti-headphone-alt" -}}<i class="ri-headphone-line"></i>
{{- else if eq $icon "ti-help-alt" -}}<i class="ri-question-line"></i>
{{- else if eq $icon "ti-shield" -}}<i class="ri-shield-check-line"></i>
{{- else -}}<i class="ri-folder-line"></i>
{{- end -}}

Usage: {{ partial "icon-map.html" .Params.Icon }}


208-219: Filter assumes specific title string "Community Calls".

Line 210 filters out pages with title exactly matching "Community Calls". This is fragile if the title changes. Consider using a frontmatter flag or checking the page's .IsSection property instead.

🔎 Proposed fix
-          {{ if ne .Title "Community Calls" }}
+          {{ if not .IsSection }}

Or add a frontmatter field like exclude_from_list: true to the section page.

layouts/blog/single.html (2)

27-37: Author avatar handles edge case gracefully.

The author initial extraction {{ substr . 0 1 }} (line 30) is wrapped in {{ with .Params.author }}, so it won't render for missing authors. However, if author is an empty string, substr "" 0 1 returns empty, resulting in a blank avatar circle.

🔎 Defensive check
 {{ with .Params.author }}
+{{ if . }}
 <div style="display: flex; align-items: center; gap: var(--space-2);">
   ...
 </div>
+{{ end }}
 {{ end }}

Or provide a default initial:

{{ substr (default "?" .) 0 1 }}

95-116: Navigation uses grid layout instead of flex.

This blog navigation (line 96) uses grid-template-columns: 1fr 1fr while other templates use flexbox for prev/next navigation. This creates visual inconsistency and may behave differently on mobile (grid maintains columns, flex wraps).

Consider aligning with the flex-based pattern used in help/single.html and guidelines/single.html for consistency, or extract a shared navigation partial.

layouts/_default/list.html (1)

8-30: Icon mapping duplicated once more.

Lines 10-28 repeat the same icon mapping logic found in layouts/index.html (lines 66-84). This is the third occurrence. Strongly recommend extracting into a partial to follow DRY principles.

See the partial suggestion in the layouts/index.html review.

assets/js/main.js (3)

19-41: Minor: updateThemeToggle is called twice during initialization.

initTheme() calls both setTheme(theme) (line 25) and updateThemeToggle(theme) (line 26), but setTheme() already calls updateThemeToggle() on line 40. Consider removing the redundant call.

Proposed fix
 function initTheme() {
   const theme =
     localStorage.getItem("theme") ||
     (window.matchMedia("(prefers-color-scheme: dark)").matches
       ? "dark"
       : "light");
   setTheme(theme);
-  updateThemeToggle(theme);

   // Listen for system theme changes

71-92: Unused variable lastScroll.

The variable lastScroll is assigned but never read. It appears to be leftover from removed hide-on-scroll functionality.

Proposed fix
 function initHeader() {
   const header = document.getElementById("siteHeader");
   if (!header) return;

-  let lastScroll = 0;
-
   window.addEventListener(
     "scroll",
     () => {
       const currentScroll = window.pageYOffset;

       if (currentScroll > 50) {
         header.classList.add("scrolled");
       } else {
         header.classList.remove("scrolled");
       }
-
-      lastScroll = currentScroll;
     },
     { passive: true }
   );
 }

361-367: Consider: Elements may remain invisible if animation fails.

Setting opacity: "0" via JavaScript means elements are initially visible, then hidden by JS, then revealed by the observer. If the observer fails or the class doesn't trigger correctly, elements stay invisible. Consider using a CSS class for the initial hidden state that's more robust.

Alternatively, define .animate-target { opacity: 0; } in CSS and add that class here instead of inline styles, with .animate-fade-in-up { opacity: 1; } overriding it.

layouts/_default/baseof.html (2)

29-39: Add Subresource Integrity (SRI) hashes to CDN resources and update library versions.

The external CDN resources lack integrity attributes. Additionally, remixicon is using version 4.0.0 (latest: 4.7.0) and highlight.js is using version 11.9.0 (latest: 11.11.1). Consider updating to the latest versions and adding SRI hashes for enhanced security.


133-139: Add SRI hashes and crossorigin attributes for highlight.js CDN scripts.

These external scripts should include integrity and crossorigin attributes for security. See DIGESTS.md for hash values.

📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4898926 and 885c930.

📒 Files selected for processing (46)
  • .prettierignore (1 hunks)
  • assets/css/futuristic.css (1 hunks)
  • assets/js/main.js (1 hunks)
  • config.toml (2 hunks)
  • content/blog/DSC-is-dead-long-live-dsc.en.md (2 hunks)
  • content/blog/add-codecov-support-to-repository.md (1 hunks)
  • content/blog/class-based-dsc-resources.md (9 hunks)
  • content/blog/convert-a-module-for-continuous-delivery.en.md (1 hunks)
  • content/blog/convert-master-to-main.en.md (1 hunks)
  • content/blog/convert-tests-to-pester5-for-dsc-community-repository.md (1 hunks)
  • content/blog/converting-tests-to-pester5.md (1 hunks)
  • content/blog/create-an-article.en.md (1 hunks)
  • content/blog/updating-sampler-github-tasks.md (4 hunks)
  • content/blog/use-dscresource-common-functions-in-module.en.md (1 hunks)
  • content/community/committee.en.md (1 hunks)
  • content/community/contact.en.md (1 hunks)
  • content/community/maintainers.en.md (1 hunks)
  • content/community/ownership.en.md (1 hunks)
  • content/help/_index.en.md (1 hunks)
  • layouts/404.html (1 hunks)
  • layouts/_default/baseof.html (1 hunks)
  • layouts/_default/list.html (1 hunks)
  • layouts/_default/single.html (1 hunks)
  • layouts/blog/list.html (1 hunks)
  • layouts/blog/single.html (1 hunks)
  • layouts/code_of_conduct/list.html (1 hunks)
  • layouts/code_of_conduct/single.html (1 hunks)
  • layouts/community/list.html (1 hunks)
  • layouts/community/maintainers.html (1 hunks)
  • layouts/community/single.html (1 hunks)
  • layouts/community_calls/list.html (1 hunks)
  • layouts/community_calls/single.html (1 hunks)
  • layouts/configmgt/list.html (1 hunks)
  • layouts/configmgt/single.html (1 hunks)
  • layouts/faq/list.html (1 hunks)
  • layouts/guidelines/list.html (1 hunks)
  • layouts/guidelines/single.html (1 hunks)
  • layouts/help/list.html (1 hunks)
  • layouts/help/single.html (1 hunks)
  • layouts/index.html (1 hunks)
  • layouts/partials/footer-new.html (1 hunks)
  • layouts/partials/header-new.html (1 hunks)
  • layouts/resources/list.html (1 hunks)
  • layouts/resources/single.html (1 hunks)
  • layouts/styleguidelines/list.html (1 hunks)
  • layouts/styleguidelines/single.html (1 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
**

⚙️ CodeRabbit configuration file

**: # DSC Community Guidelines

Terminology

  • Command: Public command
  • Function: Private function
  • Resource: DSC class-based resource

Build & Test Workflow Requirements

  • Run PowerShell script files from repository root
  • Setup build and test environment (once per pwsh session): ./build.ps1 -Tasks noop
  • Build project before running tests: ./build.ps1 -Tasks build
  • Always run tests in new pwsh session: Invoke-Pester -Path @({test paths}) -Output Detailed

File Organization

  • Public commands: source/Public/{CommandName}.ps1
  • Private functions: source/Private/{FunctionName}.ps1
  • Classes: source/Classes/{DependencyGroupNumber}.{ClassName}.ps1
  • Enums: source/Enum/{DependencyGroupNumber}.{EnumName}.ps1
  • Unit tests: tests/Unit/{Classes|Public|Private}/{Name}.Tests.ps1
  • Integration tests: tests/Integration/Commands/{CommandName}.Integration.Tests.ps1

Requirements

  • Follow instructions over existing code patterns
  • Follow PowerShell style and test guideline instructions strictly
  • Always update CHANGELOG.md Unreleased section
  • Localize all strings using string keys; remove any orphaned string keys
  • Check DscResource.Common before creating private functions
  • Separate reusable logic into private functions
  • DSC resources should always be created as class-based resources
  • Add unit tests for all commands/functions/resources
  • Add integration tests for all public commands and resources

Files:

  • layouts/community_calls/single.html
  • content/blog/convert-tests-to-pester5-for-dsc-community-repository.md
  • content/blog/use-dscresource-common-functions-in-module.en.md
  • layouts/code_of_conduct/list.html
  • content/community/maintainers.en.md
  • content/blog/convert-a-module-for-continuous-delivery.en.md
  • layouts/faq/list.html
  • content/community/contact.en.md
  • layouts/_default/list.html
  • content/blog/class-based-dsc-resources.md
  • content/help/_index.en.md
  • layouts/_default/single.html
  • content/blog/converting-tests-to-pester5.md
  • layouts/index.html
  • content/community/ownership.en.md
  • layouts/resources/list.html
  • layouts/blog/list.html
  • layouts/community/single.html
  • layouts/code_of_conduct/single.html
  • layouts/community/list.html
  • assets/css/futuristic.css
  • assets/js/main.js
  • content/blog/convert-master-to-main.en.md
  • layouts/community_calls/list.html
  • layouts/styleguidelines/list.html
  • layouts/help/single.html
  • layouts/community/maintainers.html
  • layouts/_default/baseof.html
  • layouts/partials/footer-new.html
  • layouts/configmgt/list.html
  • layouts/resources/single.html
  • layouts/styleguidelines/single.html
  • layouts/help/list.html
  • layouts/partials/header-new.html
  • layouts/blog/single.html
  • layouts/404.html
  • layouts/guidelines/list.html
  • content/blog/add-codecov-support-to-repository.md
  • layouts/configmgt/single.html
  • content/blog/create-an-article.en.md
  • layouts/guidelines/single.html
  • config.toml
  • content/community/committee.en.md
  • content/blog/DSC-is-dead-long-live-dsc.en.md
  • content/blog/updating-sampler-github-tasks.md
**/*.md

⚙️ CodeRabbit configuration file

**/*.md: # Markdown Style Guidelines

  • Wrap lines at word boundaries when over 80 characters (except tables/code blocks)
  • Use 2 spaces for indentation
  • Use '1.' for all items in ordered lists (1/1/1 numbering style)
  • Disable MD013 rule by adding a comment for tables/code blocks exceeding 80 characters
  • Empty lines required before/after code blocks and headings (except before line 1)
  • Escape backslashes in file paths only (not in code blocks)
  • Code blocks must specify language identifiers

Text Formatting

  • Parameters: bold
  • Values/literals: inline code
  • Resource/module/product names: italic
  • Commands/files/paths: inline code

Files:

  • content/blog/convert-tests-to-pester5-for-dsc-community-repository.md
  • content/blog/use-dscresource-common-functions-in-module.en.md
  • content/community/maintainers.en.md
  • content/blog/convert-a-module-for-continuous-delivery.en.md
  • content/community/contact.en.md
  • content/blog/class-based-dsc-resources.md
  • content/help/_index.en.md
  • content/blog/converting-tests-to-pester5.md
  • content/community/ownership.en.md
  • content/blog/convert-master-to-main.en.md
  • content/blog/add-codecov-support-to-repository.md
  • content/blog/create-an-article.en.md
  • content/community/committee.en.md
  • content/blog/DSC-is-dead-long-live-dsc.en.md
  • content/blog/updating-sampler-github-tasks.md
🧠 Learnings (58)
📚 Learning: 2025-11-27T17:59:27.205Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-pester.instructions.md:0-0
Timestamp: 2025-11-27T17:59:27.205Z
Learning: Applies to **/*.[Tt]ests.ps1 : Use Pester v5 syntax only

Applied to files:

  • content/blog/convert-tests-to-pester5-for-dsc-community-repository.md
  • content/blog/converting-tests-to-pester5.md
📚 Learning: 2025-08-10T15:11:52.897Z
Learnt from: dan-hughes
Repo: dsccommunity/ActiveDirectoryDsc PR: 741
File: azure-pipelines.yml:104-104
Timestamp: 2025-08-10T15:11:52.897Z
Learning: In the ActiveDirectoryDsc project, HQRM (High Quality Resource Module) tests must run in PowerShell 5 (Windows PowerShell) using `pwsh: false` in the Azure Pipelines configuration, while unit tests can run in PowerShell 7 (PowerShell Core) with `pwsh: true`. This differentiation is intentional due to HQRM's specific requirements and dependencies on Windows PowerShell.

Applied to files:

  • content/blog/convert-tests-to-pester5-for-dsc-community-repository.md
  • content/blog/class-based-dsc-resources.md
  • content/blog/converting-tests-to-pester5.md
📚 Learning: 2025-08-28T15:44:12.628Z
Learnt from: johlju
Repo: dsccommunity/SqlServerDsc PR: 2150
File: .github/instructions/dsc-community-style-guidelines-pester.instructions.md:35-35
Timestamp: 2025-08-28T15:44:12.628Z
Learning: The repository uses RequiredModules.psd1 to specify Pester version requirements with RequiredVersion = 'latest', which ensures compatibility with Should -Invoke syntax (requires Pester 5.4+).

Applied to files:

  • content/blog/convert-tests-to-pester5-for-dsc-community-repository.md
  • content/blog/class-based-dsc-resources.md
  • content/blog/converting-tests-to-pester5.md
📚 Learning: 2025-11-27T18:00:35.078Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines.instructions.md:0-0
Timestamp: 2025-11-27T18:00:35.078Z
Learning: Follow PowerShell style and test guideline instructions strictly

Applied to files:

  • content/blog/convert-tests-to-pester5-for-dsc-community-repository.md
  • content/blog/converting-tests-to-pester5.md
📚 Learning: 2025-08-28T15:44:12.628Z
Learnt from: johlju
Repo: dsccommunity/SqlServerDsc PR: 2150
File: .github/instructions/dsc-community-style-guidelines-pester.instructions.md:35-35
Timestamp: 2025-08-28T15:44:12.628Z
Learning: The SqlServerDsc repository uses RequiredModules.psd1 to specify Pester with Version = 'latest' and AllowPrerelease = $true, ensuring the latest Pester version (well beyond 5.4) is available, which supports Should -Invoke syntax and other modern Pester features.

Applied to files:

  • content/blog/convert-tests-to-pester5-for-dsc-community-repository.md
  • content/blog/class-based-dsc-resources.md
  • content/blog/converting-tests-to-pester5.md
📚 Learning: 2025-11-27T17:59:27.205Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-pester.instructions.md:0-0
Timestamp: 2025-11-27T17:59:27.205Z
Learning: Applies to **/*.[Tt]ests.ps1 : Use nested `Context` blocks for complex scenarios

Applied to files:

  • content/blog/convert-tests-to-pester5-for-dsc-community-repository.md
  • content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:59:27.205Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-pester.instructions.md:0-0
Timestamp: 2025-11-27T17:59:27.205Z
Learning: Applies to **/*.[Tt]ests.ps1 : PascalCase: `Describe`, `Context`, `It`, `Should`, `BeforeAll`, `BeforeEach`, `AfterAll`, `AfterEach`

Applied to files:

  • content/blog/convert-tests-to-pester5-for-dsc-community-repository.md
  • content/blog/converting-tests-to-pester5.md
📚 Learning: 2025-11-27T17:59:27.205Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-pester.instructions.md:0-0
Timestamp: 2025-11-27T17:59:27.205Z
Learning: Applies to **/*.[Tt]ests.ps1 : Avoid unnecessary remove/recreate cycles

Applied to files:

  • content/blog/convert-tests-to-pester5-for-dsc-community-repository.md
📚 Learning: 2025-11-27T17:59:27.205Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-pester.instructions.md:0-0
Timestamp: 2025-11-27T17:59:27.205Z
Learning: Applies to **/*.[Tt]ests.ps1 : Use `$PSDefaultParameterValues` only for Pester commands (`Describe`, `Context`, `It`, `Mock`, `Should`, `InModuleScope`)

Applied to files:

  • content/blog/convert-tests-to-pester5-for-dsc-community-repository.md
📚 Learning: 2025-11-27T17:59:27.205Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-pester.instructions.md:0-0
Timestamp: 2025-11-27T17:59:27.205Z
Learning: Applies to **/*.[Tt]ests.ps1 : All public commands, private functions and classes must have unit tests

Applied to files:

  • content/blog/convert-tests-to-pester5-for-dsc-community-repository.md
📚 Learning: 2025-11-27T17:59:01.508Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-mof-resources.instructions.md:0-0
Timestamp: 2025-11-27T17:59:01.508Z
Learning: Applies to source/DSCResources/**/*.psm1 : Import localized strings using `Get-LocalizedData` at the module top level

Applied to files:

  • content/blog/use-dscresource-common-functions-in-module.en.md
📚 Learning: 2025-11-27T18:00:35.078Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines.instructions.md:0-0
Timestamp: 2025-11-27T18:00:35.078Z
Learning: Check DscResource.Common before creating private functions

Applied to files:

  • content/blog/use-dscresource-common-functions-in-module.en.md
📚 Learning: 2025-10-04T21:33:23.022Z
Learnt from: dan-hughes
Repo: dsccommunity/UpdateServicesDsc PR: 85
File: source/en-US/UpdateServicesDsc.strings.psd1:1-2
Timestamp: 2025-10-04T21:33:23.022Z
Learning: In UpdateServicesDsc (and similar DSC modules), the module-level localization file (source/en-US/<ModuleName>.strings.psd1) can be empty when DSC resources have their own localization files in source/DSCResources/<ResourceName>/en-US/DSC_<ResourceName>.strings.psd1. Automated tests verify localization completeness for resources. Don't flag empty module-level localization files as issues when resources have separate localization.

Applied to files:

  • content/blog/use-dscresource-common-functions-in-module.en.md
  • content/blog/convert-a-module-for-continuous-delivery.en.md
📚 Learning: 2025-10-03T15:27:24.417Z
Learnt from: Borgquite
Repo: dsccommunity/UpdateServicesDsc PR: 78
File: source/DSCResources/MSFT_UpdateServicesComputerTargetGroup/MSFT_UpdateServicesComputerTargetGroup.psm1:9-22
Timestamp: 2025-10-03T15:27:24.417Z
Learning: In the UpdateServicesDsc repository, MOF-based DSC resources follow a minimal comment-based help convention that includes only .SYNOPSIS and .PARAMETER sections. The .DESCRIPTION, .INPUTS, and .OUTPUTS sections are intentionally omitted, even though functions have [OutputType()] attributes. This is consistent across all existing DSC resources: MSFT_UpdateServicesServer, MSFT_UpdateServicesCleanup, and MSFT_UpdateServicesApprovalRule.

Applied to files:

  • content/blog/use-dscresource-common-functions-in-module.en.md
  • content/blog/convert-a-module-for-continuous-delivery.en.md
  • content/blog/class-based-dsc-resources.md
  • content/help/_index.en.md
  • content/community/ownership.en.md
  • content/blog/DSC-is-dead-long-live-dsc.en.md
  • content/blog/updating-sampler-github-tasks.md
📚 Learning: 2025-11-22T17:36:09.703Z
Learnt from: johlju
Repo: dsccommunity/SqlServerDsc PR: 2343
File: source/Classes/004.DatabaseFileGroupSpec.ps1:5-34
Timestamp: 2025-11-22T17:36:09.703Z
Learning: The comment-based help requirements for ## Requirements and ## Known issues sections only apply to class-based DSC resources (classes decorated with [DscResource(...)]) in source/Classes/**/*.ps1, not to regular helper classes, DTO classes, or specification classes in the same directory.

Applied to files:

  • content/blog/use-dscresource-common-functions-in-module.en.md
  • content/blog/class-based-dsc-resources.md
  • content/help/_index.en.md
  • content/blog/DSC-is-dead-long-live-dsc.en.md
  • content/blog/updating-sampler-github-tasks.md
📚 Learning: 2025-11-27T17:59:01.508Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-mof-resources.instructions.md:0-0
Timestamp: 2025-11-27T17:59:01.508Z
Learning: Applies to source/DSCResources/**/*.psm1 : Export functions using the `*-TargetResource` pattern

Applied to files:

  • content/blog/use-dscresource-common-functions-in-module.en.md
  • content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:59:01.508Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-mof-resources.instructions.md:0-0
Timestamp: 2025-11-27T17:59:01.508Z
Learning: Applies to source/DSCResources/**/*.psm1 : Use localized strings for all messages including Write-Verbose, Write-Error, and other messaging commands

Applied to files:

  • content/blog/use-dscresource-common-functions-in-module.en.md
📚 Learning: 2025-11-27T17:59:01.508Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-mof-resources.instructions.md:0-0
Timestamp: 2025-11-27T17:59:01.508Z
Learning: Applies to source/DSCResources/**/*.psm1 : Unused mandatory parameters in `Set-TargetResource` and `Test-TargetResource` should include "Not used in <function_name>" in the help comment

Applied to files:

  • content/blog/use-dscresource-common-functions-in-module.en.md
📚 Learning: 2025-11-27T17:59:01.508Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-mof-resources.instructions.md:0-0
Timestamp: 2025-11-27T17:59:01.508Z
Learning: Applies to source/DSCResources/**/*.psm1 : Use names returned from `Get-UICulture` for additional language folder names in DSC resources

Applied to files:

  • content/blog/use-dscresource-common-functions-in-module.en.md
📚 Learning: 2025-11-27T17:59:01.508Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-mof-resources.instructions.md:0-0
Timestamp: 2025-11-27T17:59:01.508Z
Learning: Applies to source/DSCResources/**/*.psm1 : Create an `en-US` folder in each DSC resource directory for localized strings

Applied to files:

  • content/blog/use-dscresource-common-functions-in-module.en.md
📚 Learning: 2025-09-28T13:51:07.000Z
Learnt from: dan-hughes
Repo: dsccommunity/DhcpServerDsc PR: 96
File: source/Modules/DhcpServerDsc.Common/Public/New-TerminatingError.ps1:33-36
Timestamp: 2025-09-28T13:51:07.000Z
Learning: In DhcpServerDsc repository, the user dan-hughes prefers to use error functions from DscResource.Common instead of creating custom error handling functions like New-TerminatingError.

Applied to files:

  • content/blog/use-dscresource-common-functions-in-module.en.md
📚 Learning: 2025-11-27T17:59:01.508Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-mof-resources.instructions.md:0-0
Timestamp: 2025-11-27T17:59:01.508Z
Learning: Applies to source/DSCResources/**/*.psm1 : Use `try/catch` blocks to handle exceptions in MOF-based DSC resources

Applied to files:

  • content/blog/use-dscresource-common-functions-in-module.en.md
📚 Learning: 2025-10-11T08:35:56.141Z
Learnt from: johlju
Repo: dsccommunity/SqlServerDsc PR: 2300
File: tests/Unit/DSC_SqlAGDatabase.Tests.ps1:22-22
Timestamp: 2025-10-11T08:35:56.141Z
Learning: In DSC Community projects, when writing error messages for missing DscResource.Test module dependency in unit test files (tests/[Uu]nit/**/*.[Tt]ests.ps1), the policy is: new code should instruct users to run ".\build.ps1 -Tasks noop" for quick test environment setup; existing code using ".\build.ps1 -Tasks build" is acceptable but slower since it also builds the project. The `noop` task is preferred as it assumes the module is already built before running tests, especially when tests run in a separate process.

Applied to files:

  • content/blog/convert-a-module-for-continuous-delivery.en.md
📚 Learning: 2025-11-27T17:58:08.884Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-changelog.instructions.md:0-0
Timestamp: 2025-11-27T17:58:08.884Z
Learning: Applies to CHANGELOG.md : Describe notable changes briefly in CHANGELOG.md, ≤2 items per change type

Applied to files:

  • content/community/contact.en.md
  • layouts/_default/list.html
  • layouts/_default/single.html
  • layouts/index.html
  • content/community/ownership.en.md
  • content/blog/convert-master-to-main.en.md
  • layouts/community/maintainers.html
  • config.toml
  • content/community/committee.en.md
  • content/blog/updating-sampler-github-tasks.md
📚 Learning: 2025-09-28T13:22:40.783Z
Learnt from: dan-hughes
Repo: dsccommunity/DscResource.Base PR: 48
File: source/Classes/010.ResourceBase.ps1:150-156
Timestamp: 2025-09-28T13:22:40.783Z
Learning: Class-based DSC resources (source/[cC]lasses/**/*.ps1) do not require verbose banners in Set() method like MOF-based resources do. The focus should be on relevant state information only.

Applied to files:

  • content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:58:20.404Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-class-resource.instructions.md:0-0
Timestamp: 2025-11-27T17:58:20.404Z
Learning: Applies to source/[cC]lasses/**/*.ps1 : DSC class-based resources must include comment-based help with .DESCRIPTION section containing Requirements and Known issues sections with a link to all open issues on GitHub

Applied to files:

  • content/blog/class-based-dsc-resources.md
  • content/help/_index.en.md
  • content/blog/DSC-is-dead-long-live-dsc.en.md
  • content/blog/updating-sampler-github-tasks.md
📚 Learning: 2025-11-27T17:58:20.404Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-class-resource.instructions.md:0-0
Timestamp: 2025-11-27T17:58:20.404Z
Learning: Applies to source/[cC]lasses/**/*.ps1 : DSC class-based resources must use `[Nullable[{FullTypeName}]]` syntax for value-type properties (e.g., `[Nullable[System.Int32]]`)

Applied to files:

  • content/blog/class-based-dsc-resources.md
📚 Learning: 2025-12-04T17:07:00.186Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-powershell.instructions.md:0-0
Timestamp: 2025-12-04T17:07:00.186Z
Learning: Applies to **/*.{ps1,psm1,psd1} : For state-changing functions, use `SupportsShouldProcess` attribute with `ConfirmImpact` set to 'Low', 'Medium', or 'High' depending on risk

Applied to files:

  • content/blog/class-based-dsc-resources.md
📚 Learning: 2025-12-04T17:07:00.186Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-powershell.instructions.md:0-0
Timestamp: 2025-12-04T17:07:00.186Z
Learning: Applies to **/*.{ps1,psm1,psd1} : Include .NOTES section in comment-based help only if it conveys critical info (constraints, side effects, security, version compatibility, breaking behavior). Keep to ≤2 short sentences

Applied to files:

  • content/blog/class-based-dsc-resources.md
📚 Learning: 2025-12-04T17:07:00.186Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-powershell.instructions.md:0-0
Timestamp: 2025-12-04T17:07:00.186Z
Learning: Applies to **/*.{ps1,psm1,psd1} : Avoid global variables except for `$global:DSCMachineStatus`

Applied to files:

  • content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T18:00:35.078Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines.instructions.md:0-0
Timestamp: 2025-11-27T18:00:35.078Z
Learning: Applies to source/Classes/*.ps1 : DSC resources should always be created as class-based resources

Applied to files:

  • content/blog/class-based-dsc-resources.md
  • content/community/ownership.en.md
📚 Learning: 2025-12-04T17:07:00.186Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-powershell.instructions.md:0-0
Timestamp: 2025-12-04T17:07:00.186Z
Learning: Applies to **/*.{ps1,psm1,psd1} : Use CIM commands instead of WMI commands

Applied to files:

  • content/blog/class-based-dsc-resources.md
📚 Learning: 2025-08-10T15:13:46.414Z
Learnt from: dan-hughes
Repo: dsccommunity/ActiveDirectoryDsc PR: 741
File: RequiredModules.psd1:12-12
Timestamp: 2025-08-10T15:13:46.414Z
Learning: The ActiveDirectoryDsc project is planning to migrate from PSDepend to ModuleFast for module management. Version pinning will be implemented after this migration is complete, as ModuleFast provides better support for version control through lockfiles and declarative specifications.

Applied to files:

  • content/blog/class-based-dsc-resources.md
📚 Learning: 2025-10-03T15:27:39.511Z
Learnt from: Borgquite
Repo: dsccommunity/UpdateServicesDsc PR: 78
File: source/DSCResources/MSFT_UpdateServicesComputerTargetGroup/MSFT_UpdateServicesComputerTargetGroup.psm1:91-109
Timestamp: 2025-10-03T15:27:39.511Z
Learning: For MOF-based DSC resources in DSC Community repositories (files matching `source/DSCResources/MSFT_*/MSFT_*.psm1`), the comment-based help for `Get-TargetResource`, `Set-TargetResource`, and `Test-TargetResource` functions should NOT include `.OUTPUTS` sections, even though the general PowerShell guidelines require them. This is an established pattern in the DSC Community.

Applied to files:

  • content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:58:20.404Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-class-resource.instructions.md:0-0
Timestamp: 2025-11-27T17:58:20.404Z
Learning: Applies to source/[cC]lasses/020.*.ps1 : DSC class-based resources must use the file naming pattern `source/Classes/020.{ResourceName}.ps1`

Applied to files:

  • content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:58:20.404Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-class-resource.instructions.md:0-0
Timestamp: 2025-11-27T17:58:20.404Z
Learning: Applies to source/[cC]lasses/**/*.ps1 : DSC class-based resources must inherit from `ResourceBase` class from the DscResource.Base module

Applied to files:

  • content/blog/class-based-dsc-resources.md
  • content/community/ownership.en.md
📚 Learning: 2025-08-09T19:29:36.323Z
Learnt from: johlju
Repo: dsccommunity/DscResource.Test PR: 167
File: source/Private/Test-FileContainsClassResource.ps1:44-56
Timestamp: 2025-08-09T19:29:36.323Z
Learning: In the DscResource.Test repository, DSC resource attributes are consistently written as `[DscResource(...)]` rather than using variations like `[DscResourceAttribute()]` or fully qualified names like `[Microsoft.PowerShell.DesiredStateConfiguration.DscResource()]`. The Test-FileContainsClassResource function should focus on detecting the standard `[DscResource(...)]` pattern that is actually used in the codebase.

Applied to files:

  • content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:59:01.508Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-mof-resources.instructions.md:0-0
Timestamp: 2025-11-27T17:59:01.508Z
Learning: Applies to source/DSCResources/**/*.psm1 : Use `New-ObjectNotFoundException` for object not found errors instead of `throw` in MOF-based DSC resources

Applied to files:

  • content/blog/class-based-dsc-resources.md
📚 Learning: 2025-12-04T17:07:00.186Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-powershell.instructions.md:0-0
Timestamp: 2025-12-04T17:07:00.186Z
Learning: Applies to **/*.{ps1,psm1,psd1} : Use full type names when type casting

Applied to files:

  • content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:58:20.404Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-class-resource.instructions.md:0-0
Timestamp: 2025-11-27T17:58:20.404Z
Learning: Applies to source/[cC]lasses/**/*.ps1 : DSC class-based resources must implement a required constructor with signature `ResourceName () : base ($PSScriptRoot)` and populate `$this.ExcludeDscProperties` array

Applied to files:

  • content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:58:20.404Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-class-resource.instructions.md:0-0
Timestamp: 2025-11-27T17:58:20.404Z
Learning: Applies to source/[cC]lasses/**/*.ps1 : DSC class-based resources must implement required methods: `Get()`, `Test()`, `Set()`, `GetCurrentState()`, and `Modify()` following the specified pattern

Applied to files:

  • content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:59:01.508Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-mof-resources.instructions.md:0-0
Timestamp: 2025-11-27T17:59:01.508Z
Learning: Applies to source/DSCResources/**/*.psm1 : Use `New-NotImplementedException` for not implemented errors instead of `throw` in MOF-based DSC resources

Applied to files:

  • content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:58:20.404Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-class-resource.instructions.md:0-0
Timestamp: 2025-11-27T17:58:20.404Z
Learning: Applies to source/[cC]lasses/**/*.ps1 : DSC class-based resources may optionally implement methods: `AssertProperties()` and `NormalizeProperties()` following the specified pattern

Applied to files:

  • content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:58:20.404Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-class-resource.instructions.md:0-0
Timestamp: 2025-11-27T17:58:20.404Z
Learning: Applies to source/[cC]lasses/**/*.ps1 : DSC class-based resources must use `New-*Exception` commands (such as `New-InvalidDataException`, `New-ArgumentException`, `New-InvalidOperationException`, `New-ObjectNotFoundException`, `New-InvalidResultException`, `New-NotImplementedException`) instead of `throw` for terminating errors in classes

Applied to files:

  • content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:59:27.205Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-pester.instructions.md:0-0
Timestamp: 2025-11-27T17:59:27.205Z
Learning: Applies to tests/Unit/Classes/*.[Tt]ests.ps1 : Class resources: `tests/Unit/Classes/{Name}.Tests.ps1`

Applied to files:

  • content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:59:27.205Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-pester.instructions.md:0-0
Timestamp: 2025-11-27T17:59:27.205Z
Learning: Applies to **/*.[Tt]ests.ps1 : Never use `Mock` inside `InModuleScope`-block

Applied to files:

  • content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:59:27.205Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-pester.instructions.md:0-0
Timestamp: 2025-11-27T17:59:27.205Z
Learning: Applies to **/*.[Tt]ests.ps1 : Mocking in `BeforeAll` (`BeforeEach` only when required)

Applied to files:

  • content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:58:02.422Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/SqlServerDsc-guidelines.instructions.md:0-0
Timestamp: 2025-11-27T17:58:02.422Z
Learning: Applies to **/tests/**/*.tests.ps1 : In unit tests: use SMO stub types from SMO.cs, never mock SMO types

Applied to files:

  • content/blog/class-based-dsc-resources.md
📚 Learning: 2025-10-10T14:01:42.703Z
Learnt from: dan-hughes
Repo: dsccommunity/UpdateServicesDsc PR: 86
File: tests/Unit/MSFT_UpdateServicesServer.Tests.ps1:6-45
Timestamp: 2025-10-10T14:01:42.703Z
Learning: For script-based (MOF) DSC resources in UpdateServicesDsc, unit tests should use Initialize-TestEnvironment with variables $script:dscModuleName and $script:dscResourceName, and set -ResourceType 'Mof'. This differs from class-based resource tests which use the simpler $script:moduleName template without Initialize-TestEnvironment.

Applied to files:

  • content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:58:02.422Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/SqlServerDsc-guidelines.instructions.md:0-0
Timestamp: 2025-11-27T17:58:02.422Z
Learning: Applies to **/tests/**/*.tests.ps1 : When unit tests test classes or commands containing SMO types like `[Microsoft.SqlServer.Management.Smo.*]`, ensure they are properly stubbed in SMO.cs

Applied to files:

  • content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:58:31.910Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-integration-tests.instructions.md:0-0
Timestamp: 2025-11-27T17:58:31.910Z
Learning: Applies to tests/Integration/**/*.Integration.Tests.ps1 : Integration tests must not use mocking - use real environment only

Applied to files:

  • content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T18:56:46.759Z
Learnt from: johlju
Repo: dsccommunity/SqlServerDsc PR: 1622
File: tests/Integration/DSC_SqlDatabase.Integration.Tests.ps1:1-30
Timestamp: 2025-11-27T18:56:46.759Z
Learning: Integration tests for MOF-based DSC resources (located in source/DSCResources/**) should use the Initialize-TestEnvironment pattern with -ResourceType 'Mof', not the BeforeDiscovery/BeforeAll pattern. The BeforeDiscovery/BeforeAll pattern is for class-based resources only.

Applied to files:

  • content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:59:27.205Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-pester.instructions.md:0-0
Timestamp: 2025-11-27T17:59:27.205Z
Learning: Applies to **/*.[Tt]ests.ps1 : Omit `-MockWith` when returning `$null`

Applied to files:

  • content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:59:27.205Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-pester.instructions.md:0-0
Timestamp: 2025-11-27T17:59:27.205Z
Learning: Applies to **/*.[Tt]ests.ps1 : Spacing between blocks, arrange, act, and assert for readability

Applied to files:

  • content/blog/converting-tests-to-pester5.md
📚 Learning: 2025-11-27T17:58:02.422Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/SqlServerDsc-guidelines.instructions.md:0-0
Timestamp: 2025-11-27T17:58:02.422Z
Learning: Run tests with coverage using `Invoke-PesterJob -Path '{tests filepath}' -EnableSourceLineMapping -FilterCodeCoverageResult '{pattern}'`

Applied to files:

  • content/blog/add-codecov-support-to-repository.md
📚 Learning: 2025-11-27T18:00:35.078Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines.instructions.md:0-0
Timestamp: 2025-11-27T18:00:35.078Z
Learning: Build project before running tests using `./build.ps1 -Tasks build`

Applied to files:

  • content/blog/updating-sampler-github-tasks.md
📚 Learning: 2025-11-27T17:58:02.422Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/SqlServerDsc-guidelines.instructions.md:0-0
Timestamp: 2025-11-27T17:58:02.422Z
Learning: Build project before running tests: execute `./build.ps1 -Tasks build`

Applied to files:

  • content/blog/updating-sampler-github-tasks.md
📚 Learning: 2025-11-27T17:58:02.422Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/SqlServerDsc-guidelines.instructions.md:0-0
Timestamp: 2025-11-27T17:58:02.422Z
Learning: Applies to **/tests/Integration/**/*.ps1 : Integration tests: use `Connect-SqlDscDatabaseEngine` for SQL Server DB session with correct CI credentials, and always follow with `Disconnect-SqlDscDatabaseEngine`

Applied to files:

  • content/blog/updating-sampler-github-tasks.md
🪛 Biome (2.1.2)
assets/css/futuristic.css

[error] 1186-1187: Expected a selector but instead found '@'.

Expected a selector here.

(parse)


[error] 1187-1187: expected , but instead found media

Remove media

(parse)


[error] 1187-1187: Expected a compound selector but instead found '('.

Expected a compound selector here.

(parse)


[error] 1187-1187: expected , but instead found prefers-color-scheme

Remove prefers-color-scheme

(parse)


[error] 1187-1187: expected , but instead found )

Remove )

(parse)


[error] 1187-1187: Unknown type selector is not allowed.

See MDN web docs for more details.
Consider replacing the unknown type selector with valid one.

(lint/correctness/noUnknownTypeSelector)


[error] 1187-1187: Unexpected unknown pseudo-class dark

See MDN web docs for more details.

(lint/correctness/noUnknownPseudoClass)

🪛 LanguageTool
content/blog/convert-a-module-for-continuous-delivery.en.md

[grammar] ~10-~10: Use a hyphen to join words.
Context: ...parallel jobs on a free account for open source projects. You are welcome to sha...

(QB_NEW_EN_HYPHEN)

content/blog/class-based-dsc-resources.md

[style] ~116-~116: Consider a different adverb to strengthen your wording.
Context: ... (aka sub-type, nested type), you can't always change the code invoking it (say the LC...

(ALWAYS_CONSTANTLY)


[style] ~127-~127: Consider using a synonym to be more concise.
Context: ...ty scenarios. Obviously, there's still a lot of differences between PS5.1 and PS7 which...

(A_LOT_OF)


[style] ~256-~256: As an alternative to the over-used intensifier ‘really’, consider replacing this phrase.
Context: ...ng new contributors. # Conclusion I'm really happy with the current plan, and how the cons...

(EN_WEAK_ADJECTIVE)


[grammar] ~257-~257: Ensure spelling is correct
Context: ...uration team, and I'm grateful for that priviledge. In the GitHub issue Steve Lee clarifi...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

content/blog/DSC-is-dead-long-live-dsc.en.md

[uncategorized] ~12-~12: The official name of this popular video platform is spelled with a capital “T”.
Context: ...Guest Configuration and Azure Arc. {{< youtube id="hXS-rzs3Hak" >}} Here's a quick ta...

(YOUTUBE)

content/blog/updating-sampler-github-tasks.md

[style] ~8-~8: Consider using a synonym to be more concise.
Context: ...st" draft: false author: gaelcolas --- A lot of improvements have been made to the Samp...

(A_LOT_OF)

🪛 markdownlint-cli2 (0.18.1)
content/blog/DSC-is-dead-long-live-dsc.en.md

17-17: Ordered list item prefix
Expected: 1; Actual: 2; Style: 1/1/1

(MD029, ol-prefix)


18-18: Ordered list item prefix
Expected: 1; Actual: 3; Style: 1/1/1

(MD029, ol-prefix)


19-19: Ordered list item prefix
Expected: 1; Actual: 4; Style: 1/1/1

(MD029, ol-prefix)


20-20: Ordered list item prefix
Expected: 1; Actual: 5; Style: 1/1/1

(MD029, ol-prefix)


21-21: Ordered list item prefix
Expected: 1; Actual: 6; Style: 1/1/1

(MD029, ol-prefix)


25-25: Ordered list item prefix
Expected: 1; Actual: 7; Style: 1/1/1

(MD029, ol-prefix)


26-26: Ordered list item prefix
Expected: 1; Actual: 8; Style: 1/1/1

(MD029, ol-prefix)


27-27: Ordered list item prefix
Expected: 1; Actual: 9; Style: 1/1/1

(MD029, ol-prefix)

Comment on lines +1186 to +1191
[data-theme="dark"] .timeline-year-header,
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) .timeline-year-header {
background: var(--bg-primary);
}
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

Critical: Invalid CSS syntax causing parse errors.

The static analysis correctly identified that lines 1186-1191 contain invalid CSS syntax. You cannot nest a @media query inside a selector block in standard CSS. This will cause parsing to fail and potentially break subsequent styles.

🔎 Proposed fix
 [data-theme="dark"] .timeline-year-header,
-@media (prefers-color-scheme: dark) {
-  :root:not([data-theme="light"]) .timeline-year-header {
-    background: var(--bg-primary);
-  }
+[data-theme="dark"] .timeline-year-header {
+  background: var(--bg-primary);
+}
+
+@media (prefers-color-scheme: dark) {
+  :root:not([data-theme="light"]) .timeline-year-header {
+    background: var(--bg-primary);
+  }
 }
🧰 Tools
🪛 Biome (2.1.2)

[error] 1186-1187: Expected a selector but instead found '@'.

Expected a selector here.

(parse)


[error] 1187-1187: expected , but instead found media

Remove media

(parse)


[error] 1187-1187: Expected a compound selector but instead found '('.

Expected a compound selector here.

(parse)


[error] 1187-1187: expected , but instead found prefers-color-scheme

Remove prefers-color-scheme

(parse)


[error] 1187-1187: expected , but instead found )

Remove )

(parse)


[error] 1187-1187: Unknown type selector is not allowed.

See MDN web docs for more details.
Consider replacing the unknown type selector with valid one.

(lint/correctness/noUnknownTypeSelector)


[error] 1187-1187: Unexpected unknown pseudo-class dark

See MDN web docs for more details.

(lint/correctness/noUnknownPseudoClass)

🤖 Prompt for AI Agents
In assets/css/futuristic.css around lines 1186 to 1191, the CSS incorrectly
nests a @media rule inside a selector which is invalid; split the nested
structure into two separate, valid rules: one rule targeting [data-theme="dark"]
.timeline-year-header and a separate @media (prefers-color-scheme: dark) block
that contains the :root:not([data-theme="light"]) .timeline-year-header
selector, each setting background: var(--bg-primary), so the media query is not
placed inside a selector block.

Comment on lines +229 to +261
const matches = searchIndex
.filter((item) => item.title.toLowerCase().includes(query))
.slice(0, 10);

if (matches.length === 0) {
results.innerHTML = `
<div style="padding: var(--space-6); text-align: center; color: var(--text-tertiary);">
No results found for "${query}"
</div>
`;
return;
}

results.innerHTML = matches
.map(
(item, index) => `
<a href="${item.url}" class="search-result-item${
index === 0 ? " focused" : ""
}" data-index="${index}">
<div class="search-result-icon">
<i class="ri-file-text-line"></i>
</div>
<div class="search-result-content">
<div class="search-result-title">${highlightMatch(
item.title,
query
)}</div>
<div class="search-result-path">${item.section}</div>
</div>
</a>
`
)
.join("");
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

XSS vulnerability: User input and link text are rendered without HTML escaping.

  1. Line 236: The query variable (user input) is directly interpolated into innerHTML without escaping HTML entities.
  2. Lines 245-256: item.title and item.url from DOM elements are rendered without sanitization. Malicious content or javascript: URIs in page links would be executed.
Proposed fix - add HTML escaping

Add an escapeHtml utility:

+function escapeHtml(text) {
+  const div = document.createElement("div");
+  div.textContent = text;
+  return div.innerHTML;
+}

Then use it in handleSearch:

   if (matches.length === 0) {
     results.innerHTML = `
       <div style="padding: var(--space-6); text-align: center; color: var(--text-tertiary);">
-        No results found for "${query}"
+        No results found for "${escapeHtml(query)}"
       </div>
     `;
     return;
   }

   results.innerHTML = matches
     .map(
       (item, index) => `
-    <a href="${item.url}" class="search-result-item${
+    <a href="${escapeHtml(item.url)}" class="search-result-item${
         index === 0 ? " focused" : ""
       }" data-index="${index}">
       <div class="search-result-icon">
         <i class="ri-file-text-line"></i>
       </div>
       <div class="search-result-content">
         <div class="search-result-title">${highlightMatch(
-          item.title,
+          escapeHtml(item.title),
           query
         )}</div>
-        <div class="search-result-path">${item.section}</div>
+        <div class="search-result-path">${escapeHtml(item.section)}</div>
       </div>
     </a>
   `
     )
     .join("");

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In assets/js/main.js around lines 229 to 261, user input and item fields are
directly interpolated into innerHTML causing an XSS risk: escape and sanitize
the values before inserting into the DOM. Add an escapeHtml utility and use it
for the query shown in the "No results" message and for item.title when
rendering results (or render text via textContent instead of raw HTML). For
item.url, validate/sanitize the href to disallow dangerous schemes like
"javascript:" (whitelist only http(s) and safe relative paths) before assigning
to the anchor; alternatively set the link via element.href programmatically
after validation and add rel="noopener noreferrer". Ensure highlightMatch uses
escaped HTML or returns safe HTML fragments derived from escaped text.

Comment on lines +324 to +340
function initSmoothScroll() {
document.querySelectorAll('a[href^="#"]').forEach((anchor) => {
anchor.addEventListener("click", function (e) {
const targetId = this.getAttribute("href");
if (targetId === "#") return;

const target = document.querySelector(targetId);
if (target) {
e.preventDefault();
target.scrollIntoView({ behavior: "smooth" });

// Update URL
history.pushState(null, null, targetId);
}
});
});
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Add error handling for querySelector with invalid selectors.

If targetId contains characters invalid in CSS selectors (e.g., #foo:bar), document.querySelector(targetId) throws a SyntaxError. Consider wrapping in try-catch.

Proposed fix
 function initSmoothScroll() {
   document.querySelectorAll('a[href^="#"]').forEach((anchor) => {
     anchor.addEventListener("click", function (e) {
       const targetId = this.getAttribute("href");
       if (targetId === "#") return;

-      const target = document.querySelector(targetId);
-      if (target) {
-        e.preventDefault();
-        target.scrollIntoView({ behavior: "smooth" });
-
-        // Update URL
-        history.pushState(null, null, targetId);
+      try {
+        const target = document.querySelector(targetId);
+        if (target) {
+          e.preventDefault();
+          target.scrollIntoView({ behavior: "smooth" });
+          history.pushState(null, null, targetId);
+        }
+      } catch {
+        // Invalid selector - let browser handle navigation
       }
     });
   });
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
function initSmoothScroll() {
document.querySelectorAll('a[href^="#"]').forEach((anchor) => {
anchor.addEventListener("click", function (e) {
const targetId = this.getAttribute("href");
if (targetId === "#") return;
const target = document.querySelector(targetId);
if (target) {
e.preventDefault();
target.scrollIntoView({ behavior: "smooth" });
// Update URL
history.pushState(null, null, targetId);
}
});
});
}
function initSmoothScroll() {
document.querySelectorAll('a[href^="#"]').forEach((anchor) => {
anchor.addEventListener("click", function (e) {
const targetId = this.getAttribute("href");
if (targetId === "#") return;
try {
const target = document.querySelector(targetId);
if (target) {
e.preventDefault();
target.scrollIntoView({ behavior: "smooth" });
history.pushState(null, null, targetId);
}
} catch {
// Invalid selector - let browser handle navigation
}
});
});
}
🤖 Prompt for AI Agents
In assets/js/main.js around lines 324 to 340, querySelector(targetId) can throw
a SyntaxError for invalid CSS selector strings; change the logic to avoid
calling querySelector with raw targetId: if targetId starts with "#" use
document.getElementById(targetId.slice(1)) to retrieve the element (this avoids
selector parsing), otherwise wrap document.querySelector(targetId) in a
try-catch and handle SyntaxError gracefully (skip scrolling and do not call
history.pushState if no valid target), ensuring existing behavior only runs when
a valid element is found.


I'm really happy with the current plan, and how the consultation was executed by the PowerShell team.
I'm really happy with the current plan, and how the consultation was executed by the PowerShell team.
I'm lucky to be working closely with them through my work with the Guest Configuration team, and I'm grateful for that priviledge.
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Fix spelling error: "priviledge" → "privilege".

Line 257 contains a misspelling. "Priviledge" should be "privilege".

🔎 Proposed fix
- I'm lucky to be working closely with them through my work with the Guest Configuration team, and I'm grateful for that priviledge.
+ I'm lucky to be working closely with them through my work with the Guest Configuration team, and I'm grateful for that privilege.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
I'm lucky to be working closely with them through my work with the Guest Configuration team, and I'm grateful for that priviledge.
I'm lucky to be working closely with them through my work with the Guest Configuration team, and I'm grateful for that privilege.
🧰 Tools
🪛 LanguageTool

[grammar] ~257-~257: Ensure spelling is correct
Context: ...uration team, and I'm grateful for that priviledge. In the GitHub issue Steve Lee clarifi...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

🤖 Prompt for AI Agents
In content/blog/class-based-dsc-resources.md around line 257, the word
"priviledge" is misspelled; replace it with the correct spelling "privilege" so
the sentence reads "...and I'm grateful for that privilege."


If you have any questions or suggestions around this blog post then please
reach out to `@johlju` in the Virtual PowerShell User Group [#DSC channel](https://dsccommunity.org/community/contact/).
Pester 5 introduces significant improvements along with breaking changes from version 4. This guide covers migrating your Pester tests to the new syntax, understanding the breaking changes, and applying best practices for the updated testing framework.
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Wrap lines at word boundaries per Markdown style guidelines.

Line 9 significantly exceeds the 80-character limit and should be wrapped at word boundaries. Per coding guidelines, markdown lines must wrap at word boundaries when over 80 characters (except tables/code blocks).

🔎 Proposed fix for line wrapping
-Pester 5 introduces significant improvements along with breaking changes from version 4. This guide covers migrating your Pester tests to the new syntax, understanding the breaking changes, and applying best practices for the updated testing framework.
+Pester 5 introduces significant improvements along with breaking changes from
+version 4. This guide covers migrating your Pester tests to the new syntax,
+understanding the breaking changes, and applying best practices for the
+updated testing framework.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
Pester 5 introduces significant improvements along with breaking changes from version 4. This guide covers migrating your Pester tests to the new syntax, understanding the breaking changes, and applying best practices for the updated testing framework.
Pester 5 introduces significant improvements along with breaking changes from
version 4. This guide covers migrating your Pester tests to the new syntax,
understanding the breaking changes, and applying best practices for the
updated testing framework.
🤖 Prompt for AI Agents
In content/blog/converting-tests-to-pester5.md around line 9, the sentence
exceeds the 80-character limit and must be wrapped at word boundaries; split the
long sentence into two (or more) lines so no line is longer than 80 characters,
ensuring breaks occur between words (not mid-word) and preserving the original
punctuation and meaning.

Comment on lines +63 to 68
{{ range sort $.Site.Data.maintainers "accountName" }} {{ $data :=
dict }} {{ $path := printf "https://api.github.com/users/%s"
.accountName }} {{ with resources.GetRemote $path }} {{ with
.Content | transform.Unmarshal }} {{ $data = . }} {{ end }} {{ else
}} {{ errorf "Unable to get global resource %q" $path }} {{ end }}

Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Build reliability: errorf will fail builds on GitHub API issues.

Using errorf means your build will fail if GitHub's API is rate-limited, temporarily unavailable, or if a maintainer account is renamed/deleted. This could block deployments.

Consider using warnf with a graceful fallback to show the card with limited info instead.

🔎 Proposed fix with graceful degradation
            {{ range sort $.Site.Data.maintainers "accountName" }} {{ $data :=
            dict }} {{ $path := printf "https://api.github.com/users/%s"
-            .accountName }} {{ with resources.GetRemote $path }} {{ with
-            .Content | transform.Unmarshal }} {{ $data = . }} {{ end }} {{ else
-            }} {{ errorf "Unable to get global resource %q" $path }} {{ end }}
+            .accountName }} 
+            {{ with resources.GetRemote $path }} 
+              {{ with .Content | transform.Unmarshal }} 
+                {{ $data = . }} 
+              {{ end }} 
+            {{ else }} 
+              {{ warnf "Unable to get GitHub user data for %s" .accountName }}
+              {{ $data = dict "login" .accountName "avatar_url" "" "name" .accountName }}
+            {{ end }}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
{{ range sort $.Site.Data.maintainers "accountName" }} {{ $data :=
dict }} {{ $path := printf "https://api.github.com/users/%s"
.accountName }} {{ with resources.GetRemote $path }} {{ with
.Content | transform.Unmarshal }} {{ $data = . }} {{ end }} {{ else
}} {{ errorf "Unable to get global resource %q" $path }} {{ end }}
{{ range sort $.Site.Data.maintainers "accountName" }} {{ $data :=
dict }} {{ $path := printf "https://api.github.com/users/%s"
.accountName }}
{{ with resources.GetRemote $path }}
{{ with .Content | transform.Unmarshal }}
{{ $data = . }}
{{ end }}
{{ else }}
{{ warnf "Unable to get GitHub user data for %s" .accountName }}
{{ $data = dict "login" .accountName "avatar_url" "" "name" .accountName }}
{{ end }}
🤖 Prompt for AI Agents
In layouts/community/maintainers.html around lines 63 to 68, the template
currently calls errorf when resources.GetRemote fails which will abort the Hugo
build on transient GitHub API errors; change the flow to log a warning instead
and provide a graceful fallback: replace errorf with warnf, set $data to a
minimal dict containing at least the accountName (and any other static fallback
fields you need), and continue rendering the maintainer card with the limited
data so builds do not fail when the GitHub API is rate-limited or the remote
resource is unavailable.

Comment on lines +87 to +98
<a
href="https://github.com/{{ .accountName }}"
target="_blank"
style="
text-decoration: none;
color: var(--text-primary);
font-weight: 600;
"
>
{{ with $data.name }} {{ $data.name }} {{ else }} {{
$data.login }} {{ end }}
</a>
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Add rel="noopener" to external links with target="_blank".

The GitHub profile link is missing rel="noopener" which is a security and performance best practice for links that open in new tabs.

🔎 Proposed fix
                <a
                  href="https://github.com/{{ .accountName }}"
                  target="_blank"
+                  rel="noopener"
                  style="
                    text-decoration: none;
                    color: var(--text-primary);
                    font-weight: 600;
                  "
                >
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<a
href="https://github.com/{{ .accountName }}"
target="_blank"
style="
text-decoration: none;
color: var(--text-primary);
font-weight: 600;
"
>
{{ with $data.name }} {{ $data.name }} {{ else }} {{
$data.login }} {{ end }}
</a>
<a
href="https://github.com/{{ .accountName }}"
target="_blank"
rel="noopener"
style="
text-decoration: none;
color: var(--text-primary);
font-weight: 600;
"
>
{{ with $data.name }} {{ $data.name }} {{ else }} {{
$data.login }} {{ end }}
</a>
🤖 Prompt for AI Agents
In layouts/community/maintainers.html around lines 87 to 98, the anchor that
opens the GitHub profile in a new tab (target="_blank") lacks the rel attribute;
update the <a> tag to include rel="noopener" (or rel="noopener noreferrer" if
you want broader protection) while keeping the existing href, target, style and
template expressions unchanged so the link preserves behavior and template
interpolation.

Comment on lines +154 to +158
"
>
{{ $data.bio | safeHTML }}
</p>
{{ end }}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Security: Potential XSS vulnerability with safeHTML on GitHub bio.

Using | safeHTML on $data.bio allows any HTML/JavaScript in GitHub user bios to be rendered unescaped. While GitHub does sanitize bios in their UI, the API returns the raw content. If a maintainer's bio contains malicious content, it would be injected into your site.

Consider using | markdownify instead, or remove safeHTML entirely to let Hugo escape the content.

🔎 Proposed fix
                <p
                  style="
                    font-size: var(--text-sm);
                    color: var(--text-secondary);
                    margin-top: var(--space-2);
                  "
                >
-                  {{ $data.bio | safeHTML }}
+                  {{ $data.bio }}
                </p>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"
>
{{ $data.bio | safeHTML }}
</p>
{{ end }}
"
>
{{ $data.bio }}
</p>
{{ end }}
🤖 Prompt for AI Agents
In layouts/community/maintainers.html around lines 154 to 158, the template uses
"{{ $data.bio | safeHTML }}" which can introduce XSS by rendering raw HTML from
GitHub bios; replace the use of safeHTML with a safe renderer such as "{{
$data.bio | markdownify }}" or remove the filter entirely so Hugo escapes the
content by default; if you must allow limited HTML, pass the bio through a
proper sanitizer before marking it safe, otherwise use markdownify or plain
output to prevent injection.

Comment on lines +78 to +87
{{ else }}
<li class="nav-item">
<a
href="{{ .URL }}"
class="nav-link{{ if eq $.RelPermalink .URL }} active{{ end }}"
>
{{ .Name }}
</a>
</li>
{{ end }} {{ end }}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Active state not applied when viewing dropdown child pages.

Line 82 applies the active class only for nav items without children: {{ if eq $.RelPermalink .URL }}. When a user is on a child page (e.g., /community/maintainers), the parent dropdown item "Categories" won't show an active state, which may confuse users about their location.

🔎 Proposed fix

For items with children, check if the current URL is a prefix of the parent URL:

 {{ if .HasChildren }}
 <li class="nav-item">
   <a
     href="{{ .URL }}"
-    class="nav-link"
+    class="nav-link{{ if hasPrefix $.RelPermalink .URL }} active{{ end }}"
     aria-haspopup="true"
     aria-expanded="false"
   >

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In layouts/partials/header-new.html around lines 78 to 87, the nav-item "active"
class is only applied for exact matches so parent dropdowns stay inactive when a
child page is open; update the condition that builds the nav-link class to also
treat the parent as active when the current page URL is a child (e.g., use a
logical OR: exact match OR current page permalink has the parent URL as a
prefix), and normalize trailing slashes (or ensure both values end with a slash)
before the prefix check so parent items get the active state when visiting any
of their child pages.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

♻️ Duplicate comments (4)
assets/css/futuristic.css (1)

1202-1207: Critical: Invalid CSS syntax causing parse errors.

The static analysis correctly identified that lines 1202-1207 contain invalid CSS syntax. You cannot nest a @media query inside a selector block in standard CSS. This will cause parsing to fail and potentially break subsequent styles.

🔎 Proposed fix
-[data-theme="dark"] .timeline-year-header,
-@media (prefers-color-scheme: dark) {
-  :root:not([data-theme="light"]) .timeline-year-header {
-    background: var(--bg-primary);
-  }
-}
+[data-theme="dark"] .timeline-year-header {
+  background: var(--bg-primary);
+}
+
+@media (prefers-color-scheme: dark) {
+  :root:not([data-theme="light"]) .timeline-year-header {
+    background: var(--bg-primary);
+  }
+}
layouts/partials/header-new.html (1)

34-77: Active state not applied when viewing dropdown child pages.

For items with children, the active class is never applied to the parent nav-link. When a user navigates to a child page (e.g., /community/maintainers), the parent dropdown won't show an active state, which may confuse users about their current location in the site hierarchy.

🔎 Proposed fix
 <li class="nav-item">
   <a
     href="{{ .URL }}"
-    class="nav-link"
+    class="nav-link{{ if hasPrefix $.RelPermalink .URL }} active{{ end }}"
     aria-haspopup="true"
     aria-expanded="false"
   >
assets/js/main.js (2)

243-276: XSS vulnerability: User input and search data rendered without HTML escaping.

The query variable (user input) and item.title, item.url, item.section are directly interpolated into innerHTML without escaping. While item.* values currently come from internal DOM links, this pattern is unsafe:

  1. Line 250: "${query}" - direct user input
  2. Lines 259-270: item.url, item.title, item.section - could contain HTML
🔎 Proposed fix: Add HTML escaping
function escapeHtml(text) {
  const div = document.createElement("div");
  div.textContent = text;
  return div.innerHTML;
}

Then use it:

-        No results found for "${query}"
+        No results found for "${escapeHtml(query)}"
-    <a href="${item.url}" class="search-result-item${
+    <a href="${escapeHtml(item.url)}" class="search-result-item${

For highlightMatch, escape before highlighting:

function highlightMatch(text, query) {
  const escaped = escapeHtml(text);
  const escapedQuery = escapeHtml(query);
  const regex = new RegExp(`(${escapeRegex(escapedQuery)})`, "gi");
  return escaped.replace(regex, '<mark>$1</mark>');
}

338-354: Add error handling for querySelector with invalid selectors.

If targetId contains characters invalid in CSS selectors (e.g., #foo:bar), document.querySelector(targetId) throws a SyntaxError.

🔎 Proposed fix: Use getElementById or try-catch
 function initSmoothScroll() {
   document.querySelectorAll('a[href^="#"]').forEach((anchor) => {
     anchor.addEventListener("click", function (e) {
       const targetId = this.getAttribute("href");
       if (targetId === "#") return;

-      const target = document.querySelector(targetId);
-      if (target) {
+      // Use getElementById to avoid selector parsing issues
+      const target = document.getElementById(targetId.slice(1));
+      if (target) {
         e.preventDefault();
         target.scrollIntoView({ behavior: "smooth" });
-
-        // Update URL
         history.pushState(null, null, targetId);
       }
     });
   });
 }
🧹 Nitpick comments (7)
assets/css/futuristic.css (2)

847-848: Consider adding prefers-reduced-motion support for animations.

The grid and orb animations (gridFloat, orbFloat) run continuously. Users who prefer reduced motion may find this distracting or triggering.

🔎 Proposed addition

Add this after the animation keyframes:

@media (prefers-reduced-motion: reduce) {
  .hero-grid,
  .hero-orb {
    animation: none;
  }
  
  .animate-fade-in-up,
  .animate-fade-in,
  .animate-slide-in-left {
    animation: none;
    opacity: 1;
  }
  
  .stagger > * {
    animation: none;
    opacity: 1;
  }
}

1967-1990: Stagger animation has limited child support.

The stagger animation only defines delays for children 1-6. If a container has more than 6 children, they'll all animate together after the 6th.

🔎 Optional: Extend stagger delays or use CSS custom properties

Consider using a CSS variable approach for more flexibility:

.stagger > * {
  --stagger-index: 0;
  opacity: 0;
  animation: fadeInUp 0.5s ease-out forwards;
  animation-delay: calc(var(--stagger-index) * 0.1s);
}

Then set --stagger-index via JavaScript or Hugo templating on each child.

layouts/partials/header-new.html (2)

6-29: Potential SVG gradient ID collision.

The inline SVG uses id="logo-gradient" for the linear gradient. If this header partial is included multiple times on a page or if another SVG uses the same ID, it could cause rendering issues.

🔎 Proposed fix: Use a more unique ID
-          <linearGradient id="logo-gradient" x1="0" y1="0" x2="32" y2="32">
+          <linearGradient id="dsc-logo-gradient" x1="0" y1="0" x2="32" y2="32">

And update the reference:

-        <rect width="32" height="32" rx="8" fill="url(#logo-gradient)" />
+        <rect width="32" height="32" rx="8" fill="url(#dsc-logo-gradient)" />

154-170: Semantic class mismatch: GitHub link uses .theme-toggle class.

The GitHub link reuses the .theme-toggle class for styling, but this is semantically misleading. Consider creating a dedicated class or a more generic one like .header-icon-button.

🔎 Proposed fix

In the CSS, add a shared base class:

.header-icon-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  background: none;
  border: none;
  border-radius: var(--radius-md);
  cursor: pointer;
  color: var(--text-secondary);
  transition: all var(--transition-fast);
}

.header-icon-btn:hover {
  background-color: var(--bg-tertiary);
  color: var(--text-primary);
}

Then update the HTML:

-        class="theme-toggle"
+        class="header-icon-btn"
assets/js/main.js (3)

85-106: Unused variable: lastScroll is assigned but never read.

The lastScroll variable is updated on each scroll event but its value is never used for any logic (like hide-on-scroll-down behavior).

🔎 Proposed fix: Remove unused variable or implement hide-on-scroll

If you don't plan to use it:

 function initHeader() {
   const header = document.getElementById("siteHeader");
   if (!header) return;

-  let lastScroll = 0;
-
   window.addEventListener(
     "scroll",
     () => {
       const currentScroll = window.pageYOffset;

       if (currentScroll > 50) {
         header.classList.add("scrolled");
       } else {
         header.classList.remove("scrolled");
       }
-
-      lastScroll = currentScroll;
     },
     { passive: true }
   );
 }

164-183: Search index built from all DOM links may include unintended entries.

buildSearchIndex collects every <a href> starting with /, which may include duplicate entries, navigation links, footer links, or other non-content links. This could clutter search results.

🔎 Consider filtering by content area or using Hugo-generated JSON

Option 1: Filter by content area:

function buildSearchIndex() {
  const contentArea = document.querySelector('.main-content, .article-content, main');
  const links = contentArea 
    ? contentArea.querySelectorAll("a[href]")
    : document.querySelectorAll("a[href]");
  // ... rest of logic
}

Option 2: Generate a search index via Hugo (more robust):
Create a layouts/_default/index.json that outputs structured page data, then fetch it in JS.


359-381: Animation initialization sets inline opacity, which may flash content.

Setting el.style.opacity = "0" via JavaScript after DOM load may cause a brief flash of content before it's hidden. Consider using a CSS class instead.

🔎 Proposed approach

Add CSS:

.animate-on-scroll {
  opacity: 0;
}

Then in JS:

   document
     .querySelectorAll(".card, .feature-card, .timeline-card")
     .forEach((el) => {
-      el.style.opacity = "0";
+      el.classList.add("animate-on-scroll");
       observer.observe(el);
     });

And update the animation:

.animate-on-scroll.animate-fade-in-up {
  opacity: 1;
}
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 885c930 and d6641c4.

📒 Files selected for processing (3)
  • assets/css/futuristic.css (1 hunks)
  • assets/js/main.js (1 hunks)
  • layouts/partials/header-new.html (1 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**

⚙️ CodeRabbit configuration file

**: # DSC Community Guidelines

Terminology

  • Command: Public command
  • Function: Private function
  • Resource: DSC class-based resource

Build & Test Workflow Requirements

  • Run PowerShell script files from repository root
  • Setup build and test environment (once per pwsh session): ./build.ps1 -Tasks noop
  • Build project before running tests: ./build.ps1 -Tasks build
  • Always run tests in new pwsh session: Invoke-Pester -Path @({test paths}) -Output Detailed

File Organization

  • Public commands: source/Public/{CommandName}.ps1
  • Private functions: source/Private/{FunctionName}.ps1
  • Classes: source/Classes/{DependencyGroupNumber}.{ClassName}.ps1
  • Enums: source/Enum/{DependencyGroupNumber}.{EnumName}.ps1
  • Unit tests: tests/Unit/{Classes|Public|Private}/{Name}.Tests.ps1
  • Integration tests: tests/Integration/Commands/{CommandName}.Integration.Tests.ps1

Requirements

  • Follow instructions over existing code patterns
  • Follow PowerShell style and test guideline instructions strictly
  • Always update CHANGELOG.md Unreleased section
  • Localize all strings using string keys; remove any orphaned string keys
  • Check DscResource.Common before creating private functions
  • Separate reusable logic into private functions
  • DSC resources should always be created as class-based resources
  • Add unit tests for all commands/functions/resources
  • Add integration tests for all public commands and resources

Files:

  • layouts/partials/header-new.html
  • assets/js/main.js
  • assets/css/futuristic.css
🪛 Biome (2.1.2)
assets/css/futuristic.css

[error] 1202-1203: Expected a selector but instead found '@'.

Expected a selector here.

(parse)


[error] 1203-1203: expected , but instead found media

Remove media

(parse)


[error] 1203-1203: Expected a compound selector but instead found '('.

Expected a compound selector here.

(parse)


[error] 1203-1203: expected , but instead found prefers-color-scheme

Remove prefers-color-scheme

(parse)


[error] 1203-1203: expected , but instead found )

Remove )

(parse)


[error] 1203-1203: Unknown type selector is not allowed.

See MDN web docs for more details.
Consider replacing the unknown type selector with valid one.

(lint/correctness/noUnknownTypeSelector)


[error] 1203-1203: Unexpected unknown pseudo-class dark

See MDN web docs for more details.

(lint/correctness/noUnknownPseudoClass)

🔇 Additional comments (6)
assets/css/futuristic.css (2)

1-149: Well-structured design token system.

The CSS custom properties provide a comprehensive foundation with color palette, semantic colors, gradients, shadows, typography scale, spacing, border radii, transitions, z-index scale, and container sizes. The token naming convention is consistent and intuitive.


151-207: Dark mode implementation looks solid.

The dual approach—explicit [data-theme="dark"] attribute and prefers-color-scheme media query fallback with :root:not([data-theme="light"])—provides good coverage for both manual toggle and system preference.

layouts/partials/header-new.html (2)

112-113: Keyboard shortcut handling looks good.

The implementation now includes both shortcut-mac and shortcut-other elements, with CSS controlling visibility based on the is-mac class (set by JavaScript platform detection). This addresses cross-platform keyboard hint display.


59-71: No action needed. The Remix Icon font is already properly loaded in layouts/_default/baseof.html (line 32) via CDN at https://cdn.jsdelivr.net/npm/[email protected]/fonts/remixicon.css, making it available to all partials including header-new.html.

assets/js/main.js (2)

7-15: Clean initialization pattern.

The DOMContentLoaded listener with separate initialization functions provides good separation of concerns and makes the code maintainable.


33-50: Theme initialization handles edge cases well.

The logic correctly prioritizes localStorage, falls back to system preference, and listens for system theme changes only when no explicit preference is set.

@gaelcolas gaelcolas merged commit df3af3a into dsccommunity:master Jan 7, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants