From aecf85815a6671a8c21b208f099e514a6363bfb5 Mon Sep 17 00:00:00 2001 From: bharath kumar <164022397+bharathkumar39293@users.noreply.github.com> Date: Fri, 27 Feb 2026 12:24:58 +0600 Subject: [PATCH 01/22] fix(js-core): use closest() fallback for nested click target matching (#7327) Co-authored-by: Dhruwang --- .../src/lib/common/tests/utils.test.ts | 83 ++++++++++++++++++- packages/js-core/src/lib/common/utils.ts | 26 ++++-- 2 files changed, 99 insertions(+), 10 deletions(-) diff --git a/packages/js-core/src/lib/common/tests/utils.test.ts b/packages/js-core/src/lib/common/tests/utils.test.ts index 3c90c962a0..fc24d0d213 100644 --- a/packages/js-core/src/lib/common/tests/utils.test.ts +++ b/packages/js-core/src/lib/common/tests/utils.test.ts @@ -887,6 +887,7 @@ describe("utils.ts", () => { targetElement.className = "other"; targetElement.matches = vi.fn(() => false); + targetElement.closest = vi.fn(() => null); // no ancestor matches either const action: TEnvironmentStateActionClass = { id: "clabc123abc", @@ -993,13 +994,93 @@ describe("utils.ts", () => { expect(result).toBe(true); }); + // --- Regression tests for nested child click target (issue #7314) --- + // In this test environment document.createElement() returns a plain mock object, + // so we set .matches and .closest as vi.fn() — the same pattern used by existing tests. + // This exercises the exact code path of the fix: matches() fails → closest() succeeds. + + test("returns true when clicking a child element inside a button matched by cssSelector", () => { + const button = document.createElement("button"); + const icon = document.createElement("span"); + + // Simulate: icon does NOT directly match ".my-btn", but its closest ancestor does + (icon as unknown as { matches: ReturnType }).matches = vi.fn(() => false); + (icon as unknown as { closest: ReturnType }).closest = vi.fn(() => button); + + const action: TEnvironmentStateActionClass = { + id: "clabc123abc", + name: "Test Action", + type: "noCode", + key: null, + noCodeConfig: { + type: "click", + urlFilters: [], + elementSelector: { cssSelector: ".my-btn" }, + }, + }; + + // Before fix: matches() → false → returns false (bug) + // After fix: matches() → false → closest() → button → returns true (correct) + const result = evaluateNoCodeConfigClick(icon as unknown as HTMLElement, action); + expect(result).toBe(true); + }); + + test("returns false when clicking a child element with no matching ancestor", () => { + const other = document.createElement("div"); + + // Simulate: element doesn't match, and no ancestor matches either + (other as unknown as { matches: ReturnType }).matches = vi.fn(() => false); + (other as unknown as { closest: ReturnType }).closest = vi.fn(() => null); + + const action: TEnvironmentStateActionClass = { + id: "clabc123abc", + name: "Test Action", + type: "noCode", + key: null, + noCodeConfig: { + type: "click", + urlFilters: [], + elementSelector: { cssSelector: ".my-btn" }, + }, + }; + + const result = evaluateNoCodeConfigClick(other as unknown as HTMLElement, action); + expect(result).toBe(false); + }); + + test("uses direct target (not closest) when target directly matches cssSelector", () => { + const button = document.createElement("button"); + + // Simulate: click on the button itself — matches() succeeds, closest() should NOT be called + (button as unknown as { matches: ReturnType }).matches = vi.fn(() => true); + const closestSpy = vi.fn(); + (button as unknown as { closest: ReturnType }).closest = closestSpy; + + const action: TEnvironmentStateActionClass = { + id: "clabc123abc", + name: "Test Action", + type: "noCode", + key: null, + noCodeConfig: { + type: "click", + urlFilters: [], + elementSelector: { cssSelector: ".my-btn" }, + }, + }; + + const result = evaluateNoCodeConfigClick(button as unknown as HTMLElement, action); + expect(result).toBe(true); + expect(closestSpy).not.toHaveBeenCalled(); // closest() is only a fallback + }); + test("handles multiple cssSelectors correctly", () => { const targetElement = document.createElement("div"); targetElement.className = "test other"; targetElement.matches = vi.fn((selector) => { - return selector === ".test" || selector === ".other"; + return selector === ".test" || selector === ".other" || selector === ".test .other"; }); + targetElement.closest = vi.fn(() => null); // not needed but consistent with mock environment const action: TEnvironmentStateActionClass = { id: "clabc123abc", diff --git a/packages/js-core/src/lib/common/utils.ts b/packages/js-core/src/lib/common/utils.ts index c2c082c59b..f6dd081e83 100644 --- a/packages/js-core/src/lib/common/utils.ts +++ b/packages/js-core/src/lib/common/utils.ts @@ -304,20 +304,28 @@ export const evaluateNoCodeConfigClick = ( if (!innerHtml && !cssSelector) return false; - if (innerHtml && targetElement.innerHTML !== innerHtml) return false; + // Resolve the element to test: prefer the direct click target, but walk up to + // the nearest ancestor that matches the CSS selector (event delegation for nested markup, + // e.g. or inside a @@ -159,7 +159,7 @@ export const ProjectLookSettingsLoading = () => { title="Formbricks Signature" description="We love your support but understand if you toggle it off.">
-
+
diff --git a/apps/web/modules/survey/editor/components/form-styling-settings.tsx b/apps/web/modules/survey/editor/components/form-styling-settings.tsx index 7e4577d101..2f91290189 100644 --- a/apps/web/modules/survey/editor/components/form-styling-settings.tsx +++ b/apps/web/modules/survey/editor/components/form-styling-settings.tsx @@ -67,7 +67,7 @@ export const FormStylingSettings = ({

- {t("environments.surveys.edit.form_styling")} + {t("environments.surveys.edit.survey_styling")}

{t("environments.surveys.edit.style_the_question_texts_descriptions_and_input_fields")} diff --git a/apps/web/playwright/survey-styling.spec.ts b/apps/web/playwright/survey-styling.spec.ts index 1d0c422171..74603a6a74 100644 --- a/apps/web/playwright/survey-styling.spec.ts +++ b/apps/web/playwright/survey-styling.spec.ts @@ -50,8 +50,8 @@ test.describe("Survey Styling", async () => { await addCustomStyles.click(); } - // --- Form styling --- - await openAccordion(page, "Form styling"); + // --- Survey styling --- + await openAccordion(page, "Survey styling"); // 1. Headlines & Descriptions await openAccordion(page, "Headlines & Descriptions"); @@ -182,7 +182,7 @@ test.describe("Survey Styling", async () => { } // Set some non-color properties BEFORE suggesting colors, so we can verify they aren't overwritten - await openAccordion(page, "Form styling"); + await openAccordion(page, "Survey styling"); await openAccordion(page, "Inputs"); await setDimension(page, "Border Radius", "12"); await setDimension(page, "Padding Y", "20"); @@ -341,7 +341,7 @@ test.describe("Survey Styling", async () => { } // Apply Overrides - await openAccordion(page, "Form styling"); + await openAccordion(page, "Survey styling"); await openAccordion(page, "Headlines & Descriptions"); // Override Headline Color (Blue) diff --git a/docs/images/xm-and-surveys/core-features/styling-theme/form-css-styling.webp b/docs/images/xm-and-surveys/core-features/styling-theme/form-css-styling.webp new file mode 100644 index 0000000000000000000000000000000000000000..8a1bec036a464d5d7f2269289a4ac58130de90e4 GIT binary patch literal 59948 zcmb@u1z1&GumHLb9J;$x8foe7?nb4%yF^Mtl#p%#LAnHKknTpMyAhbuaY$*% z^^xhWt-tX9CkVsT%*6x%Kq`>Z#-=VNb`bbI0Dv1!9GzVO0M-$LzvtoVcn8NpU~Fdy zfe<+V4z~CKH{QXBta(5F8NIPig5SZ28)XE+L zi$Gu@J39wc2<#7m=^$kweWKm9&tv>YI~ISyMn=ZJ+cYw=_znLU3#2BbV+ku4M_VJW z?+^cfe%aZ&LHPCkqJ?}TTRO|ALGIWPzOC9g$lt-p5ctgASVasuaYNkdK@(`F9f;YFfRl1w|yE1|1R#JCmApC<$ zvT~KxfWY_=IN!`gQvGL{7H0>wU;U1oJBy3{#BUloL!cl1-niLl-r*tbLt|Q+$^L8~ zn%Ub@LmPsJELLaFAb4jpducHU z3>g=6g1NKQ9Utz>7uvZ%pznNuZn3nIy{il13G|q&rG^XyhVTk{)x_vK{gAOh@0;0+ z{^SpIf|-lX9c_0!95*$Skc7aHv4i2w>^1Mk3&Df&9bLul`hwI2GdS9QmybYq+?p|ElZm>a1~xhtLTQadcI=;~|7jaEi5&oC*Yn&;u?96aaBR0w4$6ARlAE z0k8(FhIVRpAWuKuNC8HGGhhLj0ZczJziMcIe`62%RtLO+uYf(IjLYwOV&C7I0qzj| z^*^w8IIG{dAMG&#=HF|$e{aPGScmj#2gn1qkY_gtYzC?GivlfR6@sz){rrm}BS@Pj zkTKXoK6mf`8~+RYS4mL_4-|gZb^FyLIohxKu#&J6urjbxu=HR;un?FZtN{5IfqdA( zJYe2mZo9oM17qAf$Cj z%V1nEA;1KF0O>~*EDY(H6M_~0Il?=x{FYp(~-gp)XV>C)Z))G^v4PCXKi3R7WX1fT^KN~(uokgyv0nXX#nsHy6|%+w zaR)~)XDbU!S8`Fvj$uYFYj47QpPZeQoeKc&_Mf{l0Ps!q`@RCg9rz3PYykiSn{RJ# z8~(z{H3PsqZiq^#`wK_M0{|FE0MJus;^yrBqdoB54F;k)&>+%B0FVOr06NHc*a0qp z9}oc~0XaY!&;WD+eaL#XgsgLCzyt6B0)P_KiI zAJ8+)!VMCEX(Lk|4@j!_}$wO&C zJ%+M?a)R=P3WAD+N`iU=RSZ=P)e6-Q^%-grY8&bp8h}QE#)YPUW`gE{7Kc`b)`K>O zc82zaegT~T{RX-ex*jsmAE6hacc9O~uwX1OIhYBuf@Q#(U=y$t*cTiQP66kGtHB-M zkKiTnKKKR(1%?=g5rz*&7Dflg0>%R-1SSC{7p4lP6Cz7%Fek9Eu(+_au-p(?)P=Q% zeF7T}n+{tB+X6cZy8?R*2M0$0#|S3~rwnHV=L#1Bmkd`7*92FZGyVkuIe{dB4M8+P z4Z$2Cn2>=`mC%FmHDM>=4iPpHKamO13!)05X<{g124XehC&byr1H{K9q$JWLjwHz> z?Ib&-xTGSa)}(QyA4s>zu*ihStjOZXn#sP95L3udxKU(L3{hNC z(o$+t22z$$&fP=2$8*p8UfjL5d;3&mREktSR7F(N)Ckl()RxqV)ZNslG_*9@G@&## zG@G>ew6e6`v_-VDbSQMfbWU_{=swZI((};U(5KUnFhDVIGFURCG7K|9F>*0lF{U$) z-iNu*d*A;4oBI{kjwyZgpeqPdHBxFAT33uODwC?>QeApDSMl-yS~`zYTvO|E2(~fSEv!z=|NH zppjsf;Gz(@kfBhf(4sJfu#xZ^;boC~BBmm_A{(OgqSm6tqPt?OV$Nb!VyEJK;!nj} zB%mdvC0CWtt9SfR@?reLwMU$fLLQAjrhV-BxL2Q0-&ViL0L{S2pwbY=P}{K3@XAQp=#9~_ zv8-{L@xF<;NutTNsfcNu>6V$GS&Z3+xuAKB`KE=SMXbe^rLbj!<&KrORf^StwTyL! z^{I`rO`grIt+s8M9lV{PU7bCqy^Vc`1F3_j!>A*pV~FFT6Q5JO)4sF3bFK@><*`ex zD>lT?A8?~{3wB#_7jjQ^Kl9M?sPx3}wD%nFV(<#{+VGb0e)|Oc#N zhh{tnKeu{56vh#j9Cq`<^hMuG)|Uw{ufk2j`y$vPk|J&+%_E1RxT0Raf_-KGYCKvv zIzI*@#ye&uRx!3Zjy&!~+)=zid~d>ogp5SQM7PAnB!#5fWUAy>$yX_sDW6ltQp?ha z)56kD(@oRIUW>dg%^=BmnQ@V6l{uLuomKsY=1oF2Y_@y$dX833_gkK~1-XQ|FLST+ z?DH1$)$%(ExC;sji3_8Opo-jzwu&DWkCaH1)Rr=pW|iTVy(|aH-O9hbGkiB*Az#r} z$x~VSp89=S6;{=YYEZRT^?r?I&0?)??P#4`U0XeWeN_WvlQ`85<4?!Pp zo4uQlTO3<xe+I8ALb*Od>b;@`4bV+r!cZ+s6_Xzeh_VV@C_3`x8^mFxB z4{#1t4RQ`v4RH-s4|5OKj_{7uj|z-_7!w|A{V4IV>yzxK{?AIEN5?hCCnp|FEKZtE zZcf=w9Zb7VU(Wc?!py#yL!V2SC!T+^K)+D7$hFwCB(XHGtiC+6VzRQm>au#Z7POAC zp0Gi-QLxFr*|;UOHS*=*m$hxj?aQ5zuNYs`cIkHC?}_XU?Cb2W9XKD{9)^D-_?CC{ z;Hd3b<#_(Y?&R|H#Tmg_{yEQi_l5Sw#-+y<+*Q&w{dN6~{LSpG-R-TTk+acvTL2pJ z4P|Z)0Ec-1fT9ZkSR)Yo;o%Se@Ouf+51$qSgMNPQ(Eosc_>gxmAT|V03bE-`cOcfy z1OSxh000f7eY8gapn?Jb8oU4$2gmQv_bL#d`@7$H_W%p=D>6;5jqQwozWUqkhffMY z{i6GycgScsI3C>9`P&`h`IEOns8R8SNe3|;!VSO(MayI;yv?~soq6b)Uyg}jWq*aC zyO?n4J+D00gz9_3&0G0c*nyBNS+ORC%w|<_Z=wDI?O6T#Hjkx!szb^GvU<5YRZV5|8{^O;}%t=%EfHQZ(M4a=dym!?yQ^|^6Id)W(V zo~(UhcldTcJ=a|FS+!;0ejmNwJAuv$`-5@rte2*9E5#1txV;VCI`bh+u^y4{nvlU| zuM8}$@f%LA;P6MYsaXE;`XS98iHSFUwc-$=}(hGz>k6<#97Q{0~0L?i!2LIAq_fmaQ;KE;4g|G=e-(Clyx z$Jf6Bb5>oixm(>g&~InIe*W}N(!bN@dEf2ZA(H6~9i{g9RAB{Le%j=7hhq+ciam;u z?*zL=Z2p^uqTzPY9@X1$W4YYh=lrz8*%OKHNM4}|4MfEN(+i)hrFPXY-bIKIRQJ_H zNR9*%4+LYRCR;AA-@BS`F-15VdzGb0{Cs49pID=yd0~c)^96cBEK#&H)O2bWV_Te8 z|I0x*cP_SfXe#$ahhebTpOSy^VC#s*IZ0UCW$NmQK8CT)L-U?(Oh{C_))ZUlq6`d3 zuWze)KaLWbR@?Y*Hl)|8r|LY#Z%Up3Nu|avn448~r<(J~(R}VeH%&d>Ptt++V8jgo zTZ#DYo{1;XzI?H_s8EE%B*2WKO(>2O+q#eT4qi!Be>Dq!70UYk{##P#>7SVF z$qtLMQ`GvSt`X#Q!)%uGiAJv{F#UJD2f2-d9pMQ=pU7)|G3>ph>gudXn~R|o&{Xj^ zG(TZEk1fEszU6;MWCR~@K=ignW2SAKDfAz+H#=PYYy?5Tqs823a6K7f%&bQqNWP-M zgo+eA*(q++WMb=VO-qL7%?mf1e~UEQEQErb(#EHMAtv^D(d0?ydtH)w;9EIbLKj8y z$@~Dm4=Nrm|6Zcm>TXB7-8!fX^a19 z&HoYv>MajA%uH!oi}G)Ycz;p+YYeG_P;ZE?6{-I9ZKu#G(+g*F(Tl?aM2MJh5}?z)`%FPG^&e$w zbaKs~a(_boxuE|hmk>!c98&fGTjK_Xp?qMD4V%Dy#V&{Xj>d@S4V%}ZxSEXR3n;FY zvI^sO??r1Zd*obA^cLq>@XHWY|KM!(D-IRwVr zczeHo!nIaDrSd5zTX5Q&eC^sXNO!K7L33)>_k+nIi{rRiaVb(m+@EF8G79pZc&sy& zLB*Y~=!aOm5HrEZxs*R6@@9x;jj^SdzSCI)BtnloiBaIW{=H@)>`WmUn6e^eh$$a; zizGEHYbJ#UEsXbHQlE*%IHP`?{LE850DC+bG)j7f3?0KZ8bRKZV1e%B3E@Fte;;Qf z-gU``a`g_EM9hk__|z~8QEa}OL+l@GL0`kc>Mg!KKaqCLe~HX5cE8>O-}G6$^*@OQ zRXKlEX+4SPu3QO8-w=9jh&~X}2-q=49EW-|eqEGo!E%xRG^|?BlbCibp{jeptWRVgSqbUd0e3H(nCd{Mhg%&s7~6 ze#*3nB#=?zF3t-uhph+o6m7$UM}>W! zIJ#~;L9hWBK4VebB?!pyE;moXD%Q*G8j;VQn}P0yTbWmH%@MvhF`=Xb_%`3DHW(aV z1ltfc;Z(lYkJ^%w+0;Nm8W5HMFC*bPNd?00qKF^MMzEJgWLWupk)2;8NpcT#!eie0 z6rLXZV-xxNW_69q`Y}?5A%PU5na{2kcm7zRZ=F>jw;!l`%yq5KQ0py5Jv&6GjQ>!> z4fP~-qg%suron5@WlIn^qPf?in+@7eq6!WRYlul-^AgyVg@}gN?O0l3m7%nbw5r!K0^jPgJ zEE{)#cdLG9ci|SwI|dcnNHm;9tt0t&;`eg9K5NK!JZi{OV|V}0`8ncgSK=iv)bVCw zx(pHqnLeMbKA6c=O)+8T56c-*_I)-ArIDgVWJTe*h?Hl`TDng1iFQ17X{Uk{t;Mj{ z{{A@Y33h&e(j~Kvg|T5kU0|48m`K15cNJ0NZr0n54`0yT*R75nXBP!i14f$VLPqeyY-V;@~>}PW;|{b)LXqhMct;Zz8t# z>gV4ZX+G67(c9{B7(TMB=}{`N@3zI?m&K)vcwH*fy-qbPlK-C4andxqpzZzfjJE&K zdFxO6BE@D~jKfVw+IPbuBGtfriO<@G))Wpb2ktiBcAy)7T_<)s}w_5to&oYGlpTz6wWreVL35OIWY z2eAX_vb$yG7Me#YWElWOM(|7b|7{chtx>+gw#Osn%+o6m<2gCdD|W?$HN%)!?REDg zuf$3m>4AS2UVQ$-x(KW9@9wY&^ub9)_tK0-QnRr z)wRndw2#((y91AGR2PNLS{jtY+IrZx50UYY6mMA$%yZ^*x&8Bc?K{_f4Yv+gS{5xu zYyQhzoE_OU@0U5yhz}|35&igtReE7QG(Y~~_l>;qsP^k;>LD__!j%d3M`b6}gXe9X z5IchsHG^3I6*h?IyJkY&Tb_~S`)%|8G@<>Ti1En`$O|W7Y>0SP?jeeG)eDhW6JY4v zT(`v9KmO9=Pa}%uN5#FIinhT=>UfNIT3(2WI%??1*qx&|bKmrS%)(1X(m8^y_q6Fz z>OwC`4G(5II1J+E@6ko^@dPJ3UxxL{55gS;jqyxe_*gz}V$N%e;*Nyk_S~|s=k3-% zNuuQyE@sPc-nHaW(ccm-!_C{1zHV&=$8ERckA z15oXpWk!5qT4pwBmr{5p5RG07Ov|j*I(?cv`IaG@vdY+we5)0UvHMR2H_CEm_-?q^ zm5(^<)$<`EC)YgwIF)9Yaju#SbpIh+?{#bMY@E31hPd#)8V~vo(Q5D7#F9xb^2ma9 zK8x2kU>f2kiia>yKTo7U{FUL_JUrAKpPRwQDZfcd4lP zZ~fJ6NqY~0+yD`!5n|rzwwO0rO^)gqb5r_Z<7UoCHq4KUwk|A-+1Ly z0bW(=DqLYU>e<4g8UAIMR*t{N>7Qj>f6@BB06Mz+hwH54?Np6b)~@G=D6rPCSt8J% zn@CQNwoL}xVYf4lgL}07D(l4sj?140_G)k1Qv248J)&`CIo_ILNF zzWrlFdAcv*$1{j`Kr3k%2s-B=MZ*-sV}Jf;hfX)vfh$!TW3r!}U`#&_pW&Y1?EF9x zsxkexrs*&tYEL@yN#O_oVDfTyAPpzhRprrl2YP#W4EnX`VGmZcz+sp?iDkIX58s1# z`}%Lwy7w}HE-yO_Glp+b&t~Qa^tm{U< zeP^}NX@LH*yO{exNJ5@$)doyi%O_Ex!Er=<<#t2QADg9R;g*6h>%AfW0}GlGBrfzV zaD=KN@r&-ECyP+n`ikMK+fF_+iVIK%i3!)+bm_548;{!pi#w|YraXhZb*QV^G+tO&7Jm~moyWIUz6p~lC2i@;!~Tz_?70o0PjYO7taqvX?c%-0lC@=+ ziW4J(=aU3B-PgNe=mLtfxSlZ%x(H4_UrGnOjglzFtwL9`682w0tmm%LyB5*lBjq&T zOJ4U}^(1Qu%AEX&O~lf;grenDt`mB@uG2Rlne$)+_VF7qvn*+tLG+_F0Xn@oGx8cN{e4ANW~RZ;C|eZXUM!rW|PVMGK{5$B%)}h zi?M~~>BL7m0hAYIld*+)yegxVq^eQ$>*AHxPn}+VeMuJM&JhyvA>+j{6j$$4WQ6BM z^BhQ_+|U#!Pp|zE!Eq0}GoO{86mHxC+|80(XD@*GAUXi8JVDk5@mTF!K+FDP;Rob} z!rG`YyG(|ib7}1jy+^DEMjYlljdyGFP0?G{tClD}=+3s|VDCC6wm{q02!nTVu5h6b zGN;Uh+_NuPeb~8AvWU$D_2Z4JTxK4;H^`%Leh;G}k&p!UE2_=`y{OsvArrY)F5_FMrxH zUpA-la)un2j!t~qm6dvFr=VU7v73az73nSz@Dr#*OleqW|V&$Mv%0&=I!)LRRR7(AqpB;?)F2tVE5M= zG9DsJCXxAc(jMO(?eu;@r)Oq4o`rJl+6Fxw7#Np~_|5!-H9NsJup6IVV^)WC6Syz7 za-zgzs8gr^2>#HUP3mdq$~~A>!AA;T@0muTwn19~p&#~|wReY3)ziKe%cnELsC4`h zp76&>`7B^Y)d;#1sTg0`J}BwD1zBrge)Xk&Xryx0MT8fcxW`xs&+aavjLnkrCe z$TZPd*@5~&Cg!cJbcMs~@4m>$IMo(sj{U>Q0;35(b}e|aYTl^U+ig28d7_Qd`I+8W zi3_$1?@HuX>YoO4Ievzq7%o@IY=Jx&R+aUy#DtO7$FG|{3rkX6G|@Y2=qWBYb3 zNyc*qcgNS$k@vp`*GegWaSBF5@ppy7JsG=Y#bSm`kLQqxP z_qs9*MKy2rO~Yu^CMWs$5LD}$t-W+6HTEM=MOW9?c zRCoi-g2_}k8JwpBz;LgVpW}94u=7yKq7( zX*RsD^VjE$Q!qbh(4*%=v__;fFMcS8F!5bD+MCpX#Byt#UzWlrh&!9!GDkyB&s)T$ zM@SdSnbrr_Y_*2{(sMzq2L6RM68;pHF}1I>!)z=n33dPR9?57HBG2hcluOErmI#cD zi+W^BPRHB=Opmu2(e0r!#G!nz+lK$Q$X>k$>o3a`6)w(^qOqyzyK(iA)}3|3<|}m6 zf+t=0!yWC108tmq(|lrLxd7ty*X@uXs6zSGJgi4jp`|rX;j%56KjLPE*X}#M=DCzB z=HS=@>k9{I9@WLM5ozG=+`e}?-mh|35I&qnL_1pjp*fh~QH zL1y8r%1~_Ya%pyP%g^dq2fT$@jCbz0S!gxfbK}6r#ghpR6dH*~t=abSm0Dl% z#;aI#fnIZEel(Q5$9AA-J8s9oVMEbhF@F2(-|D43mEc*$H=#NGSnsG|r|CGOLTuX5#O_sX7ioLGOu*0?gGd3O{-CHvK z+E`0)JSZ!EEXmhUIvx2(toC0~wUIW9gyUinr8^p8?=$}qUbo2UrxVtjdHJ3Xp4`@- z3+j6yCX7FFV2%;))vxwK#Qo8Jq?X5jkA z{y$7|afgLbTi22yU)~2(n-cQjM}~LN`e(g_rw5Bf85tDv?ph|CB8!awOyg#Zx3GEo z&U6Z6|BS!;E7IP1qj7}-o2$z^-5E->`y=19#iof}KA2u+lD{fcgYRkclYO95hmvs@ zKKSK1d6E`;KC8WI z=5GxX?i7U&uHv+6m9D%@_-<@}MtVPt*v_S4Gf9RrAUVIG-dE^_HCEYh*Hb=6I>b29 zQ~p|b{#E;7FeE4hr_AtJ;LVGeB=f&4itmx5Ba@#^YkRY8|I(V61dHs}T5`IuRL{Sb zxS}!jd_Q1N!rGu>GM-DRi1}#^!lCfxY%0VzO9?$$htkm^L?eZ|vj zbhJ*A%l|XalzhUb4f?`SR`De+a9GBD89*8M@FB`xE9uhedS{u&jnskV;|1QvH#5(} zWIGz;Yz<~qxNG@nK9!UjdqS6JSZ_2Q2cg$0FY3y*ir@kRG(uXUv&Dx|lg&+8o zrd7OEQr6P-ddc`C_KTLzjrjeV{*MZV62tApqiwz_Jp zUMu=jcVw}azX*DDK(F9Rof9zI?WL;eCKS?4=IT?pAvfb@3JJ;mk>dE_6imCj!7jxKf*dZ1_|yZumkSJ{_d@dWyxkNCS2cMgatF42JexJ zRS%1VYhL2RtB}>1Mo}l`Ei;iuy9tcN>8GyJ$z{WJ#OMu7hkGqo>Fn;^RAha3&nWrx zA3ev|5G1msz`G@4^r~3Pp%Z&*ln@S+3`Ns8iS|xR=2_xDQn=rDk|;i)|oBEe@Ce1(+YGyw(#%W7` zoJd)f`f(6r;I6Ai6xVyG+*%hK60%q$lFfXooi=aX-rZxP`e>i-?z~>{a>s=?S-o8M zEaYV5GH~J3m3qzdEkC=^2c!gNQ2M16+gzp53*JAdwQ9; zH{0yHc6rLOQ0IHyf4XbX?0o$f^1=HU;>%vD+}YIskxy9`Ni*Lq-0IjbIYGEf2RxK9 zf6J8*C{`Wyam)V?Cl5Hjj^i{XATLCyu)2)swdP z-`bBc33}3VFg~Z=nOGyH&1+X@DO}=y2MxT; z-hn>GBemoXJe1A5eHMEk^tJOq??sd~ahlgV@eQPNF0^6p2p)Wr=9@L(g&~>>xj!W z1)@VOS~1pnEpSB2zE4JR3h1RvUPafE#UKTnl!8&$La#!&&a-3%fxU?5r5!F6MWe>` zQ0wk1RaZ3k{+zbu8YvZFLz=;}tN6U>?{aMX2QFMcJx01j9%u0sU`GSFv6Wm_s%rP8AJB z50El5CZQ$iSULi8gGQ^PoM*uKpth!hDGrr-lQYjxDP)vQ=zTG=uM2ukx77Vqz(l~l zhLC`#Q-#4qe8)KttdqpYRJrI-MD*I-ZI@)El*1XG7_3>PhJAZa`*uh9KlflQ2aReYsD za^e23lMCMuJf*tguD+3CE1n6`gTwp7JovXFDE+b9azJ6Saliy^|A^fE@__!xEI{H! z_WW6?zclfkx%P*~c%VtN z3if9gH8C6$7deZXtE}3r{_|V`gi7rHRU=@?;WGJjIUC$l=p}A^=&oZpfk1%Zwy}uA z{1F@90Uue68rBED#hb*$ADb<6|GByXuMzQNBD3}pcf-G=wUR6DSEl73ht41iw7!i! z#$Kcn`cg{e!W4jZbsIqtN#R6=Z4i6ZSR~t`+RMzc%nyDA?N~ETWQVX6|Sor!g&@z?43g(CB$6x!E7(^Ut7%7 zGYgKp^DzIJAFr$7OvGog6V8YW!bY7{VDJBonoOM;->*h?Z*+3}PZjn3EZClnXvhpN zuKvkr6Y{?fc>cLB*zPn*j_X@)LMeSo(vL~Zefjsy+Ft^D3U^Q(ubqh4SgX0#R>q9u zL5He< z@nU=H&eVNgin&BD^n0PEE~auX4^m-IxzkrVpZHT&1-_*0 z>SoNM?U~BMH^f-OcDnLZWz=}S%W4)Zd-<79s6~sBMiMP33tlGrVn--F098`BM$Fmp zcH!4fgX$>RPL0Pt2?ocRsjI_iJDP{TkMQPt)0aDpCZvoCTPa<5QJkqIN^J50k=obO zoQ$sC*V#=hsko+|xgV(MjwEQqGasbT4^JiVE6aoA#sjF-KEhQY;lzJDqe*zmB~d7I zDejFRm^k-LYw$i(FTt6hO?L%9#ZvKn+ja`YqKCT5+ly>#)##8*4x@WCgSCX7V zNS6(Q5BWF0c;>_m-uIrDQPC40PIbPpN6^s2ukDq2q8Jv5#fY=_<^{b&_W~93tiUidsw*bpmrHzZv| zq@~he)F?UUxu(PQH4>#Oy`ttyW<}+@)|C=&oT;2_YWzW6_{4pA-7%+vm{rqh0aDbC zUO#5N_1x~v;-vIC;;H8uMc?QSs~=X&ht!T%XBktPwCbuNnzzN0u}`Zi!i)e%?yGI^ z@AuJLadSTLi-X-u-={5&zl4uWtTgmpyeE9Re_`$v;p)(r=Ww!_IcIcr;~rGNBz^65 z;cjm&hAtGpjQ3%@`?dY|OOq0L$3XR)>G0u4@rxu*%-(!J}xBeeOyO((Zje>R@J};a;|5_kxeflr|oCEQ+oXYhjHB8 za&7i1)RbqZshLTH>&W?rAU)yZYt3afe=y(?}Uc0sZ2W^bNJz zo92W^h`8i}<4pF07T8NTO!bQ{{qyCfzE6~9RPxzBmdIVd+0_vV*)p7~XQ05ZjVEI< zBoQr=2rCee0DRF0+tO~nthN$9zZW9lS|qa@%3#aWSB^owHl4sAHk4k4ftC1aS>29x zn@l|Ni;OiCn=aC!h)4Vo0!m3iuZ81zsY(rD+h-!AFTSTIRso?@`hIWil2Q?>6nW&> z9-bQ~lr*6u6I4Jeqm+K$Gwh~VwtFU%z|Hd`YNgW=w@BJCe0&M6>P$>Q{C3YsY`h9DUSaOENgnCo-N1E-7rfzm zNLwEvLPsF&n?Za1C4qH7Q6?O>bzs!-v53CbWNAPO8~pKuByIx^a^`-^1Qlh0K4X0K z{W-^oNWMgBczoUacw7UlvmD|^7arWz%_H*mlcg+Q^9xYhPW+)`J|(!2gpK25?{(ag zGNd|TioQNI_L!+_eH}8Uv&ZJ2QJ~hHC}`l|I;i4QHdmP81nAbmvCdGfBVj{wZ>|ug}L>o#VbWYWzgfqNT7pglY2*^o^(QXOz=9Ljrjwww5s{#Ge#3 zxrb;?BeWiq3W!`aKjBd3Iy@feYe44k&JT@U7SI)t1Zb=CpQQ`9oZn(Hp)wUtMzv-d zztG7@TwG}}L=bqn)?d4EDAbfj7HEGSSIVB3hr`5&qCBP*Dfn>0!Vr&3dX;1W)tS|N zF=f#o6tme|{^D72T=en8&6^0Hp)Sm4VD_s{AJ<21EA5ETI~&1l@rN|`ihBYj8b0iX zcB(t!tfh*iFU6nz-|2ps^y-3UQ` zOC|AQ5n}d)c)+{N)ZQ;>9T5bE9`kq+bcB~d`DSM~2uALl@K;Xm4x9YHf>r(^Y6bPf zT}=m&pK)bP9nd`My2TlO25Bh5T(klH79?TV#gq!=yuZ0tVkUc=^GnE*>?eb%neZ z%A?n(5z(FbY~W@dm52ke@;HTNK2c$8He&vd^l`h9os$N!?w%BV%bPB4J`Tiz63UXF z3k#@d_@F8p9i2;UAXA-CnF16HMBPW3U1A zi_Ijpm3z81tID}3?9E_@BIFjq{Zuj1?Cz;gKk)J+>LiWV5A4o_JI$O}nw$Dl)>7xm z9U6wP)6bFFDsaNGYCWuJog*SG4&u9)`AB%$XasY=)FcLJbw2;xyq)WnP@W*>PNtHl z--CX5_u!IPw=g8?mQkF;cjhVeFpE6OaJxxvk-_D!Y{M>{(gO=0b;X!r4$Igv080$(fN*=B0|!B&Y%f9m-{a`{V{aS4I=`> zc214IhM>aSFB5ZDyGfBuVM3MklXrs2vykpDZ)|Bb75rY`h7;rKH z=p4!f8K=;TzF9D@Ioj-dH z0J0qOEs#}dv48;p2sExD0Fc8CUkb6iJ^ELZzc?@>DV3U?%J*Fo9GJ*q?VKC!cd%sE z+4~(XXv{wXW2f+k$yWOkZhE4^t)H zO51H;UTATCSz>=sC>IcSaeqP<)`laOa5J@RkMsDlEi|dTQPPers7ymWdi)oh$ke7 z$518oSB}ahwX16lnFVuOy}Pil5Vb$+T2P!P&c;g{E)F8*CXc~dVxFWuoen*6#r*uO z0}kV+AseBZ-b1)W(u;kCWsD((aYRGxSek8~NBbi0a;StAn7+@6LGdcutL2F~uZ2#wF`ueQ%+LwF1;UC?$M{Wt zNWVduZBvDuPZK>0;Xc}vbdIra&1KC4uVSoPh@&3UN^XuuUk_R82b+_eFEo|qXn6{6 z?IRGqWhsQBHSv$eiwHaT%1~55N_L=>H$|gKtr+O;I>nDmHqnMFl-ZtVnMC>#VX&~W zgUq8Z8od~E&}{bv-@Ua${>BXW=^;T zDPl8u(=?rl))s>Ob=aaB@LK1&Dt zmyO%zic>6mq!MI<2Ll#b*}G2*@(SoZNXUX(<{kWX6WQW>3O_Ri8f2Hd%Qcp*?~1Km zvhtIK>3){GDuUPLiix}D0>7!$b{G(e#g(Kn+HZ3){%sZtC^t8D@nXHlZe#u69#s_uwooAc%!f#2d)ta9S7KpYwQq0x_IF4-eM)OXqKLL^7jFz*)o80H@hbBzx zv^UcNl`92zi?V)rG4{T1p$a+Uf%{tZQ2iG37Ic}r+kq7x!VOrYB+TNo|AZ(8!{W(q zu@W+x^wCbVqDxzdDA&UZ$pV$-L1(DPs7nG*QzFvrcWZl6Y2|H*oU*1U5(VLLpj(7s z1%_pllQ4~;9a~?E4nGo27h9!69AxLu)QFJA(jkk-nev$ppw%AoJjrGh5K1W`oPZzp z42XMNpTwEAFZ%Q&p_9qQ4r=AiH-7(l=Ovye_gNF6ph&l@UMBI5hM`@2|t!>L~5Mc+ld!<6&l?PwdUQV4EuaFw8G!G>< z8y7E{L&Z#)MDUPdU)oI=n2n6j=O=*bkjbBW9^(Drt;`JK=MksS*|Mx=PLKr*m(9*9 zeG$n5*@lZ}r%(=AenBE8Lg%nd8riejb!v%DHgjVnURH3~12b>Ynvk~*kbli_1Aln% zvB96pNJz86V322=k;L`dOy*K*2#se==;*bV=YzS~{7Ie9FI%i=G)tAP@m@S5c@}_P z$(^%Fc*@6F-?3Yy=^@?poOyw!f~!kR*~^@uku7>j$@RMXw1zG{ZjKJ+%)xz?$h$ni{lu^3YXi z!6BUky0iDuR_Pl>8?u@_dQ<=V4!TyryBOl>m^o)^>33riPnLqA%X6@naCw}JENf_+ z&Of)0o##B;d*@z7mQn-OEAAy!0vBD-1RtG6kMoFxyjoabhNqiYHA*G1RC2trSX^1_uHx=8FFh0C7N$zoxB|OZZSmC03(X4-YtlfwOYsnyWbH200}00;Nk{AElOE7S`nT|mqSIQbs|NCxs6I42E&hTZ1n*` zR6$aam>{U@a(kSa%$^LPVguorhCfRwrFDsj@&f@+`96nm?Q$24G8_!^;Is*#h5|=t z$}0nUNIH3dP){v$Yw&VQ?nI*|VodIjL|}`esiHclXIwLXy%TpK;u^6KW0wZirS}fc z0}>8?*#PI`H#2>&Vt62;Y4{$0FFk+Kq$_W`E(-l<_}FZ zxWGy1lAWmY&$cP$vLz#KkjwoMj%yO<-nMD9(t+em?kCWJ6(HG{W;DK7dk~`P_et^u zmb`wJI(IR5g33ck5QE|I4qHRUUwP0L!s+x zJr3d3wZKt_N0@$4nj9QRFMinG$nIE&t1* z8Kmpcp*L0()*EJ+gCb+;Vb>rk5?(gZwXRHyJZUSCxMvVp_j9Mv<&MHn*kjaNYy}f2 z+d*W2INRK_RCLpP7BhLOXA>w$A(eSQH44<|pfFVOKVYV8q60mK8`ydCpa#P|&zD&g z|Arzz|5z?jLB)S60iiAAzqar2V$RwzFD=Ll+wWA>@6Y;6xoNW zVKQbg4(Us|I@TW3P{0sC&U|-Wlu^lpqFIZe7EDrL7SaQK`@XZhiwUyFQ&dRp-bVy? zdWf=)=p75E^0e|(^lJ!lD?sCdS|$mRApO+=UbyIA1_;I1T+Qhb{QT0~>8R0vB|%ru z+_dVm+w(R}hU>dykQGd!2Ltbkv{G&zk3Qt4cKn}*v2L(jeMA=eS@Xnjl4DN=J_Gu$5PwBrQ9xWqsL?27_r7|MFOk)ISy+oDUGea;T6@P_=^T2!+wV^)+ADPx`)6ijX^M zfU`c(=zoAv+SnlA%6cG?t1LF?kYDHKtgJryCV?{)+S+XJ)uY($qNphG#wUxVA-O2? zJVgG{0;Ph=i^(akL{Zw3RG&|y3_Y-J0n&EW<_^~~RZ2O}NxyPJk0@=K;T}7_!G8YY zY84y|g@=@*+jRnD*4y@Da7g&@Zt9w(XR$i^s_g=8eOg9#cu?@;O0gVM(5wA_mU_w+1OLg7WFQ zwQ3%Em0ULlF2I9F1p3V%mE|sxEEeCqiTv1-0mapjpg5wi8KMiou29HH_e z3VejZE)1=3z6OD|0SyK%48^-^?-(Ek)rH*TY9ikHSKRp7nI!kMX^bYo5&TXX6l*jM zo7uvl9gU}4uo^bYP@;2bl`Im`fOpZC3Q~=U)wW!0tU{aNOUb{$|Bca?!DwAYJ6&wM zpw~2nLgmNh+e<5niV8-<&dooKhHv`{3@A7^2)|Vw#Y11Ua*Oj(zBoMv5vW(#c%SXl z2?AHozQ-$?#jMcDPTyzdcIU8i{RE=@$_$Z-vtK5r9VMp`S{i6(WK<@(Vsc>6lq*#) zw~%#HX9E|ZO&6D=hO`~89^n*sp8Q30Rh_W{ydAgmj!6&5rw;UC=)L~8$Q+)&$ywWbAS@m%P`bwVLhqf^hnPA0-F z4reDjs3;ofn%AzQJyfD#<&eO4z;#CwajDJf0`q8mE`aOEK`j#_YEuuSof6F&Vc*TH zN(%#rZtB;~bDeDv-l0nurJzib5U}XQ4nn+^JVm#^B=>`R3I7c99C|O4dSLA%qRFz~ znU@MI_zNEgTSd~CTP`h6VkdsTla2AXGR+;HPj}KA&E|##Ea<5D5@*Dv(|;B~=pK!otnfkzEJ7abqw35|_aX;DB^Dg?R6Ru1DcJ(>_*!-$5>9+i1u zO8JWxqQ2HPYT2T-xF{#Ys)aYZ9&rk-EOV6K$24|3jkk7f@NF+xfBlo#x)7vvU0r3Q zTxQU^AqKasdV2-Qf6f>%jqFETn#Nqv)ts~str$|Ai|yC0Qg9*7_*kixsRs=!CKk-X zv1ME5Gx@?sJn@CnJFj<4JR|+y)r{mmOh~jA5DOORp5q74{?m(R3RtmlRaA+|-`hRH~ME=}Bsm`B97FY7fCUz2MM@c}f?9Sy8#vP;G!${Iu+k2t|OHVUKIZ;PUM%98m z%6F`c?i40475)I$02FyKmN&%k=6G=OXqUBlJW)<;XLr-_DF1pb`?s9)YFfw!KPQL4 z@AhQwyk2poc__Cjb~bi}c>P^%s0fXpTbS44+_;JRz7cEkoACg}bzzF<_`-r{rD~>V zQz@XAGbXk7_1sKgkv4!+ZB||iP+dGC=BWD*DwA<7Ex!m=hfbxq{~jwd=VtVOOV#8z zPmHRE6?Lug4V)S2XPE)dIW#BYgY3DG5z3^qtd>dJLhWd}K4B+rPayB5+_uraF?FSz zm!IJE-?omt}(F70{~(l?Uv-t-KEvS z*7T^$u6Y1}%1`zRXCXtu1dCIDatfJdjLJk=!__MQ}g> z1HNA*S`nea+If9VoUcKN{acZ!B|UjtjZm0p7VGux#8e@+=Piwj@f3vO*4U3acusS` zBlU6o2-+$1`?3SGMb``lsve9$;hmB`#J22j;lf2e($x{@kMIjO@>+{E`rfC<-)5B) z@g!e`L+|%4#QnnnpaUIR?Tgc%R-Yo3eFZ8aD3mC1?{&KgZC5;irh>&+wWpw3LIAZF zP-7W)xXx~^ztc*h{UODQw($XNV@R8d9zr7m?26!k00(@yTgWui-Cf-5 zvWq|{vJ$j9Y-BSu^A|(7k zAyZ?eS541`quBV)kIUi7AqN7IbzY=1t1#G1UOLYmsCzbP_!L2s)bzox(+}BQNk_1p zV(AZd8ZnbG5t;evO9ktUtou}woyUX5(~teTn z+vcJlentNt2127+NS>e@4ne6sNLHWZX8!UqJl{Dux-52V6hy3j7IWKdv9P)0R(D9#$x zdrCYvTsG+?Gk2GAv+uh^?j>mKmSPQA}YsH7|5C-?rAlj-JS+pzhp^SI% z%Swo1ue)IM@b1(xW?1!%{!fkeiX#)q(sjP%j1=7E(a{lULiUBkX)K~-m_g}Qb_|Kx z4HyKGECv#tpr>_`)@FppzQN=o(5;QjGH;bG^Zc{Bq!Ch}GcQX^1tLqf6a?E9X zpg~F*Oxjh%4G#9Xn07+MLz?&CC&+XPXKwjs{nl*F#k4=o5dvUhF8`W41uq zaf#nT0IkorMe5db`ZFAz9@_ikp{Wott}zi=CAf&Xyq zJaK);zD+#3ATMUp{Ny%=m~!nNuH8CV1Fr>Q67UlWjOK8=Q8mt0A=yiAq!OvL?ZFi1 za$DpwDX@;AbUK`28af{0L0{Lxe>#-iqs8cs75?e^5UI4TSq&_OnT#Y25LK|-9Ecx_ zqaZq)Htvw!2jV+0yG)UiCOo6c%s%NqsgYZVJ7S_AmJhDbAZmqz3~tL z0Fq}!0003g_DWEuSc-Ji za^$ZD%K@RxC^y-D>w&loITn;$BK907`B!3T=1BjS=^jrE_m0~>K%FSQjXqjI96{pC zx&7CVvE;OY!Neh32RHRnjU4#UiMhd|MnO@UuJ5p3 zo#0Eox$P4^q^Ib=U3@VDPN_QXI~)(%Mq}{c)A^f-*e_WI;y0cvOmX^|qKef8vA z3BdcwE5~QOhXc0t89Vd|%-_45sZWIaK$m;CV!WLDe#HCvb-4CLe6;-EB^K&_cApyT zmt{i;K-vm94e{R%L^O3SZRNruCxk|n@Y5gAUwwWhHNNYbyEzkuK^ve5(C~pn z6()sJKwCel?->7H!wc9pUo-g9!yoW{-zb%HQcX4;isCl)+6;#~N{~UI4ZIK=bDP8B zf}0DQHHwnf-~6S<{WN%Uq0?${oV@^Dbs@dS3+X)9-vpss)GlYlpXQPbza@K)e;L4I zUa!vm=s(l0YKz%?p}i&VtNx2Zk`M>^6e`@qQj|07ZhHwPp!K;RH&;cG7% zbmZl=;?nQPR<6{lrmRCxd4nL z=wd8niJeyX305kYu{h&YAx>kXxh#%Y1_;3Ek`$JTY zlg|c~SqnM8GUZti12m7f1uUan3Ux4H?kb1M$QrA#%C^tl&b;7;i zVUMlH$-wuU+s}GERdkwdpP{VjdnA0$u0*Wrpx~DmUuGq)_ zjkALGniVqP=ZCa$gxDMWZ1B(((d1O*#NOF95H||F3q$Y)*%iS601o+all2JZA2qm# zhj6G4j>dU&x@@1);A%MEOClSK^qY=MN&*%j7`}NAVYtl2K{WB4neu99e?*4U2s}lL zp_9T0zur>PEeMF!38Cq^St-(Bc&oxsnc90b1tkgPCZR9!!jRRdhof4`<3B@G>S5M% zjBQ)Aayd@+eKW)Vh@IO;`QoDKV?9Fv2n;(uf!+KkdpVZP9-lMr7s8FBG7vnl3*;$TwoIFL;Zn6% z^8C>Q$P%WA$;iG8$_d0Hd^I1M=bY>3yq6Fh33ZLcbj|-uA&Mqm@RjdfLzZeED2l<_ zIp_ewBlgrXF(&dYo1vKyTX`FXWFZHy;MuXP+?Pu#hj4VeMRxP4(S|zwN zNr=kbj#&BDJ#oRt0hrKl>s{59?+W8edPdiM^M}m=uoDmI^r?&SQtl6!{xC`85n3ssVP=imJXoR&@DJPG^7 z%?al}mkNOsbW?FRxXt{~{`4m9>MHI%En3C&bq}!O`mv250#~b$-oT^-_0s%iE9(T) zhFMRTuml}clIz-@XGQ)?fCS<%W(Ppp>OBdJ#JQ5(-@fw-Xu{24kS+?7H{%gYm19PQ zc^pbgcvtl+0>WAwGTu(C&+ONI@TvpW|9d^X4@G$;5-JZw-%lj&IA|L~>H#N>kPHlK z-w^-+2_}2q*MG@qL!89H*K14%?8JE)^4!n|%Fk$1$AL0QZXsT6GezzCeK2B>%$XBB zHF8P9y-zac&5)ZG*U>1p)x?=5loZ!8@~z?K32hy5PHYT$mcbs{7$L3v*zmwC$0Alu z)D6?M7MZZ(sIrdVF&vl5dGs;?`T4iw4n#+_EBJ-cn;a-vBB>NXhF-S%6HZd)|L%La#uk}AqR>N{ zz9RvSMQ~fHmt+_2u9o^XDcJTgl~#+K8!3n&ARr(hARr(hARr(g+yXPGITiqoLDlxTE&z3@BVy;p10%sUjqMLJ%b;Tt&yJ)TB11*Z$dj}uZ@^FyAsG_hjeD~gpt9v;P+4~t)6xr!|M8>X z&~29i@(?+Vl&mppaAR_5t~{^MzhsE22beYB;*orhgr3~P#v|9<@tzp3+Ei{q!xLN-T{wm z(s?E?3PJx(O+UreGOYaS%)&nL;)R0gjgEh4XzK8WrBb;h+6FHCxc5a0+{uZ1k9y>g z7jJ)WM<1C{?CscnkQG=v8zhLouOZ?ddOQQ?N#{ajcl&T3mQ{x9=1jwcjtcLid;Vso z;{4S}>hy3GLKTuGCS<5G78VCJNOz`{JM+dxhm&6R<%S!~OliW&nl4J}Xr?=mZCdl{ zgr0g@ic5QW>^oHeNSN?qut0|4PEX5;sdjgDNw&ow{S>880&*gvFeG_p`r`0$)6RLo zEaCo?O9+dtRrgjStbBO5dtT4qUFU~i=sWm-SV-z2?7)~;5h!i11=E5NPWI-6H;KQH zG-$6x8N68wzqw-O+K6!=3>%=N!i@)k=9XrJ^+VH#1elvodIFGfE|B%6W36OE%E)#5 zStuV@5Qy$bh(X(^j#R?mB&Y2P0iq@cIvf>Ff zj+3%_eygzv6Y~D~uH7zyDiZSU+W4Zdqv$zrFmgM_bm0hiref@8y?H-_?C?(ou zDl=&P*>epn95l8bOrTLu>s6)+m55zOOYtNLgK>{ft^=Est^P~h1IqR~SM(kFRm4&5 zPS5o@RSSP-y5YlL7o6A4aGgNS(#Q7-en=Yv^mT5R<-2GLEu1B%KzL?}2GGeEL)y06 z50Jg9Qv+^461b%FLKdc9CPi${ zzj;U@nWH59C}WyP>sV49jabN9HX|~NSneVSqC|$Rq~~&0MDVcwYzoZ zN4UcIO{RuNzcdX#LIaAwsHDioxjHtYff0)3Nv%GZQ{!?65pB#_5GmpYF#n@Ioh|VP z{!@Ar#PG`?Go0+)BNNzHWa#d$gNJ}U$d1cQAmvjl7BO_(7f{Y;0LwtjkKkD=;G10h z*&ysNzAJ;#4yrZ!DA~RR9gGfJgzaXrKc3+{pXVHt^R@iP3Pwb-G74Fm{9Ai0dg7vGybJTGR(_}+3h@9OFYjD+0aRE~LzSabUY)s2BjyrtnBKEl?^x zeH~|GW4W7W#{svrXPZ#&hF29Cu*{-=UpY}#bgH8pm07N#A4Y25Fls5sHbIsku1TP~SMZ8Tf?=7)>QH&zJYU}G zz2|f;zy_(y?WP$()h-;RV5Jwz!VOD;H`PRNNe&;6*WraB)8yt!8OBM6DsvvYrW)6Q z8ny=PZaDVYYhI1v#k~8?=9!OtHUtaO|CHVNSM$a^5&1R^ zWt{x*N95QwmUHvLACq9#SBL^&hN%WgKZCZViii-ecD>hh5WMG|&$zv} zFeEmZ#1r9#ND)00a5-n0>>KN4_K88A;7f7{zLy2QA@4%`{MH&ek4) zp_|e#3i0*3+*Z~v_XPKOSN>7sX(){cXk+Nvly33zQR%V2C$oqGy4suMnEkf;>7dR&n8^c&`5rHid$M`*$(m10Q@9oXLTxz@H=I)DC zXV5SY zoK~*OUfh((WUF>*F=6p>Y^9BwdB{p7-`5xJOtzj6$)vnj2)E?!oq6k`s!EAYAP_?T9b1KbJd zhd{>lX}#);uX_+?b=1u`kWCpKA2kJ6TIT4}(2YC*k^7AR0;na}kX3cxf_z8`4toY7 ziy+8Uk`kuUHFK?XD@9^;;XdOLjw?c|*+^$t0X&>Als!l?_UG>wxGPVMYCAj|WiUI%Lmq)(;erHjH3#0PnmK^e)qgyuxYaD>_6U zR0Sp3`R*&6_2w4Z001?8O+ZFo5CgqRoG?HD557f15e%m{#(F|- z?mgUPE3AobO?5ek{okHj8s)mD0TDQtkiNGQ2klVslPc(E`3m9oVdtUum^41IQOo3( zvwQpBmJMU!OccXs@DK&Q6Wj{Im7Krsse!`3R0L`^oeVnM1+|6Mdg>mmqTFjepYw*hmv5NK#9vP5FHzsJaYNI|e(rkSW|86&I*>i(z=L6hRx zT;khG=n@#qG~l<$ZL6a>MlG#P=WDy+rWNt)Rj_U02c-kF+fa*{x}JLr6`+yF;S$<eH}9cp^41HK+WF(s;?kckF{}{FASi_5FaZ;+Tu9u>*W~3&OX7aH0@FIUB%ZC?nAr`x=s}ihJkAS z*T->?NMk|{AUfnw4^iOVnQ*Jqe~Pfb`$D{P21hX;a7azp1_RAXoG@ZVFqhM87644! zT;$bvI*kFHHi}sfAyFoWl^95@)}Lql(q`BTQ-9Sgw`rPzL$F0=KSVLRFJ2D@eW-M` z5qsVed%KUbzs~)NYkL!LsQk!ydqm8T4iG??56xD>K%kTc(cy9^ojt2X8R852H8lyO zJ`7B&?ak;!K^?cYNW<4cJly+AKnNSQ$OpIAxjzf`&0bX+j+LNxV4j#4!T&`i=XwTM zDA8W3)-|oA2C(Xhwvv<0`~w$yz%6U7pTCFT$hUzkgCWstEw5^xqB=(PY$7RO&1l6- z6W^d_ICbSQTmUBr%(#F~?ciQ@vOqbtXcZ!vPmQdz^`H1B>PA;?rq0Y;7;|o{Ih_hp@+Mkjt{t}STr zX3uD|xL#?8W9g2$ovNw~*=@h`b`D>093QMXi>CSZGGaposM8F&D_clKWqfv&t4F;3 zY?YEog`CueI*Q({u~Lyl5wHDvf4X<&U-lS1YUK?zx5rSlBjhT6<8IukXRVc|si?4& z9ea<2Vtzdd*l-&3Gv8qR;ue$vA={k4phIOykTpbPH5P)qc+B}!t8Af*b-95$OE8wL zM~*pSW9xl4+%lo8$Pudlc+eK7pEu`98%X2vvI9w`cLBR*=qchNAD)E2S%*Y&os%o; zW$B=lvHFmF`mE#Z%PD|&eMzp`GUR9&BdqX!NrdV;w%)`AYw9@CtBpmI=Ji+`oF zOK6B=kmFRAQt)B)LI7~nU zUfSPEotyJ$re*wkCwP#KaW%@AN*K&FJ~XJ%EU62Mi)DV6)M!w7F#c^n8ujrllyR-N zjz&{>orY|&s9srmR}fN1mmnu-Wl9`Dq z3L0Vi0m1fQdO58WjpY<}7rVufs1cO;`Xs|IA)qGXaz%#Y=eflTvC>5aOG46^3?^x= z*THqObX=M*{H*eH!yx_Oydm=@zc+cuUV{%%E>x9M;5mT1tXx6Vk?7g01)GFuo1XdKC3DqF=XP$$snP6f zw-_1pFB_4{!+UT^I`x3XZ!;JoW%G3GR80aK#rm$zfT29mNSb1rm%%}Zkfy#cIt`|s z=1i~)o%CtC-mTm5*|(%M_BBE$mws42Td8)jQNZy4f)V{q(naDi&9%Wg;U=1NfgHTL zINSlwQt`bwxZ5@bPD?IMVWzpwSSA|yqrFphrS4Nem66RkNy>vl?yR!qXUB)J4+1|L zf|vWXINREMB@L^?MXxJ~V+}WYMoD7te4S>A>K>e_QN+Ak1a|>5lN6)$2D}~F2_R0F| zkWw{TIZ$rWSyNVRJlHtN7WEivZS|*m5C)LR-cwnMwE#9S%Ld2f`mEPg2D#yzq-N17 z%5_(36riJdtn+U5$B zPRx-E=kf&~tSGr$#$L?!RjK(GVa8+hQAWJ;XsZpA`qz6=-Sq&HQlj|liKuv9td!C#49O!4Ki zrKEdnRvSf0r_xi!Elg^Yf^p0-F^du;d8c8%FaDsR?Q0QUdR_))4X(>U08TJ{XV}K> z)EUFIbuWfEcGSi_hx*UC#!toge|{p&`{XnOWfD4N4HwJgXFxwUWYY2Q&raw=e1wnpIp(};Unk-4jq2)1+NNuHK_*Z=?kE9mUpL{edCVB8&omPzI1cQCegU`I0= zV(-A;G&LAAp#rRm;IZ#EL_-vkV2&Z}>9bEtTC5i`7hU;p#-0c=Fh1HZ6Vmf zofu>y^9BF&unII!(ZHChFz;Mds+kU#&XcyqYrs4nkjOI$?-GMs)C~h?Z5C#Ia5Ihz zm+g#m8Kb|%mkvTdg4R|%fb1BvOj>rJwCWS=Kl@=Bfk={6XvR#6iF*!}XsjP^S{1j& zZV+!AP77wFH9)6;{4m+iaQa#lKCa4!-sF)8BFv+HBhf4}wHsqI0rQYIJ2K}LewqXO z43G^&S!J9b_a$vbu4FQ|I!UzfPotyEyNiZtTBu* zS{*?V1%3sk+g)6acDnYLkVR#BX_oO4DKl2Ls_9#~TAelUZ|2op21sOjn}2`X z;_b&5@#|Py>Z`JFY|@ifR?xkAKq>pBdC}jqbBCn}bfpckrtXHf65y7HB&VvAGKa8u zD1_)$ZbPS#mHC~f>Cu4DH~YUXHY{=dlfz=#0aZIi*bsbe8406*zw26Macmx5ycs6{ zmcjBTlqVs!WeoN{O0#7xi|FrNq_4W6Ph4l1Zd?H=eSar(V~UEut~8w_NnMaas9L!v z3{m8(4Lgp)_{)@I;i2x4$C|Cv_ESo%q_45{y*uhVm3B_p)HZZh5)84W26z08+1Z63 zo|KzSe0zXguv-DTC3P~09?z$z6u>hqZbBTrE1#Q60EW#S93E)idzH%-L4IXmJ7pwD zxT1euCo3mLD?w$V1;$<+m{1N7eF->I?P>)4wf{wMW>$sJF98T2Vt>UWzuK+U-&^sX-GMEl~W4 zNx{TaRm*9PZcb@FN>Qib$G4Tv#+QQL2B(urlF~mV^cFDG)yDFOm4xcvo?+mwXT{Mm)0fmBjRgfI7G-LI}DC)>ZRyc678Oc z?f7mv)Q$W?MI8>FtEsYTGGZm-B|4Qwny-aL(`jxV(--a4X!?92{-RH1`l$kSubrR; z$(id@0gy71b@}>qUnQ9`#GGP@@2j?cN@4O_Cw}u^mZFLle|d&eJj>Om|_jTIx9 znrH(U5pQVmR+_(5LV6};+D584#G;N7ZvLlk7EjkTC1B!JcLj?SPB%QMjhVJdH2cMB zCPn5X3RhcGd@nH(-x+ha`k&j({fct3&d9mZ)@Q$NR>Q?bzN(*&lmo-l8Z$_rpM~bMaqsm-;dGe8mnS6u9gtsk*) zAA#RHBm5(De1D96%KCy(o_IcmPXk;K(@8IWA3-v~=vTo=ntGl~Fgv+d=nJOj zc@vKh%iN20p47FZQv8c~DdBll4B^$M-WfGGxyZ;|Z&Dn6)jgqwvGw7oZMTb-{$t6k z>!ZU#>8Gyc`oUA^+8T{uXM40%MOUB5<}Izwn_zy{SpE=a!);l6Bp&E|Es=kUfDn|k z!>spV-^`lUPwiZbb+AFE?x5DjlS=2}GAAwTtO39M3E?sm|Dn^T9+3(R`O;Pig*EOr zjRn{l?(1f|bxY*9nJXb>y-$Wz{q|6&uQX^#@hv8xk^sq39OoP<;gH~xxXH?&XHhaT9RpSzwqXzc+iFmcI~ot0`{hg3nn)vUJqX zc*h%PB%qXwL0m%RrNw0D5?A0TQl3eQ5%!fux2r5Rb4u*4RQ{~$cbhyiOS&GhR zF@<)(IWZ_L_reS~WX^B>Kjr<~2_+?zxH;+-Z^T32IAJzA&!q(;>^P^oDEp6bZ;h}y zcf^s$Z=RSFezk^v+*q%=FY#D9Y(v;SI1z?{354^b01_HE?YXeOe!vagkwjTngxLYX zyv~kwKWa^kl8xM<0QmY{Sngu1)IfoydR55On$eOiK6eCc%IcBwfS%jC<|<^^r+$Qt zVPx+n5AU$+sxBF^tC)R-3!Yc37hN&XgqjuZUg>;=J!7NXOWA@^|1qb<{PVy#oC|p`o?oJ{4O5_UD*~On>t@|I9$w!)+SS50U7^4Pn9d^#it@~wtd12v zr1*5E+6IL4<)B^=t17mL-W6t0*YL%BpF1mTRJ4Q}VtAYT;3xXBzoaLz53XR6ei+td z6Up1nf~>-hE{nGsdj}(0ZFT0ZQf^E_{(pOZ8ytA+8)vtMs`%yy%1E)%OBD(N(a*i|wCv7+`#USDtGAmskw|Dw;B1W-ryP zij+qmDc6doTY{5{T2lPZ6jqW>0`MjN{w)zGN4qHEtDP9TpIgM80m(Q_j6i|-`c!}S z_-a6|l_iJoZ}oajpXP(H3a_R8K}O4ndfi+mC04R_=qa0&KOgJl%YxT&+sWE{iz}QP z&3p_!!CjKulYu2roQ)@RYybO?j3A;8O-4Kat|bczz9m{%thVJ=8VEQ33ZjEkC&Vfd z!CwM6_Qnw4FU4&R?XMroZ#^elMI6LKf@&aFIMu8{#@k+D!x1ID zp=Am_=*rDwp13V0fi~vVZn^G7-#XlgbQf`ZlI5##3GnZ~CgU|-{QA%@K(OFh5UO!c z!oMq}o=pv}cY|g0C`qk*KL&&X!2R!_Jqcg)C9=)})Ml?o8OHQr^rNPzVLZa9QA#{| z-%i%O{$6xwL!ADxf}CD$@)kCo6i9;mmd!7=Yu#@F}^QsJ5YPPjMM}cBtAMiZ~=Etq?%|yh zYNb-7?xxerTrmajt1pyf64{fF1w(y)ZE4E0&<+#qP;-#ojCZ(1_3Uo3-*x)(lE)v{ z$4ziK4N-;KX;$#ccE3kRfiQ8Gk~T!8=6&bJ9j@~F)gV^>gv72~mldDbi-0O|q0F~*c&OXn z>95xd^;#)Bv^}|JE98Zmj5GcM&R^$(i}}i(QN-NB&rIucEXIRy_;W^XflUIHWRwH1 zs#aL>!OIk|mUS{D$w&iRpw+mLQRMj*C8eYX_1FMWp5xibsK%a=lV)5Zi2la5lU6Pu z*&5FE(X}WQSDug7JB8T?w+<-k(uDUTVU*R9sx0oXDLV^YKsZLfj}UL(YVv!VLs->T zqU+=y8jHfIBB1AI^q?h1kM4vWnvXlhNS!49-wW8}A9GGHBt|`9M}RlAwjR^i-=zkJ z2mPoBe`Z>(MF0l`W-tb$_(A3ue|^>Cqc!sXjYUPkP$wx^HDuZ0etb2mo^r2TT34!ir6Ir1 zyJ+hgBHW|bDrmk^66r5yJ)%GgFl#y-D2mAgBP`x9On@_80R+o}1YLtrv4Bunflw9Q z#RNpJg3f!MxY8y2A+VnN81j;`^zagQ7{Nh2ATfKb+I3s^sCKnIef7&V<({S7Fx5g} zCE!StH;B4kmUy1hd{MF0uKBt;IcFV}5rPp8>@19 zO+X5MW&*>eC@1(Ug2*qg4;mVUA7g-;O&!K(lgh%ghBUln%6SljaAtnL3>u`7XdEjv z1>~KyPq~4}CSVXR$RK7pf$$I5I>8~@EzS~JfbABt{~6cW7H?APu!=1xfs#f_3Jf^w zRo?i!u;B&4)gZNnp-r;Jyw8OltNV$kJPre7e8?GLAdt_2ZZfB8El28{5Gh1l@puh)BUsA+b}w`P#_r#!a1O~sqq{h@Qm9iQq#}}Q(_7IwPMHeZ^5Ktf_zLvUT z5C|Y`E&})91oITf2!yQnkB2r9*0o}BbeU+rcafNk53@E`d(8u{CDoL!bP zx5>Lh_n}^q>4d*I%<|52{cV~*t&^{O8he{jFU)rafS1U*t^;ZkKC`F-cyAp#LnGseDm;SY{pwNtwbyG(OYcmg$l`1SUL zPlpoo*GUxOo0Ur^H026T*9}t$CHK{kH083jK-{Yp4m;*0_v=`LF>(!mE%gCmUq)P; z|JQ9=`^(R>PjtVB^h$C!6^_`?BtF0u&L#6GhldOD!_=)z1m8VU8NHz^)VN1)Q$?Qn zg|pPP^0=Hsg~JaN0w5g6%|hk2#NCPoSnNTts3WW4NC}FYXCS0rRs1Ed(u^y8-M@+0000IV^3?r47NRjm-Q=^;Kw4kB>4y6 zX%9hUk*LqUzKHEKaV0Sc6Xj#~$cvZ1WBAe5&g;=k#YAJ8?+6VzZo9Bc$ffs(I;Dz} z>-RV!N3xjHV#D3@L%!nKTc~f@EmPVZ$>;p&U3N2YCcXhXt01LLPPmKy9KzdSVkQ;#7Y^B_x$xnvC0^4y1G92SXfOu z;!qO+(Ye){4iTIds9O}g*?4*?!Lx1T^XFjoL%_vlPZRrwLqqTH_@?OZl~$)Ts27dI zWdHTBfr&^+Mv0HUNv^F3{A~EMsvz1m_r?nLX;mHGFUR6ZLT9^qotGr&G#Jl3+=-^| zjn?X)oano<2T=%XHReLcs#z=(s54ZB8W)E7|DMc=rkPjB+*_r zgcf=nHwm?H9vGc5z0QRWrKXllf*u4H-vCP?E3&G>%UIf9p6@}>(v*{el-vsC^^oPO zM@o-s1S>rbny?A*kd-bD=b+!IYA%mS6Z4*RZ%nICe+0>K9agvd9A%Sw-Tr7?4c6@l z)>g;h4jeRF>Vkn2|G6Bb(fHI#jv)BR>7BU~7J!`QV6-doU(TOkEjS**xZ&yb!#!$~ zqei(*RHSY(AJXNG1xMyFYeIArQ-EtR)Oz~pir$x&c(zhCoQ__2cvydZedhpwK!Cqo zu0%;e=43CnUu{objqe>Q=0ltM(u06Mda-E~Tx`9O$P=c&uqK|CI^s}`Hf_Xn5wjBB z_yA>XW0B=-?$54#PAVz$pl>M70!M zm2y1CvO(u$jaG^rISk~t>)t;D8WoG+aw#~4&_^>txAym!g_5g70(QPC@X?_VOph>r zijcAn&jm+zR9sXf{kuQa=O{i^%62K}-A24mjwYnOLT76>8RmwQXV3w&7#oC>xQ-#M zQQJm@=`R3Z6sLtf7->nOx8jeUVJts_f&lb!SdyoS(_COE&O|?ea^|#Vg6C0m*8DJP zDMb-M1P zd+vKAP-zJW`LOP|XbRI7+1(=iNGtdg;?49BMlN}FNu@T2)%54Aa2=XCHrYhCfK&W^ z4@!ACDH&CC6e+;5uWU3l?v&FW+kZG+ocH2XWqLnDQc6qxT|&UFV|NbBe3sF)&c>J)f`c`<&>_->KDadL zY1JTsyE|t)StTrm&Kd|xeQqF(8FuuE*7YsqW`+R*T>AOaQEP0Za7H+Ma%3f{x@=~gF666KLq17X_s$Y`~7uHFjO<- zzsh{(6@9ASjMo6?oUSU|tod*m#aC0n4~QIpR{w09s}^Nag<&WF>*1>_{)p;{PZ9$T=ccZQfjY9VgQnrp?e0^?^UTo7m@1%QW$Y}ikyPS8^I;mPCHA28n%Gu2 zqv>$!4d%Ur1exh)zIsH>n2w5TGDVojh&#`&%i!G|5W;_g$$c(6S(F3*ebTvh_8c3h zW{;lY19k#<-Vhx(*!fgQ4}C$D%?yRBQnUN`_v*!PNJT&Q|H6p_Xi4Q#Nxu)}{tUAL z_+|__Jx>qbjzbsH>zs?=Xi%Wu!*v8wTX5__I!d}GS~3SkQAK_(|8~4hDC44u-4sXX zZ|oapzHz;@xA_ixgAB*YNI+vaw6^boYVX^p+NDNP6{{oi04ELV`@@|$*S;bE000lg zm7N)3ni)h*wb@U#Yz1h1bAUQY@MJ{FTYU)8h}!w7EP0N0(@E&wswvPxrVg0ya?1Qg zhn;jJ4N(WmicWp4F6L{9-HAbvDG!M2Gq5B528>_Ap}rWbd<<_r(X&E#`t(@z$04EECKy{?D~QYjDO*73OFY%y zC4x1uXoXwwn4l{iQb-BMdax#@#Jm{9ugCy-3A)wFP4ivne6otwrVY>));iZ`?81)k z^m>pOqoQa%Uh~gE49i|F(EmE?`h*fc0x(oWwb>Wh2m=U;;H?O_+FXU7c@(=rcs+vf zdj-|1DVNC700VzPz+ePhT^sX7X5vG)+Jn3Bv}QbAyGW%*Bs2jz9o2jyE3IHx*MlAOHXY zryBRfMSKSiTi-%3?sW)<*z+S@vwgiN9jDOTww}q~piifv*Naz9&R^0r7YDbZL4aP@ zYA|T0V?_dA`1yXRqY^7Z}F}PB9&ih9_ z`bV*pkH6-Sd|T6uSZSP;CL=_vq;H^uR+DaGjk1?yS2_B8d;h`{!;OU(@NRmjicvm5 z5hwkPWIat1g$rBGs^5K9O{@~PEycW(8HXTojnv&XUHlcpLpbohU8G{oWgZn8HeO9| zbaNpS2NQXj(C5=-UiqjCN&A=+nC`znxo zrci_?^tB&@j`u_lSmcNM7@%`FlWP_3}j9?7eSw zd!a&K3NLz~2B0YhcVGx8hLWjADk~M9Ld)7#E%Rm@s{SAvsa-+Gfw1^3^CP4sHGBJ= zV#%KrnzIJFm$G}Kgd@*`@Rj%@g~=HYeZ708diQD7u0S!y>Nx;!^xe}}n`PEE@sA_ETr&2h^TlLF$r)i+G|&gIMI#|uk?#2Cr!2A{nl9o;!+)AW z{1zg;mmkT!XjpKy2*i@hyP4o%dfpn7!c_!8<;mrR=n`0`iq?bBx&G?fgB~h$P{vn{_JpI%GBAvR!J|XWKRq!8PrReu*4kThuaH&8)Xss z@37nMcDfnia8CCsH?>2}!Bc0KroAMRdE61j$<#nH9hB>twu1WW2&!TKkRgH2!{)~n zU$sM=H|EWNE)u5}@&1yG`ovvmu4K7{kJmTGtf7=!+pBAx>pD^-#>yZH#BDS}?a&{6 zo3#%eqKou7A>>pUf*vd7@hp`6b~hvnHg}!mdELk8D@5Y^EBM+ALI~R=(-iF-niPYO zJ+e;8_}|SuPAAkDhAO&!0l7X+IGA9uHE4X*X-H=sCbe)l#C#RJ!L-Ju* zOy%E-+#`;a1LO6ofcfJQ0ZDr30I@qfa`hjVEp>3-w%RGLfrDo%v53U;v{|B`nY;Vs z5PuA@QAc@K?S^IpL8ji~L_Eb7lL$6wvV`wN;c@^B&q^$5zUt;WaV$Wg4x3H{D0jJ{ zH9Ng}3O_i##xiyGNA0B-$m85nAGT-j68&mC7fI0{fE%|c(e&F(J`FtAYf(1G&aCD# zd1sn3E#JQfhVJ~ci>_Xd1SIYx9K?m0>FN0Tkgw!$(Vy5Ja>`s*b;;3898!SaE5UrK zS11eD+uz*NMgV}G8Ca?@ow}9u;VV*j9FMmK9_YkmcO{G)hlOp{!PRJ>!lSvX5?bto z_6QQ?E&q>5u^;@gN6-}~q^2rCf&TSBJceid1^b_)l~+nQ8dfMblKC-`Y}nSNK@lhetM5ix&Sidn8L=Pew?2fTVd)r><=8P zJTczTeIc2||CO*xEazn-PF-4Dd7Y{qGb!)h&8i$N&(7g=3>mUH9#88>O6kU{xXt6C zpn`>4;V&2W4L*D9g9B!g~RXi3jJ?CeO?Zl;7 zrplalQf*ASed_9kH$nOdDwFqwd$6veA`Y2~0OA+Pp51P8RWOnkw_$+_A?Lu88NtJ* z0+*bsa8DOT;x$2}dnDU!qwAr&`+YSO@EVnYNt*Z^0+f9M(O0^+WCSdMo8*+g;#ig+ zb8a;A-AUvUai7ruc^yZ0(Fo-d_8c9BaxKcX28Fqj$|(F-?1_{m@DV~^Nz#_C<7iEN zQ<3U^eIY5daVp`jmHiw}+DdbDKf+YAf5%i_C=u)c`+>dz+yG`Nh$M0`*YkipGO2oj z?K+}ff<^$cMla9xa&Evlqj-oY=prWO*&yBbtX?wFb=Nr!i32uR+$WWmHt4|x9oT6U zc955l-?6C8rr-EqRzC{*)pLpAP*uumpSXmok;Ej1 z+UQ*3vNj2DHT-6ysLVl_kEY&G*8V@Khi+UQ~I z>sEN$90$rW{>-a)#}!4MId@X1Eg)=*V%n=t7B5sj{Qp+iQBKl*(j?qc2Pz_PyU; z$MNV_-zrhQyFd9@{d*3a_Rl{&HW1t2GjD)+O+BhiE82%IU9u%Mhw72*<$He1F zi~xaq%6B+=3j|z&#?s*688#kpM(o-Rr`7kUJzQ-iQnxXL%=6M@z*rLJ(9CfqpaDm0tI;-$CH)#s z0b)}P7JKAR%9Su~ZT7-}0}41~%>*Dw$Ye#r`&iLq_%%Ms=)Ip-Px4vpI1FUZ};-w zzBSbVCW?*)LUU8^;aCILTdGg&6Af3ov+xG#NWit`4i{QxQz3aC?q*S2G9AdwqOV_vzj^X`H z!Iqg}Q2ehN5l@>x<;*@|(ml%*88xhjW$-fxLV8>d%=xk*Di_XA1dY6W6ZBa$%5J_;GKk$m&>F z8l=JgTya&=lJ(0pp;g%mlIlT6y8FAV(po#64UUPdqFGZz1-b@Sfmxv;R_B5?+(+gt zwMWtZ5%MPknpdpGNT!~|*#-&c+ku7(*ixw<^np7Ou~K*7pUI9xcy$5~Np_=gn@1F;>F z%_YE5k;#{DcR#MnGa?PB3WsiQ#mxq46b6Mp% zweG=mKjjy^Dy`>hnk>Z+J0Ju+U|p|z{y*V+61i4%S&phh-^O}BFNzQ-_%Y8s9gZ$6 zO{gz33ey)EO4&PNJ5y;0*|6=U5Eh%GM4MP&`GQ%eC#>T#QIv){(L+-u7!@ATK^7TA z3Lwi3eB;!uleR(iU8J9=Xh(0BngtkEq@`aBJx>u*cm7fI!v)BmTJ&ez4=X&^RC*2O zZb@R7y8I}|dk#^^#y9}Ar6$Gcz5hu4j{wtCJ{vFoE+F5rsB-1(?V_GWI)MlcFnmb> zkCU$SFGLHQCSeS?+7Q~|T5vy(2maiwv@6pov{u9mv9=+K;nR|#c7;;eo5-bMVRCwZ z=9I5`16xHp8_LQ8zusCwS)+f5ziZCgH6J3A-<7t)PZIrM51YZMt zHlfIsFyVhtJxj4XC_%1*kvL$@NagK_0ssM0K9|ywOFi=*#jfprN4$0@5f1YwyId_< zVa##HKL6%N-1DYF<5mkmWU1FaG6kW+)n5|HBYW?7uZHsrKLHRDnt^Z}#|;aDrxcHr z83qd!inal>TV9-)^C1kQ=B0w8Ml$_7WV1+~r%N9m=3?gdYG)SJ*&;wRCbZu)CpUd>HuJp1Z5he0>SKX%tV7&g-YGvs5JnJ{3rJH-_VdHNCTq(KC ztmCRe%g?Uu8}Tt-V_=3mT`-Z$_e+N^@uxM9Ac(70OAMk2IfM5QCMoIavdZ84zIZy&jAq^(A(cuaZYLcA#flXriiQ+k>p*3$gvlcq`Y&#Cj z%gwNK3_X~bdE3cWoEslEVpv`Ux49rpdW{RwJFk_;UQ$Oww*Sqqv|zIr-Kqyi%xgG6 zV%TQl!;yiVZd2F>!yXiN=Q0BHF~jmZ>VbH0UghFNo;ULNl|I^=(w_ieU1TL#+tZnK zv2BFt;M;gM%Uwn=zq((jYZ3ykd^{t4vkbU|VXO$}^@uo*h%mlAlGC#Lvud@uA9iLO zF!F7VZ)Ab|WE0?2QKA^!g5K52uL`-M)+=F;HCl$~8dZOOgv4JRIf#Eh+YAr6>k@Q* z{OWup=Z0BK!9s$Le$QsG(`q-;{j~2*TYx3#Qd;(~EL#WWdYzGx5=hDP9uF?RW@Pm5 zV*|_U)m^6sWc*$WA}xqGPURE}JRy8J4x`qmlq9Wqr-b_&=OdTgujh4mCy7V#A673{ z#k5-x=|JPqRB8f~sGheEu{}Qjy3`C~nD%=}jEV%TOF*O-3a!G@RpP_e<m;2~Xk}oWbWdLAxmj38h)JJpdN`B< z*TVVTXXkPeC$C{HFk@+5I=lj^q;hd^fxmc+rYffK4QiAysfrK4N0pma1)43zzHX4* z|>ACo`zsh0YXWWEe)dLn6t63*3}_)7=TCMb}5Lw(rXNOOi0}OVI~|jmXG1u zemWmiigf<`TqpZO70_0i4hKnXs|*~E@@W~8eOm(`76p-0J;Ez4-5g0Jp_Oivyrj70 zFijVWmg9UL8Jc3fJz7WQ_BUdMQqW9Y55wStLD?bWhs{xriwnu%(^Jo(aP;oZG%Ql& zJN35!z)7{i+g!MuJu>Jm!bhHofkI?FJpb_(>z8JhUw*n+#P5b=V*4;plFCp9T z8;uv#{GY;G2*Vlw?oNUIJ=Z&vZN>ONd|*$A)G$1|kBn0#Ko&qOU7~i%Eno6j-6r0j z8SV?|+!h1$5ci*nP_eXRlHD+2oMdzbywK-%G#_+sGU{t)(VjG^fUr31ik#h6PvTcnP%n3lN1lq_o1`({gYN_@N#)9t-1QIDVoM8zRCCid?*igQ1v>flbq#j=!W0q5|X z_Xsg4eAZAQ*S|N-JimOMt4rqzrV9WuU4!>sk3#81 zShZwfbP-8)6u$~+v6R;=%wb586MzF~DjgZ+Ca3Z>4SWjGBO6Imuus97T%G7DvJWo!`v==sf630k0IS9jK(@QT zo9pD)U-va#dH+fz)K%F)13kIq-fII>6zgGowuh)P&Ss+*vm8KAb#9(BeBn&Itq_MQ z*@#NO#ax>Q^EV>vAV~9p>X*+bUH(!MBSY;lnQNE%Jm57-R5lQtCc=&w`@0K;!M5mr z^wQ^z93lf0uX94z@iE<%zSIg;?4H-69lD);*x^*~1QLnE29%4q%uog35a3pn{=h0V z98vHCFgfzFfx28#of$rt8x(v1%np34pl+8GXGTw@#>F1BHd+2@-+Bq|{t-($aQM^3 zw2LB+=&VfuSX@EES&Eu#6GBWjN8qq9x#1~WlIAi@ z5yrZBCCerln^@PrBO{Nve*gdg1hOfY$cRA?w1)kAdceYnKwHL8n2sGHG~i!Jv!UxB z$RK5PT+P)5EyMFqQq!|K0T@)$IDK_fe+ow#^${!hz8ob!U%3cNTua9%76SAOq$Y|< z+4O=tkN|Xh;wgsjx~(Wfxu|h`bBLeR+4KXd$M)CzmcUlv3}Ys$%3R4!svOSv;@ZpCa$0qOSt}l(*?iA-!I9|vAwP5A7tf}ewx{EP%&9qk*aV3B*pn-|s%GtK zzYWk{HA5(RLnTz}XF=$YAKvR)chV9)gH#f169fku{ER!I{S{{0$I!6ogO#%k2^A36 z9(Wi7T-_OwJ-M%6F&+TkZd~xaml*zno>n3&s%YJd={^jV+5y4=B6u(_S1%m^H9fs3 z!Wkaend@+Ou<4VK*<$prrFMc;x1$oj+Ufi6$VG#1e}&m@#qR@fb$w>Wt&iT1(l5LA z34C;sr0u@{jadh*F07lMT2Hr3F?zYqgD5~M!Akh`lL81raR^F+Nqq zWm>penZ2awLv<%He?x&%xz%5%iL7b|ZEhi-!MEl0wi~vNDq{z}32xiDepVc)$`WMk`Nf0SegjaIeca4ZV&k-*k+;J1(s^qD z1n(F26w<~)E=!DW>;EvzsIRvD4Kw``*BxMO2w3mvg`g!ApYkGmmpUl-E%2>TSZ?Do z?Q2mLyjwASyS+U!Qy(S@xa(cCV#v0z!$JKsHg2B-!A$})O$2U0eye>P`vWq_)=7x) zF&18FD$HJOnKz%PPwMm9HkU6z-!fU$!4o+x5>NRV8Fy~{8AMaB-$@s}(*7|wYV!;2 z12;&sK4pS}P;6Ug^{c{QbD!}d8uu|8gnFRVJkP`}rlD*wIKbRr>v!grE&bSH|7}5P z6Q%dy%%{rqYO{; z1>HpSM#I`2eM>`n+9Qw-Tp4j4KA4^}kW$te;YpgM6J$5YF~YfJR+c`9mCZ~U6v7$e zo#-RiU;Kc?lAi73Aw@zjw*MMuzy3_OS;-2#Z<%b;T3%xn>02CbX_Pn;A@Mrn&_<4L z)WOekkL|Q_-7oUaL}f>$M+giTDYtUYh;6;5#^&Du{U;uDpUrO-SB(XOf|+1Xl_SZX zZIdlFw9<#MKswz}@YV44nbLwyuKC#GOD^)_Tcr@wed%z^@kP~sRfoj zlQT)615d2TtT$X-oQU;spyw{Fdrru8bT3#)tM7#MAd1UTaui6Jdu9OQ+_lQ!ltuVs>3`B=^?g$aDat{k}HkA;G6(GMp>ggX>V2ea@y!(8A&wWbDmh( zLFS6@yc+)@sgVV*CoZ3t@@vcv5jly3b^95xM9wBnMEYuJGi$#{YF7U%^V`z&$ISUPk7VzV^Dpg)V3V_FkOQq^EA z^OPb|@I38r;MR<}8nO$rSdviVcStn~gGu8F z??4SxS_gJXwUPhaZry({$g1-{wVkrX-bE-l4?@5hYlCR|>_Ye$WKug<*^tIKiX&oK zWoPRbaR*}EI2^Ob>!BVh5wI?J9H~OQO(21-IAM;8^2ctGrj-4ctLtB*(7ldfwNimd zS>L)TBWr4d6xGg~P9Wb(0ltP`CxVRhv)>C`D1WCg08s-ce=|FCv0~Tm#e9A#|Ihblf7iI-w5v007kzsbyzN@r`mLudS0e(1YDF69KpC zsOaGjYhqftZjZjRjiowXl{X5-w@NL15#$w-aSQMZHOQJ6PGiK##%SgcwQ!`Q-~pIL za8sNsIY&4E?JE09oTUOSO!xYLUXB4i>LV-|5kLR{BA~3I>5Y^jWEq541ONcfs+rLM z00ZqxoG?HDi6^eAseV&94^lgCLY;rQ=Ee&NSf(*a_ z03F`=hyWj-g_EF}WI?n@yG(O;aZTUCscz zoB?+@0`71H+~5njz!!6XF6RJU&H%fd0e3h8?r@+p4NXOwKoW_=1ON-DM*R^#>fP3z zpUKG{vvEVTMcBA$Mxydz9$0k<8 zAefA{!kYk%ls~-mjB5Gi_;bb)qL+7-hbFn(Ni~?{R~BkrL%v^G>@SzC!4zc!My&I@ z4xqN+};$ZB`PmDGOh$!wqD=#Lvcd8ypIy)qv#RKleeFfQf76En$4#TyMn3Yej zlyz^A)Bay=C@g}41BVwKS3T}54AA6;h1aDokQ}+#yWvF9+2Zd^&rp-45_llzlT1w% z00003a@4IuKN|PMKmisCJtOhjtFMpw9L%3-3-4Iv5Yi5ne6%KLJkU!PrUO+6d zy1LEl1u1Sp*rN_N1#O3`<9~PpFl=63gc)8Kll1-jnZ^Kl`W!het3k;UM#LZ0(uTsF z3Mq&(doJZQ7YQz1>;4b4(oqDxMV)O z8JV(jgjaz4aE--hD9}0crEtT{Fa|=T;rPG#TS1ubcu#5cq39r~|8M=G%>_p#WKFa2 zMKBZSVa?tec@^?WRnQ5x1sd@GnkBemg86S9&eax0L?m@4G6Az~?^$Q9p(o_q$u-nRZdt66z6qGT}p146M0{Dil%?k^CY@lZA$gp?^B_UWa=7lSg2A8jS`$_h}X^ z6_)hp>=hf&m{agPnOEySW_H)ra_gM!*z`D*^ZKbDGgZ-^lO%a+Fa^ zpi9Mt+@V)uRz{qT7LeVvx#P7)hGy!!Ut%dhki<$GYCjcPPXMc~)NO!3(i#cO+;vyf zddHxRn52D+=MGC}U$CE9*Z1=;>ZiM>OkB0=$)?fbEIU#5pvWvhQP;8*bScn($-FRp z6OM?TCcMP_yu6Zp_?F%8m zj5*_P$CU!{3rGV>1eX=+1NsVk>9WKSEdC{8WEV9vdZdv^F2!=;YJvwylVv$7mA9F1jcKK)P_M1nbAH~DWR2>WB|EA~JOux)@s_UIg&2IEIWpOsXrErA2_j^B1DDoD(ImW&tlx;h`;kJYD z(1RlO!=Q_|z7b09cmGibsZkaT2Mxv<2>1FgjwV%b{`-JR*;i~tUJ*x&Z! z%r4yeV4|xAt8}QG?!j<2Qw3i82bA6b1^l>(i?q|>`XNV#G@nxEf)R{krQ}H*9p^<8 zDm#-I?HxZrVg|c&ZK*1RGj?mN?&_N~`TcQcdEHDE?MfCwEymsJ8$(^mU&vaF6k#O%&$e8TCX}|n3U$hfrGG8zyb9jiUo;q(N#G; z0It39hLxlPtbz0*0fXvG=5|p)&FjlD-P#;q&{abE_5%VGM0C|S*tM1WzO(bs>f%Vl zxZ#A=k#Ii$`^#|bO<5{fS6!R_`qZR_Ye zEmkhw{#@$VxZ2cAn|FWeZmPlJ6P${8(7~l|&c157Wmc4)2swP&MA<1&mJeVBJww_u zzx+e3SYPvmmG)1NJMu{9CmQ{30eP))nkXH!lj^di54;rsH^supTUICnK)BwoMIhi1 zV>#(s#^I4(_n=MvE%qr{!ks_SPSbuC)aAkCPq549$y`v;7BB7p43(5{UO%*?3YO5O z`+xBpnP7@&`VJ>z5o1g3bq(I-5mF)ZfWA?u3C1i0xWhqm=M(u*K>nEviYOzrf;E*9 zfLx4VP922xRqA1J^Yq@2Ng05h6@{1H0#c?{35OK}x$U<+`e{fUW$UvMhcuNIG?_{8 zZlb15L7AraT{K)&4~t8Gusc|Rymg9j{U}85T+?GwMi2Mv_x3}$AAuSItu!!?0(1$` z;md$aqR-k$DoU;7WLi zTe&S_v_!$vP=$ao%-ie8c&~lhTs=Fk^fxav-k#H6Q$Lu$bM7%lW(l>&e074Cu0`88 z*$5Z26(je^9RN|61#UbY-dETq(Z5+e0SzE7BC{np$|^ zgBEcQ5-A>#(%t27C=06FI?A<{*WdsP%5~&@lI-}@D{)4Q)J_;603VZT%J0n;NuA58 z#=j`bw%{G&d>o*Vpa1}f0lyFc&Gn*g5nK>QL&LB^o7?Wo2x4cX5}Yh+CpD?QJO6_C z9wO;Qb*9Uxtq%j>$vq*XMEdtlSf!7;(fm=9$NRJK00OH5;=O#<=`UfS=~)15t^V9w zYLzU5Q1ui=L}wJ=WpRw(P0p2qc=%#hK^%zbC)GmpR4nN|7Z@6J6>W=|8B669|oA;`ve11p>MGh$?mO-xvOC?6*0wRtLvvLwZR2UTd0|3rv~ou z1RwtAMCm2x5xUYn`^_~%h({YO3)>hDQ zQtkb*Z`RxBJhLuR;8*zNVPKG^aPj+6p;axKLP1;ezP;%HTsG&pY zDM*&w_tA2^Hf)RAWqC8F*@!Pi2bnf{#y+f(9`b|++Ct%E z>v+5BC?UTM6HhGf*k{|L#D@RcV2T<9a#(E(NgR8MJmr%?;k+C+r4qORvQ<}E&_Xag zcGVZ8;{ev%`PBJk2;Lr4!fg@kx&9+o$!DOCLnsR$Kh+j3VlwY!?&f>XBxhQ9vYqdd z0oZH2KTJ&R^CPAU!5rO?`c z0em`cNatB4r=x|w5nD#PukO#j-oiag1(6%b+l?e{F2$70^T61GJ@{Y7A$>FKg{{LU zS=(IV003RIZyPEqtpa;cX5lI&Zn%1AAo3?BvHv{4fQ(=O001G1df`7T&{toS@q@E>KDL6G_B~e= zwTSg>ItzBtG&N`00p-L107Szel;(qY!t*j3+MES~DJn57^7$GdI$B5!N_8!f8v%*D z-pKATc$Ra(d+@R8<<6Kw|2BdtyBF%6zlDzh$tcyDcS@089#@)9DGYv682qx!rQib* z9smgo^flEE5YjC_0#xPAIzoxXNnOhsIYq^`1W>1H)ySRz000#<8oq5!D4U?XIfzj= zLQHN>Er{LFSyTl_uMoTO@`~{`TNYDm3EarKB-;`Wv*3b!k9r+CE7S<;@al?H>~r|t z|Lem|HG1#jSC49~{fE}qL#4%Ha|5aA~lya}SB>ki~!qYDa{RT!-JS)T0PT4$TtwJYReQ$sQjBPhMT z?tPuOcq(*6;fWgcrzlSwkl?t%=9=|MXEqih8bq*UUPS6iTWp1`eP_G+0WLr-8gxfg zJ%k#qFUg=yyOEP0h9AsYCC%m_h#n>Z_i@Hz(o2bHitu7Mc|W;-=ood8H~L^@nxZJ& zUn7EL&fm-BQ!F5tjX{cu~m0J>a5Ki931*g-~r#3ahGdvWcVA;EHh$sUYGm zPPBbvAt@eeVNa3lefLt36oP(qqv35&d~5hK_r5je8V00+o>za}izvEB0Bn`V6)5o*~j z_uun$;qqPUpmeOP*Jj(!PFuxRe6enH@S&`@2gk48^KW6B^NS~kt-O;8Lx478Fe7AP zTlD-UM^C=iex>)avoz`QA7$&`(G-I+w~@uxU4&iwg~glnJ3%>@Ny$jCsSB$(YgXAL z=Qwk6(mM-I@y{HNDYiJaQ4D|2_-{Y6cR%4MD^9cp%k`Yk>d1L1B`g*3D);1h*tqMN zQH!FJTTnK*VtM=q*}JPbm!kMC((z*h)jIzt@yOzvVtQazQD`w%KnWxux+Efb*rJG6 zC$)-uSuKvRXJU_xGN2XflG^3j_>;IX< zRk`-9)3N&gRJT^UDAdJ)N~m`b<+%JT$`O}#y70ZtnRU@6x?5{hi>d*G3I{q<7NRu- zd1%!K zXuorRL&);^oblOb5-@pQ-5s~Dwjk|e3NXOsxA;@xE%?e@U5F7IX5}lA^_*(9%zg&i zruT|-{I-fe-GQ@RJF(avI?!rhmh<#8_(P-xlWqXGjCf86g5Bj|4^`50nu6~^DR@

i?g+Zo*jl0Y-@;vm}LcrG7(A9%?PHFYG(JCj+s5Ixuexys`1^A@nqgXL@gIM(m` zHsm!g0CD-(ZVLjAH9F697`o$|r&x3g0A|9Z?iL|(roaFOIPd@`i?np8huSmZOeR^m zT}~hLnm@tZMKlBKK<~^?PATi)GL>$>5~^({15!lGvuAH^gX(JVT2B}Ux{$AJ^C+SU zR@1gSF*^u9+Dt*^ak;g8`4A2c=fr=^c&NWZJmY4^Cr8O`X`4AZ*mCV$a1D!b`aY&h zVd}EW)0c?eIg6pokTpv4?iygUz}&hdT1153;Je4Y)1Y9uuhgoWUC1|iNYoL{95m4W z8m!-Lu8PIh3I9I3oXmt6J}kaQ0i63w-e{68(qOP)x?v=B3smK`l;*d$Sma!xZvz>Fj1Zq zJ*NGBmhy+#1LD<*DIZh}+9wC=wRuTy1PAI8D6eKy33VcU64TbevdcAe4|s8LffH7?nFN!on{{rEdT zdsG362aG*QTXjaIQvWxQ9d$IR6;5yMxVS>xlx@~0+358Y8zww(WXE2w>?9VTpS1&9 z6r)u`Bbzi~=~ReqzkK490$vDrrc@Sc{$H+9m?OusUD8?F#x~>m#f3w4(mEFcDMcs$Tr3(QHyMCsj)UL%JmX5L{_%V}qo9aP>a7z0XlW z-Ne5#Lj7!vy@>7Zlyh(-0uY zgm;M8FoF#Sq1&!j?_M@jfHo)T0Nj8rIp$|;d5B{;00F$EN`cC(mIUt}dYT5jb_pMc zhPBZ_T^Fw+BynygFr0L<*y1PkK>My*AE2>IL#S?tm&KhhHQIFvBuhdGCVUmWQq1~4 zq!D3X)|-Jz>p@+WuN+kwEiM6!5GD#s*Hz4XW#7goSsO2~u}qp=kindvc|vyP$O+nm z!ba`6Mj_@RA^D8>D9~J!=wxokMZi9fuEttbp}Vlf&&KvFAMDB67DvjSc-42FkBTX; z2LjEvSRr~}u&fg*6@-Q^Y!+#h1*)33l;Bs-w>+}DU5SY6x{ten#SZ}t(F>6jSe^Tv zmo8cMS6sPWJ5}X6+0fw{DFeQ6B{)&_i$Tq=!f9TK9`w%f%2Ds11gG<(&zQ4 zU6yLdFlD5Y`QUwCbuBWj>K#pUtq_zB zp<#h`Z}bL?5N!R2M4VHo43 z5ZS68PItw`wGi8W1XFISQXG8JlL9&Sq=LK%UctZKY?A;03Ph*?01Y5Nh^{J25&U*c zVVD2_0B9BbBg7uryCo-TQ{z&lKmY(~0rO}IK_4Is1bAiMv2zRTf&c(6X>oJYLhfgP zLnS}}0BHg0$kB6+vWlUGl?WUF06YQFV2$160008G5c=F(lJRI4q*GAuaB9^+xsVA6#Sp{dap3h6GHLQqWAh#Dl`NcrWQpEywa zcRtm>!?AiZ`VICqG6seWp6NXk5fkjj=OK_FYh^R7ub&sY9>Nkoj&!|wDUWjIzL%h54o;%*UO|RcVf`56`tqHo>>Ef)$cq| zlrjlJ$;wwPYJHF0@1NP{L^f^e_U|`9;Fr(+(OY@3(=}!almIdu3hh{9&xhu9iv(h> zZ?Z7S5?-Mi`BTkC4;T>Av?+KPWrPiN$O@uGc@K_W>Qawn&2uO_WqvZ38`sN8G-L5! z_Q|rbHC4szdo%ilv;UL&7CI)LWpQ#C&u@Ybpp>eyRHA@i&K^=($%g5wqlEx3zO3E- z@ZmbYb-Efev$)h^eNC=Gn)&FvIV7H?;**7MnQuOn?zH9h6Qz~se@KyXYw+q^8W|$S zeb&3TGCE|96z9D!F^q!Tl7-Y!*7=)n`c%08^qF}V)8I9pQtRZY&11~ZM&v&4)FC_I z&`j2qEXQsBrt%5y)8Y*aT+GlwG<+u!rgDrWZpgJx;f^^1!e&X_dn>KdpTb zw_c^E@d5OZ=_5_LbpNmiS1t3}0;!%+#-T*v`HIQL$YKPSO>*FahMPR=R zt%##I^CEt7rqkqL3x<{B7BM`;?`ASeWL$(KF#6|9--~Se26K_sGS9`b;g_Sq6ZP*N zg+RXOjM^t>Vzn6}dr7nwOI~dv+MrTB#=AEf*G#digl{K(MWTQS>r^3Rbi5h+5_7rgx2nGYm?iDAP-Uz zk-IUt36hkdA%tGq^yp(fXjVb<$vWJIdgF5`Yinajnz_}}5>8SIAN=ps+_P)d3?M{( z^<)vqS<$9R!F;VBxvXC&OAs5i&TKouBx2##F3LFkZPl;fb#C)FzsabBrjlsHt51-- z7P_gU!@>1^>bP*}ZZKy%hVh3_Zep^)Q==KAM->j74qE!V=hje_V0zE_gm==m=_* zN+n@fn-|>Y!N?}5HZN+K6etwpm&#mpN;oAb7nr%JYgkOEEGhEPZc7Qi>j*VT!T|lh z(G{6Kn?9hnt5n5p=56d)3WUf46n9e*PE$JZh~6abbyCMzC-U$81qd@ok-50scC(s_ z)dBU08UKTXrJO>#G0*mJj$NG<&ua`xT(6BhZKZ_84*sCds zteVSN+W6{JBofyL#HLbhVNOeyK`E@BYr;>NT_^Fw3x;n3hWV^g3Q;` z=)Jz_$~}Ckj;`?OKb4Ya`pHpHUZ{f;`wrXFGcR|%6Y?NnrkkMJCI`m#Vy~ADJjr%ls6st2db$T81yr5} zq+aOjJrWj*nuq1cgj-UC{#e!@JmJDoqSD1lmot-l7d@sZ>|s}MdCc>5okZd#=)=TP z`FOH+I2r*;2VDf7$Q)MuOU=Y*GdstjtpqfCO=5j-d+(FZ?PhMe_6s9wU>xeu$c}q_g<7O_>Y8mRRp`qo91&_yMg3@Hi zsj=NWft@lEzaL6L9H}$KQE)*qn4Niu76C)~E2|9C0d6+~+uCqUkYcMj<(9BYR^!!o zigb-cy>xAR?wJ6D<;#nXi7(aYTkRytw4^?#~+$IdjZu zYOCiUDlbN_NOek~8e4&R_6L1q9p_PdGPB^NyhIVT!9;Hbv<0^pl8h#`RlXsUQo^HH zn?w~fgImSnXSAme&#zsWd9XvtLQ_+6%V!q6W?>S$Wub@VMPZUKKL0>`Nx^L)&F#$E z5UbUmEax6Y(Qcc>h&kdz45*eEy?xAinC-z&Q2rhKo)EIMrwT2vOj zW)oV~(^cQ}QtCMsrQuKW;lp2x^=gx@k2_rHCIs_nk#XxHR@5>aP`bFzEy`{6xNuXw zIc)SB;Q+#rE6;4o#%Wawub;>9SD*LkU9hgOO2gUJdeb$m_@G#kCSo3QgGYwLCEWUn z-6yVv&n_{Ndo3x;7IH@ACKmjXs#!y>G^p$(219Jro!`>1@uiX^?8{^2A-7YIG16$= z@mMhDON^Im%s3tC1Jl}PoThPU;rcG62Su4Nn{e{Y&#q%6hkV^$3UhbnQ+v}rcMrRp zu6!52;gioIvkzxB)FtcV&$jI*L^vd`=o=KRvYNx)#x!{Cl0z*uKVMX!6W~iHTLA!k zf#6qhx#xUoSkWI?2+$Q~%8JwBr@Fn&*Q{)M%_6(mBTX%Z(>L1gL_P$J@i$h>%CY^A zrx5`U@n&gd1-II`M5nRyor9juZ6SaKWj{w!wbF#hr*om(E;VWgAhW8`2hvx(&7Fk; zUIW;C7^BMi;Ml+rcIX(5O9B79B=J!$N%(2!kO|wn*10v0kD?8CS~5zPMWf00HH8OV zJwhGElfidDp>fnOv86N*14^k9qxW%-s-&g^b*V}#=~nLF933Dimhyz7o0gZqXd)kW zsc`bAZz~uMi?Yh(&cFK@g%$)~HPdoT6(9>F+P;T$indXUd; ztaEY;ZTLDNJKTYwNF!!Tdr)(n?%Dz~_m4oqY_%Wqkp;XlIb7?B%d7)J)+?&XjZDj9 zQ)_TJg>R(;oBJ2_Gg?y?Q;GiH=f!gt01i-1NxvmEbYu+kTNVpZwwm4!6-a7GNOqSk zv8B))b6x8jtQnkjG;bv(i8DtwNvUhY0HcbY*CCH2dAQLo>(;%f$6JjpGTw`-cCr=m ze|s&0e~C*>sBbZ%WKBD;r9Y(3y-tw*&}wSNRy!tW)d%swpbx1R3m3SE zPv@g;e@uC|rDDR4dlt*!10~^)6-@h)lZ{_F@kxm@2$kZ^^r%%%hea8mcg(k zHU&=%MYd)g+uaxov+}C>qsvf;CacS(beurfDffbx`t?kW`Wp-ivMY4aW8u>+q(>~8 ztVy#x)J5b$L_A6xX0QkKZHasfpKLyDvnaA~k5^rf^liEWmiF@D#XZw6l1A9&2!uDu zA5>xj_7`+Bi=IxhU%nBsK6Y1!dOe4Xn-mgFo*qdXo>eKI) z4m>%@KIP8~vQX}?pKS6(Mqm|TncmHN%_YCmFm($;DnLwok%e=aV{SxBE*a)d^)%C^ zhQtz4L!$b!TB=31f9j69rPT}->v)(xOqLAhnXcheB+%L!K13I0#P91KFW3K6Hd)ok zNP~-QdmT6gq&P1tTtU#jyp<3F7vz;FOFji}fm?*Ny`|hfaN{javv8qQOE|Nym>>1c zRn*1r!@3@E>mJT_VJ7nv8}Iv=xQu*FGJ+h7(#^@XY?=5+!eQr`_OEAGm@%pIxw3nB z$eA#LTBY@=RxW}a-u`N#c>DZgocdKdQO6S|dcSNedbddTv>P3kA}Zw5a^G+P5-<6+aVR-A&~Yi328wIE*BGlT3(Ds8%z*D9TV#7w`~LhXLd7%a?ktf56H7>mvdWg2W$4HI2hHQ-mE zU+RuHGm_FASW$IYugO5-y=}zH#Uh#VU#Y@Fog+w1jep~XpR8QfrHO$a#dL!9`_`O7 zPuG2i<4a_Og;>9(b=$jM*HClMtLYayNHZcCTvMZSk4|6L5*c#$P~i*-vBc*dX%!q8@fuK}EJG)> zhlC-S0^B`g^GSWqvTsRFqC$hp1~^n|vWvfjesBGeZ9!=_C6CLU^Zq=JI2n|h=FN>g zitqF^=8K_=tuy~A<&XWqPft=(7a260clc>x+)gg{#Iio--I3&r<$KdlCcjHWhT9xr z#?AtMTTitqr&FT0WHQ4n_Hb`3te#*MqCN^b=OWQ@D1=<#^|H10 z#VSfD{(#Yv?^+*rppKAW;10nZXzb?P-lMwxPEo)aV|EEv^uk~P?8@+jlVzt1Z6)gR zTN|HFP8A8ifHk&Do)Eq1We8N%+@oNYVXFe(Hr&4T3aEeue@H1@X|l}t@h0b;MaDyz z4E76H|BDRx+uup-1)f>~mVyo;Z7wUKbF`~fvShc?-s%)quv_wydsa^5T9jVa`0PqY2000We2unjx5gP?)Du5NsGf8GlKJH(`NUJrvk?4l1=|tkqkSmam z!*=>8A98HF0wk920E2qgBs3_)Xb$AV-H0VC-1lpPai5OwPv?E|-D#+%KyyTIx~Yz1vJ@pyBN*g>oV*_f3FsC*uy)3xS#D z!wp_J)>@kc}b$3Jo0L6X${U zTu<;xe4!wpQWsLV>QRiU3n(E}>ZVoCPw%MrxEAZM|Ghlm+UpvSI38&5vF9s`QNTJ~ z0mlsWk((dWCY^bhskuV^W01u$fj=+hr>EK56!Y)d(3{u}#pr@+I=iH8Zr3MFY+QfE zBgrqM@Gu8eW0tj} zD?y3xQM2f$js}yWekZn)0i@?d3dx@xR|$F6j2p;=`P|@ zro-;%*Egxx&>g^&X?#gE(9d_`o?UBn=bjr9=~+j*Z2q7~!f>2c@LWLx!wlVJr$m zv&?M|*Cv9Dv}v-%28@&~y&z*f5AHi{$JnhR64a}GUFP}NmxOA}I>(%}>3pP;9?M^k z^5yhR`FGpFo%L?#7?NkSE>qSTaW5gk(0*`b!;!PQC9P_C*+ykFqlJpLz1fYx1@_K>VlS>>YpKs>@Bzl3)t(hJwi^g@mqjk(W*f{PlyQ7@|Epc7p z_7Tvl{jzNcTRG-^#~Tuxk1axG4Jv3AOp= z6Hv3;_byzrJk0zL6z;nnkyV7RGDwae1fMpe2(KF(_lSp$gsmLmW0$#fGw>cZE~kqf1(T zd|d5o6nc#=8K=-R8pYg!71k@cm;!Q3+^R@4L>Hl!$AyTLUA?;A>>ago{C_S6E!?#= zRybBa^*Gs)EkfA&N0QT5l8-{1tEvLn5g8@`6^RP)hYJaDh$B(|U6w~;1)%&TM|4)< zHUQLr*HJ^{e-ffo`wR2093?3XfPs)aK^*XWHORR{JW*hS$l;113XP<8pFE_z?&T z3xm0N!Mwbjh#H)3o{sM3a85@z(7%lQ$Br!2&C=Dz+17tLkqaT2 literal 0 HcmV?d00001 diff --git a/docs/xm-and-surveys/core-features/styling-theme.mdx b/docs/xm-and-surveys/core-features/styling-theme.mdx index 3df460223f..77ef83e9ab 100644 --- a/docs/xm-and-surveys/core-features/styling-theme.mdx +++ b/docs/xm-and-surveys/core-features/styling-theme.mdx @@ -1,6 +1,6 @@ --- title: "Styling Theme" -description: "Keep the survey styling consistent over all surveys with a Styling Theme. Customize the colors, fonts, and other styling options to match your brand's aesthetic." +description: "Keep the survey styling consistent over all surveys with a Styling Theme. Customize colors, fonts, buttons, inputs, and more to match your brand." icon: "palette" --- @@ -10,48 +10,114 @@ icon: "palette" uploads](/self-hosting/configuration/file-uploads) before using these features. -Keep the survey styling consistent over all surveys with a Styling Theme. Customize the colors, fonts, and other styling options to match your brand's aesthetic. +Keep the survey styling consistent over all surveys with a Styling Theme. Customize colors, fonts, buttons, inputs, and other styling options to match your brand's aesthetic. ## Configuration In the left side bar, you find the `Configuration` page. On this page you find the `Look & Feel` section: -![Look & Feel](/images/xm-and-surveys/core-features/styling-theme/look-and-feel.webp) -/> +![Look & Feel](/images/xm-and-surveys/core-features/styling-theme/form-css-styling.webp) -## **Styling Options** +## Survey styling -1. **Form Styling:** Customize the survey card using the following settings +The Survey styling section gives you granular control over every text and input element in your survey. Expand the **Survey styling** panel to find collapsible sub-sections for Headlines & Descriptions, Inputs, Buttons, and Options. -![Form styling options UI](/images/xm-and-surveys/core-features/styling-theme/form-settings.webp) +### Headlines & Descriptions -- **Brand Color**: Sets the primary color tone of the survey. -- **Text Color**: This is a single color scheme that will be used across to display all the text on your survey. Ensures all text is readable against the background. -- **Input Color:** Alters the border color of input fields. -- **Input Border Color**: This is the color of the border of the form input field. +Fine-tune how question headlines, descriptions, and upper labels appear: -2. **Card Styling:** Adjust the look of the survey card +| Property | Description | +|---|---| +| **Headline Color** | Color of the question headline text | +| **Description Color** | Color of the question description text | +| **Headline Font Size** | Font size for headlines (in `px` or any CSS unit) | +| **Description Font Size** | Font size for descriptions | +| **Headline Font Weight** | Numeric font weight for headlines (e.g. `400`, `600`, `700`) | +| **Description Font Weight** | Numeric font weight for descriptions | +| **Upper Label Color** | Color of the small labels above input fields | +| **Upper Label Font Size** | Font size for upper labels | +| **Upper Label Font Weight** | Numeric font weight for upper labels | -![Card styling options UI](/images/xm-and-surveys/core-features/styling-theme/card-settings.webp) +### Inputs -- **Roundness**: Adjusts the corner roundness of the survey card and its components (including input boxes, buttons). -- **Card Background Color**: Sets the card's main background color. -- **Card Border Color**: Changes the border color of the card +Control the appearance of text inputs, textareas, and other form fields: -- **Hide Progress Bar**: Optionally remove the progress bar to simplify the survey experience -- **Add Highlight Border**: Adds a distinct border for emphasis. +| Property | Description | +|---|---| +| **Input Color** | Background color of input fields | +| **Input Border Color** | Border color of input fields | +| **Input Text Color** | Color of text typed into inputs | +| **Border Radius** | Corner roundness of input fields (in `px` or any CSS unit) | +| **Height** | Height of input fields | +| **Font Size** | Font size of text inside inputs | +| **Padding X** | Horizontal padding inside inputs | +| **Padding Y** | Vertical padding inside inputs | +| **Placeholder Opacity** | Opacity of placeholder text (`0` to `1`) | +| **Shadow** | CSS box-shadow value for inputs (e.g. `0 1px 2px rgba(0,0,0,0.1)`) | -3. **Background Styling**: Customize the survey background with static colors, animations, or images (upload your own or get from Unsplash) +### Buttons -This is only available for Link Surveys +Customize the submit and navigation buttons: -![Background styling options UI](/images/xm-and-surveys/core-features/styling-theme/background-settings.webp) +| Property | Description | +|---|---| +| **Button Background** | Background color of buttons | +| **Button Text** | Text color of buttons | +| **Border Radius** | Corner roundness of buttons | +| **Height** | Height of buttons | +| **Font Size** | Font size of button text | +| **Font Weight** | Numeric font weight for button text | +| **Padding X** | Horizontal padding inside buttons | +| **Padding Y** | Vertical padding inside buttons | -- **Color**: Pick any color for the background -- **Animation**: Add dynamic animations to enhance user experience.. -- **Upload**: Use a custom uploaded image for a personalized touch. Images must be 5 MB or less. -- Image: Choose from Unsplash's extensive gallery. Note that these images will have a link and mention of the author & Unsplash on the bottom right to give them the credit for their awesome work! -- **Background Overlay**: Adjust the background's opacity +### Options + +Style the select options in single-select, multi-select, and similar question types: + +| Property | Description | +|---|---| +| **Option Background** | Background color of option items | +| **Option Label Color** | Text color of option labels | +| **Border Radius** | Corner roundness of option items | +| **Padding X** | Horizontal padding inside options | +| **Padding Y** | Vertical padding inside options | +| **Font Size** | Font size of option text | + +## Card Styling + +Adjust the look of the survey card container: + +| Property | Description | +|---|---| +| **Roundness** | Corner roundness of the survey card (in `px` or any CSS unit) | +| **Card Background Color** | Background color of the survey card | +| **Card Border Color** | Border color of the survey card | +| **Add Highlight Border** | Adds a distinct colored border for emphasis (app surveys only) | +| **Card Arrangement** | Layout mode for stacking cards: **Simple**, **Straight**, or **Casual** | + +### Progress Bar + +When the progress bar is visible (toggle **Hide Progress Bar** to control it), you can customize: + +| Property | Description | +|---|---| +| **Track Background** | Background color of the progress track | +| **Indicator Background** | Fill color of the progress indicator | +| **Track Height** | Height of the progress bar track | + +## Background Styling + +Customize the survey background with static colors, animations, or images (upload your own or pick from Unsplash). + +Background styling is only available for Link Surveys. + +| Property | Description | +|---|---| +| **Color** | Pick any color for the background | +| **Animation** | Add dynamic animations to enhance user experience | +| **Upload** | Use a custom uploaded image (5 MB max) | +| **Image** | Choose from Unsplash's gallery (attribution shown automatically) | +| **Background Overlay** | Adjust the background's opacity / brightness | ## Add Brand Logo @@ -59,30 +125,44 @@ Customize your survey with your brand's logo. Brand logos are only visible on Link Survey pages. -1. In the Look & Feel page itself in Project settings, scroll down to see the Logo Upload box. + + + In the **Look & Feel** page in Project settings, scroll down to the **Logo Upload** box. -![Choose a link survey template](/images/xm-and-surveys/core-features/styling-theme/step-four.webp) + ![Logo upload box](/images/xm-and-surveys/core-features/styling-theme/step-four.webp) + -2. Upload your logo. Logos must be 5 MB or less. + + Upload your logo. Logos must be 5 MB or less. -![Choose a link survey template](/images/xm-and-surveys/core-features/styling-theme/step-five.webp) + ![Upload logo](/images/xm-and-surveys/core-features/styling-theme/step-five.webp) + -3. Add a background color: If you’ve uploaded a transparent image and want to add background to it, enable this toggle and select the color of your choice. + + If you've uploaded a transparent image and want to add a background to it, enable the toggle and select a color. -![Choose a link survey template](/images/xm-and-surveys/core-features/styling-theme/step-six.webp) + ![Logo background color](/images/xm-and-surveys/core-features/styling-theme/step-six.webp) + -4. Remember to save your changes! + + Remember to save your changes! -![Choose a link survey template](/images/xm-and-surveys/core-features/styling-theme/step-seven.webp) + ![Save changes](/images/xm-and-surveys/core-features/styling-theme/step-seven.webp) + + -The logo settings apply across all Link Surveys pages. +The logo settings apply across all Link Survey pages. ## Overwrite Styling Theme -You can allow to overwrite the styling theme for individual surveys to create unique styles for each survey: +You can allow overwriting the styling theme for individual surveys to create unique styles per survey: -![Choose a link survey template](/images/xm-and-surveys/core-features/styling-theme/allow-overwrite.webp) +![Allow overwrite toggle](/images/xm-and-surveys/core-features/styling-theme/allow-overwrite.webp) -In the survey editor, a tab called `Styling` will appear. Here you can overwrite the default styling theme. +In the survey editor, a **Styling** tab will appear where you can overwrite the default styling theme. See the [Custom Styling](/xm-and-surveys/surveys/general-features/overwrite-styling) guide for details. ---- +## CSS Variables Reference + +Under the hood, every styling property maps to a CSS variable prefixed with `--fb-`. For App & Website Surveys, you can override these directly in your global CSS file (e.g., `globals.css`) by targeting the `#fbjs` selector. + +See the full [CSS Variables Reference](/xm-and-surveys/surveys/general-features/overwrite-styling#overwrite-css-styles-for-app--website-surveys) in the Custom Styling guide. diff --git a/docs/xm-and-surveys/surveys/general-features/overwrite-styling.mdx b/docs/xm-and-surveys/surveys/general-features/overwrite-styling.mdx index 331766395c..f255e828bd 100644 --- a/docs/xm-and-surveys/surveys/general-features/overwrite-styling.mdx +++ b/docs/xm-and-surveys/surveys/general-features/overwrite-styling.mdx @@ -76,12 +76,4 @@ Windows XP Who's a Good Boy? "Things you've likely said to your dog." -![Dog-themed survey example](/images/xm-and-surveys/surveys/general-features/overwrite-styling/doggo.webp) - -### Fixes & Improvements: -- **Numbered list formatting**: Fixed numbering issues. -- **Consistent image alt text**: Updated descriptions for clarity. -- **CSS syntax correction**: Removed unnecessary text before code block. -- **Grammar & punctuation fixes**: Ensured clarity and smooth readability. - -This should now display correctly on Mintlify! Let me know if you need further tweaks. \ No newline at end of file +![Dog-themed survey example](/images/xm-and-surveys/surveys/general-features/overwrite-styling/doggo.webp) \ No newline at end of file From 7c3fa8b5eaf1af9b7a85eddea251cc0b361eebec Mon Sep 17 00:00:00 2001 From: Dhruwang Jariwala <67850763+Dhruwang@users.noreply.github.com> Date: Fri, 27 Feb 2026 23:54:15 +0530 Subject: [PATCH 03/22] fix: restore bullet points in survey preview and public survey (#7356) (#7360) Co-authored-by: Cursor --- packages/surveys/src/styles/global.css | 30 ++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/packages/surveys/src/styles/global.css b/packages/surveys/src/styles/global.css index eb24ef413d..985279f5ec 100644 --- a/packages/surveys/src/styles/global.css +++ b/packages/surveys/src/styles/global.css @@ -57,6 +57,36 @@ color: var(--fb-subheading-color) !important; } +/* + * Restore list styling for rich text (questions/descriptions). + * Preflight resets ul/ol with list-style:none; these overrides restore bullets/numbers. + */ +#fbjs .htmlbody ul, +#fbjs .htmlbody ol, +#fbjs [data-variant="headline"] ul, +#fbjs [data-variant="headline"] ol, +#fbjs [data-variant="description"] ul, +#fbjs [data-variant="description"] ol { + list-style-position: outside; + margin: 0.5em 0; + padding-left: 1.5em; +} +#fbjs .htmlbody ul, +#fbjs [data-variant="headline"] ul, +#fbjs [data-variant="description"] ul { + list-style-type: disc; +} +#fbjs .htmlbody ol, +#fbjs [data-variant="headline"] ol, +#fbjs [data-variant="description"] ol { + list-style-type: decimal; +} +#fbjs .htmlbody li, +#fbjs [data-variant="headline"] li, +#fbjs [data-variant="description"] li { + margin: 0.25em 0; +} + /* without this, it wont override the color */ #fbjs p.editor-paragraph { overflow-wrap: break-word; From 58d5de7d453d3be456b31048bd967b346ad8a62e Mon Sep 17 00:00:00 2001 From: Matti Nannt Date: Fri, 27 Feb 2026 22:18:38 +0100 Subject: [PATCH 04/22] fix: resolve Dependabot Next.js deserialization alert (#7393) --- packages/email/package.json | 2 +- pnpm-lock.yaml | 438 ++++++++++++++++++++++++------------ 2 files changed, 292 insertions(+), 148 deletions(-) diff --git a/packages/email/package.json b/packages/email/package.json index 44785b94de..7abb12e74f 100644 --- a/packages/email/package.json +++ b/packages/email/package.json @@ -20,7 +20,7 @@ "@formbricks/config-typescript": "workspace:*", "@formbricks/eslint-config": "workspace:*", "@formbricks/types": "workspace:*", - "@react-email/preview-server": "5.2.5", + "@react-email/preview-server": "5.2.8", "autoprefixer": "10.4.21", "clsx": "2.1.1", "postcss": "8.5.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 45552b0546..452451d841 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,7 +28,7 @@ importers: dependencies: next: specifier: 16.1.6 - version: 16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 16.1.6(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: specifier: 19.2.3 version: 19.2.3 @@ -294,7 +294,7 @@ importers: version: 1.2.6(@types/react-dom@19.2.1(@types/react@19.2.1))(@types/react@19.2.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@sentry/nextjs': specifier: 10.5.0 - version: 10.5.0(@opentelemetry/context-async-hooks@2.5.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.5.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.0(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(webpack@5.99.8(esbuild@0.25.12)) + version: 10.5.0(@opentelemetry/context-async-hooks@2.5.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.5.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.0(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@16.1.6(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(webpack@5.99.8(esbuild@0.25.12)) '@t3-oss/env-nextjs': specifier: 0.13.4 version: 0.13.4(arktype@2.1.29)(typescript@5.8.3)(zod@3.25.76) @@ -384,13 +384,13 @@ importers: version: 3.0.1 next: specifier: 16.1.6 - version: 16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 16.1.6(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) next-auth: specifier: 4.24.12 - version: 4.24.12(patch_hash=7ac5717a8d7d2049442182b5d83ab492d33fe774ff51ff5ea3884628b77df87b)(next@16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(nodemailer@7.0.11)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 4.24.12(patch_hash=7ac5717a8d7d2049442182b5d83ab492d33fe774ff51ff5ea3884628b77df87b)(next@16.1.6(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(nodemailer@7.0.11)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) next-safe-action: specifier: 7.10.8 - version: 7.10.8(next@16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@3.25.76) + version: 7.10.8(next@16.1.6(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@3.25.76) node-fetch: specifier: 3.3.2 version: 3.3.2 @@ -744,8 +744,8 @@ importers: specifier: workspace:* version: link:../types '@react-email/preview-server': - specifier: 5.2.5 - version: 5.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: 5.2.8 + version: 5.2.8(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) autoprefixer: specifier: 10.4.21 version: 10.4.21(postcss@8.5.3) @@ -1827,6 +1827,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.25.10': + resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.25.12': resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} @@ -1845,6 +1851,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.25.10': + resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.25.12': resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} engines: {node: '>=18'} @@ -1863,6 +1875,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.25.10': + resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.25.12': resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} engines: {node: '>=18'} @@ -1881,6 +1899,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.25.10': + resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.25.12': resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} engines: {node: '>=18'} @@ -1899,6 +1923,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.25.10': + resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.25.12': resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} engines: {node: '>=18'} @@ -1917,6 +1947,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.25.10': + resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.25.12': resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} engines: {node: '>=18'} @@ -1935,6 +1971,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.25.10': + resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.25.12': resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} engines: {node: '>=18'} @@ -1953,6 +1995,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.25.10': + resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.12': resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} engines: {node: '>=18'} @@ -1971,6 +2019,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.25.10': + resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.25.12': resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} engines: {node: '>=18'} @@ -1989,6 +2043,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.25.10': + resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.25.12': resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} engines: {node: '>=18'} @@ -2007,6 +2067,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.25.10': + resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.25.12': resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} engines: {node: '>=18'} @@ -2025,6 +2091,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.25.10': + resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.25.12': resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} engines: {node: '>=18'} @@ -2043,6 +2115,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.25.10': + resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.25.12': resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} engines: {node: '>=18'} @@ -2061,6 +2139,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.25.10': + resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.25.12': resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} engines: {node: '>=18'} @@ -2079,6 +2163,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.25.10': + resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.25.12': resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} engines: {node: '>=18'} @@ -2097,6 +2187,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.25.10': + resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.25.12': resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} engines: {node: '>=18'} @@ -2115,6 +2211,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.25.10': + resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.25.12': resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} engines: {node: '>=18'} @@ -2127,6 +2229,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/netbsd-arm64@0.25.10': + resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-arm64@0.25.12': resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} engines: {node: '>=18'} @@ -2145,6 +2253,12 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.25.10': + resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.12': resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} engines: {node: '>=18'} @@ -2163,6 +2277,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.25.10': + resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-arm64@0.25.12': resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} engines: {node: '>=18'} @@ -2181,6 +2301,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.25.10': + resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.12': resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} engines: {node: '>=18'} @@ -2193,6 +2319,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openharmony-arm64@0.25.10': + resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/openharmony-arm64@0.25.12': resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} engines: {node: '>=18'} @@ -2211,6 +2343,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.25.10': + resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.25.12': resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} engines: {node: '>=18'} @@ -2229,6 +2367,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.25.10': + resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.25.12': resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} engines: {node: '>=18'} @@ -2247,6 +2391,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.25.10': + resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.25.12': resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} engines: {node: '>=18'} @@ -2265,6 +2415,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.25.10': + resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.25.12': resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} engines: {node: '>=18'} @@ -2845,46 +3001,24 @@ packages: '@neoconfetti/react@1.0.0': resolution: {integrity: sha512-klcSooChXXOzIm+SE5IISIAn3bYzYfPjbX7D7HoqZL84oAfgREeSg5vSIaSFH+DaGzzvImTyWe1OyrJ67vik4A==} - '@next/env@16.0.10': - resolution: {integrity: sha512-8tuaQkyDVgeONQ1MeT9Mkk8pQmZapMKFh5B+OrFUlG3rVmYTXcXlBetBgTurKXGaIZvkoqRT9JL5K3phXcgang==} - '@next/env@16.1.6': resolution: {integrity: sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ==} '@next/eslint-plugin-next@15.3.2': resolution: {integrity: sha512-ijVRTXBgnHT33aWnDtmlG+LJD+5vhc9AKTJPquGG5NKXjpKNjc62woIhFtrAcWdBobt8kqjCoaJ0q6sDQoX7aQ==} - '@next/swc-darwin-arm64@16.0.10': - resolution: {integrity: sha512-4XgdKtdVsaflErz+B5XeG0T5PeXKDdruDf3CRpnhN+8UebNa5N2H58+3GDgpn/9GBurrQ1uWW768FfscwYkJRg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - '@next/swc-darwin-arm64@16.1.6': resolution: {integrity: sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@16.0.10': - resolution: {integrity: sha512-spbEObMvRKkQ3CkYVOME+ocPDFo5UqHb8EMTS78/0mQ+O1nqE8toHJVioZo4TvebATxgA8XMTHHrScPrn68OGw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - '@next/swc-darwin-x64@16.1.6': resolution: {integrity: sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@16.0.10': - resolution: {integrity: sha512-uQtWE3X0iGB8apTIskOMi2w/MKONrPOUCi5yLO+v3O8Mb5c7K4Q5KD1jvTpTF5gJKa3VH/ijKjKUq9O9UhwOYw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [glibc] - '@next/swc-linux-arm64-gnu@16.1.6': resolution: {integrity: sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==} engines: {node: '>= 10'} @@ -2892,13 +3026,6 @@ packages: os: [linux] libc: [glibc] - '@next/swc-linux-arm64-musl@16.0.10': - resolution: {integrity: sha512-llA+hiDTrYvyWI21Z0L1GiXwjQaanPVQQwru5peOgtooeJ8qx3tlqRV2P7uH2pKQaUfHxI/WVarvI5oYgGxaTw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [musl] - '@next/swc-linux-arm64-musl@16.1.6': resolution: {integrity: sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==} engines: {node: '>= 10'} @@ -2906,13 +3033,6 @@ packages: os: [linux] libc: [musl] - '@next/swc-linux-x64-gnu@16.0.10': - resolution: {integrity: sha512-AK2q5H0+a9nsXbeZ3FZdMtbtu9jxW4R/NgzZ6+lrTm3d6Zb7jYrWcgjcpM1k8uuqlSy4xIyPR2YiuUr+wXsavA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - '@next/swc-linux-x64-gnu@16.1.6': resolution: {integrity: sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==} engines: {node: '>= 10'} @@ -2920,13 +3040,6 @@ packages: os: [linux] libc: [glibc] - '@next/swc-linux-x64-musl@16.0.10': - resolution: {integrity: sha512-1TDG9PDKivNw5550S111gsO4RGennLVl9cipPhtkXIFVwo31YZ73nEbLjNC8qG3SgTz/QZyYyaFYMeY4BKZR/g==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - '@next/swc-linux-x64-musl@16.1.6': resolution: {integrity: sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==} engines: {node: '>= 10'} @@ -2934,24 +3047,12 @@ packages: os: [linux] libc: [musl] - '@next/swc-win32-arm64-msvc@16.0.10': - resolution: {integrity: sha512-aEZIS4Hh32xdJQbHz121pyuVZniSNoqDVx1yIr2hy+ZwJGipeqnMZBJHyMxv2tiuAXGx6/xpTcQJ6btIiBjgmg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - '@next/swc-win32-arm64-msvc@16.1.6': resolution: {integrity: sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@16.0.10': - resolution: {integrity: sha512-E+njfCoFLb01RAFEnGZn6ERoOqhK1Gl3Lfz1Kjnj0Ulfu7oJbuMyvBKNj/bw8XZnenHDASlygTjZICQW+rYW1Q==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - '@next/swc-win32-x64-msvc@16.1.6': resolution: {integrity: sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==} engines: {node: '>= 10'} @@ -4521,8 +4622,8 @@ packages: peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc - '@react-email/preview-server@5.2.5': - resolution: {integrity: sha512-YERhEKl0Dz2qNbHTzdSwnsK15gipEqonKMPEbsoE8C+ACiHIm/f/d1UzQVmhrsN6PW7L+JhAuzcdIX1H3pLmFg==} + '@react-email/preview-server@5.2.8': + resolution: {integrity: sha512-drQ0C7vi7P0uE7Ox1Cyiujsx0oqp2RbIscOdSBR5qvzw3EKjlGbW2pWjQ000cjxTq3Si7lqlRKhOIF8MzOnqHw==} '@react-email/preview@0.0.14': resolution: {integrity: sha512-aYK8q0IPkBXyMsbpMXgxazwHxYJxTrXrV95GFuu2HbEiIToMwSyUgb8HDFYwPqqfV03/jbwqlsXmFxsOd+VNaw==} @@ -7602,6 +7703,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.25.10: + resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} + engines: {node: '>=18'} + hasBin: true + esbuild@0.25.12: resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} engines: {node: '>=18'} @@ -9326,27 +9432,6 @@ packages: zod: optional: true - next@16.0.10: - resolution: {integrity: sha512-RtWh5PUgI+vxlV3HdR+IfWA1UUHu0+Ram/JBO4vWB54cVPentCD0e+lxyAYEsDTqGGMg7qpjhKh6dc6aW7W/sA==} - engines: {node: '>=20.9.0'} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.51.1 - babel-plugin-react-compiler: '*' - react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@playwright/test': - optional: true - babel-plugin-react-compiler: - optional: true - sass: - optional: true - next@16.1.6: resolution: {integrity: sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==} engines: {node: '>=20.9.0'} @@ -13575,6 +13660,9 @@ snapshots: '@esbuild/aix-ppc64@0.23.1': optional: true + '@esbuild/aix-ppc64@0.25.10': + optional: true + '@esbuild/aix-ppc64@0.25.12': optional: true @@ -13584,6 +13672,9 @@ snapshots: '@esbuild/android-arm64@0.23.1': optional: true + '@esbuild/android-arm64@0.25.10': + optional: true + '@esbuild/android-arm64@0.25.12': optional: true @@ -13593,6 +13684,9 @@ snapshots: '@esbuild/android-arm@0.23.1': optional: true + '@esbuild/android-arm@0.25.10': + optional: true + '@esbuild/android-arm@0.25.12': optional: true @@ -13602,6 +13696,9 @@ snapshots: '@esbuild/android-x64@0.23.1': optional: true + '@esbuild/android-x64@0.25.10': + optional: true + '@esbuild/android-x64@0.25.12': optional: true @@ -13611,6 +13708,9 @@ snapshots: '@esbuild/darwin-arm64@0.23.1': optional: true + '@esbuild/darwin-arm64@0.25.10': + optional: true + '@esbuild/darwin-arm64@0.25.12': optional: true @@ -13620,6 +13720,9 @@ snapshots: '@esbuild/darwin-x64@0.23.1': optional: true + '@esbuild/darwin-x64@0.25.10': + optional: true + '@esbuild/darwin-x64@0.25.12': optional: true @@ -13629,6 +13732,9 @@ snapshots: '@esbuild/freebsd-arm64@0.23.1': optional: true + '@esbuild/freebsd-arm64@0.25.10': + optional: true + '@esbuild/freebsd-arm64@0.25.12': optional: true @@ -13638,6 +13744,9 @@ snapshots: '@esbuild/freebsd-x64@0.23.1': optional: true + '@esbuild/freebsd-x64@0.25.10': + optional: true + '@esbuild/freebsd-x64@0.25.12': optional: true @@ -13647,6 +13756,9 @@ snapshots: '@esbuild/linux-arm64@0.23.1': optional: true + '@esbuild/linux-arm64@0.25.10': + optional: true + '@esbuild/linux-arm64@0.25.12': optional: true @@ -13656,6 +13768,9 @@ snapshots: '@esbuild/linux-arm@0.23.1': optional: true + '@esbuild/linux-arm@0.25.10': + optional: true + '@esbuild/linux-arm@0.25.12': optional: true @@ -13665,6 +13780,9 @@ snapshots: '@esbuild/linux-ia32@0.23.1': optional: true + '@esbuild/linux-ia32@0.25.10': + optional: true + '@esbuild/linux-ia32@0.25.12': optional: true @@ -13674,6 +13792,9 @@ snapshots: '@esbuild/linux-loong64@0.23.1': optional: true + '@esbuild/linux-loong64@0.25.10': + optional: true + '@esbuild/linux-loong64@0.25.12': optional: true @@ -13683,6 +13804,9 @@ snapshots: '@esbuild/linux-mips64el@0.23.1': optional: true + '@esbuild/linux-mips64el@0.25.10': + optional: true + '@esbuild/linux-mips64el@0.25.12': optional: true @@ -13692,6 +13816,9 @@ snapshots: '@esbuild/linux-ppc64@0.23.1': optional: true + '@esbuild/linux-ppc64@0.25.10': + optional: true + '@esbuild/linux-ppc64@0.25.12': optional: true @@ -13701,6 +13828,9 @@ snapshots: '@esbuild/linux-riscv64@0.23.1': optional: true + '@esbuild/linux-riscv64@0.25.10': + optional: true + '@esbuild/linux-riscv64@0.25.12': optional: true @@ -13710,6 +13840,9 @@ snapshots: '@esbuild/linux-s390x@0.23.1': optional: true + '@esbuild/linux-s390x@0.25.10': + optional: true + '@esbuild/linux-s390x@0.25.12': optional: true @@ -13719,12 +13852,18 @@ snapshots: '@esbuild/linux-x64@0.23.1': optional: true + '@esbuild/linux-x64@0.25.10': + optional: true + '@esbuild/linux-x64@0.25.12': optional: true '@esbuild/linux-x64@0.27.2': optional: true + '@esbuild/netbsd-arm64@0.25.10': + optional: true + '@esbuild/netbsd-arm64@0.25.12': optional: true @@ -13734,6 +13873,9 @@ snapshots: '@esbuild/netbsd-x64@0.23.1': optional: true + '@esbuild/netbsd-x64@0.25.10': + optional: true + '@esbuild/netbsd-x64@0.25.12': optional: true @@ -13743,6 +13885,9 @@ snapshots: '@esbuild/openbsd-arm64@0.23.1': optional: true + '@esbuild/openbsd-arm64@0.25.10': + optional: true + '@esbuild/openbsd-arm64@0.25.12': optional: true @@ -13752,12 +13897,18 @@ snapshots: '@esbuild/openbsd-x64@0.23.1': optional: true + '@esbuild/openbsd-x64@0.25.10': + optional: true + '@esbuild/openbsd-x64@0.25.12': optional: true '@esbuild/openbsd-x64@0.27.2': optional: true + '@esbuild/openharmony-arm64@0.25.10': + optional: true + '@esbuild/openharmony-arm64@0.25.12': optional: true @@ -13767,6 +13918,9 @@ snapshots: '@esbuild/sunos-x64@0.23.1': optional: true + '@esbuild/sunos-x64@0.25.10': + optional: true + '@esbuild/sunos-x64@0.25.12': optional: true @@ -13776,6 +13930,9 @@ snapshots: '@esbuild/win32-arm64@0.23.1': optional: true + '@esbuild/win32-arm64@0.25.10': + optional: true + '@esbuild/win32-arm64@0.25.12': optional: true @@ -13785,6 +13942,9 @@ snapshots: '@esbuild/win32-ia32@0.23.1': optional: true + '@esbuild/win32-ia32@0.25.10': + optional: true + '@esbuild/win32-ia32@0.25.12': optional: true @@ -13794,6 +13954,9 @@ snapshots: '@esbuild/win32-x64@0.23.1': optional: true + '@esbuild/win32-x64@0.25.10': + optional: true + '@esbuild/win32-x64@0.25.12': optional: true @@ -14441,59 +14604,33 @@ snapshots: '@neoconfetti/react@1.0.0': {} - '@next/env@16.0.10': {} - '@next/env@16.1.6': {} '@next/eslint-plugin-next@15.3.2': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@16.0.10': - optional: true - '@next/swc-darwin-arm64@16.1.6': optional: true - '@next/swc-darwin-x64@16.0.10': - optional: true - '@next/swc-darwin-x64@16.1.6': optional: true - '@next/swc-linux-arm64-gnu@16.0.10': - optional: true - '@next/swc-linux-arm64-gnu@16.1.6': optional: true - '@next/swc-linux-arm64-musl@16.0.10': - optional: true - '@next/swc-linux-arm64-musl@16.1.6': optional: true - '@next/swc-linux-x64-gnu@16.0.10': - optional: true - '@next/swc-linux-x64-gnu@16.1.6': optional: true - '@next/swc-linux-x64-musl@16.0.10': - optional: true - '@next/swc-linux-x64-musl@16.1.6': optional: true - '@next/swc-win32-arm64-msvc@16.0.10': - optional: true - '@next/swc-win32-arm64-msvc@16.1.6': optional: true - '@next/swc-win32-x64-msvc@16.0.10': - optional: true - '@next/swc-win32-x64-msvc@16.1.6': optional: true @@ -16719,9 +16856,10 @@ snapshots: marked: 15.0.12 react: 19.2.3 - '@react-email/preview-server@5.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@react-email/preview-server@5.2.8(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - next: 16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + esbuild: 0.25.10 + next: 16.1.6(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) transitivePeerDependencies: - '@babel/core' - '@opentelemetry/api' @@ -17049,7 +17187,7 @@ snapshots: '@sentry/core@10.5.0': {} - '@sentry/nextjs@10.5.0(@opentelemetry/context-async-hooks@2.5.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.5.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.0(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(webpack@5.99.8(esbuild@0.25.12))': + '@sentry/nextjs@10.5.0(@opentelemetry/context-async-hooks@2.5.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.5.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.0(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@16.1.6(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(webpack@5.99.8(esbuild@0.25.12))': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.38.0 @@ -17062,7 +17200,7 @@ snapshots: '@sentry/vercel-edge': 10.5.0 '@sentry/webpack-plugin': 4.6.1(encoding@0.1.13)(webpack@5.99.8(esbuild@0.25.12)) chalk: 3.0.0 - next: 16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + next: 16.1.6(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) resolve: 1.22.8 rollup: 4.54.0 stacktrace-parser: 0.1.11 @@ -20291,6 +20429,35 @@ snapshots: '@esbuild/win32-ia32': 0.23.1 '@esbuild/win32-x64': 0.23.1 + esbuild@0.25.10: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.10 + '@esbuild/android-arm': 0.25.10 + '@esbuild/android-arm64': 0.25.10 + '@esbuild/android-x64': 0.25.10 + '@esbuild/darwin-arm64': 0.25.10 + '@esbuild/darwin-x64': 0.25.10 + '@esbuild/freebsd-arm64': 0.25.10 + '@esbuild/freebsd-x64': 0.25.10 + '@esbuild/linux-arm': 0.25.10 + '@esbuild/linux-arm64': 0.25.10 + '@esbuild/linux-ia32': 0.25.10 + '@esbuild/linux-loong64': 0.25.10 + '@esbuild/linux-mips64el': 0.25.10 + '@esbuild/linux-ppc64': 0.25.10 + '@esbuild/linux-riscv64': 0.25.10 + '@esbuild/linux-s390x': 0.25.10 + '@esbuild/linux-x64': 0.25.10 + '@esbuild/netbsd-arm64': 0.25.10 + '@esbuild/netbsd-x64': 0.25.10 + '@esbuild/openbsd-arm64': 0.25.10 + '@esbuild/openbsd-x64': 0.25.10 + '@esbuild/openharmony-arm64': 0.25.10 + '@esbuild/sunos-x64': 0.25.10 + '@esbuild/win32-arm64': 0.25.10 + '@esbuild/win32-ia32': 0.25.10 + '@esbuild/win32-x64': 0.25.10 + esbuild@0.25.12: optionalDependencies: '@esbuild/aix-ppc64': 0.25.12 @@ -22186,13 +22353,13 @@ snapshots: neo-async@2.6.2: {} - next-auth@4.24.12(patch_hash=7ac5717a8d7d2049442182b5d83ab492d33fe774ff51ff5ea3884628b77df87b)(next@16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(nodemailer@7.0.11)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + next-auth@4.24.12(patch_hash=7ac5717a8d7d2049442182b5d83ab492d33fe774ff51ff5ea3884628b77df87b)(next@16.1.6(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(nodemailer@7.0.11)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: '@babel/runtime': 7.28.4 '@panva/hkdf': 1.2.1 cookie: 0.7.2 jose: 4.15.9 - next: 16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + next: 16.1.6(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) oauth: 0.9.15 openid-client: 5.7.1 preact: 10.28.2 @@ -22203,40 +22370,15 @@ snapshots: optionalDependencies: nodemailer: 7.0.11 - next-safe-action@7.10.8(next@16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@3.25.76): + next-safe-action@7.10.8(next@16.1.6(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@3.25.76): dependencies: - next: 16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + next: 16.1.6(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: 19.2.3 react-dom: 19.2.3(react@19.2.3) optionalDependencies: zod: 3.25.76 - next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): - dependencies: - '@next/env': 16.0.10 - '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001762 - postcss: 8.4.31 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - styled-jsx: 5.1.6(react@19.2.3) - optionalDependencies: - '@next/swc-darwin-arm64': 16.0.10 - '@next/swc-darwin-x64': 16.0.10 - '@next/swc-linux-arm64-gnu': 16.0.10 - '@next/swc-linux-arm64-musl': 16.0.10 - '@next/swc-linux-x64-gnu': 16.0.10 - '@next/swc-linux-x64-musl': 16.0.10 - '@next/swc-win32-arm64-msvc': 16.0.10 - '@next/swc-win32-x64-msvc': 16.0.10 - '@opentelemetry/api': 1.9.0 - '@playwright/test': 1.56.1 - sharp: 0.34.5 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - - next@16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + next@16.1.6(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: '@next/env': 16.1.6 '@swc/helpers': 0.5.15 @@ -22245,7 +22387,7 @@ snapshots: postcss: 8.4.31 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - styled-jsx: 5.1.6(react@19.2.3) + styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.2.3) optionalDependencies: '@next/swc-darwin-arm64': 16.1.6 '@next/swc-darwin-x64': 16.1.6 @@ -23991,10 +24133,12 @@ snapshots: stubborn-utils@1.0.2: {} - styled-jsx@5.1.6(react@19.2.3): + styled-jsx@5.1.6(@babel/core@7.28.5)(react@19.2.3): dependencies: client-only: 0.0.1 react: 19.2.3 + optionalDependencies: + '@babel/core': 7.28.5 stylis@4.3.6: {} From 6dd2e707fe0dda6747678239f3769854918c702f Mon Sep 17 00:00:00 2001 From: Johannes <72809645+jobenjada@users.noreply.github.com> Date: Sun, 1 Mar 2026 21:54:23 -0800 Subject: [PATCH 05/22] feat: display Formbricks version alongside organization ID in settings (#7363) --- .../settings/(organization)/general/page.tsx | 6 +++++- apps/web/modules/projects/settings/general/page.tsx | 6 +----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/web/app/(app)/environments/[environmentId]/settings/(organization)/general/page.tsx b/apps/web/app/(app)/environments/[environmentId]/settings/(organization)/general/page.tsx index 4c106cbeaa..c148687630 100644 --- a/apps/web/app/(app)/environments/[environmentId]/settings/(organization)/general/page.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/settings/(organization)/general/page.tsx @@ -9,6 +9,7 @@ import { Alert, AlertDescription } from "@/modules/ui/components/alert"; import { IdBadge } from "@/modules/ui/components/id-badge"; import { PageContentWrapper } from "@/modules/ui/components/page-content-wrapper"; import { PageHeader } from "@/modules/ui/components/page-header"; +import packageJson from "@/package.json"; import { SettingsCard } from "../../components/SettingsCard"; import { DeleteOrganization } from "./components/DeleteOrganization"; import { EditOrganizationNameForm } from "./components/EditOrganizationNameForm"; @@ -81,7 +82,10 @@ const Page = async (props: { params: Promise<{ environmentId: string }> }) => { )} - +

+ + +
); }; diff --git a/apps/web/modules/projects/settings/general/page.tsx b/apps/web/modules/projects/settings/general/page.tsx index 6a0fccf0eb..48fd5ad764 100644 --- a/apps/web/modules/projects/settings/general/page.tsx +++ b/apps/web/modules/projects/settings/general/page.tsx @@ -1,5 +1,5 @@ import { SettingsCard } from "@/app/(app)/environments/[environmentId]/settings/components/SettingsCard"; -import { IS_DEVELOPMENT, IS_FORMBRICKS_CLOUD } from "@/lib/constants"; +import { IS_FORMBRICKS_CLOUD } from "@/lib/constants"; import { getProjects } from "@/lib/project/service"; import { getTranslate } from "@/lingodotdev/server"; import { getEnvironmentAuth } from "@/modules/environments/lib/utils"; @@ -7,7 +7,6 @@ import { ProjectConfigNavigation } from "@/modules/projects/settings/components/ import { IdBadge } from "@/modules/ui/components/id-badge"; import { PageContentWrapper } from "@/modules/ui/components/page-content-wrapper"; import { PageHeader } from "@/modules/ui/components/page-header"; -import packageJson from "@/package.json"; import { CustomScriptsForm } from "./components/custom-scripts-form"; import { DeleteProject } from "./components/delete-project"; import { EditProjectNameForm } from "./components/edit-project-name-form"; @@ -59,9 +58,6 @@ export const GeneralSettingsPage = async (props: { params: Promise<{ environment
- {!IS_FORMBRICKS_CLOUD && !IS_DEVELOPMENT && ( - - )}
); From 7eb94f0bd5c06935d42d5fbaa478da90afa46b9d Mon Sep 17 00:00:00 2001 From: Dhruwang Jariwala <67850763+Dhruwang@users.noreply.github.com> Date: Mon, 2 Mar 2026 11:47:52 +0530 Subject: [PATCH 06/22] fix: theme styling preview, option border color, and enable custom styling behavior (#7387) Co-authored-by: Johannes --- .../settings/components/ProjectSettings.tsx | 24 ++-- apps/web/app/lib/templates.ts | 11 ++ apps/web/i18n.lock | 13 ++- apps/web/lib/styling/constants.ts | 8 +- apps/web/locales/de-DE.json | 11 +- apps/web/locales/en-US.json | 13 ++- apps/web/locales/es-ES.json | 13 ++- apps/web/locales/fr-FR.json | 11 +- apps/web/locales/hu-HU.json | 11 +- apps/web/locales/ja-JP.json | 11 +- apps/web/locales/nl-NL.json | 11 +- apps/web/locales/pt-BR.json | 11 +- apps/web/locales/pt-PT.json | 11 +- apps/web/locales/ro-RO.json | 9 +- apps/web/locales/ru-RU.json | 11 +- apps/web/locales/sv-SE.json | 11 +- apps/web/locales/zh-Hans-CN.json | 11 +- apps/web/locales/zh-Hant-TW.json | 11 +- .../look/components/theme-styling.tsx | 8 +- .../components/form-styling-settings.tsx | 20 ++++ .../survey/editor/components/styling-view.tsx | 4 +- .../card-styling-settings/index.tsx | 109 +++++++++--------- .../components/popover-picker.tsx | 50 ++++---- .../ui/components/color-picker/index.tsx | 22 ++-- .../components/dimension-input.tsx | 3 +- .../components/number-field.tsx | 3 + .../theme-styling-preview-survey/index.tsx | 3 +- apps/web/playwright/survey-styling.spec.ts | 2 + packages/survey-ui/tailwind.config.ts | 3 +- packages/surveys/src/lib/styles.test.ts | 2 + packages/surveys/src/lib/styles.ts | 4 + packages/types/styling.ts | 1 + 32 files changed, 295 insertions(+), 151 deletions(-) diff --git a/apps/web/app/(app)/(onboarding)/organizations/[organizationId]/workspaces/new/settings/components/ProjectSettings.tsx b/apps/web/app/(app)/(onboarding)/organizations/[organizationId]/workspaces/new/settings/components/ProjectSettings.tsx index ac94995ece..97ab963af7 100644 --- a/apps/web/app/(app)/(onboarding)/organizations/[organizationId]/workspaces/new/settings/components/ProjectSettings.tsx +++ b/apps/web/app/(app)/(onboarding)/organizations/[organizationId]/workspaces/new/settings/components/ProjectSettings.tsx @@ -228,7 +228,7 @@ export const ProjectSettings = ({
-
+
{logoUrl && ( )}

{t("common.preview")}

-
- file.name} - autoFocus={false} - /> -
+ file.name} + autoFocus={false} + />
{ }), isDraft: true, }, + { + ...buildOpenTextElement({ + id: "preview-open-text-01", + headline: t("templates.preview_survey_question_open_text_headline"), + subheader: t("templates.preview_survey_question_open_text_subheader"), + placeholder: t("templates.preview_survey_question_open_text_placeholder"), + inputType: "text", + required: false, + }), + isDraft: true, + }, ], buttonLabel: createI18nString(t("templates.next"), []), backButtonLabel: createI18nString(t("templates.preview_survey_question_2_back_button_label"), []), diff --git a/apps/web/i18n.lock b/apps/web/i18n.lock index af7d6c2dff..73712381d9 100644 --- a/apps/web/i18n.lock +++ b/apps/web/i18n.lock @@ -258,6 +258,7 @@ checksums: common/move_down: 4f4de55743043355ad4a839aff2c48ff common/move_up: 69f25b205c677abdb26cbb69d97cd10b common/multiple_languages: 7d8ddd4b40d32fcd7bd6f7bac6485b1f + common/my_product: ad022177062f9ef6e9acf33b13e889aa common/name: 9368b5a047572b6051f334af5aa76819 common/new: 126d036fae5fb6b629728ecb97e6195b common/new_version_available: 399ddfc4232712e18ddab2587356b3dc @@ -1175,6 +1176,7 @@ checksums: environments/surveys/edit/add_fallback_placeholder: 0e77ea487ddd7bc7fc2f1574b018dc08 environments/surveys/edit/add_hidden_field_id: a8f55b51b790cf5f4d898af7770ad1ed environments/surveys/edit/add_highlight_border: 66f52b21fbb9aa6561c98a090abaaf8f + environments/surveys/edit/add_highlight_border_description: fe548fe03ea10ef5cd9e553d6812b3c2 environments/surveys/edit/add_logic: f234c9f1393a9ed4792dfbd15838c951 environments/surveys/edit/add_none_of_the_above: dbe1ada4512d6c3f80c54c8fac107ec6 environments/surveys/edit/add_option: 143c54f0b201067fe5159284d6daeca2 @@ -1543,7 +1545,7 @@ checksums: environments/surveys/edit/response_limits_redirections_and_more: e4f1cf94e56ad0e1b08701158d688802 environments/surveys/edit/response_options: 2988136d5248d7726583108992dcbaee environments/surveys/edit/roundness: 5a161c8f5f258defb57ed1d551737cc4 - environments/surveys/edit/roundness_description: bde131aa5674836416dcdf2ff517d899 + environments/surveys/edit/roundness_description: 03940a6871ae43efa4810cba7cadb74b environments/surveys/edit/row_used_in_logic_error: f89453ff1b6db77ad84af840fedd9813 environments/surveys/edit/rows: 8f41f34e6ca28221cf1ebd948af4c151 environments/surveys/edit/save_and_close: 6ede705b3f82f30269ff3054a5049e34 @@ -2043,7 +2045,7 @@ checksums: environments/workspace/look/advanced_styling_field_description_size: a0d51c3ab7dc56320ecedc2b27917842 environments/workspace/look/advanced_styling_field_description_size_description: ff880ea1beddd1b1ec7416d0b8a69cf3 environments/workspace/look/advanced_styling_field_description_weight: 514680cc7202ad29835c1cbcde3def1c - environments/workspace/look/advanced_styling_field_description_weight_description: 441ac8db1a32557813eb68fbfd759061 + environments/workspace/look/advanced_styling_field_description_weight_description: aa95bc81b5336a548e256bce49350683 environments/workspace/look/advanced_styling_field_font_size: ca44d14429b2175a1b194793b4ab8f6b environments/workspace/look/advanced_styling_field_font_weight: bfef83778146cf40550df9650d8a07da environments/workspace/look/advanced_styling_field_headline_color: 4ccf3935ad90c88ad4add24f498673ce @@ -2057,7 +2059,7 @@ checksums: environments/workspace/look/advanced_styling_field_indicator_bg_description: 7eb3b54a8b331354ec95c0dc1545c620 environments/workspace/look/advanced_styling_field_input_border_radius_description: 0007f1bb572b35d9a3720daeb7a55617 environments/workspace/look/advanced_styling_field_input_font_size_description: 5311f95dcbd083623e35c98ea5374c3b - environments/workspace/look/advanced_styling_field_input_height_description: e19ec0dc432478def0fd1199ad765e38 + environments/workspace/look/advanced_styling_field_input_height_description: bb7439d42ec3848a8fa9edb8b001b69a environments/workspace/look/advanced_styling_field_input_padding_x_description: 10e14296468321c13fda77fd1ba58dfd environments/workspace/look/advanced_styling_field_input_padding_y_description: 98b4aeff2940516d05ea61bdc1211d0d environments/workspace/look/advanced_styling_field_input_placeholder_opacity_description: f55a6700884d24014404e58876121ddf @@ -2066,6 +2068,8 @@ checksums: environments/workspace/look/advanced_styling_field_input_text_description: 460450df24ea0cc902710118a5000feb environments/workspace/look/advanced_styling_field_option_bg: 0ceaed10d99ed4ad83cb0934ab970174 environments/workspace/look/advanced_styling_field_option_bg_description: 6cd6ccecbbb9f2f19439d7c682eb67c1 + environments/workspace/look/advanced_styling_field_option_border: aa478eb148515b6a2637fb144ff72028 + environments/workspace/look/advanced_styling_field_option_border_description: 8f75b740e8dcb7f6cfeff2e5d5ca7c92 environments/workspace/look/advanced_styling_field_option_border_radius_description: 23f81c25b2681a7c9e2c4f2e7d2e0656 environments/workspace/look/advanced_styling_field_option_font_size_description: 5430fd9b08819972f0a613bf3fa659da environments/workspace/look/advanced_styling_field_option_label: 2767a5db32742073a01aac16488e93dc @@ -2847,6 +2851,9 @@ checksums: templates/preview_survey_question_2_choice_2_label: 1af148222f327f28cf0db6513de5989e templates/preview_survey_question_2_headline: 5cfb173d156555227fbc2c97ad921e72 templates/preview_survey_question_2_subheader: 2e652d8acd68d072e5a0ae686c4011c0 + templates/preview_survey_question_open_text_headline: a9509a47e0456ae98ec3ddac3d6fad2c + templates/preview_survey_question_open_text_placeholder: 37ee9c84f3777b9220d4faec1e1c78ee + templates/preview_survey_question_open_text_subheader: 3c7bf09f3f17b02bc2fbbbdb347a5830 templates/preview_survey_welcome_card_headline: 8778dc41547a2778d0f9482da989fc00 templates/prioritize_features_description: 1eae41fad0e3947f803d8539081e59ec templates/prioritize_features_name: 4ca59ff1f9c319aaa68c3106d820fd6a diff --git a/apps/web/lib/styling/constants.ts b/apps/web/lib/styling/constants.ts index ca3f2769bc..1ac8c1b495 100644 --- a/apps/web/lib/styling/constants.ts +++ b/apps/web/lib/styling/constants.ts @@ -60,6 +60,7 @@ export const getSuggestedColors = (brandColor: string = DEFAULT_BRAND_COLOR) => // Options (Radio / Checkbox) "optionBgColor.light": inputBg, "optionLabelColor.light": questionColor, + "optionBorderColor.light": inputBorder, // Card "cardBackgroundColor.light": cardBg, @@ -138,6 +139,7 @@ export const STYLE_DEFAULTS: TProjectStyling = { // Options optionBgColor: { light: _colors["optionBgColor.light"] }, optionLabelColor: { light: _colors["optionLabelColor.light"] }, + optionBorderColor: { light: _colors["optionBorderColor.light"] }, optionBorderRadius: 8, optionPaddingX: 16, optionPaddingY: 16, @@ -169,6 +171,7 @@ export const deriveNewFieldsFromLegacy = (saved: Record): Recor const q = light("questionColor"); const b = light("brandColor"); const i = light("inputColor"); + const inputBorder = light("inputBorderColor"); return { ...(q && !saved.elementHeadlineColor && { elementHeadlineColor: { light: q } }), @@ -179,9 +182,9 @@ export const deriveNewFieldsFromLegacy = (saved: Record): Recor ...(b && !saved.buttonBgColor && { buttonBgColor: { light: b } }), ...(b && !saved.buttonTextColor && { buttonTextColor: { light: isLight(b) ? "#0f172a" : "#ffffff" } }), ...(i && !saved.optionBgColor && { optionBgColor: { light: i } }), + ...(inputBorder && !saved.optionBorderColor && { optionBorderColor: { light: inputBorder } }), ...(b && !saved.progressIndicatorBgColor && { progressIndicatorBgColor: { light: b } }), - ...(b && - !saved.progressTrackBgColor && { progressTrackBgColor: { light: mixColor(b, "#ffffff", 0.8) } }), + ...(b && !saved.progressTrackBgColor && { progressTrackBgColor: { light: mixColor(b, "#ffffff", 0.8) } }), }; }; @@ -211,6 +214,7 @@ export const buildStylingFromBrandColor = (brandColor: string = DEFAULT_BRAND_CO inputTextColor: { light: colors["inputTextColor.light"] }, optionBgColor: { light: colors["optionBgColor.light"] }, optionLabelColor: { light: colors["optionLabelColor.light"] }, + optionBorderColor: { light: colors["optionBorderColor.light"] }, cardBackgroundColor: { light: colors["cardBackgroundColor.light"] }, cardBorderColor: { light: colors["cardBorderColor.light"] }, highlightBorderColor: { light: colors["highlightBorderColor.light"] }, diff --git a/apps/web/locales/de-DE.json b/apps/web/locales/de-DE.json index 4323bb39be..cef21c1eb1 100644 --- a/apps/web/locales/de-DE.json +++ b/apps/web/locales/de-DE.json @@ -285,6 +285,7 @@ "move_down": "Nach unten bewegen", "move_up": "Nach oben bewegen", "multiple_languages": "Mehrsprachigkeit", + "my_product": "mein Produkt", "name": "Name", "new": "Neu", "new_version_available": "Formbricks {version} ist da. Jetzt aktualisieren!", @@ -1246,6 +1247,7 @@ "add_fallback_placeholder": "Platzhalter hinzufügen, falls kein Wert zur Verfügung steht.", "add_hidden_field_id": "Verstecktes Feld ID hinzufügen", "add_highlight_border": "Rahmen hinzufügen", + "add_highlight_border_description": "Gilt nur für In-Product-Umfragen.", "add_logic": "Logik hinzufügen", "add_none_of_the_above": "Füge \"Keine der oben genannten Optionen\" hinzu", "add_option": "Option hinzufügen", @@ -1616,7 +1618,7 @@ "response_limits_redirections_and_more": "Antwort Limits, Weiterleitungen und mehr.", "response_options": "Antwortoptionen", "roundness": "Rundheit", - "roundness_description": "Steuert, wie abgerundet die Kartenecken sind.", + "roundness_description": "Steuert, wie abgerundet die Ecken sind.", "row_used_in_logic_error": "Diese Zeile wird in der Logik der Frage {questionIndex} verwendet. Bitte entferne sie zuerst aus der Logik.", "rows": "Zeilen", "save_and_close": "Speichern & Schließen", @@ -2174,7 +2176,7 @@ "advanced_styling_field_indicator_bg_description": "Färbt den gefüllten Teil des Balkens.", "advanced_styling_field_input_border_radius_description": "Rundet die Eingabeecken ab.", "advanced_styling_field_input_font_size_description": "Skaliert den eingegebenen Text in Eingabefeldern.", - "advanced_styling_field_input_height_description": "Legt die Mindesthöhe des Eingabefelds fest.", + "advanced_styling_field_input_height_description": "Steuert die Mindesthöhe der Eingabe.", "advanced_styling_field_input_padding_x_description": "Fügt links und rechts Abstand hinzu.", "advanced_styling_field_input_padding_y_description": "Fügt oben und unten Abstand hinzu.", "advanced_styling_field_input_placeholder_opacity_description": "Blendet den Platzhaltertext aus.", @@ -2183,6 +2185,8 @@ "advanced_styling_field_input_text_description": "Färbt den eingegebenen Text in Eingabefeldern.", "advanced_styling_field_option_bg": "Hintergrund", "advanced_styling_field_option_bg_description": "Füllt die Optionselemente.", + "advanced_styling_field_option_border": "Rahmenfarbe", + "advanced_styling_field_option_border_description": "Umrandet Radio- und Checkbox-Optionen.", "advanced_styling_field_option_border_radius_description": "Rundet die Ecken der Optionen ab.", "advanced_styling_field_option_font_size_description": "Skaliert den Text der Optionsbeschriftung.", "advanced_styling_field_option_label": "Label-Farbe", @@ -3002,6 +3006,9 @@ "preview_survey_question_2_choice_2_label": "Nein, danke!", "preview_survey_question_2_headline": "Möchtest Du auf dem Laufenden bleiben?", "preview_survey_question_2_subheader": "Dies ist eine Beispielbeschreibung.", + "preview_survey_question_open_text_headline": "Möchtest Du noch etwas teilen?", + "preview_survey_question_open_text_placeholder": "Tippe deine Antwort hier...", + "preview_survey_question_open_text_subheader": "Dein Feedback hilft uns, besser zu werden.", "preview_survey_welcome_card_headline": "Willkommen!", "prioritize_features_description": "Identifiziere die Funktionen, die deine Nutzer am meisten und am wenigsten brauchen.", "prioritize_features_name": "Funktionen priorisieren", diff --git a/apps/web/locales/en-US.json b/apps/web/locales/en-US.json index 6baef7bf48..98771a0cd6 100644 --- a/apps/web/locales/en-US.json +++ b/apps/web/locales/en-US.json @@ -285,6 +285,7 @@ "move_down": "Move down", "move_up": "Move up", "multiple_languages": "Multiple languages", + "my_product": "my Product", "name": "Name", "new": "New", "new_version_available": "Formbricks {version} is here. Upgrade now!", @@ -1246,6 +1247,7 @@ "add_fallback_placeholder": "Add a placeholder to show if there is no value to recall.", "add_hidden_field_id": "Add hidden field ID", "add_highlight_border": "Add highlight border", + "add_highlight_border_description": "Only applies to in-product surveys.", "add_logic": "Add logic", "add_none_of_the_above": "Add “None of the Above”", "add_option": "Add option", @@ -1616,7 +1618,7 @@ "response_limits_redirections_and_more": "Response limits, redirections and more.", "response_options": "Response Options", "roundness": "Roundness", - "roundness_description": "Controls how rounded the card corners are.", + "roundness_description": "Controls how rounded corners are.", "row_used_in_logic_error": "This row is used in logic of question {questionIndex}. Please remove it from logic first.", "rows": "Rows", "save_and_close": "Save & Close", @@ -2160,7 +2162,7 @@ "advanced_styling_field_description_size": "Description Font Size", "advanced_styling_field_description_size_description": "Scales the description text.", "advanced_styling_field_description_weight": "Description Font Weight", - "advanced_styling_field_description_weight_description": "Makes description text lighter or bolder.", + "advanced_styling_field_description_weight_description": "Makes descr. text lighter or bolder.", "advanced_styling_field_font_size": "Font Size", "advanced_styling_field_font_weight": "Font Weight", "advanced_styling_field_headline_color": "Headline Color", @@ -2174,7 +2176,7 @@ "advanced_styling_field_indicator_bg_description": "Colors the filled portion of the bar.", "advanced_styling_field_input_border_radius_description": "Rounds the input corners.", "advanced_styling_field_input_font_size_description": "Scales the typed text in inputs.", - "advanced_styling_field_input_height_description": "Controls the minimum height of the input field.", + "advanced_styling_field_input_height_description": "Controls the min. height of the input.", "advanced_styling_field_input_padding_x_description": "Adds space on the left and right.", "advanced_styling_field_input_padding_y_description": "Adds space on the top and bottom.", "advanced_styling_field_input_placeholder_opacity_description": "Fades the placeholder hint text.", @@ -2183,6 +2185,8 @@ "advanced_styling_field_input_text_description": "Colors the typed text in inputs.", "advanced_styling_field_option_bg": "Background", "advanced_styling_field_option_bg_description": "Fills the option items.", + "advanced_styling_field_option_border": "Border Color", + "advanced_styling_field_option_border_description": "Outlines radio and checkbox options.", "advanced_styling_field_option_border_radius_description": "Rounds the option corners.", "advanced_styling_field_option_font_size_description": "Scales the option label text.", "advanced_styling_field_option_label": "Label Color", @@ -3002,6 +3006,9 @@ "preview_survey_question_2_choice_2_label": "No, thank you!", "preview_survey_question_2_headline": "Want to stay in the loop?", "preview_survey_question_2_subheader": "This is an example description.", + "preview_survey_question_open_text_headline": "Anything else you'd like to share?", + "preview_survey_question_open_text_placeholder": "Type your answer here…", + "preview_survey_question_open_text_subheader": "Your feedback helps us improve.", "preview_survey_welcome_card_headline": "Welcome!", "prioritize_features_description": "Identify features your users need most and least.", "prioritize_features_name": "Prioritize Features", diff --git a/apps/web/locales/es-ES.json b/apps/web/locales/es-ES.json index 586a54d65b..c15038fd7c 100644 --- a/apps/web/locales/es-ES.json +++ b/apps/web/locales/es-ES.json @@ -285,6 +285,7 @@ "move_down": "Mover hacia abajo", "move_up": "Mover hacia arriba", "multiple_languages": "Múltiples idiomas", + "my_product": "mi producto", "name": "Nombre", "new": "Nuevo", "new_version_available": "Formbricks {version} está aquí. ¡Actualiza ahora!", @@ -1246,6 +1247,7 @@ "add_fallback_placeholder": "Añadir un marcador de posición para mostrar si no hay valor que recuperar.", "add_hidden_field_id": "Añadir ID de campo oculto", "add_highlight_border": "Añadir borde destacado", + "add_highlight_border_description": "Solo se aplica a encuestas dentro del producto.", "add_logic": "Añadir lógica", "add_none_of_the_above": "Añadir \"Ninguna de las anteriores\"", "add_option": "Añadir opción", @@ -1616,7 +1618,7 @@ "response_limits_redirections_and_more": "Límites de respuestas, redirecciones y más.", "response_options": "Opciones de respuesta", "roundness": "Redondez", - "roundness_description": "Controla qué tan redondeadas están las esquinas de la tarjeta.", + "roundness_description": "Controla qué tan redondeadas están las esquinas.", "row_used_in_logic_error": "Esta fila se utiliza en la lógica de la pregunta {questionIndex}. Por favor, elimínala de la lógica primero.", "rows": "Filas", "save_and_close": "Guardar y cerrar", @@ -2160,7 +2162,7 @@ "advanced_styling_field_description_size": "Tamaño de fuente de la descripción", "advanced_styling_field_description_size_description": "Escala el texto de la descripción.", "advanced_styling_field_description_weight": "Grosor de fuente de la descripción", - "advanced_styling_field_description_weight_description": "Hace el texto de la descripción más ligero o más grueso.", + "advanced_styling_field_description_weight_description": "Hace el texto de descripción más ligero o más grueso.", "advanced_styling_field_font_size": "Tamaño de fuente", "advanced_styling_field_font_weight": "Grosor de fuente", "advanced_styling_field_headline_color": "Color del titular", @@ -2174,7 +2176,7 @@ "advanced_styling_field_indicator_bg_description": "Colorea la porción rellena de la barra.", "advanced_styling_field_input_border_radius_description": "Redondea las esquinas del campo.", "advanced_styling_field_input_font_size_description": "Escala el texto escrito en los campos.", - "advanced_styling_field_input_height_description": "Controla la altura mínima del campo de entrada.", + "advanced_styling_field_input_height_description": "Controla la altura mínima de la entrada.", "advanced_styling_field_input_padding_x_description": "Añade espacio a la izquierda y a la derecha.", "advanced_styling_field_input_padding_y_description": "Añade espacio en la parte superior e inferior.", "advanced_styling_field_input_placeholder_opacity_description": "Atenúa el texto de sugerencia del marcador de posición.", @@ -2183,6 +2185,8 @@ "advanced_styling_field_input_text_description": "Colorea el texto escrito en los campos de entrada.", "advanced_styling_field_option_bg": "Fondo", "advanced_styling_field_option_bg_description": "Rellena los elementos de opción.", + "advanced_styling_field_option_border": "Color del borde", + "advanced_styling_field_option_border_description": "Delimita las opciones de radio y casillas de verificación.", "advanced_styling_field_option_border_radius_description": "Redondea las esquinas de las opciones.", "advanced_styling_field_option_font_size_description": "Escala el texto de la etiqueta de opción.", "advanced_styling_field_option_label": "Color de la etiqueta", @@ -3002,6 +3006,9 @@ "preview_survey_question_2_choice_2_label": "¡No, gracias!", "preview_survey_question_2_headline": "¿Quieres estar al tanto?", "preview_survey_question_2_subheader": "Esta es una descripción de ejemplo.", + "preview_survey_question_open_text_headline": "¿Hay algo más que te gustaría compartir?", + "preview_survey_question_open_text_placeholder": "Escribe tu respuesta aquí...", + "preview_survey_question_open_text_subheader": "Tus comentarios nos ayudan a mejorar.", "preview_survey_welcome_card_headline": "¡Bienvenido!", "prioritize_features_description": "Identifica las funciones que tus usuarios necesitan más y menos.", "prioritize_features_name": "Priorizar funciones", diff --git a/apps/web/locales/fr-FR.json b/apps/web/locales/fr-FR.json index 53d2923400..d1b65f1d83 100644 --- a/apps/web/locales/fr-FR.json +++ b/apps/web/locales/fr-FR.json @@ -285,6 +285,7 @@ "move_down": "Déplacer vers le bas", "move_up": "Déplacer vers le haut", "multiple_languages": "Plusieurs langues", + "my_product": "mon produit", "name": "Nom", "new": "Nouveau", "new_version_available": "Formbricks {version} est là. Mettez à jour maintenant !", @@ -1246,6 +1247,7 @@ "add_fallback_placeholder": "Ajouter un espace réservé à afficher s'il n'y a pas de valeur à rappeler.", "add_hidden_field_id": "Ajouter un champ caché ID", "add_highlight_border": "Ajouter une bordure de surlignage", + "add_highlight_border_description": "S'applique uniquement aux sondages intégrés au produit.", "add_logic": "Ajouter de la logique", "add_none_of_the_above": "Ajouter \"Aucun des éléments ci-dessus\"", "add_option": "Ajouter une option", @@ -1616,7 +1618,7 @@ "response_limits_redirections_and_more": "Limites de réponse, redirections et plus.", "response_options": "Options de réponse", "roundness": "Rondeur", - "roundness_description": "Contrôle l'arrondi des coins de la carte.", + "roundness_description": "Contrôle l'arrondi des coins.", "row_used_in_logic_error": "Cette ligne est utilisée dans la logique de la question {questionIndex}. Veuillez d'abord la supprimer de la logique.", "rows": "Lignes", "save_and_close": "Enregistrer et fermer", @@ -2174,7 +2176,7 @@ "advanced_styling_field_indicator_bg_description": "Colore la partie remplie de la barre.", "advanced_styling_field_input_border_radius_description": "Arrondit les coins du champ de saisie.", "advanced_styling_field_input_font_size_description": "Ajuste la taille du texte saisi dans les champs.", - "advanced_styling_field_input_height_description": "Contrôle la hauteur minimale du champ de saisie.", + "advanced_styling_field_input_height_description": "Contrôle la hauteur min. du champ de saisie.", "advanced_styling_field_input_padding_x_description": "Ajoute de l'espace à gauche et à droite.", "advanced_styling_field_input_padding_y_description": "Ajoute de l'espace en haut et en bas.", "advanced_styling_field_input_placeholder_opacity_description": "Atténue le texte d'indication du placeholder.", @@ -2183,6 +2185,8 @@ "advanced_styling_field_input_text_description": "Colore le texte saisi dans les champs.", "advanced_styling_field_option_bg": "Arrière-plan", "advanced_styling_field_option_bg_description": "Remplit les éléments d'option.", + "advanced_styling_field_option_border": "Couleur de bordure", + "advanced_styling_field_option_border_description": "Contours des options de boutons radio et de cases à cocher.", "advanced_styling_field_option_border_radius_description": "Arrondit les coins des options.", "advanced_styling_field_option_font_size_description": "Ajuste la taille du texte des libellés d'option.", "advanced_styling_field_option_label": "Couleur de l'étiquette", @@ -3002,6 +3006,9 @@ "preview_survey_question_2_choice_2_label": "Non, merci !", "preview_survey_question_2_headline": "Souhaitez-vous être informé ?", "preview_survey_question_2_subheader": "Ceci est un exemple de description.", + "preview_survey_question_open_text_headline": "Autre chose que vous aimeriez partager ?", + "preview_survey_question_open_text_placeholder": "Entrez votre réponse ici...", + "preview_survey_question_open_text_subheader": "Vos commentaires nous aident à nous améliorer.", "preview_survey_welcome_card_headline": "Bienvenue !", "prioritize_features_description": "Identifiez les fonctionnalités dont vos utilisateurs ont le plus et le moins besoin.", "prioritize_features_name": "Prioriser les fonctionnalités", diff --git a/apps/web/locales/hu-HU.json b/apps/web/locales/hu-HU.json index b50a19f970..c65fb327af 100644 --- a/apps/web/locales/hu-HU.json +++ b/apps/web/locales/hu-HU.json @@ -285,6 +285,7 @@ "move_down": "Mozgatás le", "move_up": "Mozgatás fel", "multiple_languages": "Több nyelv", + "my_product": "saját termék", "name": "Név", "new": "Új", "new_version_available": "A Formbricks {version} megérkezett. Frissítsen most!", @@ -1246,6 +1247,7 @@ "add_fallback_placeholder": "Helykitöltő hozzáadása annak megjelenítéshez, hogy nincs visszahívandó érték.", "add_hidden_field_id": "Rejtett mezőazonosító hozzáadása", "add_highlight_border": "Kiemelési szegély hozzáadása", + "add_highlight_border_description": "Csak a terméken belüli felmérésekre vonatkozik.", "add_logic": "Logika hozzáadása", "add_none_of_the_above": "„A fentiek közül egyik sem” hozzáadása", "add_option": "Lehetőség hozzáadása", @@ -1616,7 +1618,7 @@ "response_limits_redirections_and_more": "Válaszkorlátok, átirányítások és egyebek.", "response_options": "Válasz beállításai", "roundness": "Kerekesség", - "roundness_description": "Annak vezérlése, hogy a kártya sarkai mennyire legyenek lekerekítve.", + "roundness_description": "Szabályozza a sarkok lekerekítését.", "row_used_in_logic_error": "Ez a sor használatban van a(z) {questionIndex}. kérdés logikájában. Először távolítsa el a logikából.", "rows": "Sorok", "save_and_close": "Mentés és bezárás", @@ -2174,7 +2176,7 @@ "advanced_styling_field_indicator_bg_description": "Kiszínezi a sáv kitöltött részét.", "advanced_styling_field_input_border_radius_description": "Lekerekíti a beviteli mező sarkait.", "advanced_styling_field_input_font_size_description": "Átméretezi a beviteli mezőkbe beírt szöveget.", - "advanced_styling_field_input_height_description": "A beviteli mező minimális magasságát szabályozza.", + "advanced_styling_field_input_height_description": "Szabályozza a beviteli mező minimális magasságát.", "advanced_styling_field_input_padding_x_description": "Térközt ad hozzá balra és jobbra.", "advanced_styling_field_input_padding_y_description": "Térközt ad hozzá fent és lent.", "advanced_styling_field_input_placeholder_opacity_description": "Elhalványítja a helykitöltő súgószöveget.", @@ -2183,6 +2185,8 @@ "advanced_styling_field_input_text_description": "Kiszínezi a beviteli mezőkbe beírt szöveget.", "advanced_styling_field_option_bg": "Háttér", "advanced_styling_field_option_bg_description": "Kitölti a választási lehetőség elemeit.", + "advanced_styling_field_option_border": "Szegély színe", + "advanced_styling_field_option_border_description": "A rádiógomb és jelölőnégyzet opciók körvonalát határozza meg.", "advanced_styling_field_option_border_radius_description": "Lekerekíti a választási lehetőség sarkait.", "advanced_styling_field_option_font_size_description": "Átméretezi a választási lehetőség címkéjének szövegét.", "advanced_styling_field_option_label": "Címke színe", @@ -3002,6 +3006,9 @@ "preview_survey_question_2_choice_2_label": "Nem, köszönöm!", "preview_survey_question_2_headline": "Szeretne naprakész maradni?", "preview_survey_question_2_subheader": "Ez egy példa a leírásra.", + "preview_survey_question_open_text_headline": "Bármi egyéb, amit meg szeretne osztani?", + "preview_survey_question_open_text_placeholder": "Írja be ide a válaszát…", + "preview_survey_question_open_text_subheader": "A visszajelzése segít nekünk a fejlődésben.", "preview_survey_welcome_card_headline": "Üdvözöljük!", "prioritize_features_description": "A felhasználóknak leginkább és legkevésbé szükséges funkciók azonosítása.", "prioritize_features_name": "Funkciók rangsorolása", diff --git a/apps/web/locales/ja-JP.json b/apps/web/locales/ja-JP.json index 399ef2d2db..e8889ab1f4 100644 --- a/apps/web/locales/ja-JP.json +++ b/apps/web/locales/ja-JP.json @@ -285,6 +285,7 @@ "move_down": "下に移動", "move_up": "上に移動", "multiple_languages": "多言語", + "my_product": "マイプロダクト", "name": "名前", "new": "新規", "new_version_available": "Formbricks {version} が利用可能です。今すぐアップグレード!", @@ -1246,6 +1247,7 @@ "add_fallback_placeholder": "質問がスキップされた場合に表示するプレースホルダーを追加:", "add_hidden_field_id": "非表示フィールドIDを追加", "add_highlight_border": "ハイライトボーダーを追加", + "add_highlight_border_description": "プロダクト内サーベイにのみ適用されます。", "add_logic": "ロジックを追加", "add_none_of_the_above": "\"いずれも該当しません\" を追加", "add_option": "オプションを追加", @@ -1616,7 +1618,7 @@ "response_limits_redirections_and_more": "回答数の上限、リダイレクトなど。", "response_options": "回答オプション", "roundness": "丸み", - "roundness_description": "カードの角の丸みを調整します。", + "roundness_description": "角の丸みを調整します。", "row_used_in_logic_error": "この行は質問 {questionIndex} のロジックで使用されています。まず、ロジックから削除してください。", "rows": "行", "save_and_close": "保存して閉じる", @@ -2174,7 +2176,7 @@ "advanced_styling_field_indicator_bg_description": "バーの塗りつぶし部分に色を付けます。", "advanced_styling_field_input_border_radius_description": "入力フィールドの角を丸めます。", "advanced_styling_field_input_font_size_description": "入力フィールド内の入力テキストのサイズを調整します。", - "advanced_styling_field_input_height_description": "入力フィールドの最小の高さを制御します。", + "advanced_styling_field_input_height_description": "入力欄の最小の高さを調整します。", "advanced_styling_field_input_padding_x_description": "左右にスペースを追加します。", "advanced_styling_field_input_padding_y_description": "上下にスペースを追加します。", "advanced_styling_field_input_placeholder_opacity_description": "プレースホルダーのヒントテキストを薄くします。", @@ -2183,6 +2185,8 @@ "advanced_styling_field_input_text_description": "入力フィールドに入力されたテキストの色を設定します。", "advanced_styling_field_option_bg": "背景", "advanced_styling_field_option_bg_description": "オプション項目を塗りつぶします。", + "advanced_styling_field_option_border": "枠線の色", + "advanced_styling_field_option_border_description": "ラジオボタンとチェックボックスの選択肢の輪郭を設定します。", "advanced_styling_field_option_border_radius_description": "オプションの角を丸くします。", "advanced_styling_field_option_font_size_description": "オプションラベルのテキストサイズを調整します。", "advanced_styling_field_option_label": "ラベルの色", @@ -3002,6 +3006,9 @@ "preview_survey_question_2_choice_2_label": "いいえ、結構です!", "preview_survey_question_2_headline": "最新情報を知りたいですか?", "preview_survey_question_2_subheader": "これは説明の例です。", + "preview_survey_question_open_text_headline": "他に共有したいことはありますか?", + "preview_survey_question_open_text_placeholder": "ここに回答を入力してください...", + "preview_survey_question_open_text_subheader": "あなたのフィードバックは、私たちの改善に役立ちます。", "preview_survey_welcome_card_headline": "ようこそ!", "prioritize_features_description": "ユーザーが最も必要とする機能と最も必要としない機能を特定する。", "prioritize_features_name": "機能の優先順位付け", diff --git a/apps/web/locales/nl-NL.json b/apps/web/locales/nl-NL.json index 2f52a72f3e..f029118938 100644 --- a/apps/web/locales/nl-NL.json +++ b/apps/web/locales/nl-NL.json @@ -285,6 +285,7 @@ "move_down": "Ga naar beneden", "move_up": "Ga omhoog", "multiple_languages": "Meerdere talen", + "my_product": "mijn product", "name": "Naam", "new": "Nieuw", "new_version_available": "Formbricks {version} is hier. Upgrade nu!", @@ -1246,6 +1247,7 @@ "add_fallback_placeholder": "Voeg een tijdelijke aanduiding toe om aan te geven of er geen waarde is om te onthouden.", "add_hidden_field_id": "Voeg een verborgen veld-ID toe", "add_highlight_border": "Markeerrand toevoegen", + "add_highlight_border_description": "Geldt alleen voor in-product enquêtes.", "add_logic": "Voeg logica toe", "add_none_of_the_above": "Voeg 'Geen van bovenstaande' toe", "add_option": "Optie toevoegen", @@ -1616,7 +1618,7 @@ "response_limits_redirections_and_more": "Reactielimieten, omleidingen en meer.", "response_options": "Reactieopties", "roundness": "Rondheid", - "roundness_description": "Bepaalt hoe afgerond de kaarthoeken zijn.", + "roundness_description": "Bepaalt hoe afgerond de hoeken zijn.", "row_used_in_logic_error": "Deze rij wordt gebruikt in de logica van vraag {questionIndex}. Verwijder het eerst uit de logica.", "rows": "Rijen", "save_and_close": "Opslaan en sluiten", @@ -2174,7 +2176,7 @@ "advanced_styling_field_indicator_bg_description": "Kleurt het gevulde deel van de balk.", "advanced_styling_field_input_border_radius_description": "Rondt de invoerhoeken af.", "advanced_styling_field_input_font_size_description": "Schaalt de getypte tekst in invoervelden.", - "advanced_styling_field_input_height_description": "Bepaalt de minimale hoogte van het invoerveld.", + "advanced_styling_field_input_height_description": "Bepaalt de min. hoogte van het invoerveld.", "advanced_styling_field_input_padding_x_description": "Voegt ruimte toe aan de linker- en rechterkant.", "advanced_styling_field_input_padding_y_description": "Voegt ruimte toe aan de boven- en onderkant.", "advanced_styling_field_input_placeholder_opacity_description": "Vervaagt de tijdelijke aanwijzingstekst.", @@ -2183,6 +2185,8 @@ "advanced_styling_field_input_text_description": "Kleurt de getypte tekst in invoervelden.", "advanced_styling_field_option_bg": "Achtergrond", "advanced_styling_field_option_bg_description": "Vult de optie-items.", + "advanced_styling_field_option_border": "Randkleur", + "advanced_styling_field_option_border_description": "Omlijnt radio- en checkboxopties.", "advanced_styling_field_option_border_radius_description": "Rondt de hoeken van opties af.", "advanced_styling_field_option_font_size_description": "Schaalt de tekst van optielabels.", "advanced_styling_field_option_label": "Labelkleur", @@ -3002,6 +3006,9 @@ "preview_survey_question_2_choice_2_label": "Nee, dank je!", "preview_survey_question_2_headline": "Wil je op de hoogte blijven?", "preview_survey_question_2_subheader": "Dit is een voorbeeldbeschrijving.", + "preview_survey_question_open_text_headline": "Wil je nog iets delen?", + "preview_survey_question_open_text_placeholder": "Typ hier je antwoord...", + "preview_survey_question_open_text_subheader": "Je feedback helpt ons verbeteren.", "preview_survey_welcome_card_headline": "Welkom!", "prioritize_features_description": "Identificeer functies die uw gebruikers het meest en het minst nodig hebben.", "prioritize_features_name": "Geef prioriteit aan functies", diff --git a/apps/web/locales/pt-BR.json b/apps/web/locales/pt-BR.json index 0b66af8631..e72abd4607 100644 --- a/apps/web/locales/pt-BR.json +++ b/apps/web/locales/pt-BR.json @@ -285,6 +285,7 @@ "move_down": "Descer", "move_up": "Subir", "multiple_languages": "Vários idiomas", + "my_product": "meu produto", "name": "Nome", "new": "Novo", "new_version_available": "Formbricks {version} chegou. Atualize agora!", @@ -1246,6 +1247,7 @@ "add_fallback_placeholder": "Adicionar um texto padrão para mostrar se a pergunta for ignorada:", "add_hidden_field_id": "Adicionar campo oculto ID", "add_highlight_border": "Adicionar borda de destaque", + "add_highlight_border_description": "Aplica-se apenas a pesquisas no produto.", "add_logic": "Adicionar lógica", "add_none_of_the_above": "Adicionar \"Nenhuma das opções acima\"", "add_option": "Adicionar opção", @@ -1616,7 +1618,7 @@ "response_limits_redirections_and_more": "Limites de resposta, redirecionamentos e mais.", "response_options": "Opções de Resposta", "roundness": "Circularidade", - "roundness_description": "Controla o arredondamento dos cantos do cartão.", + "roundness_description": "Controla o arredondamento dos cantos.", "row_used_in_logic_error": "Esta linha é usada na lógica da pergunta {questionIndex}. Por favor, remova-a da lógica primeiro.", "rows": "linhas", "save_and_close": "Salvar e Fechar", @@ -2174,7 +2176,7 @@ "advanced_styling_field_indicator_bg_description": "Colore a porção preenchida da barra.", "advanced_styling_field_input_border_radius_description": "Arredonda os cantos do campo.", "advanced_styling_field_input_font_size_description": "Ajusta o tamanho do texto digitado nos campos.", - "advanced_styling_field_input_height_description": "Controla a altura mínima do campo de entrada.", + "advanced_styling_field_input_height_description": "Controla a altura mínima da entrada.", "advanced_styling_field_input_padding_x_description": "Adiciona espaço à esquerda e à direita.", "advanced_styling_field_input_padding_y_description": "Adiciona espaço na parte superior e inferior.", "advanced_styling_field_input_placeholder_opacity_description": "Esmaece o texto de dica do placeholder.", @@ -2183,6 +2185,8 @@ "advanced_styling_field_input_text_description": "Colore o texto digitado nos campos de entrada.", "advanced_styling_field_option_bg": "Fundo", "advanced_styling_field_option_bg_description": "Preenche os itens de opção.", + "advanced_styling_field_option_border": "Cor da borda", + "advanced_styling_field_option_border_description": "Contorna as opções de botões de rádio e caixas de seleção.", "advanced_styling_field_option_border_radius_description": "Arredonda os cantos das opções.", "advanced_styling_field_option_font_size_description": "Ajusta o tamanho do texto do rótulo da opção.", "advanced_styling_field_option_label": "Cor do rótulo", @@ -3002,6 +3006,9 @@ "preview_survey_question_2_choice_2_label": "Não, obrigado!", "preview_survey_question_2_headline": "Quer ficar por dentro?", "preview_survey_question_2_subheader": "Este é um exemplo de descrição.", + "preview_survey_question_open_text_headline": "Tem mais alguma coisa que você gostaria de compartilhar?", + "preview_survey_question_open_text_placeholder": "Digite sua resposta aqui...", + "preview_survey_question_open_text_subheader": "Seu feedback nos ajuda a melhorar.", "preview_survey_welcome_card_headline": "Bem-vindo!", "prioritize_features_description": "Identifique os recursos que seus usuários mais e menos precisam.", "prioritize_features_name": "Priorizar Funcionalidades", diff --git a/apps/web/locales/pt-PT.json b/apps/web/locales/pt-PT.json index dae0845994..9dc2211eb5 100644 --- a/apps/web/locales/pt-PT.json +++ b/apps/web/locales/pt-PT.json @@ -285,6 +285,7 @@ "move_down": "Mover para baixo", "move_up": "Mover para cima", "multiple_languages": "Várias línguas", + "my_product": "o meu produto", "name": "Nome", "new": "Novo", "new_version_available": "Formbricks {version} está aqui. Atualize agora!", @@ -1246,6 +1247,7 @@ "add_fallback_placeholder": "Adicionar um espaço reservado para mostrar se não houver valor para recordar.", "add_hidden_field_id": "Adicionar ID do campo oculto", "add_highlight_border": "Adicionar borda de destaque", + "add_highlight_border_description": "Aplica-se apenas a inquéritos no produto.", "add_logic": "Adicionar lógica", "add_none_of_the_above": "Adicionar \"Nenhuma das Opções Acima\"", "add_option": "Adicionar opção", @@ -1616,7 +1618,7 @@ "response_limits_redirections_and_more": "Limites de resposta, redirecionamentos e mais.", "response_options": "Opções de Resposta", "roundness": "Arredondamento", - "roundness_description": "Controla o arredondamento dos cantos do cartão.", + "roundness_description": "Controla o arredondamento dos cantos.", "row_used_in_logic_error": "Esta linha é usada na lógica da pergunta {questionIndex}. Por favor, remova-a da lógica primeiro.", "rows": "Linhas", "save_and_close": "Guardar e Fechar", @@ -2174,7 +2176,7 @@ "advanced_styling_field_indicator_bg_description": "Colore a porção preenchida da barra.", "advanced_styling_field_input_border_radius_description": "Arredonda os cantos do campo.", "advanced_styling_field_input_font_size_description": "Ajusta o tamanho do texto digitado nos campos.", - "advanced_styling_field_input_height_description": "Controla a altura mínima do campo de entrada.", + "advanced_styling_field_input_height_description": "Controla a altura mínima da entrada.", "advanced_styling_field_input_padding_x_description": "Adiciona espaço à esquerda e à direita.", "advanced_styling_field_input_padding_y_description": "Adiciona espaço no topo e na base.", "advanced_styling_field_input_placeholder_opacity_description": "Atenua o texto de sugestão do placeholder.", @@ -2183,6 +2185,8 @@ "advanced_styling_field_input_text_description": "Colore o texto digitado nos campos de entrada.", "advanced_styling_field_option_bg": "Fundo", "advanced_styling_field_option_bg_description": "Preenche os itens de opção.", + "advanced_styling_field_option_border": "Cor do contorno", + "advanced_styling_field_option_border_description": "Contorna as opções de botões de rádio e caixas de seleção.", "advanced_styling_field_option_border_radius_description": "Arredonda os cantos das opções.", "advanced_styling_field_option_font_size_description": "Ajusta o tamanho do texto da etiqueta da opção.", "advanced_styling_field_option_label": "Cor da etiqueta", @@ -3002,6 +3006,9 @@ "preview_survey_question_2_choice_2_label": "Não, obrigado!", "preview_survey_question_2_headline": "Quer manter-se atualizado?", "preview_survey_question_2_subheader": "Este é um exemplo de descrição.", + "preview_survey_question_open_text_headline": "Mais alguma coisa que gostaria de partilhar?", + "preview_survey_question_open_text_placeholder": "Escreva a sua resposta aqui...", + "preview_survey_question_open_text_subheader": "O seu feedback ajuda-nos a melhorar.", "preview_survey_welcome_card_headline": "Bem-vindo!", "prioritize_features_description": "Identifique as funcionalidades que os seus utilizadores precisam mais e menos.", "prioritize_features_name": "Priorizar Funcionalidades", diff --git a/apps/web/locales/ro-RO.json b/apps/web/locales/ro-RO.json index 1a7f33ede6..c2974d7880 100644 --- a/apps/web/locales/ro-RO.json +++ b/apps/web/locales/ro-RO.json @@ -285,6 +285,7 @@ "move_down": "Mută în jos", "move_up": "Mută sus", "multiple_languages": "Mai multe limbi", + "my_product": "produsul meu", "name": "Nume", "new": "Nou", "new_version_available": "Formbricks {version} este disponibil. Actualizați acum!", @@ -1246,6 +1247,7 @@ "add_fallback_placeholder": "Adaugă un placeholder pentru a afișa dacă nu există valoare de reamintit", "add_hidden_field_id": "Adăugați ID câmp ascuns", "add_highlight_border": "Adaugă bordură evidențiată", + "add_highlight_border_description": "Se aplică doar sondajelor din produs.", "add_logic": "Adaugă logică", "add_none_of_the_above": "Adăugați \"Niciuna dintre cele de mai sus\"", "add_option": "Adăugați opțiune", @@ -1616,7 +1618,7 @@ "response_limits_redirections_and_more": "Limite de răspunsuri, redirecționări și altele.", "response_options": "Opțiuni răspuns", "roundness": "Rotunjire", - "roundness_description": "Controlează cât de rotunjite sunt colțurile cardului.", + "roundness_description": "Controlează cât de rotunjite sunt colțurile.", "row_used_in_logic_error": "Această linie este folosită în logica întrebării {questionIndex}. Vă rugăm să-l eliminați din logică mai întâi.", "rows": "Rânduri", "save_and_close": "Salvează & Închide", @@ -2183,6 +2185,8 @@ "advanced_styling_field_input_text_description": "Colorează textul introdus în câmpuri.", "advanced_styling_field_option_bg": "Fundal", "advanced_styling_field_option_bg_description": "Umple elementele de opțiune.", + "advanced_styling_field_option_border": "Culoare contur", + "advanced_styling_field_option_border_description": "Evidențiază opțiunile radio și checkbox.", "advanced_styling_field_option_border_radius_description": "Rotunjește colțurile opțiunilor.", "advanced_styling_field_option_font_size_description": "Redimensionează textul etichetei opțiunii.", "advanced_styling_field_option_label": "Culoare etichetă", @@ -3002,6 +3006,9 @@ "preview_survey_question_2_choice_2_label": "Nu, mulţumesc!", "preview_survey_question_2_headline": "Vrei să fii în temă?", "preview_survey_question_2_subheader": "Aceasta este o descriere exemplu.", + "preview_survey_question_open_text_headline": "Mai vrei să împărtășești ceva?", + "preview_survey_question_open_text_placeholder": "Tastează răspunsul aici...", + "preview_survey_question_open_text_subheader": "Feedbackul tău ne ajută să ne îmbunătățim.", "preview_survey_welcome_card_headline": "Bun venit!", "prioritize_features_description": "Identificați caracteristicile de care utilizatorii dumneavoastră au cel mai mult și cel mai puțin nevoie.", "prioritize_features_name": "Prioritizați caracteristicile", diff --git a/apps/web/locales/ru-RU.json b/apps/web/locales/ru-RU.json index 6bebc8253f..75eaf437f5 100644 --- a/apps/web/locales/ru-RU.json +++ b/apps/web/locales/ru-RU.json @@ -285,6 +285,7 @@ "move_down": "Переместить вниз", "move_up": "Переместить вверх", "multiple_languages": "Несколько языков", + "my_product": "мой продукт", "name": "Имя", "new": "Новый", "new_version_available": "Formbricks {version} уже здесь. Обновитесь сейчас!", @@ -1246,6 +1247,7 @@ "add_fallback_placeholder": "Добавить плейсхолдер, который будет показан, если нет значения для отображения.", "add_hidden_field_id": "Добавить скрытый ID поля", "add_highlight_border": "Добавить выделяющую рамку", + "add_highlight_border_description": "Применяется только к опросам внутри продукта.", "add_logic": "Добавить логику", "add_none_of_the_above": "Добавить вариант «Ничего из вышеперечисленного»", "add_option": "Добавить вариант", @@ -1616,7 +1618,7 @@ "response_limits_redirections_and_more": "Лимиты ответов, перенаправления и другое.", "response_options": "Параметры ответа", "roundness": "Скругление", - "roundness_description": "Определяет степень скругления углов карточки.", + "roundness_description": "Определяет степень скругления углов.", "row_used_in_logic_error": "Эта строка используется в логике вопроса {questionIndex}. Пожалуйста, сначала удалите её из логики.", "rows": "Строки", "save_and_close": "Сохранить и закрыть", @@ -2174,7 +2176,7 @@ "advanced_styling_field_indicator_bg_description": "Задаёт цвет заполненной части полосы.", "advanced_styling_field_input_border_radius_description": "Скругляет углы полей ввода.", "advanced_styling_field_input_font_size_description": "Масштабирует введённый текст в полях ввода.", - "advanced_styling_field_input_height_description": "Определяет минимальную высоту поля ввода.", + "advanced_styling_field_input_height_description": "Управляет минимальной высотой поля ввода.", "advanced_styling_field_input_padding_x_description": "Добавляет отступы слева и справа.", "advanced_styling_field_input_padding_y_description": "Добавляет пространство сверху и снизу.", "advanced_styling_field_input_placeholder_opacity_description": "Делает текст подсказки менее заметным.", @@ -2183,6 +2185,8 @@ "advanced_styling_field_input_text_description": "Задаёт цвет введённого текста в полях.", "advanced_styling_field_option_bg": "Фон", "advanced_styling_field_option_bg_description": "Заливает фон элементов опций.", + "advanced_styling_field_option_border": "Цвет границы", + "advanced_styling_field_option_border_description": "Обводка для вариантов radio и checkbox.", "advanced_styling_field_option_border_radius_description": "Скругляет углы опций.", "advanced_styling_field_option_font_size_description": "Изменяет размер текста метки опции.", "advanced_styling_field_option_label": "Цвет метки", @@ -3002,6 +3006,9 @@ "preview_survey_question_2_choice_2_label": "Нет, спасибо!", "preview_survey_question_2_headline": "Хотите быть в курсе событий?", "preview_survey_question_2_subheader": "Это пример описания.", + "preview_survey_question_open_text_headline": "Есть ли ещё что-то, чем хочешь поделиться?", + "preview_survey_question_open_text_placeholder": "Введи свой ответ здесь...", + "preview_survey_question_open_text_subheader": "Твой отзыв помогает нам становиться лучше.", "preview_survey_welcome_card_headline": "Добро пожаловать!", "prioritize_features_description": "Определите, какие функции наиболее и наименее важны для ваших пользователей.", "prioritize_features_name": "Приоритизация функций", diff --git a/apps/web/locales/sv-SE.json b/apps/web/locales/sv-SE.json index 45b53bcbec..d0a3176b2b 100644 --- a/apps/web/locales/sv-SE.json +++ b/apps/web/locales/sv-SE.json @@ -285,6 +285,7 @@ "move_down": "Flytta ner", "move_up": "Flytta upp", "multiple_languages": "Flera språk", + "my_product": "min produkt", "name": "Namn", "new": "Ny", "new_version_available": "Formbricks {version} är här. Uppgradera nu!", @@ -1246,6 +1247,7 @@ "add_fallback_placeholder": "Lägg till en platshållare att visa om det inte finns något värde att återkalla.", "add_hidden_field_id": "Lägg till dolt fält-ID", "add_highlight_border": "Lägg till markerad kant", + "add_highlight_border_description": "Gäller bara för undersökningar i produkten.", "add_logic": "Lägg till logik", "add_none_of_the_above": "Lägg till \"Inget av ovanstående\"", "add_option": "Lägg till alternativ", @@ -1616,7 +1618,7 @@ "response_limits_redirections_and_more": "Svarsgränser, omdirigeringar och mer.", "response_options": "Svarsalternativ", "roundness": "Rundhet", - "roundness_description": "Styr hur rundade kortets hörn är.", + "roundness_description": "Styr hur rundade hörnen är.", "row_used_in_logic_error": "Denna rad används i logiken för fråga {questionIndex}. Vänligen ta bort den från logiken först.", "rows": "Rader", "save_and_close": "Spara och stäng", @@ -2174,7 +2176,7 @@ "advanced_styling_field_indicator_bg_description": "Färglägger den fyllda delen av stapeln.", "advanced_styling_field_input_border_radius_description": "Rundar av hörnen på inmatningsfält.", "advanced_styling_field_input_font_size_description": "Ändrar storleken på texten i inmatningsfält.", - "advanced_styling_field_input_height_description": "Styr den minsta höjden på inmatningsfältet.", + "advanced_styling_field_input_height_description": "Styr minsta höjden på inmatningsfältet.", "advanced_styling_field_input_padding_x_description": "Lägger till utrymme till vänster och höger.", "advanced_styling_field_input_padding_y_description": "Lägger till utrymme upptill och nedtill.", "advanced_styling_field_input_placeholder_opacity_description": "Tonar ut platshållartexten.", @@ -2183,6 +2185,8 @@ "advanced_styling_field_input_text_description": "Färgar den inmatade texten i fälten.", "advanced_styling_field_option_bg": "Bakgrund", "advanced_styling_field_option_bg_description": "Fyller alternativraderna.", + "advanced_styling_field_option_border": "Kantfärg", + "advanced_styling_field_option_border_description": "Markerar radio- och kryssrutealternativ.", "advanced_styling_field_option_border_radius_description": "Rundar hörnen på alternativen.", "advanced_styling_field_option_font_size_description": "Skalar textstorleken på alternativetiketten.", "advanced_styling_field_option_label": "Etikettfärg", @@ -3002,6 +3006,9 @@ "preview_survey_question_2_choice_2_label": "Nej, tack!", "preview_survey_question_2_headline": "Vill du hållas uppdaterad?", "preview_survey_question_2_subheader": "Det här är ett exempel på en beskrivning.", + "preview_survey_question_open_text_headline": "Något mer du vill dela med dig av?", + "preview_survey_question_open_text_placeholder": "Skriv ditt svar här...", + "preview_survey_question_open_text_subheader": "Din feedback hjälper oss att bli bättre.", "preview_survey_welcome_card_headline": "Välkommen!", "prioritize_features_description": "Identifiera vilka funktioner dina användare behöver mest och minst.", "prioritize_features_name": "Prioritera funktioner", diff --git a/apps/web/locales/zh-Hans-CN.json b/apps/web/locales/zh-Hans-CN.json index ceb85de06d..3d29dd095f 100644 --- a/apps/web/locales/zh-Hans-CN.json +++ b/apps/web/locales/zh-Hans-CN.json @@ -285,6 +285,7 @@ "move_down": "下移", "move_up": "上移", "multiple_languages": "多种 语言", + "my_product": "我的产品", "name": "名称", "new": "新建", "new_version_available": "Formbricks {version} 在 这里。立即 升级!", @@ -1246,6 +1247,7 @@ "add_fallback_placeholder": "添加 占位符 显示 如果 没有 值以 回忆", "add_hidden_field_id": "添加 隐藏 字段 ID", "add_highlight_border": "添加 高亮 边框", + "add_highlight_border_description": "仅适用于产品内调查。", "add_logic": "添加逻辑", "add_none_of_the_above": "添加 “以上 都 不 是”", "add_option": "添加 选项", @@ -1616,7 +1618,7 @@ "response_limits_redirections_and_more": "响应 限制 、 重定向 和 更多 。", "response_options": "响应 选项", "roundness": "圆度", - "roundness_description": "控制卡片角的圆润程度。", + "roundness_description": "控制圆角的弧度。", "row_used_in_logic_error": "\"这个 行 在 问题 {questionIndex} 的 逻辑 中 使用。请 先 从 逻辑 中 删除 它。\"", "rows": "行", "save_and_close": "保存 和 关闭", @@ -2174,7 +2176,7 @@ "advanced_styling_field_indicator_bg_description": "设置进度条已填充部分的颜色。", "advanced_styling_field_input_border_radius_description": "设置输入框圆角。", "advanced_styling_field_input_font_size_description": "调整输入框内文字大小。", - "advanced_styling_field_input_height_description": "设置输入框的最小高度。", + "advanced_styling_field_input_height_description": "控制输入框的最小高度。", "advanced_styling_field_input_padding_x_description": "增加输入框左右间距。", "advanced_styling_field_input_padding_y_description": "为输入框上下添加间距。", "advanced_styling_field_input_placeholder_opacity_description": "调整占位提示文字的透明度。", @@ -2183,6 +2185,8 @@ "advanced_styling_field_input_text_description": "设置输入框内已输入文字的颜色。", "advanced_styling_field_option_bg": "背景色", "advanced_styling_field_option_bg_description": "设置选项项的背景色。", + "advanced_styling_field_option_border": "边框颜色", + "advanced_styling_field_option_border_description": "为单选框和复选框选项添加轮廓。", "advanced_styling_field_option_border_radius_description": "设置选项的圆角。", "advanced_styling_field_option_font_size_description": "调整选项标签文字的大小。", "advanced_styling_field_option_label": "标签颜色", @@ -3002,6 +3006,9 @@ "preview_survey_question_2_choice_2_label": "不,谢谢!", "preview_survey_question_2_headline": "想 了解 最新信息吗?", "preview_survey_question_2_subheader": "这是一个示例描述。", + "preview_survey_question_open_text_headline": "还有什么想和我们分享的吗?", + "preview_survey_question_open_text_placeholder": "请在这里输入你的答案...", + "preview_survey_question_open_text_subheader": "你的反馈能帮助我们改进。", "preview_survey_welcome_card_headline": "欢迎!", "prioritize_features_description": "确定 用户 最 需要 和 最 不 需要 的 功能。", "prioritize_features_name": "优先 功能", diff --git a/apps/web/locales/zh-Hant-TW.json b/apps/web/locales/zh-Hant-TW.json index 2ae5c31861..0a784c107a 100644 --- a/apps/web/locales/zh-Hant-TW.json +++ b/apps/web/locales/zh-Hant-TW.json @@ -285,6 +285,7 @@ "move_down": "下移", "move_up": "上移", "multiple_languages": "多種語言", + "my_product": "我的產品", "name": "名稱", "new": "新增", "new_version_available": "Formbricks '{'version'}' 已推出。立即升級!", @@ -1246,6 +1247,7 @@ "add_fallback_placeholder": "新增 預設 以顯示是否沒 有 值 可 回憶 。", "add_hidden_field_id": "新增隱藏欄位 ID", "add_highlight_border": "新增醒目提示邊框", + "add_highlight_border_description": "僅適用於產品內調查。", "add_logic": "新增邏輯", "add_none_of_the_above": "新增 \"以上皆非\"", "add_option": "新增選項", @@ -1616,7 +1618,7 @@ "response_limits_redirections_and_more": "回應限制、重新導向等。", "response_options": "回應選項", "roundness": "圓角", - "roundness_description": "調整卡片邊角的圓弧度。", + "roundness_description": "調整邊角的圓潤程度。", "row_used_in_logic_error": "此 row 用於問題 '{'questionIndex'}' 的邏輯中。請先從邏輯中移除。", "rows": "列", "save_and_close": "儲存並關閉", @@ -2174,7 +2176,7 @@ "advanced_styling_field_indicator_bg_description": "設定進度條已填滿部分的顏色。", "advanced_styling_field_input_border_radius_description": "調整輸入框的圓角。", "advanced_styling_field_input_font_size_description": "調整輸入框內輸入文字的大小。", - "advanced_styling_field_input_height_description": "設定輸入欄位的最小高度。", + "advanced_styling_field_input_height_description": "控制輸入欄的最小高度。", "advanced_styling_field_input_padding_x_description": "在左右兩側增加間距。", "advanced_styling_field_input_padding_y_description": "在上方和下方增加間距。", "advanced_styling_field_input_placeholder_opacity_description": "讓提示文字變得更淡。", @@ -2183,6 +2185,8 @@ "advanced_styling_field_input_text_description": "設定輸入文字的顏色。", "advanced_styling_field_option_bg": "背景", "advanced_styling_field_option_bg_description": "填滿選項項目背景。", + "advanced_styling_field_option_border": "邊框顏色", + "advanced_styling_field_option_border_description": "為單選框和核取方塊選項加上外框。", "advanced_styling_field_option_border_radius_description": "讓選項的邊角變圓。", "advanced_styling_field_option_font_size_description": "調整選項標籤文字的大小。", "advanced_styling_field_option_label": "標籤顏色", @@ -3002,6 +3006,9 @@ "preview_survey_question_2_choice_2_label": "不用了,謝謝!", "preview_survey_question_2_headline": "想要緊跟最新動態嗎?", "preview_survey_question_2_subheader": "這是一個範例說明。", + "preview_survey_question_open_text_headline": "還有什麼想和我們分享的嗎?", + "preview_survey_question_open_text_placeholder": "在此輸入您的答案...", + "preview_survey_question_open_text_subheader": "您的回饋能幫助我們進步。", "preview_survey_welcome_card_headline": "歡迎!", "prioritize_features_description": "找出您的使用者最需要和最不需要的功能。", "prioritize_features_name": "優先排序功能", diff --git a/apps/web/modules/projects/settings/look/components/theme-styling.tsx b/apps/web/modules/projects/settings/look/components/theme-styling.tsx index 9bcea700a9..9339820c44 100644 --- a/apps/web/modules/projects/settings/look/components/theme-styling.tsx +++ b/apps/web/modules/projects/settings/look/components/theme-styling.tsx @@ -214,8 +214,8 @@ export const ThemeStyling = ({
@@ -292,6 +301,9 @@ export const FormStylingSettings = ({ description={t( "environments.workspace.look.advanced_styling_field_button_font_weight_description" )} + step={100} + min={100} + max={900} /> +
- {/* Progress Bar Section (Moved from Advanced) */} + {/* Highlight Border Section */} +
+
+
+ ( + +
+ + { + if (!checked) { + field.onChange(null); + return; + } + field.onChange({ + light: STYLE_DEFAULTS.highlightBorderColor?.light, + }); + }} + /> + +
+ + {t("environments.surveys.edit.add_highlight_border")} + + + {t("environments.surveys.edit.add_highlight_border_description")} + +
+
+ + {!!field.value && ( + + + field.onChange({ + ...field.value, + light: color, + }) + } + containerClass="w-1/2" + /> + + )} +
+ )} + /> +
+
+ + {/* Progress Bar Section */}

diff --git a/apps/web/modules/ui/components/color-picker/components/popover-picker.tsx b/apps/web/modules/ui/components/color-picker/components/popover-picker.tsx index 2c7fbae031..71ce0b6f6e 100644 --- a/apps/web/modules/ui/components/color-picker/components/popover-picker.tsx +++ b/apps/web/modules/ui/components/color-picker/components/popover-picker.tsx @@ -1,6 +1,6 @@ -import { useCallback, useRef, useState } from "react"; +import { useState } from "react"; import { HexColorPicker } from "react-colorful"; -import { useClickOutside } from "@/lib/utils/hooks/useClickOutside"; +import { Popover, PopoverContent, PopoverTrigger } from "@/modules/ui/components/popover"; interface PopoverPickerProps { color: string; @@ -9,33 +9,27 @@ interface PopoverPickerProps { } export const PopoverPicker = ({ color, onChange, disabled = false }: PopoverPickerProps) => { - const popover = useRef(null); - const [isOpen, toggle] = useState(false); - - const close = useCallback(() => toggle(false), []); - useClickOutside(popover, close); + const [isOpen, setIsOpen] = useState(false); return ( -
-
+ + +

{currentStatus.title}

-

{currentStatus.subtitle}

+

{currentStatus.subtitle}

{status === "notImplemented" && ( )}
@@ -51,7 +51,7 @@ const Loading = () => {
-
+
diff --git a/apps/web/app/(app)/environments/[environmentId]/workspace/integrations/notion/loading.tsx b/apps/web/app/(app)/environments/[environmentId]/workspace/integrations/notion/loading.tsx index c1b8d97891..68c46c0573 100644 --- a/apps/web/app/(app)/environments/[environmentId]/workspace/integrations/notion/loading.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/workspace/integrations/notion/loading.tsx @@ -10,7 +10,7 @@ const Loading = () => {
-
@@ -48,7 +48,7 @@ const Loading = () => {
-
+
diff --git a/apps/web/app/api/v1/client/og/route.tsx b/apps/web/app/api/v1/client/og/route.tsx index ab585f2e34..d812f3c659 100644 --- a/apps/web/app/api/v1/client/og/route.tsx +++ b/apps/web/app/api/v1/client/og/route.tsx @@ -6,140 +6,138 @@ export const GET = async (req: NextRequest) => { let brandColor = req.nextUrl.searchParams.get("brandColor"); return new ImageResponse( - ( +
+
+
-
-
-
-
+
+
+

+ {name} +

+
+
+
+
+
+
+
-

- {name} -

-
-
-
-
-
-
-
-
- Begin! -
+ Begin!
- ), +
, { width: 800, height: 400, diff --git a/apps/web/app/lib/api/with-api-logging.test.ts b/apps/web/app/lib/api/with-api-logging.test.ts index 6aa388f9b7..4fdf24e4b8 100644 --- a/apps/web/app/lib/api/with-api-logging.test.ts +++ b/apps/web/app/lib/api/with-api-logging.test.ts @@ -131,13 +131,11 @@ describe("withV1ApiWrapper", () => { }); test("logs and audits on error response with API key authentication", async () => { - const { queueAuditEvent: mockedQueueAuditEvent } = (await import( - "@/modules/ee/audit-logs/lib/handler" - )) as unknown as { queueAuditEvent: Mock }; + const { queueAuditEvent: mockedQueueAuditEvent } = + (await import("@/modules/ee/audit-logs/lib/handler")) as unknown as { queueAuditEvent: Mock }; const { authenticateRequest } = await import("@/app/api/v1/auth"); - const { isClientSideApiRoute, isManagementApiRoute, isIntegrationRoute } = await import( - "@/app/middleware/endpoint-validator" - ); + const { isClientSideApiRoute, isManagementApiRoute, isIntegrationRoute } = + await import("@/app/middleware/endpoint-validator"); vi.mocked(authenticateRequest).mockResolvedValue(mockApiAuthentication); vi.mocked(isClientSideApiRoute).mockReturnValue({ isClientSideApi: false, isRateLimited: true }); @@ -185,13 +183,11 @@ describe("withV1ApiWrapper", () => { }); test("does not log Sentry if not 500", async () => { - const { queueAuditEvent: mockedQueueAuditEvent } = (await import( - "@/modules/ee/audit-logs/lib/handler" - )) as unknown as { queueAuditEvent: Mock }; + const { queueAuditEvent: mockedQueueAuditEvent } = + (await import("@/modules/ee/audit-logs/lib/handler")) as unknown as { queueAuditEvent: Mock }; const { authenticateRequest } = await import("@/app/api/v1/auth"); - const { isClientSideApiRoute, isManagementApiRoute, isIntegrationRoute } = await import( - "@/app/middleware/endpoint-validator" - ); + const { isClientSideApiRoute, isManagementApiRoute, isIntegrationRoute } = + await import("@/app/middleware/endpoint-validator"); vi.mocked(authenticateRequest).mockResolvedValue(mockApiAuthentication); vi.mocked(isClientSideApiRoute).mockReturnValue({ isClientSideApi: false, isRateLimited: true }); @@ -233,13 +229,11 @@ describe("withV1ApiWrapper", () => { }); test("logs and audits on thrown error", async () => { - const { queueAuditEvent: mockedQueueAuditEvent } = (await import( - "@/modules/ee/audit-logs/lib/handler" - )) as unknown as { queueAuditEvent: Mock }; + const { queueAuditEvent: mockedQueueAuditEvent } = + (await import("@/modules/ee/audit-logs/lib/handler")) as unknown as { queueAuditEvent: Mock }; const { authenticateRequest } = await import("@/app/api/v1/auth"); - const { isClientSideApiRoute, isManagementApiRoute, isIntegrationRoute } = await import( - "@/app/middleware/endpoint-validator" - ); + const { isClientSideApiRoute, isManagementApiRoute, isIntegrationRoute } = + await import("@/app/middleware/endpoint-validator"); vi.mocked(authenticateRequest).mockResolvedValue(mockApiAuthentication); vi.mocked(isClientSideApiRoute).mockReturnValue({ isClientSideApi: false, isRateLimited: true }); @@ -291,13 +285,11 @@ describe("withV1ApiWrapper", () => { }); test("does not log on success response but still audits", async () => { - const { queueAuditEvent: mockedQueueAuditEvent } = (await import( - "@/modules/ee/audit-logs/lib/handler" - )) as unknown as { queueAuditEvent: Mock }; + const { queueAuditEvent: mockedQueueAuditEvent } = + (await import("@/modules/ee/audit-logs/lib/handler")) as unknown as { queueAuditEvent: Mock }; const { authenticateRequest } = await import("@/app/api/v1/auth"); - const { isClientSideApiRoute, isManagementApiRoute, isIntegrationRoute } = await import( - "@/app/middleware/endpoint-validator" - ); + const { isClientSideApiRoute, isManagementApiRoute, isIntegrationRoute } = + await import("@/app/middleware/endpoint-validator"); vi.mocked(authenticateRequest).mockResolvedValue(mockApiAuthentication); vi.mocked(isClientSideApiRoute).mockReturnValue({ isClientSideApi: false, isRateLimited: true }); @@ -347,13 +339,11 @@ describe("withV1ApiWrapper", () => { REDIS_URL: "redis://localhost:6379", })); - const { queueAuditEvent: mockedQueueAuditEvent } = (await import( - "@/modules/ee/audit-logs/lib/handler" - )) as unknown as { queueAuditEvent: Mock }; + const { queueAuditEvent: mockedQueueAuditEvent } = + (await import("@/modules/ee/audit-logs/lib/handler")) as unknown as { queueAuditEvent: Mock }; const { authenticateRequest } = await import("@/app/api/v1/auth"); - const { isClientSideApiRoute, isManagementApiRoute, isIntegrationRoute } = await import( - "@/app/middleware/endpoint-validator" - ); + const { isClientSideApiRoute, isManagementApiRoute, isIntegrationRoute } = + await import("@/app/middleware/endpoint-validator"); const { withV1ApiWrapper } = await import("./with-api-logging"); vi.mocked(authenticateRequest).mockResolvedValue(mockApiAuthentication); @@ -376,9 +366,8 @@ describe("withV1ApiWrapper", () => { }); test("handles client-side API routes without authentication", async () => { - const { isClientSideApiRoute, isManagementApiRoute, isIntegrationRoute } = await import( - "@/app/middleware/endpoint-validator" - ); + const { isClientSideApiRoute, isManagementApiRoute, isIntegrationRoute } = + await import("@/app/middleware/endpoint-validator"); const { authenticateRequest } = await import("@/app/api/v1/auth"); const { applyIPRateLimit } = await import("@/modules/core/rate-limit/helpers"); @@ -410,9 +399,8 @@ describe("withV1ApiWrapper", () => { }); test("returns authentication error for non-client routes without auth", async () => { - const { isClientSideApiRoute, isManagementApiRoute, isIntegrationRoute } = await import( - "@/app/middleware/endpoint-validator" - ); + const { isClientSideApiRoute, isManagementApiRoute, isIntegrationRoute } = + await import("@/app/middleware/endpoint-validator"); const { authenticateRequest } = await import("@/app/api/v1/auth"); vi.mocked(isClientSideApiRoute).mockReturnValue({ isClientSideApi: false, isRateLimited: true }); @@ -435,9 +423,8 @@ describe("withV1ApiWrapper", () => { test("handles rate limiting errors", async () => { const { applyRateLimit } = await import("@/modules/core/rate-limit/helpers"); - const { isClientSideApiRoute, isManagementApiRoute, isIntegrationRoute } = await import( - "@/app/middleware/endpoint-validator" - ); + const { isClientSideApiRoute, isManagementApiRoute, isIntegrationRoute } = + await import("@/app/middleware/endpoint-validator"); const { authenticateRequest } = await import("@/app/api/v1/auth"); vi.mocked(authenticateRequest).mockResolvedValue(mockApiAuthentication); @@ -462,13 +449,11 @@ describe("withV1ApiWrapper", () => { }); test("skips audit log creation when no action/targetType provided", async () => { - const { queueAuditEvent: mockedQueueAuditEvent } = (await import( - "@/modules/ee/audit-logs/lib/handler" - )) as unknown as { queueAuditEvent: Mock }; + const { queueAuditEvent: mockedQueueAuditEvent } = + (await import("@/modules/ee/audit-logs/lib/handler")) as unknown as { queueAuditEvent: Mock }; const { authenticateRequest } = await import("@/app/api/v1/auth"); - const { isClientSideApiRoute, isManagementApiRoute, isIntegrationRoute } = await import( - "@/app/middleware/endpoint-validator" - ); + const { isClientSideApiRoute, isManagementApiRoute, isIntegrationRoute } = + await import("@/app/middleware/endpoint-validator"); vi.mocked(authenticateRequest).mockResolvedValue(mockApiAuthentication); vi.mocked(isClientSideApiRoute).mockReturnValue({ isClientSideApi: false, isRateLimited: true }); diff --git a/apps/web/app/middleware/endpoint-validator.test.ts b/apps/web/app/middleware/endpoint-validator.test.ts index 7e032e1a03..4ef7df3e78 100644 --- a/apps/web/app/middleware/endpoint-validator.test.ts +++ b/apps/web/app/middleware/endpoint-validator.test.ts @@ -313,7 +313,7 @@ describe("endpoint-validator", () => { expect(isPublicDomainRoute("/c")).toBe(false); expect(isPublicDomainRoute("/contact/token")).toBe(false); }); - + test("should return true for pretty URL survey routes", () => { expect(isPublicDomainRoute("/p/pretty123")).toBe(true); expect(isPublicDomainRoute("/p/pretty-name-with-dashes")).toBe(true); diff --git a/apps/web/modules/analysis/components/SingleResponseCard/components/SingleResponseCardBody.tsx b/apps/web/modules/analysis/components/SingleResponseCard/components/SingleResponseCardBody.tsx index ed843be4ac..51850440d3 100644 --- a/apps/web/modules/analysis/components/SingleResponseCard/components/SingleResponseCardBody.tsx +++ b/apps/web/modules/analysis/components/SingleResponseCard/components/SingleResponseCardBody.tsx @@ -42,7 +42,7 @@ export const SingleResponseCardBody = ({ return ( + className="ml-0.5 mr-0.5 rounded-md border border-slate-200 bg-slate-50 px-1 py-0.5 text-sm first:ml-0"> @{part} ); diff --git a/apps/web/modules/auth/email-change-without-verification-success/page.tsx b/apps/web/modules/auth/email-change-without-verification-success/page.tsx index b0d270f685..54ce7682be 100644 --- a/apps/web/modules/auth/email-change-without-verification-success/page.tsx +++ b/apps/web/modules/auth/email-change-without-verification-success/page.tsx @@ -15,7 +15,7 @@ export const EmailChangeWithoutVerificationSuccessPage = async () => { } return ( -
+

{t("auth.email-change.email_change_success")} diff --git a/apps/web/modules/auth/forgot-password/components/forgot-password-form.tsx b/apps/web/modules/auth/forgot-password/components/forgot-password-form.tsx index e0ce651e01..39bcd13aa2 100644 --- a/apps/web/modules/auth/forgot-password/components/forgot-password-form.tsx +++ b/apps/web/modules/auth/forgot-password/components/forgot-password-form.tsx @@ -60,7 +60,7 @@ export const ForgotPasswordForm = () => { onChange={(e) => field.onChange(e)} autoComplete="email" required - className="focus:border-brand-dark focus:ring-brand-dark block w-full rounded-md border-slate-300 shadow-sm sm:text-sm" + className="block w-full rounded-md border-slate-300 shadow-sm focus:border-brand-dark focus:ring-brand-dark sm:text-sm" /> {error?.message && {error.message}} diff --git a/apps/web/modules/auth/invite/types/invites.ts b/apps/web/modules/auth/invite/types/invites.ts index 367413cbd3..ef0a070a22 100644 --- a/apps/web/modules/auth/invite/types/invites.ts +++ b/apps/web/modules/auth/invite/types/invites.ts @@ -1,8 +1,10 @@ import { Invite } from "@prisma/client"; import { TUserLocale } from "@formbricks/types/user"; -export interface InviteWithCreator - extends Pick { +export interface InviteWithCreator extends Pick< + Invite, + "id" | "expiresAt" | "organizationId" | "role" | "teamIds" +> { creator: { name: string | null; email: string; diff --git a/apps/web/modules/auth/layout.tsx b/apps/web/modules/auth/layout.tsx index a9e3631f1e..71bd243bac 100644 --- a/apps/web/modules/auth/layout.tsx +++ b/apps/web/modules/auth/layout.tsx @@ -24,7 +24,7 @@ export const AuthLayout = async ({ children }: { children: React.ReactNode }) =>
-
{children}
+
{children}
diff --git a/apps/web/modules/auth/login/components/login-form.tsx b/apps/web/modules/auth/login/components/login-form.tsx index 85a98cfd8d..f9533fd9c3 100644 --- a/apps/web/modules/auth/login/components/login-form.tsx +++ b/apps/web/modules/auth/login/components/login-form.tsx @@ -184,7 +184,7 @@ export const LoginForm = ({ value={field.value} onChange={(email) => field.onChange(email)} placeholder="work@email.com" - className="focus:border-brand-dark focus:ring-brand-dark block w-full rounded-md border-slate-300 shadow-sm sm:text-sm" + className="block w-full rounded-md border-slate-300 shadow-sm focus:border-brand-dark focus:ring-brand-dark sm:text-sm" /> {error?.message && {error.message}}

@@ -207,7 +207,7 @@ export const LoginForm = ({ aria-label="password" aria-required="true" required - className="focus:border-brand-dark focus:ring-brand-dark block w-full rounded-md border-slate-300 pr-8 shadow-sm sm:text-sm" + className="block w-full rounded-md border-slate-300 pr-8 shadow-sm focus:border-brand-dark focus:ring-brand-dark sm:text-sm" value={field.value} onChange={(password) => field.onChange(password)} /> @@ -221,7 +221,7 @@ export const LoginForm = ({
+ className="text-xs text-slate-500 hover:text-brand-dark"> {t("auth.login.forgot_your_password")}
diff --git a/apps/web/modules/auth/signup/components/signup-form.tsx b/apps/web/modules/auth/signup/components/signup-form.tsx index 34baef82de..0741c07d7c 100644 --- a/apps/web/modules/auth/signup/components/signup-form.tsx +++ b/apps/web/modules/auth/signup/components/signup-form.tsx @@ -222,7 +222,7 @@ export const SignupForm = ({ placeholder="*******" aria-placeholder="password" required - className="focus:border-brand-dark focus:ring-brand-dark block w-full rounded-md shadow-sm sm:text-sm" + className="block w-full rounded-md shadow-sm focus:border-brand-dark focus:ring-brand-dark sm:text-sm" /> {error?.message && {error.message}}
diff --git a/apps/web/modules/auth/verify-email-change/page.tsx b/apps/web/modules/auth/verify-email-change/page.tsx index f4813eac26..373c934f37 100644 --- a/apps/web/modules/auth/verify-email-change/page.tsx +++ b/apps/web/modules/auth/verify-email-change/page.tsx @@ -6,7 +6,7 @@ export const VerifyEmailChangePage = async ({ searchParams }) => { const { token } = await searchParams; return ( -
+
diff --git a/apps/web/modules/ee/billing/components/pricing-table.tsx b/apps/web/modules/ee/billing/components/pricing-table.tsx index a28d5ca07d..35a652502d 100644 --- a/apps/web/modules/ee/billing/components/pricing-table.tsx +++ b/apps/web/modules/ee/billing/components/pricing-table.tsx @@ -138,7 +138,7 @@ export const PricingTable = ({
-

+

{t("environments.settings.billing.current_plan")}:{" "} {organization.billing.plan} {cancellingOn && ( @@ -203,7 +203,7 @@ export const PricingTable = ({

{t("environments.settings.billing.monthly_identified_users")} @@ -226,7 +226,7 @@ export const PricingTable = ({

{t("common.workspaces")}

{organization.billing.limits.projects && ( @@ -264,7 +264,7 @@ export const PricingTable = ({
diff --git a/apps/web/modules/ee/contacts/attributes/components/attribute-table-column.tsx b/apps/web/modules/ee/contacts/attributes/components/attribute-table-column.tsx index 2b50268e1e..24d76aea3f 100644 --- a/apps/web/modules/ee/contacts/attributes/components/attribute-table-column.tsx +++ b/apps/web/modules/ee/contacts/attributes/components/attribute-table-column.tsx @@ -46,7 +46,7 @@ export const generateAttributeTableColumns = ( cell: ({ row }) => { const description = row.original.description; return description ? ( -
+
) : ( diff --git a/apps/web/modules/ee/contacts/components/upload-contacts-attribute.tsx b/apps/web/modules/ee/contacts/components/upload-contacts-attribute.tsx index 19bae9c7a6..79a3052da2 100644 --- a/apps/web/modules/ee/contacts/components/upload-contacts-attribute.tsx +++ b/apps/web/modules/ee/contacts/components/upload-contacts-attribute.tsx @@ -132,7 +132,7 @@ export const UploadContactsAttributes = ({ return ( <> - {csvColumn} + {csvColumn}
handleTabClick(index)}> diff --git a/apps/web/modules/ee/contacts/segments/components/segment-table-data-row.tsx b/apps/web/modules/ee/contacts/segments/components/segment-table-data-row.tsx index e1a0ff8282..45943498aa 100644 --- a/apps/web/modules/ee/contacts/segments/components/segment-table-data-row.tsx +++ b/apps/web/modules/ee/contacts/segments/components/segment-table-data-row.tsx @@ -42,7 +42,7 @@ export const SegmentTableDataRow = ({
-
+
{surveys?.length}
@@ -52,7 +52,7 @@ export const SegmentTableDataRow = ({ }).replace("about", "")}
-
+
{format(createdAt, "do 'of' MMMM, yyyy")}
diff --git a/apps/web/modules/ee/contacts/segments/components/targeting-card.tsx b/apps/web/modules/ee/contacts/segments/components/targeting-card.tsx index b5cd3a4f75..c0207abc4b 100644 --- a/apps/web/modules/ee/contacts/segments/components/targeting-card.tsx +++ b/apps/web/modules/ee/contacts/segments/components/targeting-card.tsx @@ -176,7 +176,7 @@ export function TargetingCard({ asChild className="h-full w-full cursor-pointer rounded-lg hover:bg-slate-50">
-
+
) : ( -

+

{t("environments.workspace.languages.no_language_found")}

)} diff --git a/apps/web/modules/ee/multi-language-surveys/components/multi-language-card.tsx b/apps/web/modules/ee/multi-language-surveys/components/multi-language-card.tsx index c12465d70f..0c5d768907 100644 --- a/apps/web/modules/ee/multi-language-surveys/components/multi-language-card.tsx +++ b/apps/web/modules/ee/multi-language-surveys/components/multi-language-card.tsx @@ -188,7 +188,7 @@ export const MultiLanguageCard: FC = ({

@@ -251,7 +251,7 @@ export const MultiLanguageCard: FC = ({ ) : ( <> {projectLanguages.length <= 1 && ( -

+
{projectLanguages.length === 0 ? t("environments.surveys.edit.no_languages_found_add_first_one_to_get_started") : t( @@ -262,7 +262,7 @@ export const MultiLanguageCard: FC = ({ {projectLanguages.length > 1 && (
{isMultiLanguageAllowed && !isMultiLanguageActivated ? ( -
+
{t("environments.surveys.edit.switch_multi_language_on_to_get_started")}
) : null} diff --git a/apps/web/modules/ee/two-factor-auth/components/confirm-password-form.tsx b/apps/web/modules/ee/two-factor-auth/components/confirm-password-form.tsx index b839a3f7c7..10345e2656 100644 --- a/apps/web/modules/ee/two-factor-auth/components/confirm-password-form.tsx +++ b/apps/web/modules/ee/two-factor-auth/components/confirm-password-form.tsx @@ -77,7 +77,7 @@ export const ConfirmPasswordForm = ({ required onChange={(password) => field.onChange(password)} value={field.value} - className="focus:border-brand-dark focus:ring-brand-dark block w-full rounded-md border-slate-300 shadow-sm sm:text-sm" + className="block w-full rounded-md border-slate-300 shadow-sm focus:border-brand-dark focus:ring-brand-dark sm:text-sm" /> {error?.message && {error.message}} diff --git a/apps/web/modules/ee/two-factor-auth/components/disable-two-factor-modal.tsx b/apps/web/modules/ee/two-factor-auth/components/disable-two-factor-modal.tsx index 72d7c773b4..5ece8bd615 100644 --- a/apps/web/modules/ee/two-factor-auth/components/disable-two-factor-modal.tsx +++ b/apps/web/modules/ee/two-factor-auth/components/disable-two-factor-modal.tsx @@ -109,7 +109,7 @@ export const DisableTwoFactorModal = ({ open, setOpen }: DisableTwoFactorModalPr required onChange={(password) => field.onChange(password)} value={field.value} - className="focus:border-brand-dark focus:ring-brand-dark block w-full rounded-md border-slate-300 shadow-sm sm:text-sm" + className="block w-full rounded-md border-slate-300 shadow-sm focus:border-brand-dark focus:ring-brand-dark sm:text-sm" /> {error?.message && {error.message}} diff --git a/apps/web/modules/ee/two-factor-auth/components/two-factor-backup.tsx b/apps/web/modules/ee/two-factor-auth/components/two-factor-backup.tsx index d3e6b0b72d..ec549435e7 100644 --- a/apps/web/modules/ee/two-factor-auth/components/two-factor-backup.tsx +++ b/apps/web/modules/ee/two-factor-auth/components/two-factor-backup.tsx @@ -35,7 +35,7 @@ export const TwoFactorBackup = ({ form }: TwoFactorBackupProps) => { id="totpBackup" required placeholder="XXXXX-XXXXX" - className="focus:border-brand-dark focus:ring-brand-dark block w-full rounded-md border-slate-300 shadow-sm sm:text-sm" + className="block w-full rounded-md border-slate-300 shadow-sm focus:border-brand-dark focus:ring-brand-dark sm:text-sm" value={field.value} onChange={(e) => field.onChange(e.target.value)} /> diff --git a/apps/web/modules/ee/whitelabel/email-customization/components/email-customization-settings.tsx b/apps/web/modules/ee/whitelabel/email-customization/components/email-customization-settings.tsx index 4f2ceb97c9..9ac826d3ec 100644 --- a/apps/web/modules/ee/whitelabel/email-customization/components/email-customization-settings.tsx +++ b/apps/web/modules/ee/whitelabel/email-customization/components/email-customization-settings.tsx @@ -206,7 +206,7 @@ export const EmailCustomizationSettings = ({
{t("environments.settings.general.logo_in_email_header")} -
+
{logoUrl && (
@@ -276,7 +276,7 @@ export const EmailCustomizationSettings = ({
-
+
+ {t("common.only_owners_managers_and_manage_access_members_can_perform_this_action")} diff --git a/apps/web/modules/integrations/webhooks/components/webhook-detail-modal.tsx b/apps/web/modules/integrations/webhooks/components/webhook-detail-modal.tsx index 514e117748..74b5b358d0 100644 --- a/apps/web/modules/integrations/webhooks/components/webhook-detail-modal.tsx +++ b/apps/web/modules/integrations/webhooks/components/webhook-detail-modal.tsx @@ -70,7 +70,7 @@ export const WebhookModal = ({ open, setOpen, webhook, surveys, isReadOnly }: We type="button" className={`mr-4 px-1 pb-3 focus:outline-none ${ activeTab === index - ? "border-brand-dark border-b-2 font-semibold text-slate-900" + ? "border-b-2 border-brand-dark font-semibold text-slate-900" : "text-slate-500 hover:text-slate-700" }`} onClick={() => handleTabClick(index)}> diff --git a/apps/web/modules/organization/settings/api-keys/components/edit-api-keys.tsx b/apps/web/modules/organization/settings/api-keys/components/edit-api-keys.tsx index f735e1b9de..b40b99e05d 100644 --- a/apps/web/modules/organization/settings/api-keys/components/edit-api-keys.tsx +++ b/apps/web/modules/organization/settings/api-keys/components/edit-api-keys.tsx @@ -134,7 +134,7 @@ export const EditAPIKeys = ({ organizationId, apiKeys, locale, isReadOnly, proje return (
- {apiKey} + {apiKey}
{apiKeysLocal?.length === 0 ? ( -
+
{t("environments.workspace.api_keys.no_api_keys_yet")}
) : ( diff --git a/apps/web/modules/organization/settings/api-keys/loading.tsx b/apps/web/modules/organization/settings/api-keys/loading.tsx index c19854bdbf..b12b9c9fb9 100644 --- a/apps/web/modules/organization/settings/api-keys/loading.tsx +++ b/apps/web/modules/organization/settings/api-keys/loading.tsx @@ -10,7 +10,7 @@ const LoadingCard = () => { return (
-

+

{t("common.loading")}

diff --git a/apps/web/modules/organization/settings/api-keys/types/api-keys.ts b/apps/web/modules/organization/settings/api-keys/types/api-keys.ts index 81de781f2a..f6c9b7f748 100644 --- a/apps/web/modules/organization/settings/api-keys/types/api-keys.ts +++ b/apps/web/modules/organization/settings/api-keys/types/api-keys.ts @@ -50,8 +50,10 @@ export const TApiKeyEnvironmentPermission = z.object({ export type TApiKeyEnvironmentPermission = z.infer; -export interface TApiKeyWithEnvironmentPermission - extends Pick { +export interface TApiKeyWithEnvironmentPermission extends Pick< + ApiKey, + "id" | "label" | "createdAt" | "organizationAccess" +> { apiKeyEnvironments: TApiKeyEnvironmentPermission[]; } diff --git a/apps/web/modules/organization/settings/teams/types/invites.ts b/apps/web/modules/organization/settings/teams/types/invites.ts index 3434a2c06c..728c668c38 100644 --- a/apps/web/modules/organization/settings/teams/types/invites.ts +++ b/apps/web/modules/organization/settings/teams/types/invites.ts @@ -3,8 +3,10 @@ import { z } from "zod"; import { ZInvite } from "@formbricks/database/zod/invites"; import { ZUserName } from "@formbricks/types/user"; -export interface TInvite - extends Omit {} +export interface TInvite extends Omit< + Invite, + "deprecatedRole" | "organizationId" | "creatorId" | "acceptorId" | "teamIds" +> {} export interface InviteWithCreator extends Pick { creator: { diff --git a/apps/web/modules/projects/settings/(setup)/components/ActionActivityTab.tsx b/apps/web/modules/projects/settings/(setup)/components/ActionActivityTab.tsx index 34eb81c026..4608e1e829 100644 --- a/apps/web/modules/projects/settings/(setup)/components/ActionActivityTab.tsx +++ b/apps/web/modules/projects/settings/(setup)/components/ActionActivityTab.tsx @@ -151,7 +151,7 @@ export const ActionActivityTab = ({

{ACTION_TYPE_ICON_LOOKUP[actionClass.type]}
-

{actionClass.type}

+

{actionClass.type}

diff --git a/apps/web/modules/projects/settings/general/components/custom-scripts-form.tsx b/apps/web/modules/projects/settings/general/components/custom-scripts-form.tsx index 60da3212e2..3e93d2d554 100644 --- a/apps/web/modules/projects/settings/general/components/custom-scripts-form.tsx +++ b/apps/web/modules/projects/settings/general/components/custom-scripts-form.tsx @@ -90,7 +90,7 @@ export const CustomScriptsForm: React.FC = ({ project, i rows={8} placeholder={t("environments.workspace.general.custom_scripts_placeholder")} className={cn( - "focus:border-brand-dark flex w-full rounded-md border border-slate-300 bg-transparent px-3 py-2 font-mono text-xs text-slate-800 placeholder:text-slate-400 focus:ring-2 focus:ring-slate-400 focus:ring-offset-2 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50", + "flex w-full rounded-md border border-slate-300 bg-transparent px-3 py-2 font-mono text-xs text-slate-800 placeholder:text-slate-400 focus:border-brand-dark focus:outline-none focus:ring-2 focus:ring-slate-400 focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50", isReadOnly && "bg-slate-50" )} {...field} diff --git a/apps/web/modules/projects/settings/look/components/theme-styling.tsx b/apps/web/modules/projects/settings/look/components/theme-styling.tsx index bb1497c536..717b7e73f3 100644 --- a/apps/web/modules/projects/settings/look/components/theme-styling.tsx +++ b/apps/web/modules/projects/settings/look/components/theme-styling.tsx @@ -203,7 +203,9 @@ export const ThemeStyling = ({ field.onChange(color)} containerClass="w-full" /> diff --git a/apps/web/modules/projects/settings/tags/components/merge-tags-combobox.tsx b/apps/web/modules/projects/settings/tags/components/merge-tags-combobox.tsx index 97501c08f3..010a3420d8 100644 --- a/apps/web/modules/projects/settings/tags/components/merge-tags-combobox.tsx +++ b/apps/web/modules/projects/settings/tags/components/merge-tags-combobox.tsx @@ -34,7 +34,7 @@ export const MergeTagsCombobox = ({ tags, onSelect }: MergeTagsComboboxProps) => @@ -43,7 +43,7 @@ export const MergeTagsCombobox = ({ tags, onSelect }: MergeTagsComboboxProps) =>
diff --git a/apps/web/modules/projects/settings/tags/components/single-tag.tsx b/apps/web/modules/projects/settings/tags/components/single-tag.tsx index cb7f2dc2a9..77196e4f28 100644 --- a/apps/web/modules/projects/settings/tags/components/single-tag.tsx +++ b/apps/web/modules/projects/settings/tags/components/single-tag.tsx @@ -125,12 +125,12 @@ export const SingleTag: React.FC = ({
-
+
{tagCountLoading ? :

{tagCount}

}
{!isReadOnly && ( -
+
{isMergingTags ? (
@@ -152,7 +152,7 @@ export const SingleTag: React.FC = ({ diff --git a/apps/web/modules/survey/components/element-form-input/index.tsx b/apps/web/modules/survey/components/element-form-input/index.tsx index 6498c487f7..ce2aecb598 100644 --- a/apps/web/modules/survey/components/element-form-input/index.tsx +++ b/apps/web/modules/survey/components/element-form-input/index.tsx @@ -391,7 +391,7 @@ export const ElementFormInput = ({ return (
{label && ( -
+
{id === "headline" && currentElement && updateElement && (
@@ -521,7 +521,7 @@ export const ElementFormInput = ({ return (
{label && ( -
+
)} @@ -568,7 +568,7 @@ export const ElementFormInput = ({
1 ? "pr-24" : "" }`} dir="auto" diff --git a/apps/web/modules/survey/components/template-list/components/start-from-scratch-template.tsx b/apps/web/modules/survey/components/template-list/components/start-from-scratch-template.tsx index bc8fce54ee..9bf0cbe51a 100644 --- a/apps/web/modules/survey/components/template-list/components/start-from-scratch-template.tsx +++ b/apps/web/modules/survey/components/template-list/components/start-from-scratch-template.tsx @@ -51,7 +51,7 @@ export const StartFromScratchTemplate = ({ const cardContent = ( <> - +

{customSurvey.name}

{customSurvey.description}

{showCreateSurveyButton && ( diff --git a/apps/web/modules/survey/editor/components/add-action-modal.tsx b/apps/web/modules/survey/editor/components/add-action-modal.tsx index f88af0a333..b174160e07 100644 --- a/apps/web/modules/survey/editor/components/add-action-modal.tsx +++ b/apps/web/modules/survey/editor/components/add-action-modal.tsx @@ -93,7 +93,7 @@ export const AddActionModal = ({ key={tab.title} className={`mr-4 px-1 pb-3 focus:outline-none ${ activeTab === index - ? "border-brand-dark border-b-2 font-semibold text-slate-900" + ? "border-b-2 border-brand-dark font-semibold text-slate-900" : "text-slate-500 hover:text-slate-700" }`} onClick={() => handleTabClick(index)}> diff --git a/apps/web/modules/survey/editor/components/add-element-button.tsx b/apps/web/modules/survey/editor/components/add-element-button.tsx index b6f929e399..7af00f440d 100644 --- a/apps/web/modules/survey/editor/components/add-element-button.tsx +++ b/apps/web/modules/survey/editor/components/add-element-button.tsx @@ -38,7 +38,7 @@ export const AddElementButton = ({ addElement, project, isCxMode }: AddElementBu )}>
-
+
@@ -67,7 +67,7 @@ export const AddElementButton = ({ addElement, project, isCxMode }: AddElementBu onMouseEnter={() => setHoveredElementId(elementType.id)} onMouseLeave={() => setHoveredElementId(null)}>
-
diff --git a/apps/web/modules/survey/editor/components/bulk-edit-options-modal.tsx b/apps/web/modules/survey/editor/components/bulk-edit-options-modal.tsx index 1625167910..832579e0b0 100644 --- a/apps/web/modules/survey/editor/components/bulk-edit-options-modal.tsx +++ b/apps/web/modules/survey/editor/components/bulk-edit-options-modal.tsx @@ -177,7 +177,7 @@ export const BulkEditOptionsModal = ({ } }} rows={15} - className="focus:border-brand w-full rounded-md border border-slate-300 bg-white p-3 font-mono text-sm focus:outline-none" + className="w-full rounded-md border border-slate-300 bg-white p-3 font-mono text-sm focus:border-brand focus:outline-none" placeholder={t("environments.surveys.edit.bulk_edit_description")} /> {validationError &&
{validationError}
} diff --git a/apps/web/modules/survey/editor/components/cta-element-form.tsx b/apps/web/modules/survey/editor/components/cta-element-form.tsx index 6efd8be4f5..b4269e07e4 100644 --- a/apps/web/modules/survey/editor/components/cta-element-form.tsx +++ b/apps/web/modules/survey/editor/components/cta-element-form.tsx @@ -111,7 +111,7 @@ export const CTAElementForm = ({ description={t("environments.surveys.edit.button_external_description")} childBorder customContainerClass="p-0 mt-4"> -
+
{/* The highlight container is absolutely positioned behind the input */}
{highlightedJSX} diff --git a/apps/web/modules/survey/editor/components/file-upload-element-form.tsx b/apps/web/modules/survey/editor/components/file-upload-element-form.tsx index 55c6016d9b..705a613430 100644 --- a/apps/web/modules/survey/editor/components/file-upload-element-form.tsx +++ b/apps/web/modules/survey/editor/components/file-upload-element-form.tsx @@ -172,7 +172,7 @@ export const FileUploadElementForm = ({ updateElement(elementIdx, { maxSizeInMB: Number.parseInt(e.target.value, 10) }); }} - className="mr-2 ml-2 inline w-20 bg-white text-center text-sm" + className="ml-2 mr-2 inline w-20 bg-white text-center text-sm" /> MB

diff --git a/apps/web/modules/survey/editor/components/hidden-fields-card.tsx b/apps/web/modules/survey/editor/components/hidden-fields-card.tsx index 1fc3439f84..c5d30c42df 100644 --- a/apps/web/modules/survey/editor/components/hidden-fields-card.tsx +++ b/apps/web/modules/survey/editor/components/hidden-fields-card.tsx @@ -158,7 +158,7 @@ export const HiddenFieldsCard = ({
@@ -191,7 +191,7 @@ export const HiddenFieldsCard = ({ ); }) ) : ( -

+

{t("environments.surveys.edit.no_hidden_fields_yet_add_first_one_below")}

)} diff --git a/apps/web/modules/survey/editor/components/how-to-send-card.tsx b/apps/web/modules/survey/editor/components/how-to-send-card.tsx index a35aa9cb7f..0450caa3f9 100644 --- a/apps/web/modules/survey/editor/components/how-to-send-card.tsx +++ b/apps/web/modules/survey/editor/components/how-to-send-card.tsx @@ -106,7 +106,7 @@ export const HowToSendCard = ({ localSurvey, setLocalSurvey, environment }: HowT className="h-full w-full cursor-pointer" id="howToSendCardTrigger">
-
+
diff --git a/apps/web/modules/survey/editor/components/logo-settings-card.tsx b/apps/web/modules/survey/editor/components/logo-settings-card.tsx index 2a8b680c1a..19fdc31f6e 100644 --- a/apps/web/modules/survey/editor/components/logo-settings-card.tsx +++ b/apps/web/modules/survey/editor/components/logo-settings-card.tsx @@ -124,7 +124,7 @@ export const LogoSettingsCard = ({ disabled && "cursor-not-allowed opacity-60 hover:bg-white" )}>
-
+

{option.name}

@@ -273,7 +273,7 @@ export const RecontactOptionsCard = ({ localSurvey, setLocalSurvey }: RecontactO

{option.name}

diff --git a/apps/web/modules/survey/editor/components/redirect-url-form.tsx b/apps/web/modules/survey/editor/components/redirect-url-form.tsx index e140d22123..968d4d0022 100644 --- a/apps/web/modules/survey/editor/components/redirect-url-form.tsx +++ b/apps/web/modules/survey/editor/components/redirect-url-form.tsx @@ -45,7 +45,7 @@ export const RedirectUrlForm = ({ localSurvey, endingCard, updateSurvey }: Redir
{/* The highlight container is absolutely positioned behind the input */}
{highlightedJSX} diff --git a/apps/web/modules/survey/editor/components/response-options-card.tsx b/apps/web/modules/survey/editor/components/response-options-card.tsx index 0ea5d0f948..63a4504a3b 100644 --- a/apps/web/modules/survey/editor/components/response-options-card.tsx +++ b/apps/web/modules/survey/editor/components/response-options-card.tsx @@ -205,7 +205,7 @@ export const ResponseOptionsCard = ({ )}>
-
+
{t("environments.surveys.edit.completed_responses")}

@@ -310,7 +310,7 @@ export const ResponseOptionsCard = ({ handleClosedSurveyMessageChange({ heading: e.target.value })} diff --git a/apps/web/modules/survey/editor/components/survey-menu-bar.tsx b/apps/web/modules/survey/editor/components/survey-menu-bar.tsx index 9333f351c4..df8dbf6a26 100644 --- a/apps/web/modules/survey/editor/components/survey-menu-bar.tsx +++ b/apps/web/modules/survey/editor/components/survey-menu-bar.tsx @@ -475,7 +475,7 @@ export const SurveyMenuBar = ({ />
-
+
{!isStorageConfigured && (
diff --git a/apps/web/modules/survey/follow-ups/components/follow-up-item.tsx b/apps/web/modules/survey/follow-ups/components/follow-up-item.tsx index c7a088f6ea..9e6c07908f 100644 --- a/apps/web/modules/survey/follow-ups/components/follow-up-item.tsx +++ b/apps/web/modules/survey/follow-ups/components/follow-up-item.tsx @@ -155,7 +155,7 @@ export const FollowUpItem = ({
-
+
diff --git a/apps/web/modules/ui/components/data-table/components/selected-row-settings.tsx b/apps/web/modules/ui/components/data-table/components/selected-row-settings.tsx index a60537110b..86ec5aa71c 100644 --- a/apps/web/modules/ui/components/data-table/components/selected-row-settings.tsx +++ b/apps/web/modules/ui/components/data-table/components/selected-row-settings.tsx @@ -141,7 +141,7 @@ export const SelectedRowSettings = ({ return ( <> -
+
{`${selectedRowCount} ${selectedTypeLabel} ${t("common.selected")}`}