# Site Pages Content Calendar

> Build a full-size, interactive, visually rich HTML content calendar from a SharePoint Site Pages library, using real page metadata and safe status classification. Use when the user says: - "create an interactive content calendar for site pages" - "build a site pages calendar dashboard" - "make a SharePoint page publishing calendar" - "show drafts, published, and scheduled pages in a calendar" - "generate an HTML dashboard for page status and publish dates"

- Skill: `pnp/site-pages-content-calendar` (Agent Skill)
- Install (CLI): `npx skillmds@latest add pnp/site-pages-content-calendar`
- Raw SKILL.md: https://api.skillmd.com/api/skills/pnp/site-pages-content-calendar/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- Author: pnp (https://skillmd.com/u/pnp)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/pnp/site-pages-content-calendar

---

# Build Site Pages Content Calendar

## When to use
Use this skill when the user wants an interactive HTML calendar/dashboard for SharePoint Site Pages, especially with page names, published/draft/scheduled status, dates, and click-through detail views. The generated calendar should be full-size by default, using the available browser viewport and content area instead of a small embedded or fixed-height calendar.

## Inputs
- Current SharePoint site URL.
- Site Pages library/list ID if available from context. If not available, discover or resolve it before querying.
- Optional user preferences for destination file name, folder, colors, or layout.

## Steps
1. Inspect the Site Pages schema with `get_list_schema`.
   - Include hidden and read-only fields so status fields are visible.
   - Confirm internal names for: `FileLeafRef`, `FileRef`, `Title`, `Created`, `Modified`, `FirstPublishedDate`, `_PublishStartDate`, `_ScheduledVersion`, `_ModerationStatus`, `_UIVersionString`, `_Level`, `Author`, `Editor`, `PageLayoutType`, `Description`, and `File_x0020_Type`.
2. List the Site Pages items with `list_items`.
   - Use `rowLimit` large enough for the whole library.
   - Use `viewFields` with the verified internal names.
   - Filter to actual pages where possible: `File_x0020_Type = aspx`.
   - If `hasMore` is true, process the returned `dataRef`, not the inline preview.
3. Classify status without guessing.
   - Scheduled: only when `_ScheduledVersion` is non-empty or `_ModerationStatus` explicitly contains “Scheduled”.
   - Do not classify pages as scheduled just because `_PublishStartDate` exists; it can be defaulted/populated without a scheduled page.
   - Draft: `_ModerationStatus` contains “Draft” or item URL indicates draft.
   - Published: `_ModerationStatus` contains “Approved/Published” or item URL indicates published.
   - Unknown: no reliable status signal returned.
4. Choose calendar placement date.
   - Scheduled pages: `_PublishStartDate` if available; otherwise Created with a label saying scheduled date unavailable.
   - Published pages: `FirstPublishedDate` if available; otherwise Created with a label saying published date unavailable.
   - Draft pages: Created date, labeled as draft placement.
   - Never invent missing dates; display “Not available” where absent.
5. Render the calendar at full size.
   - Make the main calendar fill the available page width and height, using responsive layout such as `min-height: 100vh`, flexible columns/rows, and no narrow fixed-width wrapper around the calendar.
   - Use a full-width dashboard shell and let the calendar grid expand to the browser viewport.
   - Avoid small embedded previews, constrained cards, or fixed-height containers that make the calendar look miniaturized.
6. Show page titles directly in calendar cells.
   - Each date cell must make the page title visible for pages on that date, using `Title` when present and falling back to `FileLeafRef`/file name.
   - Keep titles compact with truncation, wrapping, or a visible “+N more” affordance if the cell has many pages.
   - Do not hide all titles behind counts only; counts may supplement titles but must not replace them.
7. Open a true right-side overlay drawer when a page title is clicked.
   - Clicking a visible page title in the calendar cell must open a fixed-position drawer that slides in from the right side of the browser viewport.
   - Implement the drawer with CSS such as `position: fixed; top: 0; right: 0; height: 100vh; z-index: ...; transform: translateX(...)`, plus an overlay/backdrop and close button.
   - Do not render details below the calendar, below the selected date, or as an inline panel that appears after the calendar.
   - The drawer should overlay the page or sit above the calendar without causing the calendar to collapse into a compact widget.
   - The drawer should show all available metadata for the clicked page, including title, file name, source link, status, source status field, placement logic, created/modified dates, first published date, publish start date, scheduled version, moderation status, version, level, author, editor, page layout, and description.
   - Include a clear source page link that opens the page.
8. Avoid congested calendar cells.
   - Show visible titles while keeping cells readable.
   - Provide compact status counts and a “+N more” affordance when useful.
   - Include month previous/next buttons and status filters.
9. Generate the HTML using `execute_code` with `outputDataRef: true`.
   - Keep all CSS and JavaScript inline.
   - Do not reference external scripts, fonts, or images.
10. Save the dashboard with `create_file` as `.html` using `contentDataRef`; omit `contentDataPath` for raw HTML output from `execute_code`.

## Output format
Reply with:
- A markdown link to the created HTML dashboard.
- A short note summarizing the status logic, especially that scheduled pages only use `_ScheduledVersion` or explicit scheduled status.
- A short note that the calendar is rendered full-size to use the available page/viewport area.
- A short note that page titles are visible on the calendar and clicking a title opens a true right-side overlay drawer.
- If any status/date fields are missing, say what was unavailable instead of filling gaps.

## Constraints
- Don’t hallucinate status, dates, page names, or URLs.
- Don’t treat `_PublishStartDate` alone as proof of a scheduled page.
- Don’t use the inline preview for final counts if a `dataRef` is available.
- Don’t constrain the calendar to a small fixed-size widget unless the user explicitly asks for an embedded compact view.
- Don’t make page details accessible only through hover.
- Don’t place details below the calendar; clicking a visible title must open a right-side overlay drawer.
- If tool calls fail or return empty data, say so plainly and don’t invent content.
