refactor: update project references and configurations for ONYXSimple
- Changed favicon and logo references to ONYXSimple - Updated package.json to modify start command and add deploy scripts - Adjusted layout and page metadata to reflect ONYXSimple branding - Enhanced marquee animation with dynamic duration - Added robots.txt and sitemap.xml for SEO - Refactored various components for consistency and clarity
This commit is contained in:
parent
e6225be5eb
commit
471f9a3aea
22 changed files with 575 additions and 81 deletions
182
.kronk/claude/CLAUDE.md
Normal file
182
.kronk/claude/CLAUDE.md
Normal file
|
|
@ -0,0 +1,182 @@
|
|||
# ONYXSimple - Claude Development Guide
|
||||
|
||||
This document provides context and guidelines for Claude when working on this project.
|
||||
|
||||
## Project Overview
|
||||
|
||||
This is a **Next.js** project managed with Kronk CMS.
|
||||
|
||||
## Framework: Next.js
|
||||
|
||||
### Configuration
|
||||
Config file: next.config.ts
|
||||
|
||||
### Content Structure
|
||||
- App Router: 0 files
|
||||
|
||||
### Package Manager: NPM
|
||||
|
||||
### Next.js-Specific Information
|
||||
Router: App Router (recommended)
|
||||
|
||||
### Next.js Commands
|
||||
- `npm run dev` - Start dev server
|
||||
- `npm run build` - Build for production
|
||||
- `npm run start` - Start production server
|
||||
- `npm run lint` - Run ESLint
|
||||
|
||||
|
||||
## Development Guidelines
|
||||
|
||||
### Code Style
|
||||
|
||||
- Follow existing code patterns and conventions in the codebase
|
||||
- Use consistent naming conventions
|
||||
- Write clear, self-documenting code
|
||||
- Add comments only where the logic is not self-evident
|
||||
|
||||
### Content Management
|
||||
|
||||
- Content files use front matter for metadata (YAML format)
|
||||
- Respect the existing content structure and collections
|
||||
- When creating new content, use appropriate templates
|
||||
|
||||
### Next.js-Specific Guidelines
|
||||
|
||||
- Use App Router conventions (`app/` directory)
|
||||
- Server Components by default, use 'use client' for client components
|
||||
- Use `next/image` for optimized images
|
||||
- API routes go in `app/api/`
|
||||
|
||||
## Key Files and Directories
|
||||
|
||||
```
|
||||
pages/ # Content files
|
||||
app/ # Content files
|
||||
src/pages/ # Content files
|
||||
src/app/ # Content files
|
||||
next.config.js # Configuration
|
||||
next.config.mjs # Configuration
|
||||
next.config.ts # Configuration
|
||||
.kronk/ # Kronk CMS configuration
|
||||
```
|
||||
|
||||
## Common Tasks
|
||||
|
||||
When working on this project, you may be asked to:
|
||||
|
||||
1. **Create new content** - Use the appropriate content directory and front matter format
|
||||
2. **Modify layouts** - Follow existing patterns and component structure
|
||||
3. **Update configuration** - Be careful with site-wide settings
|
||||
4. **Add features** - Consider the framework's conventions and best practices
|
||||
|
||||
## AI Guardrails & Design Standards
|
||||
|
||||
These standards guide AI-assisted content and code generation.
|
||||
|
||||
### Design Standards
|
||||
|
||||
### Brand Colors
|
||||
|
||||
No brand colors defined.
|
||||
|
||||
### Typography
|
||||
|
||||
**Font Families:**
|
||||
- System UI
|
||||
- sans-serif
|
||||
|
||||
**Font Sizes:** 12px, 14px, 16px, 20px, 24px, 32px, 48px
|
||||
|
||||
**Font Weights:** 400 (normal), 500 (medium), 700 (bold)
|
||||
|
||||
**Line Heights:** 1.2, 1.5, 1.75, 2.0
|
||||
|
||||
### Spacing Scale
|
||||
|
||||
**Margins:** 4px, 8px, 16px, 24px, 32px, 48px, 64px
|
||||
|
||||
**Paddings:** 4px, 8px, 16px, 24px, 32px, 48px, 64px
|
||||
|
||||
### Border Radius
|
||||
|
||||
- Small: 2px
|
||||
- Medium: 4px
|
||||
- Large: 8px
|
||||
|
||||
### Shadows
|
||||
|
||||
- **small**: `0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24)`
|
||||
- **medium**: `0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23)`
|
||||
- **large**: `0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23)`
|
||||
|
||||
### Accessibility Requirements
|
||||
|
||||
### WCAG Compliance Level
|
||||
|
||||
Target: **WCAG Level AA**
|
||||
|
||||
### Requirements
|
||||
|
||||
- **Alt Text**: Required for all images
|
||||
- **Minimum Contrast Ratio**: 4.5:1
|
||||
- **Keyboard Navigation**: Required for all interactive elements
|
||||
- **ARIA Labels**: Required for semantic markup
|
||||
|
||||
### Guidelines
|
||||
|
||||
- All interactive elements must be keyboard accessible
|
||||
- Color contrast must meet or exceed 4.5:1 ratio
|
||||
- Semantic HTML should be used (nav, main, article, aside, etc.)
|
||||
- Form inputs must have associated labels
|
||||
- Focus indicators must be visible and clear
|
||||
|
||||
### SEO Guidelines
|
||||
|
||||
### Meta Information
|
||||
|
||||
- **Meta Description Length**: 140-160 characters
|
||||
- **Title Format**: `{title} | {siteName}`
|
||||
|
||||
### Content Structure
|
||||
|
||||
- **Heading Hierarchy**: Required (H1 → H2 → H3, no skipping levels)
|
||||
- **Sitemap**: Required (sitemap.xml must be generated)
|
||||
- **Structured Data**: Optional
|
||||
|
||||
### Best Practices
|
||||
|
||||
- Each page should have one unique H1 heading
|
||||
- Meta descriptions should be compelling and include target keywords
|
||||
- URLs should be descriptive and use hyphens (not underscores)
|
||||
- Images should include descriptive filenames and alt text
|
||||
- Internal linking should be used to connect related content
|
||||
|
||||
### Performance Budgets
|
||||
|
||||
### Page Performance Budgets
|
||||
|
||||
- **Maximum Page Size**: 1500KB
|
||||
- **Maximum Image Size**: 200KB
|
||||
- **Target Load Time**: 3.0s (on 3G connection)
|
||||
|
||||
### Lighthouse Score Targets
|
||||
|
||||
- **Performance**: 90/100
|
||||
- **Accessibility**: 95/100
|
||||
- **Best Practices**: 95/100
|
||||
- **SEO**: 95/100
|
||||
|
||||
### Optimization Guidelines
|
||||
|
||||
- Use lazy loading for images below the fold
|
||||
- Minimize and compress CSS/JS assets
|
||||
- Use modern image formats (WebP, AVIF)
|
||||
- Implement proper caching headers
|
||||
- Use a CDN for static assets
|
||||
- Minimize third-party scripts
|
||||
- Optimize font loading with font-display: swap
|
||||
|
||||
---
|
||||
|
||||
*Generated by Kronk CMS*
|
||||
151
.kronk/cursor/.cursorrules
Normal file
151
.kronk/cursor/.cursorrules
Normal file
|
|
@ -0,0 +1,151 @@
|
|||
# Cursor Rules for ONYXSimple
|
||||
|
||||
You are working on a Next.js project managed with Kronk CMS.
|
||||
|
||||
## General Rules
|
||||
|
||||
- Follow existing code patterns and conventions
|
||||
- Write clean, maintainable code
|
||||
- Use TypeScript/JavaScript best practices where applicable
|
||||
- Prefer functional programming patterns
|
||||
- Keep components small and focused
|
||||
|
||||
## Next.js Rules
|
||||
|
||||
- Use Server Components by default
|
||||
- 'use client' only when necessary
|
||||
- App Router file conventions
|
||||
- Use next/image for images
|
||||
- Metadata API for SEO
|
||||
|
||||
## Content Rules
|
||||
|
||||
- Front matter must be valid YAML/TOML/JSON
|
||||
- Use consistent date formats
|
||||
- Tags and categories should be lowercase
|
||||
- Slugs should be URL-friendly
|
||||
- Images should have alt text
|
||||
|
||||
## Code Patterns
|
||||
|
||||
When generating code:
|
||||
|
||||
- Match existing file naming conventions
|
||||
- Use existing component patterns
|
||||
- Follow the project's directory structure
|
||||
- Include appropriate error handling
|
||||
- Add types where TypeScript is used
|
||||
|
||||
## Avoid
|
||||
|
||||
- Breaking changes to existing content structure
|
||||
- Hardcoded URLs or paths
|
||||
- Inline styles (use CSS/Tailwind)
|
||||
- Console.log in production code
|
||||
- Committing sensitive data
|
||||
|
||||
## AI Guardrails & Design Standards
|
||||
|
||||
### Design Standards
|
||||
|
||||
### Brand Colors
|
||||
|
||||
No brand colors defined.
|
||||
|
||||
### Typography
|
||||
|
||||
**Font Families:**
|
||||
- System UI
|
||||
- sans-serif
|
||||
|
||||
**Font Sizes:** 12px, 14px, 16px, 20px, 24px, 32px, 48px
|
||||
|
||||
**Font Weights:** 400 (normal), 500 (medium), 700 (bold)
|
||||
|
||||
**Line Heights:** 1.2, 1.5, 1.75, 2.0
|
||||
|
||||
### Spacing Scale
|
||||
|
||||
**Margins:** 4px, 8px, 16px, 24px, 32px, 48px, 64px
|
||||
|
||||
**Paddings:** 4px, 8px, 16px, 24px, 32px, 48px, 64px
|
||||
|
||||
### Border Radius
|
||||
|
||||
- Small: 2px
|
||||
- Medium: 4px
|
||||
- Large: 8px
|
||||
|
||||
### Shadows
|
||||
|
||||
- **small**: `0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24)`
|
||||
- **medium**: `0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23)`
|
||||
- **large**: `0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23)`
|
||||
|
||||
### Accessibility Requirements
|
||||
|
||||
### WCAG Compliance Level
|
||||
|
||||
Target: **WCAG Level AA**
|
||||
|
||||
### Requirements
|
||||
|
||||
- **Alt Text**: Required for all images
|
||||
- **Minimum Contrast Ratio**: 4.5:1
|
||||
- **Keyboard Navigation**: Required for all interactive elements
|
||||
- **ARIA Labels**: Required for semantic markup
|
||||
|
||||
### Guidelines
|
||||
|
||||
- All interactive elements must be keyboard accessible
|
||||
- Color contrast must meet or exceed 4.5:1 ratio
|
||||
- Semantic HTML should be used (nav, main, article, aside, etc.)
|
||||
- Form inputs must have associated labels
|
||||
- Focus indicators must be visible and clear
|
||||
|
||||
### SEO Guidelines
|
||||
|
||||
### Meta Information
|
||||
|
||||
- **Meta Description Length**: 140-160 characters
|
||||
- **Title Format**: `{title} | {siteName}`
|
||||
|
||||
### Content Structure
|
||||
|
||||
- **Heading Hierarchy**: Required (H1 → H2 → H3, no skipping levels)
|
||||
- **Sitemap**: Required (sitemap.xml must be generated)
|
||||
- **Structured Data**: Optional
|
||||
|
||||
### Best Practices
|
||||
|
||||
- Each page should have one unique H1 heading
|
||||
- Meta descriptions should be compelling and include target keywords
|
||||
- URLs should be descriptive and use hyphens (not underscores)
|
||||
- Images should include descriptive filenames and alt text
|
||||
- Internal linking should be used to connect related content
|
||||
|
||||
### Performance Budgets
|
||||
|
||||
### Page Performance Budgets
|
||||
|
||||
- **Maximum Page Size**: 1500KB
|
||||
- **Maximum Image Size**: 200KB
|
||||
- **Target Load Time**: 3.0s (on 3G connection)
|
||||
|
||||
### Lighthouse Score Targets
|
||||
|
||||
- **Performance**: 90/100
|
||||
- **Accessibility**: 95/100
|
||||
- **Best Practices**: 95/100
|
||||
- **SEO**: 95/100
|
||||
|
||||
### Optimization Guidelines
|
||||
|
||||
- Use lazy loading for images below the fold
|
||||
- Minimize and compress CSS/JS assets
|
||||
- Use modern image formats (WebP, AVIF)
|
||||
- Implement proper caching headers
|
||||
- Use a CDN for static assets
|
||||
- Minimize third-party scripts
|
||||
- Optimize font loading with font-display: swap
|
||||
|
||||
2
next-env.d.ts
vendored
2
next-env.d.ts
vendored
|
|
@ -1,6 +1,6 @@
|
|||
/// <reference types="next" />
|
||||
/// <reference types="next/image-types/global" />
|
||||
import "./.next/dev/types/routes.d.ts";
|
||||
import "./.next/types/routes.d.ts";
|
||||
|
||||
// NOTE: This file should not be edited
|
||||
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
|
||||
|
|
|
|||
|
|
@ -16,10 +16,13 @@
|
|||
"lint:fix": "cross-env NODE_OPTIONS=--no-deprecation eslint . --fix",
|
||||
"payload": "cross-env NODE_OPTIONS=--no-deprecation payload",
|
||||
"reinstall": "cross-env NODE_OPTIONS=--no-deprecation rm -rf node_modules && rm pnpm-lock.yaml && pnpm --ignore-workspace install",
|
||||
"start": "cross-env NODE_OPTIONS=--no-deprecation next start",
|
||||
"start": "cross-env NODE_OPTIONS=--no-deprecation next start -p 3099",
|
||||
"test": "pnpm run test:int && pnpm run test:e2e",
|
||||
"test:e2e": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm\" playwright test --config=playwright.config.ts",
|
||||
"test:int": "cross-env NODE_OPTIONS=--no-deprecation vitest run --config ./vitest.config.mts"
|
||||
"test:int": "cross-env NODE_OPTIONS=--no-deprecation vitest run --config ./vitest.config.mts",
|
||||
"predeploy": "bun run build",
|
||||
"deploy": "rsync -ruhvP --exclude=node_modules ./ onyxsimple@jmf-usrv-2404:/home/onyxsimple/webroot/",
|
||||
"postdeploy": "ssh onyxsimple@jmf-usrv-2404 \"systemctl --user try-reload-or-restart onyxsimple-site.service\""
|
||||
},
|
||||
"dependencies": {
|
||||
"@awesome.me/kit-3dc4522338": "^1.0.4",
|
||||
|
|
|
|||
|
|
@ -1,23 +1,48 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.dev/svgjs" width="1000" height="1000"><style>
|
||||
#light-icon {
|
||||
display: inline;
|
||||
}
|
||||
#dark-icon {
|
||||
display: none;
|
||||
}
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
#light-icon {
|
||||
display: none;
|
||||
}
|
||||
#dark-icon {
|
||||
display: inline;
|
||||
}
|
||||
}
|
||||
</style><g id="light-icon"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.dev/svgjs" width="1000" height="1000"><g clip-path="url(#SvgjsClipPath1059)"><rect width="1000" height="1000" fill="#000000"></rect><g transform="matrix(5,0,0,5,192.5,150)"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.dev/svgjs" width="123" height="140"><svg width="123" height="140" viewBox="0 0 123 140" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M60.2569 118.758L18.9035 94.9917C18.4016 94.6917 18.067 94.1583 18.067 93.5583V56.825C18.067 56.1917 18.7696 55.7917 19.3049 56.0917L67.3164 83.6917C67.9855 84.0917 68.822 83.5917 68.822 82.825V64.925C68.822 64.225 68.4539 63.5583 67.8182 63.1917L10.0707 29.9917C9.56883 29.6917 8.89968 29.6917 8.39782 29.9917L0.836436 34.3583C0.334574 34.6583 0 35.1917 0 35.7917V104.025C0 104.625 0.334574 105.158 0.836436 105.458L60.1565 139.592C60.6583 139.892 61.3275 139.892 61.8293 139.592L111.647 110.925C112.317 110.525 112.317 109.592 111.647 109.192L96.1232 100.258C95.4875 99.8917 94.7515 99.8917 94.1158 100.258L61.9632 118.758C61.4613 119.058 60.7922 119.058 60.2903 118.758H60.2569Z" fill="white"></path>
|
||||
<path d="M121.149 34.325L61.8294 0.225C61.3275 -0.075 60.6584 -0.075 60.1565 0.225L28.8069 18.2583C28.1378 18.6583 28.1378 19.5917 28.8069 19.9917L44.1973 28.8583C44.833 29.225 45.5691 29.225 46.2048 28.8583L60.2569 20.7917C60.7588 20.4917 61.4279 20.4917 61.9298 20.7917L103.283 44.5583C103.785 44.8583 104.12 45.3917 104.12 45.9917V82.8917C104.12 83.5917 104.488 84.2583 105.123 84.625L120.514 93.4583C121.183 93.8583 122.019 93.3583 122.019 92.5917V35.7917C122.019 35.1917 121.685 34.6583 121.183 34.3583L121.149 34.325Z" fill="white"></path>
|
||||
</svg></svg></g></g><defs><clipPath id="SvgjsClipPath1059"><rect width="1000" height="1000" x="0" y="0" rx="350" ry="350"></rect></clipPath></defs></svg></g><g id="dark-icon"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.dev/svgjs" width="1000" height="1000"><g clip-path="url(#SvgjsClipPath1060)"><rect width="1000" height="1000" fill="#000000"></rect><g transform="matrix(5,0,0,5,192.5,150)"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.dev/svgjs" width="123" height="140"><svg width="123" height="140" viewBox="0 0 123 140" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M60.2569 118.758L18.9035 94.9917C18.4016 94.6917 18.067 94.1583 18.067 93.5583V56.825C18.067 56.1917 18.7696 55.7917 19.3049 56.0917L67.3164 83.6917C67.9855 84.0917 68.822 83.5917 68.822 82.825V64.925C68.822 64.225 68.4539 63.5583 67.8182 63.1917L10.0707 29.9917C9.56883 29.6917 8.89968 29.6917 8.39782 29.9917L0.836436 34.3583C0.334574 34.6583 0 35.1917 0 35.7917V104.025C0 104.625 0.334574 105.158 0.836436 105.458L60.1565 139.592C60.6583 139.892 61.3275 139.892 61.8293 139.592L111.647 110.925C112.317 110.525 112.317 109.592 111.647 109.192L96.1232 100.258C95.4875 99.8917 94.7515 99.8917 94.1158 100.258L61.9632 118.758C61.4613 119.058 60.7922 119.058 60.2903 118.758H60.2569Z" fill="white"></path>
|
||||
<path d="M121.149 34.325L61.8294 0.225C61.3275 -0.075 60.6584 -0.075 60.1565 0.225L28.8069 18.2583C28.1378 18.6583 28.1378 19.5917 28.8069 19.9917L44.1973 28.8583C44.833 29.225 45.5691 29.225 46.2048 28.8583L60.2569 20.7917C60.7588 20.4917 61.4279 20.4917 61.9298 20.7917L103.283 44.5583C103.785 44.8583 104.12 45.3917 104.12 45.9917V82.8917C104.12 83.5917 104.488 84.2583 105.123 84.625L120.514 93.4583C121.183 93.8583 122.019 93.3583 122.019 92.5917V35.7917C122.019 35.1917 121.685 34.6583 121.183 34.3583L121.149 34.325Z" fill="white"></path>
|
||||
</svg></svg></g></g><defs><clipPath id="SvgjsClipPath1060"><rect width="1000" height="1000" x="0" y="0" rx="350" ry="350"></rect></clipPath></defs></svg></g></svg>
|
||||
<svg
|
||||
width="300"
|
||||
height="300"
|
||||
viewBox="0 0 300 300"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
xml:space="preserve"
|
||||
inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
|
||||
sodipodi:docname="logo-white.svg"
|
||||
inkscape:export-filename="logo.svg"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#000000"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="px"
|
||||
inkscape:zoom="1.3616667"
|
||||
inkscape:cx="2.2031823"
|
||||
inkscape:cy="163.40269"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1004"
|
||||
inkscape:window-x="5120"
|
||||
inkscape:window-y="1155"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1" /><defs
|
||||
id="defs1" /><g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"><path
|
||||
id="path4"
|
||||
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:19.3432;stroke-opacity:1;paint-order:stroke fill markers"
|
||||
d="M 151.41726,14.254382 68.353211,98.763114 49.484507,117.96127 c -4.968354,39.84769 58.229493,86.80098 99.589693,86.80098 41.3602,0 104.79014,-48.42796 101.57986,-86.80098 L 232.28402,98.763114 Z m 0,75.133318 c 19.77118,5.03e-4 35.79827,15.39296 35.79704,34.37957 -5.3e-4,18.98542 -16.0271,34.37602 -35.79704,34.37652 -19.77113,0.001 -35.79956,-15.38996 -35.80009,-34.37652 -0.001,-18.98775 16.02772,-34.380685 35.80009,-34.37957 z"
|
||||
sodipodi:nodetypes="ccczcccccccc" /><path
|
||||
style="opacity:1;fill:#ffffff;stroke:none;stroke-width:19;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:stroke fill markers;fill-opacity:1;stroke-opacity:1;stroke-dashoffset:0;stroke-miterlimit:4"
|
||||
d="m 32.039343,171.06602 12.47681,-13.25706 c 0,0 64.212437,61.16558 104.558047,60.97426 40.6619,-0.19283 104.79014,-62.44893 104.79014,-62.44893 0,0 9.39756,9.53569 14.09635,14.30351 C 227.4057,209.48538 149.0742,289.96628 149.0742,289.96628 Z"
|
||||
id="path1" /></g></svg>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 2.4 KiB |
23
public/favicon.svg.bak
Normal file
23
public/favicon.svg.bak
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.dev/svgjs" width="1000" height="1000"><style>
|
||||
#light-icon {
|
||||
display: inline;
|
||||
}
|
||||
#dark-icon {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
#light-icon {
|
||||
display: none;
|
||||
}
|
||||
#dark-icon {
|
||||
display: inline;
|
||||
}
|
||||
}
|
||||
</style><g id="light-icon"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.dev/svgjs" width="1000" height="1000"><g clip-path="url(#SvgjsClipPath1059)"><rect width="1000" height="1000" fill="#000000"></rect><g transform="matrix(5,0,0,5,192.5,150)"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.dev/svgjs" width="123" height="140"><svg width="123" height="140" viewBox="0 0 123 140" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M60.2569 118.758L18.9035 94.9917C18.4016 94.6917 18.067 94.1583 18.067 93.5583V56.825C18.067 56.1917 18.7696 55.7917 19.3049 56.0917L67.3164 83.6917C67.9855 84.0917 68.822 83.5917 68.822 82.825V64.925C68.822 64.225 68.4539 63.5583 67.8182 63.1917L10.0707 29.9917C9.56883 29.6917 8.89968 29.6917 8.39782 29.9917L0.836436 34.3583C0.334574 34.6583 0 35.1917 0 35.7917V104.025C0 104.625 0.334574 105.158 0.836436 105.458L60.1565 139.592C60.6583 139.892 61.3275 139.892 61.8293 139.592L111.647 110.925C112.317 110.525 112.317 109.592 111.647 109.192L96.1232 100.258C95.4875 99.8917 94.7515 99.8917 94.1158 100.258L61.9632 118.758C61.4613 119.058 60.7922 119.058 60.2903 118.758H60.2569Z" fill="white"></path>
|
||||
<path d="M121.149 34.325L61.8294 0.225C61.3275 -0.075 60.6584 -0.075 60.1565 0.225L28.8069 18.2583C28.1378 18.6583 28.1378 19.5917 28.8069 19.9917L44.1973 28.8583C44.833 29.225 45.5691 29.225 46.2048 28.8583L60.2569 20.7917C60.7588 20.4917 61.4279 20.4917 61.9298 20.7917L103.283 44.5583C103.785 44.8583 104.12 45.3917 104.12 45.9917V82.8917C104.12 83.5917 104.488 84.2583 105.123 84.625L120.514 93.4583C121.183 93.8583 122.019 93.3583 122.019 92.5917V35.7917C122.019 35.1917 121.685 34.6583 121.183 34.3583L121.149 34.325Z" fill="white"></path>
|
||||
</svg></svg></g></g><defs><clipPath id="SvgjsClipPath1059"><rect width="1000" height="1000" x="0" y="0" rx="350" ry="350"></rect></clipPath></defs></svg></g><g id="dark-icon"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.dev/svgjs" width="1000" height="1000"><g clip-path="url(#SvgjsClipPath1060)"><rect width="1000" height="1000" fill="#000000"></rect><g transform="matrix(5,0,0,5,192.5,150)"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.dev/svgjs" width="123" height="140"><svg width="123" height="140" viewBox="0 0 123 140" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M60.2569 118.758L18.9035 94.9917C18.4016 94.6917 18.067 94.1583 18.067 93.5583V56.825C18.067 56.1917 18.7696 55.7917 19.3049 56.0917L67.3164 83.6917C67.9855 84.0917 68.822 83.5917 68.822 82.825V64.925C68.822 64.225 68.4539 63.5583 67.8182 63.1917L10.0707 29.9917C9.56883 29.6917 8.89968 29.6917 8.39782 29.9917L0.836436 34.3583C0.334574 34.6583 0 35.1917 0 35.7917V104.025C0 104.625 0.334574 105.158 0.836436 105.458L60.1565 139.592C60.6583 139.892 61.3275 139.892 61.8293 139.592L111.647 110.925C112.317 110.525 112.317 109.592 111.647 109.192L96.1232 100.258C95.4875 99.8917 94.7515 99.8917 94.1158 100.258L61.9632 118.758C61.4613 119.058 60.7922 119.058 60.2903 118.758H60.2569Z" fill="white"></path>
|
||||
<path d="M121.149 34.325L61.8294 0.225C61.3275 -0.075 60.6584 -0.075 60.1565 0.225L28.8069 18.2583C28.1378 18.6583 28.1378 19.5917 28.8069 19.9917L44.1973 28.8583C44.833 29.225 45.5691 29.225 46.2048 28.8583L60.2569 20.7917C60.7588 20.4917 61.4279 20.4917 61.9298 20.7917L103.283 44.5583C103.785 44.8583 104.12 45.3917 104.12 45.9917V82.8917C104.12 83.5917 104.488 84.2583 105.123 84.625L120.514 93.4583C121.183 93.8583 122.019 93.3583 122.019 92.5917V35.7917C122.019 35.1917 121.685 34.6583 121.183 34.3583L121.149 34.325Z" fill="white"></path>
|
||||
</svg></svg></g></g><defs><clipPath id="SvgjsClipPath1060"><rect width="1000" height="1000" x="0" y="0" rx="350" ry="350"></rect></clipPath></defs></svg></g></svg>
|
||||
|
After Width: | Height: | Size: 4.3 KiB |
11
public/robots.txt
Normal file
11
public/robots.txt
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
# *
|
||||
User-agent: *
|
||||
Disallow: /admin/*
|
||||
|
||||
# Host
|
||||
Host: https://example.com
|
||||
|
||||
# Sitemaps
|
||||
Sitemap: https://example.com/sitemap.xml
|
||||
Sitemap: https://example.com/pages-sitemap.xml
|
||||
Sitemap: https://example.com/posts-sitemap.xml
|
||||
5
public/sitemap.xml
Normal file
5
public/sitemap.xml
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||
<sitemap><loc>https://example.com/pages-sitemap.xml</loc></sitemap>
|
||||
<sitemap><loc>https://example.com/posts-sitemap.xml</loc></sitemap>
|
||||
</sitemapindex>
|
||||
|
|
@ -231,7 +231,7 @@ html[data-theme='light'] {
|
|||
@layer animations {
|
||||
@keyframes marquee {
|
||||
0% {
|
||||
transform: translateX(0%);
|
||||
transform: translateX(0);
|
||||
}
|
||||
100% {
|
||||
transform: translateX(-50%);
|
||||
|
|
@ -239,10 +239,11 @@ html[data-theme='light'] {
|
|||
}
|
||||
|
||||
.animate-marquee {
|
||||
animation: marquee 25s linear infinite;
|
||||
animation: marquee var(--marquee-duration, 25s) linear infinite;
|
||||
will-change: transform;
|
||||
}
|
||||
|
||||
.animate-marquee:hover {
|
||||
.marquee-scroll:hover .animate-marquee {
|
||||
animation-play-state: paused;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,34 +1,44 @@
|
|||
import type { Metadata } from 'next'
|
||||
import type { Metadata } from "next";
|
||||
|
||||
import { cn } from '@/utilities/ui'
|
||||
import { GeistMono } from 'geist/font/mono'
|
||||
import { GeistSans } from 'geist/font/sans'
|
||||
import React from 'react'
|
||||
import { cn } from "@/utilities/ui";
|
||||
import { GeistMono } from "geist/font/mono";
|
||||
import { GeistSans } from "geist/font/sans";
|
||||
import React from "react";
|
||||
|
||||
import { AdminBar } from '@/components/AdminBar'
|
||||
import { Footer } from '@/Footer/Component'
|
||||
import { Header } from '@/Header/Component'
|
||||
import { Providers } from '@/providers'
|
||||
import { InitTheme } from '@/providers/Theme/InitTheme'
|
||||
import { mergeOpenGraph } from '@/utilities/mergeOpenGraph'
|
||||
import { draftMode } from 'next/headers'
|
||||
import { AdminBar } from "@/components/AdminBar";
|
||||
import { Footer } from "@/Footer/Component";
|
||||
import { Header } from "@/Header/Component";
|
||||
import { Providers } from "@/providers";
|
||||
import { InitTheme } from "@/providers/Theme/InitTheme";
|
||||
import { mergeOpenGraph } from "@/utilities/mergeOpenGraph";
|
||||
import { draftMode } from "next/headers";
|
||||
|
||||
import './globals.css'
|
||||
import { getServerSideURL } from '@/utilities/getURL'
|
||||
import "./globals.css";
|
||||
import { getServerSideURL } from "@/utilities/getURL";
|
||||
|
||||
export default async function RootLayout({ children }: { children: React.ReactNode }) {
|
||||
const { isEnabled } = await draftMode()
|
||||
export default async function RootLayout({
|
||||
children,
|
||||
}: {
|
||||
children: React.ReactNode;
|
||||
}) {
|
||||
const { isEnabled } = await draftMode();
|
||||
|
||||
return (
|
||||
<html className={cn(GeistSans.variable, GeistMono.variable)} lang="en" suppressHydrationWarning>
|
||||
<html
|
||||
className={cn(GeistSans.variable, GeistMono.variable)}
|
||||
lang="en"
|
||||
suppressHydrationWarning
|
||||
>
|
||||
<head>
|
||||
<InitTheme/>
|
||||
<link href="/favicon.ico" rel="icon" sizes="32x32"/>
|
||||
<link href="/favicon.svg" rel="icon" type="image/svg+xml"/>
|
||||
<InitTheme />
|
||||
{/* <link href="/favicon.ico" rel="icon" sizes="32x32"/> */}
|
||||
<link href="/favicon.svg" rel="icon" type="image/svg+xml" />
|
||||
|
||||
<link rel="stylesheet"
|
||||
<link
|
||||
rel="stylesheet"
|
||||
type="text/css"
|
||||
href="https://cdn.jsdelivr.net/gh/devicons/devicon@latest/devicon.min.css"/>
|
||||
href="https://cdn.jsdelivr.net/gh/devicons/devicon@latest/devicon.min.css"
|
||||
/>
|
||||
</head>
|
||||
<body>
|
||||
<Providers>
|
||||
|
|
@ -44,14 +54,14 @@ export default async function RootLayout({ children }: { children: React.ReactNo
|
|||
</Providers>
|
||||
</body>
|
||||
</html>
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
export const metadata: Metadata = {
|
||||
metadataBase: new URL(getServerSideURL()),
|
||||
openGraph: mergeOpenGraph(),
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
creator: '@payloadcms',
|
||||
card: "summary_large_image",
|
||||
creator: "@payloadcms",
|
||||
},
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -58,6 +58,6 @@ export default async function Page() {
|
|||
|
||||
export function generateMetadata(): Metadata {
|
||||
return {
|
||||
title: `Payload Website Template Posts`,
|
||||
title: `ONYXSimple Posts`,
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ export default async function Page({ params: paramsPromise }: Args) {
|
|||
export async function generateMetadata({ params: paramsPromise }: Args): Promise<Metadata> {
|
||||
const { pageNumber } = await paramsPromise
|
||||
return {
|
||||
title: `Payload Website Template Posts Page ${pageNumber || ''}`,
|
||||
title: `ONYXSimple Posts Page ${pageNumber || ''}`,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -83,6 +83,6 @@ export default async function Page({ searchParams: searchParamsPromise }: Args)
|
|||
|
||||
export function generateMetadata(): Metadata {
|
||||
return {
|
||||
title: `Payload Website Template Search`,
|
||||
title: `ONYXSimple Search`,
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,10 +3,10 @@ import React from 'react'
|
|||
const BeforeLogin: React.FC = () => {
|
||||
return (
|
||||
<div>
|
||||
<p>
|
||||
{/* <p>
|
||||
<b>Welcome to your dashboard!</b>
|
||||
{' This is where site admins will log in to manage your website.'}
|
||||
</p>
|
||||
</p>*/}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ export const Logo = (props: Props) => {
|
|||
return (
|
||||
/* eslint-disable @next/next/no-img-element */
|
||||
<img
|
||||
alt="Payload Logo"
|
||||
alt="ONYXSimple Logo"
|
||||
width={193}
|
||||
height={34}
|
||||
loading={loading}
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ export const homeStatic: RequiredDataFromCollectionSlug<'pages'> = {
|
|||
format: 0,
|
||||
mode: 'normal',
|
||||
style: '',
|
||||
text: 'Payload Website Template',
|
||||
text: 'ONYXSimple',
|
||||
version: 1,
|
||||
},
|
||||
],
|
||||
|
|
@ -81,7 +81,7 @@ export const homeStatic: RequiredDataFromCollectionSlug<'pages'> = {
|
|||
},
|
||||
meta: {
|
||||
description: 'An open-source website built with Payload and Next.js.',
|
||||
title: 'Payload Website Template',
|
||||
title: 'ONYXSimple',
|
||||
},
|
||||
title: 'Home',
|
||||
layout: [],
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ export const home: (args: HomeArgs) => RequiredDataFromCollectionSlug<'pages'> =
|
|||
format: 0,
|
||||
mode: 'normal',
|
||||
style: '',
|
||||
text: 'Payload Website Template',
|
||||
text: 'ONYXSimple',
|
||||
version: 1,
|
||||
},
|
||||
],
|
||||
|
|
@ -668,7 +668,7 @@ export const home: (args: HomeArgs) => RequiredDataFromCollectionSlug<'pages'> =
|
|||
meta: {
|
||||
description: 'An open-source website built with Payload and Next.js.',
|
||||
image: heroImage.id,
|
||||
title: 'Payload Website Template',
|
||||
title: 'ONYXSimple',
|
||||
},
|
||||
title: 'Home',
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
"use client";
|
||||
import { useHeaderTheme } from "@/providers/HeaderTheme";
|
||||
import React, { useEffect } from "react";
|
||||
import React, { useEffect, useMemo, useRef, useState } from "react";
|
||||
|
||||
import type { Page } from "@/payload-types";
|
||||
|
||||
|
|
@ -10,18 +10,86 @@ import RichText from "@/components/RichText";
|
|||
|
||||
export const HighImpactHero: React.FC<Page["hero"]> = ({ links, media, richText, marquee }) => {
|
||||
const { setHeaderTheme } = useHeaderTheme();
|
||||
const marqueeScrollRef = useRef<HTMLDivElement | null>(null);
|
||||
const marqueeBaseRef = useRef<HTMLUListElement | null>(null);
|
||||
const marqueeSegmentRef = useRef<HTMLUListElement | null>(null);
|
||||
const [marqueeRepeatCount, setMarqueeRepeatCount] = useState(2);
|
||||
const [marqueeDuration, setMarqueeDuration] = useState(42);
|
||||
|
||||
const marqueeItems = useMemo(() => {
|
||||
if (!marquee || typeof marquee !== "object" || !Array.isArray(marquee.marqueeItems)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return marquee.marqueeItems;
|
||||
}, [marquee]);
|
||||
|
||||
const repeatedMarqueeItems = useMemo(() => {
|
||||
if (marqueeItems.length === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return Array.from({ length: marqueeRepeatCount }, () => marqueeItems).flat();
|
||||
}, [marqueeItems, marqueeRepeatCount]);
|
||||
|
||||
useEffect(() => {
|
||||
setHeaderTheme("dark");
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
if (marqueeItems.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
const updateMarqueeMetrics = () => {
|
||||
const scrollEl = marqueeScrollRef.current;
|
||||
const baseEl = marqueeBaseRef.current;
|
||||
const segmentEl = marqueeSegmentRef.current;
|
||||
|
||||
if (!scrollEl || !baseEl) {
|
||||
return;
|
||||
}
|
||||
|
||||
const viewportWidth = scrollEl.clientWidth;
|
||||
const baseWidth = baseEl.scrollWidth;
|
||||
|
||||
if (viewportWidth <= 0 || baseWidth <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
const nextRepeatCount = Math.max(2, Math.ceil((viewportWidth * 1.5) / baseWidth));
|
||||
|
||||
setMarqueeRepeatCount(prev => (prev !== nextRepeatCount ? nextRepeatCount : prev));
|
||||
};
|
||||
|
||||
updateMarqueeMetrics();
|
||||
|
||||
const resizeObserver = new ResizeObserver(updateMarqueeMetrics);
|
||||
|
||||
if (marqueeScrollRef.current) {
|
||||
resizeObserver.observe(marqueeScrollRef.current);
|
||||
}
|
||||
|
||||
if (marqueeBaseRef.current) {
|
||||
resizeObserver.observe(marqueeBaseRef.current);
|
||||
}
|
||||
|
||||
if (marqueeSegmentRef.current) {
|
||||
resizeObserver.observe(marqueeSegmentRef.current);
|
||||
}
|
||||
|
||||
return () => {
|
||||
resizeObserver.disconnect();
|
||||
};
|
||||
}, [marqueeItems, marqueeRepeatCount]);
|
||||
|
||||
return (
|
||||
<div
|
||||
className="relative -mt-[10.4rem] flex items-center justify-center text-white"
|
||||
className="relative mt-[-10.4rem] flex items-center justify-center text-white"
|
||||
data-theme="dark"
|
||||
>
|
||||
<div className="container mb-8 z-10 relative flex items-center justify-center">
|
||||
<div className="max-w-[36.5rem] md:text-center">
|
||||
<div className="max-w-146 md:text-center">
|
||||
{richText && <RichText className="mb-6" data={richText} enableGutter={false}/>}
|
||||
{Array.isArray(links) && links.length > 0 && (
|
||||
<ul className="flex md:justify-center gap-4">
|
||||
|
|
@ -41,19 +109,34 @@ export const HighImpactHero: React.FC<Page["hero"]> = ({ links, media, richText,
|
|||
<Media fill imgClassName="-z-10 object-cover" className="after:absolute after:inset-0 after:bg-radial after:from-black/70 after:to-black/50" priority resource={media}/>
|
||||
)}
|
||||
{
|
||||
marquee && typeof marquee === "object" && Array.isArray(marquee.marqueeItems) && marquee.marqueeItems.length > 0 && (
|
||||
<div className="overflow-hidden w-full absolute bottom-1/12 left-0 m-auto">
|
||||
<ul
|
||||
className="flex flex-row gap-10 justify-between align-middle whitespace-nowrap animate-marquee"
|
||||
>
|
||||
{marquee.marqueeItems.concat(marquee.marqueeItems).concat(marquee.marqueeItems).concat(marquee.marqueeItems).concat(marquee.marqueeItems).map((item, idx) => (
|
||||
marqueeItems.length > 0 && (
|
||||
<div className="marquee-scroll overflow-hidden w-full absolute bottom-1/12 left-0 right-0 m-auto" ref={marqueeScrollRef}>
|
||||
<ul className="absolute opacity-0 pointer-events-none whitespace-nowrap flex shrink-0 items-center" ref={marqueeBaseRef}>
|
||||
{marqueeItems.map((item, idx) => (
|
||||
<li className="inline-block" key={idx} title={item.itemLabel}>{
|
||||
item.itemClassName ? (
|
||||
<i className={item.itemClassName + ` text-4xl opacity-50 hover:opacity-100 transition-all text-white`} />) : item.itemMedia ? (
|
||||
<i className={item.itemClassName + ` inline-block text-4xl opacity-50 hover:opacity-100 transition-all text-white mr-10`}/>) : item.itemMedia ? (
|
||||
<Media resource={item.itemMedia}/>) : item.itemLabel
|
||||
}</li>
|
||||
))}
|
||||
</ul>
|
||||
<div className="animate-marquee flex w-max" style={{ "--marquee-duration": `${marqueeDuration}s` } as React.CSSProperties}>
|
||||
{[1, 2].map(i => (
|
||||
<ul
|
||||
className="flex shrink-0 items-center whitespace-nowrap"
|
||||
ref={i === 1 ? marqueeSegmentRef : undefined}
|
||||
key={i}
|
||||
>
|
||||
{repeatedMarqueeItems.map((item, idx) => (
|
||||
<li className="inline-block" key={`${i}-${idx}`} title={item.itemLabel}>{
|
||||
item.itemClassName ? (
|
||||
<i className={item.itemClassName + ` inline-block text-4xl opacity-50 hover:opacity-100 transition-all text-white mr-10`}/>) : item.itemMedia ? (
|
||||
<Media resource={item.itemMedia}/>) : item.itemLabel
|
||||
}</li>
|
||||
))}
|
||||
</ul>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ import { Page, Post } from '@/payload-types'
|
|||
import { getServerSideURL } from '@/utilities/getURL'
|
||||
|
||||
const generateTitle: GenerateTitle<Post | Page> = ({ doc }) => {
|
||||
return doc?.title ? `${doc.title} | Payload Website Template` : 'Payload Website Template'
|
||||
return doc?.title ? `${doc.title} | ONYXSimple` : 'ONYXSimple'
|
||||
}
|
||||
|
||||
const generateURL: GenerateURL<Post | Page> = ({ doc }) => {
|
||||
|
|
|
|||
|
|
@ -27,8 +27,8 @@ export const generateMeta = async (args: {
|
|||
const ogImage = getImageURL(doc?.meta?.image)
|
||||
|
||||
const title = doc?.meta?.title
|
||||
? doc?.meta?.title + ' | Payload Website Template'
|
||||
: 'Payload Website Template'
|
||||
? doc?.meta?.title + ' | ONYXSimple'
|
||||
: 'ONYXSimple'
|
||||
|
||||
return {
|
||||
description: doc?.meta?.description,
|
||||
|
|
|
|||
|
|
@ -9,8 +9,8 @@ const defaultOpenGraph: Metadata['openGraph'] = {
|
|||
url: `${getServerSideURL()}/website-template-OG.webp`,
|
||||
},
|
||||
],
|
||||
siteName: 'Payload Website Template',
|
||||
title: 'Payload Website Template',
|
||||
siteName: 'ONYXSimple',
|
||||
title: 'ONYXSimple',
|
||||
}
|
||||
|
||||
export const mergeOpenGraph = (og?: Metadata['openGraph']): Metadata['openGraph'] => {
|
||||
|
|
|
|||
|
|
@ -10,8 +10,8 @@ test.describe('Frontend', () => {
|
|||
|
||||
test('can load homepage', async ({ page }) => {
|
||||
await page.goto('http://localhost:3000')
|
||||
await expect(page).toHaveTitle(/Payload Website Template/)
|
||||
await expect(page).toHaveTitle(/ONYXSimple/)
|
||||
const heading = page.locator('h1').first()
|
||||
await expect(heading).toHaveText('Payload Website Template')
|
||||
await expect(heading).toHaveText('ONYXSimple')
|
||||
})
|
||||
})
|
||||
|
|
|
|||
Loading…
Reference in a new issue