|
| 1 | +# Plan: psake Showcase Page Implementation |
| 2 | + |
| 3 | +## Overview |
| 4 | +Create a showcase page to highlight projects and organizations using psake for build automation, similar to the [Docusaurus showcase](https://docusaurus.io/showcase). |
| 5 | + |
| 6 | +## 1. Data Structure & Schema |
| 7 | + |
| 8 | +### Create Data File: `src/data/showcase.tsx` |
| 9 | + |
| 10 | +Define TypeScript types and data structure: |
| 11 | + |
| 12 | +```typescript |
| 13 | +export type TagType = |
| 14 | + | 'favorite' // Curated favorites by psake team |
| 15 | + | 'opensource' // Open-source projects |
| 16 | + | 'commercial' // Commercial/enterprise projects |
| 17 | + | 'cicd' // CI/CD integration examples |
| 18 | + | 'dotnet' // .NET projects |
| 19 | + | 'module' // PowerShell module builds |
| 20 | + | 'large' // Large projects (>100 tasks) |
| 21 | + | 'testing' // Strong test automation |
| 22 | + |
| 23 | +export type ShowcaseProject = { |
| 24 | + title: string; // Project name |
| 25 | + description: string; // Max 120 characters |
| 26 | + preview: string; // Path to screenshot (640px min width) |
| 27 | + website: string | null; // Project website/docs |
| 28 | + source: string; // GitHub/GitLab repository |
| 29 | + tags: TagType[]; // Category tags |
| 30 | +}; |
| 31 | + |
| 32 | +export const projects: ShowcaseProject[] = [ |
| 33 | + // Initial seed projects |
| 34 | +]; |
| 35 | +``` |
| 36 | + |
| 37 | +### Image Storage Structure |
| 38 | +- Create directory: `static/img/showcase/` |
| 39 | +- Naming convention: `{project-slug}.png` or `.jpg` |
| 40 | +- Requirements: Min 640px width, max 2:1 aspect ratio |
| 41 | +- Optimize images before adding (use build task) |
| 42 | + |
| 43 | +## 2. Component Architecture |
| 44 | + |
| 45 | +### 2.1 Main Page Component |
| 46 | +**File:** `src/pages/showcase/index.tsx` |
| 47 | + |
| 48 | +```typescript |
| 49 | +export default function Showcase(): JSX.Element { |
| 50 | + return ( |
| 51 | + <Layout title="Showcase" description="Projects built with psake"> |
| 52 | + <ShowcaseHeader /> |
| 53 | + <main className="margin-vert--lg"> |
| 54 | + <ShowcaseFilters /> |
| 55 | + <ShowcaseSearchBar /> |
| 56 | + <ShowcaseCards /> |
| 57 | + </main> |
| 58 | + </Layout> |
| 59 | + ); |
| 60 | +} |
| 61 | +``` |
| 62 | + |
| 63 | +### 2.2 Sub-Components |
| 64 | + |
| 65 | +**File:** `src/components/showcase/ShowcaseHeader.tsx` |
| 66 | +- Title: "psake Showcase" |
| 67 | +- Subtitle: "Discover projects built with psake" |
| 68 | +- CTA button: "Submit Your Project" (links to GitHub discussion) |
| 69 | + |
| 70 | +**File:** `src/components/showcase/ShowcaseFilters.tsx` |
| 71 | +- Tag-based filtering (multi-select) |
| 72 | +- AND/OR toggle for filter logic |
| 73 | +- "Clear All" button |
| 74 | +- Active filter count display |
| 75 | + |
| 76 | +**File:** `src/components/showcase/ShowcaseSearchBar.tsx` |
| 77 | +- Real-time search across title + description |
| 78 | +- Fuzzy matching support |
| 79 | +- Search result count |
| 80 | + |
| 81 | +**File:** `src/components/showcase/ShowcaseCard.tsx` |
| 82 | +- Project screenshot with hover effect |
| 83 | +- Title (links to website or source) |
| 84 | +- Description |
| 85 | +- Tag badges |
| 86 | +- GitHub link icon |
| 87 | +- Website link icon (if available) |
| 88 | + |
| 89 | +**File:** `src/components/showcase/ShowcaseCards.tsx` |
| 90 | +- Grid layout (responsive: 1/2/3 columns) |
| 91 | +- "Favorites" section first (if any favorites exist) |
| 92 | +- "All Projects" section (alphabetically sorted) |
| 93 | +- Empty state when no results |
| 94 | + |
| 95 | +### 2.3 Styling |
| 96 | +**File:** `src/components/showcase/styles.module.css` |
| 97 | +- Card hover effects |
| 98 | +- Tag badge colors |
| 99 | +- Responsive grid layout |
| 100 | +- Filter button styles |
| 101 | +- Search input styling |
| 102 | + |
| 103 | +## 3. Key Features Implementation |
| 104 | + |
| 105 | +### 3.1 Filtering System |
| 106 | +- Multi-tag selection (OR logic by default) |
| 107 | +- Toggle between AND/OR filtering |
| 108 | +- Persist filter state in URL query params |
| 109 | +- Filter count badge |
| 110 | + |
| 111 | +### 3.2 Search Functionality |
| 112 | +- Case-insensitive search |
| 113 | +- Search across: title, description, tags |
| 114 | +- Real-time results update |
| 115 | +- Combine with filters (AND logic) |
| 116 | + |
| 117 | +### 3.3 Favorites Section |
| 118 | +- Manually curated by psake maintainers |
| 119 | +- Display prominently at top |
| 120 | +- Larger card size option |
| 121 | +- "Featured" badge/ribbon |
| 122 | + |
| 123 | +### 3.4 Responsive Design |
| 124 | +- Mobile: 1 column |
| 125 | +- Tablet: 2 columns |
| 126 | +- Desktop: 3 columns |
| 127 | +- Touch-friendly filter buttons |
| 128 | + |
| 129 | +## 4. Integration with Existing Site |
| 130 | + |
| 131 | +### 4.1 Navigation Updates |
| 132 | +**File:** `docusaurus.config.ts` |
| 133 | + |
| 134 | +Add to navbar items (line 89): |
| 135 | +```typescript |
| 136 | +{ to: '/showcase', label: 'Showcase', position: 'left' }, |
| 137 | +``` |
| 138 | + |
| 139 | +### 4.2 Footer Updates |
| 140 | +Add to "Community" section (line 141): |
| 141 | +```typescript |
| 142 | +{ |
| 143 | + label: 'Showcase', |
| 144 | + to: '/showcase', |
| 145 | +}, |
| 146 | +``` |
| 147 | + |
| 148 | +### 4.3 Homepage Link |
| 149 | +**File:** `src/pages/index.tsx` |
| 150 | + |
| 151 | +Add CTA button or section linking to showcase |
| 152 | + |
| 153 | +## 5. Submission Workflow |
| 154 | + |
| 155 | +### 5.1 GitHub Discussion Setup |
| 156 | +- Create GitHub Discussion category: "Showcase Submissions" |
| 157 | +- Template for submissions: |
| 158 | + ```markdown |
| 159 | + **Project Name:** |
| 160 | + **Description:** (max 120 chars) |
| 161 | + **Website:** (optional) |
| 162 | + **Source Repository:** |
| 163 | + **Screenshot URL:** (upload to discussion) |
| 164 | + **Suggested Tags:** |
| 165 | + ``` |
| 166 | + |
| 167 | +### 5.2 Review Process |
| 168 | +1. User submits via GitHub discussion |
| 169 | +2. Maintainer reviews: |
| 170 | + - Validates project uses psake |
| 171 | + - Checks screenshot quality (640px min, 2:1 ratio) |
| 172 | + - Verifies links work |
| 173 | + - Optimizes image |
| 174 | +3. Maintainer creates PR: |
| 175 | + - Adds entry to `src/data/showcase.tsx` |
| 176 | + - Adds optimized image to `static/img/showcase/` |
| 177 | + - Updates relevant tags |
| 178 | + |
| 179 | +### 5.3 Image Optimization Task |
| 180 | +**File:** `psakeFile.ps1` |
| 181 | + |
| 182 | +Add new task: |
| 183 | +```powershell |
| 184 | +Task OptimizeShowcaseImages { |
| 185 | + # Use ImageMagick or similar to: |
| 186 | + # - Resize to max 1280px width |
| 187 | + # - Compress to <200KB |
| 188 | + # - Convert to WebP format (with fallback) |
| 189 | +} |
| 190 | +``` |
| 191 | + |
| 192 | +## 6. Build System Integration |
| 193 | + |
| 194 | +### 6.1 Validation Task |
| 195 | +**File:** `psakeFile.ps1` |
| 196 | + |
| 197 | +```powershell |
| 198 | +Task ValidateShowcase { |
| 199 | + # Check all images exist |
| 200 | + # Validate image dimensions |
| 201 | + # Ensure descriptions <= 120 chars |
| 202 | + # Verify all URLs are reachable |
| 203 | +} |
| 204 | +``` |
| 205 | + |
| 206 | +Add to `Test` task dependencies |
| 207 | + |
| 208 | +### 6.2 Pester Tests |
| 209 | +**File:** `tests/Showcase.Tests.ps1` |
| 210 | + |
| 211 | +```powershell |
| 212 | +Describe 'Showcase Data Validation' { |
| 213 | + It 'All projects have valid images' { } |
| 214 | + It 'All descriptions are <= 120 characters' { } |
| 215 | + It 'All source URLs are valid GitHub/GitLab links' { } |
| 216 | + It 'No duplicate project titles' { } |
| 217 | + It 'All tags are valid TagType values' { } |
| 218 | +} |
| 219 | +``` |
| 220 | + |
| 221 | +## 7. Content Strategy |
| 222 | + |
| 223 | +### 7.1 Initial Seed Projects |
| 224 | +Reach out to known psake users: |
| 225 | +- psake itself (meta) |
| 226 | +- Popular PowerShell modules using psake |
| 227 | +- .NET projects with psake builds |
| 228 | +- CI/CD pipeline examples |
| 229 | + |
| 230 | +Target: 10-15 initial projects before launch |
| 231 | + |
| 232 | +### 7.2 Tag Categories |
| 233 | +- **favorite**: Maintainer-curated highlights (3-5 max) |
| 234 | +- **opensource**: Public repositories |
| 235 | +- **commercial**: Enterprise/product builds |
| 236 | +- **cicd**: CI/CD integration showcases |
| 237 | +- **dotnet**: .NET project builds |
| 238 | +- **module**: PowerShell module automation |
| 239 | +- **large**: Complex builds (>100 tasks) |
| 240 | +- **testing**: Test automation examples |
| 241 | + |
| 242 | +## 8. SEO & Metadata |
| 243 | + |
| 244 | +### Page Metadata |
| 245 | +```typescript |
| 246 | +<Layout |
| 247 | + title="Showcase - Projects Built with psake" |
| 248 | + description="Discover real-world projects using psake for build automation in PowerShell, .NET, and CI/CD pipelines." |
| 249 | +> |
| 250 | +``` |
| 251 | + |
| 252 | +### Social Card |
| 253 | +Create custom social card: `static/img/showcase-social-card.png` |
| 254 | + |
| 255 | +## 9. Implementation Phases |
| 256 | + |
| 257 | +### Phase 1: Core Structure (Day 1-2) |
| 258 | +- [ ] Create data schema and initial file |
| 259 | +- [ ] Build main page component |
| 260 | +- [ ] Implement basic card grid |
| 261 | +- [ ] Add to navigation |
| 262 | + |
| 263 | +### Phase 2: Filtering & Search (Day 3-4) |
| 264 | +- [ ] Implement tag filtering |
| 265 | +- [ ] Add search functionality |
| 266 | +- [ ] URL query param persistence |
| 267 | +- [ ] Mobile responsive design |
| 268 | + |
| 269 | +### Phase 3: Polish & Integration (Day 5) |
| 270 | +- [ ] Favorites section |
| 271 | +- [ ] Styling and animations |
| 272 | +- [ ] Empty states |
| 273 | +- [ ] Build system integration |
| 274 | + |
| 275 | +### Phase 4: Validation & Launch (Day 6-7) |
| 276 | +- [ ] Pester tests |
| 277 | +- [ ] Documentation |
| 278 | +- [ ] Seed initial projects |
| 279 | +- [ ] GitHub discussion setup |
| 280 | +- [ ] Deploy and announce |
| 281 | + |
| 282 | +## 10. Future Enhancements |
| 283 | + |
| 284 | +### Post-Launch Improvements |
| 285 | +- **Community voting**: Let users upvote favorites |
| 286 | +- **Sorting options**: By date added, popularity, name |
| 287 | +- **Project stats**: Task count, lines of code, contributors |
| 288 | +- **Category pages**: Dedicated pages per tag |
| 289 | +- **RSS feed**: New showcase additions |
| 290 | +- **Automated screenshots**: GitHub Action to capture screenshots |
| 291 | +- **Rich previews**: Embed GitHub stats (stars, forks) |
| 292 | + |
| 293 | +### Advanced Features |
| 294 | +- **Web form submission**: Direct submission without GitHub account |
| 295 | +- **Automated validation**: GitHub Action to validate PRs |
| 296 | +- **Featured rotation**: Rotate featured projects monthly |
| 297 | +- **Case studies**: Detailed write-ups for select projects |
| 298 | + |
| 299 | +## 11. Success Metrics |
| 300 | + |
| 301 | +Track after 3 months: |
| 302 | +- Number of showcase projects (Target: 30+) |
| 303 | +- Submission rate (Target: 2-3/month) |
| 304 | +- Showcase page views |
| 305 | +- Click-through to project repos |
| 306 | +- Community engagement in discussions |
| 307 | + |
| 308 | +--- |
| 309 | + |
| 310 | +## Dependencies |
| 311 | + |
| 312 | +**NPM Packages** (already available): |
| 313 | +- ✅ `clsx` - Conditional classnames |
| 314 | +- ✅ `react` & `react-dom` - React framework |
| 315 | +- ✅ TypeScript - Type safety |
| 316 | + |
| 317 | +**No additional dependencies required!** |
| 318 | + |
| 319 | +## Estimated Effort |
| 320 | + |
| 321 | +- **Development**: 3-5 days |
| 322 | +- **Testing & Polish**: 1-2 days |
| 323 | +- **Seed Content**: 2-3 days (parallel) |
| 324 | +- **Total**: ~1 week for MVP launch |
| 325 | + |
| 326 | +## References & Sources |
| 327 | + |
| 328 | +- [Docusaurus Site Showcase](https://docusaurus.io/showcase) |
| 329 | +- [Docusaurus showcase/index.tsx](https://github.com/facebook/docusaurus/blob/main/website/src/pages/showcase/index.tsx) |
| 330 | +- [Docusaurus showcase data structure](https://github.com/facebook/docusaurus/blob/main/website/src/data/users.tsx) |
| 331 | +- [Showcase submissions discussion](https://github.com/facebook/docusaurus/discussions/7826) |
| 332 | +- [Showcase infrastructure issue](https://github.com/facebook/docusaurus/issues/6882) |
| 333 | + |
| 334 | +--- |
| 335 | + |
| 336 | +## Notes |
| 337 | + |
| 338 | +This plan provides a complete roadmap for implementing a professional, scalable showcase page that will help grow the psake community by highlighting real-world usage and success stories. |
| 339 | + |
| 340 | +The implementation can be done in stages following the phases outlined in Section 9, allowing for incremental development and testing. |
0 commit comments