From 9ef46aada9ca03b236f9965ce4da0805ed3dc883 Mon Sep 17 00:00:00 2001 From: Francesco Sansalvadore Date: Mon, 9 Feb 2026 11:31:04 +0100 Subject: [PATCH] feat(studio): add SidebarToolbar feature preview toggle --- .../FeaturePreview.constants.tsx | 7 ++++ .../FeaturePreview/FeaturePreviewContext.tsx | 12 ++++++- .../FeaturePreview/FeaturePreviewModal.tsx | 2 ++ .../FeaturePreview/SidebarToolbarPreview.tsx | 31 ++++++++++++++++++ .../components/interfaces/UserDropdown.tsx | 8 +++-- .../components/layouts/DefaultLayout.tsx | 5 +-- .../LayoutHeader/LayoutHeader.tsx | 9 +++-- apps/studio/components/ui/ProfileImage.tsx | 2 +- .../img/previews/sidebar-toolbar-preview.png | Bin 0 -> 21210 bytes packages/common/constants/local-storage.ts | 1 + 10 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 apps/studio/components/interfaces/App/FeaturePreview/SidebarToolbarPreview.tsx create mode 100644 apps/studio/public/img/previews/sidebar-toolbar-preview.png diff --git a/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreview.constants.tsx b/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreview.constants.tsx index a18fe30d764..753611839be 100644 --- a/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreview.constants.tsx +++ b/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreview.constants.tsx @@ -50,4 +50,11 @@ export const FEATURE_PREVIEWS = [ isNew: true, isPlatformOnly: false, }, + { + key: LOCAL_STORAGE_KEYS.UI_PREVIEW_SIDEBAR_TOOLBAR, + name: 'Sidebar Toolbar', + discussionsUrl: 'https://github.com/orgs/supabase/discussions/42462', + isNew: true, + isPlatformOnly: false, + }, ] as const diff --git a/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewContext.tsx b/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewContext.tsx index 68b5367357a..081a6470700 100644 --- a/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewContext.tsx +++ b/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewContext.tsx @@ -115,12 +115,20 @@ export const useIsTableFilterBarEnabled = () => { return flags[LOCAL_STORAGE_KEYS.UI_PREVIEW_TABLE_FILTER_BAR] } +export const useIsSidebarToolbarEnabled = () => { + const { flags } = useFeaturePreviewContext() + const showSidebarToolbar = useFlag('enableSidebarToolbar') + + return showSidebarToolbar && flags[LOCAL_STORAGE_KEYS.UI_PREVIEW_SIDEBAR_TOOLBAR] +} + export const useFeaturePreviewModal = () => { const [featurePreviewModal, setFeaturePreviewModal] = useQueryState('featurePreviewModal') const gitlessBranchingEnabled = useFlag('gitlessBranching') const advisorRulesEnabled = useFlag('advisorRules') const isUnifiedLogsPreviewAvailable = useFlag('unifiedLogs') + const isSidebarToolbarAvailable = useFlag('enableSidebarToolbar') const selectedFeatureKeyFromQuery = featurePreviewModal?.trim() ?? null const showFeaturePreviewModal = selectedFeatureKeyFromQuery !== null @@ -135,11 +143,13 @@ export const useFeaturePreviewModal = () => { return advisorRulesEnabled case 'supabase-ui-preview-unified-logs': return isUnifiedLogsPreviewAvailable + case 'supabase-ui-sidebar-toolbar': + return isSidebarToolbarAvailable default: return true } }, - [gitlessBranchingEnabled, advisorRulesEnabled, isUnifiedLogsPreviewAvailable] + [gitlessBranchingEnabled, advisorRulesEnabled, isUnifiedLogsPreviewAvailable, isSidebarToolbarAvailable] ) const selectedFeatureKey = ( diff --git a/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewModal.tsx b/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewModal.tsx index d3d83963894..9bc299a2770 100644 --- a/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewModal.tsx +++ b/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewModal.tsx @@ -14,6 +14,7 @@ import { CLSPreview } from './CLSPreview' import { FEATURE_PREVIEWS } from './FeaturePreview.constants' import { useFeaturePreviewContext, useFeaturePreviewModal } from './FeaturePreviewContext' import { QueueOperationsPreview } from './QueueOperationsPreview' +import { SidebarToolbarPreview } from './SidebarToolbarPreview' import { TableFilterBarPreview } from './TableFilterBarPreview' import { UnifiedLogsPreview } from './UnifiedLogsPreview' @@ -27,6 +28,7 @@ const FEATURE_PREVIEW_KEY_TO_CONTENT: { [LOCAL_STORAGE_KEYS.UI_PREVIEW_UNIFIED_LOGS]: , [LOCAL_STORAGE_KEYS.UI_PREVIEW_QUEUE_OPERATIONS]: , [LOCAL_STORAGE_KEYS.UI_PREVIEW_TABLE_FILTER_BAR]: , + [LOCAL_STORAGE_KEYS.UI_PREVIEW_SIDEBAR_TOOLBAR]: , } const FeaturePreviewModal = () => { diff --git a/apps/studio/components/interfaces/App/FeaturePreview/SidebarToolbarPreview.tsx b/apps/studio/components/interfaces/App/FeaturePreview/SidebarToolbarPreview.tsx new file mode 100644 index 00000000000..7938549578d --- /dev/null +++ b/apps/studio/components/interfaces/App/FeaturePreview/SidebarToolbarPreview.tsx @@ -0,0 +1,31 @@ +import { BASE_PATH } from 'lib/constants' +import Image from 'next/image' + +export const SidebarToolbarPreview = () => { + return ( +
+

+ Enable a dedicated vertical toolbar on the right side of the dashboard for accessing side + panels. This creates a consistent, repeatable pattern for opening panels while reducing + clutter in the top navigation bar. +

+ sidebar-toolbar-preview +
+

Enabling this preview will:

+
    +
  • Add a dedicated sidebar toolbar on the right side of the dashboard
  • +
  • + Move the Help, Advisors, SQL Editor, and AI Assistant buttons from the top navigation + bar to the new sidebar toolbar +
  • +
+
+
+ ) +} diff --git a/apps/studio/components/interfaces/UserDropdown.tsx b/apps/studio/components/interfaces/UserDropdown.tsx index 5011055e6d4..5c1db4d518d 100644 --- a/apps/studio/components/interfaces/UserDropdown.tsx +++ b/apps/studio/components/interfaces/UserDropdown.tsx @@ -1,4 +1,3 @@ -import { useFlag } from 'common' import { ProfileImage } from 'components/ui/ProfileImage' import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import { IS_PLATFORM } from 'lib/constants' @@ -25,7 +24,10 @@ import { } from 'ui' import { useCommandMenuOpenedTelemetry, useSetCommandMenuOpen } from 'ui-patterns/CommandMenu' -import { useFeaturePreviewModal } from './App/FeaturePreview/FeaturePreviewContext' +import { + useFeaturePreviewModal, + useIsSidebarToolbarEnabled, +} from './App/FeaturePreview/FeaturePreviewContext' export function UserDropdown() { const router = useRouter() @@ -34,7 +36,7 @@ export function UserDropdown() { const profileShowEmailEnabled = useIsFeatureEnabled('profile:show_email') const { username, avatarUrl, primaryEmail, isLoading } = useProfileNameAndPicture() - const showSidebarToolbar = useFlag('enableSidebarToolbar') + const showSidebarToolbar = useIsSidebarToolbarEnabled() const setCommandMenuOpen = useSetCommandMenuOpen() const sendTelemetry = useCommandMenuOpenedTelemetry() const { openFeaturePreviewModal } = useFeaturePreviewModal() diff --git a/apps/studio/components/layouts/DefaultLayout.tsx b/apps/studio/components/layouts/DefaultLayout.tsx index 992e2cb74f8..119af111da1 100644 --- a/apps/studio/components/layouts/DefaultLayout.tsx +++ b/apps/studio/components/layouts/DefaultLayout.tsx @@ -1,4 +1,4 @@ -import { LOCAL_STORAGE_KEYS, useFlag, useParams } from 'common' +import { LOCAL_STORAGE_KEYS, useParams } from 'common' import { AppBannerWrapper } from 'components/interfaces/App/AppBannerWrapper' import { Sidebar } from 'components/interfaces/Sidebar' import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' @@ -8,6 +8,7 @@ import { PropsWithChildren } from 'react' import { useAppStateSnapshot } from 'state/app-state' import { ResizablePanel, ResizablePanelGroup, SidebarProvider } from 'ui' +import { useIsSidebarToolbarEnabled } from '../interfaces/App/FeaturePreview/FeaturePreviewContext' import { LayoutHeader } from './ProjectLayout/LayoutHeader/LayoutHeader' import { LayoutSidebar } from './ProjectLayout/LayoutSidebar' import { LayoutSidebarProvider } from './ProjectLayout/LayoutSidebar/LayoutSidebarProvider' @@ -39,7 +40,7 @@ export const DefaultLayout = ({ const router = useRouter() const appSnap = useAppStateSnapshot() const showProductMenu = !!ref && router.pathname !== '/project/[ref]' - const showSidebarToolbar = useFlag('enableSidebarToolbar') + const showSidebarToolbar = useIsSidebarToolbarEnabled() const [lastVisitedOrganization] = useLocalStorageQuery( LOCAL_STORAGE_KEYS.LAST_VISITED_ORGANIZATION, diff --git a/apps/studio/components/layouts/ProjectLayout/LayoutHeader/LayoutHeader.tsx b/apps/studio/components/layouts/ProjectLayout/LayoutHeader/LayoutHeader.tsx index fb066a47a13..2f3aeaaaf60 100644 --- a/apps/studio/components/layouts/ProjectLayout/LayoutHeader/LayoutHeader.tsx +++ b/apps/studio/components/layouts/ProjectLayout/LayoutHeader/LayoutHeader.tsx @@ -1,5 +1,8 @@ -import { LOCAL_STORAGE_KEYS, useFlag, useParams } from 'common' -import { useIsBranching2Enabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' +import { LOCAL_STORAGE_KEYS, useParams } from 'common' +import { + useIsBranching2Enabled, + useIsSidebarToolbarEnabled, +} from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' import { LocalDropdown } from 'components/interfaces/LocalDropdown' import { UserDropdown } from 'components/interfaces/UserDropdown' import { AdvisorButton } from 'components/layouts/AppLayout/AdvisorButton' @@ -74,7 +77,7 @@ export const LayoutHeader = ({ const { setMobileMenuOpen } = useAppStateSnapshot() const gitlessBranching = useIsBranching2Enabled() - const showSidebarToolbar = useFlag('enableSidebarToolbar') + const showSidebarToolbar = useIsSidebarToolbarEnabled() const connectSheetFlag = usePHFlag('connectSheet') const isFlagResolved = connectSheetFlag !== undefined const isConnectSheetEnabled = connectSheetFlag === true || connectSheetFlag === 'variation' diff --git a/apps/studio/components/ui/ProfileImage.tsx b/apps/studio/components/ui/ProfileImage.tsx index 2534e060853..7128ad3f819 100644 --- a/apps/studio/components/ui/ProfileImage.tsx +++ b/apps/studio/components/ui/ProfileImage.tsx @@ -13,7 +13,7 @@ interface ProfileImageProps { export const ProfileImage = ({ alt, src, placeholder, className }: ProfileImageProps) => { const [hasInvalidImg, setHasInvalidImg] = useState(false) - return !!src && !hasInvalidImg ? ( + return !src && !hasInvalidImg ? ( {alt_t&}tfARQ8l ziiRo>dKCiFkt&3Qvx575zw`6^bIv&58LwkF7%6LIt~u{{m+QLj`OL)V4)-ykV;~TS zTlelwGZ2WK2m-MMA3XxR6QCy~1^fZ~-nH-tfli9C{vXmcySNIxdC1@Fjy9;MEzM5?{GtGLi$8 zb1f2xM61fh+IAUCuZ%^#p}>cVA+Pcmh3q$pW`|5azSBN@7iuVGcH;gn_HRtmIku-t zC!`H;c%8X%UrSF^)Gm%CiEpOFm&h6(B_G*@H&y`Ku=1pY+jgMo(yUZ(%g%m0~;{~sB{&@QJ;)w{m{ z(?%}Y22Va&uAa?a$PSrFTOKI6H~NfUTn!$(c?S5nLCBYKrQl&fR-k3I*Ep#@YrDm_t^LTcPkGlLpz*p?sb>E;HByPYxhbsu`Q!f?NhA#fO z7SE0h_-(I^-(28^dn6oeMPyHR8)MKlN4oiFrxtzj_100=MvYRGZ3f$g|N7iLp?Tw^ z*Dqz(Pvb+0F--)JS3bKd3 zpFDIDc&8yqbANB$+3ix(pPT>hdVw?nKH%z8b0>;}Zw1Zer38j;FH3Lxvz~}jx-uCj zvdo&8(mMKbZLLq_dWLfvq}h=$Tpzam;$X%hVN=56153k|#bG@eV;gVZxszDS<5#;g zlTlk7xrwt`2wWbqNZuYtq3)<3jQ%_{&@U|NXwtW~ajF!jZovAa1M%Pm}! zQoratdZi%K%o~LJ3|Iwa>4|{t&(~+v`yyu5$FH4!g2d@ z-KfK$hC0uokC@@Q5dZ3dzoCabU`_a`miQoJ2;-rfHL2U_=|r5?MsD{4_At0~Y(0DX zn&~UC2KPi@X`@ud3ia&KR#-gNxgm z^mPSwa%NrDp)Xe_u4XnntjJ^34`K7_?KwFrvfmCBQJMMgqsif{Co&_p1{J7qaKY=- zs%A2M@Ydr(Q9IZheHC8AM#swd99d>Lcy1xxqv*;ZcxzGp))1eQw7?;FhS6wEz=CW5 z2qbq-z;(wsT&AOsV1;1AwVVyZhwc4pX=Ol9gYYo$x_Q9vbfR&xUT?TjzO21Ap~n~! zF|(8G^mQVhF%Ta>XeEAG?@%wMHwlosq~oNmDw3Q@_}nuRfaL~1i-8YU`pCi%V62%b zkuR(cB$da$KPQcLz6km@>&n@T^{JYS^&;APrZcGvCEWbKmmq)z-< zc#{u9?)^nJG{|yw7saHpIgU3-mQ-jjVz0%wTfhsC<;xe6Y^5D58QUgp2dn^wR)dy+ z-5YP0u8~FUw2qqn{b$XugNx-C#TZudPOB4*(KJWSs3*EebZ&o!vX4yJDVaM@(Jo6O zzZ*De(97ID!8#$bD^*jky{{Z44n5T405zmn-fMX+{{r5G`-_9;l>AY-Ltxz5@YO~> z(g!|CSP{4^S(}s;yiXq=C!7qC4l%^rut@~%&9b}oMY%p;o5Wb!<8z1L8f#xKG)YEX3Hd!4*D7!r6G+IZ z?eU|b5k(aDJY~|aSI)?b9xRKrf2AjOz5Z$Fk7wds!tAO4aETi{MbiMY(KE)oA-!}s zIB4aBe2V;+f@kW0zYN$KbWOQ3reNMzNoFkZM9t|1qtk2@Jj15GyvkGV``{XC_@tW@ zL9cOZt=^x@VY+QUkqytK5A~Da%*=-)-ImGc zIiuElh&|&Gz=5dd|;+wOkJ&O@&(KiRn7q(pOIup!tY7W$XGIMhoXUA{{SD2v# znz@w?q(4z2$2W_D0z~KoEoyzQSwSM(v;I8jdMB`rD1N=ipJ_nmCixR9_&OeFnMI&E z3$F2#_L=lrH@zo~WO~qkQP}8$t@3OQxXim|?vjpDl%nVjbFB;fE{51+3&zZ8<9s3e z`dQ7DD>~bLFWZi$f^f2j5Pjd|JDo3ma{G35Y`3p6u!rbB+fkaiMNVjoKPCmbZ@{hZ zzN&Cv?rxgoIZLDF4zJZs?lGTlh2&^-(biV#R@V!trSs)hU}M*^{8Z3bi0d}NCjtkx z&T|OI5=)IF%4~Nih-3)@um|dC8FU7HJE&E3Hc7DQ2M}7srmbFdPe5+CYOoyEdM9N3 zP@>|T1l|o{N8^kYvK31e3dHY@zz{aDzIHFU>GY)23*Gv%(l9$bcY4)dAaeyHni(o9 zne9EZn(N5(YO+}~ft?@x>c_7Zk(>b{`bPD+Fu>tj?AB@go`@cOr96g=&D7YLPE>HX zo4m6gu|0~2Jw7wyceT>BGn>!%jEe6&D+yI^?T`MQnw8foI|*Z*A(z@L_2oZpgpp>$ zC=142X|dlLoW#xzl8JV=Kx2TrkF%oB@H=gE*O`I zBeZfzfZqs8%zqY^0kuDL{lbyI67^-Or^OaFqO&6l-%^sHRUa?S{_cS=dT31P%8~BT zfPNc=PMe3{Z;hTnSeq`RrZ0%Nd8gV&pvu}pX2SVDUVMt_Bz($!QjVROE6B;VT)}ZY z`&PMvanX}QTVQA2zNm!SI)@B8rv#+fMTUS$W&}k;)fRTe%?QCHcRcEsEb~_Nxz=$A zQDw(Qk7mHgYF!D|e(fMrHSxGKvd_>YVbXdXoXFoNekvZS-d^E_8vXiaChsS2YUhuk zHqC8;d+C#~5n%S5RgG>@(Fj|MU303fMbBEkay^E=8V4CEQ3CRcccKir=_MZ&ePEa| z1!3L;6D_%*?q#cc9Q72{na3Zr5F#GB`}O$Q(BG?*X|o7-V?6Zct=K1q`c3^@!fnd^ zQ!$8$%F#e8FuF8;qeG8>!fiedaVP$)v_MbwS0HgRcMW|a_DO94U#2IPe0!bf3x38I zIUO{gWNvgNUhG5Ybi$n)GIN2fh3`9BM4J!i4mQ_~et zl$}&DQ1iS~W%yofgnF&2%`17Ad z2gXm&B=b!bWp#9q99^Fl zyO}u88<){Op|t*8q)%nIVsnS7#xU_1Ve|&v5uDxQs1$L{aA@Y3_3voCB5uBcerBm<`qsLtEE4VkD0L}i$mHy^qM!W`5Ti7gS}to^#g1<8BHf@bC2Mlt0hW>4Qx?g+D}frJf?pHmvKY{H_XH7bDJ=Z ziY(f62@BWSrKkGHUCYt?I5<{Z{aU?)KKwlNyK=iA&Cm4I3onwbYvla4QN~9#VaE@p z?oc}-K4mhd?3-K~G_^Mkw|2JR?fDfQ3CeBV!qi;za??$f;Tdc5XMC!~_?+ixOVi}l z;{Bod9okNfO_s&g;dp)utx0XxLh_zpo2Pm|oejpw8msnq1>z5eW&ku@6x zcxA;p$_f)fT0@Ju4QUxL3~UYLl#T4LpD8Bw`m*&O*&|j$I>TxfifWg|TH4#9MfN5* z^q-)-$zm1)5WFv`yOBr!?Y#S3)z2X`F^4SIHIZkR_sp1JKR+2L#7O7V{d zu1)__enc(JO^z(Wsk#DvmS_6VPUa@ROJ2NjtN~5wa;{12B_7+4eO~_Fss)Yq1f`Vt zYuTMEUfdn$1zs~i9s@g6#>FJcal&A%n@jy(}0uZK+$unBVQ=d+qYAo=ll>Ac!Zwk*H*!OnV@A2=4UrpkDC4B1QFZ-2rMD z`@_N~-&#NTd_w%NM1tT3U*CtxFw)ibC(ZWG-+|nU;x!NmPS#?~8RtCw+csX+v)0;L z96G;!>bdD7qYBh|#<<4DK-&4*?DdJOYuu~$PmJ~lnnUAgJFK!$ygf?gx21x{d4~aO z9X9^!)2H22-%L^ScctO>RFGqCnf0p+u#;c|K9W>^5RBW}{f#0w#+UM7{$;e=bmn^J z6Qs-={|w2+g*Y7x$Z&r8c{)yDa%bnOe>9|-u_|!`N&vze)K#oiO|V8q;v9uUpQL)u zrbJ9{ihWo>JP>nwVT!T~IOST={y7pgT-ULPLSE;HCNVdQQ^qmuUpB|%)c&ImS>N`|wLd zY%VN6~WG#pvp~YD=abTC;etArT@9i{X`2DUbt*L73Kf1@E%{VAu-Z64ezqaf)vyo| zdM@I15Kuj=&0bq;rzcsxPT5b5-&MyHPXRt=MR$@q3)$aE+30iEWdx$q55cu_*>5QR z$D+_O1QvJ3P)Fuz&nY#Sh~iy6IrHYU!p3f5u3z;;(WFVXvGZNK$V+yNc|=OY?Bn|V z+QgjCp>2)F2#b>Be(-C)BIi+4olQPlF}c<))&9cfgx%Q`2BR6W*R0!o$A2$0a)+Mo zRdo+5M2E=^ULw1yLJpmr(mMg?)>!k;a(HCHY(?$JwsrzmeX;;Q1Ha4zeQDc}jO7%wEQJ(D9i8q9y zzi@COEh59kM-iUG^xYa+t2Ko{)@so$Yd%d=@sKfTC^=VCO|!uAq+zP%4wcSM@OImYa&k0hG^mBp-4?EUs6utJ#2vDAja8_9-SydY}KP4e4| zG$t^A@rCEjyZNG`=anZI5l;17t`z1%7s=8YJw@HVIGePt-@Kb?we(1_Q0ZellRk*5 zR~@^fwU&@rAsh~2uA`Wp3XKMji4K#n7mVU$GnaKr?;NH}pVk>3duV1wf&1|VlyT4E zBSi!4%n^4ORN|$(7?cfXc?+#&LY*Kso5mhC4G3(2%8B`=uShw)Pq*0KRzNf_m^Q)` zvHQtimZWZK74sjN4Z7T%zOZsjtJcE~FGR{$4c1CgSX6}+@M>2Qq9eqi2=ot8Xyo35|ez-p19>t4>4a1=kQ6dmVZEBJ>zXPE0EHhUI?e zX811k9w8R7`Q!do^YZv9tMOg9;BJZpHpbNLx4O|&STk;eOxa}|Be~7-E(l+uI#o9m z<@!9v4)*25FP4d1x}%*7)Nh(bmz6q*nm70fU%Mv48{afsf=unSwauC)&zZs?>i*=& z{271IcvqwY>FHPh=Ga9Zh2N?<64M*?`p35}K-Mle+oipd)2w377c;R|GOF=NgD6Ez zXWrn4APWhl7EL%{t?TLiN$331lYf-=907pNYmOCN_k8bXsedcp;@*Mibm*d-JS+$rPM%}ClH>)l(0$}#%)ckNm``#d2j04N-} zEy8R@rMit}lZV+=z;E(J1)6v0t)Km4c{)zA=LzAC7;e@tD65NjHfiNd-I19ti%1S2 zs~X8*1+XHP?R`3&$$Hv2wRIPXYaM8TnF4UhE8QEfXIN2URtf!9LON5i5NP~gQZ6_Aeb`1bt@X?IH zBeNIm&PDvx5lOdvgTDUuPj)AK(w5pn_d8@AceL+CRAT_&v1!K&kr}6xB>+NyoFiLX4CDmGDdX4aKq4~(d@w7tIi%=CgP2cp7z?HRB3l^^8GNjxgTaE}RA?3Gc4Z z1;rcY5udmAxu3FIvar8e7M>a7;S<~}Oj)_ksPwu*6^)sKOYCdkw-mZr@tmfr}oV|uSe z_DeKC?`_7NGgAA6g~7nVd~(iTe-zr9Fb4N_bwn4W!Wm=8Xuh-5vzFzm;dYO4)h@@a zpT-~<>#cqRVW}LHWsOZkwZ52_wu?*`yp(E96 zv~}^ESJ9|`D)G9zZ_~5AY995>Vuze>V8mKk@_fsu+7{ilf(Pk`^)=ntt6@<8U3gT37unyksfgtM-RRGyKK`*sKCx# z8?(#p-<02Ydj=fs9*<)xe+N6eZ{8&dp5e;kdrG~%7*MN`z2rWCzJ9qf5>n);pu%Yb ziCMt4e0_2=LdL;*zlt>K=|he53O0HiS{If338su%k3}idNn?MWx_^$n;U#juH_f!h>}4T8v^N zBHQ@*+v6T3k2>B7W!}`rTSILC+KLu|Q8+p?J4FR(5d&E)Fu!jk9+_~%`Is}O7Y+v{ z4{GV;pI-?>4Tt`n^J0eS(Hgk3e$nOjLXKV2hdPqwE10VqUbJUoM;eZGa`&h2p534^ zC;(o9iJEJzrp_+NLE$9!PvBTH*l_V%0=k9)7Isg~oNtgA?$v95ARe2#P^L0#9`~76 zrU~&cMllv@^ODAQ!g;1SpM1Xd*6!yjX)t^>T12XqRU?lo_FI=tpp;7^7|QZD`aXb( zeLN?SK$5Z(bGEt9@UXrfW1K#=os50QehnOHb^;oA^tQ|pztBzYM6FGXal2>As-zBk zsf|p7N4YscZ=UxrgQ&#kdHBTG`9YceL!D1qv6cW@`MQ*B|H+Y`xF-l}t{ zgl}@0b$!s&ZLWb0x?hR8%&y$(i=Upm!5p3K7@#W-l){P2hm0k@9T91j`v45Mk?#mC zxrKh>JUHP<9C#+8u=!}2VTb5~bL}FIc~<(%#LlbGh~^HTlHFnyvfN<5q;c|XwB}Iq zKd!<(Da6a@T0v|IO0s)c;t^Eq1s{@Xi%38ftRW+n*V3}+7BjA5^i-!O&`1F~SzN%{ z_Xg&sH8v8txgB0ob}rxS!CQsD`*Kl(b`r%WCFxZFQPvvip8-7qZ;~uKUc_Qp-rbn$ zc+=0D=+}zcRY)T6#Opsb*U4hHwqvfP=!+RZklzBq9zZ=`lO|D6W5b=Z7L0mo4Xebp zv_5e6g~kc@VF{6M6o2pXo!X4IY5q_XZ%y2=^Ehi<2#dxF-R54#DW$IPHX1ZQE6-@y zj*&y_9A;G)>x~Qhi*GIeKLVpWQ0-S3cHsdM0uXT3_$?y7c#DZgnzABYRdL?3YHN$Tgk? zUbx5tq6wxtD^xVIYRRWU)*C=+HIW{6923n{$^$vX(Fj{hua}Lo@v7TjD;B{9!oc?N83J4$WBO<{}%C` z6fkaBKD?}S4CHZ>Jh)hBYg*=IRf*f?Z|lt!s#YOrzB>}vOua{?sSIy!R^m=rRm+KR z)qY94Rf1Y%ws|*KwBG|O@_nSfc!!4!um|;WJ^Ri(H={PDLKof)_gH%sN`MM`dX8X+ z_;E^cIkyWFCIiaZB>2wJ{_z`O>JKW>3x~x|3sF}JWCa2hH-v&Ro*;kjNJBL{3b%cV zX4mOiB;8%R5=)w^#tqxZjurAg)4POEiKd^Y`_+WJQAAlK>q6}fJ#sKj9iHe!xcHm2 zPve}4_l}AJ*-z1NrwUOwh9GmkMltgg{<_eJ9ZC?Ky_@@GBJh0&&O2q0og+u2+-84d zLCY^=34r!4;e|38J{2y%qFanrQr6D|0*kFSOuAiPagqkG5@*-jQ4%)!qiqpv-?RQPl9OSaq-PKcm4U_NxW&nJxrzs`NY1E${y<@0~wv z&W7g}R(dFT>(aTeFP|_3TS4%2OEGlk4_&3aPA3_C7_~anEJE>Bntt1pD7F5i@uP%Y**JAXM55R$ee%Q- zi!aAJRCi&}2!MB9em);}nE3W$o!((MNh8&1YRf_Xlegm5Q$61R7I2O?{6kg3kZEW+ z0eEfT5})HCg8|jqO!H84u{t&1iH4hW+gEFiypg`JP31O^Z(TR~WLP4E(Z*;F{dGIh zlMT~ORraB_c_J|G;!COv6P{*-kLj^|LTXQeC=R+@cKIwzRRQqr;9|d$O%_vb!Wp&G zD!`T&BAbKJKVu6E8hLPMM+4O?Jk~{U>bDK^+J0sn{*RS}i>T)T?|xpiFVR@bLgI*$ z*HCX((_a z5E}fqkYQu`hol1kZ7-F&^iT}QK&NRRkTe7dD|<_!j6iQYJ5Q3>0Y+OGZv8aifAQJ> zH(|pDKwD0T`F%(4SBckA-_d5Tms3@ zPWT|W=U3GF?*;;$k`S-~m->kY4!ISe&q+2P<9DP*W*g^7MU`J}CXmB4ZLl!&02oAo zS43+>6R-}$t>b$DId77jVjJq#U%F6CCehJ$J819fQ`!UhEImxyc^wXaeP5VtxBMr$ z${4HayXt|90|v$TjgapOoJhlNUb#oqR@<#oKmE_JWEl6JzXxMomizm98k3cWRbz)T z5iY_8QHP^hk7sY|H<|2HP-c*Nn0OM9J^1EyNr*D_IF}Wse*x&SWb4WBB@ep=t>2Bj zfxM7C-^!7Ve?=09Tf3Sp6HMX+^YuiPqp0Vp`HI9)fOvLI#^nxeP$Y|`sL0k6PUXme ze`OVb0*4rb0K^ts6_wH!Z_pF-<~h4iaFJyO4IV|kbRc*!X~MC1Z*#&|%JIew?;6av z2`t|qZXX27ym$kSEwu%T$AfQt3CI~>n_W7*X!`ixjPike#qgR-4lkgq_@leoHvoRVrAH3>43HuJfk@~7 z!IvL5)q|E7S-<%X#*$wE3csPH0S!0F$avx5AP4FvW?|KWhrj=nLwZy8hjdXxzch%m8 zXFd2LIJ&hoT$pk(}v59Z;qHukxF6Pv5$-O&4fas$GT6LQwb$2!CoWyKq|J#-$otlT> zgbs>_!O>*rv+DH4vQ}w&FiY{lgt}aP$(pMZ1RnA;c0~0d{6+9c&H-U^qYuzJ)zFlr zs`RdJe!UQ%^v-Pri(xlYOi~N~z1lWao-PUK+sb6>R+~!qSPiQkYV-Fqq5!+H=SRd3E?{NMzk#NH4P|Cwht+LIK?eBKBTEx?+94yy$I@ zd3;=PC=~~|l#XqHR$D|`0kQ)S@jNxH#IleNl=_if?`r!oK-MJ2rH4$uUif(xOQ{yK zZ>@GozKuqD#Q%9BV6!-5Lez;uRFH?I{At-&-TX%hNfu1M*Q)(>%9u|zKvYrd<2i6W zc+r50#;-3?l9&{G$fu!_do2blGH{3{%SEW@y8LdFBd{cKw2Dl50~PM}mNc)2dD+`$ zYD*t`T$*s#?)ZcZOk7r-ZM&VC241)15z+G0j#s?S5@>-Gy6t3|%PN3`W>M6{sVNpP z`heL?{|u>${rY z^j*wF%MM$AAd)V2s7$@|Gg7T&mu>EFWsO9y6BiRU7luBTkCrKRpl>bFB05Z((5Js% zRR&5;5a>T?2}QBj!Pa~arGkF??fw4cC!<=BX%%~v#}YGJpR}vP!M|q^_H}e?f4kH# zBfqY4do0YSI;X$SEKfKQposwQrvf;G)-^yU>FyrenW>M(Iu5KhphL&>uW)zz^UMis z{+@~t>VY=lf|%=G6j3;{!(Tr*FPA=l;62~n9nZhJY2qP&Q7-oI4av>A6g_OQe7Ib9 zRYbabu;Tix*wK=C->>XQED?U-O+f7)m{NBwOO=(O7m{ebp3`aryv1kf1c+qi+V3PC zDHzft8dzu$2woDof^!q(D$d^BQ>J)fwDFNAPU2Xp4e%KTYDZ1uFweWj-Q0w82R^H- z7?Oh&r%~?!L@nU5pi2<}Kf7|hgTr=imSI*dbft{fXh>xe zR{kGRI6-ch6cN@kUq%A-uTh6t+Kn0nd6$~E-37@0Mh|o%)!gfv{!_jhWOFYXQ0hXqydPek(?5&Yb)IBhj@iL`aq=<uDy7qpGXe`JznvenveIZ&k=7@tjua z(%k6M8TAWgDM?wPP?}=I-jv7+iLvApg!cv)j{(6r<+_9sgt5UAzdNV-Vh5Z!XKtd_dRphh@$HClgiNyd-^;z*DpY3zI}&W|XRBIJe%Ah#S#)8H z8SIRsN+Fpi5ivf_FK+bkg`!dL=JWjsSmm$HeQ~^jFZ#F#<2Av#*02~t4*QK7_3hs6 zIa=b56mPJMV1-yBsC*Y2dkU<$hJ5@%7pDI5?R+s;?Q_WfI%I_vy^=)3LZndHTfgq; ze%;8EjlkUVx@&@Vc#L^hvsl{dB2?*GWp9&TLN9DFL&GwvaisLu=Ej=kQUY}5YpW3S zszf8KPc^XRFWN643>L0gZ$0?g(?j^A$G=@zoJG}PS>+q;2h}~7T^F2? zkAXbAdIAA{?KcwR3NB%;$?lh0&GB`YU)DLgLzaKI8i)EFR||xcB&%_i_&o7GKvH1$ z(BKY1+tNT`{Xv***01FLcD#8r?khv1Vga>}tX!h#+w$3ezNmxWwS;XGv{;#4D)6(# zkdM;a{8G}lq7(;&B`QPrxF$0s8}yDQMqG^1FNarjD!q>taTy)*mt1iD(p>kY(c*|X zIN9Ol)kV#(T5C+F`nx&!wod~h&r{Yr7YbJ%Tuj2{j!s1K4>{*BvhB+uRHA5P0ArU) zu&ONDQ=PRLe{uT#cry<5GW4t}oDufbBlTuyG5YcfLWo!}3*$c1BOqD1(M<8`y|=TY zyS}~aI;7wo49s_R{pv=U_!9)|tiCh6PuG7t4~PQu=K#+f74lQrXNBV;IBNcQlbe$H z3Ws9(gTRY7zx|qZpULjZJ0hD9L7lkL*lvG);}LJT{UzV|;+(<%p!T;>`yZx&f@7tT z!F9HBS+b?Qv?zzM)r|YOUriq0v)S9;XO0`YyVz}8HGhgn?M;buV+_c|(6b?X_`9HT)IKu};_A{k!iOCLT;Bzedxw$A#ef1=QO|2$ zi*T=Omz99ppWU6j18LBElh^_vCiUZW^{AJbtyW`e$rc&a1vQv#R8yL#IqpTNp_h?u zWqS_)Pp79&p;lrS_3s}z9kGU;Un2Xzmir@@`ezoa(O$7Tm0jtGTD3P6sAr{srOB};eiR8 z;EMT@H^hG4ok(bKvTPrrw-0mtg*`1Ps{gpqw0&fu+O-~f3O3l^xxd$$vgx5{);k%6 z0wfX2{A^+$Lw@GQQFaCOQa5Kqvoin<8kgW^)L|Al#nt{T?X8=kj`HkQaB2)Vt!azYM)#CLd zdmFaCHKzwD+-RhDmmk7{68)}6r{G*$C{TvFBH)bdnt&&NKs4BGL5iU5r~`=h=t$cHs4O1 z;yt^an6o!MKo``A<8m<2S#>}OfcqVNgB|R!lq2z35n>JL9#+ia{<;}O=U{u6|11g@ zJPV8E7cx`POiWMk$viH(;JHg$Z}p6J8_0f+w?v<4Sqb*NFQ+(1!41{blLG(v^Oux0VPY_d>dV+k$#AI`vKDD*V za3pAPz_g-W$!(@%npQu`YHv7bQE+_8@2I&)_P)$Lz^^A(MIkoEATb@5&sQbfk(H?c z5_XV=eChHTI~#3S&tX`T7Df&UBR~2L5ZTq@i@JqqxhwRqrSO+xsWkv5VstEtuYr1L zA^MSx1X})~Pv$wv**6i?G+ug(;i+Uj>=Sm2ka%-xwErS+gwtGa&a<|gNXg${fc4FJ zQVAsZv(6E`VNlt{?-fp3kMIukxA&kqecP9+#3RYY5aPqP1i_oZ$D|60PVhQV6Jm zhd1Lh7>r(H26TIv%otwhDKTq@*?Bxp*qG6S!L&;j$vlUh)OKMoPB*6TaKNV#&Hd_FRmaB{CqfR9>io{Njh0HoezX^j}f- zF*g4N)oagJ5)z@dY39Nq1A2jghBA0lSxZ6J5f(e`# zA&<9d`>Tp|MkMy8-rRchCZ0a+~9S=j#K4A(sW@BZ|;I4I)#x@=q3M1 z1`&U@a!Y8T^+BxSKu(NW+tpV;JnTw!Hw7%8nHi#wOQNByHh@F0$5`3OUoXUAFfo(D zc;_s928F-^MsSI;gQ6@pGAcU@a$wjO zd>^DLSlfbLRVH+4PdBe`LXOOGcoGpsrQ{rXb&h1CPVcG&AXU8E7vXf*t_dd;PTOI( z3}ARdIuCA?$ayvD5}nvQuuHctr3DMTft}ecX+gG z@jvB;2N-IP^{XY`do3*3Z4rkoQUvE8$R=umn#Xk)DK-sYY&Uk)4`B24P6#;$0pMAL zubpNLK^ty9d*`1n-p$w(0v?%@G5UYoqWyo*c2ZhIP<8h035KtVl^UeEo^?l~= z7KqkHRfy+m71b3;0TXTS*fn7rBl`N&8l=j8z^1tTPb0ESOHd^6L|+ZN=}y{LKV&d< zyWub1Hhk+wp3vORY)%eEuF1VZ51)6ecx^~NQ!y8N3{Q0%T^_Bq1Hdo)Cm5aYJZCiq zuA&%}qQ;qde?rc2SJASLTWrL=QR=FDrisi#pUdy&rhk~#&QE8}4(qAT6#83Y4nSH0 z)Ap4b8L0cFyp_iV)i|hvH~AM0%4P?)f^31_lpiJIyJe-;fCrS9QWWh2H1?H0kKuPo zP5oqxp`vpX4)~ADQvU6+J6e4y|=Q>cEygk`K$h z=BeTk5>A<Z4nafP&~WwLZIDQ|FW?!>yzNs(V){0%&0dK^B#_(_D3WEo zMYadP9;=f~0{@c(-osOD3vhiYgB(5d`R{i`mXP%<*hStLa zHxX1rN>bK_fFJTcfc}gC&`omP>;bF9);$52D3-Sx51GyCCp-if&$mUt@ES3q?*#&t zpvlFfPd68a7nBkQFHe1X#xEP<4P4{*RVo7W1%MOo2%1%y(MDJui))tos%7Vw04Wl1 zRqwg`!xdhJFa?@*cjc9A0DMo;Ae(iDsXC?FoY6}?mfxPC93*MjQLW^y{LuH`i&*7p z-alfD1hY{yTwJm~+dHnmTdSut{a6)U*tbwtajhTAHZkz9EYxEj2(_=(X>aSDOCBGUsq=(miQK3F55`HfwgJ50D=PjiLlH=7j{C}11xfcd0% zJ&A(vi>2i`gzX08IZB}sO}K;ZLJ-IU$(9R!DRvRSN}%fHU8gn6^p=OpJzOe2v3r0A zkO$Z@{;n+Pw_~OEXieIYZy?+^07y%1kjTjcmvo0~m5I-kKsBV}PNRT@cm8VMq2C;M z05#rq8_HbOi#m+IjnR6Z$5qOA{ESw3aK341?8$u5NNjd8R!FiDru|WB3V=W)PB;>j zQ(breTnW$^)&TvIfXUZ>q@zBZ*T^y-NzYA-Rf&({ApGB1a|;8W0kg& zaG6N?mvRCj)e~WB-^A6U&{8?hI|jHD`2^iAXmdUko`-c`pJ}HhUzeP7~T4d zII^~rWc3&qvmB7zxbc+o=6;U3TqbLm*kCXLNiZ8HLD zga)j+FsIJ|F?R$&^X;1OmUAGYwY-5`E*0q2QuhCAh6R(^Q~e$s1>vISEP(y>zuR}r z%AfvE`!ZpLHRen9KyTy$6<|{v7yx*$1y-NU#$fK;a0y>ykZDK*6PaxX%R7I%(ciPGT2!%4}Jyxd$E%~^l z@*j!3+OVp5k0vcFb@zEC=B4uLFuK=t;wYtK(5&T z50?NQjmTjvy4JFC9afLLZK>@U?O>qiYx$oSGV@!DgXU+$CLVFroTP3uz9w7%!W^e4 za1%LMpgSAr=T76T2M`;2%q7_ zXPft!^9!qW69k$OW8i;m4g0Lj;JgzjW8@B)Vc@oD7IMpV>mA-Cvq#i%j+X}@3aCwg z$xcyaYC;9*7Jb;QWqTeh0nMa0E}e}>HOCNp1jx$ zQpl8(A^rZ5u&_zDW%Ui7X=5=G08Ky?y36VyywE=gwCY&&5jkf(A~=8#h}SVqHJg1_ z`VhP+(5X}W&^0?GKQ~(H&&eIgBz9!kAQ^??c;NuZJb-`y%__2Zeo)k{9YEJN=M9)a zS&=^g{Vrb+*}2QXnG1B2u}-@9!~C7R<$R(i|KGR%Yk!Hx0N-f%XKAP$R|`CDoL11V zS7iXejr_FF{qwm0h}G5n{_z6%WO3l?p_4DpA1vd^r9La4rGpjg$v2b@k%@11{IeLh z)F1vdscyV>{|66n>+3xScL7~HfE51c<^P9gqajntdt`uRo@b;u4qTAj!S-PZFD;tP z{_xoTHH@ucR$FljNdM{Q|9TS;eOwO$3>{p8Jo#sfN@+_azc{e@QyIr!&{&uru=j8M z_a*C>J~>`FFv6(Ae>;{y|Jd4Nu}?L>z6iH6*pYy)WZu5}-?v$Zb=3ZNE=ghN#POir zrBeTp>%?;a_|I4lN^x$&8HfMicLpc^VYO!rgFl=$8(0&FGcd+XEIpblEaPRf6OC9-?!XnoK%W8 zb3+s7fnz7c+9+PYSr&QcB`aUZlB(E|tccwjDp&Ns4y#EoWt|ORaH=;Q2xkAVTzD%Z z2F{9bLH#yC=*h>;7e7&UStSU#^atRwr7Qb-w;2FszjB|Ii-JHxy^c}n=U7}ZDKvjx z;t)V}?rc=)QQ_VRT?=1?eLS&ul0i7b0-*5NOktfS_3nyQh3A#l_jlq03BP6cY2=6F z^!jnD*!_szo}6V?v+*)eDy|RRi9LR)iW1oYQ2TzZk(Q?8+dxV6@Z(exD=OIYVAA!< zwqg)Dzdwneq`uVD;Vz3`l%!eYDCqAVKmUWn-W)FITS9_YBcT-j!z zqPLacvYgIn!wnu};zXtHx-eM~PnrDlKf%pv02l|KNldekw z1tu71LXcRvEm2{A>W?$+2D)UC$%;-wVpMo@9|mS6sHdXmBKC4H)TN~2Pwp7|l}Lsf z=jll(aJ+tt#hJ!#l7x~XTTw&(G1Y6P!N;1{S}^MC~| z+Q0eZZ?Q_YA_dRg2PzQO4{lWg1_d-A2ILrWR{>8O&BCcbpjg(qMiw2)4SM&{`AguE zQm?E8UnNB;pgu!#ME`NRCW;S-s{LmNhA%$F!VqbXR?7hELuwLEnlF8xKVZ*6v4Dca z*P_D}X~$L=AGz^f?2TTOVv+8~u;b<*=c|+Fhwb1=jdC0Dbt8#Fx3cc_PBor09AV`w z30o`UK-0WZquX6FzG{U;S37l^MLU3AK4e+0vlm6{H5B?veNm1MNK-gl8A8d8=l;y3 z*)Ecn{0_ju+i6)V;jY^dX3PF5kI_X12ZSaM*B_ti60kt1Om=n=7%6k@%v?YL1Zmo! zixQ?6t8mh#Li^MK*9&TsK%25QOZ7ghGq7Xwkws+@1TZi?!rcM%k!88(2UD8b0~`Qh z_88A@yb`%xtH0T+o%dXl{*}~y&m+@ay05|G9w)y6OxLoc&JlhW?nHOO3z?dqAJVwWBC$1==HuJ+6*Bq#nFIfG z-=r1jH~ww6>#&(oBl3R@xICpLBJ$a^>l40aWr(iab!x)Fuyh#_*rGVzEZYOXC33Mv zCspqPld8q0oz;id0FMTluGq1bEqp4l6oAx=tX>MC&MSdOjO<95_Ofv5!`60wd9%X` z-H@tRO=)V_+VF^tMsqKLs$Yl0gSf>r+A0NSxFJ&GjbP0l+XkKl}b@Z literal 0 HcmV?d00001 diff --git a/packages/common/constants/local-storage.ts b/packages/common/constants/local-storage.ts index 44e56284601..9b48abfe8b6 100644 --- a/packages/common/constants/local-storage.ts +++ b/packages/common/constants/local-storage.ts @@ -20,6 +20,7 @@ export const LOCAL_STORAGE_KEYS = { UI_PREVIEW_ADVISOR_RULES: 'supabase-ui-advisor-rules', UI_PREVIEW_QUEUE_OPERATIONS: 'supabase-ui-queue-operations', UI_PREVIEW_TABLE_FILTER_BAR: 'supabase-ui-table-filter-bar', + UI_PREVIEW_SIDEBAR_TOOLBAR: 'supabase-ui-sidebar-toolbar', NEW_LAYOUT_NOTICE_ACKNOWLEDGED: 'new-layout-notice-acknowledge', TABS_INTERFACE_ACKNOWLEDGED: 'tabs-interface-acknowledge',