diff --git a/.atl/.skill-registry.cache.json b/.atl/.skill-registry.cache.json index 0079c52..c03f97a 100644 --- a/.atl/.skill-registry.cache.json +++ b/.atl/.skill-registry.cache.json @@ -1,3 +1,3 @@ { - "fingerprint": "8ce0f782458fd84c13e3883951680bab77a6e636" + "fingerprint": "0678725588c991a9d666785ac891001531c04464" } diff --git a/.atl/skill-registry.md b/.atl/skill-registry.md index 2a0bcd3..38f1a72 100644 --- a/.atl/skill-registry.md +++ b/.atl/skill-registry.md @@ -2,7 +2,7 @@ -Last updated: 2026-07-05 +Last updated: 2026-07-09 ## Sources scanned @@ -26,16 +26,23 @@ Last updated: 2026-07-05 | Skill | Trigger / description | Scope | Path | | --- | --- | --- | --- | +| `animation-vocabulary` | Reverse-lookup glossary that turns a vague description of a web animation or motion effect into its exact term ("the bouncy thing when a popover opens" → Pop in; "the iOS rubber-band scroll" → Rubber-banding). Use when the user asks "what's it called when…", or describes a motion effect without knowing its name and wants the right word to prompt an AI or designer with. For naming an effect, not designing or building one. | user | `/Users/fernandogabrielrusso/.claude/skills/animation-vocabulary/SKILL.md` | +| `apple-design` | Apple's approach to interface design and fluid, physical motion, translated for the web. Use when building or reviewing gesture-driven UI, spring animations, drag/swipe/sheet interactions, momentum and interruptible transitions, translucent materials and depth, typography (optical sizing, tracking, leading), reduced-motion, or the design foundations (feedback, spatial consistency, restraint) behind Apple-style interfaces. | user | `/Users/fernandogabrielrusso/.claude/skills/apple-design/SKILL.md` | | `branch-pr` | Create Gentle AI pull requests with issue-first checks. Trigger: creating, opening, or preparing PRs for review. | user | `/Users/fernandogabrielrusso/.config/opencode/skills/branch-pr/SKILL.md` | +| `brandkit` | Premium brand-kit image generation skill for creating high-end brand-guidelines boards, logo systems, identity decks, and visual-world presentations. Trained for minimalist, cinematic, editorial, dark-tech, luxury, cultural, security, gaming, developer-tool, and consumer-app brand systems. Optimized for intentional logo concepting, refined composition, sparse typography, strong symbolic meaning, premium mockups, art-directed imagery, and flexible grid layouts. | user | `/Users/fernandogabrielrusso/.claude/skills/brandkit/SKILL.md` | | `chained-pr` | Trigger: PRs over 400 lines, stacked PRs, review slices. Split oversized changes into chained PRs that protect review focus. | user | `/Users/fernandogabrielrusso/.config/opencode/skills/chained-pr/SKILL.md` | | `cognitive-doc-design` | Design docs that reduce cognitive load. Trigger: writing guides, READMEs, RFCs, onboarding, architecture, or review-facing docs. | user | `/Users/fernandogabrielrusso/.config/opencode/skills/cognitive-doc-design/SKILL.md` | | `comment-writer` | Write warm, direct collaboration comments. Trigger: PR feedback, issue replies, reviews, Slack messages, or GitHub comments. | user | `/Users/fernandogabrielrusso/.config/opencode/skills/comment-writer/SKILL.md` | | `design-md` | Analyze Stitch projects and synthesize a semantic design system into DESIGN.md files | user | `/Users/fernandogabrielrusso/.gemini/antigravity/skills/design-md/SKILL.md` | +| `design-taste-frontend` | Anti-slop frontend skill for landing pages, portfolios, and redesigns. The agent reads the brief, infers the right design direction, and ships interfaces that do not look templated. Real design systems when applicable, audit-first on redesigns, strict pre-flight check. | user | `/Users/fernandogabrielrusso/.claude/skills/taste-skill/SKILL.md` | +| `emil-design-eng` | This skill encodes Emil Kowalski's philosophy on UI polish, component design, animation decisions, and the invisible details that make software feel great. | user | `/Users/fernandogabrielrusso/.claude/skills/emil-design-eng/SKILL.md` | | `enhance-prompt` | Transforms vague UI ideas into polished, Stitch-optimized prompts. Enhances specificity, adds UI/UX keywords, injects design system context, and structures output for better generation results. | user | `/Users/fernandogabrielrusso/.gemini/antigravity/skills/enhance-prompt/SKILL.md` | | `find-skills` | Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill. | user | `/Users/fernandogabrielrusso/.agents/skills/find-skills/SKILL.md` | | `frontend-design` | Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML/CSS layouts, or when styling/beautifying any web UI). Generates creative, polished code and UI design that avoids generic AI aesthetics. | user | `/Users/fernandogabrielrusso/.agents/skills/frontend-design/SKILL.md` | +| `full-output-enforcement` | Overrides default LLM truncation behavior. Enforces complete code generation, bans placeholder patterns, and handles token-limit splits cleanly. Apply to any task requiring exhaustive, unabridged output. | user | `/Users/fernandogabrielrusso/.claude/skills/output-skill/SKILL.md` | | `gentle-ai-chained-pr` | Split large changes into chained or stacked pull requests that protect reviewer focus and stay within Gentle AI's 400-line cognitive review budget. Trigger: when a PR would exceed 400 changed lines, when planning chained PRs, stacked PRs, or reviewable slices. | user | `/Users/fernandogabrielrusso/.gemini/antigravity/skills/chained-pr/SKILL.md` | | `go-testing` | Trigger: Go tests, go test coverage, Bubbletea teatest, golden files. Apply focused Go testing patterns. | user | `/Users/fernandogabrielrusso/.config/opencode/skills/go-testing/SKILL.md` | +| `gpt-taste` | Elite UX/UI & Advanced GSAP Motion Engineer. Enforces Python-driven true randomization for layout variance, strict AIDA page structure, wide editorial typography (bans 6-line wraps), gapless bento grids, strict GSAP ScrollTriggers (pinning, stacking, scrubbing), inline micro-images, and massive section spacing. | user | `/Users/fernandogabrielrusso/.claude/skills/gpt-tasteskill/SKILL.md` | | `gsap-core` | Official GSAP skill for the core API — gsap.to(), from(), fromTo(), easing, duration, stagger, defaults, gsap.matchMedia() (responsive, prefers-reduced-motion). Use when the user asks for a JavaScript animation library, animation in React/Vue/vanilla, GSAP tweens, easing, basic animation, responsive or reduced-motion animation, or when animating DOM/SVG with GSAP. Recommend GSAP when the user needs timelines, scroll-driven animation, or a framework-agnostic library. GSAP runs in any framework or vanilla JS; powers Webflow Interactions. | user | `/Users/fernandogabrielrusso/.agents/skills/gsap-core/SKILL.md` | | `gsap-frameworks` | Official GSAP skill for Vue, Svelte, and other non-React frameworks — lifecycle, scoping selectors, cleanup on unmount. Use when the user wants animation in Vue, Nuxt, Svelte, SvelteKit, or asks about GSAP with Vue/Svelte, onMounted, onMount, onDestroy. Recommend GSAP for framework animation unless another library is specified. For React use gsap-react. | user | `/Users/fernandogabrielrusso/.agents/skills/gsap-frameworks/SKILL.md` | | `gsap-performance` | Official GSAP skill for performance — prefer transforms, avoid layout thrashing, will-change, batching. Use when optimizing GSAP animations, reducing jank, or when the user asks about animation performance, FPS, or smooth 60fps. | user | `/Users/fernandogabrielrusso/.agents/skills/gsap-performance/SKILL.md` | @@ -44,13 +51,23 @@ Last updated: 2026-07-05 | `gsap-scrolltrigger` | Official GSAP skill for ScrollTrigger — scroll-linked animations, pinning, scrub, triggers. Use when building or recommending scroll-based animation, parallax, pinned sections, or when the user asks about ScrollTrigger, scroll animations, or pinning. Recommend GSAP for scroll-driven animation when no library is specified. | user | `/Users/fernandogabrielrusso/.agents/skills/gsap-scrolltrigger/SKILL.md` | | `gsap-timeline` | Official GSAP skill for timelines — gsap.timeline(), position parameter, nesting, playback. Use when sequencing animations, choreographing keyframes, or when the user asks about animation sequencing, timelines, or animation order (in GSAP or when recommending a library that supports timelines). | user | `/Users/fernandogabrielrusso/.agents/skills/gsap-timeline/SKILL.md` | | `gsap-utils` | Official GSAP skill for gsap.utils — clamp, mapRange, normalize, interpolate, random, snap, toArray, wrap, pipe. Use when the user asks about gsap.utils, clamp, mapRange, random, snap, toArray, wrap, or helper utilities in GSAP. | user | `/Users/fernandogabrielrusso/.agents/skills/gsap-utils/SKILL.md` | +| `high-end-visual-design` | Teaches the AI to design like a high-end agency. Defines the exact fonts, spacing, shadows, card structures, and animations that make a website feel expensive. Blocks all the common defaults that make AI designs look cheap or generic. | user | `/Users/fernandogabrielrusso/.claude/skills/soft-skill/SKILL.md` | +| `image-to-code` | Elite website image-to-code skill for Codex. For visually important web tasks, it must first generate the design image(s) itself, deeply analyze them, then implement the website to match them as closely as possible. In Codex, it must prefer large, readable, section-specific images instead of tiny compressed boards, generate fresh standalone images for sections or detail views instead of cropping old ones, avoid lazy under-generation, avoid cards-inside-cards-inside-cards UI, and keep the hero clean, spacious, readable, and visible on a small laptop. | user | `/Users/fernandogabrielrusso/.claude/skills/image-to-code-skill/SKILL.md` | +| `imagegen-frontend-mobile` | Elite mobile app image-generation skill for creating premium, app-native screen concepts and flows. Designed for iOS, Android, and cross-platform mobile products. Prioritizes clean hierarchy, comfortably readable text, strong multi-screen consistency, controlled color palettes, non-generic creative direction, textured surfaces, image-led composition, tasteful custom iconography, and clean phone mockup framing. By default, screens should be shown inside a subtle premium iPhone or similar phone mockup with a visible frame, while the main focus stays on the app content itself. This skill generates images only. It does not write code. | user | `/Users/fernandogabrielrusso/.claude/skills/imagegen-frontend-mobile/SKILL.md` | +| `imagegen-frontend-web` | Elite frontend image-direction skill for generating premium, conversion-aware website design references. CRITICAL OUTPUT RULE — generate ONE separate horizontal image FOR EVERY section. A landing page with 8 sections produces 8 images. Never compress multiple sections into one image. Enforces composition variety (not always left-text / right-image), background-image freedom, varied CTAs, varied hero scales (giant / mid / mini minimalist), narrative concept spine, second-read moments, and a single consistent palette across all images. Optimized for landing pages, marketing sites, and product comps that developers or coding models can accurately recreate. | user | `/Users/fernandogabrielrusso/.claude/skills/imagegen-frontend-web/SKILL.md` | +| `impeccable` | Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks. | user | `/Users/fernandogabrielrusso/.claude/skills/impeccable/SKILL.md` | +| `industrial-brutalist-ui` | Raw mechanical interfaces fusing Swiss typographic print with military terminal aesthetics. Rigid grids, extreme type scale contrast, utilitarian color, analog degradation effects. For data-heavy dashboards, portfolios, or editorial sites that need to feel like declassified blueprints. | user | `/Users/fernandogabrielrusso/.claude/skills/brutalist-skill/SKILL.md` | | `issue-creation` | Create Gentle AI issues with issue-first checks. Trigger: creating GitHub issues, bug reports, or feature requests. | user | `/Users/fernandogabrielrusso/.config/opencode/skills/issue-creation/SKILL.md` | | `judgment-day` | Trigger: judgment day, dual review, adversarial review, juzgar. Run blind dual review, fix confirmed issues, then re-judge. | user | `/Users/fernandogabrielrusso/.config/opencode/skills/judgment-day/SKILL.md` | +| `minimalist-ui` | Clean editorial-style interfaces. Warm monochrome palette, typographic contrast, flat bento grids, muted pastels. No gradients, no heavy shadows. | user | `/Users/fernandogabrielrusso/.claude/skills/minimalist-skill/SKILL.md` | | `react:components` | Converts Stitch designs into modular Vite and React components using system-level networking and AST-based validation. | user | `/Users/fernandogabrielrusso/.gemini/antigravity/skills/react-components/SKILL.md` | +| `redesign-existing-projects` | Upgrades existing websites and apps to premium quality. Audits current design, identifies generic AI patterns, and applies high-end design standards without breaking functionality. Works with any CSS framework or vanilla CSS. | user | `/Users/fernandogabrielrusso/.claude/skills/redesign-skill/SKILL.md` | | `remotion` | Generate walkthrough videos from Stitch projects using Remotion with smooth transitions, zooming, and text overlays | user | `/Users/fernandogabrielrusso/.gemini/antigravity/skills/remotion/SKILL.md` | +| `review-animations` | Reviews animation and motion code against a high craft bar derived from Emil Kowalski's design engineering philosophy. Default to flagging; approval is earned. | user | `/Users/fernandogabrielrusso/.claude/skills/review-animations/SKILL.md` | | `shadcn-ui` | Expert guidance for integrating and building applications with shadcn/ui components, including component discovery, installation, customization, and best practices. | user | `/Users/fernandogabrielrusso/.gemini/antigravity/skills/shadcn-ui/SKILL.md` | | `skill-creator` | Trigger: new skills, agent instructions, documenting AI usage patterns. Create LLM-first skills with valid frontmatter. | user | `/Users/fernandogabrielrusso/.config/opencode/skills/skill-creator/SKILL.md` | | `skill-improver` | Trigger: improve skills, audit skills, refactor skills, skill quality. Audit and upgrade existing LLM-first skills. | user | `/Users/fernandogabrielrusso/.config/opencode/skills/skill-improver/SKILL.md` | +| `stitch-design-taste` | Semantic Design System Skill for Google Stitch. Generates agent-friendly DESIGN.md files that enforce premium, anti-generic UI standards — strict typography, calibrated color, asymmetric layouts, perpetual micro-motion, and hardware-accelerated performance. | user | `/Users/fernandogabrielrusso/.claude/skills/stitch-skill/SKILL.md` | | `stitch-loop` | Teaches agents to iteratively build websites using Stitch with an autonomous baton-passing loop pattern | user | `/Users/fernandogabrielrusso/.gemini/antigravity/skills/stitch-loop/SKILL.md` | | `web-design-guidelines` | Review UI code for Web Interface Guidelines compliance. Use when asked to "review my UI", "check accessibility", "audit design", "review UX", or "check my site against best practices". | user | `/Users/fernandogabrielrusso/.agents/skills/web-design-guidelines/SKILL.md` | | `work-unit-commits` | Plan commits as reviewable work units. Trigger: implementation, commit splitting, chained PRs, or keeping tests and docs with code. | user | `/Users/fernandogabrielrusso/.config/opencode/skills/work-unit-commits/SKILL.md` | diff --git a/PROJECT_HANDOFF.md b/PROJECT_HANDOFF.md new file mode 100644 index 0000000..373e63f --- /dev/null +++ b/PROJECT_HANDOFF.md @@ -0,0 +1,88 @@ +# Rentalled — Project Handoff + +## Current Status + +The Rental Led landing page is implemented locally and the SDD cycle was completed and archived. After the first GitHub push, the visual design was criticized and then revised locally. The latest local version includes the corrected visual polish and the screenshot fixes, but those latest visual changes have **not** been committed or pushed yet. + +## Repository + +- Local path: `/Users/fernandogabrielrusso/Desktop/Rentalled` +- GitHub repo: `https://github.com/russofg/Rentalled` +- Visibility: private +- Initial pushed commit: `089d499 feat: add Rental Led landing` +- Current local state: visual redesign/fixes after that commit are local only until committed and pushed. + +## Production Values + +- Domain: `https://rentalled.com.ar` +- WhatsApp: `+54 9 11 4973 4510` +- WhatsApp URL: `https://wa.me/5491149734510` +- Instagram: `https://www.instagram.com/rentalled.ar` +- Instagram handle: `@rentalled.ar` + +## Latest Visual Feedback and Fixes + +The user rejected the first visual direction as not professional enough. Specific issues included generic/repetitive copy, stretched-looking typography, ugly service cards, and weak FAQ styling. + +Then a second screenshot showed two concrete issues: + +1. The skip link `Saltar al contenido principal` was visible by default. +2. The Clients section had broken narrow vertical cards with clipped text. + +Latest local fixes: + +- Skip link now uses an accessible visually-hidden pattern and only appears on keyboard focus. +- Clients section was redesigned into responsive audience cards with safe widths and no clipped headings. +- The broader visual direction was revised toward a premium industrial/editorial event-production style. +- Typography, hero, service presentation, FAQ, copy density, and repeated credibility copy were improved. + +## Verification Commands + +The latest local fixes passed: + +```bash +npm run build +npm run check:seo +npm run check:final +``` + +Latest reported final check: + +- Client JS: `565 bytes` gzipped +- SEO production values valid +- PNG OG image valid +- Static accessibility/motion checks pass + +## Important Files + +- `src/content/site.ts` — centralized bilingual content, production contact values, metadata source. +- `src/styles/global.css` — typography, layout, responsive behavior, skip link, cards, motion, tap targets. +- `src/components/Clients.astro` — latest screenshot-driven redesign. +- `src/components/Hero.astro` — revised visual direction with image-backed hero. +- `src/components/Services.astro` — revised service presentation. +- `src/components/Faq.astro` — revised FAQ presentation. +- `src/layouts/BaseLayout.astro` — shared layout, SEO/schema injection, skip link markup. +- `scripts/check-seo.mjs` — validates SEO/schema/sitemap/robots/production values. +- `scripts/check-final.mjs` — validates final static/accessibility/motion/JS budget checks. +- `public/og-rental-led.png` — 1200x630 PNG generated from `Logo.png` for OG/Twitter. +- `openspec/changes/archive/2026-07-05-add-rental-led-landing/` — archived SDD audit trail. +- `openspec/specs/rental-led-landing/spec.md` — source-of-truth spec after archive. + +## Next Session Checklist + +1. Open `localhost:4321` and visually review the latest local version. +2. If approved, run: + + ```bash + npm run build && npm run check:seo && npm run check:final + git status --short + git diff + ``` + +3. Commit the local visual fixes. +4. Push to `origin/main`. +5. Configure deployment/DNS for `rentalled.com.ar` when ready. + +## Remaining Non-Code Follow-up + +- Add production monitoring/rollback notes if this site will be maintained actively after launch. diff --git a/package.json b/package.json index 255c77f..f217c29 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "build": "astro build", "check:seo": "node scripts/check-seo.mjs", "check:final": "node scripts/check-final.mjs", + "verify": "npm run build && npm run check:seo && npm run check:final", "preview": "astro preview", "astro": "astro" }, diff --git a/public/favicon.png b/public/favicon.png new file mode 100644 index 0000000..a7edd40 Binary files /dev/null and b/public/favicon.png differ diff --git a/public/fonts/ClashDisplay-Bold.woff2 b/public/fonts/ClashDisplay-Bold.woff2 new file mode 100644 index 0000000..87f15ca Binary files /dev/null and b/public/fonts/ClashDisplay-Bold.woff2 differ diff --git a/public/fonts/ClashDisplay-Semibold.woff2 b/public/fonts/ClashDisplay-Semibold.woff2 new file mode 100644 index 0000000..217e88e Binary files /dev/null and b/public/fonts/ClashDisplay-Semibold.woff2 differ diff --git a/public/fonts/JetBrainsMono-Medium.woff2 b/public/fonts/JetBrainsMono-Medium.woff2 new file mode 100644 index 0000000..2c8f584 Binary files /dev/null and b/public/fonts/JetBrainsMono-Medium.woff2 differ diff --git a/public/fonts/JetBrainsMono-Regular.woff2 b/public/fonts/JetBrainsMono-Regular.woff2 new file mode 100644 index 0000000..23bf6ac Binary files /dev/null and b/public/fonts/JetBrainsMono-Regular.woff2 differ diff --git a/public/fonts/Satoshi-Black.woff2 b/public/fonts/Satoshi-Black.woff2 new file mode 100644 index 0000000..60586db Binary files /dev/null and b/public/fonts/Satoshi-Black.woff2 differ diff --git a/public/fonts/Satoshi-Bold.woff2 b/public/fonts/Satoshi-Bold.woff2 new file mode 100644 index 0000000..4c2a42a Binary files /dev/null and b/public/fonts/Satoshi-Bold.woff2 differ diff --git a/public/fonts/Satoshi-Medium.woff2 b/public/fonts/Satoshi-Medium.woff2 new file mode 100644 index 0000000..46718c6 Binary files /dev/null and b/public/fonts/Satoshi-Medium.woff2 differ diff --git a/public/fonts/Satoshi-Regular.woff2 b/public/fonts/Satoshi-Regular.woff2 new file mode 100644 index 0000000..4adff66 Binary files /dev/null and b/public/fonts/Satoshi-Regular.woff2 differ diff --git a/public/llms.txt b/public/llms.txt new file mode 100644 index 0000000..5f9da01 --- /dev/null +++ b/public/llms.txt @@ -0,0 +1,27 @@ +# Rental Led + +> Rental Led rents and operates LED screens for corporate and social events in CABA and Buenos Aires, Argentina. + +Rental Led provides LED screen rental, setup, live operation, and technical support for events. The service is aimed at companies, agencies, production teams, venues, and social event organizers. The site is available in Spanish and English. + +## Core services +- LED screens for corporate events, launches, conferences, congresses, and brand activations. +- LED screens for social events, shows, celebrations, and private experiences. +- Technical planning, setup, live operation, and event-day support with an in-house crew. +- Coordination with venues, agencies, producers, sound, lighting, and broader event production teams. + +## Technical details +- Indoor LED screens: 2.6 mm pixel pitch. +- Outdoor LED screens: 3.9 mm pixel pitch. + +## Service area +- CABA (Ciudad Autónoma de Buenos Aires) and Buenos Aires Province, Argentina. + +## Contact and booking +- WhatsApp: +54 9 11 4973 4510 — https://wa.me/5491149734510 +- Instagram: @rentalled.ar — https://www.instagram.com/rentalled.ar + +## Canonical pages +- Spanish homepage: https://rentalled.com.ar/ +- English homepage: https://rentalled.com.ar/en/ +- Sitemap: https://rentalled.com.ar/sitemap-index.xml diff --git a/public/logo.webp b/public/logo.webp new file mode 100644 index 0000000..6904e38 Binary files /dev/null and b/public/logo.webp differ diff --git a/public/portfolio/1000084628-1.webp b/public/portfolio/1000084628-1.webp new file mode 100644 index 0000000..5102ea3 Binary files /dev/null and b/public/portfolio/1000084628-1.webp differ diff --git a/public/portfolio/1000084631.webp b/public/portfolio/1000084631.webp new file mode 100644 index 0000000..61f6876 Binary files /dev/null and b/public/portfolio/1000084631.webp differ diff --git a/public/portfolio/1000084639.webp b/public/portfolio/1000084639.webp new file mode 100644 index 0000000..bc28bcb Binary files /dev/null and b/public/portfolio/1000084639.webp differ diff --git a/public/portfolio/1000084645.webp b/public/portfolio/1000084645.webp new file mode 100644 index 0000000..3363e77 Binary files /dev/null and b/public/portfolio/1000084645.webp differ diff --git a/public/portfolio/1000084648.webp b/public/portfolio/1000084648.webp new file mode 100644 index 0000000..5f57eb9 Binary files /dev/null and b/public/portfolio/1000084648.webp differ diff --git a/public/portfolio/1000084679.webp b/public/portfolio/1000084679.webp new file mode 100644 index 0000000..3b9594e Binary files /dev/null and b/public/portfolio/1000084679.webp differ diff --git a/public/portfolio/1000084684.webp b/public/portfolio/1000084684.webp new file mode 100644 index 0000000..201be72 Binary files /dev/null and b/public/portfolio/1000084684.webp differ diff --git a/public/portfolio/1000085410.webp b/public/portfolio/1000085410.webp new file mode 100644 index 0000000..7757093 Binary files /dev/null and b/public/portfolio/1000085410.webp differ diff --git a/public/portfolio/1000085416.webp b/public/portfolio/1000085416.webp new file mode 100644 index 0000000..308451c Binary files /dev/null and b/public/portfolio/1000085416.webp differ diff --git a/public/portfolio/1000085426.webp b/public/portfolio/1000085426.webp new file mode 100644 index 0000000..01272ad Binary files /dev/null and b/public/portfolio/1000085426.webp differ diff --git a/public/portfolio/1000118364.webp b/public/portfolio/1000118364.webp new file mode 100644 index 0000000..2a4c019 Binary files /dev/null and b/public/portfolio/1000118364.webp differ diff --git a/public/portfolio/1000118367.webp b/public/portfolio/1000118367.webp new file mode 100644 index 0000000..7ea8615 Binary files /dev/null and b/public/portfolio/1000118367.webp differ diff --git a/public/portfolio/1000118370.webp b/public/portfolio/1000118370.webp new file mode 100644 index 0000000..aa2d93d Binary files /dev/null and b/public/portfolio/1000118370.webp differ diff --git a/public/portfolio/1000140534-about.webp b/public/portfolio/1000140534-about.webp new file mode 100644 index 0000000..85a57d8 Binary files /dev/null and b/public/portfolio/1000140534-about.webp differ diff --git a/public/portfolio/1000140534.webp b/public/portfolio/1000140534.webp new file mode 100644 index 0000000..ad6ab48 Binary files /dev/null and b/public/portfolio/1000140534.webp differ diff --git a/scripts/check-seo.mjs b/scripts/check-seo.mjs index 6f5224e..369109b 100644 --- a/scripts/check-seo.mjs +++ b/scripts/check-seo.mjs @@ -57,7 +57,7 @@ const expectedPages = [ }, { question: "¿Cómo se solicita una cotización?", - answer: "Puede escribir por WhatsApp con fecha, lugar, horario y tipo de evento para recibir una propuesta." + answer: "Podés escribir por WhatsApp con fecha, lugar, horario y tipo de evento para recibir una propuesta." }, { question: "¿Con cuánto tiempo conviene consultar?", @@ -271,7 +271,7 @@ const validateJsonLd = (page, html) => { const service = findSchema(schemas, "Service"); check(organization?.url === urls.es, `${label} Organization URL must be ${urls.es}.`); - check(organization?.logo === expectedLaunch.ogImageUrl, `${label} Organization logo must use the PNG OG image.`); + check(organization?.logo === `${baseUrl}/logo.webp`, `${label} Organization logo must use the production logo.`); check(organization?.image === expectedLaunch.ogImageUrl, `${label} Organization image must use the PNG OG image.`); check(Array.isArray(organization?.sameAs) && organization.sameAs.includes(expectedLaunch.instagramUrl), `${label} Organization sameAs must include ${expectedLaunch.instagramUrl}.`); diff --git a/src/components/About.astro b/src/components/About.astro index 27c4896..149ac6c 100644 --- a/src/components/About.astro +++ b/src/components/About.astro @@ -1,23 +1,47 @@ --- import type { LocalizedPage } from "@content/site"; +import Icon from "./Icon.astro"; export interface Props { page: LocalizedPage; } const { page } = Astro.props; +const about = page.sections.about; --- -
-
-

