From 4fc0c11af141b2f070cdf2c7825eaadeaa444761 Mon Sep 17 00:00:00 2001 From: Sergio Carracedo Martinez Date: Wed, 5 Mar 2025 17:57:17 +0100 Subject: [PATCH 1/4] Update gh-pages.yml --- .github/workflows/gh-pages.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index 73d3214f..ccf8e687 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -1,8 +1,8 @@ name: GH-pages on: - schedule: - - cron: "* 16 * * *" + # schedule: + # - cron: "* 16 * * *" push: branches: - source From ca708d75323bceccffb628ec042c8b551ce19156 Mon Sep 17 00:00:00 2001 From: Sergio Carracedo Date: Thu, 26 Mar 2026 21:36:05 +0100 Subject: [PATCH 2/4] feat: revamp --- .agents/DESIGN.md | 95 + .editorconfig | 13 - .env.example | 15 +- .eslintrc.js | 22 - .github/copilot-instructions.md | 40 + .github/workflows/deploy-pages.yml | 142 + .github/workflows/gh-pages.yml | 51 - .gitignore | 97 +- .oxfmtrc.json | 8 + .oxlintrc.json | 5 + .stitch/code-conduct-mobile.html | 365 + .stitch/code-conduct-mobile.png | Bin 0 -> 24583 bytes .stitch/groups-mobile.html | 611 + .stitch/groups-mobile.png | Bin 0 -> 18642 bytes .stitch/home-desktop.html | 655 + .stitch/home-desktop.png | Bin 0 -> 37841 bytes .stitch/video-library-mobile.html | 500 + .stitch/video-library-mobile.png | 11 + .vscode/extensions.json | 4 + .vscode/launch.json | 11 + .vscode/settings.json | 30 + LICENSE | 29 - README.md | 152 +- assets/README.md | 7 - assets/_calendar.scss | 26 - assets/_conversation.scss | 27 - assets/_cover.scss | 130 - assets/_docs.scss | 12 - assets/_elements.scss | 36 - assets/_footer.scss | 31 - assets/_friends.scss | 49 - assets/_layout.scss | 174 - assets/_made-with.scss | 80 - assets/_members.scss | 39 - assets/_menu.scss | 51 - assets/_mixins.scss | 95 - assets/_post.scss | 48 - assets/_variables.scss | 16 - assets/_videojs.scss | 3 - assets/_videos.scss | 74 - assets/fonts/vigotech.eot | Bin 1660 -> 0 bytes assets/fonts/vigotech.svg | 11 - assets/fonts/vigotech.ttf | Bin 1496 -> 0 bytes assets/fonts/vigotech.woff | Bin 1572 -> 0 bytes assets/i/ivoox.svg | 10 - assets/vigotech.scss | 18 - astro.config.mjs | 27 + commitlint.config.js | 3 + components/CalendarSection.vue | 47 - components/ConversationSection.vue | 86 - components/CoverSection.vue | 87 - components/Friend.vue | 38 - components/FriendsSection.vue | 45 - components/Menu.vue | 83 - components/PageHeader.vue | 36 - components/VideosSection.vue | 68 - components/VigotechCurrentEvents.vue | 54 - components/VigotechDocsSection.vue | 64 - components/VigotechMember.vue | 143 - components/VigotechMemberList.vue | 32 - components/VigotechMembersSection.vue | 42 - components/VigotechNextEvent.vue | 60 - components/VigotechNextEventTip.vue | 47 - components/VigotechVideoPlayer.vue | 96 - config.json | 25 - layouts/README.md | 7 - layouts/default.vue | 83 - lefthook.yml | 15 + markdown/index.js | 17 - markdown/legal.md | 112 - markdown/test.md | 244 - middleware/README.md | 8 - nuxt.config.js | 122 - package.json | 98 +- pages/README.md | 6 - pages/index.vue | 91 - pages/post/_slug.vue | 36 - pages/videos.vue | 128 - playwright.config.ts | 26 + playwright/home.spec.ts | 6 + plugins/README.md | 7 - plugins/cookies.js | 5 - plugins/ga.js | 7 - plugins/localStorage.js | 7 - plugins/moment.js | 8 - plugins/nuxt-video-player-plugin.js | 9 - plugins/scrollTo.js | 14 - plugins/scrollactive.js | 4 - plugins/sticky.js | 4 - pnpm-lock.yaml | 6732 ++++++++++ prepare-json.js | 156 - {static => public}/CNAME | 0 {static => public}/favicon.ico | Bin public/favicon.svg | 9 + .../fonts/instrument-serif-latin-italic.woff2 | Bin 0 -> 22128 bytes public/fonts/instrument-serif-latin.woff2 | Bin 0 -> 21032 bytes public/fonts/inter-latin.woff2 | Bin 0 -> 48256 bytes public/fonts/space-grotesk-latin.woff2 | Bin 0 -> 22288 bytes {static => public}/friends-schema.json | 6 +- {static => public}/friends.json | 0 {static => public}/friends/compostelatech.jpg | Bin {static => public}/friends/copenhagen.jpg | Bin {static => public}/friends/madridtech.jpg | Bin {static => public}/friends/riojatech.png | Bin .../images/groups}/agile_vigo.jpg | Bin .../images/groups}/aindustriosa.png | Bin .../images/groups}/blockchaingal.png | Bin .../images/groups}/craftersVigo.png | Bin .../images/groups}/galpon.png | Bin .../images/groups}/galstech.png | Bin .../images/groups}/gdg_vigo.png | Bin .../images/groups}/joomla_vigo.png | Bin .../images/groups}/jsvigo.png | Bin .../images/groups}/php_vigo.jpg | Bin .../images/groups}/python_vigo.png | Bin .../images/groups}/seogalicia.png | Bin .../images/groups}/sysadmin_galicia.jpg | Bin .../images/groups}/ux_gal.jpg | Bin .../images/groups}/vigoadg.jpg | Bin .../images/groups}/vigobrain.png | Bin .../images/groups}/vigojug.jpg | Bin .../images/groups}/vigowordpress.png | Bin .../images/groups}/wordpress-pontevedra.png | Bin {static => public}/slack.png | Bin .../vigotech-events-schema.json | 6 +- public/vigotech-generated.json | 5547 +++++++++ {static => public}/vigotech-schema.json | 42 +- {static => public}/vigotech.json | 37 +- scripts/dev.mjs | 17 + scripts/generate-vigotech-json.mjs | 771 ++ src/assets/logo.svg | 70 + src/components/groups/GroupCard.astro | 84 + src/components/groups/GroupsBrowser.astro | 94 + src/components/home/CalendarSection.astro | 409 + src/components/home/ConversationSection.astro | 75 + src/components/home/DocumentsSection.astro | 28 + src/components/home/FriendsSection.astro | 36 + src/components/home/GroupsSection.astro | 38 + src/components/home/HeroSection.astro | 96 + src/components/home/UpcomingEventsPanel.astro | 82 + src/components/home/VideosSection.astro | 87 + .../UpcomingEventCard.astro | 34 + .../UpcomingEventCardContent.astro | 93 + src/components/layout/Footer.astro | 42 + src/components/layout/Header.astro | 172 + .../shaders/ConversationShader.astro | 73 + src/components/shaders/HeroShader.astro | 109 + src/components/theme/ThemeScript.astro | 14 + src/components/theme/ThemeToggle.astro | 64 + src/components/ui/FloatingHeader.astro | 412 + src/components/ui/GroupLogo.astro | 47 + src/components/videos/VideosBrowser.astro | 182 + src/config/menu.ts | 11 + src/content.config.ts | 178 + ...go-1671130800000-reunion-diciembre-2022.md | 12 + ...00-posicionando-sin-ia-en-tiempos-de-ia.md | 12 + .../videos/aindustriosa/33xt39a-cec.md | 11 + .../videos/aindustriosa/37xmhgwkuae.md | 11 + .../videos/aindustriosa/50trtscnuis.md | 11 + .../videos/aindustriosa/7mvk7obsv80.md | 11 + .../videos/aindustriosa/7okgu70odti.md | 11 + .../videos/aindustriosa/9ga8hhu1dig.md | 11 + .../videos/aindustriosa/9p2kho8rjw0.md | 11 + .../videos/aindustriosa/9u0djwikyga.md | 11 + .../videos/aindustriosa/b6erbdjfbwg.md | 11 + .../videos/aindustriosa/bmmg6o0i4ei.md | 11 + .../videos/aindustriosa/br0vvthan6o.md | 11 + .../videos/aindustriosa/crs2ofs-aqw.md | 11 + .../videos/aindustriosa/dntvdxvmlqy.md | 11 + .../videos/aindustriosa/e-3kozcmwbu.md | 11 + .../videos/aindustriosa/e0sgibol7ek.md | 11 + .../videos/aindustriosa/eply147xqzw.md | 11 + .../videos/aindustriosa/fckzbnkm1hu.md | 11 + .../videos/aindustriosa/fuq5glfzmja.md | 11 + .../videos/aindustriosa/gtqkbhfsr-g.md | 11 + .../videos/aindustriosa/jgk0obo0a7e.md | 11 + .../videos/aindustriosa/kx2p4b1cxck.md | 11 + .../videos/aindustriosa/lo6yuysnamu.md | 11 + .../videos/aindustriosa/m9beeq0osq8.md | 11 + .../videos/aindustriosa/nf8a-orqssi.md | 11 + .../videos/aindustriosa/nkcyw4gnrmg.md | 11 + .../videos/aindustriosa/nkeztnat9g4.md | 11 + .../videos/aindustriosa/ojfntjlmroo.md | 11 + .../videos/aindustriosa/ozy-ptjtpxu.md | 11 + .../videos/aindustriosa/p4jz9ramhse.md | 11 + .../videos/aindustriosa/pj5mekki06g.md | 11 + .../videos/aindustriosa/r-k0saprzpw.md | 11 + .../videos/aindustriosa/r1czgu-swsa.md | 11 + .../videos/aindustriosa/rezbm9lhdh4.md | 11 + .../videos/aindustriosa/rmtwdpjaheu.md | 11 + .../videos/aindustriosa/stf14pwimp4.md | 11 + .../videos/aindustriosa/tnmsrnwnpyw.md | 11 + .../videos/aindustriosa/up-hukomzco.md | 11 + .../videos/aindustriosa/vrgi0hr0dsk.md | 11 + .../videos/aindustriosa/vyni1x3qgi0.md | 11 + .../videos/aindustriosa/w3binwrun88.md | 11 + .../videos/aindustriosa/w40f9woatq4.md | 11 + .../videos/aindustriosa/ygde-hwi2-m.md | 11 + .../videos/aindustriosa/z1q7z6whz8a.md | 11 + src/content/videos/gdgvigo/85v3pl50yl4.md | 11 + src/content/videos/gdgvigo/rlcej7ob2yq.md | 11 + src/content/videos/gdgvigo/u4kykubpg6c.md | 11 + src/content/videos/phpvigo/2cx3zyjthmm.md | 11 + src/content/videos/phpvigo/304ikjdidg8.md | 11 + src/content/videos/phpvigo/3n3ak0dyjq4.md | 11 + src/content/videos/phpvigo/3wsdxmk9miw.md | 11 + src/content/videos/phpvigo/4hsgawqb20g.md | 11 + src/content/videos/phpvigo/7eq6wcsi6ik.md | 11 + src/content/videos/phpvigo/8mrfrbyffpm.md | 11 + src/content/videos/phpvigo/bteb03r2hpo.md | 11 + src/content/videos/phpvigo/cb3fhly1sc4.md | 11 + src/content/videos/phpvigo/d2vqjesbl-e.md | 11 + src/content/videos/phpvigo/dz8gidh9j9k.md | 11 + src/content/videos/phpvigo/fzxgpe6ki3g.md | 11 + src/content/videos/phpvigo/gibqyfj2k5g.md | 11 + src/content/videos/phpvigo/iyj-extcbyq.md | 11 + src/content/videos/phpvigo/kojcoyysprm.md | 11 + src/content/videos/phpvigo/kwydgooyo2o.md | 11 + src/content/videos/phpvigo/loq7ztwd5ti.md | 11 + src/content/videos/phpvigo/lvk88gcu7-q.md | 11 + src/content/videos/phpvigo/nbep64e8dzq.md | 11 + src/content/videos/phpvigo/nftbtvstshe.md | 11 + src/content/videos/phpvigo/nkrt5d-jzti.md | 11 + src/content/videos/phpvigo/nxktclql-oy.md | 11 + src/content/videos/phpvigo/o8-24tjp-2o.md | 11 + src/content/videos/phpvigo/ouz-mqfccuy.md | 11 + src/content/videos/phpvigo/p4vdylusqhw.md | 11 + src/content/videos/phpvigo/q4vl54asnai.md | 11 + src/content/videos/phpvigo/qkrdzyq6oai.md | 11 + src/content/videos/phpvigo/rffmsqrfml8.md | 11 + src/content/videos/phpvigo/sclgm6jitik.md | 11 + src/content/videos/phpvigo/svqewpbjkva.md | 11 + src/content/videos/phpvigo/tugzwmsf-mk.md | 11 + src/content/videos/phpvigo/txwbsvm2rx0.md | 11 + src/content/videos/phpvigo/uc1f88sgfji.md | 11 + src/content/videos/phpvigo/udzna9mbibw.md | 11 + src/content/videos/phpvigo/ufgsmaza42c.md | 11 + src/content/videos/phpvigo/uhpfamewhds.md | 11 + src/content/videos/phpvigo/umssjhe5yg0.md | 11 + src/content/videos/phpvigo/vvbdoctin44.md | 11 + src/content/videos/phpvigo/wyluexr7v-m.md | 11 + src/content/videos/phpvigo/ylwj3n6hjxy.md | 11 + src/content/videos/phpvigo/yzoyqg1niro.md | 11 + src/content/videos/phpvigo/z-k5iusjcdo.md | 11 + src/content/videos/phpvigo/zix6z-xyn90.md | 11 + src/content/videos/phpvigo/zizo5kqm-ku.md | 11 + src/content/videos/pythonvigo/09hftif-fae.md | 11 + src/content/videos/pythonvigo/1d7vqkrgdt4.md | 11 + src/content/videos/pythonvigo/2qqrao0zioc.md | 11 + src/content/videos/pythonvigo/2x72htztglu.md | 11 + src/content/videos/pythonvigo/49klm6h8sg8.md | 11 + src/content/videos/pythonvigo/6nirycubxpk.md | 11 + src/content/videos/pythonvigo/7u7veo8ahlk.md | 11 + src/content/videos/pythonvigo/9dptfapk8co.md | 11 + src/content/videos/pythonvigo/9p7qyb7leba.md | 11 + src/content/videos/pythonvigo/cfq-1h7bxjk.md | 11 + src/content/videos/pythonvigo/d5vmtg95ov0.md | 11 + src/content/videos/pythonvigo/d7y88pmfnoe.md | 11 + src/content/videos/pythonvigo/ef4lltomzkw.md | 11 + src/content/videos/pythonvigo/ftzawsabxc0.md | 11 + src/content/videos/pythonvigo/fwgppsiyg-o.md | 11 + src/content/videos/pythonvigo/gqvhybceimy.md | 11 + src/content/videos/pythonvigo/hjx-lqllrhw.md | 11 + src/content/videos/pythonvigo/hqxbvk4vi9m.md | 11 + src/content/videos/pythonvigo/iy-6vy-m60y.md | 11 + src/content/videos/pythonvigo/l8org4kzboi.md | 11 + src/content/videos/pythonvigo/lms4x-1cz-c.md | 11 + src/content/videos/pythonvigo/m8s3styumfs.md | 11 + src/content/videos/pythonvigo/micqgdqrzxm.md | 11 + src/content/videos/pythonvigo/npstutu8qxc.md | 11 + src/content/videos/pythonvigo/omst3ju-rjq.md | 11 + src/content/videos/pythonvigo/phkmzaax3ha.md | 11 + src/content/videos/pythonvigo/pw97r0eo7so.md | 11 + src/content/videos/pythonvigo/q7c9-yq6wk.md | 11 + src/content/videos/pythonvigo/q9c0dqteyc8.md | 11 + src/content/videos/pythonvigo/qfxsn-fc0nq.md | 11 + src/content/videos/pythonvigo/qwf0qd26gwm.md | 11 + src/content/videos/pythonvigo/qwhoyvluk-u.md | 11 + src/content/videos/pythonvigo/rodhalbfano.md | 11 + src/content/videos/pythonvigo/sy233urmikm.md | 11 + src/content/videos/pythonvigo/t1wih6hs-yw.md | 11 + src/content/videos/pythonvigo/v-ctyi8ooli.md | 11 + src/content/videos/pythonvigo/wrl5h0tmq-w.md | 11 + src/content/videos/pythonvigo/xn98drgum7s.md | 11 + src/content/videos/pythonvigo/y-w9t8kwnz4.md | 11 + src/content/videos/pythonvigo/yqzx2m7ay.md | 11 + src/content/videos/pythonvigo/z-azc6hkzk8.md | 11 + src/content/videos/vigojug/4vdhl-s-fga.md | 11 + src/content/videos/vigojug/4wltqdk0asm.md | 11 + src/content/videos/vigojug/4yvsszmhtzo.md | 11 + src/content/videos/vigojug/5braph5bypy.md | 11 + src/content/videos/vigojug/7aiu-wlhlgk.md | 11 + src/content/videos/vigojug/7q-t-tbupcs.md | 11 + src/content/videos/vigojug/8643werug-s.md | 11 + src/content/videos/vigojug/9-zms-8-01a.md | 11 + src/content/videos/vigojug/ajkifnwjug0.md | 11 + src/content/videos/vigojug/d-k35eeivca.md | 11 + src/content/videos/vigojug/ftsdoh5g2nm.md | 11 + src/content/videos/vigojug/fx1fzzphavu.md | 11 + src/content/videos/vigojug/gqrj-vh7mr8.md | 11 + src/content/videos/vigojug/jl7pegkda4s.md | 11 + src/content/videos/vigojug/jokts-f4pts.md | 11 + src/content/videos/vigojug/jvfig1ukawc.md | 11 + src/content/videos/vigojug/k6s9w8iton0.md | 11 + src/content/videos/vigojug/khdve9foa-u.md | 11 + src/content/videos/vigojug/km9yicqhtps.md | 11 + src/content/videos/vigojug/l25ryirmtyq.md | 11 + src/content/videos/vigojug/mewdxxkjgsy.md | 11 + src/content/videos/vigojug/mtcimjbfej0.md | 11 + src/content/videos/vigojug/nvhjthobq5i.md | 11 + src/content/videos/vigojug/pkqtlj38x7m.md | 11 + src/content/videos/vigojug/plsc3jnbx5o.md | 11 + src/content/videos/vigojug/se0ov3v11mm.md | 11 + src/content/videos/vigojug/shw-mdfmqfa.md | 11 + src/content/videos/vigojug/smg2p6esvnc.md | 11 + src/content/videos/vigojug/tx-ji5ftxpq.md | 11 + src/content/videos/vigojug/vyo-e3a9hlg.md | 11 + src/content/videos/vigojug/w-kkwegct0.md | 11 + src/content/videos/vigojug/wheiaflsayw.md | 11 + src/content/videos/vigojug/xe4q7ocbxy8.md | 11 + src/content/videos/vigojug/xyztcy5wqnc.md | 11 + src/content/videos/vigojug/z-4up8hzjlq.md | 11 + src/content/videos/vigojug/z1namxsblmi.md | 11 + .../videos/vigowordpress/0sjwsqqywq8.md | 11 + .../videos/vigowordpress/34nkuicspsm.md | 11 + .../videos/vigowordpress/axgsnbt9a3m.md | 11 + .../videos/vigowordpress/bqhakj6y7-q.md | 11 + .../videos/vigowordpress/cpgi6sqmbnw.md | 11 + .../videos/vigowordpress/cqamk4jm5y0.md | 11 + .../videos/vigowordpress/djlp6vgnttu.md | 11 + .../videos/vigowordpress/dujalqnvve8.md | 11 + .../videos/vigowordpress/evo7vic0b80.md | 11 + .../videos/vigowordpress/gbqce-yn7bi.md | 11 + .../videos/vigowordpress/ic-typrnn6u.md | 11 + .../videos/vigowordpress/il-zcyigfuo.md | 11 + .../videos/vigowordpress/iwd72h69xqo.md | 11 + .../videos/vigowordpress/kl6cev339mo.md | 11 + .../videos/vigowordpress/kpsqflq9dpq.md | 11 + .../videos/vigowordpress/kstyiqqofae.md | 11 + .../videos/vigowordpress/l6asdje-2vc.md | 11 + .../videos/vigowordpress/llac-qs9fj8.md | 11 + .../videos/vigowordpress/lu3cuxdgegw.md | 11 + .../videos/vigowordpress/o-z-8jx5eok.md | 11 + .../videos/vigowordpress/oq-hsvww4hi.md | 11 + .../videos/vigowordpress/oxqql7jxcgi.md | 11 + .../videos/vigowordpress/p4qkypydt3s.md | 11 + .../videos/vigowordpress/quj83yrodhs.md | 11 + .../videos/vigowordpress/rtnoqecgakc.md | 11 + .../videos/vigowordpress/t8ecwcrslsa.md | 11 + .../videos/vigowordpress/umjgn-gtid0.md | 11 + .../videos/vigowordpress/wjvxjbgmk9a.md | 11 + .../videos/vigowordpress/wn3dyenpw4m.md | 11 + .../videos/vigowordpress/x-j-xwr3dwc.md | 11 + .../videos/vigowordpress/yhyx0ao6zci.md | 11 + .../videos/vigowordpress/yx79lpgolku.md | 11 + .../videos/vigowordpress/z7uyexby9ra.md | 11 + src/i18n/calendar.ts | 16 + src/i18n/config.ts | 9 + src/i18n/doc-page.ts | 38 + src/i18n/footer.ts | 11 + src/i18n/groups.ts | 19 + src/i18n/header.ts | 11 + src/i18n/home-conversation.ts | 24 + src/i18n/home-documents.ts | 5 + src/i18n/home-friends.ts | 5 + src/i18n/home-groups.ts | 7 + src/i18n/home-hero.ts | 10 + src/i18n/home-videos-preview.ts | 11 + src/i18n/home-videos.ts | 8 + src/i18n/theme-toggle.ts | 8 + src/i18n/videos-browser.ts | 11 + src/layouts/BaseLayout.astro | 104 + src/lib/base-path.ts | 42 + src/lib/vigotech/calendar.ts | 110 + src/lib/vigotech/documents.ts | 33 + src/lib/vigotech/selectors.ts | 47 + src/lib/vigotech/socials.ts | 98 + src/lib/vigotech/source.ts | 82 + src/pages/[doc].astro | 125 + src/pages/api/calendar.json.ts | 31 + src/pages/groups.astro | 12 + src/pages/index.astro | 38 + src/pages/videos.astro | 14 + src/styles/global.css | 677 + src/utils/__tests__/sum.test.ts | 9 + src/utils/sum.ts | 1 + static/README.md | 10 - static/bg.jpg | Bin 5224736 -> 0 bytes static/gcalendar/css/fullcalendar.min.css | 5 - .../gcalendar/css/fullcalendar.print.min.css | 5 - .../gcalendar/css/fullcalendar.vigotech.css | 49 - .../css/fullcalendar.vigotech.css.map | 7 - static/gcalendar/gcal.html | 93 - static/gcalendar/js/fullcalendar.min.js | 10 - static/gcalendar/js/gcal.js | 180 - static/gcalendar/js/gcal.min.js | 6 - static/gcalendar/js/lib/jquery.min.js | 4 - static/gcalendar/js/lib/moment.min.js | 7 - static/gcalendar/js/locale-all.js | 5 - static/logo-h.png | Bin 26716 -> 0 bytes static/logo-h.svg | 173 - static/logo.png | Bin 6256 -> 0 bytes static/logo.svg | 161 - static/logo_white.jpg | Bin 92023 -> 0 bytes store/README.md | 10 - store/index.js | 225 - test/setup.ts | 1 + tsconfig.json | 5 + vitest.config.ts | 21 + yarn.lock | 10370 ---------------- 410 files changed, 22207 insertions(+), 14773 deletions(-) create mode 100644 .agents/DESIGN.md delete mode 100644 .editorconfig delete mode 100644 .eslintrc.js create mode 100644 .github/copilot-instructions.md create mode 100644 .github/workflows/deploy-pages.yml delete mode 100644 .github/workflows/gh-pages.yml create mode 100644 .oxfmtrc.json create mode 100644 .oxlintrc.json create mode 100644 .stitch/code-conduct-mobile.html create mode 100644 .stitch/code-conduct-mobile.png create mode 100644 .stitch/groups-mobile.html create mode 100644 .stitch/groups-mobile.png create mode 100644 .stitch/home-desktop.html create mode 100644 .stitch/home-desktop.png create mode 100644 .stitch/video-library-mobile.html create mode 100644 .stitch/video-library-mobile.png create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json delete mode 100644 LICENSE delete mode 100644 assets/README.md delete mode 100644 assets/_calendar.scss delete mode 100644 assets/_conversation.scss delete mode 100644 assets/_cover.scss delete mode 100644 assets/_docs.scss delete mode 100644 assets/_elements.scss delete mode 100644 assets/_footer.scss delete mode 100644 assets/_friends.scss delete mode 100644 assets/_layout.scss delete mode 100644 assets/_made-with.scss delete mode 100644 assets/_members.scss delete mode 100644 assets/_menu.scss delete mode 100644 assets/_mixins.scss delete mode 100644 assets/_post.scss delete mode 100644 assets/_variables.scss delete mode 100644 assets/_videojs.scss delete mode 100644 assets/_videos.scss delete mode 100644 assets/fonts/vigotech.eot delete mode 100644 assets/fonts/vigotech.svg delete mode 100644 assets/fonts/vigotech.ttf delete mode 100644 assets/fonts/vigotech.woff delete mode 100644 assets/i/ivoox.svg delete mode 100644 assets/vigotech.scss create mode 100644 astro.config.mjs create mode 100644 commitlint.config.js delete mode 100644 components/CalendarSection.vue delete mode 100644 components/ConversationSection.vue delete mode 100644 components/CoverSection.vue delete mode 100644 components/Friend.vue delete mode 100644 components/FriendsSection.vue delete mode 100644 components/Menu.vue delete mode 100644 components/PageHeader.vue delete mode 100644 components/VideosSection.vue delete mode 100644 components/VigotechCurrentEvents.vue delete mode 100644 components/VigotechDocsSection.vue delete mode 100644 components/VigotechMember.vue delete mode 100644 components/VigotechMemberList.vue delete mode 100644 components/VigotechMembersSection.vue delete mode 100644 components/VigotechNextEvent.vue delete mode 100644 components/VigotechNextEventTip.vue delete mode 100644 components/VigotechVideoPlayer.vue delete mode 100644 config.json delete mode 100644 layouts/README.md delete mode 100644 layouts/default.vue create mode 100644 lefthook.yml delete mode 100644 markdown/index.js delete mode 100644 markdown/legal.md delete mode 100644 markdown/test.md delete mode 100644 middleware/README.md delete mode 100644 nuxt.config.js delete mode 100644 pages/README.md delete mode 100644 pages/index.vue delete mode 100644 pages/post/_slug.vue delete mode 100644 pages/videos.vue create mode 100644 playwright.config.ts create mode 100644 playwright/home.spec.ts delete mode 100644 plugins/README.md delete mode 100644 plugins/cookies.js delete mode 100644 plugins/ga.js delete mode 100644 plugins/localStorage.js delete mode 100644 plugins/moment.js delete mode 100644 plugins/nuxt-video-player-plugin.js delete mode 100644 plugins/scrollTo.js delete mode 100644 plugins/scrollactive.js delete mode 100644 plugins/sticky.js create mode 100644 pnpm-lock.yaml delete mode 100644 prepare-json.js rename {static => public}/CNAME (100%) rename {static => public}/favicon.ico (100%) create mode 100644 public/favicon.svg create mode 100644 public/fonts/instrument-serif-latin-italic.woff2 create mode 100644 public/fonts/instrument-serif-latin.woff2 create mode 100644 public/fonts/inter-latin.woff2 create mode 100644 public/fonts/space-grotesk-latin.woff2 rename {static => public}/friends-schema.json (88%) rename {static => public}/friends.json (100%) rename {static => public}/friends/compostelatech.jpg (100%) rename {static => public}/friends/copenhagen.jpg (100%) rename {static => public}/friends/madridtech.jpg (100%) rename {static => public}/friends/riojatech.png (100%) rename {static/images => public/images/groups}/agile_vigo.jpg (100%) rename {static/images => public/images/groups}/aindustriosa.png (100%) rename {static/images => public/images/groups}/blockchaingal.png (100%) rename {static/images => public/images/groups}/craftersVigo.png (100%) rename {static/images => public/images/groups}/galpon.png (100%) rename {static/images => public/images/groups}/galstech.png (100%) rename {static/images => public/images/groups}/gdg_vigo.png (100%) rename {static/images => public/images/groups}/joomla_vigo.png (100%) rename {static/images => public/images/groups}/jsvigo.png (100%) rename {static/images => public/images/groups}/php_vigo.jpg (100%) rename {static/images => public/images/groups}/python_vigo.png (100%) rename {static/images => public/images/groups}/seogalicia.png (100%) rename {static/images => public/images/groups}/sysadmin_galicia.jpg (100%) rename {static/images => public/images/groups}/ux_gal.jpg (100%) rename {static/images => public/images/groups}/vigoadg.jpg (100%) rename {static/images => public/images/groups}/vigobrain.png (100%) rename {static/images => public/images/groups}/vigojug.jpg (100%) rename {static/images => public/images/groups}/vigowordpress.png (100%) rename {static/images => public/images/groups}/wordpress-pontevedra.png (100%) rename {static => public}/slack.png (100%) rename {static => public}/vigotech-events-schema.json (91%) create mode 100644 public/vigotech-generated.json rename {static => public}/vigotech-schema.json (89%) rename {static => public}/vigotech.json (95%) create mode 100644 scripts/dev.mjs create mode 100644 scripts/generate-vigotech-json.mjs create mode 100644 src/assets/logo.svg create mode 100644 src/components/groups/GroupCard.astro create mode 100644 src/components/groups/GroupsBrowser.astro create mode 100644 src/components/home/CalendarSection.astro create mode 100644 src/components/home/ConversationSection.astro create mode 100644 src/components/home/DocumentsSection.astro create mode 100644 src/components/home/FriendsSection.astro create mode 100644 src/components/home/GroupsSection.astro create mode 100644 src/components/home/HeroSection.astro create mode 100644 src/components/home/UpcomingEventsPanel.astro create mode 100644 src/components/home/VideosSection.astro create mode 100644 src/components/home/upcoming-event-card/UpcomingEventCard.astro create mode 100644 src/components/home/upcoming-event-card/UpcomingEventCardContent.astro create mode 100644 src/components/layout/Footer.astro create mode 100644 src/components/layout/Header.astro create mode 100644 src/components/shaders/ConversationShader.astro create mode 100644 src/components/shaders/HeroShader.astro create mode 100644 src/components/theme/ThemeScript.astro create mode 100644 src/components/theme/ThemeToggle.astro create mode 100644 src/components/ui/FloatingHeader.astro create mode 100644 src/components/ui/GroupLogo.astro create mode 100644 src/components/videos/VideosBrowser.astro create mode 100644 src/config/menu.ts create mode 100644 src/content.config.ts create mode 100644 src/content/events/pythonvigo/pythonvigo-1671130800000-reunion-diciembre-2022.md create mode 100644 src/content/events/vigowordpress/vigowordpress-1774548000000-posicionando-sin-ia-en-tiempos-de-ia.md create mode 100644 src/content/videos/aindustriosa/33xt39a-cec.md create mode 100644 src/content/videos/aindustriosa/37xmhgwkuae.md create mode 100644 src/content/videos/aindustriosa/50trtscnuis.md create mode 100644 src/content/videos/aindustriosa/7mvk7obsv80.md create mode 100644 src/content/videos/aindustriosa/7okgu70odti.md create mode 100644 src/content/videos/aindustriosa/9ga8hhu1dig.md create mode 100644 src/content/videos/aindustriosa/9p2kho8rjw0.md create mode 100644 src/content/videos/aindustriosa/9u0djwikyga.md create mode 100644 src/content/videos/aindustriosa/b6erbdjfbwg.md create mode 100644 src/content/videos/aindustriosa/bmmg6o0i4ei.md create mode 100644 src/content/videos/aindustriosa/br0vvthan6o.md create mode 100644 src/content/videos/aindustriosa/crs2ofs-aqw.md create mode 100644 src/content/videos/aindustriosa/dntvdxvmlqy.md create mode 100644 src/content/videos/aindustriosa/e-3kozcmwbu.md create mode 100644 src/content/videos/aindustriosa/e0sgibol7ek.md create mode 100644 src/content/videos/aindustriosa/eply147xqzw.md create mode 100644 src/content/videos/aindustriosa/fckzbnkm1hu.md create mode 100644 src/content/videos/aindustriosa/fuq5glfzmja.md create mode 100644 src/content/videos/aindustriosa/gtqkbhfsr-g.md create mode 100644 src/content/videos/aindustriosa/jgk0obo0a7e.md create mode 100644 src/content/videos/aindustriosa/kx2p4b1cxck.md create mode 100644 src/content/videos/aindustriosa/lo6yuysnamu.md create mode 100644 src/content/videos/aindustriosa/m9beeq0osq8.md create mode 100644 src/content/videos/aindustriosa/nf8a-orqssi.md create mode 100644 src/content/videos/aindustriosa/nkcyw4gnrmg.md create mode 100644 src/content/videos/aindustriosa/nkeztnat9g4.md create mode 100644 src/content/videos/aindustriosa/ojfntjlmroo.md create mode 100644 src/content/videos/aindustriosa/ozy-ptjtpxu.md create mode 100644 src/content/videos/aindustriosa/p4jz9ramhse.md create mode 100644 src/content/videos/aindustriosa/pj5mekki06g.md create mode 100644 src/content/videos/aindustriosa/r-k0saprzpw.md create mode 100644 src/content/videos/aindustriosa/r1czgu-swsa.md create mode 100644 src/content/videos/aindustriosa/rezbm9lhdh4.md create mode 100644 src/content/videos/aindustriosa/rmtwdpjaheu.md create mode 100644 src/content/videos/aindustriosa/stf14pwimp4.md create mode 100644 src/content/videos/aindustriosa/tnmsrnwnpyw.md create mode 100644 src/content/videos/aindustriosa/up-hukomzco.md create mode 100644 src/content/videos/aindustriosa/vrgi0hr0dsk.md create mode 100644 src/content/videos/aindustriosa/vyni1x3qgi0.md create mode 100644 src/content/videos/aindustriosa/w3binwrun88.md create mode 100644 src/content/videos/aindustriosa/w40f9woatq4.md create mode 100644 src/content/videos/aindustriosa/ygde-hwi2-m.md create mode 100644 src/content/videos/aindustriosa/z1q7z6whz8a.md create mode 100644 src/content/videos/gdgvigo/85v3pl50yl4.md create mode 100644 src/content/videos/gdgvigo/rlcej7ob2yq.md create mode 100644 src/content/videos/gdgvigo/u4kykubpg6c.md create mode 100644 src/content/videos/phpvigo/2cx3zyjthmm.md create mode 100644 src/content/videos/phpvigo/304ikjdidg8.md create mode 100644 src/content/videos/phpvigo/3n3ak0dyjq4.md create mode 100644 src/content/videos/phpvigo/3wsdxmk9miw.md create mode 100644 src/content/videos/phpvigo/4hsgawqb20g.md create mode 100644 src/content/videos/phpvigo/7eq6wcsi6ik.md create mode 100644 src/content/videos/phpvigo/8mrfrbyffpm.md create mode 100644 src/content/videos/phpvigo/bteb03r2hpo.md create mode 100644 src/content/videos/phpvigo/cb3fhly1sc4.md create mode 100644 src/content/videos/phpvigo/d2vqjesbl-e.md create mode 100644 src/content/videos/phpvigo/dz8gidh9j9k.md create mode 100644 src/content/videos/phpvigo/fzxgpe6ki3g.md create mode 100644 src/content/videos/phpvigo/gibqyfj2k5g.md create mode 100644 src/content/videos/phpvigo/iyj-extcbyq.md create mode 100644 src/content/videos/phpvigo/kojcoyysprm.md create mode 100644 src/content/videos/phpvigo/kwydgooyo2o.md create mode 100644 src/content/videos/phpvigo/loq7ztwd5ti.md create mode 100644 src/content/videos/phpvigo/lvk88gcu7-q.md create mode 100644 src/content/videos/phpvigo/nbep64e8dzq.md create mode 100644 src/content/videos/phpvigo/nftbtvstshe.md create mode 100644 src/content/videos/phpvigo/nkrt5d-jzti.md create mode 100644 src/content/videos/phpvigo/nxktclql-oy.md create mode 100644 src/content/videos/phpvigo/o8-24tjp-2o.md create mode 100644 src/content/videos/phpvigo/ouz-mqfccuy.md create mode 100644 src/content/videos/phpvigo/p4vdylusqhw.md create mode 100644 src/content/videos/phpvigo/q4vl54asnai.md create mode 100644 src/content/videos/phpvigo/qkrdzyq6oai.md create mode 100644 src/content/videos/phpvigo/rffmsqrfml8.md create mode 100644 src/content/videos/phpvigo/sclgm6jitik.md create mode 100644 src/content/videos/phpvigo/svqewpbjkva.md create mode 100644 src/content/videos/phpvigo/tugzwmsf-mk.md create mode 100644 src/content/videos/phpvigo/txwbsvm2rx0.md create mode 100644 src/content/videos/phpvigo/uc1f88sgfji.md create mode 100644 src/content/videos/phpvigo/udzna9mbibw.md create mode 100644 src/content/videos/phpvigo/ufgsmaza42c.md create mode 100644 src/content/videos/phpvigo/uhpfamewhds.md create mode 100644 src/content/videos/phpvigo/umssjhe5yg0.md create mode 100644 src/content/videos/phpvigo/vvbdoctin44.md create mode 100644 src/content/videos/phpvigo/wyluexr7v-m.md create mode 100644 src/content/videos/phpvigo/ylwj3n6hjxy.md create mode 100644 src/content/videos/phpvigo/yzoyqg1niro.md create mode 100644 src/content/videos/phpvigo/z-k5iusjcdo.md create mode 100644 src/content/videos/phpvigo/zix6z-xyn90.md create mode 100644 src/content/videos/phpvigo/zizo5kqm-ku.md create mode 100644 src/content/videos/pythonvigo/09hftif-fae.md create mode 100644 src/content/videos/pythonvigo/1d7vqkrgdt4.md create mode 100644 src/content/videos/pythonvigo/2qqrao0zioc.md create mode 100644 src/content/videos/pythonvigo/2x72htztglu.md create mode 100644 src/content/videos/pythonvigo/49klm6h8sg8.md create mode 100644 src/content/videos/pythonvigo/6nirycubxpk.md create mode 100644 src/content/videos/pythonvigo/7u7veo8ahlk.md create mode 100644 src/content/videos/pythonvigo/9dptfapk8co.md create mode 100644 src/content/videos/pythonvigo/9p7qyb7leba.md create mode 100644 src/content/videos/pythonvigo/cfq-1h7bxjk.md create mode 100644 src/content/videos/pythonvigo/d5vmtg95ov0.md create mode 100644 src/content/videos/pythonvigo/d7y88pmfnoe.md create mode 100644 src/content/videos/pythonvigo/ef4lltomzkw.md create mode 100644 src/content/videos/pythonvigo/ftzawsabxc0.md create mode 100644 src/content/videos/pythonvigo/fwgppsiyg-o.md create mode 100644 src/content/videos/pythonvigo/gqvhybceimy.md create mode 100644 src/content/videos/pythonvigo/hjx-lqllrhw.md create mode 100644 src/content/videos/pythonvigo/hqxbvk4vi9m.md create mode 100644 src/content/videos/pythonvigo/iy-6vy-m60y.md create mode 100644 src/content/videos/pythonvigo/l8org4kzboi.md create mode 100644 src/content/videos/pythonvigo/lms4x-1cz-c.md create mode 100644 src/content/videos/pythonvigo/m8s3styumfs.md create mode 100644 src/content/videos/pythonvigo/micqgdqrzxm.md create mode 100644 src/content/videos/pythonvigo/npstutu8qxc.md create mode 100644 src/content/videos/pythonvigo/omst3ju-rjq.md create mode 100644 src/content/videos/pythonvigo/phkmzaax3ha.md create mode 100644 src/content/videos/pythonvigo/pw97r0eo7so.md create mode 100644 src/content/videos/pythonvigo/q7c9-yq6wk.md create mode 100644 src/content/videos/pythonvigo/q9c0dqteyc8.md create mode 100644 src/content/videos/pythonvigo/qfxsn-fc0nq.md create mode 100644 src/content/videos/pythonvigo/qwf0qd26gwm.md create mode 100644 src/content/videos/pythonvigo/qwhoyvluk-u.md create mode 100644 src/content/videos/pythonvigo/rodhalbfano.md create mode 100644 src/content/videos/pythonvigo/sy233urmikm.md create mode 100644 src/content/videos/pythonvigo/t1wih6hs-yw.md create mode 100644 src/content/videos/pythonvigo/v-ctyi8ooli.md create mode 100644 src/content/videos/pythonvigo/wrl5h0tmq-w.md create mode 100644 src/content/videos/pythonvigo/xn98drgum7s.md create mode 100644 src/content/videos/pythonvigo/y-w9t8kwnz4.md create mode 100644 src/content/videos/pythonvigo/yqzx2m7ay.md create mode 100644 src/content/videos/pythonvigo/z-azc6hkzk8.md create mode 100644 src/content/videos/vigojug/4vdhl-s-fga.md create mode 100644 src/content/videos/vigojug/4wltqdk0asm.md create mode 100644 src/content/videos/vigojug/4yvsszmhtzo.md create mode 100644 src/content/videos/vigojug/5braph5bypy.md create mode 100644 src/content/videos/vigojug/7aiu-wlhlgk.md create mode 100644 src/content/videos/vigojug/7q-t-tbupcs.md create mode 100644 src/content/videos/vigojug/8643werug-s.md create mode 100644 src/content/videos/vigojug/9-zms-8-01a.md create mode 100644 src/content/videos/vigojug/ajkifnwjug0.md create mode 100644 src/content/videos/vigojug/d-k35eeivca.md create mode 100644 src/content/videos/vigojug/ftsdoh5g2nm.md create mode 100644 src/content/videos/vigojug/fx1fzzphavu.md create mode 100644 src/content/videos/vigojug/gqrj-vh7mr8.md create mode 100644 src/content/videos/vigojug/jl7pegkda4s.md create mode 100644 src/content/videos/vigojug/jokts-f4pts.md create mode 100644 src/content/videos/vigojug/jvfig1ukawc.md create mode 100644 src/content/videos/vigojug/k6s9w8iton0.md create mode 100644 src/content/videos/vigojug/khdve9foa-u.md create mode 100644 src/content/videos/vigojug/km9yicqhtps.md create mode 100644 src/content/videos/vigojug/l25ryirmtyq.md create mode 100644 src/content/videos/vigojug/mewdxxkjgsy.md create mode 100644 src/content/videos/vigojug/mtcimjbfej0.md create mode 100644 src/content/videos/vigojug/nvhjthobq5i.md create mode 100644 src/content/videos/vigojug/pkqtlj38x7m.md create mode 100644 src/content/videos/vigojug/plsc3jnbx5o.md create mode 100644 src/content/videos/vigojug/se0ov3v11mm.md create mode 100644 src/content/videos/vigojug/shw-mdfmqfa.md create mode 100644 src/content/videos/vigojug/smg2p6esvnc.md create mode 100644 src/content/videos/vigojug/tx-ji5ftxpq.md create mode 100644 src/content/videos/vigojug/vyo-e3a9hlg.md create mode 100644 src/content/videos/vigojug/w-kkwegct0.md create mode 100644 src/content/videos/vigojug/wheiaflsayw.md create mode 100644 src/content/videos/vigojug/xe4q7ocbxy8.md create mode 100644 src/content/videos/vigojug/xyztcy5wqnc.md create mode 100644 src/content/videos/vigojug/z-4up8hzjlq.md create mode 100644 src/content/videos/vigojug/z1namxsblmi.md create mode 100644 src/content/videos/vigowordpress/0sjwsqqywq8.md create mode 100644 src/content/videos/vigowordpress/34nkuicspsm.md create mode 100644 src/content/videos/vigowordpress/axgsnbt9a3m.md create mode 100644 src/content/videos/vigowordpress/bqhakj6y7-q.md create mode 100644 src/content/videos/vigowordpress/cpgi6sqmbnw.md create mode 100644 src/content/videos/vigowordpress/cqamk4jm5y0.md create mode 100644 src/content/videos/vigowordpress/djlp6vgnttu.md create mode 100644 src/content/videos/vigowordpress/dujalqnvve8.md create mode 100644 src/content/videos/vigowordpress/evo7vic0b80.md create mode 100644 src/content/videos/vigowordpress/gbqce-yn7bi.md create mode 100644 src/content/videos/vigowordpress/ic-typrnn6u.md create mode 100644 src/content/videos/vigowordpress/il-zcyigfuo.md create mode 100644 src/content/videos/vigowordpress/iwd72h69xqo.md create mode 100644 src/content/videos/vigowordpress/kl6cev339mo.md create mode 100644 src/content/videos/vigowordpress/kpsqflq9dpq.md create mode 100644 src/content/videos/vigowordpress/kstyiqqofae.md create mode 100644 src/content/videos/vigowordpress/l6asdje-2vc.md create mode 100644 src/content/videos/vigowordpress/llac-qs9fj8.md create mode 100644 src/content/videos/vigowordpress/lu3cuxdgegw.md create mode 100644 src/content/videos/vigowordpress/o-z-8jx5eok.md create mode 100644 src/content/videos/vigowordpress/oq-hsvww4hi.md create mode 100644 src/content/videos/vigowordpress/oxqql7jxcgi.md create mode 100644 src/content/videos/vigowordpress/p4qkypydt3s.md create mode 100644 src/content/videos/vigowordpress/quj83yrodhs.md create mode 100644 src/content/videos/vigowordpress/rtnoqecgakc.md create mode 100644 src/content/videos/vigowordpress/t8ecwcrslsa.md create mode 100644 src/content/videos/vigowordpress/umjgn-gtid0.md create mode 100644 src/content/videos/vigowordpress/wjvxjbgmk9a.md create mode 100644 src/content/videos/vigowordpress/wn3dyenpw4m.md create mode 100644 src/content/videos/vigowordpress/x-j-xwr3dwc.md create mode 100644 src/content/videos/vigowordpress/yhyx0ao6zci.md create mode 100644 src/content/videos/vigowordpress/yx79lpgolku.md create mode 100644 src/content/videos/vigowordpress/z7uyexby9ra.md create mode 100644 src/i18n/calendar.ts create mode 100644 src/i18n/config.ts create mode 100644 src/i18n/doc-page.ts create mode 100644 src/i18n/footer.ts create mode 100644 src/i18n/groups.ts create mode 100644 src/i18n/header.ts create mode 100644 src/i18n/home-conversation.ts create mode 100644 src/i18n/home-documents.ts create mode 100644 src/i18n/home-friends.ts create mode 100644 src/i18n/home-groups.ts create mode 100644 src/i18n/home-hero.ts create mode 100644 src/i18n/home-videos-preview.ts create mode 100644 src/i18n/home-videos.ts create mode 100644 src/i18n/theme-toggle.ts create mode 100644 src/i18n/videos-browser.ts create mode 100644 src/layouts/BaseLayout.astro create mode 100644 src/lib/base-path.ts create mode 100644 src/lib/vigotech/calendar.ts create mode 100644 src/lib/vigotech/documents.ts create mode 100644 src/lib/vigotech/selectors.ts create mode 100644 src/lib/vigotech/socials.ts create mode 100644 src/lib/vigotech/source.ts create mode 100644 src/pages/[doc].astro create mode 100644 src/pages/api/calendar.json.ts create mode 100644 src/pages/groups.astro create mode 100644 src/pages/index.astro create mode 100644 src/pages/videos.astro create mode 100644 src/styles/global.css create mode 100644 src/utils/__tests__/sum.test.ts create mode 100644 src/utils/sum.ts delete mode 100644 static/README.md delete mode 100644 static/bg.jpg delete mode 100644 static/gcalendar/css/fullcalendar.min.css delete mode 100644 static/gcalendar/css/fullcalendar.print.min.css delete mode 100644 static/gcalendar/css/fullcalendar.vigotech.css delete mode 100644 static/gcalendar/css/fullcalendar.vigotech.css.map delete mode 100644 static/gcalendar/gcal.html delete mode 100644 static/gcalendar/js/fullcalendar.min.js delete mode 100644 static/gcalendar/js/gcal.js delete mode 100644 static/gcalendar/js/gcal.min.js delete mode 100644 static/gcalendar/js/lib/jquery.min.js delete mode 100644 static/gcalendar/js/lib/moment.min.js delete mode 100644 static/gcalendar/js/locale-all.js delete mode 100644 static/logo-h.png delete mode 100644 static/logo-h.svg delete mode 100644 static/logo.png delete mode 100644 static/logo.svg delete mode 100644 static/logo_white.jpg delete mode 100644 store/README.md delete mode 100644 store/index.js create mode 100644 test/setup.ts create mode 100644 tsconfig.json create mode 100644 vitest.config.ts delete mode 100644 yarn.lock 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 ccf8e687..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 + +
+
+
+ + + + + + + + diff --git a/.stitch/code-conduct-mobile.png b/.stitch/code-conduct-mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..c999d16483ceba9bb7eac86d0b54c2d899bf31cc GIT binary patch literal 24583 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 + + + + + + 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 0000000000000000000000000000000000000000..bc3dfcc0cc72354aba7d4e9848451c12ee739dd0 GIT binary patch literal 18642 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 + + + + + + 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 0000000000000000000000000000000000000000..032dcf4a3567e679ef1a172d82abff03ff074fa7 GIT binary patch literal 37841 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 Cd7bY7 literal 0 HcmV?d00001 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 505dfe22cd34bfc7924e980ceec875cf9e798396..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1660 zcmaJ>O>7%g5T3X1?b}`3S+8ra*D-eF+KEj{{Szm)3#1`bv{EP~#igmZK(>zSM8w|6 zaim!4ffI-di5@5@oDj5E&LH*BQ{lh~wG!8eQ^kb~J@8XAZ@p3DD(Xn@y>Di|nR#B% zo9i6lHyMC{1fxRWCJ~mmE{@s-cPP&O<;TzZ0Cd=Z1~|~h=s(?;#zIA?JaBN*H4g?K>gj8 zy}gB}fx0-=)@J|OPk-N8Kz$cLN~|~SwZJ!@?E%m)&|h6g1OJlVNBtMnC)eA(UG<@; zNdH7VvgtHzc#)(57(+eKws*H60C!Nw8j$MP?dIN_+CQk5u*Sz*&UO#)i6Z|X{6M7- z$xXm7EbU36!so-2`~kB>6TCx0M9L9a1b77W-rycAQe5a0-{L@0E)dnkN}z9eQkRtg z2B*;O0~P;V32muIF!*mUaH9?|8T@WBj60l{06|vpkPVxo_OeTP%6q zZ}ASc!>8~qK==g76i97>)~Zo!f>=?m=p=KzT&*pTT!H3hv(;KPn<=F;X|C|-%mkgC z(g|{0av53Z&J{>5n^u&9aAYuJf|wDJPPj!Ll9SWfTvp`9ByOlEP?;x{EYHZI?r5rE zi7NN=P>2Oi&YyqDc!9}Loikp#u`I1CI@b-Vzk2D~EA%+!G(1K~;22RQ<@EdgH=g_$ zDaQRwwdN8$#FKMTjRoQbQ#Q4)<**i;i&G|)6?q!e23V7L%}$=pRqZGNDmG&4c)lQL(fnbVUqhE5%?ei6GV3- zWcUtnb_ut;k8V1A@8u<+plf(r3Gu3jDdMV!8R8ue%Q$IF4|BAi_plG*a6`NkrlCbg z&k#$9TOOu}PkWdlzV2Ze2OdrWH|tNqkc!?}QWE5JE-O!x3tv~X~D+~I9Q b56?BUU4=gGOYYde;EnwPeswX8o+JMQ-UQj@ 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 c14b2a620bb499f35a923bea69eaae7f146c281e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1496 zcmaJ>OK%%h6h3$EojVUZ<8kfrIA&~3?ZhUfe#D9G0%-^ptrV&fa3K{N$kcJ2h}aW3 zjucBQSb?aJU_n7)g@A5ZgT$gMV8IHtKcHe&v0(!X9yMnkQBxFgMsv@1Uf(%m-+O@o zKm^_a3bnPX)q3m{yM>_2oz!=)mzH_h( zQMipZ_5gd}^t*>IDu1C}!yfPMx_cv>6Gi;SivtzjA|HW>y$=Pi!-s(;zrq4hyu4#V zJj%yp1>gbDJCi%GLh;3z_gfr^?E|ly_gWYWH1)GAU~mroD##$8+ z$uB0uy5qbA2xi5O`2>L0(|*dMy#M!cGD(h6HH8LoblSt zHDOEAxTaI>*{e66p{FUQi77&&r-&>_=ieB=@bKGYH4|a7xoGh?&n~7E7R^))(NI1U z6H0n9Lz!SCSX`NVX;!CGW;sdjTdipxrRhdaq3Yc0Rjx9_6c~M2wl2;oX=U!BB}a7o zxvZqi*%e!l$mCOE>1WrTugAC^&z+lAQ%d6kA;g?&ZLC&hcB?jJ=+T2~7e?##HDfj= zr6bejq$noK(~-0kn>7?=EO9~NlnQ5F&dVwh4Nc0cMm5c3NnkwNFeOt=q!|&#Lc1(r z9{Ic4o{{C5c2&!YN=9c)&nRM6!yOdvgFjxo@4gvZ`W+(P@c_7YZAN{h!ySO<5cgjo zSm*C&+?<{WcaNBYFs@<{32d)S@XsRx6_Su6nqMKpm%#m;Bj%tWST*=M+sRScOISYP;k1U3UQ6&;b{ZiHpx*y*u37b_e!+r3UNJg(2)=0tS$09x6~fvFb!; zyW88}afaBmi-YdN4mdD8G4ql;7}>qdZeUG+cUO7HO>7%Q6n?WaJG*N;>viq*I>wG%+p$Thf8xY;fi#4QMhaDNaUm5Fg1C-rN5tOB zaYQWj45C7UOF`j;fL^&Hap(a72TrJ!I8t${IKzRTnm6Nx1`#pVoB7`Nes}kc-)yX} z0|8t-3x08`KZyOf)wo=$01zE*TS9^-*sXTIbsf1L>Msd#Hot$n+u9S{m#7P0Ay#*H zd=0s;0F;D~Z+^SI+UvBo0qBotuL%i!{O(~7NdOi@Ju8HNK)>$wM+eBQpdJyT-vhGi zwuRp%)B{o;C+U9c0PC_>QBO$;!0kb+-$CvM)_zOK;q%7t*WJAlJ}>*nk0PSV8{~aZ zvA09zJJjEsp5$j(A_nS57qO0N0pC1)%<5W zt{v>+Md-sj@CiWp6v-4xeU;X0QD=@gQLdRJbFxyauabO`=9hA{dM%eJr!#4;@#x|l zU79xu`bg&rdZ9UAB>7xg(~827!HfxFM?^Yd7I{csP3Q7CksFi9P*I?|LaI5QQAOQ< zr<#_iaX$}*Sm5-^g(s}Xm>M-X$TrKg$Pw5a*?a#pRW7Ro> z`W9X(aUZiCh0%wF#Q6myW-Odf=zc5pOj5J-*Pa{uueCgtpvFhnmaS=iyGB) zgb-(@zO_-(*{$-7Z3PaloEvRc8uolpi}_~@5mk*8X8kcOIBy%qSmTPuDOFBgO6xwN z+NPHF*`*lMHHGnH)zKU^9AiXPGtGj6e&ml*Gpp;_X30#dM%-e|iW_RulrthH(XPyR3cN0GMVhCtRP2&~BTOOu}YaV8Z_dTrQzm@G_j{F4=`ydWC#XVsL zGA3H4SV7$NFhzXU!wm5a533M`l!rO;O%MBE89v)-yM5Okzz(#*#cSf?Z?M@J?(MjP z)MBv=o6vzF?4bi1FwY_sp?qxAv1GH;-QR5uv1kVy-G^Oh!SGnmb$2jIbvuL3ur=yz zr>>4u8*TR@_Ev;-S$l-lyO?GmJ8HoQ&u!$c!Wj1r`2ZKE4}d-5hd%mA{)_(ttr*KQ 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 @@ -