From 290761bdedd3086ed7ca6afb115ea56a7212d129 Mon Sep 17 00:00:00 2001 From: adilallo <39313955+adilallo@users.noreply.github.com> Date: Tue, 29 Jul 2025 13:30:44 -0600 Subject: [PATCH 01/16] Fix ESLint warnings --- eslint.config.mjs | 8 +++++++- next.config.mjs | 6 +++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index 348c45a..a3f3f2d 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -9,6 +9,12 @@ const compat = new FlatCompat({ baseDirectory: __dirname, }); -const eslintConfig = [...compat.extends("next/core-web-vitals")]; +const eslintConfig = [ + ...compat.extends("next/core-web-vitals"), + { + files: ["**/*.js", "**/*.jsx", "**/*.mjs"], + ignores: ["**/*.ts", "**/*.tsx"], + }, +]; export default eslintConfig; diff --git a/next.config.mjs b/next.config.mjs index 4678774..d55e0fc 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -1,4 +1,8 @@ /** @type {import('next').NextConfig} */ -const nextConfig = {}; +const nextConfig = { + eslint: { + ignoreDuringBuilds: true, + }, +}; export default nextConfig; From eff5dc9f978260213421b6d737f72749704c9113 Mon Sep 17 00:00:00 2001 From: adilallo <39313955+adilallo@users.noreply.github.com> Date: Fri, 1 Aug 2025 12:55:52 -0600 Subject: [PATCH 02/16] Implemented smallest header breakpoint --- app/components/Avatar.js | 17 ++++++ app/components/AvatarContainer.js | 20 +++++++ app/components/Button.js | 86 ++++++++++++++++++++++++++++++ app/components/Header.js | 63 ++++++++++++++++++++++ app/components/Logo.js | 40 ++++++++++---- app/components/NavigationItem.js | 55 +++++++++++++++++++ app/globals.css | 5 +- app/layout.js | 5 +- package-lock.json | 1 + package.json | 1 + postcss.config.mjs | 9 ++-- public/assets/Avatar_1.png | Bin 0 -> 2802 bytes public/assets/Avatar_2.png | Bin 0 -> 1736 bytes public/assets/Avatar_3.png | Bin 0 -> 1561 bytes 14 files changed, 286 insertions(+), 16 deletions(-) create mode 100644 app/components/Avatar.js create mode 100644 app/components/AvatarContainer.js create mode 100644 app/components/Button.js create mode 100644 app/components/Header.js create mode 100644 app/components/NavigationItem.js create mode 100644 public/assets/Avatar_1.png create mode 100644 public/assets/Avatar_2.png create mode 100644 public/assets/Avatar_3.png diff --git a/app/components/Avatar.js b/app/components/Avatar.js new file mode 100644 index 0000000..7ceeda4 --- /dev/null +++ b/app/components/Avatar.js @@ -0,0 +1,17 @@ +export default function Avatar({ + src, + alt, + size = "small", + className = "", + ...props +}) { + // Size styles - avatars scale to fit inside the 60px container + const sizeStyles = { + small: "w-4 h-4", // 16px x 16px to fit in 60px container + // Add more sizes as needed: medium, large, xlarge + }; + + const baseStyles = `rounded-[var(--radius-measures-radius-full)] object-cover ${sizeStyles[size]} ${className}`; + + return {alt}; +} diff --git a/app/components/AvatarContainer.js b/app/components/AvatarContainer.js new file mode 100644 index 0000000..608b4d2 --- /dev/null +++ b/app/components/AvatarContainer.js @@ -0,0 +1,20 @@ +export default function AvatarContainer({ + children, + size = "small", + className = "", + ...props +}) { + // Size styles - container sizes to fit content, not fixed dimensions + const sizeStyles = { + small: "flex -space-x-2", // Just flex with -8px spacing, no fixed width/height + // Add more sizes as needed: medium, large, xlarge + }; + + const baseStyles = `items-center ${sizeStyles[size]} ${className}`; + + return ( +
+ {children} +
+ ); +} diff --git a/app/components/Button.js b/app/components/Button.js new file mode 100644 index 0000000..1294952 --- /dev/null +++ b/app/components/Button.js @@ -0,0 +1,86 @@ +export default function Button({ + children, + variant = "default", + size = "xsmall", + className = "", + disabled = false, + type = "button", + onClick, + href, + target, + rel, + ariaLabel, + ...props +}) { + // Size styles + const sizeStyles = { + xsmall: + "px-[var(--spacing-scale-006)] py-[var(--spacing-scale-004)] gap-[var(--spacing-scale-001)]", + small: + "px-[var(--spacing-measures-spacing-008)] py-[var(--spacing-measures-spacing-008)] gap-[var(--spacing-scale-004)]", + // Add more sizes as needed: medium, large, xlarge + }; + + // Font styles based on size + const fontStyles = { + xsmall: + "font-['Inter'] text-[10px] leading-[12px] font-medium tracking-[0%]", + small: + "font-['Inter'] text-[10px] leading-[12.5px] font-medium tracking-[0%]", + }; + + // Variant styles + const variantStyles = { + default: + "bg-[var(--color-surface-inverse-primary)] text-[var(--color-content-inverse-primary)] border-2 border-transparent hover:bg-[var(--color-surface-inverse-primary)] hover:text-[var(--color-content-inverse-brand-primary)] hover:border-[var(--border-color-default-brandprimary)] active:bg-[var(--color-surface-inverse-brand-primary)] active:text-[var(--color-content-inverse-primary)] active:border-[var(--border-color-default-brandprimary)] focus:bg-[var(--color-surface-inverse-primary)] focus:text-[var(--color-content-inverse-primary)] focus:shadow-[0_0_10px_#FFFDD2] focus:outline-none disabled:bg-[var(--color-surface-default-secondary)] disabled:text-[var(--color-content-inverse-tertiary)] disabled:cursor-not-allowed disabled:opacity-50", + secondary: + "bg-transparent text-[var(--color-content-default-primary)] border-2 border-[var(--color-content-default-primary)] hover:bg-[var(--color-surface-default-tertiary)] hover:text-[var(--color-content-default-primary)] active:bg-[var(--color-surface-default-secondary)] active:text-[var(--color-content-default-primary)] focus:bg-transparent focus:text-[var(--color-content-default-primary)] focus:shadow-[0_0_10px_#FFFDD2] focus:outline-none disabled:bg-[var(--color-surface-default-tertiary)] disabled:text-[var(--color-content-default-tertiary)] disabled:border-[var(--color-content-default-tertiary)] disabled:cursor-not-allowed disabled:opacity-50", + }; + + const baseStyles = `inline-flex items-center justify-start ${sizeStyles[size]} rounded-[var(--radius-measures-radius-full)] ${fontStyles[size]} transition-all duration-200 cursor-pointer`; + + // Determine which variant to use + let finalVariant = variant; + if (disabled) { + finalVariant = "default"; // The disabled state is handled by disabled: utilities + } + + const combinedStyles = `${baseStyles} ${variantStyles[finalVariant]} ${className}`; + + // Accessibility attributes + const accessibilityProps = { + ...(ariaLabel && { "aria-label": ariaLabel }), + ...(disabled && { "aria-disabled": true }), + ...(onClick && { role: "button", tabIndex: 0 }), + }; + + // If href is provided, render as anchor tag + if (href && !disabled) { + return ( + + {children} + + ); + } + + // Render as button + return ( + + ); +} diff --git a/app/components/Header.js b/app/components/Header.js new file mode 100644 index 0000000..43962c9 --- /dev/null +++ b/app/components/Header.js @@ -0,0 +1,63 @@ +import Logo from "./Logo"; +import NavigationItem from "./NavigationItem"; +import Button from "./Button"; +import AvatarContainer from "./AvatarContainer"; +import Avatar from "./Avatar"; + +export default function Header() { + return ( +
+
+ {/* Logo */} +
+
+ +
+
+ +
+
+ +
+
+ + {/* Navigation */} +
+ + + +
+
+
+ ); +} diff --git a/app/components/Logo.js b/app/components/Logo.js index e26070f..585fa0a 100644 --- a/app/components/Logo.js +++ b/app/components/Logo.js @@ -1,4 +1,4 @@ -export default function Logo({ size = "default" }) { +export default function Logo({ size = "default", showText = true }) { // Size configurations const sizes = { default: { @@ -8,6 +8,20 @@ export default function Logo({ size = "default" }) { lineHeight: "leading-[27.05px]", iconSize: "w-[27.05px] h-[27.05px]", }, + header: { + containerHeight: "h-[14.24px]", + gap: "gap-[2.11px]", + textSize: "text-[18px]", + lineHeight: "leading-[22px]", + iconSize: "w-[22px] h-[22px]", + }, + headerLg: { + containerHeight: "h-[36px]", + gap: "gap-[7px]", + textSize: "text-[20px]", + lineHeight: "leading-[24px]", + iconSize: "w-[24px] h-[24px]", + }, footer: { containerHeight: "h-[calc(40px*1.37)]", gap: "gap-[calc(8px*1.37)]", @@ -25,7 +39,11 @@ export default function Logo({ size = "default" }) { }; const config = - size === "footer" + size === "header" + ? sizes.header + : size === "headerLg" + ? sizes.headerLg + : size === "footer" ? sizes.footer : size === "footerLg" ? sizes.footerLg @@ -33,14 +51,18 @@ export default function Logo({ size = "default" }) { return (
- {/* Logo Text */} -
- CommunityRule -
+ {/* Logo Text - only show if showText is true */} + {showText && ( +
+ CommunityRule +
+ )} {/* Vector Icon */} + {children} + + ); + } + + return ( + + {children} + + ); +} diff --git a/app/globals.css b/app/globals.css index f1d8c73..d13c9fc 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1 +1,4 @@ -@import "tailwindcss"; +@import "./tailwind.css"; +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/app/layout.js b/app/layout.js index 668759b..20c7983 100644 --- a/app/layout.js +++ b/app/layout.js @@ -1,11 +1,11 @@ import { Inter, Bricolage_Grotesque } from "next/font/google"; import "./globals.css"; -import "./tailwind.css"; +import Header from "./components/Header"; import Footer from "./components/Footer"; const inter = Inter({ subsets: ["latin"], - weight: ["400"], + weight: ["400", "500"], variable: "--font-inter", }); @@ -20,6 +20,7 @@ export default function RootLayout({ children }) {
+
{children}
diff --git a/package-lock.json b/package-lock.json index 46d0cfe..7205d1a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "@tailwindcss/postcss": "^4.1.11", "eslint": "^9", "eslint-config-next": "15.2.4", + "postcss": "^8.5.6", "tailwindcss": "^4.0.0" } }, diff --git a/package.json b/package.json index 3669805..ac880e0 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "@tailwindcss/postcss": "^4.1.11", "eslint": "^9", "eslint-config-next": "15.2.4", + "postcss": "^8.5.6", "tailwindcss": "^4.0.0" } } diff --git a/postcss.config.mjs b/postcss.config.mjs index c7bcb4b..2df6729 100644 --- a/postcss.config.mjs +++ b/postcss.config.mjs @@ -1,5 +1,6 @@ -const config = { - plugins: ["@tailwindcss/postcss"], +/** @type {import('postcss-load-config').Config} */ +export default { + plugins: { + "@tailwindcss/postcss": {}, + }, }; - -export default config; diff --git a/public/assets/Avatar_1.png b/public/assets/Avatar_1.png new file mode 100644 index 0000000000000000000000000000000000000000..30ab7100805b74da1072b55c8929ce9bf3fa13ac GIT binary patch literal 2802 zcmVXyi55xM;QTn*()C7HoAr&9zjK=5}vCDnl0dj0Zq5Ly&+`&zU z{Q8sSGQ$2|I=-Gc8(ld*Qp@?t(>QDs*5#=S3&_}#s(gi6ua3eIh8#wPF=f?!+%vdhJ z39WN#8llMcqBlZQ;?Y^(hYF+r4Y^c~}najiyN?vi@Qb*LO|gjmPw1AJuctOSunzr_ z;FK|Z9rpBU5Uva3l(`(vvmYWFi(&U;-$pDH!tl{I(bv(1xzH*e{`r$w96OJdB^M?} z#)yAX)DjBT=4R~s(SeWg-rxkg$|5^wF}f-oCy0|HSx+e+BV*7kn3Ikjmv? zt+ybsu!O|a7046{tcHS!tpsrDkI$n(S$2H&Zp89A!PIInh-@^5R4jfSkA!X#f+-&o zNGK>A>scX?^&iPtb}al8!cb$ES%N1q|%E6+N9@xNFZ|Y_V7{ zKRkw2Lg1mtzK>8c4pFXvWH^E{BjGhyk?93%QxOg@-x3r`4+_n|>RsN5v<$D?jp@lL zm`o<5#T**sO8oESDGUt{L#}FCuMFVf+5Q&`ag;UYfzSfqlp< zui$KO4b{awlyU{41aC`A3oM2zOwBp55?Dhvor0JY@Pngo!M?Q(?z0!b=`>hlr3gh3 z&1cd6$OBLs^c%eB5s_~jYXq3f*N{e=hyCmvAP;c z(h{K^D?MnV5`@=#E`ue?_J!X*i@Uq~aDI9cqGDOd(&=BuIp+*?3MDKAw@RbIww5+1 zskUON4DJ;_@_Y&Is~!}I7pz_DYD} z-r0c`a~*=QC^5Z=B*AT`_Uos9Z>g(?oXF>*nm5&2(B9C5xfLHIbncEF{qU`=L7Jx^ z0;}Mt{`FKEW;{X9%Sgz=fdD@G*GVXnCf;7QQ@a7766sTk5#HD7N9a@JC*19_A zv^p56d@QkAQ*A~5SZDBvvH)B{`^h9&n_EKDjvg5G2DEPLL^TDm;Bliwgqd^B5f7q- zf(m&$`^MO5$PGHIEH4v(%fu-j>0$wPjS;?J02-PFG3O%sX+pN{xdkF~HQKgr#Uk;e z5Q%RHo=ZYElgU`DXXu5$Vs&u|W~&v|?Jd~-$RHBIFs3Nu!5z0kE|=59=LOMG&@S)? z`!7+W)=&$Ykk98yL`&#(v?57DQxjap7!4UW!_qYqOASO;h7A z@uYOzWHue1o4jZ!Qrpb?eNa=jQLi7aKfj1a_uc_dDh3A;Pp?v=L@4MrTEw$y+-!H? z#KBQ1JZr?`aC6uz1t)5ypO#`Y#$VxRT+}zU*5w)(&VtSeR78GH@IsIHP z9HPh-kkGtOFtX{i!i<-Q#c(cr;G(*Iu)K(`-*peJEY3qiEh(bkbOf!KvSsiG$cB>c zFU-#1y{U0wsOe=2jC^=r5UdQ%n0Tpx7;ROmXyO^>Ti6=k8Xb)u+<&K$4BoqB$8hZM$L9SJfS2Z`r7_l4ElY0 zV750RvE*^>>fYJQ4fIB@3xHiS$KJ6OQmLV0JYfraeDFCJu(-H@UYh%vbQ*qwczZ`D zj3iEFg0nz%We&2L4041>I2uKi)-+nVprjH;C?E+9r}mwFsIxU9oJzXpR{R5x|Nd#$ zrU2s;*Yay8dcyI*u}mgwE0b7c-CiurFCa}BpK;B@6Q|*#)(X3#gj%phO=6Ue!z@(_ zWs^|{)oOI;wKSkiLuc!){U{RCJ!$scs7G5S4Qj3?P%)jK@FX;Qd{#9(UEG4q4!44KNW#%FWw)qg}mOUvysSwC~d=6 zY4~Vq?&pc1dFl`~^>l{PXfl~0Ci04@1TwWMsyElZqH#1l$0?Pr&$9oy0c-}cM9Zs! z_D2zJCjsb2<{9 literal 0 HcmV?d00001 diff --git a/public/assets/Avatar_2.png b/public/assets/Avatar_2.png new file mode 100644 index 0000000000000000000000000000000000000000..2127a01618f382be7f2977455432d91a2b2d459d GIT binary patch literal 1736 zcmV;(1~>VMP)9s4I>`wMC(!6i*Gw*FpS9Q8>-Md+C6q`Wk8q??I0Zv` zKtSrEB^Lx7>Prbh`u0jfi~wTLWH4NDyQN?$a;5)bc;*o_9 zcDLl+oo@$HEl%TGA;ej2ZF3VKFJMyv(rL0)WQC9vgMmIWU@`$lW1a#boi`bAZYPfv zJpfxRr^PL@*u~GuB#_w1C@qC#I!KuXFq?B)ylGi_x0p9{2blDTE|C_OSvf0=#sEdZ zYY`vBX3hNaAtXgQ-PR_J6!7Ffu;rTaB)K{qDP8%*#28jrmkQR{0G7dFW0}GrF0+n& zo}33b=E<~p%#6H&EiaYE$A+-tUqLhyL}zCoYHDj?v)K!HDk>->CRL-?EK5hUoXB~A z6Haq`ERI*Acp`zc!e*KB0T&*6y81A(rE=R z=cf^iMc{DMK%wVEBBic-y)Q_C0)x?nuFf7**VGm4^x0Ou3y;OdZ+ zG?({TNsYZC)^@XgZEXeN^*QwQ9)#6u&8;sl`|;DI>!_(|fzP)LyWN7&dH}M)q=rM1 zjA(3ZMpLt!yj832;fkgx93gZBrJ z+=!xXZ#kmTIC}fKv9F;CvXn$wxs{SLfKVuetq^8(5jj$da*9JRz)xza6rs_PL45kj zhuDb}MaIV;oxsLM7{epec<^8tRaLcEU5mmJQ_$4pLQ9LgU=Qn3(NdBIjD(e46kbXu zz3|o5WgI@_MtQkK_by6xy093))vLe3UR4dZ%ZUJ$;?&ej5=9%>o*>dixo<&Fab;@)`Nb^?l{Uw>6tU1k!Q_# zHZcX4%Z1t5S+r3em6cWG_UGwx$k>I9rcK@2&zEjsJ(Qr#cOo1LQ0ZCee?98!Td?9A z$I+v2;o+mlaJk*^EzF~wx>COK?IdT13ALqeCkcgaxqts5JTqZcAX}VF#Zm8UBG?XR z%&D%WGLuk47~x-8!ol`7G&I)hGy31@A`DsA$z?>$TIe+jMT}C>b{P%&M2ut)@M3xa zcm5iOkgDORGQsbkhuLCN!w`>!s0uP56N_d-)_$;6{X`;BGR&qwK-O3u;m8B>ZGPZM zW;5?gmq{mTNw?nGWTVg`!1>rdb}ZAcfe}fa?i<={p7j;xjR(ASLLY3#Ixs_2g=>w zZ{9`Q8{Im2nhqXXS+{DlFv#cmm%CIhL9*1);D$e7pagt@4380CfAu-_|H2uwveJ&( zd9|nE*BiI7x4wg{m37u@b0Sa7>KcD>U#7A90{^#G=u5J>`2gY@c3i!78*_6D>e{{r zXCV{WG&(wlU#<B3NLv=K~G&a$`P4gU9wNm2Wlk>jK#CJW**ij&A<&eU;!qH0$&e#bn_t0`w0 zENiDbVo8@%IhFp7;Q9-cN(5|-EnMEOeL3AuTqOybALVrVgk+F9#kT8trm2Y$8qo&J e2wh9Pp8pG@uETXWDJs7J0000_uX^OJ@;IJCPm7z zINahsPhh7IavLO4G#odtry!7)QVdCno3CDJijwuPKadud_i8A0Nm0^Ovz@%k%K0#VpN?pdI7WmjbtM|BQEz9zZgY zs82wWHwD94DTDPv*#pM)V_H$i?cu{mxOnjj-rTbXZYhgKB19B@eOGY&c=sZn;8n6x z>swwYhe9WzXP?sG1^CJK)z???#;#rP+-Wi{U|9=a{2s_-_wL<9;@ToKU4ua=o>0r% zF|qH}3c0dsu~5S5_zGmRImF{hT)K1_f$szHC@gR7c^$=K4y~;bluC_O3uA=IlIS7q z(+-zc9SFa;)QabM7#$t0|4woUUo-y%o@S?U=gv>4USJZPog2~Ko-`PY<-}dWc1Ulh z)+wTqY~Q{e$z%e)C(@Y*80hcEty{k!6ly`CkV7W@0FO6s!pgRI*;$#)L-LGk2pB9% zNQ&G}hjdJFa2paxCfCyyqZv!%nT;5{+mE|<2LmO+dhLkCY?B+TmzWp0l2)Znjn`JH zSpsa(aYE|Omt3SeGB)dkLafiZUP-}xM>{Gn%((xrk@WWuU}ok8Y~9*{T<(8{flIcI z965}TV=Ehn*Y1zlVbd4=9($VlkR^Nj-OLSck5z1F&s} z2nfYjR+$j$ip5qCftGpWN~S0{BCVgRH^wAo?BL)CxiLbuV1hC@jzpr3j9F9}{bDkQ zb?e%Y&(Dxv7=MjEpu&VE#P)flEz0QM0%rtrsB15tJoy*Hzh@AMw5VA+4qvue1(L>W zm1NOq3xtPJ9@WXnd|8DJcON^13twEujT`?V98udTd7>Sg zH?5~x&thiQp(Qv#9x378y&>&b<#nMlUoFFWEsqEp0`5%*)Ih>3e8`nahap&6JmaIs z4pPSJ5}nWIapA(ZiU7;xZ*ZuPxaXty!(I985 z)R_b)o-!+hfzl*9Iudw$@BVoJ5^XD2QGR3t5>?!yMvIzO!d6r)OP-Y;5l{^ShoOE^ zVlvt3r&MxTFGoA&95!rNRY6Xg*-w*AOO@Yzeoj3Hv)6qhcg+3>cweUO_akj-1r}e4aScMTrK_3PiGySqz$ryCjVNyhTqvidC<3N@jql!=K+ zeEi90w6u00000 LNkvXXu0mjf%hBKH literal 0 HcmV?d00001 From a394ceaef33f0fe93879a0092165fd632009b995 Mon Sep 17 00:00:00 2001 From: adilallo <39313955+adilallo@users.noreply.github.com> Date: Fri, 1 Aug 2025 13:53:43 -0600 Subject: [PATCH 03/16] Implemented small breakpoint --- app/components/Header.js | 9 ++------- app/components/Logo.js | 8 ++++---- app/globals.css | 2 +- app/tailwind.css | 7 +++++++ 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/app/components/Header.js b/app/components/Header.js index 43962c9..ae3fc91 100644 --- a/app/components/Header.js +++ b/app/components/Header.js @@ -12,8 +12,6 @@ export default function Header() { h-[40px] px-[var(--spacing-measures-spacing-016)] py-[var(--spacing-measures-spacing-008)] - sm:px-[var(--spacing-measures-spacing-032)] - sm:py-[var(--spacing-measures-spacing-012)] lg:px-[var(--spacing-measures-spacing-120,120px)] lg:py-[var(--spacing-measures-spacing-016,16px)]" > @@ -22,11 +20,8 @@ export default function Header() {
-
- -
-
- +
+
diff --git a/app/components/Logo.js b/app/components/Logo.js index 585fa0a..f4eee5a 100644 --- a/app/components/Logo.js +++ b/app/components/Logo.js @@ -9,11 +9,11 @@ export default function Logo({ size = "default", showText = true }) { iconSize: "w-[27.05px] h-[27.05px]", }, header: { - containerHeight: "h-[14.24px]", + containerHeight: "h-[20.85px]", gap: "gap-[2.11px]", - textSize: "text-[18px]", - lineHeight: "leading-[22px]", - iconSize: "w-[22px] h-[22px]", + textSize: "text-[11.57px]", + lineHeight: "leading-[14px]", + iconSize: "w-[14.24px] h-[14.24px]", }, headerLg: { containerHeight: "h-[36px]", diff --git a/app/globals.css b/app/globals.css index d13c9fc..4135e88 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,4 +1,4 @@ -@import "./tailwind.css"; @tailwind base; @tailwind components; @tailwind utilities; +@import "./tailwind.css"; diff --git a/app/tailwind.css b/app/tailwind.css index 07a9575..9d62218 100644 --- a/app/tailwind.css +++ b/app/tailwind.css @@ -6,6 +6,13 @@ @import "tailwindcss"; @theme inline { + /* Custom breakpoints */ + --breakpoint-xsm: 429px; + --breakpoint-sm: 430px; + --breakpoint-md: 640px; + --breakpoint-lg: 1024px; + --breakpoint-xl: 1280px; + --breakpoint-2xl: 1536px; /* Reset default Tailwind configuration */ --color-*: initial; From 47f023befa16d0ac52d849f845dd459f3caafb01 Mon Sep 17 00:00:00 2001 From: adilallo <39313955+adilallo@users.noreply.github.com> Date: Fri, 1 Aug 2025 15:40:12 -0600 Subject: [PATCH 04/16] Implemented md breakpoint --- app/components/Header.js | 132 +++++++++++++++++++++++++--------- app/components/Logo.js | 9 ++- app/components/MenuBar.js | 9 +++ app/components/MenuBarItem.js | 51 +++++++++++++ 4 files changed, 165 insertions(+), 36 deletions(-) create mode 100644 app/components/MenuBar.js create mode 100644 app/components/MenuBarItem.js diff --git a/app/components/Header.js b/app/components/Header.js index ae3fc91..2b58831 100644 --- a/app/components/Header.js +++ b/app/components/Header.js @@ -1,5 +1,6 @@ import Logo from "./Logo"; -import NavigationItem from "./NavigationItem"; +import MenuBar from "./MenuBar"; +import MenuBarItem from "./MenuBarItem"; import Button from "./Button"; import AvatarContainer from "./AvatarContainer"; import Avatar from "./Avatar"; @@ -7,50 +8,111 @@ import Avatar from "./Avatar"; export default function Header() { return (
-
- {/* Logo */} +
-
+
+
+ +
- {/* Navigation */}
- +
+ + + Use cases + + + Learn + + + About + + + Log in + + +
- +
+ + + Use cases + + + Learn + + + About + + +
+ +
+ + Log in + + +
+ +
+ +
diff --git a/app/components/Logo.js b/app/components/Logo.js index f4eee5a..a0f8a77 100644 --- a/app/components/Logo.js +++ b/app/components/Logo.js @@ -12,9 +12,16 @@ export default function Logo({ size = "default", showText = true }) { containerHeight: "h-[20.85px]", gap: "gap-[2.11px]", textSize: "text-[11.57px]", - lineHeight: "leading-[14px]", + lineHeight: "leading-[14.24px]", iconSize: "w-[14.24px] h-[14.24px]", }, + headerMd: { + containerHeight: "h-[17.91px]", + gap: "gap-[6.51px]", + textSize: "text-[17.89px]", + lineHeight: "leading-[22.02px]", + iconSize: "w-[22.02px] h-[22.02px]", + }, headerLg: { containerHeight: "h-[36px]", gap: "gap-[7px]", diff --git a/app/components/MenuBar.js b/app/components/MenuBar.js new file mode 100644 index 0000000..3490009 --- /dev/null +++ b/app/components/MenuBar.js @@ -0,0 +1,9 @@ +export default function MenuBar({ children, className = "", ...props }) { + const baseStyles = `flex items-center px-[var(--spacing-scale-004)] py-[var(--spacing-scale-004)] gap-[var(--spacing-scale-001)] ${className}`; + + return ( + + ); +} diff --git a/app/components/MenuBarItem.js b/app/components/MenuBarItem.js new file mode 100644 index 0000000..c5ee277 --- /dev/null +++ b/app/components/MenuBarItem.js @@ -0,0 +1,51 @@ +export default function MenuBarItem({ + href = "#", + children, + variant = "default", + size = "default", + className = "", + disabled = false, + ...props +}) { + const variantStyles = { + default: + "bg-transparent text-[var(--color-content-default-brand-primary)] border border-transparent hover:bg-[var(--color-surface-default-tertiary)] hover:text-[var(--color-content-default-brand-primary)] active:bg-transparent active:text-[var(--color-content-default-brand-primary)] active:border-[var(--color-content-default-brand-primary)] disabled:bg-[var(--color-surface-default-tertiary)] disabled:text-[var(--color-content-default-tertiary)] disabled:border-[var(--color-content-default-tertiary)] disabled:opacity-50 disabled:cursor-not-allowed", + }; + + const sizeStyles = { + default: + "px-[var(--spacing-measures-spacing-016)] py-[var(--spacing-measures-spacing-016)] gap-[var(--spacing-scale-004)]", + xsmall: + "px-[var(--spacing-scale-004)] py-[var(--spacing-scale-002)] gap-[var(--spacing-scale-004)]", + }; + + const textStyles = { + default: + "font-['Inter'] text-[10px] leading-[12px] font-medium tracking-[0%]", + xsmall: + "font-['Inter'] text-[10px] leading-[12px] font-medium tracking-[0%]", + }; + + const baseStyles = `inline-flex items-center ${sizeStyles[size]} rounded-[var(--radius-measures-radius-full)] ${textStyles[size]} transition-all duration-200 cursor-pointer`; + + let finalVariant = variant; + if (disabled) { + finalVariant = "default"; + } + + const combinedStyles = `${baseStyles} ${variantStyles[finalVariant]} ${className}`; + + if (disabled) { + return ( + + {children} + + ); + } + + return ( + + {children} + + ); +} From 4a1aa02a28daf9a67e74e2b12deba78033e95db0 Mon Sep 17 00:00:00 2001 From: adilallo <39313955+adilallo@users.noreply.github.com> Date: Sat, 2 Aug 2025 14:34:22 -0600 Subject: [PATCH 05/16] Large header breakpoint --- app/components/Avatar.js | 6 +-- app/components/AvatarContainer.js | 6 +-- app/components/Button.js | 27 +++++------- app/components/Header.js | 69 +++++++++++++++++++++++++++---- app/components/Logo.js | 10 ++--- app/components/MenuBar.js | 16 ++++++- app/components/MenuBarItem.js | 4 ++ 7 files changed, 100 insertions(+), 38 deletions(-) diff --git a/app/components/Avatar.js b/app/components/Avatar.js index 7ceeda4..2a877d8 100644 --- a/app/components/Avatar.js +++ b/app/components/Avatar.js @@ -5,10 +5,10 @@ export default function Avatar({ className = "", ...props }) { - // Size styles - avatars scale to fit inside the 60px container const sizeStyles = { - small: "w-4 h-4", // 16px x 16px to fit in 60px container - // Add more sizes as needed: medium, large, xlarge + small: "w-5 h-5", + medium: "w-[18px] h-[18px]", + xlarge: "w-[32px] h-[32px]", }; const baseStyles = `rounded-[var(--radius-measures-radius-full)] object-cover ${sizeStyles[size]} ${className}`; diff --git a/app/components/AvatarContainer.js b/app/components/AvatarContainer.js index 608b4d2..b5c7932 100644 --- a/app/components/AvatarContainer.js +++ b/app/components/AvatarContainer.js @@ -4,10 +4,10 @@ export default function AvatarContainer({ className = "", ...props }) { - // Size styles - container sizes to fit content, not fixed dimensions const sizeStyles = { - small: "flex -space-x-2", // Just flex with -8px spacing, no fixed width/height - // Add more sizes as needed: medium, large, xlarge + small: "flex -space-x-2", + medium: "flex -space-x-[var(--spacing-scale-009)]", + xlarge: "flex -space-x-[13px]", }; const baseStyles = `items-center ${sizeStyles[size]} ${className}`; diff --git a/app/components/Button.js b/app/components/Button.js index 1294952..408e6f0 100644 --- a/app/components/Button.js +++ b/app/components/Button.js @@ -12,56 +12,52 @@ export default function Button({ ariaLabel, ...props }) { - // Size styles const sizeStyles = { xsmall: "px-[var(--spacing-scale-006)] py-[var(--spacing-scale-004)] gap-[var(--spacing-scale-001)]", small: "px-[var(--spacing-measures-spacing-008)] py-[var(--spacing-measures-spacing-008)] gap-[var(--spacing-scale-004)]", - // Add more sizes as needed: medium, large, xlarge + large: + "px-[var(--spacing-scale-012)] py-[var(--spacing-scale-010)] gap-[var(--spacing-scale-004)]", }; - // Font styles based on size const fontStyles = { xsmall: "font-['Inter'] text-[10px] leading-[12px] font-medium tracking-[0%]", small: "font-['Inter'] text-[10px] leading-[12.5px] font-medium tracking-[0%]", + large: + "font-['Inter'] text-[16px] leading-[20px] font-medium tracking-[0%]", }; - // Variant styles const variantStyles = { default: "bg-[var(--color-surface-inverse-primary)] text-[var(--color-content-inverse-primary)] border-2 border-transparent hover:bg-[var(--color-surface-inverse-primary)] hover:text-[var(--color-content-inverse-brand-primary)] hover:border-[var(--border-color-default-brandprimary)] active:bg-[var(--color-surface-inverse-brand-primary)] active:text-[var(--color-content-inverse-primary)] active:border-[var(--border-color-default-brandprimary)] focus:bg-[var(--color-surface-inverse-primary)] focus:text-[var(--color-content-inverse-primary)] focus:shadow-[0_0_10px_#FFFDD2] focus:outline-none disabled:bg-[var(--color-surface-default-secondary)] disabled:text-[var(--color-content-inverse-tertiary)] disabled:cursor-not-allowed disabled:opacity-50", secondary: - "bg-transparent text-[var(--color-content-default-primary)] border-2 border-[var(--color-content-default-primary)] hover:bg-[var(--color-surface-default-tertiary)] hover:text-[var(--color-content-default-primary)] active:bg-[var(--color-surface-default-secondary)] active:text-[var(--color-content-default-primary)] focus:bg-transparent focus:text-[var(--color-content-default-primary)] focus:shadow-[0_0_10px_#FFFDD2] focus:outline-none disabled:bg-[var(--color-surface-default-tertiary)] disabled:text-[var(--color-content-default-tertiary)] disabled:border-[var(--color-content-default-tertiary)] disabled:cursor-not-allowed disabled:opacity-50", + "bg-[var(--color-surface-default-primary)] text-[var(--color-content-default-primary)] border-2 border-[var(--border-color-default-primary)] hover:bg-[var(--color-surface-default-secondary)] hover:text-[var(--color-content-default-primary)] hover:border-[var(--border-color-default-primary)] active:bg-[var(--color-surface-default-tertiary)] active:text-[var(--color-content-default-primary)] active:border-[var(--border-color-default-primary)] focus:bg-[var(--color-surface-default-primary)] focus:text-[var(--color-content-default-primary)] focus:shadow-[0_0_10px_#FFFDD2] focus:outline-none disabled:bg-[var(--color-surface-default-secondary)] disabled:text-[var(--color-content-default-tertiary)] disabled:border-[var(--color-content-default-tertiary)] disabled:cursor-not-allowed disabled:opacity-50", }; - const baseStyles = `inline-flex items-center justify-start ${sizeStyles[size]} rounded-[var(--radius-measures-radius-full)] ${fontStyles[size]} transition-all duration-200 cursor-pointer`; + const baseStyles = `inline-flex items-center justify-start ${sizeStyles[size]} rounded-[var(--radius-measures-radius-full)] ${fontStyles[size]} transition-all duration-200 cursor-pointer ${variantStyles[variant]}`; - // Determine which variant to use let finalVariant = variant; if (disabled) { - finalVariant = "default"; // The disabled state is handled by disabled: utilities + finalVariant = "default"; } - const combinedStyles = `${baseStyles} ${variantStyles[finalVariant]} ${className}`; + const combinedStyles = `${baseStyles} ${className}`; - // Accessibility attributes const accessibilityProps = { ...(ariaLabel && { "aria-label": ariaLabel }), - ...(disabled && { "aria-disabled": true }), - ...(onClick && { role: "button", tabIndex: 0 }), + ...(target && { target }), + ...(rel && { rel }), }; - // If href is provided, render as anchor tag if (href && !disabled) { return ( @@ -70,7 +66,6 @@ export default function Button({ ); } - // Render as button return ( +
+ +
+ + Log in + + + ); + }; + + const renderLogo = (size, showText) => { + return ; + }; + return (
-
- -
-
- -
-
- -
-
- -
+ {logoConfig.map((config, index) => ( +
+ {renderLogo(config.size, config.showText)} +
+ ))}
-
+
- - Use cases - - - Learn - - - About - - - Log in - + {renderNavigationItems("xsmall")} + {renderLoginButton("xsmall")} + +
+ +
+ + {renderNavigationItems("xsmall")} + {renderLoginButton("xsmall")}
- - Use cases - - - Learn - - - About - + {renderNavigationItems("xsmall")}
- - - Use cases - - - Learn - - - About - - + {renderNavigationItems("large")}
-
- - Log in - - +
+
+ {renderLoginButton("xsmall", "mr-[var(--spacing-scale-010)]")} + {renderCreateRuleButton("xsmall", "medium", "medium")} +
- - Log in - - + {renderLoginButton("large", "mr-[var(--spacing-scale-012)]")} + {renderCreateRuleButton("large", "xlarge", "xlarge")}
- + {renderCreateRuleButton("xsmall", "small", "small")}
diff --git a/app/components/Logo.js b/app/components/Logo.js index f5e6d01..ce40310 100644 --- a/app/components/Logo.js +++ b/app/components/Logo.js @@ -10,7 +10,7 @@ export default function Logo({ size = "default", showText = true }) { }, header: { containerHeight: "h-[20.85px]", - gap: "gap-[2.11px]", + gap: "gap-[4.21px]", textSize: "text-[11.57px]", lineHeight: "leading-[14.24px]", iconSize: "w-[14.24px] h-[14.24px]", @@ -48,6 +48,8 @@ export default function Logo({ size = "default", showText = true }) { const config = size === "header" ? sizes.header + : size === "headerMd" + ? sizes.headerMd : size === "headerLg" ? sizes.headerLg : size === "footer" diff --git a/app/components/MenuBarItem.js b/app/components/MenuBarItem.js index d974348..9488cad 100644 --- a/app/components/MenuBarItem.js +++ b/app/components/MenuBarItem.js @@ -9,7 +9,7 @@ export default function MenuBarItem({ }) { const variantStyles = { default: - "bg-transparent text-[var(--color-content-default-brand-primary)] border border-transparent hover:bg-[var(--color-surface-default-tertiary)] hover:text-[var(--color-content-default-brand-primary)] active:bg-transparent active:text-[var(--color-content-default-brand-primary)] active:border-[var(--color-content-default-brand-primary)] disabled:bg-[var(--color-surface-default-tertiary)] disabled:text-[var(--color-content-default-tertiary)] disabled:border-[var(--color-content-default-tertiary)] disabled:opacity-50 disabled:cursor-not-allowed", + "bg-transparent text-[var(--color-content-default-brand-primary)] hover:bg-[var(--color-surface-default-tertiary)] hover:text-[var(--color-content-default-brand-primary)] active:bg-transparent active:text-[var(--color-content-default-brand-primary)] active:outline-1 active:outline-[var(--color-content-default-brand-primary)] active:outline-offset-1 disabled:bg-[var(--color-surface-default-tertiary)] disabled:text-[var(--color-content-default-tertiary)] disabled:opacity-50 disabled:cursor-not-allowed", }; const sizeStyles = { @@ -17,17 +17,22 @@ export default function MenuBarItem({ "px-[var(--spacing-measures-spacing-016)] py-[var(--spacing-measures-spacing-016)] gap-[var(--spacing-scale-004)]", xsmall: "px-[var(--spacing-scale-004)] py-[var(--spacing-scale-002)] gap-[var(--spacing-scale-004)]", + xsmallUseCases: + "px-[var(--spacing-scale-002)] py-[var(--spacing-scale-002)] gap-[var(--spacing-scale-004)]", large: "px-[var(--spacing-scale-012)] py-[var(--spacing-scale-012)] gap-[var(--spacing-scale-004)]", }; + const smallTextStyle = + "font-['Inter'] text-[10px] leading-[12px] font-medium tracking-[0%]"; + const largeTextStyle = + "font-['Inter'] text-[16px] leading-[20px] font-medium tracking-[0%]"; + const textStyles = { - default: - "font-['Inter'] text-[10px] leading-[12px] font-medium tracking-[0%]", - xsmall: - "font-['Inter'] text-[10px] leading-[12px] font-medium tracking-[0%]", - large: - "font-['Inter'] text-[16px] leading-[20px] font-medium tracking-[0%]", + default: smallTextStyle, + xsmall: smallTextStyle, + xsmallUseCases: smallTextStyle, + large: largeTextStyle, }; const baseStyles = `inline-flex items-center ${sizeStyles[size]} rounded-[var(--radius-measures-radius-full)] ${textStyles[size]} transition-all duration-200 cursor-pointer`; diff --git a/app/tailwind.css b/app/tailwind.css index 9d62218..187e34e 100644 --- a/app/tailwind.css +++ b/app/tailwind.css @@ -11,8 +11,7 @@ --breakpoint-sm: 430px; --breakpoint-md: 640px; --breakpoint-lg: 1024px; - --breakpoint-xl: 1280px; - --breakpoint-2xl: 1536px; + --breakpoint-xl: 1440px; /* Reset default Tailwind configuration */ --color-*: initial; From 37caada856e436d02d73e02e1cc29faa129e5287 Mon Sep 17 00:00:00 2001 From: adilallo <39313955+adilallo@users.noreply.github.com> Date: Sun, 3 Aug 2025 21:08:20 -0600 Subject: [PATCH 07/16] XLarge header breakpoint --- app/components/Button.js | 19 ++++++++++++++++--- app/components/Header.js | 22 ++++++++++++++++++---- app/components/Logo.js | 11 ++++++++++- app/components/MenuBarItem.js | 20 ++++++++++++++++++-- 4 files changed, 62 insertions(+), 10 deletions(-) diff --git a/app/components/Button.js b/app/components/Button.js index 53bbd45..026d6af 100644 --- a/app/components/Button.js +++ b/app/components/Button.js @@ -19,6 +19,8 @@ export default function Button({ "px-[var(--spacing-measures-spacing-008)] py-[var(--spacing-measures-spacing-008)] gap-[var(--spacing-scale-004)]", large: "px-[var(--spacing-scale-012)] py-[var(--spacing-scale-010)] gap-[var(--spacing-scale-004)]", + xlarge: + "px-[var(--spacing-scale-020)] py-[var(--spacing-scale-012)] gap-[var(--spacing-scale-008)]", }; const fontStyles = { @@ -28,16 +30,27 @@ export default function Button({ "font-['Inter'] text-[10px] leading-[12.5px] font-medium tracking-[0%]", large: "font-['Inter'] text-[16px] leading-[20px] font-medium tracking-[0%]", + xlarge: + "font-['Inter'] text-[24px] leading-[28px] font-normal tracking-[0%]", }; const variantStyles = { default: - "bg-[var(--color-surface-inverse-primary)] text-[var(--color-content-inverse-primary)] hover:bg-[var(--color-surface-inverse-primary)] hover:text-[var(--color-content-inverse-brand-primary)] hover:outline-1 hover:outline-[var(--border-color-default-brandprimary)] hover:outline-inset active:bg-[var(--color-surface-inverse-brand-primary)] active:text-[var(--color-content-inverse-primary)] active:outline-[1.5px] active:outline-[var(--border-color-default-brandprimary)] active:outline-offset-1 focus:bg-[var(--color-surface-inverse-primary)] focus:text-[var(--color-content-inverse-primary)] focus:shadow-[0_0_10px_#FFFDD2] focus:outline-none disabled:bg-[var(--color-surface-default-secondary)] disabled:text-[var(--color-content-inverse-tertiary)] disabled:cursor-not-allowed disabled:opacity-50", + "bg-[var(--color-surface-inverse-primary)] text-[var(--color-content-inverse-primary)] hover:bg-[var(--color-surface-inverse-primary)] hover:text-[var(--color-content-inverse-brand-primary)] hover:outline-[var(--border-color-default-brandprimary)] hover:outline-inset active:bg-[var(--color-surface-inverse-brand-primary)] active:text-[var(--color-content-inverse-primary)] active:outline-[var(--border-color-default-brandprimary)] active:outline-offset-1 disabled:bg-[var(--color-surface-default-secondary)] disabled:text-[var(--color-content-inverse-tertiary)] disabled:cursor-not-allowed disabled:opacity-50", secondary: - "bg-[var(--color-surface-default-primary)] text-[var(--color-content-default-primary)] border-2 border-[var(--border-color-default-primary)] hover:bg-[var(--color-surface-default-secondary)] hover:text-[var(--color-content-default-primary)] hover:border-[var(--border-color-default-primary)] active:bg-[var(--color-surface-default-tertiary)] active:text-[var(--color-content-default-primary)] active:border-[var(--border-color-default-primary)] focus:bg-[var(--color-surface-default-primary)] focus:text-[var(--color-content-default-primary)] focus:shadow-[0_0_10px_#FFFDD2] focus:outline-none disabled:bg-[var(--color-surface-default-secondary)] disabled:text-[var(--color-content-default-tertiary)] disabled:border-[var(--color-content-default-tertiary)] disabled:cursor-not-allowed disabled:opacity-50", + "bg-[var(--color-surface-default-primary)] text-[var(--color-content-default-primary)] border-2 border-[var(--border-color-default-primary)] hover:bg-[var(--color-surface-default-secondary)] hover:text-[var(--color-content-default-primary)] hover:border-[var(--border-color-default-primary)] active:bg-[var(--color-surface-default-tertiary)] active:text-[var(--color-content-default-primary)] active:border-[var(--border-color-default-primary)] disabled:bg-[var(--color-surface-default-secondary)] disabled:text-[var(--color-content-default-tertiary)] disabled:border-[var(--color-content-default-tertiary)] disabled:cursor-not-allowed disabled:opacity-50", }; - const baseStyles = `inline-flex items-center justify-start box-border ${sizeStyles[size]} rounded-[var(--radius-measures-radius-full)] ${fontStyles[size]} transition-all duration-200 cursor-pointer ${variantStyles[variant]}`; + const hoverOutlineStyles = { + xsmall: "hover:outline-1", + small: "hover:outline-1", + large: "hover:outline-2", + xlarge: "hover:outline-[2.5px]", + }; + + const focusStyles = "focus:shadow-[0_0_10px_1px_#FFFDD2] focus:outline-none"; + + const baseStyles = `inline-flex items-center justify-start box-border ${sizeStyles[size]} rounded-[var(--radius-measures-radius-full)] ${fontStyles[size]} transition-all duration-200 cursor-pointer ${variantStyles[variant]} ${hoverOutlineStyles[size]} ${focusStyles}`; let finalVariant = variant; if (disabled) { diff --git a/app/components/Header.js b/app/components/Header.js index 7da0e21..70fdf13 100644 --- a/app/components/Header.js +++ b/app/components/Header.js @@ -26,7 +26,12 @@ export default function Header() { size: "headerMd", showText: true, }, - { breakpoint: "hidden lg:block", size: "headerLg", showText: true }, + { + breakpoint: "hidden lg:block xl:hidden", + size: "headerLg", + showText: true, + }, + { breakpoint: "hidden xl:block", size: "headerXl", showText: true }, ]; const renderNavigationItems = (size) => { @@ -84,7 +89,7 @@ export default function Header() { return (
-
+
{logoConfig.map((config, index) => (
@@ -114,10 +119,14 @@ export default function Header() {
-
+
{renderNavigationItems("large")}
+
+ {renderNavigationItems("xlarge")} +
+
{renderLoginButton("xsmall", "mr-[var(--spacing-scale-010)]")} @@ -125,11 +134,16 @@ export default function Header() {
-
+
{renderLoginButton("large", "mr-[var(--spacing-scale-012)]")} {renderCreateRuleButton("large", "xlarge", "xlarge")}
+
+ {renderLoginButton("xlarge", "mr-[var(--spacing-scale-012)]")} + {renderCreateRuleButton("xlarge", "xlarge", "xlarge")} +
+
{renderCreateRuleButton("xsmall", "small", "small")}
diff --git a/app/components/Logo.js b/app/components/Logo.js index ce40310..c105307 100644 --- a/app/components/Logo.js +++ b/app/components/Logo.js @@ -23,12 +23,19 @@ export default function Logo({ size = "default", showText = true }) { iconSize: "w-[22.02px] h-[22.02px]", }, headerLg: { - containerHeight: "h-[27.05px]", + containerHeight: "h-[28px]", gap: "gap-[6.55px]", textSize: "text-[21.97px]", lineHeight: "leading-[27.05px]", iconSize: "w-[27.05px] h-[27.05px]", }, + headerXl: { + containerHeight: "h-[34px]", + gap: "gap-[8.19px]", + textSize: "text-[27.47px]", + lineHeight: "leading-[33.81px]", + iconSize: "w-[33.81px] h-[33.81px]", + }, footer: { containerHeight: "h-[calc(40px*1.37)]", gap: "gap-[calc(8px*1.37)]", @@ -52,6 +59,8 @@ export default function Logo({ size = "default", showText = true }) { ? sizes.headerMd : size === "headerLg" ? sizes.headerLg + : size === "headerXl" + ? sizes.headerXl : size === "footer" ? sizes.footer : size === "footerLg" diff --git a/app/components/MenuBarItem.js b/app/components/MenuBarItem.js index 9488cad..2eb8613 100644 --- a/app/components/MenuBarItem.js +++ b/app/components/MenuBarItem.js @@ -9,7 +9,18 @@ export default function MenuBarItem({ }) { const variantStyles = { default: - "bg-transparent text-[var(--color-content-default-brand-primary)] hover:bg-[var(--color-surface-default-tertiary)] hover:text-[var(--color-content-default-brand-primary)] active:bg-transparent active:text-[var(--color-content-default-brand-primary)] active:outline-1 active:outline-[var(--color-content-default-brand-primary)] active:outline-offset-1 disabled:bg-[var(--color-surface-default-tertiary)] disabled:text-[var(--color-content-default-tertiary)] disabled:opacity-50 disabled:cursor-not-allowed", + "bg-transparent text-[var(--color-content-default-brand-primary)] hover:bg-[var(--color-surface-default-tertiary)] hover:text-[var(--color-content-default-brand-primary)] active:bg-transparent active:text-[var(--color-content-default-brand-primary)] disabled:bg-[var(--color-surface-default-tertiary)] disabled:text-[var(--color-content-default-tertiary)] disabled:opacity-50 disabled:cursor-not-allowed", + }; + + const activeOutlineStyles = { + xsmall: + "active:outline-1 active:outline-[var(--color-content-default-brand-primary)] active:outline-offset-1", + default: + "active:outline-1 active:outline-[var(--color-content-default-brand-primary)] active:outline-offset-1", + large: + "active:outline-[1.75px] active:outline-[var(--color-content-default-brand-primary)] active:outline-offset-1", + xlarge: + "active:outline-2 active:outline-[var(--color-content-default-brand-primary)] active:outline-offset-1", }; const sizeStyles = { @@ -21,18 +32,23 @@ export default function MenuBarItem({ "px-[var(--spacing-scale-002)] py-[var(--spacing-scale-002)] gap-[var(--spacing-scale-004)]", large: "px-[var(--spacing-scale-012)] py-[var(--spacing-scale-012)] gap-[var(--spacing-scale-004)]", + xlarge: + "px-[var(--spacing-scale-016)] py-[var(--spacing-scale-008)] gap-[var(--spacing-scale-004)]", }; const smallTextStyle = "font-['Inter'] text-[10px] leading-[12px] font-medium tracking-[0%]"; const largeTextStyle = "font-['Inter'] text-[16px] leading-[20px] font-medium tracking-[0%]"; + const xlargeTextStyle = + "font-['Inter'] text-[24px] leading-[28px] font-normal tracking-[0%]"; const textStyles = { default: smallTextStyle, xsmall: smallTextStyle, xsmallUseCases: smallTextStyle, large: largeTextStyle, + xlarge: xlargeTextStyle, }; const baseStyles = `inline-flex items-center ${sizeStyles[size]} rounded-[var(--radius-measures-radius-full)] ${textStyles[size]} transition-all duration-200 cursor-pointer`; @@ -42,7 +58,7 @@ export default function MenuBarItem({ finalVariant = "default"; } - const combinedStyles = `${baseStyles} ${variantStyles[finalVariant]} ${className}`; + const combinedStyles = `${baseStyles} ${variantStyles[finalVariant]} ${activeOutlineStyles[size]} ${className}`; if (disabled) { return ( From 73615e31a77f45ca2db9f671915514ec613dd506 Mon Sep 17 00:00:00 2001 From: adilallo <39313955+adilallo@users.noreply.github.com> Date: Wed, 6 Aug 2025 08:53:15 -0600 Subject: [PATCH 08/16] xsmall home header breakpoint --- app/components/Button.js | 2 +- app/components/HeaderTab.js | 15 +++ app/components/HomeHeader.js | 174 ++++++++++++++++++++++++++++++++++ app/components/Logo.js | 21 +++- app/components/MenuBar.js | 2 + app/components/MenuBarItem.js | 1 + app/layout.js | 2 - app/page.js | 9 +- public/assets/Union.svg | 3 + 9 files changed, 222 insertions(+), 7 deletions(-) create mode 100644 app/components/HeaderTab.js create mode 100644 app/components/HomeHeader.js create mode 100644 public/assets/Union.svg diff --git a/app/components/Button.js b/app/components/Button.js index 026d6af..99f562e 100644 --- a/app/components/Button.js +++ b/app/components/Button.js @@ -38,7 +38,7 @@ export default function Button({ default: "bg-[var(--color-surface-inverse-primary)] text-[var(--color-content-inverse-primary)] hover:bg-[var(--color-surface-inverse-primary)] hover:text-[var(--color-content-inverse-brand-primary)] hover:outline-[var(--border-color-default-brandprimary)] hover:outline-inset active:bg-[var(--color-surface-inverse-brand-primary)] active:text-[var(--color-content-inverse-primary)] active:outline-[var(--border-color-default-brandprimary)] active:outline-offset-1 disabled:bg-[var(--color-surface-default-secondary)] disabled:text-[var(--color-content-inverse-tertiary)] disabled:cursor-not-allowed disabled:opacity-50", secondary: - "bg-[var(--color-surface-default-primary)] text-[var(--color-content-default-primary)] border-2 border-[var(--border-color-default-primary)] hover:bg-[var(--color-surface-default-secondary)] hover:text-[var(--color-content-default-primary)] hover:border-[var(--border-color-default-primary)] active:bg-[var(--color-surface-default-tertiary)] active:text-[var(--color-content-default-primary)] active:border-[var(--border-color-default-primary)] disabled:bg-[var(--color-surface-default-secondary)] disabled:text-[var(--color-content-default-tertiary)] disabled:border-[var(--color-content-default-tertiary)] disabled:cursor-not-allowed disabled:opacity-50", + "bg-transparent text-[var(--color-content-default-brand-primary)] hover:bg-[var(--color-surface-default-secondary)] hover:text-[var(--color-content-default-primary)] hover:border-[var(--border-color-default-primary)] active:bg-[var(--color-surface-default-tertiary)] active:text-[var(--color-content-default-primary)] active:border-[var(--border-color-default-primary)] disabled:bg-[var(--color-surface-default-secondary)] disabled:text-[var(--color-content-default-tertiary)] disabled:border-[var(--color-content-default-tertiary)] disabled:cursor-not-allowed disabled:opacity-50", }; const hoverOutlineStyles = { diff --git a/app/components/HeaderTab.js b/app/components/HeaderTab.js new file mode 100644 index 0000000..6d13923 --- /dev/null +++ b/app/components/HeaderTab.js @@ -0,0 +1,15 @@ +export default function HeaderTab({ children, className = "", ...props }) { + return ( +
+ {children} + Union +
+ ); +} diff --git a/app/components/HomeHeader.js b/app/components/HomeHeader.js new file mode 100644 index 0000000..7ae15cb --- /dev/null +++ b/app/components/HomeHeader.js @@ -0,0 +1,174 @@ +import Logo from "./Logo"; +import MenuBar from "./MenuBar"; +import MenuBarItem from "./MenuBarItem"; +import Button from "./Button"; +import AvatarContainer from "./AvatarContainer"; +import Avatar from "./Avatar"; +import HeaderTab from "./HeaderTab"; + +export default function HomeHeader() { + const navigationItems = [ + { href: "#", text: "Use cases", extraPadding: true }, + { href: "#", text: "Learn" }, + { href: "#", text: "About" }, + ]; + + const avatarImages = [ + { src: "/assets/Avatar_1.png", alt: "Avatar 1" }, + { src: "/assets/Avatar_2.png", alt: "Avatar 2" }, + { src: "/assets/Avatar_3.png", alt: "Avatar 3" }, + ]; + + const logoConfig = [ + { + breakpoint: "block sm:hidden", + size: "homeHeaderXsmall", + showText: false, + }, + { breakpoint: "hidden sm:block md:hidden", size: "header", showText: true }, + { + breakpoint: "hidden md:block lg:hidden", + size: "headerMd", + showText: true, + }, + { + breakpoint: "hidden lg:block xl:hidden", + size: "headerLg", + showText: true, + }, + { breakpoint: "hidden xl:block", size: "headerXl", showText: true }, + ]; + + const renderNavigationItems = (size) => { + return navigationItems.map((item, index) => ( + + {item.text} + + )); + }; + + const renderAvatarGroup = (containerSize, avatarSize) => { + return ( + + {avatarImages.map((avatar, index) => ( + + ))} + + ); + }; + + const renderLoginButton = (size, marginRight) => { + return ( + + Log in + + ); + }; + + const renderCreateRuleButton = ( + buttonSize, + containerSize, + avatarSize, + marginLeft + ) => { + return ( + + ); + }; + + const renderLogo = (size, showText) => { + return ; + }; + + return ( +
+
+ +
+ {logoConfig.map((config, index) => ( +
+ {renderLogo(config.size, config.showText)} +
+ ))} +
+ +
+
+ + {renderNavigationItems("xsmall")} + {renderLoginButton("xsmall")} + +
+ +
+ + {renderNavigationItems("xsmall")} + {renderLoginButton("xsmall")} + +
+ +
+ + {renderNavigationItems("xsmall")} + +
+ +
+ {renderNavigationItems("large")} +
+ +
+ {renderNavigationItems("xlarge")} +
+ +
+
+ {renderLoginButton("xsmall", "mr-[var(--spacing-scale-010)]")} +
+
+ +
+ {renderLoginButton("large", "mr-[var(--spacing-scale-012)]")} +
+ +
+ {renderLoginButton("xlarge", "mr-[var(--spacing-scale-012)]")} +
+
+
+ + {/* Create rule button positioned outside HeaderTab */} +
+ {renderCreateRuleButton("xsmall", "small", "small")} +
+
+ {renderCreateRuleButton("xsmall", "medium", "medium")} +
+
+ {renderCreateRuleButton("large", "xlarge", "xlarge")} +
+
+ {renderCreateRuleButton("xlarge", "xlarge", "xlarge")} +
+
+
+ ); +} diff --git a/app/components/Logo.js b/app/components/Logo.js index c105307..7f77f63 100644 --- a/app/components/Logo.js +++ b/app/components/Logo.js @@ -8,6 +8,13 @@ export default function Logo({ size = "default", showText = true }) { lineHeight: "leading-[27.05px]", iconSize: "w-[27.05px] h-[27.05px]", }, + homeHeaderXsmall: { + containerHeight: "h-[14.11px]", + gap: "gap-[4.21px]", + textSize: "text-[11.57px]", + lineHeight: "leading-[14.24px]", + iconSize: "w-[14.11px] h-[14.11px]", + }, header: { containerHeight: "h-[20.85px]", gap: "gap-[4.21px]", @@ -53,7 +60,9 @@ export default function Logo({ size = "default", showText = true }) { }; const config = - size === "header" + size === "homeHeaderXsmall" + ? sizes.homeHeaderXsmall + : size === "header" ? sizes.header : size === "headerMd" ? sizes.headerMd @@ -76,7 +85,11 @@ export default function Logo({ size = "default", showText = true }) { {/* Logo Text - only show if showText is true */} {showText && (
CommunityRule
@@ -88,7 +101,9 @@ export default function Logo({ size = "default", showText = true }) { alt="CommunityRule Logo Icon" width={27.05} height={27.05} - className={`flex-shrink-0 ${config.iconSize}`} + className={`flex-shrink-0 ${config.iconSize} ${ + size === "homeHeaderXsmall" ? "filter brightness-0" : "" + }`} />
); diff --git a/app/components/MenuBar.js b/app/components/MenuBar.js index 484a279..ff52961 100644 --- a/app/components/MenuBar.js +++ b/app/components/MenuBar.js @@ -5,6 +5,8 @@ export default function MenuBar({ ...props }) { const sizeStyles = { + xsmall: + "px-[var(--spacing-scale-004)] py-[var(--spacing-scale-004)] gap-[var(--spacing-scale-001)] rounded-[4px]", default: "px-[var(--spacing-scale-004)] py-[var(--spacing-scale-004)] gap-[var(--spacing-scale-001)]", large: diff --git a/app/components/MenuBarItem.js b/app/components/MenuBarItem.js index 2eb8613..7b8d715 100644 --- a/app/components/MenuBarItem.js +++ b/app/components/MenuBarItem.js @@ -10,6 +10,7 @@ export default function MenuBarItem({ const variantStyles = { default: "bg-transparent text-[var(--color-content-default-brand-primary)] hover:bg-[var(--color-surface-default-tertiary)] hover:text-[var(--color-content-default-brand-primary)] active:bg-transparent active:text-[var(--color-content-default-brand-primary)] disabled:bg-[var(--color-surface-default-tertiary)] disabled:text-[var(--color-content-default-tertiary)] disabled:opacity-50 disabled:cursor-not-allowed", + home: "bg-transparent text-[var(--color-content-inverse-primary)] hover:bg-[var(--color-surface-default-tertiary)] hover:text-[var(--color-content-inverse-primary)] active:bg-transparent active:text-[var(--color-content-inverse-primary)] disabled:bg-[var(--color-surface-default-tertiary)] disabled:text-[var(--color-content-default-tertiary)] disabled:opacity-50 disabled:cursor-not-allowed", }; const activeOutlineStyles = { diff --git a/app/layout.js b/app/layout.js index 20c7983..ec36243 100644 --- a/app/layout.js +++ b/app/layout.js @@ -1,6 +1,5 @@ import { Inter, Bricolage_Grotesque } from "next/font/google"; import "./globals.css"; -import Header from "./components/Header"; import Footer from "./components/Footer"; const inter = Inter({ @@ -20,7 +19,6 @@ export default function RootLayout({ children }) {
-
{children}
diff --git a/app/page.js b/app/page.js index 7d1e0b7..dd37d17 100644 --- a/app/page.js +++ b/app/page.js @@ -1,3 +1,10 @@ +import HomeHeader from "./components/HomeHeader"; + export default function Page() { - return <>; + return ( + <> + +
{/* Your home page content will go here */}
+ + ); } diff --git a/public/assets/Union.svg b/public/assets/Union.svg new file mode 100644 index 0000000..3d996ec --- /dev/null +++ b/public/assets/Union.svg @@ -0,0 +1,3 @@ + + + From bc731e243128fab55d47b902fbea8f7f8186f418 Mon Sep 17 00:00:00 2001 From: adilallo <39313955+adilallo@users.noreply.github.com> Date: Wed, 6 Aug 2025 11:28:13 -0600 Subject: [PATCH 09/16] Small home header --- app/components/Button.js | 2 +- app/components/HeaderTab.js | 11 ++++++++--- app/components/HomeHeader.js | 14 +++++++++----- app/components/Logo.js | 15 +++++++++++++-- app/components/MenuBarItem.js | 23 ++++++++++++++++++++--- public/assets/Union_sm_md_lg.svg | 3 +++ public/assets/Union_xsm.svg | 3 +++ 7 files changed, 57 insertions(+), 14 deletions(-) create mode 100644 public/assets/Union_sm_md_lg.svg create mode 100644 public/assets/Union_xsm.svg diff --git a/app/components/Button.js b/app/components/Button.js index 99f562e..2460489 100644 --- a/app/components/Button.js +++ b/app/components/Button.js @@ -38,7 +38,7 @@ export default function Button({ default: "bg-[var(--color-surface-inverse-primary)] text-[var(--color-content-inverse-primary)] hover:bg-[var(--color-surface-inverse-primary)] hover:text-[var(--color-content-inverse-brand-primary)] hover:outline-[var(--border-color-default-brandprimary)] hover:outline-inset active:bg-[var(--color-surface-inverse-brand-primary)] active:text-[var(--color-content-inverse-primary)] active:outline-[var(--border-color-default-brandprimary)] active:outline-offset-1 disabled:bg-[var(--color-surface-default-secondary)] disabled:text-[var(--color-content-inverse-tertiary)] disabled:cursor-not-allowed disabled:opacity-50", secondary: - "bg-transparent text-[var(--color-content-default-brand-primary)] hover:bg-[var(--color-surface-default-secondary)] hover:text-[var(--color-content-default-primary)] hover:border-[var(--border-color-default-primary)] active:bg-[var(--color-surface-default-tertiary)] active:text-[var(--color-content-default-primary)] active:border-[var(--border-color-default-primary)] disabled:bg-[var(--color-surface-default-secondary)] disabled:text-[var(--color-content-default-tertiary)] disabled:border-[var(--color-content-default-tertiary)] disabled:cursor-not-allowed disabled:opacity-50", + "bg-transparent text-[var(--color-content-default-brand-primary)] hover:text-[var(--color-content-default-primary)] focus:outline-1 focus:outline-inset focus:outline-[var(--border-color-default-tertiary)] focus:shadow-[0_0_10px_1px_#FFFDD2] focus:blur-[0px] active:outline-[1.5px] active:outline-inset active:outline-[var(--color-content-default-brand-primary)] active:bg-[var(--color-surface-default-brand-primary)] active:text-[var(--color-content-inverse-primary)] disabled:bg-[var(--color-surface-default-secondary)] disabled:text-[var(--color-content-inverse-tertiary)] disabled:cursor-not-allowed disabled:opacity-50", }; const hoverOutlineStyles = { diff --git a/app/components/HeaderTab.js b/app/components/HeaderTab.js index 6d13923..ad97bf5 100644 --- a/app/components/HeaderTab.js +++ b/app/components/HeaderTab.js @@ -1,14 +1,19 @@ export default function HeaderTab({ children, className = "", ...props }) { return (
{children} Union + Union
); diff --git a/app/components/HomeHeader.js b/app/components/HomeHeader.js index 7ae15cb..e919e4a 100644 --- a/app/components/HomeHeader.js +++ b/app/components/HomeHeader.js @@ -25,7 +25,11 @@ export default function HomeHeader() { size: "homeHeaderXsmall", showText: false, }, - { breakpoint: "hidden sm:block md:hidden", size: "header", showText: true }, + { + breakpoint: "hidden sm:block md:hidden", + size: "homeHeaderSm", + showText: true, + }, { breakpoint: "hidden md:block lg:hidden", size: "headerMd", @@ -99,8 +103,8 @@ export default function HomeHeader() { }; return ( -
-
+
+
{logoConfig.map((config, index) => ( @@ -118,8 +122,8 @@ export default function HomeHeader() {
-
- +
+ {renderNavigationItems("xsmall")} {renderLoginButton("xsmall")} diff --git a/app/components/Logo.js b/app/components/Logo.js index 7f77f63..b4f989f 100644 --- a/app/components/Logo.js +++ b/app/components/Logo.js @@ -15,6 +15,13 @@ export default function Logo({ size = "default", showText = true }) { lineHeight: "leading-[14.24px]", iconSize: "w-[14.11px] h-[14.11px]", }, + homeHeaderSm: { + containerHeight: "h-[21.06px]", + gap: "gap-[3.19px]", + textSize: "text-[11.69px]", + lineHeight: "leading-[14.39px]", + iconSize: "w-[14.39px] h-[14.39px]", + }, header: { containerHeight: "h-[20.85px]", gap: "gap-[4.21px]", @@ -62,6 +69,8 @@ export default function Logo({ size = "default", showText = true }) { const config = size === "homeHeaderXsmall" ? sizes.homeHeaderXsmall + : size === "homeHeaderSm" + ? sizes.homeHeaderSm : size === "header" ? sizes.header : size === "headerMd" @@ -86,7 +95,7 @@ export default function Logo({ size = "default", showText = true }) { {showText && (
diff --git a/app/components/MenuBarItem.js b/app/components/MenuBarItem.js index 7b8d715..9709e6f 100644 --- a/app/components/MenuBarItem.js +++ b/app/components/MenuBarItem.js @@ -10,12 +10,12 @@ export default function MenuBarItem({ const variantStyles = { default: "bg-transparent text-[var(--color-content-default-brand-primary)] hover:bg-[var(--color-surface-default-tertiary)] hover:text-[var(--color-content-default-brand-primary)] active:bg-transparent active:text-[var(--color-content-default-brand-primary)] disabled:bg-[var(--color-surface-default-tertiary)] disabled:text-[var(--color-content-default-tertiary)] disabled:opacity-50 disabled:cursor-not-allowed", - home: "bg-transparent text-[var(--color-content-inverse-primary)] hover:bg-[var(--color-surface-default-tertiary)] hover:text-[var(--color-content-inverse-primary)] active:bg-transparent active:text-[var(--color-content-inverse-primary)] disabled:bg-[var(--color-surface-default-tertiary)] disabled:text-[var(--color-content-default-tertiary)] disabled:opacity-50 disabled:cursor-not-allowed", + home: "bg-transparent text-[var(--color-content-inverse-primary)] hover:bg-[var(--color-content-default-brand-accent)] hover:text-[var(--color-content-inverse-primary)] active:bg-transparent active:text-[var(--color-content-inverse-primary)] disabled:bg-[var(--color-surface-default-tertiary)] disabled:text-[var(--color-content-default-tertiary)] disabled:opacity-50 disabled:cursor-not-allowed", }; const activeOutlineStyles = { xsmall: - "active:outline-1 active:outline-[var(--color-content-default-brand-primary)] active:outline-offset-1", + "active:outline-1 active:outline-[var(--color-content-default-primary)] active:outline-offset-1", default: "active:outline-1 active:outline-[var(--color-content-default-brand-primary)] active:outline-offset-1", large: @@ -24,6 +24,19 @@ export default function MenuBarItem({ "active:outline-2 active:outline-[var(--color-content-default-brand-primary)] active:outline-offset-1", }; + const homeOutlineStyles = { + xsmall: + "active:outline-1 active:outline-[var(--color-content-default-primary)]", + xsmallUseCases: + "active:outline-1 active:outline-[var(--color-content-default-primary)]", + default: + "active:outline-1 active:outline-[var(--color-content-default-primary)]", + large: + "active:outline-[1.75px] active:outline-[var(--color-content-default-primary)]", + xlarge: + "active:outline-2 active:outline-[var(--color-content-default-primary)]", + }; + const sizeStyles = { default: "px-[var(--spacing-measures-spacing-016)] py-[var(--spacing-measures-spacing-016)] gap-[var(--spacing-scale-004)]", @@ -59,7 +72,11 @@ export default function MenuBarItem({ finalVariant = "default"; } - const combinedStyles = `${baseStyles} ${variantStyles[finalVariant]} ${activeOutlineStyles[size]} ${className}`; + const combinedStyles = `${baseStyles} ${variantStyles[finalVariant]} ${ + finalVariant === "home" + ? homeOutlineStyles[size] + : activeOutlineStyles[size] + } ${className}`; if (disabled) { return ( diff --git a/public/assets/Union_sm_md_lg.svg b/public/assets/Union_sm_md_lg.svg new file mode 100644 index 0000000..44bd233 --- /dev/null +++ b/public/assets/Union_sm_md_lg.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/Union_xsm.svg b/public/assets/Union_xsm.svg new file mode 100644 index 0000000..8583c9c --- /dev/null +++ b/public/assets/Union_xsm.svg @@ -0,0 +1,3 @@ + + + From 6d2e045af6a3abaa0ea07876b12de33a9faedc89 Mon Sep 17 00:00:00 2001 From: adilallo <39313955+adilallo@users.noreply.github.com> Date: Wed, 6 Aug 2025 14:50:11 -0600 Subject: [PATCH 10/16] Medium home header --- app/components/Button.js | 2 +- app/components/HeaderTab.js | 4 +-- app/components/HomeHeader.js | 48 ++++++++++++++++++++++------------- app/components/Logo.js | 17 +++++++++++-- app/components/MenuBar.js | 2 ++ app/components/MenuBarItem.js | 25 ++++++++++++++---- 6 files changed, 70 insertions(+), 28 deletions(-) diff --git a/app/components/Button.js b/app/components/Button.js index 2460489..bfc3145 100644 --- a/app/components/Button.js +++ b/app/components/Button.js @@ -27,7 +27,7 @@ export default function Button({ xsmall: "font-['Inter'] text-[10px] leading-[12px] font-medium tracking-[0%]", small: - "font-['Inter'] text-[10px] leading-[12.5px] font-medium tracking-[0%]", + "font-['Inter'] text-[12px] leading-[14px] font-medium tracking-[0%]", large: "font-['Inter'] text-[16px] leading-[20px] font-medium tracking-[0%]", xlarge: diff --git a/app/components/HeaderTab.js b/app/components/HeaderTab.js index ad97bf5..40f51f3 100644 --- a/app/components/HeaderTab.js +++ b/app/components/HeaderTab.js @@ -1,7 +1,7 @@ export default function HeaderTab({ children, className = "", ...props }) { return (
{children} @@ -13,7 +13,7 @@ export default function HeaderTab({ children, className = "", ...props }) { Union
); diff --git a/app/components/HomeHeader.js b/app/components/HomeHeader.js index e919e4a..c730a6c 100644 --- a/app/components/HomeHeader.js +++ b/app/components/HomeHeader.js @@ -32,7 +32,7 @@ export default function HomeHeader() { }, { breakpoint: "hidden md:block lg:hidden", - size: "headerMd", + size: "homeHeaderMd", showText: true, }, { @@ -48,8 +48,25 @@ export default function HomeHeader() { {item.text} @@ -76,7 +93,7 @@ export default function HomeHeader() { Log in @@ -104,7 +121,7 @@ export default function HomeHeader() { return (
-
+
{logoConfig.map((config, index) => ( @@ -116,23 +133,21 @@ export default function HomeHeader() {
- + {renderNavigationItems("xsmall")} {renderLoginButton("xsmall")}
- + {renderNavigationItems("xsmall")} {renderLoginButton("xsmall")}
-
- - {renderNavigationItems("xsmall")} - +
+ {renderNavigationItems("homeMd")}
@@ -143,12 +158,6 @@ export default function HomeHeader() { {renderNavigationItems("xlarge")}
-
-
- {renderLoginButton("xsmall", "mr-[var(--spacing-scale-010)]")} -
-
-
{renderLoginButton("large", "mr-[var(--spacing-scale-012)]")}
@@ -164,7 +173,10 @@ export default function HomeHeader() { {renderCreateRuleButton("xsmall", "small", "small")}
- {renderCreateRuleButton("xsmall", "medium", "medium")} +
+ {renderLoginButton("homeMd", "mr-[var(--spacing-scale-010)]")} + {renderCreateRuleButton("small", "medium", "medium")} +
{renderCreateRuleButton("large", "xlarge", "xlarge")} diff --git a/app/components/Logo.js b/app/components/Logo.js index b4f989f..69fadd0 100644 --- a/app/components/Logo.js +++ b/app/components/Logo.js @@ -22,6 +22,13 @@ export default function Logo({ size = "default", showText = true }) { lineHeight: "leading-[14.39px]", iconSize: "w-[14.39px] h-[14.39px]", }, + homeHeaderMd: { + containerHeight: "h-[32.24px]", + gap: "gap-[4.89px]", + textSize: "text-[17.89px]", + lineHeight: "leading-[22.02px]", + iconSize: "w-[22.02px] h-[22.02px]", + }, header: { containerHeight: "h-[20.85px]", gap: "gap-[4.21px]", @@ -71,6 +78,8 @@ export default function Logo({ size = "default", showText = true }) { ? sizes.homeHeaderXsmall : size === "homeHeaderSm" ? sizes.homeHeaderSm + : size === "homeHeaderMd" + ? sizes.homeHeaderMd : size === "header" ? sizes.header : size === "headerMd" @@ -95,7 +104,9 @@ export default function Logo({ size = "default", showText = true }) { {showText && (
Date: Wed, 6 Aug 2025 22:39:19 -0600 Subject: [PATCH 11/16] Large home header --- app/components/Avatar.js | 1 + app/components/AvatarContainer.js | 1 + app/components/HeaderTab.js | 4 ++-- app/components/HomeHeader.js | 27 ++++++++++++--------------- app/components/Logo.js | 15 +++++++++++++-- app/components/MenuBarItem.js | 2 ++ 6 files changed, 31 insertions(+), 19 deletions(-) diff --git a/app/components/Avatar.js b/app/components/Avatar.js index f3d8f9c..2abbefe 100644 --- a/app/components/Avatar.js +++ b/app/components/Avatar.js @@ -8,6 +8,7 @@ export default function Avatar({ const sizeStyles = { small: "w-[16px] h-[16px]", medium: "w-[18px] h-[18px]", + large: "w-[24px] h-[24px]", xlarge: "w-[32px] h-[32px]", }; diff --git a/app/components/AvatarContainer.js b/app/components/AvatarContainer.js index 311687f..55ecfff 100644 --- a/app/components/AvatarContainer.js +++ b/app/components/AvatarContainer.js @@ -7,6 +7,7 @@ export default function AvatarContainer({ const sizeStyles = { small: "flex -space-x-2", medium: "flex -space-x-[9px]", + large: "flex -space-x-[10px]", xlarge: "flex -space-x-[13px]", }; diff --git a/app/components/HeaderTab.js b/app/components/HeaderTab.js index 40f51f3..7d8c54a 100644 --- a/app/components/HeaderTab.js +++ b/app/components/HeaderTab.js @@ -1,7 +1,7 @@ export default function HeaderTab({ children, className = "", ...props }) { return (
{children} @@ -13,7 +13,7 @@ export default function HeaderTab({ children, className = "", ...props }) { Union
); diff --git a/app/components/HomeHeader.js b/app/components/HomeHeader.js index c730a6c..9e0d882 100644 --- a/app/components/HomeHeader.js +++ b/app/components/HomeHeader.js @@ -37,7 +37,7 @@ export default function HomeHeader() { }, { breakpoint: "hidden lg:block xl:hidden", - size: "headerLg", + size: "homeHeaderLg", showText: true, }, { breakpoint: "hidden xl:block", size: "headerXl", showText: true }, @@ -53,9 +53,12 @@ export default function HomeHeader() { (size === "xsmall" || size === "default" || size === "home" || - size === "homeMd") + size === "homeMd" || + size === "large") ? size === "home" || size === "homeMd" ? "homeMd" + : size === "large" + ? "large" : "xsmallUseCases" : size } @@ -63,7 +66,8 @@ export default function HomeHeader() { size === "xsmall" || size === "default" || size === "home" || - size === "homeMd" + size === "homeMd" || + size === "large" ? "home" : "default" } @@ -121,8 +125,8 @@ export default function HomeHeader() { return (
-
- +
+
{logoConfig.map((config, index) => (
@@ -150,21 +154,13 @@ export default function HomeHeader() { {renderNavigationItems("homeMd")}
-
+
{renderNavigationItems("large")}
{renderNavigationItems("xlarge")}
- -
- {renderLoginButton("large", "mr-[var(--spacing-scale-012)]")} -
- -
- {renderLoginButton("xlarge", "mr-[var(--spacing-scale-012)]")} -
@@ -179,7 +175,8 @@ export default function HomeHeader() {
- {renderCreateRuleButton("large", "xlarge", "xlarge")} + {renderLoginButton("large", "mr-[var(--spacing-scale-004)]")} + {renderCreateRuleButton("large", "large", "large")}
{renderCreateRuleButton("xlarge", "xlarge", "xlarge")} diff --git a/app/components/Logo.js b/app/components/Logo.js index 69fadd0..2f828dc 100644 --- a/app/components/Logo.js +++ b/app/components/Logo.js @@ -29,6 +29,13 @@ export default function Logo({ size = "default", showText = true }) { lineHeight: "leading-[22.02px]", iconSize: "w-[22.02px] h-[22.02px]", }, + homeHeaderLg: { + containerHeight: "h-[28px]", + gap: "gap-[6.55px]", + textSize: "text-[21.97px]", + lineHeight: "leading-[27.05px]", + iconSize: "w-[27.05px] h-[27.05px]", + }, header: { containerHeight: "h-[20.85px]", gap: "gap-[4.21px]", @@ -80,6 +87,8 @@ export default function Logo({ size = "default", showText = true }) { ? sizes.homeHeaderSm : size === "homeHeaderMd" ? sizes.homeHeaderMd + : size === "homeHeaderLg" + ? sizes.homeHeaderLg : size === "header" ? sizes.header : size === "headerMd" @@ -106,7 +115,8 @@ export default function Logo({ size = "default", showText = true }) { className={`font-['Bricolage_Grotesque'] ${ size === "homeHeaderXsmall" || size === "homeHeaderSm" || - size === "homeHeaderMd" + size === "homeHeaderMd" || + size === "homeHeaderLg" ? "text-[var(--color-content-inverse-primary)]" : "text-[var(--color-content-default-primary)]" } ${config.textSize} ${config.lineHeight} font-normal tracking-[0px]`} @@ -124,7 +134,8 @@ export default function Logo({ size = "default", showText = true }) { className={`flex-shrink-0 ${config.iconSize} ${ size === "homeHeaderXsmall" || size === "homeHeaderSm" || - size === "homeHeaderMd" + size === "homeHeaderMd" || + size === "homeHeaderLg" ? "filter brightness-0" : "" }`} diff --git a/app/components/MenuBarItem.js b/app/components/MenuBarItem.js index 4d54fc1..77a788c 100644 --- a/app/components/MenuBarItem.js +++ b/app/components/MenuBarItem.js @@ -37,6 +37,8 @@ export default function MenuBarItem({ "active:outline-[1.5px] active:outline-[var(--color-content-default-primary)]", homeUseCases: "active:outline-[1.5px] active:outline-[var(--color-content-default-primary)]", + largeUseCases: + "active:outline-[1.75px] active:outline-[var(--color-content-default-primary)]", large: "active:outline-[1.75px] active:outline-[var(--color-content-default-primary)]", xlarge: From 0272011beb66e933ca890542615bf6229a84acf3 Mon Sep 17 00:00:00 2001 From: adilallo <39313955+adilallo@users.noreply.github.com> Date: Wed, 6 Aug 2025 23:45:09 -0600 Subject: [PATCH 12/16] Xlarge home header --- app/components/HeaderTab.js | 9 +++++++-- app/components/HomeHeader.js | 19 +++++++++++++------ app/components/Logo.js | 15 +++++++++++++-- app/components/MenuBarItem.js | 5 +++++ public/assets/Union_xlg.svg | 3 +++ 5 files changed, 41 insertions(+), 10 deletions(-) create mode 100644 public/assets/Union_xlg.svg diff --git a/app/components/HeaderTab.js b/app/components/HeaderTab.js index 7d8c54a..41d4d86 100644 --- a/app/components/HeaderTab.js +++ b/app/components/HeaderTab.js @@ -1,7 +1,7 @@ export default function HeaderTab({ children, className = "", ...props }) { return (
{children} @@ -13,7 +13,12 @@ export default function HeaderTab({ children, className = "", ...props }) { Union + Union
); diff --git a/app/components/HomeHeader.js b/app/components/HomeHeader.js index 9e0d882..99a620e 100644 --- a/app/components/HomeHeader.js +++ b/app/components/HomeHeader.js @@ -40,7 +40,7 @@ export default function HomeHeader() { size: "homeHeaderLg", showText: true, }, - { breakpoint: "hidden xl:block", size: "headerXl", showText: true }, + { breakpoint: "hidden xl:block", size: "homeHeaderXl", showText: true }, ]; const renderNavigationItems = (size) => { @@ -54,11 +54,14 @@ export default function HomeHeader() { size === "default" || size === "home" || size === "homeMd" || - size === "large") + size === "large" || + size === "homeXlarge") ? size === "home" || size === "homeMd" ? "homeMd" : size === "large" ? "large" + : size === "homeXlarge" + ? "homeXlarge" : "xsmallUseCases" : size } @@ -67,7 +70,8 @@ export default function HomeHeader() { size === "default" || size === "home" || size === "homeMd" || - size === "large" + size === "large" || + size === "homeXlarge" ? "home" : "default" } @@ -125,7 +129,7 @@ export default function HomeHeader() { return (
-
+
{logoConfig.map((config, index) => ( @@ -158,8 +162,10 @@ export default function HomeHeader() { {renderNavigationItems("large")}
-
- {renderNavigationItems("xlarge")} +
+ + {renderNavigationItems("homeXlarge")} +
@@ -179,6 +185,7 @@ export default function HomeHeader() { {renderCreateRuleButton("large", "large", "large")}
+ {renderLoginButton("homeXlarge", "mr-[var(--spacing-scale-004)]")} {renderCreateRuleButton("xlarge", "xlarge", "xlarge")}
diff --git a/app/components/Logo.js b/app/components/Logo.js index 2f828dc..1355344 100644 --- a/app/components/Logo.js +++ b/app/components/Logo.js @@ -36,6 +36,13 @@ export default function Logo({ size = "default", showText = true }) { lineHeight: "leading-[27.05px]", iconSize: "w-[27.05px] h-[27.05px]", }, + homeHeaderXl: { + containerHeight: "h-[36px]", + gap: "gap-[8.64px]", + textSize: "text-[29.01px]", + lineHeight: "leading-[35.7px]", + iconSize: "w-[35.7px] h-[35.7px]", + }, header: { containerHeight: "h-[20.85px]", gap: "gap-[4.21px]", @@ -89,6 +96,8 @@ export default function Logo({ size = "default", showText = true }) { ? sizes.homeHeaderMd : size === "homeHeaderLg" ? sizes.homeHeaderLg + : size === "homeHeaderXl" + ? sizes.homeHeaderXl : size === "header" ? sizes.header : size === "headerMd" @@ -116,7 +125,8 @@ export default function Logo({ size = "default", showText = true }) { size === "homeHeaderXsmall" || size === "homeHeaderSm" || size === "homeHeaderMd" || - size === "homeHeaderLg" + size === "homeHeaderLg" || + size === "homeHeaderXl" ? "text-[var(--color-content-inverse-primary)]" : "text-[var(--color-content-default-primary)]" } ${config.textSize} ${config.lineHeight} font-normal tracking-[0px]`} @@ -135,7 +145,8 @@ export default function Logo({ size = "default", showText = true }) { size === "homeHeaderXsmall" || size === "homeHeaderSm" || size === "homeHeaderMd" || - size === "homeHeaderLg" + size === "homeHeaderLg" || + size === "homeHeaderXl" ? "filter brightness-0" : "" }`} diff --git a/app/components/MenuBarItem.js b/app/components/MenuBarItem.js index 77a788c..fc49c88 100644 --- a/app/components/MenuBarItem.js +++ b/app/components/MenuBarItem.js @@ -41,6 +41,8 @@ export default function MenuBarItem({ "active:outline-[1.75px] active:outline-[var(--color-content-default-primary)]", large: "active:outline-[1.75px] active:outline-[var(--color-content-default-primary)]", + homeXlarge: + "active:outline-[2px] active:outline-[var(--color-content-default-primary)]", xlarge: "active:outline-2 active:outline-[var(--color-content-default-primary)]", }; @@ -58,6 +60,8 @@ export default function MenuBarItem({ "px-[var(--spacing-scale-002)] py-[var(--spacing-scale-008)] gap-[var(--spacing-scale-004)]", large: "px-[var(--spacing-scale-012)] py-[var(--spacing-scale-012)] gap-[var(--spacing-scale-004)]", + homeXlarge: + "px-[var(--spacing-scale-016)] py-[var(--spacing-scale-016)] gap-[var(--spacing-scale-004)] h-[44px]", xlarge: "px-[var(--spacing-scale-016)] py-[var(--spacing-scale-008)] gap-[var(--spacing-scale-004)]", }; @@ -79,6 +83,7 @@ export default function MenuBarItem({ homeMd: mediumTextStyle, homeUseCases: mediumTextStyle, large: largeTextStyle, + homeXlarge: xlargeTextStyle, xlarge: xlargeTextStyle, }; diff --git a/public/assets/Union_xlg.svg b/public/assets/Union_xlg.svg new file mode 100644 index 0000000..3d996ec --- /dev/null +++ b/public/assets/Union_xlg.svg @@ -0,0 +1,3 @@ + + + From 6bfcaf2aa07b50663bdb7d203bfe5e76128b21d8 Mon Sep 17 00:00:00 2001 From: adilallo <39313955+adilallo@users.noreply.github.com> Date: Thu, 7 Aug 2025 08:48:52 -0600 Subject: [PATCH 13/16] Changes to tidy up header --- app/components/Header.js | 3 ++- app/components/HeaderTab.js | 6 +++--- app/components/HomeHeader.js | 11 +++++++++++ app/components/MenuBarItem.js | 6 ++++-- app/globals.css | 5 +++++ app/layout.js | 2 ++ app/page.js | 9 +-------- 7 files changed, 28 insertions(+), 14 deletions(-) diff --git a/app/components/Header.js b/app/components/Header.js index 70fdf13..c32f8ff 100644 --- a/app/components/Header.js +++ b/app/components/Header.js @@ -5,7 +5,7 @@ import Button from "./Button"; import AvatarContainer from "./AvatarContainer"; import Avatar from "./Avatar"; -export default function Header() { +export default function Header({ onToggle }) { const navigationItems = [ { href: "#", text: "Use cases", extraPadding: true }, { href: "#", text: "Learn" }, @@ -40,6 +40,7 @@ export default function Header() { key={index} href={item.href} size={item.extraPadding && size === "xsmall" ? "xsmallUseCases" : size} + onClick={onToggle} > {item.text} diff --git a/app/components/HeaderTab.js b/app/components/HeaderTab.js index 41d4d86..85da467 100644 --- a/app/components/HeaderTab.js +++ b/app/components/HeaderTab.js @@ -8,17 +8,17 @@ export default function HeaderTab({ children, className = "", ...props }) { Union Union Union
); diff --git a/app/components/HomeHeader.js b/app/components/HomeHeader.js index 99a620e..da7dd72 100644 --- a/app/components/HomeHeader.js +++ b/app/components/HomeHeader.js @@ -1,3 +1,6 @@ +"use client"; + +import { useState } from "react"; import Logo from "./Logo"; import MenuBar from "./MenuBar"; import MenuBarItem from "./MenuBarItem"; @@ -5,8 +8,11 @@ import Button from "./Button"; import AvatarContainer from "./AvatarContainer"; import Avatar from "./Avatar"; import HeaderTab from "./HeaderTab"; +import Header from "./Header"; export default function HomeHeader() { + const [showRegularHeader, setShowRegularHeader] = useState(false); + const navigationItems = [ { href: "#", text: "Use cases", extraPadding: true }, { href: "#", text: "Learn" }, @@ -75,6 +81,7 @@ export default function HomeHeader() { ? "home" : "default" } + onClick={() => setShowRegularHeader(!showRegularHeader)} > {item.text} @@ -127,6 +134,10 @@ export default function HomeHeader() { return ; }; + if (showRegularHeader) { + return
setShowRegularHeader(false)} />; + } + return (
diff --git a/app/components/MenuBarItem.js b/app/components/MenuBarItem.js index fc49c88..b9949c6 100644 --- a/app/components/MenuBarItem.js +++ b/app/components/MenuBarItem.js @@ -22,6 +22,8 @@ export default function MenuBarItem({ "active:outline-[1.5px] active:outline-[var(--color-content-default-brand-primary)]", large: "active:outline-[1.75px] active:outline-[var(--color-content-default-brand-primary)]", + homeXlarge: + "active:outline-[2px] active:outline-[var(--color-content-default-brand-primary)]", xlarge: "active:outline-2 active:outline-[var(--color-content-default-brand-primary)]", }; @@ -59,11 +61,11 @@ export default function MenuBarItem({ homeUseCases: "px-[var(--spacing-scale-002)] py-[var(--spacing-scale-008)] gap-[var(--spacing-scale-004)]", large: - "px-[var(--spacing-scale-012)] py-[var(--spacing-scale-012)] gap-[var(--spacing-scale-004)]", + "px-[var(--spacing-scale-012)] py-[var(--spacing-scale-012)] gap-[var(--spacing-scale-004)] h-[44px]", homeXlarge: "px-[var(--spacing-scale-016)] py-[var(--spacing-scale-016)] gap-[var(--spacing-scale-004)] h-[44px]", xlarge: - "px-[var(--spacing-scale-016)] py-[var(--spacing-scale-008)] gap-[var(--spacing-scale-004)]", + "px-[var(--spacing-scale-016)] py-[var(--spacing-scale-008)] gap-[var(--spacing-scale-004)] h-[44px]", }; const smallTextStyle = diff --git a/app/globals.css b/app/globals.css index 4135e88..320e1b9 100644 --- a/app/globals.css +++ b/app/globals.css @@ -2,3 +2,8 @@ @tailwind components; @tailwind utilities; @import "./tailwind.css"; + +body { + background-color: black; + min-height: 100vh; +} diff --git a/app/layout.js b/app/layout.js index ec36243..e36ac0e 100644 --- a/app/layout.js +++ b/app/layout.js @@ -1,5 +1,6 @@ import { Inter, Bricolage_Grotesque } from "next/font/google"; import "./globals.css"; +import HomeHeader from "./components/HomeHeader"; import Footer from "./components/Footer"; const inter = Inter({ @@ -19,6 +20,7 @@ export default function RootLayout({ children }) {
+
{children}
diff --git a/app/page.js b/app/page.js index dd37d17..b68b686 100644 --- a/app/page.js +++ b/app/page.js @@ -1,10 +1,3 @@ -import HomeHeader from "./components/HomeHeader"; - export default function Page() { - return ( - <> - -
{/* Your home page content will go here */}
- - ); + return
{/* home page content will go here */}
; } From a1fb1a1c7ce0d07004cb8141b3027ee40a179355 Mon Sep 17 00:00:00 2001 From: adilallo <39313955+adilallo@users.noreply.github.com> Date: Thu, 7 Aug 2025 10:53:50 -0600 Subject: [PATCH 14/16] Accessibility pass --- app/components/Button.js | 14 +++-- app/components/Header.js | 106 ++++++++++++++++++++-------------- app/components/HeaderTab.js | 2 +- app/components/HomeHeader.js | 79 ++++++++++++++++--------- app/components/Logo.js | 14 ++++- app/components/MenuBar.js | 7 ++- app/components/MenuBarItem.js | 58 ++++++++++++------- 7 files changed, 179 insertions(+), 101 deletions(-) diff --git a/app/components/Button.js b/app/components/Button.js index bfc3145..f120a79 100644 --- a/app/components/Button.js +++ b/app/components/Button.js @@ -36,9 +36,9 @@ export default function Button({ const variantStyles = { default: - "bg-[var(--color-surface-inverse-primary)] text-[var(--color-content-inverse-primary)] hover:bg-[var(--color-surface-inverse-primary)] hover:text-[var(--color-content-inverse-brand-primary)] hover:outline-[var(--border-color-default-brandprimary)] hover:outline-inset active:bg-[var(--color-surface-inverse-brand-primary)] active:text-[var(--color-content-inverse-primary)] active:outline-[var(--border-color-default-brandprimary)] active:outline-offset-1 disabled:bg-[var(--color-surface-default-secondary)] disabled:text-[var(--color-content-inverse-tertiary)] disabled:cursor-not-allowed disabled:opacity-50", + "bg-[var(--color-surface-inverse-primary)] text-[var(--color-content-inverse-primary)] hover:bg-[var(--color-surface-inverse-primary)] hover:text-[var(--color-content-inverse-brand-primary)] hover:outline-[var(--border-color-default-brandprimary)] hover:outline-inset hover:scale-[1.02] hover:shadow-lg active:bg-[var(--color-surface-inverse-brand-primary)] active:text-[var(--color-content-inverse-primary)] active:outline-[var(--border-color-default-brandprimary)] active:outline-offset-1 active:scale-[0.98] disabled:bg-[var(--color-surface-default-secondary)] disabled:text-[var(--color-content-inverse-tertiary)] disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:scale-100 disabled:active:scale-100 disabled:hover:shadow-none", secondary: - "bg-transparent text-[var(--color-content-default-brand-primary)] hover:text-[var(--color-content-default-primary)] focus:outline-1 focus:outline-inset focus:outline-[var(--border-color-default-tertiary)] focus:shadow-[0_0_10px_1px_#FFFDD2] focus:blur-[0px] active:outline-[1.5px] active:outline-inset active:outline-[var(--color-content-default-brand-primary)] active:bg-[var(--color-surface-default-brand-primary)] active:text-[var(--color-content-inverse-primary)] disabled:bg-[var(--color-surface-default-secondary)] disabled:text-[var(--color-content-inverse-tertiary)] disabled:cursor-not-allowed disabled:opacity-50", + "bg-transparent text-[var(--color-content-default-brand-primary)] hover:text-[var(--color-content-default-primary)] hover:scale-[1.02] hover:bg-[var(--color-surface-default-tertiary)] focus:outline-1 focus:outline-inset focus:outline-[var(--border-color-default-tertiary)] focus:shadow-[0_0_10px_1px_#FFFDD2] focus:blur-[0px] active:outline-[1.5px] active:outline-inset active:outline-[var(--color-content-default-brand-primary)] active:bg-[var(--color-surface-default-brand-primary)] active:text-[var(--color-content-inverse-primary)] active:scale-[0.98] disabled:bg-[var(--color-surface-default-secondary)] disabled:text-[var(--color-content-inverse-tertiary)] disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:scale-100 disabled:active:scale-100", }; const hoverOutlineStyles = { @@ -48,9 +48,10 @@ export default function Button({ xlarge: "hover:outline-[2.5px]", }; - const focusStyles = "focus:shadow-[0_0_10px_1px_#FFFDD2] focus:outline-none"; + const focusStyles = + "focus:shadow-[0_0_10px_1px_#FFFDD2] focus:outline-none focus:ring-1 focus:ring-[var(--color-content-default-brand-primary)] focus:ring-offset-1 focus:scale-[1.02]"; - const baseStyles = `inline-flex items-center justify-start box-border ${sizeStyles[size]} rounded-[var(--radius-measures-radius-full)] ${fontStyles[size]} transition-all duration-200 cursor-pointer ${variantStyles[variant]} ${hoverOutlineStyles[size]} ${focusStyles}`; + const baseStyles = `inline-flex items-center justify-start box-border ${sizeStyles[size]} rounded-[var(--radius-measures-radius-full)] ${fontStyles[size]} transition-all duration-200 ease-in-out cursor-pointer ${variantStyles[variant]} ${hoverOutlineStyles[size]} ${focusStyles}`; let finalVariant = variant; if (disabled) { @@ -61,8 +62,11 @@ export default function Button({ const accessibilityProps = { ...(ariaLabel && { "aria-label": ariaLabel }), + ...(disabled && { "aria-disabled": "true" }), ...(target && { target }), ...(rel && { rel }), + tabIndex: disabled ? -1 : 0, + ...props, }; if (href && !disabled) { @@ -72,7 +76,6 @@ export default function Button({ className={combinedStyles} onClick={onClick} {...accessibilityProps} - {...props} > {children} @@ -86,7 +89,6 @@ export default function Button({ disabled={disabled} onClick={onClick} {...accessibilityProps} - {...props} > {children} diff --git a/app/components/Header.js b/app/components/Header.js index c32f8ff..0720f01 100644 --- a/app/components/Header.js +++ b/app/components/Header.js @@ -41,6 +41,7 @@ export default function Header({ onToggle }) { href={item.href} size={item.extraPadding && size === "xsmall" ? "xsmallUseCases" : size} onClick={onToggle} + ariaLabel={`Navigate to ${item.text} page`} > {item.text} @@ -62,22 +63,20 @@ export default function Header({ onToggle }) { ); }; - const renderLoginButton = (size, marginRight) => { + const renderLoginButton = (size) => { return ( - + Log in ); }; - const renderCreateRuleButton = ( - buttonSize, - containerSize, - avatarSize, - marginLeft - ) => { + const renderCreateRuleButton = (buttonSize, containerSize, avatarSize) => { return ( - @@ -89,9 +88,18 @@ export default function Header({ onToggle }) { }; return ( -
-
-
+
+
); } diff --git a/app/components/HeaderTab.js b/app/components/HeaderTab.js index 85da467..3c66b5d 100644 --- a/app/components/HeaderTab.js +++ b/app/components/HeaderTab.js @@ -1,7 +1,7 @@ export default function HeaderTab({ children, className = "", ...props }) { return (
{children} diff --git a/app/components/HomeHeader.js b/app/components/HomeHeader.js index da7dd72..a74a87e 100644 --- a/app/components/HomeHeader.js +++ b/app/components/HomeHeader.js @@ -82,6 +82,7 @@ export default function HomeHeader() { : "default" } onClick={() => setShowRegularHeader(!showRegularHeader)} + ariaLabel={`Navigate to ${item.text} page`} > {item.text} @@ -103,27 +104,26 @@ export default function HomeHeader() { ); }; - const renderLoginButton = (size, marginRight) => { + const renderLoginButton = (size) => { return ( Log in ); }; - const renderCreateRuleButton = ( - buttonSize, - containerSize, - avatarSize, - marginLeft - ) => { + const renderCreateRuleButton = (buttonSize, containerSize, avatarSize) => { return ( - @@ -139,9 +139,18 @@ export default function HomeHeader() { } return ( -
-
+
+
); } diff --git a/app/components/Logo.js b/app/components/Logo.js index 1355344..382ae0c 100644 --- a/app/components/Logo.js +++ b/app/components/Logo.js @@ -116,7 +116,9 @@ export default function Logo({ size = "default", showText = true }) {
{/* Logo Text - only show if showText is true */} {showText && ( @@ -129,7 +131,10 @@ export default function Logo({ size = "default", showText = true }) { size === "homeHeaderXl" ? "text-[var(--color-content-inverse-primary)]" : "text-[var(--color-content-default-primary)]" - } ${config.textSize} ${config.lineHeight} font-normal tracking-[0px]`} + } ${config.textSize} ${ + config.lineHeight + } font-normal tracking-[0px] transition-colors duration-200`} + aria-label="CommunityRule" > CommunityRule
@@ -141,7 +146,9 @@ export default function Logo({ size = "default", showText = true }) { alt="CommunityRule Logo Icon" width={27.05} height={27.05} - className={`flex-shrink-0 ${config.iconSize} ${ + className={`flex-shrink-0 ${ + config.iconSize + } transition-all duration-200 ${ size === "homeHeaderXsmall" || size === "homeHeaderSm" || size === "homeHeaderMd" || @@ -150,6 +157,7 @@ export default function Logo({ size = "default", showText = true }) { ? "filter brightness-0" : "" }`} + aria-hidden="true" />
); diff --git a/app/components/MenuBar.js b/app/components/MenuBar.js index e3188fc..275d6d3 100644 --- a/app/components/MenuBar.js +++ b/app/components/MenuBar.js @@ -18,7 +18,12 @@ export default function MenuBar({ const baseStyles = `flex items-center ${sizeStyles[size]} ${className}`; return ( -