The portfolio uses a dark theme throughout, with no light mode variant. Styles are applied through three complementary systems:Documentation Index
Fetch the complete documentation index at: https://mintlify.com/JuanRojasDev/juan-rojas-portafolio-web/llms.txt
Use this file to discover all available pages before exploring further.
styled-components’ ThemeProvider for design tokens, styled-components for layout and custom elements, and Framer Motion for scroll and entrance animations. Translations for English and Spanish are managed separately by react-i18next.
Dark theme tokens — src/utils/Themes.js
The file src/utils/Themes.js exports darkTheme and lightTheme objects. darkTheme is passed to styled-components’ ThemeProvider at the top of App.js:
darkTheme defines design tokens such as background colors, primary and secondary palette colors, and text colors. Every styled-components styled element in the tree can access these via the theme prop (e.g., ${({ theme }) => theme.primary}). The primary brand color is #FF7F00 (orange). To adjust the global color palette — for example, to change the accent color or card backgrounds — edit the token values in Themes.js.
Key token groups in darkTheme:
| Token group | Examples |
|---|---|
| Backgrounds | bg, bgLight, bgGlass, bgCard |
| Brand colors | primary (#FF7F00), primaryLight, primaryDark, primaryGlow |
| Secondary | secondary (#854CE6), secondaryLight |
| Gradients | gradientHero, gradientCard, gradientText |
| Text | text_primary, text_secondary, text_tertiary, text_accent |
| Borders & shadows | border, borderHover, shadowCard, shadowOrange |
| Cards | card, card_light |
Styled-components
Layout components and section containers are built withstyled-components. These appear throughout the section files in src/components/sections/ and in App.js itself.
A notable example is the Wrapper component rendered in App.js, which groups sections and applies a gradient background between them:
Wrapper is a styled div that creates the visual separation between page sections. To adjust section background gradients or spacing, locate and edit the Wrapper definition in App.js or the file where it is imported from.
Individual section files define their own styled containers (e.g., SkillsContainer, ProjectsWrapper) directly in the same file, keeping styles co-located with the component that uses them.
Framer Motion animations
Entrance and scroll animations are handled by Framer Motion. TheAnimatePresence wrapper in App.js enables exit animations for mounted/unmounted components:
motion components with variants and whileInView to trigger animations as the user scrolls. To change the timing, easing, or type of animation for a section, edit the variants object defined at the top of the relevant section file.
Three.js star background
TheStarCanvas component (src/components/canvas/Stars.jsx) renders an animated star field using @react-three/fiber and @react-three/drei. It is positioned as a fixed background element behind all content. To adjust the star density, size, or rotation speed, edit the geometry and animation parameters inside Stars.jsx.
Internationalization (i18n)
The site supports English and Spanish. Translations are stored insrc/data/translations.js and loaded by react-i18next. The language configuration and i18next initialization live in src/context/ (or adjacent to the translation file).
To add or update translated strings:
- Open
src/data/translations.js. - Locate the key you want to change under the
en(English) ores(Spanish) namespace. - Update the string value. If you are adding a new UI string, add the same key to both language objects.
useLanguage context hook, which exposes a translate() helper: