diff --git a/.agents/DESIGN.md b/.agents/DESIGN.md new file mode 100644 index 00000000..be8a5e71 --- /dev/null +++ b/.agents/DESIGN.md @@ -0,0 +1,95 @@ +# Design System Document: The Editorial Node + +## 1. Overview & Creative North Star + +This design system moves away from the "standard bootstrap" look of tech communities toward a high-end editorial experience. + +**Creative North Star: "The Editorial Node"** +Our vision is to treat community information as curated content rather than a database. We bridge the gap between technical precision and human-centric connection. The aesthetic utilizes intentional asymmetry, generous whitespace (derived from our `Spacing Scale`), and a sophisticated layering of surfaces to create a sense of digital "physicality." We don't just list events; we showcase a movement. + +## 2. Colors & Surface Architecture + +The palette is rooted in the high-energy `#e84a5f`, supported by a nuanced spectrum of architectural neutrals. + +### The "No-Line" Rule + +**Explicit Instruction:** You are prohibited from using 1px solid borders for sectioning or containment. +Boundaries must be defined solely through: + +- **Background Color Shifts:** A `surface-container-low` section sitting on a `surface` background. +- **Tonal Transitions:** Using the `surface-container` tiers (Lowest to Highest) to define nesting. + +### Surface Hierarchy & Nesting + +Treat the UI as a series of stacked sheets of fine material. + +- **The Base:** Use `surface` (#f1fbff) for the primary background. +- **The Section:** Use `surface-container-low` (#eaf5fa) for large content areas. +- **The Detail:** Use `surface-container-highest` (#e84a5f) for interactive elements like input fields or active state cards. + +### The "Glass & Gradient" Rule + +To elevate the experience, floating elements (Modals, Navigation Bars, Hovering Tooltips) should utilize **Glassmorphism**. + +- **Backdrop Blur:** 12px to 20px. +- **Fill:** A semi-transparent version of `surface` (e.g., 80% opacity). +- **Signature Gradient:** For high-impact CTAs, use a subtle linear gradient from `primary` (#b11f3b) to `primary_container` (#d33b51) at a 135-degree angle. This adds "soul" to the technical interface. + +## 3. Typography + +The typography system balances the technical nature of developers with the premium feel of a lifestyle brand. + +- **Display & Headlines (Space Grotesk):** This typeface offers a "technical-humanist" feel. Its geometric traps and expressive terminals convey innovation. Use `display-lg` for hero statements with tight letter-spacing (-0.02em). +- **Body & Titles (Inter):** Chosen for its exceptional legibility and neutral tone. It provides the "clean" developer-friendly feel requested. +- **Technical Details:** Where code snippets or technical metadata (e.g., repo sizes, timestamps) appear, use a monospace font-family at `label-sm` scale to provide a subtle "hacker" nod. + +## 4. Elevation & Depth + +Depth is achieved through **Tonal Layering** rather than structural shadows. + +- **The Layering Principle:** Place a `surface-container-lowest` card on a `surface-container-low` section. This creates a soft, natural lift that feels like high-quality paper. +- **Ambient Shadows:** If a floating effect is required (e.g., a "Join Us" button or a featured Event Card), use an extra-diffused shadow: +- _Blur:_ 32px +- _Spread:_ -4px +- _Opacity:_ 6% of the `on_surface` color. +- **The "Ghost Border" Fallback:** If accessibility demands a container edge, use a Ghost Border: `outline_variant` at **15% opacity**. Never 100%. + +## 5. Components + +### Buttons + +- **Primary:** High-polish gradient (`primary` to `primary_container`). Large padding (Scale 3 on sides, 2 on top/bottom). `Roundedness: md`. +- **Secondary:** No fill. `Ghost Border` (15% opacity `outline`). `on_surface` text. +- **Tertiary:** No fill, no border. Underline only on hover. + +### Community Group Cards + +Forbid the use of divider lines. + +- **Style:** A `surface-container-low` base that shifts to `surface-container-highest` on hover. +- **Layout:** Use asymmetrical spacing—more padding at the top (Scale 6) than the bottom (Scale 4) to create an editorial "header" feel within the card. + +### Filtered Video Library & Chips + +- **Chips:** Use `secondary_container` with `on_secondary_container` text. When selected, use `primary` with `on_primary`. +- **Video Cards:** Use a 16:9 aspect ratio for thumbnails. Overlay a glassmorphic "Play" button in the center. Metadata should use `body-sm` for the description and a monospace `label-sm` for the video duration. + +### Input Fields & Search + +- **Style:** Minimalist. No border. Use `surface-container-highest` as the fill. +- **State:** On focus, the background remains, but a 2px `primary` underline animates from the center. + +## 6. Do’s and Don’ts + +### Do: + +- **Embrace Whitespace:** If you think there is enough space, add one more step from the `Spacing Scale`. Space is a luxury. +- **Nesting Surfaces:** Use the `surface-container` tiers to guide the eye. The darker/more saturated the container, the more "nested" it should feel. +- **Intentional Asymmetry:** Align text to the left but allow imagery or decorative branding elements to "break" the grid and bleed off-screen. + +### Don’t: + +- **No Hard Outlines:** Never use a 100% opaque border to separate a sidebar or a card. It breaks the editorial flow. +- **No Pure Black:** Even in Dark Mode, use the `surface` and `on_surface` tokens. Pure #000000 kills the "premium" depth. +- **No Standard Shadows:** Avoid the "fuzzy grey" shadow. If you must use a shadow, tint it with the primary or surface color to keep it integrated with the environment. +- **No Over-Crowding:** Don't try to fit 5 event cards in a row. Use 2 or 3 to allow the brand's personality to breathe. diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 5d126348..00000000 --- a/.editorconfig +++ /dev/null @@ -1,13 +0,0 @@ -# editorconfig.org -root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[*.md] -trim_trailing_whitespace = false diff --git a/.env.example b/.env.example index 887bc205..6ace7ae2 100644 --- a/.env.example +++ b/.env.example @@ -1,9 +1,6 @@ -VIGOTECH_MEMBERS_SOURCE = '/vigotech.json' -VIGOTECH_MEMBERS_SOURCE_FILE = 'static/vigotech.json' -VIGOTECH_MEMBERS_SOURCE_GENERATED = '/vigotech-generated.json' -VIGOTECH_MEMBERS_SOURCE_GENERATED_FILE = 'static/vigotech-generated.json' -VIGOTECH_FRIENDS_SOURCE = '/friends.json' -MEETUP_API_BASE = 'http://api.meetup.com' -YOUTUBE_API_KEY = '[YOUR YOUTUBE API KEY HERE]' -GA = '[YOUR GOOGLE ANALYTICS PROPERTY ID HERE]' -EVENTBRITE_OAUTH_TOKEN = '[YOUR EVENTBRITE PERSONAL OAUTH TOKEN HERE]' +VIGOTECH_MOCK_EVENTS=true +PUBLIC_BASE_PATH= +PUBLIC_NOINDEX=false +EVENTBRITE_OAUTH_TOKEN= +YOUTUBE_API_KEY= +GOOGLE_CALENDAR_API_KEY= diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index e60b7d6a..00000000 --- a/.eslintrc.js +++ /dev/null @@ -1,22 +0,0 @@ -module.exports = { - root: true, - env: { - browser: true, - node: true - }, - parserOptions: { - parser: 'babel-eslint' - }, - extends: [ - 'plugin:vue/recommended' - ], - // required to lint *.vue files - plugins: [ - 'vue' - ], - // add your custom rules here - rules: { - 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', - 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' - } -} diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 00000000..90ee7cf0 --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,40 @@ +# Project Development Guidelines + +## Testing Strategy + +- Use Vitest for unit tests and Playwright for e2e tests. +- Keep unit tests focused and small. +- Maintain 95% coverage thresholds for lines, statements, functions, and branches. + +## Folder Structure + +- Keep source code in `src/`. +- Place reusable components under `src/components/`. +- Place e2e tests under `playwright/`. +- Place test setup in `test/`. + +## Code Organization + +- Keep one component per file when adding components. +- Prefer named exports for utilities and components. +- Keep files focused on a single responsibility. + +## Formatting + +- No semicolons. +- Single quotes for strings. +- Double quotes for JSX attributes. +- Trailing commas in multi-line arrays and objects. +- 100 character line width. +- Arrow functions always use parentheses. + +## Linting + +- Use `oxlint` with `.oxlintrc.json`. +- Ensure linting passes before commit. + +## Commit Convention + +- Follow Conventional Commits. +- Types: feat, fix, docs, style, refactor, test, chore. +- Format: `type(scope): description`. diff --git a/.github/workflows/deploy-pages.yml b/.github/workflows/deploy-pages.yml new file mode 100644 index 00000000..358d56c1 --- /dev/null +++ b/.github/workflows/deploy-pages.yml @@ -0,0 +1,142 @@ +name: Deploy Pages + +on: + push: + branches: + - main + workflow_dispatch: + +permissions: + contents: write + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: true + +env: + FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true + PUBLIC_BASE_PATH: ${{ vars.PUBLIC_BASE_PATH }} + PUBLIC_NOINDEX: ${{ vars.PUBLIC_NOINDEX || 'true' }} + +jobs: + refresh-data: + if: github.actor != 'github-actions[bot]' + permissions: + contents: write + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '22' + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: 10 + + - name: Get pnpm store directory + id: pnpm-cache + shell: bash + run: echo "STORE_PATH=$(pnpm store path)" >> "$GITHUB_OUTPUT" + + - name: Setup pnpm cache + uses: actions/cache@v4 + with: + path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Generate vigotech data + run: pnpm generate:data + env: + EVENTBRITE_OAUTH_TOKEN: ${{ secrets.EVENTBRITE_OAUTH_TOKEN }} + YOUTUBE_API_KEY: ${{ secrets.YOUTUBE_API_KEY }} + + - name: Sync Astro content types + run: pnpm astro sync + + - name: Format generated content + run: pnpm format src/content/events src/content/videos + + - name: Commit generated data + run: | + if git diff --quiet -- public/vigotech-generated.json src/content/videos src/content/events; then + echo "No generated changes to commit" + exit 0 + fi + + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add public/vigotech-generated.json src/content/videos src/content/events + git commit -m "chore: refresh generated community history" + git push + + build: + needs: refresh-data + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '22' + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: 10 + + - name: Get pnpm store directory + id: pnpm-cache + shell: bash + run: echo "STORE_PATH=$(pnpm store path)" >> "$GITHUB_OUTPUT" + + - name: Setup pnpm cache + uses: actions/cache@v4 + with: + path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Generate vigotech data + run: pnpm generate:data + env: + EVENTBRITE_OAUTH_TOKEN: ${{ secrets.EVENTBRITE_OAUTH_TOKEN }} + YOUTUBE_API_KEY: ${{ secrets.YOUTUBE_API_KEY }} + + - name: Build site + run: pnpm build + + - name: Upload Pages artifact + uses: actions/upload-pages-artifact@v3 + with: + path: ./dist + + deploy: + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml deleted file mode 100644 index 73d3214f..00000000 --- a/.github/workflows/gh-pages.yml +++ /dev/null @@ -1,51 +0,0 @@ -name: GH-pages - -on: - schedule: - - cron: "* 16 * * *" - push: - branches: - - source - -jobs: - pages: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Use Node.js 12.x - uses: actions/setup-node@v1 - with: - node-version: '12.x' - - name: Cache NPM dependencies - uses: actions/cache@v2 - with: - path: node_modules - key: ${{ runner.OS }}-npm-cache - restore-keys: | - ${{ runner.OS }}-npm-cache - - name: Install Dependencies - run: yarn install - - name: Prepare json - run: yarn prepare-json - env: - VIGOTECH_MEMBERS_SOURCE: /vigotech.json - VIGOTECH_MEMBERS_SOURCE_FILE: static/vigotech.json - VIGOTECH_MEMBERS_SOURCE_GENERATED: /vigotech-generated.json - VIGOTECH_MEMBERS_SOURCE_GENERATED_FILE: static/vigotech-generated.json - VIGOTECH_FRIENDS_SOURCE: /friends.json - MEETUP_API_BASE: 'http://api.meetup.com' - EVENTBRITE_OAUTH_TOKEN: ${{ secrets.EVENTBRITE_OAUTH_TOKEN }} - YOUTUBE_API_KEY: ${{ secrets.YOUTUBE_API_KEY }} - - name: Build - run: yarn generate:gh-pages - env: - GA: 'UA-98368785-1' - VIGOTECH_FRIENDS_SOURCE: /friends.json - VIGOTECH_MEMBERS_SOURCE_GENERATED: /vigotech-generated.json - VIGOTECH_MEMBERS_SOURCE: /vigotech.json - - name: Deploy - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./dist - publish_branch: master diff --git a/.gitignore b/.gitignore index 31978748..ca273981 100644 --- a/.gitignore +++ b/.gitignore @@ -1,83 +1,38 @@ -# Created by .ignore support plugin (hsz.mobi) -### Node template -# Logs -logs +# build output +dist/ +build/ +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs *.log npm-debug.log* yarn-debug.log* yarn-error.log* +pnpm-debug.log* -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output +# testing +coverage/ +playwright-report/ +test-results/ -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ +# vite cache +.vite/ -# TypeScript v1 declaration files -typings/ +# temporary files +*.tmp +*.temp -# Optional npm cache directory -.npm -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file +# environment variables .env +.env.production -# parcel-bundler cache (https://parceljs.org/) -.cache - -# next.js build output -.next - -# nuxt.js build output -.nuxt - -# Nuxt generate -dist - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless - -# IDE -.idea +# macOS-specific files +.DS_Store -/static/vigotech-generated.json +# jetbrains setting folder +.idea/ diff --git a/.oxfmtrc.json b/.oxfmtrc.json new file mode 100644 index 00000000..c930a9e3 --- /dev/null +++ b/.oxfmtrc.json @@ -0,0 +1,8 @@ +{ + "semi": false, + "singleQuote": true, + "jsxSingleQuote": false, + "trailingComma": "all", + "printWidth": 100, + "arrowParens": "always" +} diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 00000000..f462dd89 --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://raw.githubusercontent.com/oxc-project/oxc/main/npm/oxlint/configuration_schema.json", + "plugins": ["typescript", "unicorn", "jsx-a11y"], + "rules": {} +} diff --git a/.stitch/code-conduct-mobile.html b/.stitch/code-conduct-mobile.html new file mode 100644 index 00000000..bc953fda --- /dev/null +++ b/.stitch/code-conduct-mobile.html @@ -0,0 +1,365 @@ + + + + + + + Code of Conduct | The Editorial Node + + + + + + + + + + +
+ +
+
+ Governance +
+