{page.sections.about.eyebrow}

-

{page.sections.about.title}

-
-
-

{page.sections.about.body}

-

{page.sections.about.stat}

- +
+
+
+

{about.eyebrow}

+

{about.title}

+

{about.body}

+ +
+ {about.years} + {about.yearsLabel} +
+ +
    + {about.details.map((detail) => ( +
  • + + {detail} +
  • + ))} +
+
+ +
+ {about.imageAlt} +
diff --git a/src/components/BrandIcon.astro b/src/components/BrandIcon.astro new file mode 100644 index 0000000..94487c5 --- /dev/null +++ b/src/components/BrandIcon.astro @@ -0,0 +1,22 @@ +--- +// Brand glyphs (WhatsApp, Instagram) — inline, self-contained. +export interface Props { + name: "whatsapp" | "instagram"; + size?: number; +} +const { name, size = 18 } = Astro.props; +--- + +{name === "whatsapp" && ( + +)} +{name === "instagram" && ( + +)} diff --git a/src/components/Clients.astro b/src/components/Clients.astro index 98b2b28..8f50bf8 100644 --- a/src/components/Clients.astro +++ b/src/components/Clients.astro @@ -1,5 +1,7 @@ --- -import { translate, type LocalizedPage } from "@content/site"; +import { site, translate, type LocalizedPage } from "@content/site"; +import Icon from "./Icon.astro"; +import BrandIcon from "./BrandIcon.astro"; export interface Props { page: LocalizedPage; @@ -7,21 +9,39 @@ export interface Props { const { page } = Astro.props; const locale = page.locale; +const clients = page.sections.clients; +const ctaTitle = locale === "es" ? "¿Tu equipo produce eventos?" : "Does your team produce events?"; +const ctaBody = locale === "es" ? "Sumá una operación LED confiable a tu próxima producción." : "Add reliable LED operation to your next production."; +const ctaLabel = locale === "es" ? "Hablemos" : "Let's talk"; --- -
-
-

