From 9c6537b92026e39bdca71851a361c269b5b8a8cb Mon Sep 17 00:00:00 2001 From: Alec Helmturner Date: Tue, 27 Feb 2024 15:29:17 -0600 Subject: [PATCH] feat: hack-night page (#18) * feat(hacknight-page): add initial hack night event page with resources and details * feat(hacknight-page): add date and time to event details * feat: hack-night page Adds react integration, a react Tabs component, and a /hack-night page Co-authored-by: CKCarr * chore: cleanup tab component * fix: correct Tabs component's `props` interface - ensures `value` is of type `string` - corrects element IDs (previous "[object Object]") - makes tabs accessible/keyboard navigable * fix: correct and clean up Tab component styles * chore: pin dependencies * chore: fix merge error * chore: unify hack-night pages Also made some minor updates to style/copy * feat: flesh out hack-night pages * chore: lock deps, update lockfile --------- Co-authored-by: CKCarr <119520583+CKCarr@users.noreply.github.com> Co-authored-by: CKCarr --- .github/workflows/deploy-frontend.yml | 6 +- astro.config.mjs | 3 +- package-lock.json | 581 +++++++++++++++++---- package.json | 12 +- public/techlahoma-icon.webp | Bin 0 -> 3210 bytes public/twd-hero-img.webp | Bin 0 -> 19930 bytes src/components/Tabs/index.tsx | 62 +++ src/components/hacknight/HackNightTabs.tsx | 28 + src/components/hacknight/ProjectsTab.tsx | 99 ++++ src/components/hacknight/ResourcesTab.tsx | 57 ++ src/components/hacknight/UpdatesTab.tsx | 44 ++ src/components/hacknight/styles.module.css | 87 +++ src/pages/hacknight.astro | 70 +++ src/pages/index.astro | 14 +- tsconfig.json | 2 + 15 files changed, 967 insertions(+), 98 deletions(-) create mode 100644 public/techlahoma-icon.webp create mode 100644 public/twd-hero-img.webp create mode 100644 src/components/Tabs/index.tsx create mode 100644 src/components/hacknight/HackNightTabs.tsx create mode 100644 src/components/hacknight/ProjectsTab.tsx create mode 100644 src/components/hacknight/ResourcesTab.tsx create mode 100644 src/components/hacknight/UpdatesTab.tsx create mode 100644 src/components/hacknight/styles.module.css create mode 100644 src/pages/hacknight.astro diff --git a/.github/workflows/deploy-frontend.yml b/.github/workflows/deploy-frontend.yml index c416428e..7b906481 100644 --- a/.github/workflows/deploy-frontend.yml +++ b/.github/workflows/deploy-frontend.yml @@ -26,9 +26,9 @@ jobs: - name: Install, build, and upload your site uses: withastro/action@v2 # with: - # path: . # The root location of your Astro project inside the repository. (optional) - # node-version: 18 # The specific version of Node that should be used to build your site. Defaults to 18. (optional) - # package-manager: pnpm@latest # The Node package manager that should be used to install dependencies and build your site. Automatically detected based on your lockfile. (optional) + # path: . # The root location of your Astro project inside the repository. (optional) + # node-version: 18 # The specific version of Node that should be used to build your site. Defaults to 18. (optional) + # package-manager: pnpm@latest # The Node package manager that should be used to install dependencies and build your site. Automatically detected based on your lockfile. (optional) deploy: needs: build diff --git a/astro.config.mjs b/astro.config.mjs index 30c346cf..a68da0f4 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,10 +1,11 @@ import { defineConfig } from 'astro/config'; import tailwind from '@astrojs/tailwind'; +import react from '@astrojs/react'; // https://astro.build/config export default defineConfig({ site: 'https://tulsawebdevs.github.io', - integrations: [tailwind()], + integrations: [tailwind(), react()], server: { host: true, }, diff --git a/package-lock.json b/package-lock.json index 830f1eff..0127f0ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,20 +8,26 @@ "name": "astro-starter", "version": "0.0.1", "dependencies": { + "@astrojs/react": "3.0.10", "@astrojs/tailwind": "5.1.0", + "@types/react": "18.2.55", + "@types/react-dom": "18.2.19", + "@zendeskgarden/container-tabs": "2.0.10", "astro": "4.4.5", + "react": "18.2.0", + "react-dom": "18.2.0", "tailwindcss": "3.4.1", - "vitest": "^1.3.1" + "vitest": "1.3.1" }, "devDependencies": { "@eslint/eslintrc": "3.0.2", "@eslint/js": "8.57.0", - "@playwright/test": "^1.41.2", + "@playwright/test": "1.41.2", "@types/eslint__eslintrc": "2.1.1", "@types/eslint__js": "8.42.3", "@types/eslint-config-prettier": "6.11.3", "@types/node": "20.11.20", - "@vitest/coverage-v8": "^1.3.1", + "@vitest/coverage-v8": "1.3.1", "eslint": "8.57.0", "eslint-config-airbnb": "19.0.4", "eslint-config-prettier": "9.1.0", @@ -111,6 +117,24 @@ "node": ">=18.14.1" } }, + "node_modules/@astrojs/react": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@astrojs/react/-/react-3.0.10.tgz", + "integrity": "sha512-uGRIwKMAn7tva2vxXMyoVIGxWFr0rjZ8ZWIlkTG/vIpnAjD2nM8Cz6B8j7yzj176jvl6gZ6xTbTVPm09aeK0Yw==", + "dependencies": { + "@vitejs/plugin-react": "^4.2.0", + "ultrahtml": "^1.3.0" + }, + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "@types/react": "^17.0.50 || ^18.0.21", + "@types/react-dom": "^17.0.17 || ^18.0.6", + "react": "^17.0.2 || ^18.0.0", + "react-dom": "^17.0.2 || ^18.0.0" + } + }, "node_modules/@astrojs/tailwind": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@astrojs/tailwind/-/tailwind-5.1.0.tgz", @@ -205,14 +229,6 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { "version": "7.23.6", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", @@ -253,14 +269,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-environment-visitor": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", @@ -444,11 +452,38 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz", + "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz", + "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/runtime": { "version": "7.23.9", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", - "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1313,9 +1348,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.56.3", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.3.tgz", - "integrity": "sha512-PvSf1wfv2wJpVIFUMSb+i4PvqNYkB9Rkp9ZDO3oaWzq4SKhsQk4mrMBr3ZH06I0hKrVGLBacmgl8JM4WVjb9dg==", + "version": "8.56.4", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.4.tgz", + "integrity": "sha512-lG1GLUnL5vuRBGb3MgWUWLdGMH2Hps+pERuyQXCfWozuGKdnhf9Pbg4pkcrVUHjKrU7Rl+GCZ/299ObBXZFAxg==", "dev": true, "dependencies": { "@types/estree": "*", @@ -1418,6 +1453,34 @@ "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true }, + "node_modules/@types/prop-types": { + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" + }, + "node_modules/@types/react": { + "version": "18.2.55", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.55.tgz", + "integrity": "sha512-Y2Tz5P4yz23brwm2d7jNon39qoAtMMmalOQv6+fEFt1mT+FcM3D841wDpoUvFXhaYenuROCy3FZYqdTjM7qVyA==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.19", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.19.tgz", + "integrity": "sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" + }, "node_modules/@types/semver": { "version": "7.5.8", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", @@ -1464,6 +1527,39 @@ } } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@typescript-eslint/parser": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.0.tgz", @@ -1586,6 +1682,18 @@ "balanced-match": "^1.0.0" } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", @@ -1601,6 +1709,27 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@typescript-eslint/utils": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.1.0.tgz", @@ -1626,6 +1755,39 @@ "eslint": "^8.56.0" } }, + "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@typescript-eslint/visitor-keys": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.0.tgz", @@ -1648,6 +1810,24 @@ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, + "node_modules/@vitejs/plugin-react": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", + "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==", + "dependencies": { + "@babel/core": "^7.23.5", + "@babel/plugin-transform-react-jsx-self": "^7.23.3", + "@babel/plugin-transform-react-jsx-source": "^7.23.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0" + } + }, "node_modules/@vitest/coverage-v8": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.3.1.tgz", @@ -1739,6 +1919,69 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@zendeskgarden/container-selection": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@zendeskgarden/container-selection/-/container-selection-3.0.9.tgz", + "integrity": "sha512-SQrRVgaEywZYgKT5/s9cAbUQK2c1zP0Dmjb/k03G2UKF8z0j4kZSK2sF1VedQXHIT4gDxEWNyjspJ9Z+3Kp4IA==", + "dependencies": { + "@babel/runtime": "^7.8.4", + "@zendeskgarden/container-utilities": "^2.0.0" + }, + "peerDependencies": { + "prop-types": "^15.6.1", + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@zendeskgarden/container-tabs": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@zendeskgarden/container-tabs/-/container-tabs-2.0.10.tgz", + "integrity": "sha512-M9UiY/AbNHPmjxtiLLEI1/C6STC/7QrVjeIW9OfnnysW1wBZANQv2QyQN11SVRFn/4YzWlrzLxuuUCLIhRwnCg==", + "dependencies": { + "@babel/runtime": "^7.8.4", + "@zendeskgarden/container-selection": "^3.0.9", + "@zendeskgarden/container-utilities": "^2.0.0" + }, + "peerDependencies": { + "prop-types": "^15.6.1", + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@zendeskgarden/container-utilities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@zendeskgarden/container-utilities/-/container-utilities-2.0.0.tgz", + "integrity": "sha512-pTVv25XafhwfpquxLlOsa7dd+BIra9dSIFrbFlILjgAFUYJsNvfqNNCq5/dKlnzuwj7djjzfZ55jZKzQewwAjQ==", + "dependencies": { + "@babel/runtime": "^7.8.4", + "@reach/auto-id": "^0.18.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@zendeskgarden/container-utilities/node_modules/@reach/auto-id": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@reach/auto-id/-/auto-id-0.18.0.tgz", + "integrity": "sha512-XwY1IwhM7mkHZFghhjiqjQ6dstbOdpbFLdggeke75u8/8icT8uEHLbovFUgzKjy9qPvYwZIB87rLiR8WdtOXCg==", + "dependencies": { + "@reach/utils": "0.18.0" + }, + "peerDependencies": { + "react": "^16.8.0 || 17.x", + "react-dom": "^16.8.0 || 17.x" + } + }, + "node_modules/@zendeskgarden/container-utilities/node_modules/@reach/auto-id/node_modules/@reach/utils": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@reach/utils/-/utils-0.18.0.tgz", + "integrity": "sha512-KdVMdpTgDyK8FzdKO9SCpiibuy/kbv3pwgfXshTI6tEcQT1OOwj7BAksnzGC0rPz0UholwC+AgkqEl3EJX3M1A==", + "peerDependencies": { + "react": "^16.8.0 || 17.x", + "react-dom": "^16.8.0 || 17.x" + } + }, "node_modules/acorn": { "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", @@ -2142,6 +2385,36 @@ "sharp": "^0.32.6" } }, + "node_modules/astro/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/astro/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/astro/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/asynciterator.prototype": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", @@ -2505,9 +2778,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001589", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001589.tgz", - "integrity": "sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg==", + "version": "1.0.30001591", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001591.tgz", + "integrity": "sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ==", "funding": [ { "type": "opencollective", @@ -2837,6 +3110,11 @@ "node": ">=4" } }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -3055,9 +3333,9 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, "node_modules/electron-to-chromium": { - "version": "1.4.681", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.681.tgz", - "integrity": "sha512-1PpuqJUFWoXZ1E54m8bsLPVYwIVCRzvaL+n5cjigGga4z854abDnFRc+cTa2th4S79kyGqya/1xoR7h+Y5G5lg==" + "version": "1.4.683", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.683.tgz", + "integrity": "sha512-FmopjiJjkUzqa5F5Sv+wxd8KimtCxyLFOFgRPwEeMLVmP+vHH/GjNGCuIYrCIchbMSiOe+nG/OPBbR/XoExBNA==" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -3394,15 +3672,6 @@ "eslint-plugin-import": "^2.25.2" } }, - "node_modules/eslint-config-airbnb-base/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-config-prettier": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", @@ -3436,9 +3705,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -3513,15 +3782,6 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-plugin-jsx-a11y": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", @@ -3632,15 +3892,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-plugin-unicorn": { "version": "51.0.1", "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-51.0.1.tgz", @@ -3741,6 +3992,33 @@ "node": ">=6" } }, + "node_modules/eslint-plugin-unicorn/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-plugin-unicorn/node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -3753,6 +4031,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/eslint-plugin-unicorn/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", @@ -5773,7 +6057,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -5834,6 +6117,39 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/make-dir/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/markdown-table": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", @@ -6781,6 +7097,39 @@ "node": ">=10" } }, + "node_modules/node-abi/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "optional": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + }, "node_modules/node-addon-api": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", @@ -7878,7 +8227,6 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -7962,11 +8310,41 @@ "node": ">=0.10.0" } }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "engines": { + "node": ">=0.10.0" + } }, "node_modules/read-cache": { "version": "1.0.0", @@ -8126,8 +8504,7 @@ "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/regexp-tree": { "version": "0.1.27", @@ -8872,6 +9249,14 @@ "suf-log": "^2.5.3" } }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, "node_modules/section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", @@ -8885,35 +9270,13 @@ } }, "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/set-function-length": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", @@ -8969,6 +9332,39 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/sharp/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "optional": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -9946,6 +10342,11 @@ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.4.0.tgz", "integrity": "sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==" }, + "node_modules/ultrahtml": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.5.3.tgz", + "integrity": "sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==" + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", diff --git a/package.json b/package.json index 07fa14f1..22d838d8 100644 --- a/package.json +++ b/package.json @@ -14,20 +14,26 @@ "lint": "npx eslint ." }, "dependencies": { + "@astrojs/react": "3.0.10", "@astrojs/tailwind": "5.1.0", + "@types/react": "18.2.55", + "@types/react-dom": "18.2.19", + "@zendeskgarden/container-tabs": "2.0.10", "astro": "4.4.5", + "react": "18.2.0", + "react-dom": "18.2.0", "tailwindcss": "3.4.1", - "vitest": "^1.3.1" + "vitest": "1.3.1" }, "devDependencies": { "@eslint/eslintrc": "3.0.2", "@eslint/js": "8.57.0", - "@playwright/test": "^1.41.2", + "@playwright/test": "1.41.2", "@types/eslint__eslintrc": "2.1.1", "@types/eslint__js": "8.42.3", "@types/eslint-config-prettier": "6.11.3", "@types/node": "20.11.20", - "@vitest/coverage-v8": "^1.3.1", + "@vitest/coverage-v8": "1.3.1", "eslint": "8.57.0", "eslint-config-airbnb": "19.0.4", "eslint-config-prettier": "9.1.0", diff --git a/public/techlahoma-icon.webp b/public/techlahoma-icon.webp new file mode 100644 index 0000000000000000000000000000000000000000..2a417da985adc0bdef2142316ae9bfb4103276d6 GIT binary patch literal 3210 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 Ye-h8n0RW1Ee-Z~T{!soOUpxW-0r3F)ZvX%Q literal 0 HcmV?d00001 diff --git a/public/twd-hero-img.webp b/public/twd-hero-img.webp new file mode 100644 index 0000000000000000000000000000000000000000..877dff16664bba52f7ab7dc622a3521ceabe25f8 GIT binary patch literal 19930 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 z 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 Kan#?++xj1kAUxFo literal 0 HcmV?d00001 diff --git a/src/components/Tabs/index.tsx b/src/components/Tabs/index.tsx new file mode 100644 index 00000000..c2f1bfa0 --- /dev/null +++ b/src/components/Tabs/index.tsx @@ -0,0 +1,62 @@ +import type { IUseTabsProps } from '@zendeskgarden/container-tabs'; +import { useTabs } from '@zendeskgarden/container-tabs'; +import { useMemo } from 'react'; + +type Tab = { + value: TValue; + title: string; + renderContent: () => JSX.Element; + disabled?: boolean; +}; + +export type TabsProps = { + tabs: Tab[]; +} & Omit>, 'tabs'>; + +export function Tabs(props: TabsProps) { + const { selectedValue, getTabListProps, getTabPanelProps, getTabProps } = + useTabs(props); + + const components = useMemo(() => { + const tabComponents = []; + const tabPanelComponents = []; + + props.tabs.forEach(({ renderContent, ...tab }) => { + tabComponents.push( +
  • + {tab.title} +
  • , + ); + + tabPanelComponents.push( +
    {renderContent()}
    , + ); + }); + + return { tabs: tabComponents, panels: tabPanelComponents }; + }, [getTabProps, getTabPanelProps, props.tabs, selectedValue]); + + const horizontal = 'flex flex-col'; + const vertical = 'flex flex-row'; + + const [containerDir, listDir] = + props.orientation === 'vertical' ? + [vertical, horizontal] + : [horizontal, vertical]; + + return ( +
    +
      + {components.tabs} +
    + {components.panels} +
    + ); +} diff --git a/src/components/hacknight/HackNightTabs.tsx b/src/components/hacknight/HackNightTabs.tsx new file mode 100644 index 00000000..625cedd1 --- /dev/null +++ b/src/components/hacknight/HackNightTabs.tsx @@ -0,0 +1,28 @@ +import { Tabs } from '../Tabs'; +import UpdatesTab from './UpdatesTab'; +import ProjectsTab from './ProjectsTab'; +import ResourcesTab from './ResourcesTab'; + +export default function HackNightTabs() { + return ( + , + }, + { + value: 'projets', + title: 'Projects', + renderContent: () => , + }, + { + value: 'resources', + title: 'Resources', + renderContent: () => , + }, + ]} + /> + ); +} diff --git a/src/components/hacknight/ProjectsTab.tsx b/src/components/hacknight/ProjectsTab.tsx new file mode 100644 index 00000000..af34a92f --- /dev/null +++ b/src/components/hacknight/ProjectsTab.tsx @@ -0,0 +1,99 @@ +import styles from './styles.module.css'; + +export default function () { + return ( +
    +
    +

    + TWD Voting System +

    +

    Active Since: February 14, 2024

    +
    +

    + We're building a voting system as the first feature of the new Tulsa + Web Devs Website! This is a greenfield opportunity to innovate and + create solutions that will shape the future of decision-making within + our organization. +

    +
    +

    + We're embarking on a mission to design and implement a modern internal + voting system that breaks away from traditional models. Our goal is to + find the best voting system that fosters inclusivity, accuracy, and + efficiency, ensuring that every voice is heard and represented. +

    +
    +

    + Why First-Past-the-Post Won't Cut It +

    +
    +

    + We recognize that the traditional first-past-the-post approach is + outdated and flawed. It often leads to misrepresentation, discourages + voter turnout, and fails to provide fair representation for all + stakeholders. We're here to challenge the status quo and explore + alternative voting systems that address these shortcomings head-on. +

    +
    +

    Exploring the Possibilities:

    +
    +
    + + Tip: Want to dive deeper into alternative voting methods? Check out{' '} + + this comprehensive guide! + + +
    +
    +
    +

    + We have a vast landscape of voting systems to explore, from the + tried-and-tested to the cutting-edge. Let's take a glimpse at some of + the avenues we'll be delving into: +

    +
    +
      +
    • + Plurality Voting: While it + has its merits, such as ensuring majority/plurality representation, + we'll need to navigate its pitfalls, including misrepresentation of + parties and voter disenfranchisement. +
    • +
      +
    • + Proportional Representation + : A promising path that offers accurate party representation and + broader inclusivity. However, we'll need to tackle challenges like + system complexity and potential trade-offs in decision-making. +
    • +
      +
    • + SemiProportional Systems: + An intriguing middle ground between tradition and innovation, + promising fairer representation and flexibility in voting. Yet, we + must address issues like limited usage and inconsistency in results. +
    • +
    +
    +

    Your Mission:

    +
    +

    + As part of this project, you'll have the opportunity to contribute + your expertise and creativity to shape the future of internal voting. + Together, we'll pioneer solutions that empower our organization and + set a new standard for democratic decision-making. +

    +
    +

    + Let's roll up our sleeves, embrace the challenge, and embark on this + exciting journey to revolutionize internal voting systems! +

    +
    +
    + ); +} diff --git a/src/components/hacknight/ResourcesTab.tsx b/src/components/hacknight/ResourcesTab.tsx new file mode 100644 index 00000000..e105d002 --- /dev/null +++ b/src/components/hacknight/ResourcesTab.tsx @@ -0,0 +1,57 @@ +import styles from './styles.module.css'; + +export default function ResourcesTab() { + return ( +
    +
    +

    + Resources +

    +

    Stuff we use

    +
    +
    + + + +
    +

    + Reach out to us on{' '} + Slack at #ug-tulsa-webdevs + if you have any questions! +

    +
    +
    + ); +} diff --git a/src/components/hacknight/UpdatesTab.tsx b/src/components/hacknight/UpdatesTab.tsx new file mode 100644 index 00000000..831e8a40 --- /dev/null +++ b/src/components/hacknight/UpdatesTab.tsx @@ -0,0 +1,44 @@ +import styles from './styles.module.css'; + +export default function () { + return ( +
    +
    +

    + Let's Greenfield Democracy! +

    +

    February 27, 2024 - 6pm-9pm CST

    +
    +

    + This month, as part of a new pilot format for Hack Night, we're + exploring alternative voting systems and empowering YOU, our + membership, to have an ongoing say in programming for the group! +

    +
    +

    + We'd like your help designing, architecting, and implementing (time + allowing) a mechanism to make it easy for members to suggest topics, + propose projects, and cast their votes for the direction of Tulsa Web + Devs! +

    +
    +

    + We'll break out into teams, discuss the problem, and work together + towards building a solution. A successful solution is one that + features a simple, user-friendly UI, ensures fairness in voting, and + fosters engagement among members. +

    +
    + Want to get a head start? Check out the "Projects" tab for a project + brief! +
    +

    + + Please RSVP on Meetup so we can get an accurate head-count. We look + forward to seeing you there! + +

    +
    +
    + ); +} diff --git a/src/components/hacknight/styles.module.css b/src/components/hacknight/styles.module.css new file mode 100644 index 00000000..a4154bcb --- /dev/null +++ b/src/components/hacknight/styles.module.css @@ -0,0 +1,87 @@ +.container { + max-width: 800px; + margin: auto; + padding: 5px; +} + +.topic { + font-size: calc(1.25rem + 1.25vw); + align-self: center; + font-weight: 500; +} + +.section { + margin: 20px 0; + padding: 20px; + border-radius: 8px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); +} + +.section_h2 { + font-size: 22px; + padding-bottom: 5px; + color: rgb(var(--accent-light)); + border-bottom: solid; + border-color: rgb(var(--accent-dark)); +} + +.section_h3 { + font-size: 18px; + padding-bottom: 5px; + color: rgb(var(--accent-light)); +} + +.section_footer { + font-size: 20px; + padding-block: 10px; + font-weight: 600; + text-align: center; +} + +.section_footer:hover { + text-decoration-line: underline; +} + +.emphasis { + font-weight: 700; + text-decoration: underline; +} + +.list { + padding-inline-start: 20px; +} + +.list_item::before { + content: '☞'; + margin-right: 5px; +} + +.tip { + display: flex; + background-color: rgb(var(--accent-dark)); + opacity: 0.8; + padding: 10px; + border-radius: 8px; +} + +.tip_text { + font-style: italic; + flex-grow: 1; + text-align: center; +} + +.tip::before { + content: '💡'; + margin-right: 5px; +} + +.link { + color: rgb(var(--accent-light)); + text-decoration: underline; +} + +.two_column_grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 20px; +} diff --git a/src/pages/hacknight.astro b/src/pages/hacknight.astro new file mode 100644 index 00000000..9ea42816 --- /dev/null +++ b/src/pages/hacknight.astro @@ -0,0 +1,70 @@ +--- +// Import the Layout component at the top of your page file +import Tabs from '../components/hacknight/HackNightTabs.tsx'; +import Layout from '../layouts/Layout.astro'; +const heroPhoto = '/twd-hero-img.webp'; +--- + + +
    +
    + TWD hero image +

    Hack Night

    +

    Education. Connection. Opportunity.

    +

    —Every 4th Tuesday in Tulsa—

    +

    The Best Place in the World for Web Developers!

    +
    + +
    + + +
    +
    + + diff --git a/src/pages/index.astro b/src/pages/index.astro index df9e2da7..baaa3106 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -5,9 +5,21 @@ import Card from '../components/Card.astro';
    - Tulsa Web Devs logo + Tulsa Web Devs logo

    Welcome to Tulsa Web Devs