+ Conduct Manifesto +

+

+ Defining the ethical framework for our technical collective. We prioritize humans over + machines, and collaboration over competition. +

+
+ +
+
+ +
+ menu_book + Table of Contents +
+ expand_more +
+ +
+
+ +
+ +
+

+ 01. Introduction +

+
+

+ The Editorial Node is committed to providing a harassment-free experience for + everyone, regardless of level of experience, gender identity and expression, sexual + orientation, disability, personal appearance, body size, race, ethnicity, age, + religion, or nationality. +

+

+ This Code of Conduct outlines our expectations for participants within the VigoTech + Alliance and the consequences for unacceptable behavior. +

+
+
+ +
+
+

Our Digital Ethos

+

+ "We view code as literature and communities as living ecosystems. Respect the craft, but + value the creator above all." +

+
+ +
+

+ 02. Core Values +

+
+
+

Radical Inclusivity

+

+ Actively working to welcome and support people of all backgrounds and identities. +

+
+
+

Technical Humility

+

+ Recognizing that there is always something to learn from others, regardless of their + seniority. +

+
+
+
+ +
+ Community Collaboration +
+ Node Visual Archive // 2024 / VigoTech +
+
+ +
+

+ 03. Expected Behavior +

+
    +
  • + check_circle + Participate in an authentic and active way. In doing so, you contribute to the + health and longevity of this community. +
  • +
  • + check_circle + Exercise consideration and respect in your speech and actions. +
  • +
  • + check_circle + Attempt collaboration before conflict. +
  • +
+
+ +
+

Need to report?

+

+ If you are being harassed, notice that someone else is being harassed, or have any other + concerns, please contact the steering committee. +

+ + send + Contact Conduct Team + +
+
+
+ + + + + +
+ + home + Home + + + gavel + Conduct + + + archive + Archive + + + groups + Connect + +
+ + diff --git a/.stitch/code-conduct-mobile.png b/.stitch/code-conduct-mobile.png new file mode 100644 index 00000000..c999d164 Binary files /dev/null and b/.stitch/code-conduct-mobile.png differ diff --git a/.stitch/groups-mobile.html b/.stitch/groups-mobile.html new file mode 100644 index 00000000..51bacda7 --- /dev/null +++ b/.stitch/groups-mobile.html @@ -0,0 +1,611 @@ + + + + + + + Groups Directory | VigoTech Pulse + + + + + + + + + + +
+
+
+ menu +

+ VigoTech Pulse +

+
+
+ +
+ Tech Alliance Logo +
+
+
+
+
+ +
+
+
+ Ecosystem Directory +

+ Collective
+ Intelligence. +

+

+ Discover the vibrant nodes of the Vigo technology scene. From niche hardware hackers + to large-scale software communities. +

+
+
+
+ + +
+
+
+
+ +
+
+
+ search + +
+
+ + + + +
+
+
+ +
+ +
+
+ + Active + +
+
+
+ VigoJS Logo +
+
+
+

VigoJS

+

+ The heartbeat of the Javascript ecosystem in Galicia. Monthly meetups covering React, + Vue, Node, and everything in between. +

+
+
+ + +
+
+ +
+
+ + Active + +
+
+
+ Python Vigo Logo +
+
+
+

Python Vigo

+

+ Dedicated to the snake. Data science, automation, and backend engineering enthusiasts + gathering to share knowledge. +

+
+
+ + +
+
+ +
+
+ + Dormant + +
+
+
+ IoT Galicia Logo +
+
+
+

IoT Galicia

+

+ Connecting the physical world. Embedded systems, Arduino, Raspberry Pi, and industrial + automation discussions. +

+
+
+
+ terminal +
+ +
+
+ +
+
+ + Active + +
+
+
+ PHPVigo Logo +
+
+
+

PHPVigo

+

+ The web veterans. Focus on Laravel, Symfony, and modern backend architectures in the + PHP universe. +

+
+
+
+ language + forum +
+ +
+
+ +
+
+ + Active + +
+
+
+ UX Vigo Logo +
+
+
+

UX Vigo

+

+ Where design meets technology. Exploring accessibility, user psychology, and modern + interface trends. +

+
+
+ + +
+
+ +
+
+ + Active + +
+
+
+ Agile Vigo Logo +
+
+
+

Agile Vigo

+

+ Optimizing workflows. Scrum, Kanban, Lean and XP practices discussed by local project + leaders and devs. +

+
+
+ + +
+
+
+ +
+
+
+

+ Can't find your node?
+ Create it. +

+

+ VigoTech Pulse is built on collaboration. If you have a community or want to start one, + we provide the platform and the reach. +

+
+ + +
+
+
+
+ + + + + + diff --git a/.stitch/groups-mobile.png b/.stitch/groups-mobile.png new file mode 100644 index 00000000..bc3dfcc0 Binary files /dev/null and b/.stitch/groups-mobile.png differ diff --git a/.stitch/home-desktop.html b/.stitch/home-desktop.html new file mode 100644 index 00000000..58293331 --- /dev/null +++ b/.stitch/home-desktop.html @@ -0,0 +1,655 @@ + + + + + + + VigoTech Alliance | The Editorial Node + + + + + + + + + +
+ +
+
+
+