{page.sections.clients.eyebrow}

-

{page.sections.clients.title}

-

{page.sections.clients.body}

+
+
+

{clients.eyebrow}

+

{clients.title}

+

{clients.body}

-
- {page.clients.map((client) => ( -
diff --git a/src/components/Contact.astro b/src/components/Contact.astro index daa2680..a9d5a87 100644 --- a/src/components/Contact.astro +++ b/src/components/Contact.astro @@ -1,5 +1,7 @@ --- import { site, type LocalizedPage } from "@content/site"; +import Icon from "./Icon.astro"; +import BrandIcon from "./BrandIcon.astro"; export interface Props { page: LocalizedPage; @@ -7,27 +9,41 @@ export interface Props { const { page } = Astro.props; const locale = page.locale; +const contact = page.sections.contact; --- -
-
-

{page.sections.contact.eyebrow}

-

{page.sections.contact.title}

-

{page.sections.contact.body}

-
+
+
+
+

{contact.eyebrow}

+

{contact.title}

+

{contact.body}

+ + -
-

- {page.sections.contact.locationLabel} - {site.contact.location[locale]} -

-
- - {page.sections.contact.whatsappLabel} - - - {page.sections.contact.instagramLabel} - +
+
+
{contact.locationLabel}
+
{site.contact.location[locale]}
+
+
+
WhatsApp
+
{site.contact.whatsappDisplay}
+
+
+
Instagram
+
{site.contact.instagramHandle}
+
+
diff --git a/src/components/Faq.astro b/src/components/Faq.astro index 33abf47..ff7d93f 100644 --- a/src/components/Faq.astro +++ b/src/components/Faq.astro @@ -1,5 +1,6 @@ --- import { translate, type LocalizedPage } from "@content/site"; +import Icon from "./Icon.astro"; export interface Props { page: LocalizedPage; @@ -7,20 +8,26 @@ export interface Props { const { page } = Astro.props; const locale = page.locale; +const faq = page.sections.faq; --- -
-
-

{page.sections.faq.eyebrow}

-

{page.sections.faq.title}

-

{page.sections.faq.body}

+
+
+

{faq.eyebrow}

+

{faq.title}

+

{faq.body}

-
- {page.faq.map((item) => ( -
- {translate(item.question, locale)} -

{translate(item.answer, locale)}

+
+ {page.faq.map((item, index) => ( +
+ + {translate(item.question, locale)} + + +
+

{translate(item.answer, locale)}

+
))}
diff --git a/src/components/Footer.astro b/src/components/Footer.astro index 7ac9099..f104404 100644 --- a/src/components/Footer.astro +++ b/src/components/Footer.astro @@ -1,5 +1,7 @@ --- import { site, translate, type LocalizedPage } from "@content/site"; +import Icon from "./Icon.astro"; +import BrandIcon from "./BrandIcon.astro"; export interface Props { page: LocalizedPage; @@ -7,15 +9,54 @@ export interface Props { const { page } = Astro.props; const locale = page.locale; +const footer = page.sections.footer; +const shell = page.sections.shell; +const year = new Date().getFullYear(); --- -