+ The Technical
+ Pulse of Galicia. +

+

+ A federated ecosystem of developer communities, hackers, and innovators. We bridge + technical precision with human-centric connection to showcase the local movement. +

+
+ +
+
+ +
+
+ +
+
+ +
+
+ +4k +
+
+
+
+ +
+
+ +
+
+
+

Upcoming Events

+ + View Calendar arrow_forward + +
+
+ +
+
+
+ terminal +
+
+ 24 + Oct +
+
+

+ Rust in Production: Lessons Learned +

+
+
+ group + Rust Vigo +
+
+ schedule + 19:00 - 21:00 CEST +
+
+ location_on + MARCO Museum, 2nd Floor +
+
+ +
+ +
+
+
+ architecture +
+
+ 28 + Oct +
+
+

+ Design Systems for Scale +

+
+
+ group + UI/UX Vigo +
+
+ schedule + 18:30 - 20:30 CEST +
+
+ location_on + Impact Hub Vigo +
+
+ +
+ +
+
+
+ cloud +
+
+ 02 + Nov +
+
+

+ Serverless Deep Dive +

+
+
+ group + GDG Vigo +
+
+ schedule + 10:00 - 13:00 CEST +
+
+ location_on + Online Stream +
+
+ +
+
+
+
+ +
+
+
+
+

+ Active Communities +

+

+ Our alliance is composed of diverse technical groups sharing knowledge and driving + innovation across the northwest coast. Discover your tribe. +

+
+

Want to list your group?

+

+ Join the alliance and help us grow the local developer ecosystem together. +

+ +
+
+
+
+ +
+
+
+ code +
+
+

Python Vigo

+

1.2k Members

+
+
+

+ The most active Python community in Galicia, hosting monthly meetups and + workshops. +

+ +
+ +
+
+
+ javascript +
+
+

VigoJS

+

850 Members

+
+
+

+ Focusing on modern JavaScript frameworks, web standards, and high-performance + frontend. +

+ +
+ +
+
+
+ security +
+
+

HackersVigo

+

540 Members

+
+
+

+ Cybersecurity enthusiasts sharing tools, techniques, and organizing CTF events. +

+ +
+ +
+
+
+ brush +
+
+

UI/UX Vigo

+

720 Members

+
+
+

+ Where design meets engineering. Discussing product design, research, and user + experience. +

+ +
+
+
+
+
+
+ +
+
+
+
+

+ Stay in the Loop +

+

+ Get monthly updates about all community events, new video releases, and job + opportunities within the VigoTech network. +

+
+ + +
+
+
+
+
+ + + + diff --git a/.stitch/home-desktop.png b/.stitch/home-desktop.png new file mode 100644 index 00000000..032dcf4a Binary files /dev/null and b/.stitch/home-desktop.png differ diff --git a/.stitch/video-library-mobile.html b/.stitch/video-library-mobile.html new file mode 100644 index 00000000..22ad7db3 --- /dev/null +++ b/.stitch/video-library-mobile.html @@ -0,0 +1,500 @@ + + + + + + + Video Library | The Editorial Node + + + + + + + + + + +
+
+
+ menu +

+ The Editorial Node +

+
+
+ Community Profile +
+
+
+
+ +
+ CURATED KNOWLEDGE +

+ Video Library . +

+ +
+ +
+
+ search +
+ +
+ +
+ + + + + +
+ +
+
+ calendar_month + Sort by Date +
+
+ +
+
+
+
+ +
+ +
+
+ Coding Video +
+
+ play_arrow +
+
+
+ 45:22 +
+
+
+
+
+ VigoJS Logo +
+ VigoJS +
+

+ Mastering React Server Components in 2024 +

+
+ Oct 12, 2023 + +
+
+
+ +
+
+ Python Video +
+
+ play_arrow +
+
+
+ 1:12:05 +
+
+
+
+
+ PythonVigo Logo +
+ PythonVigo +
+

+ Advanced Asyncio Patterns for Production +

+
+ Sep 28, 2023 + +
+
+
+ +
+
+ PHPVigo Video +
+
+ play_arrow +
+
+
+ 38:15 +
+
+
+
+
+ PHPVigo Logo +
+ PHPVigo +
+

+ Modern Laravel: Beyond the Basics +

+
+ Aug 15, 2023 + +
+
+
+
+ +
+

+ Featured Workshop Series +

+
+
+
+ INTENSIVE +

+ The Architecture of Scalable Microservices +

+

+ A 4-part deep dive into distributed systems, event-sourcing, and kubernetes + deployment strategies for high-growth teams. +

+ +
+
+ Technology Pattern +
+
+
+ auto_awesome +
+

New: AI Ethics in Coding

+

+ Navigating the gray areas of copilot and generative models in professional dev + workflows. +

+ Listen to Panel +
+
+
+
+
+ + + + + + diff --git a/.stitch/video-library-mobile.png b/.stitch/video-library-mobile.png new file mode 100644 index 00000000..32d2709a --- /dev/null +++ b/.stitch/video-library-mobile.png @@ -0,0 +1,11 @@ + + + + + Error 400 (Bad Request)!!1 + + +

400. That’s an error. +

Your client has issued a malformed or illegal request. That’s all we know. diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..68c6154c --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,4 @@ +{ + "recommendations": ["astro-build.astro-vscode", "oxc.oxc-vscode"], + "unwantedRecommendations": [] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..d6422097 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "command": "./node_modules/.bin/astro dev", + "name": "Development server", + "request": "launch", + "type": "node-terminal" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..eb556f40 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,30 @@ +{ + "editor.formatOnSave": true, + "editor.defaultFormatter": "oxc.oxc-vscode", + "editor.codeActionsOnSave": { + "source.fixAll": "explicit" + }, + "oxc.enable": true, + "oxc.lint.enable": true, + "oxc.format.enable": true, + "peacock.color": "#e84a5f", + "workbench.colorCustomizations": { + "activityBar.activeBackground": "#ee7787", + "activityBar.background": "#ee7787", + "activityBar.foreground": "#15202b", + "activityBar.inactiveForeground": "#15202b99", + "activityBarBadge.background": "#9bf18e", + "activityBarBadge.foreground": "#15202b", + "commandCenter.border": "#e7e7e799", + "sash.hoverBorder": "#ee7787", + "statusBar.background": "#e84a5f", + "statusBar.foreground": "#e7e7e7", + "statusBarItem.hoverBackground": "#ee7787", + "statusBarItem.remoteBackground": "#e84a5f", + "statusBarItem.remoteForeground": "#e7e7e7", + "titleBar.activeBackground": "#e84a5f", + "titleBar.activeForeground": "#e7e7e7", + "titleBar.inactiveBackground": "#e84a5f99", + "titleBar.inactiveForeground": "#e7e7e799" + } +} diff --git a/LICENSE b/LICENSE deleted file mode 100644 index bc9a1981..00000000 --- a/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2018, Sergio Carracedo Martinez -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md index 1ec00516..b81ec505 100644 --- a/README.md +++ b/README.md @@ -1,90 +1,70 @@ -# vigotech.github.io - -> VigoTech Alliance Website - -## Build Setup - -``` bash -# install dependencies -$ yarn - -# rename .env.example to .env and edit using your own config - -# prepare required static/vigotech-generated.json -$ yarn run prepare-json - -# serve with hot reload at localhost:3000 -$ yarn run dev - -# generate static project -$ yarn run generate -``` - -## Instruccións para engadir información - -En primeiro lugar para engadir ou editar un membro o grupo, debe modificarse únicamente *static/vigotech.json* -Este fichero ten un *schema* no fichero *static/vigotech-schema.json* cando se xere a parte de front mediante ```yarn prepare``` este validarase polo que debe asegurarse que estea correcto. - -A estructura dun membro (como exemplo collemos un existente) é: - -``` -"aindustriosa": { - "name": "A Industriosa", - "logo": "https://vigotech.org/images/aindustriosa.png", - "links": { - "web": "https://aindustriosa.org/", - "twitter": "https://twitter.com/aindustriosa", - "meetup": "https://www.meetup.com/es-ES/AIndustriosa/", - "youtube": "https://www.youtube.com/channel/UC9DPKfcLiNd7SEU-QLlIG7A" - }, - "events": { - "type": "meetup", - "meetupid": "AIndustriosa" - }, - "videos": [ - { - "type": "youtube", - "channel_id": "UC9DPKfcLiNd7SEU-QLlIG7A" - } - ] - } -``` - -O apartado *events* pode ter duas formas - -* Para eventos que se extraen mediante a api de Meetup -``` -"events": { - "type": "meetup", - "meetupid": "AIndustriosa" -} -``` -* Para eventos que se extraen mediante a api de Eventbrite -``` -"events": { - "type": "eventbrite", - "eventbriteid": "17365087639" -} -``` -* Ou para eventos extraido dun json externo -``` -"events": { - "type": "json", - "source": "https://www.python-vigo.es/events.json" -}, -``` - - -Coa forma -``` -{ - "title": "Reunión del Grupo el 18/11/2018", - "date": 1542569580000, - "url": "https://www.python-vigo.es/posts/reunion-del-grupo-el-20181018/" -} - -``` +# VigoTech Website (Astro) +This project is the Astro migration of the VigoTech website. +## Commands +| Command | Action | +| ----------------------- | ---------------------------------------- | +| `pnpm install` | Install dependencies | +| `pnpm dev` | Start local dev server | +| `pnpm dev --mockEvents` | Start dev with synthetic upcoming events | +| `pnpm generate:data` | Refresh `public/vigotech-generated.json` | +| `pnpm check` | Run Astro checks | +| `pnpm build` | Type-check and build static site | +## Data source + +By default, the site reads source files from `public/`: + +- `public/vigotech.json` +- `public/vigotech-generated.json` +- `public/friends.json` + +Run `pnpm generate:data` to rebuild `public/vigotech-generated.json` from +`public/vigotech.json` using the legacy VigoTech source fetchers. + +## Environment variables + +- `VIGOTECH_MOCK_EVENTS` + - Used in development to generate synthetic upcoming events when real events are not available. + - Automatically set by `pnpm dev --mockEvents`. + +- `VIGOTECH_CONFIG_DATA_DIR` + - Optional override for local source JSON directory. + - Default: `public`. + - Used for `vigotech.json` and `friends.json`. + +- `PUBLIC_BASE_PATH` + - Optional base path for subpath deployments. + - Example: `PUBLIC_BASE_PATH=vigotech-astro` produces URLs under `/vigotech-astro/`. + - Leave empty for root deployments. + +- `PUBLIC_NOINDEX` + - Optional search-engine opt-out for non-production deployments. + - Set to `true` to emit `` on every page. + - Recommended for temporary test deployments. + +- `VIGOTECH_GENERATED_DATA_DIR` + - Optional override for generated JSON directory. + - Default: `public`. + - Used only for `vigotech-generated.json`. + +- `EVENTBRITE_OAUTH_TOKEN` + - Optional token used while generating upcoming events from Eventbrite. + - Used by `pnpm generate:data` and the Pages workflow. + +- `YOUTUBE_API_KEY` + - Optional API key used while generating `videoList` entries from YouTube. + - Used by `pnpm generate:data` and the Pages workflow. + +- `GOOGLE_CALENDAR_API_KEY` + - Used by `/api/calendar.json` to fetch events from VigoTech public Google Calendar. + - If omitted, the Axenda block still renders and keeps the iCal download link, but no live events are shown. + +## Group status + +- Group active/inactive is now manual. +- Set `inactive: true` in source data for archived groups. + +Copy `.env.example` to `.env` and customize values for local work. diff --git a/assets/README.md b/assets/README.md deleted file mode 100644 index 34766f93..00000000 --- a/assets/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# ASSETS - -**This directory is not required, you can delete it if you don't want to use it.** - -This directory contains your un-compiled assets such as LESS, SASS, or JavaScript. - -More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/assets#webpacked). diff --git a/assets/_calendar.scss b/assets/_calendar.scss deleted file mode 100644 index d71bac07..00000000 --- a/assets/_calendar.scss +++ /dev/null @@ -1,26 +0,0 @@ -#calendar { - text-align: center; - - .embed-responsive { - display: block; - margin: 0 auto 2rem auto; - width: 80%; - max-width: 1200px; - word-break: break-word; - - - @include box-shadow(0, 0, 30px, rgba($black, 0.5)); - - @include media($xs) { - width: 100%; - padding-bottom: 100%; - } - - &, .embed-responsive-item { - @include media($xs) { - } - } - - - } -} diff --git a/assets/_conversation.scss b/assets/_conversation.scss deleted file mode 100644 index c8f34593..00000000 --- a/assets/_conversation.scss +++ /dev/null @@ -1,27 +0,0 @@ -#conversation { - .section-content { - p { - font-size: 25px; - margin: 0 auto 1em auto; - max-width: 600px; - } - } - - .social { - text-align: center; - margin-bottom: 40px; - - a { - color: $black; - margin: 0 10px 10px 10px; - @include transition(all, .2s); - - &:hover { - @include scale(1.2); - } - } - } - .col { - margin-bottom: 40px; - } -} diff --git a/assets/_cover.scss b/assets/_cover.scss deleted file mode 100644 index 8a2416c1..00000000 --- a/assets/_cover.scss +++ /dev/null @@ -1,130 +0,0 @@ -#cover { - background: $primary-color url(/bg.jpg) no-repeat center center; - background-size: cover; - background-attachment: fixed; - z-index: 9999; - position: relative; - - .content-wrapper { - min-height: 100vh; - } - .content { - //@include vertical-align(); - } - - .logo { - margin: 0 auto 40px auto; - width: 200px; - display: block; - } - h1, h2 { - color: $white; - text-align: center; - } - - h1 { - font-size: 80px; - margin: 0 auto 40px auto; - @include media($xs) { - font-size: 50px; - } - } - - h2 { - font-size: 35px; - max-width: 600px; - margin: auto; - - @include media($xs) { - font-size: 25px; - } - } - - .down-wrapper { - text-align: center; - .down { - @include transition(all, .2s); - color: rgba($white, .5); - font-size: 80px; - &:hover { - color: rgba($white, 1); - @include scale(1.2); - } - } - } - - .vigotech-next-event { - max-width: 600px; - background: $white; - padding: 15px; - margin: 30px auto; - h4 { - margin-bottom: 15px; - strong { - color: $primary-color - } - } - - .wrapper { - display: flex; - margin-bottom: 15px; - padding-bottom: 15px; - border-bottom: 1px solid $primary-color; - &:last-child { - border-bottom: 0; - margin-bottom: 0; - } - } - - .logo-wrapper { - width: 70px; - position: relative; - .member-logo { - max-width: 100%; - } - } - .next-event-content { - padding: 10px 0 0 15px; - color: $black; - - h5, h6 { - font-size: 16px; - } - - a { - text-decoration: none; - color: $black; - - h6 { - color: #666; - } - - strong { - color: $primary-color; - } - } - } - - &.vigotech-next-event-active { - padding: 10px; - border: 10px solid $primary-color; - animation-duration: 1.2s; - animation-iteration-count: infinite; - animation-name: highlightBorder; - } - } -} - -@keyframes highlightBorder { - 0% { - border-color: $black; - } - - 50% { - border-color: $primary-color; - } - - 100% { - border-color: $black; - } -} diff --git a/assets/_docs.scss b/assets/_docs.scss deleted file mode 100644 index 8b44928a..00000000 --- a/assets/_docs.scss +++ /dev/null @@ -1,12 +0,0 @@ -#docs { - .col { - margin-bottom: 30px; - - a { - height: 100%; - display: flex; - align-items: center; - justify-content: center; - } - } -} diff --git a/assets/_elements.scss b/assets/_elements.scss deleted file mode 100644 index 4318f376..00000000 --- a/assets/_elements.scss +++ /dev/null @@ -1,36 +0,0 @@ -.btn { - display: inline-block; - background: $primary-color; - padding: 5px 10px; - text-align: center; - color: $white; - font-size: 16px; - line-height: 1.1em; - text-decoration: none; - - @include transition(all, .2s); - - &:hover { - color: $white; - text-decoration: none; - background: $black; - } - - &.btn-white { - background: $white; - color: $black; - &:hover { - background: $black; - color: $white; - } - } - - &.btn-block { - display: block; - } - - &.btn-lg { - font-size: 20px; - padding: 10px 15px; - } -} diff --git a/assets/_footer.scss b/assets/_footer.scss deleted file mode 100644 index 2f5f6482..00000000 --- a/assets/_footer.scss +++ /dev/null @@ -1,31 +0,0 @@ -#page-footer { - background: $gray; - text-align: center; - padding: 15px; - color: $light-gray; - position: fixed; - bottom: 0; - left: 0; - right: 0; - display: flex; - justify-content: center; - align-items: center; - z-index: 9998; - - .social { - margin: 10px; - - a { - color: $white; - margin: 0 3px; - - i { - font-size: 26px; - } - } - } - - @include media($xs) { - padding: 15px 10px; - } -} diff --git a/assets/_friends.scss b/assets/_friends.scss deleted file mode 100644 index 84abd5e2..00000000 --- a/assets/_friends.scss +++ /dev/null @@ -1,49 +0,0 @@ -.vigotech-friend { - margin-bottom: 30px; - - .logo-wrapper { - text-align: center; - - .logo-content { - display: inline-block; - position: relative; - } - } - - .name { - display: block; - text-align: center; - font-size: 10px; - line-height: 1.1em; - margin: 0 0 7px 0; - font-weight: normal; - - a { - color: $white; - text-decoration: none; - } - } - - .logo-wrapper { - margin-bottom: 5px; - position: relative; - .square-bg { - width: 160px; - max-width: 100%; - height: auto; - } - .logo { - max-width: 160px; - width: 100%; - display: block; - left: 0; - right: 0; - top: 50%; - margin: auto; - position: absolute; - -webkit-transform: translateY(-50%); - -ms-transform: translateY(-50%); - transform: translateY(-50%); - } - } -} diff --git a/assets/_layout.scss b/assets/_layout.scss deleted file mode 100644 index d1c7beb9..00000000 --- a/assets/_layout.scss +++ /dev/null @@ -1,174 +0,0 @@ -@import url('https://fonts.googleapis.com/css?family=Raleway'); - -body { - background: $white; - font-family: $primary-font; - box-sizing: border-box; - padding: 0 0 30px 0; - margin: 0; - font-weight: 200; -} - -html { - font-family: 'Raleway', sans-serif, Roboto, 'Helvetica Neue', Arial, sans-serif; - font-size: 16px; - word-spacing: 1px; - -ms-text-size-adjust: 100%; - -webkit-text-size-adjust: 100%; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - box-sizing: border-box; - - *, - *:before, - *:after { - box-sizing: border-box; - margin: 0; - } -} - -img { - max-width: 100%; - height: auto; -} - - -.page-section { - padding: 40px 15px; - color: $black; - h2.section-title { - text-align: center; - font-size: 50px; - margin: 10px 0 35px 0; - padding: 10px 15px; - background: $white; - - @include media ($xs) { - font-size: 30px; - } - } - - &.red-bg { - background: $primary-color; - color: $white; - h2.section-title { - background: $primary-color; - } - } - - .section-content { - &.section-content-center { - text-align: center; - } - - p { - margin-bottom: 1.4em; - } - } -} - -.page-header { - padding: 10px 15px; - background: $primary-color; - color: $white; - margin-bottom: 80px; - - .page-header-content { - align-items: center; - display: flex; - } - - .logo { - padding-left: 20px; - } - - .spacer { - flex: 1; - } - - h1.page-title { - text-align: center; - font-size: 45px; - padding: 0 15px; - - @include media ($xs) { - font-size: 20px; - line-height: 1.1em; - } - } - - @include media ($xs) { - margin-bottom: 0; - .logo { - padding-left: 0; - width: 50px; - } - } -} - -.wrap { - box-sizing: border-box; - max-width: 1200px; - margin: 0 auto; -} - -.layout { - display: flex; - min-height: 100vh; - flex-direction: column; -} - -// Embeds responsive -// -// Credit: Nicolas Gallagher and SUIT CSS. - -.embed-responsive { - position: relative; - display: block; - height: 0; - padding: 0; - overflow: hidden; - - .video-js, - .embed-responsive-item, - iframe, - embed, - object, - video { - position: absolute; - top: 0; - left: 0; - bottom: 0; - height: 100%; - width: 100%; - border: 0; - } -} - -// Modifier class for 16:9 aspect ratio -.embed-responsive-16by9 { - padding-bottom: 56.25%; -} - -// Modifier class for 4:3 aspect ratio -.embed-responsive-4by3 { - padding-bottom: 75%; -} - - - -@include media($xs) { - .container-fluid { - padding: 0; - } - - .page-header-content { - &.row { - margin: 0; - } - } -} - -vue-cookie-accept-decline { - display: none; -} diff --git a/assets/_made-with.scss b/assets/_made-with.scss deleted file mode 100644 index 092c45c5..00000000 --- a/assets/_made-with.scss +++ /dev/null @@ -1,80 +0,0 @@ -@font-face { - font-family: 'Vigotech'; - src: url('fonts/vigotech.eot?qv79y9'); - src: url('fonts/vigotech.eot?qv79y9#iefix') format('embedded-opentype'), - url('fonts/vigotech.ttf?qv79y9') format('truetype'), - url('fonts/vigotech.woff?qv79y9') format('woff'), - url('fonts/vigotech.svg?qv79y9#icomoon') format('svg'); - font-weight: normal; - font-style: normal; -} - -[class^="vt-"], [class*=" vt-"] { - font-family: 'Vigotech' !important; - speak: none; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - - -.vt-pinecone:before { - content: "\e900"; -} - - - -.vigotech-claim { - font-family: 'Raleway', sans-serif; - font-size: 16px; - color: #666; - font-weight: 500; - line-height: 20px; - text-decoration: none; - position: relative; - padding-bottom: 2px; - - - &:before { - content: ''; - position: absolute; - left: 0; - right: 100%; - bottom: 0; - height: 2px; - background: #000; - @include transition(all, .4s); - } - - .vt-pinecone { - color: $primary-color; - font-size: 20px; - } - - strong{ - font-weight: 500; - color: #000; - @include transition(all, .4s); - } - - &.vigotech-dark { - color: #eaeaea; - strong{ - color: #fff; - } - } - - &:hover{ - strong { - color: $primary-color; - } - &:before { - right: 0; - background: $primary-color; - } - } -} diff --git a/assets/_members.scss b/assets/_members.scss deleted file mode 100644 index 92d2decc..00000000 --- a/assets/_members.scss +++ /dev/null @@ -1,39 +0,0 @@ -@include media($xs) { - .vigotech-member-list { - &.row { - margin: 0; - } - } -} - - - -.vigotech-member { - .vigotech-next-event { - i { - @include fade-animation(1s); - } - } - - .logo-wrapper { - text-align: center; - - .logo-content { - display: inline-block; - position: relative; - } - } - .ivoox { - transform: translate(0, 2px); - } - - - - .vigotech-next-event { - position: absolute; - top: 0; - left: 0; - } -} - - diff --git a/assets/_menu.scss b/assets/_menu.scss deleted file mode 100644 index d7b860b8..00000000 --- a/assets/_menu.scss +++ /dev/null @@ -1,51 +0,0 @@ -#menu { - position: fixed; - top: 10px; - left: 30px; - - @media (max-width: 1800px) { - display: none; - } - - - .logo { - margin-bottom: 20px; - display: block; - width: 80px; - - svg { - - } - } - ul { - list-style: none; - margin: 0; - padding: 0; - - - - li { - margin-bottom: 7px; - padding: 0; - } - - a { - font-size: 25px; - text-transform: uppercase; - color: $black; - font-weight: 600; - text-decoration: none; - @include transition(all, .2s); - - - - &.active, - &:hover { - color: $primary-color; - text-shadow: 2px 0 0 #fff, -2px 0 0 #fff, 0 2px 0 #fff, 0 -2px 0 #fff, 1px 1px #fff, -1px -1px 0 #fff, 1px -1px 0 #fff, -1px 1px 0 #fff; - } - &:hover { - } - } - } -} diff --git a/assets/_mixins.scss b/assets/_mixins.scss deleted file mode 100644 index b6771355..00000000 --- a/assets/_mixins.scss +++ /dev/null @@ -1,95 +0,0 @@ -@mixin media($devices) { - @each $device in $devices { - @media ($device) { - @content; - } - } -} - -@mixin transform($transform) { - -ms-transform: $transform; /* IE 9 */ - -webkit-transform: $transform; /* Chrome, Safari, Opera */ - transform: $transform; -} - - -@mixin box-shadow($x: 0px, $y: 8px, $r: 3px, $color: #333) { - -moz-box-shadow: $x $y $r $color; - -webkit-box-shadow: $x $y $r $color; - box-shadow: $x $y $r $color; -} - -@mixin text-shadow($x: 0px, $y: 8px, $r: 3px, $color: #333) { - -moz-text-shadow: $x $y $r $color; - -webkit-text-shadow: $x $y $r $color; - text-shadow: $x $y $r $color; -} - -@mixin scale ($zoom: 1.1) { - @include transform(scale($zoom)); -} - -@mixin rotate($angle: 90deg, $originX: 50%, $originY: 50%) { - -webkit-transform: rotate($angle); - -webkit-transform-origin: $originX $originY; - - -moz-transform: rotate($angle); - -moz-transform-origin: $originX $originY; - - -o-transform: rotate($angle); - -o-transform-origin: $originX $originY; - - -ms-transform: rotate($angle); - -ms-transform-origin: $originX $originY; - - transform: rotate($angle); - transform-origin: $originX $originY; -} - - -@mixin transition($property: all , $speed: 1s, $ease: ease-in-out) { - -moz-transition: $property $speed $ease; - -o-transition: $property $speed $ease; - -webkit-transition: $property $speed $ease; - transition: $property $speed $ease; -} - -@mixin transition-delay($delay: 0.5s) { - -webkit-transition-delay: $delay; /* Safari */ - transition-delay: $delay; -} - - -@mixin vertical-align($xs: true) { - @if ($xs == false) { - @include media(768px) { - top: 50%; - left: 0; - right: 0; - position: absolute; - -webkit-transform: translateY(-50%); - -ms-transform: translateY(-50%); - transform: translateY(-50%); - } - } @else { - top: 50%; - position: absolute; - left: 0; - right: 0; - -webkit-transform: translateY(-50%); - -ms-transform: translateY(-50%); - transform: translateY(-50%); - } -} - - -@keyframes fade-animation { - 0% { opacity:0.8; transform: scale(1)} - 50% { opacity:1; transform: scale(1.2)} - 100% { opacity:0.8; transform: scale(1)} -} - -@mixin fade-animation($time: 1s) { - animation: fade-animation $time infinite; - -} diff --git a/assets/_post.scss b/assets/_post.scss deleted file mode 100644 index d292424f..00000000 --- a/assets/_post.scss +++ /dev/null @@ -1,48 +0,0 @@ -#post { - .post-content { - font-size: 18px; - hr { - background: $primary-color; - border: 0; - height: 5px; - margin-bottom: 20px; - } - padding-bottom: 40px; - > * { - margin-top: 0; - } - h1, h2, h3, h4, h5, h6 { - margin: 30px 0 20px 0; - } - - h1 { - font-size: 30px; - } - p { - - line-height: 1em; - margin-bottom: 1.2em; - } - - ul, ol { - margin-bottom: 20px; - li { - margin-bottom: 7px; - } - } - - a { - color: $primary-color; - - &:hover { - text-decoration: none; - } - } - - pre { - background: rgba($primary-color, .2); - padding: 15px; - margin-bottom: 20px; - } - } -} diff --git a/assets/_variables.scss b/assets/_variables.scss deleted file mode 100644 index f0cc00a6..00000000 --- a/assets/_variables.scss +++ /dev/null @@ -1,16 +0,0 @@ -$xs: "max-width: 767px" !default; -$not-xs: "min-width: 768px" !default; -$sm: "min-width: 768px) and (max-width: 991px" !default; -$md: "min-width: 992px) and (max-width: 1199px" !default; -$lg: "min-width: 1200px" !default; - - -// Colors -$primary-color: #e84a5f; -$white: #fff; -$black: #000; -$gray: #22343A; -$light-gray: #999; - -// Fonts -$primary-font: Raleway; diff --git a/assets/_videojs.scss b/assets/_videojs.scss deleted file mode 100644 index 72a3b47d..00000000 --- a/assets/_videojs.scss +++ /dev/null @@ -1,3 +0,0 @@ -.video-js { - width: 100%; -} diff --git a/assets/_videos.scss b/assets/_videos.scss deleted file mode 100644 index 48e8c756..00000000 --- a/assets/_videos.scss +++ /dev/null @@ -1,74 +0,0 @@ -#videos { - .anchor { - display: block; - position: relative; - top: -130px; - visibility: hidden; - } - .group-anchors { - display: flex; - margin-bottom: 50px; - .group-anchor { - display: flex; - width: 60px; - height: 60px; - margin: 5px; - align-items: center; - justify-content: center; - img { - max-width: 100%; - } - } - } - .wrap { - > .row { - margin: 0; - } - } - - .group { - margin-bottom: 60px; - } - .video { - margin: 0 0 40px 0; - - iframe, - .video-player-box, - img { - width: 100%; - margin-bottom: 5px; - } - - a { - color: $black; - text-decoration: none; - display: block; - - &:hover { - text-decoration: underline; - } - } - h3 { - margin-top: 7px; - margin-bottom: 7px; - } - } - - .group-header { - display: flex; - border-bottom: 5px solid $primary-color; - margin-bottom: 30px; - padding-bottom: 5px; - color: $black; - align-items: center; - - .logo-wrapper { - margin-right: 15px; - width: 70px; - position: relative; - .member-logo { - max-width: 100%; - } - } - } -} diff --git a/assets/fonts/vigotech.eot b/assets/fonts/vigotech.eot deleted file mode 100644 index 505dfe22..00000000 Binary files a/assets/fonts/vigotech.eot and /dev/null differ diff --git a/assets/fonts/vigotech.svg b/assets/fonts/vigotech.svg deleted file mode 100644 index e884d862..00000000 --- a/assets/fonts/vigotech.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - -Generated by IcoMoon - - - - - - - \ No newline at end of file diff --git a/assets/fonts/vigotech.ttf b/assets/fonts/vigotech.ttf deleted file mode 100644 index c14b2a62..00000000 Binary files a/assets/fonts/vigotech.ttf and /dev/null differ diff --git a/assets/fonts/vigotech.woff b/assets/fonts/vigotech.woff deleted file mode 100644 index 271b5727..00000000 Binary files a/assets/fonts/vigotech.woff and /dev/null differ diff --git a/assets/i/ivoox.svg b/assets/i/ivoox.svg deleted file mode 100644 index caed0d0b..00000000 --- a/assets/i/ivoox.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - diff --git a/assets/vigotech.scss b/assets/vigotech.scss deleted file mode 100644 index 0ee2abbf..00000000 --- a/assets/vigotech.scss +++ /dev/null @@ -1,18 +0,0 @@ -@import - "variables", - "mixins", - "layout", - "footer", - "elements", - "cover", - "menu", - "members", - "calendar", - "post", - "docs", - "videojs", - "videos", - "friends", - "made-with", - "conversation" -; diff --git a/astro.config.mjs b/astro.config.mjs new file mode 100644 index 00000000..99cbe41f --- /dev/null +++ b/astro.config.mjs @@ -0,0 +1,27 @@ +// @ts-check +import { defineConfig } from 'astro/config' +import icon from 'astro-icon' + +import tailwindcss from '@tailwindcss/vite' + +/** @param {string | undefined} value */ +const normalizeBase = (value) => { + if (!value || value === '/') { + return '/' + } + + return `/${String(value).replace(/^\/+|\/+$/g, '')}/` +} + +// https://astro.build/config +export default defineConfig({ + site: process.env.SITE_URL || 'https://vigotech.org', + base: normalizeBase(process.env.PUBLIC_BASE_PATH), + integrations: [icon()], + vite: { + plugins: [tailwindcss()], + optimizeDeps: { + include: ['shaders/core'], + }, + }, +}) diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 00000000..d179c690 --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1,3 @@ +export default { + extends: ['@commitlint/config-conventional'], +} diff --git a/components/CalendarSection.vue b/components/CalendarSection.vue deleted file mode 100644 index a56024f5..00000000 --- a/components/CalendarSection.vue +++ /dev/null @@ -1,47 +0,0 @@ -