@dyrected/admin 2.5.59 → 2.5.61

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -2,10 +2,10 @@ import * as React$1 from "react";
2
2
  import React, { Component, StrictMode, createContext, createElement, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
3
3
  import { createRoot } from "react-dom/client";
4
4
  import { HashRouter, Link, MemoryRouter, Route, Routes, useLocation, useNavigate, useParams, useSearchParams } from "react-router-dom";
5
- import { QueryClient, QueryClientProvider, useInfiniteQuery, useMutation, useQueries, useQuery, useQueryClient } from "@tanstack/react-query";
6
- import { createClient } from "@dyrected/sdk";
5
+ import { QueryClient, QueryClientProvider, keepPreviousData, useInfiniteQuery, useMutation, useQueries, useQuery, useQueryClient } from "@tanstack/react-query";
6
+ import { PREVIEW_TOKEN_PARAM, createClient } from "@dyrected/sdk";
7
7
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
- import { AlertCircle, AlertTriangle, AlignCenter, AlignLeft, AlignRight, Archive, ArrowDown, ArrowLeft, ArrowRight, ArrowUp, ArrowUpDown, ArrowUpRight, Bold, Braces, Calendar, Check, CheckCircle, CheckCircle2, ChevronDown, ChevronDownIcon, ChevronLeft, ChevronLeftIcon, ChevronRight, ChevronRightIcon, ChevronUp, ChevronsUpDown, Circle, Clock, Clock3, Code, Copy, Database, Download, ExternalLink, Eye, EyeOff, FileDown, FileIcon, FileText, FileUp, Filter, Globe, GripVertical, Heading1, Heading2, Heading3, Heading4, Heading5, Heading6, Home, Image as Image$1, Info, Italic, KeyRound, Layers, LayoutDashboard, LayoutGrid, Library, Link as Link$1, List, ListOrdered, Loader2, Lock, LogOut, Mail, Menu, Monitor, Moon, MoreHorizontal, MousePointer2, PanelLeftClose, PanelLeftOpen, Pencil, Play, Plus, Quote, RotateCcw, Save, Scissors, Search, Settings, Settings2, Share2, Shield, Smartphone, Sparkles, Strikethrough, Sun, Table, Trash2, Underline, Undo2, Upload, UploadCloud, Users, Video, Volume2, Workflow, X, XCircle, icons } from "lucide-react";
8
+ import { AlertCircle, AlertTriangle, AlignCenter, AlignLeft, AlignRight, Archive, ArrowDown, ArrowLeft, ArrowRight, ArrowUp, ArrowUpDown, ArrowUpRight, Bold, Braces, Calendar, Check, CheckCircle, CheckCircle2, ChevronDown, ChevronLeft, ChevronLeftIcon, ChevronRight, ChevronRightIcon, ChevronUp, ChevronsUpDown, Circle, Clock, Clock3, Code, Copy, Database, Download, ExternalLink, Eye, EyeOff, FileDown, FileIcon, FileText, FileUp, Filter, Globe, GripVertical, Heading1, Heading2, Heading3, Heading4, Heading5, Heading6, History, Home, Image as Image$1, Info, Italic, KeyRound, Layers, LayoutDashboard, LayoutGrid, Library, Link as Link$1, List, ListOrdered, Loader2, Lock, LogOut, Mail, Menu, Monitor, Moon, MoreHorizontal, MousePointer2, PanelLeftClose, PanelLeftOpen, Pencil, Play, Plus, Quote, RotateCcw, Save, Scissors, Search, Settings, Settings2, Share2, Shield, Smartphone, Sparkles, Star, Strikethrough, Sun, Table, Trash2, Underline, Undo2, Upload, UploadCloud, Users, Video, Volume2, Workflow, X, XCircle, icons } from "lucide-react";
9
9
  import { clsx } from "clsx";
10
10
  import { extendTailwindMerge } from "tailwind-merge";
11
11
  import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
@@ -44,7 +44,7 @@ import { zodResolver } from "@hookform/resolvers/zod";
44
44
  import * as z from "zod";
45
45
  import * as RadioGroupPrimitive from "@radix-ui/react-radio-group";
46
46
  import { format } from "date-fns";
47
- import { DayPicker, getDefaultClassNames } from "react-day-picker";
47
+ import { DayPicker } from "react-day-picker";
48
48
  import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio";
49
49
  import * as SeparatorPrimitive from "@radix-ui/react-separator";
50
50
  import { Blurhash } from "react-blurhash";
@@ -387,26 +387,36 @@ function BrandingProvider({ children }) {
387
387
  const branding = schemas?.admin?.branding;
388
388
  return /* @__PURE__ */ jsxs(Fragment, { children: [useMemo(() => {
389
389
  const hasCustomPrimary = Boolean(branding?.primaryColor);
390
+ const hasCustomAccent = Boolean(branding?.accentColor);
390
391
  const primaryHsl = toRawHsl(branding?.primaryColor || "#B6FF2E");
391
- const intelligenceHsl = hasCustomPrimary ? primaryHsl : "259 100% 62%";
392
+ const accentHsl = hasCustomAccent ? toRawHsl(branding.accentColor) : hasCustomPrimary ? primaryHsl : "259 100% 62%";
392
393
  const fg = primaryForeground(primaryHsl);
394
+ const tokens = `
395
+ --primary: ${primaryHsl};
396
+ --primary-foreground: ${fg};
397
+ --intelligence: ${accentHsl};
398
+ --accent-foreground: ${accentHsl};
399
+ --sidebar-primary: ${primaryHsl};
400
+ --sidebar-primary-foreground: ${fg};
401
+ --sidebar-accent-foreground: ${accentHsl};
402
+ --sidebar-ring: ${accentHsl};
403
+ --ring: ${accentHsl} / 0.24;
404
+ ${branding?.fontSans ? `--font-sans: ${branding.fontSans};` : ""}
405
+ ${branding?.fontSerif ? `--font-serif: ${branding.fontSerif};` : ""}
406
+ `;
393
407
  return /* @__PURE__ */ jsx("style", { dangerouslySetInnerHTML: { __html: `
394
- .dy-admin-ui {
395
- --primary: ${primaryHsl};
396
- --primary-foreground: ${fg};
397
- --intelligence: ${intelligenceHsl};
398
- --accent-foreground: ${intelligenceHsl};
399
- --sidebar-primary: ${primaryHsl};
400
- --sidebar-primary-foreground: ${fg};
401
- --sidebar-accent-foreground: ${intelligenceHsl};
402
- --sidebar-ring: ${intelligenceHsl};
403
- --ring: ${intelligenceHsl} / 0.24;
404
- ${branding?.fontSans ? `--font-sans: ${branding.fontSans};` : ""}
405
- ${branding?.fontSerif ? `--font-serif: ${branding.fontSerif};` : ""}
406
- }
408
+ .dy-admin-ui { ${tokens} }
409
+ /* Repeat under the dark selectors so brand colours also apply in dark
410
+ mode. The base stylesheet's \`.dy-admin-ui.dark\` sets its own
411
+ --primary/--intelligence at the same specificity; matching that
412
+ specificity here (and coming later in source order) lets the brand
413
+ colours win in dark mode too. */
414
+ .dy-admin-ui.dark,
415
+ .dy-admin-ui[data-theme="dark"] { ${tokens} }
407
416
  ` } });
408
417
  }, [
409
418
  branding?.primaryColor,
419
+ branding?.accentColor,
410
420
  branding?.fontSans,
411
421
  branding?.fontSerif
412
422
  ]), children] });
@@ -744,7 +754,8 @@ function SidebarInner({ schemas, isLoading, location, logout, isEmbedded, collap
744
754
  className: "dy-px-3 dy-mb-1.5 dy-text-[10px] dy-font-semibold dy-uppercase dy-tracking-widest dy-text-muted-foreground/50",
745
755
  children: text
746
756
  }) : /* @__PURE__ */ jsx("div", { className: "dy-my-2 dy-mx-3 dy-h-px dy-bg-border" });
747
- const branding = (schemas?.admin)?.branding;
757
+ const branding = schemas?.admin?.branding;
758
+ const meta = schemas?.admin?.meta;
748
759
  return /* @__PURE__ */ jsxs("div", {
749
760
  className: "dy-flex dy-flex-col dy-min-h-screen",
750
761
  children: [
@@ -775,7 +786,7 @@ function SidebarInner({ schemas, isLoading, location, logout, isEmbedded, collap
775
786
  })
776
787
  }), !collapsed && !branding?.logoText && /* @__PURE__ */ jsx("span", {
777
788
  className: "dy-font-serif dy-text-lg dy-tracking-tight dy-text-foreground dy-flex-1 dy-truncate",
778
- children: branding?.titleSuffix?.replace(/^- /, "") || ""
789
+ children: meta?.titleSuffix?.replace(/^- /, "") || ""
779
790
  })] }) })
780
791
  }),
781
792
  /* @__PURE__ */ jsxs("nav", {
@@ -965,7 +976,7 @@ function isNewerVersion(latest, current) {
965
976
  return false;
966
977
  }
967
978
  function useUpdateCheck() {
968
- const currentVersion = "2.5.58";
979
+ const currentVersion = "2.5.60";
969
980
  const [updateInfo, setUpdateInfo] = useState(() => {
970
981
  if (typeof window === "undefined") return null;
971
982
  const cacheKey = "dyrected_latest_release";
@@ -1011,7 +1022,7 @@ function useUpdateCheck() {
1011
1022
  return updateInfo;
1012
1023
  }
1013
1024
  function AdminShell({ children, isEmbedded = false }) {
1014
- const { client, logout, user } = useDyrected();
1025
+ const { client, logout } = useDyrected();
1015
1026
  const location = useLocation();
1016
1027
  const updateInfo = useUpdateCheck();
1017
1028
  const [collapsed, setCollapsed] = useState(false);
@@ -1043,7 +1054,6 @@ function AdminShell({ children, isEmbedded = false }) {
1043
1054
  },
1044
1055
  enabled: !!client
1045
1056
  });
1046
- const mobileBranding = (schemas?.admin)?.branding;
1047
1057
  return /* @__PURE__ */ jsx(BrandingProvider, { children: /* @__PURE__ */ jsx(SidebarControlProvider, {
1048
1058
  value: sidebarControl,
1049
1059
  children: /* @__PURE__ */ jsxs("div", {
@@ -1094,39 +1104,12 @@ function AdminShell({ children, isEmbedded = false }) {
1094
1104
  }),
1095
1105
  /* @__PURE__ */ jsxs("main", {
1096
1106
  className: "dy-flex-1 dy-min-w-0 dy-overflow-auto dy-flex dy-flex-col dy-relative dy-bg-background/95",
1097
- children: [!isEmbedded && /* @__PURE__ */ jsxs("header", {
1098
- className: "md:dy-hidden dy-sticky dy-top-0 dy-z-20 dy-flex dy-h-14 dy-items-center dy-border-b dy-border-border dy-bg-background/95 dy-backdrop-blur-sm dy-px-3 dy-shrink-0",
1099
- children: [!isEmbedded && /* @__PURE__ */ jsx("div", {
1100
- className: "dy-absolute dy-left-1/2 dy--translate-x-1/2 dy-flex dy-items-center dy-gap-2",
1101
- children: mobileBranding?.logoText ? /* @__PURE__ */ jsx("span", {
1102
- className: "dy-font-serif dy-text-base dy-font-bold dy-tracking-tight dy-text-foreground dy-leading-none",
1103
- children: mobileBranding.logoText
1104
- }) : mobileBranding?.logo ? /* @__PURE__ */ jsx("img", {
1105
- src: getMediaUrl(mobileBranding.logo, client?.getBaseUrl() || ""),
1106
- alt: "Logo",
1107
- className: "dy-h-7 dy-w-auto dy-object-contain"
1108
- }) : /* @__PURE__ */ jsx("img", {
1109
- src: "data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20viewBox='75%20408%20880%20200'%20width='1024'%20height='320'%3e%3cpath%20d='M0%200%20C80.77777778%200%2080.77777778%200%20104.25%2016.25%20C110.41149028%2022.41149028%20115.8130796%2029.84774381%20119%2038%20C119.37125%2038.93457031%20119.7425%2039.86914062%20120.125%2040.83203125%20C125.97853191%2057.96580693%20124.38837118%2076.7725057%20116.9375%2093.0625%20C109.56325726%20107.53398146%2097.58992255%20116.7156145%2082.375%20121.875%20C71.26222779%20125.44607062%2060.56671647%20126.28755488%2048.92578125%20126.1953125%20C47.67873413%20126.19329834%2046.43168701%20126.19128418%2045.14685059%20126.18920898%20C40.53536241%20126.17882812%2035.9239271%20126.15090625%2031.3125%20126.125%20C20.979375%20126.08375%2010.64625%20126.0425%200%20126%20C0%2084.42%200%2042.84%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(94,437)'/%3e%3cpath%20d='M0%200%20C2.71975521%200.35943901%203.84341638%200.83999752%205.7890625%202.828125%20C6.39492188%203.62734375%207.00078125%204.4265625%207.625%205.25%20C8.3159375%206.14847656%209.006875%207.04695313%209.71875%207.97265625%20C10.4715625%208.97167969%2011.224375%209.97070312%2012%2011%20C13.27334297%2012.66801941%2014.55020731%2014.33328608%2015.828125%2015.99780273%20C16.68920631%2017.1197048%2017.54859726%2018.24290639%2018.40625%2019.36743164%20C20.72359821%2022.39401514%2023.10162467%2025.33084868%2025.625%2028.1875%20C28%2031%2028%2031%2028%2033%20C24.04%2033%2020.08%2033%2016%2033%20C16%2036.96%2016%2040.92%2016%2045%20C23.92%2045%2031.84%2045%2040%2045%20C40%2052.26%2040%2059.52%2040%2067%20C32.08%2067%2024.16%2067%2016%2067%20C16.05110565%2073.01513491%2016.11411805%2079.02770699%2016.20751953%2085.04199219%20C16.23569066%2087.08650395%2016.25692435%2089.13112384%2016.27099609%2091.17578125%20C16.29247887%2094.12035322%2016.3391569%2097.06363041%2016.390625%20100.0078125%20C16.39185364%20100.9174173%2016.39308228%20101.82702209%2016.39434814%20102.76419067%20C16.52453003%20108.44478815%2017.27045802%20111.64305028%2021%20116%20C25.45146778%20118.22573389%2031.49130269%20117.61284521%2036.22265625%20116.45703125%20C43.02192732%20113.57781706%2047.39900966%20107.25297069%2051.15625%20101.109375%20C56.12293503%2093.05732503%2066.02505874%2086.96170223%2075%2084.4375%20C75.99%2084.2209375%2075.99%2084.2209375%2077%2084%20C77.76934372%2083.82831802%2078.53868744%2083.65663605%2079.3313446%2083.47975159%20C81.85956507%2083.02524638%2084.13490112%2082.87925324%2086.69848633%2082.88647461%20C88.0493206%2082.88658791%2088.0493206%2082.88658791%2089.42744446%2082.88670349%20C90.3859581%2082.89186478%2091.34447174%2082.89702606%2092.33203125%2082.90234375%20C93.32377853%2082.9037587%2094.31552582%2082.90517365%2095.33732605%2082.90663147%20C98.49574843%2082.91221582%20101.65409915%2082.92476548%20104.8125%2082.9375%20C106.95768127%2082.94251702%20109.10286365%2082.94707958%20111.24804688%2082.95117188%20C116.49872224%2082.96218012%20121.749356%2082.9789027%20127%2083%20C126.41627107%2081.40206803%20125.81844039%2079.8092836%20125.21484375%2078.21875%20C124.88347412%2077.33123047%20124.55210449%2076.44371094%20124.21069336%2075.52929688%20C121.96215073%2070.83179705%20118.27353717%2068.10625131%20113.671875%2065.8671875%20C107.40145998%2063.8320528%2099.62475654%2063.83565488%2093.5625%2066.5625%20C90.74762291%2068.18758368%2089.23412527%2069.92734346%2087.375%2072.5625%20C83.79694231%2077.15174791%2079.16997757%2077.25826651%2073.6875%2078.1875%20C67.93513917%2079.45496934%2063.11247292%2082.15885793%2058%2085%20C56.67024353%2085.67377293%2055.33832199%2086.34340541%2054%2087%20C54.53283313%2074.23864658%2059.85622582%2063.62873005%2069.125%2054.8125%20C79.48783101%2046.05739319%2090.98874912%2042.60318009%20104.3125%2042.6875%20C105.24167236%2042.69313965%20106.17084473%2042.6987793%20107.12817383%2042.70458984%20C120.80891332%2042.94676927%20132.08138441%2047.30179809%20142%2057%20C150.69408674%2067.01964256%20154.41434505%2078.42703622%20154.12890625%2091.5%20C154.11960083%2092.32242188%20154.11029541%2093.14484375%20154.10070801%2093.9921875%20C154.07669258%2095.99492902%20154.03971288%2097.99750824%20154%20100%20C153.20788116%20100.00142502%20152.41576233%20100.00285004%20151.59963989%20100.00431824%20C144.09719277%20100.0222236%20136.5954255%20100.06405798%20129.09327888%20100.13209057%20C125.23723861%20100.16623308%20121.38158914%20100.19145048%20117.52539062%20100.19555664%20C113.79674299%20100.1998673%20110.06897502%20100.22855506%20106.34060287%20100.27343178%20C104.9254661%20100.2863193%20103.51022356%20100.29074578%20102.09503555%20100.28615379%20C90.97909255%20100.25851196%2082.24496399%20102.13674731%2074%20110%20C72.693186%20111.68664002%2071.44412084%20113.4192826%2070.25%20115.1875%20C60.98713546%20128.13484969%2049.31550166%20137.60492408%2033.359375%20140.6015625%20C22.09111259%20141.93803083%2011.94495066%20141.67673859%201.8125%20136.3125%20C-6.21093351%20129.71545467%20-11.15550672%20122.32419258%20-13%20112%20C-13.25198192%20108.45441218%20-13.23420464%20104.92803422%20-13.1953125%20101.375%20C-13.1924826%20100.38749756%20-13.18965271%2099.39999512%20-13.18673706%2098.38256836%20C-13.1756182%2095.25491785%20-13.15052916%2092.12756272%20-13.125%2089%20C-13.11495948%2086.86849374%20-13.10583551%2084.73698296%20-13.09765625%2082.60546875%20C-13.07570607%2077.4035335%20-13.04123391%2072.20181669%20-13%2067%20C-17.95%2067%20-22.9%2067%20-28%2067%20C-28%2059.74%20-28%2052.48%20-28%2045%20C-25.11584117%2043.55792059%20-22.58278472%2043.90605113%20-19.375%2043.9375%20C-18.18648437%2043.94652344%20-16.99796875%2043.95554687%20-15.7734375%2043.96484375%20C-14.85820313%2043.97644531%20-13.94296875%2043.98804688%20-13%2044%20C-13%2040.37%20-13%2036.74%20-13%2033%20C-16.63%2033%20-20.26%2033%20-24%2033%20C-22.47026072%2029.1756518%20-21.7364866%2027.36138218%20-19.27734375%2024.43359375%20C-18.74262451%2023.78841797%20-18.20790527%2023.14324219%20-17.65698242%2022.47851562%20C-16.80583862%2021.46821289%20-16.80583862%2021.46821289%20-15.9375%2020.4375%20C-10.41141017%2013.76832013%20-5.12012996%206.98560367%200%200%20Z%20'%20fill='%23B6FF2E'%20transform='translate(660,423)'/%3e%3cpath%20d='M0%200%20C9.57%200%2019.14%200%2029%200%20C29.59839035%2022.9781895%2028.74526871%2040.62390375%2012.65625%2058.3359375%20C11%2060%2011%2060%208.4375%2062%20C5.46025693%2064.44286611%203.51309236%2067.23700629%201.33203125%2070.390625%20C0.89246094%2070.92171875%200.45289063%2071.4528125%200%2072%20C-0.66%2072%20-1.32%2072%20-2%2072%20C-2.93987733%2070.55661697%20-3.87796552%2069.11202069%20-4.8046875%2067.66015625%20C-8.25891165%2062.86262271%20-12.44079328%2060.54083019%20-18%2059%20C-25.38567118%2058.11965024%20-31.79640485%2058.30895235%20-38.12890625%2062.45703125%20C-43.93075089%2067.24143341%20-46.08004443%2072.64035542%20-47%2080%20C-47.62384022%2087.86038675%20-46.29060096%2095.4983732%20-41.375%20101.875%20C-36.78559554%20106.66837799%20-31.1204383%20109.16020416%20-24.5%20109.4375%20C-17.63097442%20109.06652475%20-10.76252345%20107.03884639%20-5.6171875%20102.3203125%20C-2.88904376%2098.40601931%20-1.66280214%2093.9535236%20-0.1809082%2089.45141602%20C3.35486261%2078.72166264%208.74872668%2071.79757179%2016.88671875%2064.08325195%20C20.82961215%2060.32870988%2023.90074122%2056.47544342%2027%2052%20C27.33%2052%2027.66%2052%2028%2052%20C28%2078.4%2028%20104.8%2028%20132%20C19.42%20132%2010.84%20132%202%20132%20C2%20128.37%202%20124.74%202%20121%20C1.34%20121%200.68%20121%200%20121%20C-0.495%20122.485%20-0.495%20122.485%20-1%20124%20C-12.73711711%20132.94256542%20-25.06338231%20134.43156199%20-39.3125%20132.56640625%20C-51.92494538%20129.92239101%20-62.18469132%20122.09849232%20-69.1875%20111.4375%20C-76.64035884%2098.17021241%20-78.4709381%2082.69085036%20-74.375%2068.0625%20C-69.54605076%2054.5211808%20-61.09321667%2044.22524607%20-48%2038%20C-41.32156484%2035.17823273%20-35.2722462%2034.50746377%20-28.0625%2034.5625%20C-27.13759766%2034.54251953%20-26.21269531%2034.52253906%20-25.25976562%2034.50195312%20C-15.04309922%2034.50911267%20-8.83524108%2037.47063244%20-1%2044%20C-0.67%2029.48%20-0.34%2014.96%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(902,431)'/%3e%3cpath%20d='M0%200%20C1.98755052%201.41100915%203.72130576%202.89802373%205.484375%204.578125%20C6.38349609%205.34576172%206.38349609%205.34576172%207.30078125%206.12890625%20C15.92373572%2013.93240069%2020.74453573%2025.07362429%2021.484375%2036.578125%20C21.60509121%2040.91384903%2021.70071786%2045.24490485%2021.484375%2049.578125%20C20.484375%2050.578125%2020.484375%2050.578125%2017.63072205%2050.69837952%20C16.35387039%2050.69615891%2015.07701874%2050.69393829%2013.76147461%2050.69165039%20C13.0590715%2050.69179642%2012.3566684%2050.69194244%2011.63298035%2050.6920929%20C9.30086222%2050.69139372%206.968823%2050.68360117%204.63671875%2050.67578125%20C3.02389062%2050.67391708%201.41106193%2050.67249318%20-0.20176697%2050.67149353%20C-4.45477857%2050.66766823%20-8.70775624%2050.65783785%20-12.96075439%2050.64678955%20C-17.2973993%2050.63657569%20-21.63404967%2050.63199596%20-25.97070312%2050.62695312%20C-34.48569269%2050.61621559%20-43.00065463%2050.59913903%20-51.515625%2050.578125%20C-50.76310085%2052.01068418%20-50.00072966%2053.43807287%20-49.234375%2054.86328125%20C-48.81091797%2055.65871338%20-48.38746094%2056.45414551%20-47.95117188%2057.27368164%20C-44.77728619%2062.36863181%20-40.24267716%2065.83885608%20-34.515625%2067.578125%20C-24.44648111%2068.75306138%20-13.88210791%2068.97920567%20-5.515625%2062.578125%20C-4.49191978%2061.60240597%20-3.48336669%2060.60937474%20-2.515625%2059.578125%20C0.41667693%2060.89933328%202.47102399%2062.32450697%204.71875%2064.6171875%20C5.29238281%2065.19726562%205.86601562%2065.77734375%206.45703125%2066.375%20C7.04355469%2066.97828125%207.63007813%2067.5815625%208.234375%2068.203125%20C8.83636719%2068.81414062%209.43835938%2069.42515625%2010.05859375%2070.0546875%20C11.53842805%2071.55801124%2013.01202176%2073.06747356%2014.484375%2074.578125%20C6.88082899%2084.58279081%20-3.31152864%2089.39611981%20-15.515625%2091.578125%20C-19.0759833%2091.8143607%20-22.63564692%2091.80900924%20-26.203125%2091.828125%20C-27.61754883%2091.8590625%20-27.61754883%2091.8590625%20-29.06054688%2091.890625%20C-43.17549414%2091.96823296%20-55.10728015%2086.56442315%20-65.26171875%2076.88671875%20C-75.61516851%2066.28205877%20-79.89439154%2053.46530582%20-79.73046875%2038.73046875%20C-78.80311822%2025.12370731%20-72.27652509%2013.81184063%20-62.515625%204.578125%20C-45.29287927%20-9.47756591%20-19.26149726%20-10.88693323%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(493.515625,472.421875)'/%3e%3cpath%20d='M0%200%20C9.57%200%2019.14%200%2029%200%20C31.88545714%206.3480057%2034.74623297%2012.64267461%2037.375%2019.08984375%20C37.66681152%2019.80048477%2037.95862305%2020.51112579%2038.25927734%2021.24330139%20C39.17479456%2023.47391024%2040.08751229%2025.70565039%2041%2027.9375%20C41.60917627%2029.42390959%2042.2185503%2030.91023814%2042.828125%2032.39648438%20C43.27551025%2033.48759018%2043.27551025%2033.48759018%2043.73193359%2034.60073853%20C44.32289018%2036.04103366%2044.91435386%2037.48112086%2045.50634766%2038.92098999%20C46.83058613%2042.14243669%2048.14705044%2045.36608605%2049.4453125%2048.59814453%20C49.87585938%2049.6601709%2050.30640625%2050.72219727%2050.75%2051.81640625%20C51.11609375%2052.7297876%2051.4821875%2053.64316895%2051.859375%2054.58422852%20C52.99948383%2056.99890679%2054.32194326%2058.93105971%2056%2061%20C63.85224401%2042.59935141%2063.85224401%2042.59935141%2071.375%2024.0625%20C74.61034321%2015.88404588%2078.06515289%207.86969422%2082%200%20C90.91%200%2099.82%200%20109%200%20C105.62156917%2011.2614361%20105.62156917%2011.2614361%20103.94921875%2015.33203125%20C103.57990234%2016.23373047%20103.21058594%2017.13542969%20102.83007812%2018.06445312%20C102.45302734%2018.97130859%20102.07597656%2019.87816406%20101.6875%2020.8125%20C101.13932617%2022.15538086%20101.13932617%2022.15538086%20100.58007812%2023.52539062%20C98.52888864%2028.50280206%2096.36531611%2033.41002468%2094.08984375%2038.2890625%20C91.12034683%2044.67044212%2088.37355778%2051.13053761%2085.67678833%2057.63122559%20C84.27693812%2061.00305678%2082.86621358%2064.37034217%2081.45703125%2067.73828125%20C81.17043137%2068.42368988%2080.88383148%2069.10909851%2080.58854675%2069.8152771%20C77.59723903%2076.96761949%2074.59243132%2084.11392962%2071.5625%2091.25%20C71.09118652%2092.37220947%2070.61987305%2093.49441895%2070.13427734%2094.65063477%20C64.14372759%20108.71158026%2057.88097216%20122.54500294%2043.26171875%20129.16015625%20C32.99566383%20132.97224918%2018.99532524%20132.39132855%209%20128%20C6.27254605%20126.74842163%203.64641133%20125.4212209%201%20124%20C1.6411928%20121.09325931%202.56662682%20118.57468666%203.84765625%20115.890625%20C4.38422852%20114.75947266%204.38422852%20114.75947266%204.93164062%20113.60546875%20C5.30482422%20112.82816406%205.67800781%20112.05085937%206.0625%20111.25%20C6.62807617%20110.06083984%206.62807617%20110.06083984%207.20507812%20108.84765625%20C8.13345839%20106.89688254%209.06629544%20104.94823094%2010%20103%20C12.57030771%20104.02467879%2015.13501673%20105.05651863%2017.6875%20106.125%20C23.13926051%20107.56508768%2028.53393046%20107.91137353%2033.875%20105.9375%20C36.67992585%20103.3800676%2038.90092755%20100.67546954%2040%2097%20C39.51255272%2092.02739581%2037.81323979%2087.84336435%2035.75390625%2083.34765625%20C35.42739075%2082.61970352%2035.10087524%2081.89175079%2034.76446533%2081.14173889%20C34.06574374%2079.58604999%2033.36386031%2078.03177798%2032.65908813%2076.4788208%20C31.54929238%2074.03339714%2030.44768068%2071.58443912%2029.34838867%2069.13427734%20C28.24699442%2066.67954634%2027.14520032%2064.22500817%2026.04084778%2061.77160645%20C22.05427867%2052.9145598%2018.19057599%2044.00588863%2014.33935547%2035.08935547%20C13.03927819%2032.09059902%2011.73151205%2029.09532776%2010.42124939%2026.10101318%20C9.20378396%2023.3178069%207.98924352%2020.53332878%206.7749939%2017.74871826%20C6.17859872%2016.3828194%205.58097738%2015.01745522%204.98208618%2013.65264893%20C4.14875742%2011.75295298%203.31997874%209.85133284%202.4921875%207.94921875%20C2.01120605%206.84924561%201.53022461%205.74927246%201.03466797%204.6159668%20C0%202%200%202%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(224,467)'/%3e%3cpath%20d='M0%200%20C4.6456294%203.80490916%208.23887006%207.95463812%2010.84375%2013.40234375%20C10.84375%2014.06234375%2010.84375%2014.72234375%2010.84375%2015.40234375%20C0.44875%2020.84734375%200.44875%2020.84734375%20-10.15625%2026.40234375%20C-15.15625%2022.40234375%20-15.15625%2022.40234375%20-17.59375%2019.83984375%20C-23.69448695%2014.03670372%20-29.49135908%2013.8685058%20-37.5859375%2014.05859375%20C-44.66458696%2014.74012674%20-48.35592604%2018.17840756%20-52.89453125%2023.42578125%20C-57.35750661%2030.4173154%20-57.05559365%2039.03898526%20-55.7265625%2046.96484375%20C-53.69407611%2054.19146201%20-49.25238278%2059.49703127%20-42.90625%2063.40234375%20C-35.21481566%2065.45339291%20-27.19943303%2065.45458604%20-20.15625%2061.40234375%20C-17.38502725%2059.04807876%20-17.38502725%2059.04807876%20-15.15625%2056.40234375%20C-13.82291667%2055.06901042%20-12.48958333%2053.73567708%20-11.15625%2052.40234375%20C-3.48829498%2054.74171986%203.61512274%2057.95003181%2010.84375%2061.40234375%20C9.71301894%2068.83286216%205.25630274%2073.41753074%20-0.15625%2078.40234375%20C-14.27515309%2088.65893292%20-29.58374274%2090.22229359%20-46.59375%2087.94140625%20C-59.50522416%2084.75107107%20-71.47879005%2076.68814229%20-78.59375%2065.40234375%20C-85.12640699%2053.53652894%20-87.70329542%2038.76522142%20-84.28515625%2025.4921875%20C-81.80476638%2018.01848819%20-78.48663047%2012.17115378%20-73.15625%206.40234375%20C-72.35574219%205.46648437%20-72.35574219%205.46648437%20-71.5390625%204.51171875%20C-54.14361329%20-14.63159857%20-19.9950983%20-14.8152087%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(612.15625,475.59765625)'/%3e%3cpath%20d='M0%200%20C0.92917236%200.00563965%201.85834473%200.0112793%202.81567383%200.01708984%20C16.49641332%200.25926927%2027.76888441%204.61429809%2037.6875%2014.3125%20C46.38158674%2024.33214256%2050.10184505%2035.73953622%2049.81640625%2048.8125%20C49.80710083%2049.63492188%2049.79779541%2050.45734375%2049.78820801%2051.3046875%20C49.76419258%2053.30742902%2049.72721288%2055.31000824%2049.6875%2057.3125%20C48.89538116%2057.31392502%2048.10326233%2057.31535004%2047.28713989%2057.31681824%20C39.78469277%2057.3347236%2032.2829255%2057.37655798%2024.78077888%2057.44459057%20C20.92473861%2057.47873308%2017.06908914%2057.50395048%2013.21289062%2057.50805664%20C9.48424299%2057.5123673%205.75647502%2057.54105506%202.02810287%2057.58593178%20C0.6129661%2057.5988193%20-0.80227644%2057.60324578%20-2.21746445%2057.59865379%20C-13.33340745%2057.57101196%20-22.06753601%2059.44924731%20-30.3125%2067.3125%20C-31.619314%2068.99914002%20-32.86837916%2070.7317826%20-34.0625%2072.5%20C-39.27138551%2079.83175205%20-44.31888353%2086.93254032%20-53.3125%2089.3125%20C-59.27605196%2089.97511688%20-63.4418563%2088.64128375%20-68.3125%2085.3125%20C-71.47815211%2082.38915707%20-73.44158139%2079.56624985%20-74.3125%2075.3125%20C-73.64863281%2075.07015625%20-72.98476563%2074.8278125%20-72.30078125%2074.578125%20C-70.97626953%2074.07539062%20-70.97626953%2074.07539062%20-69.625%2073.5625%20C-68.31982422%2073.07523438%20-68.31982422%2073.07523438%20-66.98828125%2072.578125%20C-61.914668%2070.17834297%20-58.99832299%2067.14164616%20-55.97827148%2062.4387207%20C-49.17329509%2051.85146005%20-39.91704612%2044.06974446%20-27.3125%2041.3125%20C-26.54315628%2041.14081802%20-25.77381256%2040.96913605%20-24.9811554%2040.79225159%20C-22.45293493%2040.33774638%20-20.17759888%2040.19175324%20-17.61401367%2040.19897461%20C-16.2631794%2040.19908791%20-16.2631794%2040.19908791%20-14.88505554%2040.19920349%20C-13.44728508%2040.20694542%20-13.44728508%2040.20694542%20-11.98046875%2040.21484375%20C-10.49284782%2040.21696617%20-10.49284782%2040.21696617%20-8.97517395%2040.21913147%20C-5.81675157%2040.22471582%20-2.65840085%2040.23726548%200.5%2040.25%20C2.64518127%2040.25501702%204.79036365%2040.25957958%206.93554688%2040.26367188%20C12.18622224%2040.27468012%2017.436856%2040.2914027%2022.6875%2040.3125%20C22.10377107%2038.71456803%2021.50594039%2037.1217836%2020.90234375%2035.53125%20C20.57097412%2034.64373047%2020.23960449%2033.75621094%2019.89819336%2032.84179688%20C17.64965073%2028.14429705%2013.96103717%2025.41875131%209.359375%2023.1796875%20C3.08895998%2021.1445528%20-4.68774346%2021.14815488%20-10.75%2023.875%20C-13.56487709%2025.50008368%20-15.07837473%2027.23984346%20-16.9375%2029.875%20C-20.51555769%2034.46424791%20-25.14252243%2034.57076651%20-30.625%2035.5%20C-36.37736083%2036.76746934%20-41.20002708%2039.47135793%20-46.3125%2042.3125%20C-47.64225647%2042.98627293%20-48.97417801%2043.65590541%20-50.3125%2044.3125%20C-49.77966687%2031.55114658%20-44.45627418%2020.94123005%20-35.1875%2012.125%20C-24.82466899%203.36989319%20-13.32375088%20-0.08431991%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(764.3125,465.6875)'/%3e%3cpath%20d='M0%200%20C44.84375%200%2044.84375%200%2055%2010%20C63.50692661%2020.10567615%2066.02395277%2031.00367642%2065%2044%20C63.92164324%2052.75980221%2059.27536689%2061.86408571%2053%2068%20C36.90761972%2079.76525518%2020.54677762%2076%200%2076%20C0%2050.92%200%2025.84%200%200%20Z%20'%20fill='%23FFFFFF'%20transform='translate(123,462)'/%3e%3cpath%20d='M0%200%20C0%208.58%200%2017.16%200%2026%20C-2.475%2026.0825%20-4.95%2026.165%20-7.5%2026.25%20C-15.58592043%2026.68028387%20-20.78770187%2028.00185508%20-26.8125%2033.625%20C-32.18698591%2040.84882192%20-32.45755497%2050.04763218%20-32.51171875%2058.6953125%20C-32.52966995%2059.76876923%20-32.54762115%2060.84222595%20-32.56611633%2061.94821167%20C-32.61983039%2065.34043577%20-32.65398988%2068.73252235%20-32.6875%2072.125%20C-32.72070741%2074.44012315%20-32.75520018%2076.75522823%20-32.79101562%2079.0703125%20C-32.87792806%2084.71355721%20-32.93833073%2090.35619859%20-33%2096%20C-42.24%2096%20-51.48%2096%20-61%2096%20C-61.11629021%2091.57321943%20-61.21532635%2087.15195899%20-61.2746582%2082.72485352%20C-61.29944483%2081.22662179%20-61.33328586%2079.72850609%20-61.37719727%2078.23071289%20C-61.84659218%2061.77980184%20-58.18723461%2049.29745852%20-47.64160156%2036.32958984%20C-46.11388537%2034.44998397%20-44.58793536%2032.56895731%20-43.0625%2030.6875%20C-42.54276611%2030.05078369%20-42.02303223%2029.41406738%20-41.48754883%2028.75805664%20C-38.17466035%2024.64362091%20-35.32555694%2020.47816771%20-32.625%2015.9375%20C-27.24219449%206.99173768%20-23.75743907%203.76906718%20-13.609375%200.6640625%20C-10%200%20-10%200%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(406,466)'/%3e%3cpath%20d='M0%200%20C5.66129431%204.69766975%2010.85228904%209.74723372%2016%2015%20C11.92304775%2022.70385133%204.05433775%2027.16606635%20-4%2030%20C-19.29250715%2034.53548448%20-36.16315756%2033.34402642%20-50.4140625%2026.31640625%20C-58.66486514%2021.8238732%20-58.66486514%2021.8238732%20-59.77929688%2019.08422852%20C-60%2017%20-60%2017%20-57.796875%2013.87109375%20C-56.79405635%2012.71532531%20-55.77778517%2011.57112409%20-54.75%2010.4375%20C-54.24597656%209.86064453%20-53.74195313%209.28378906%20-53.22265625%208.68945312%20C-50.89341628%206.03925489%20-48.51068548%203.47978615%20-46%201%20C-42.31120701%202.80247839%20-38.77349917%204.8276212%20-35.21875%206.87890625%20C-27.51820571%2010.76985028%20-18.90673806%209.19207078%20-10.88671875%207.06640625%20C-6.60864698%205.48600897%20-3.35300014%203.04728542%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(791,532)'/%3e%3cpath%20d='M0%200%20C4.56326885%202.95860288%208.00828055%206.6679148%209.9375%2011.8125%20C9.9375%2013.4625%209.9375%2015.1125%209.9375%2016.8125%20C-4.9125%2016.8125%20-19.7625%2016.8125%20-35.0625%2016.8125%20C-33.85907282%209.59193695%20-31.77484523%205.59340843%20-25.8984375%201.19140625%20C-17.83251928%20-3.44583989%20-8.3946856%20-4.34922034%200%200%20Z%20'%20fill='%23FFFFFF'%20transform='translate(477.0625,489.1875)'/%3e%3cpath%20d='M0%200%20C2.71975521%200.35943901%203.84341638%200.83999752%205.7890625%202.828125%20C6.39492188%203.62734375%207.00078125%204.4265625%207.625%205.25%20C8.3159375%206.14847656%209.006875%207.04695313%209.71875%207.97265625%20C10.4715625%208.97167969%2011.224375%209.97070312%2012%2011%20C13.27334297%2012.66801941%2014.55020731%2014.33328608%2015.828125%2015.99780273%20C16.68920631%2017.1197048%2017.54859726%2018.24290639%2018.40625%2019.36743164%20C20.72359821%2022.39401514%2023.10162467%2025.33084868%2025.625%2028.1875%20C28%2031%2028%2031%2028%2033%20C24.04%2033%2020.08%2033%2016%2033%20C16%2036.96%2016%2040.92%2016%2045%20C15.01%2044.505%2015.01%2044.505%2014%2044%20C13.5859375%2041.27734375%2013.5859375%2041.27734375%2013.375%2037.9375%20C13.30023437%2036.83277344%2013.22546875%2035.72804688%2013.1484375%2034.58984375%20C13.09945312%2033.73519531%2013.05046875%2032.88054687%2013%2032%20C14.134375%2031.54625%2015.26875%2031.0925%2016.4375%2030.625%20C20.04721692%2029.42904194%2020.04721692%2029.42904194%2021%2027%20C20.34%2027%2019.68%2027%2019%2027%20C18.608125%2025.9275%2018.21625%2024.855%2017.8125%2023.75%20C16.27259896%2020.08533167%2014.21849461%2018.3486312%2011%2016%20C11%2015.34%2011%2014.68%2011%2014%20C10.34%2014%209.68%2014%209%2014%20C7.4921875%2012.25%207.4921875%2012.25%205.875%2010%20C5.33617187%209.2575%204.79734375%208.515%204.2421875%207.75%20C3.83226562%207.1725%203.42234375%206.595%203%206%20C-3.93710167%209.15322803%20-9.63269943%2014.06474733%20-12.375%2021.25%20C-12.63023437%2022.05953125%20-12.88546875%2022.8690625%20-13.1484375%2023.703125%20C-14.07536523%2026.20327869%20-15.31553255%2027.94852568%20-17%2030%20C-15.02%2030.33%20-13.04%2030.66%20-11%2031%20C-9.51119807%2035.4664058%20-9.31090749%2039.30056546%20-11.09765625%2043.70703125%20C-13%2046%20-13%2046%20-16.13671875%2046.48828125%20C-19.42447917%2046.32552083%20-22.71223958%2046.16276042%20-26%2046%20C-26%2052.27%20-26%2058.54%20-26%2065%20C-24.1025%2064.95875%20-22.205%2064.9175%20-20.25%2064.875%20C-16.10895658%2064.78497732%20-13.61590012%2065.02831107%20-10%2067%20C-9.98786972%2067.91628929%20-9.98786972%2067.91628929%20-9.97549438%2068.85108948%20C-9.88922875%2075.22686062%20-9.78971604%2081.60232871%20-9.68261719%2087.9777832%20C-9.644408%2090.35500995%20-9.60954125%2092.73229292%20-9.578125%2095.10961914%20C-9.53229961%2098.53291881%20-9.47433332%20101.95583411%20-9.4140625%20105.37890625%20C-9.40251129%20106.43646622%20-9.39096008%20107.49402618%20-9.37905884%20108.58363342%20C-9.26966133%20114.09218328%20-8.82932532%20118.79123684%20-7%20124%20C-6.34%20124%20-5.68%20124%20-5%20124%20C-4.9071875%20124.928125%20-4.9071875%20124.928125%20-4.8125%20125.875%20C-4.19124685%20128.2501999%20-4.19124685%20128.2501999%20-1.625%20129.0625%20C-0.75875%20129.371875%200.1075%20129.68125%201%20130%20C2.6875%20131.5625%202.6875%20131.5625%204%20133%20C4.66%20133.33%205.32%20133.66%206%20134%20C6.625%20136.0625%206.625%20136.0625%207%20138%20C0.64042919%20136.72808584%20-3.00409013%20132.83266023%20-7%20128%20C-12.40978943%20119.7580267%20-13.30059906%20110.99356957%20-13.1953125%20101.375%20C-13.1924826%20100.38749756%20-13.18965271%2099.39999512%20-13.18673706%2098.38256836%20C-13.1756182%2095.25491785%20-13.15052916%2092.12756272%20-13.125%2089%20C-13.11495948%2086.86849374%20-13.10583551%2084.73698296%20-13.09765625%2082.60546875%20C-13.07570607%2077.4035335%20-13.04123391%2072.20181669%20-13%2067%20C-17.95%2067%20-22.9%2067%20-28%2067%20C-28%2059.74%20-28%2052.48%20-28%2045%20C-25.11584117%2043.55792059%20-22.58278472%2043.90605113%20-19.375%2043.9375%20C-18.18648437%2043.94652344%20-16.99796875%2043.95554687%20-15.7734375%2043.96484375%20C-14.85820313%2043.97644531%20-13.94296875%2043.98804688%20-13%2044%20C-13%2040.37%20-13%2036.74%20-13%2033%20C-16.63%2033%20-20.26%2033%20-24%2033%20C-22.47026072%2029.1756518%20-21.7364866%2027.36138218%20-19.27734375%2024.43359375%20C-18.74262451%2023.78841797%20-18.20790527%2023.14324219%20-17.65698242%2022.47851562%20C-16.80583862%2021.46821289%20-16.80583862%2021.46821289%20-15.9375%2020.4375%20C-10.41141017%2013.76832013%20-5.12012996%206.98560367%200%200%20Z%20'%20fill='%23C7FF57'%20transform='translate(660,423)'/%3e%3cpath%20d='M0%200%20C0.68078561%2010.15126993%20-6.26162995%2018.50517827%20-12.625%2025.8125%20C-13.10155029%2026.35165039%20-13.57810059%2026.89080078%20-14.0690918%2027.44628906%20C-17.57519453%2031.41656971%20-20.32199043%2035.44738374%20-23%2040%20C-23.33%2040%20-23.66%2040%20-24%2040%20C-24%2027.13%20-24%2014.26%20-24%201%20C-20.225625%200.835%20-16.45125%200.67%20-12.5625%200.5%20C-11.37084229%200.44779297%20-10.17918457%200.39558594%20-8.95141602%200.34179688%20C-7.55427368%200.28088867%20-7.55427368%200.28088867%20-6.12890625%200.21875%20C-5.17056885%200.17685547%20-4.21223145%200.13496094%20-3.22485352%200.09179688%20C-1%200%20-1%200%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(369,467)'/%3e%3cpath%20d='M0%200%20C2.00720923%200.28674418%204.0085944%200.61866701%206%201%20C6.495%202.485%206.495%202.485%207%204%20C7.66%204%208.32%204%209%204%20C9.495%205.98%209.495%205.98%2010%208%20C10.66%208%2011.32%208%2012%208%20C12.474375%208.639375%2012.94875%209.27875%2013.4375%209.9375%20C14.9091365%2012.28372963%2014.9091365%2012.28372963%2018%2013%20C18.495%2015.97%2018.495%2015.97%2019%2019%20C19.66%2019%2020.32%2019%2021%2019%20C22.0625%2020.8125%2022.0625%2020.8125%2023%2023%20C22.505%2024.485%2022.505%2024.485%2022%2026%20C21.3709375%2025.17757813%2020.741875%2024.35515625%2020.09375%2023.5078125%20C17.8531051%2020.58200082%2015.60149285%2017.6647905%2013.34716797%2014.74951172%20C12.10990021%2013.14272289%2010.88443769%2011.52686179%209.66015625%209.91015625%20C8.96792969%209.01167969%208.27570312%208.11320312%207.5625%207.1875%20C6.63630859%205.97126953%206.63630859%205.97126953%205.69140625%204.73046875%20C5.13324219%204.15941406%204.57507813%203.58835937%204%203%20C3.01%203%202.02%203%201%203%20C-1.1667738%205.33134682%20-1.1667738%205.33134682%20-3.375%208.4375%20C-4.25611385%209.62008724%20-5.13764692%2010.80236221%20-6.01953125%2011.984375%20C-6.49342285%2012.62568359%20-6.96731445%2013.26699219%20-7.45556641%2013.92773438%20C-9.12007314%2016.16110984%20-10.81214938%2018.37132519%20-12.51171875%2020.578125%20C-13.10098145%2021.34326416%20-13.69024414%2022.10840332%20-14.29736328%2022.89672852%20C-15.46363033%2024.41029473%20-16.62997013%2025.92380488%20-17.79638672%2027.43725586%20C-18.32893066%2028.13214111%20-18.86147461%2028.82702637%20-19.41015625%2029.54296875%20C-19.88590088%2030.16196045%20-20.36164551%2030.78095215%20-20.85180664%2031.41870117%20C-22.07331217%2033.0102519%20-22.07331217%2033.0102519%20-23%2035%20C-19.37%2035%20-15.74%2035%20-12%2035%20C-12%2038.63%20-12%2042.26%20-12%2046%20C-16.95%2046.33%20-21.9%2046.66%20-27%2047%20C-27%2054.26%20-27%2061.52%20-27%2069%20C-22.05%2069%20-17.1%2069%20-12%2069%20C-11.98541748%2070.31081543%20-11.97083496%2071.62163086%20-11.95581055%2072.97216797%20C-11.89747545%2077.87396394%20-11.82024648%2082.77531735%20-11.73754883%2087.67675781%20C-11.70446426%2089.7909421%20-11.67638204%2091.90521123%20-11.65356445%2094.01953125%20C-11.61971392%2097.07328159%20-11.56738455%20100.12626594%20-11.51171875%20103.1796875%20C-11.50532883%20104.11239471%20-11.4989389%20105.04510193%20-11.49235535%20106.006073%20C-11.26437364%20116.37399184%20-8.63724873%20126.05256773%20-1.3671875%20133.72265625%20C6.92807918%20141.29255208%2016.09690889%20142.40300166%2027.015625%20142.2109375%20C37.64372477%20141.64827339%2045.9753421%20138.49041118%2055%20133%20C55.66%20132.67%2056.32%20132.34%2057%20132%20C56.17631135%20135.60363786%2054.73164913%20137.5598772%2051.8125%20139.6875%20C43.36448472%20144.51927852%2032.57412865%20144.15231016%2023.0625%20144.25%20C22.03491577%20144.2641394%2022.03491577%20144.2641394%2020.98657227%20144.27856445%20C16.010662%20144.24659412%2011.7517971%20143.33793617%207%20142%20C6.67%20142.66%206.34%20143.32%206%20144%20C6%20143.34%206%20142.68%206%20142%20C5.2575%20141.731875%204.515%20141.46375%203.75%20141.1875%20C1.10938051%20140.04723249%20-0.85552844%20138.90619694%20-3%20137%20C-3%20136.34%20-3%20135.68%20-3%20135%20C-4.32%20134.67%20-5.64%20134.34%20-7%20134%20C-7.495%20132.02%20-7.495%20132.02%20-8%20130%20C-8.66%20130%20-9.32%20130%20-10%20130%20C-13.3917714%20117.17092103%20-13.35377076%20104.75435973%20-13.1875%2091.5625%20C-13.17241597%2089.4629003%20-13.15873419%2087.36329003%20-13.14648438%2085.26367188%20C-13.1137965%2080.17551518%20-13.0622224%2075.0878777%20-13%2070%20C-17.95%2070%20-22.9%2070%20-28%2070%20C-29.81226714%2066.37546571%20-29.18470181%2062.11521368%20-29.1875%2058.125%20C-29.19974609%2057.21363281%20-29.21199219%2056.30226563%20-29.22460938%2055.36328125%20C-29.22654297%2054.48285156%20-29.22847656%2053.60242188%20-29.23046875%2052.6953125%20C-29.23457764%2051.89109863%20-29.23868652%2051.08688477%20-29.24291992%2050.25830078%20C-28.96966064%2047.71795063%20-28.41516433%2046.12497675%20-27%2044%20C-24.1796875%2043.390625%20-24.1796875%2043.390625%20-20.875%2043.25%20C-19.77929688%2043.19328125%20-18.68359375%2043.1365625%20-17.5546875%2043.078125%20C-16.71164062%2043.05234375%20-15.86859375%2043.0265625%20-15%2043%20C-14.505%2040.03%20-14.505%2040.03%20-14%2037%20C-14.721875%2037.20625%20-15.44375%2037.4125%20-16.1875%2037.625%20C-19.54297056%2038.07239607%20-21.11604375%2037.76241771%20-24%2036%20C-24.875%2033.7421875%20-24.875%2033.7421875%20-25%2031%20C-23.453125%2028.359375%20-23.453125%2028.359375%20-21.25%2025.75%20C-20.53328125%2024.87859375%20-19.8165625%2024.0071875%20-19.078125%2023.109375%20C-17%2021%20-17%2021%20-14%2020%20C-14%2019.34%20-14%2018.68%20-14%2018%20C-13.34%2018%20-12.68%2018%20-12%2018%20C-12%2017.01%20-12%2016.02%20-12%2015%20C-11.34%2015%20-10.68%2015%20-10%2015%20C-9.938125%2014.46375%20-9.87625%2013.9275%20-9.8125%2013.375%20C-8.59964736%209.82973843%20-6.55389074%207.7407608%20-4%205%20C-3.34%205%20-2.68%205%20-2%205%20C-1.855625%204.360625%20-1.71125%203.72125%20-1.5625%203.0625%20C-1%201%20-1%201%200%200%20Z%20'%20fill='%23F2FFD9'%20transform='translate(659,421)'/%3e%3cpath%20d='M0%200%20C7.92%200%2015.84%200%2024%200%20C24%207.26%2024%2014.52%2024%2022%20C16.08%2022%208.16%2022%200%2022%20C0.05110565%2028.01513491%200.11411805%2034.02770699%200.20751953%2040.04199219%20C0.23569066%2042.08650395%200.25692435%2044.13112384%200.27099609%2046.17578125%20C0.29247887%2049.12035322%200.3391569%2052.06363041%200.390625%2055.0078125%20C0.39185364%2055.9174173%200.39308228%2056.82702209%200.39434814%2057.76419067%20C0.52424586%2063.4323883%201.24752639%2066.66904733%205%2071%20C7.15616421%2071.84067552%207.15616421%2071.84067552%209.4375%2071.875%20C13.59953049%2072.52786753%2013.59953049%2072.52786753%2015.484375%2074.75%20C16.28446347%2076.16314328%2017.06211601%2077.58923329%2017.81640625%2079.02734375%20C20.15058208%2082.91763679%2023.83300287%2084.61100096%2028%2086%20C29.72795352%2086.06802967%2031.45835365%2086.08495645%2033.1875%2086.0625%20C34.08855469%2086.05347656%2034.98960937%2086.04445313%2035.91796875%2086.03515625%20C36.60503906%2086.02355469%2037.29210937%2086.01195312%2038%2086%20C28.4198669%2094.94145756%2015.04998512%2096.35397366%202.5546875%2096.203125%20C-1.58388881%2095.96663493%20-5.07173198%2095.28269976%20-9%2094%20C-6.13129876%2093.17066175%20-3.67877335%2092.90857069%20-0.69921875%2093.0078125%20C0.51991211%2093.03294922%200.51991211%2093.03294922%201.76367188%2093.05859375%20C3.45140273%2093.10256528%205.13894568%2093.15453885%206.82617188%2093.21484375%20C12.36551383%2093.31102806%2016.06333211%2092.5449489%2021%2090%20C21%2089.01%2021%2088.02%2021%2087%20C19.5459375%2086.0409375%2019.5459375%2086.0409375%2018.0625%2085.0625%20C15%2083%2015%2083%2014.125%2080.75%20C14.08375%2080.1725%2014.0425%2079.595%2014%2079%20C13.34%2079%2012.68%2079%2012%2079%20C12%2078.34%2012%2077.68%2012%2077%20C11.278125%2076.896875%2010.55625%2076.79375%209.8125%2076.6875%20C5.46614904%2075.62505865%202.79905402%2074.21337832%200.3125%2070.4375%20C-0.120625%2069.633125%20-0.55375%2068.82875%20-1%2068%20C-1.66%2067.34%20-2.32%2066.68%20-3%2066%20C-4.56682324%2055.65896659%20-4.02187183%2044.9749078%20-3.6875%2034.5625%20C-3.65293701%2033.35924072%20-3.61837402%2032.15598145%20-3.58276367%2030.91625977%20C-3.53869385%2029.79018311%20-3.49462402%2028.66410645%20-3.44921875%2027.50390625%20C-3.41143311%2026.49142822%20-3.37364746%2025.4789502%20-3.3347168%2024.43579102%20C-3%2022%20-3%2022%20-1%2020%20C1.15478516%2019.68115234%201.15478516%2019.68115234%203.7890625%2019.5859375%20C5.20058594%2019.52792969%205.20058594%2019.52792969%206.640625%2019.46875%20C7.62546875%2019.4378125%208.6103125%2019.406875%209.625%2019.375%20C11.11386719%2019.31699219%2011.11386719%2019.31699219%2012.6328125%2019.2578125%20C15.08835385%2019.1633686%2017.5438841%2019.07780125%2020%2019%20C19.98839844%2018.18015625%2019.97679687%2017.3603125%2019.96484375%2016.515625%20C19.95582031%2015.43796875%2019.94679688%2014.3603125%2019.9375%2013.25%20C19.92589844%2012.18265625%2019.91429687%2011.1153125%2019.90234375%2010.015625%20C19.98489913%207.46631499%2020.25382442%205.42066409%2021%203%20C20.01966797%203.29197266%2020.01966797%203.29197266%2019.01953125%203.58984375%20C15.00486508%204.13517357%2011.62136988%203.38864783%207.6875%202.5625%20C6.94693359%202.41490234%206.20636719%202.26730469%205.44335938%202.11523438%20C3.62718357%201.75199921%201.81333589%201.37715682%200%201%20C0%200.67%200%200.34%200%200%20Z%20'%20fill='%239BE600'%20transform='translate(676,468)'/%3e%3cpath%20d='M0%200%20C3%203%203%203%203.2578125%205.3046875%20C3.21398437%206.15289062%203.17015625%207.00109375%203.125%207.875%20C3.00502835%2011.46371724%203.2754511%2014.48076247%204%2018%20C3.60976365%2021.31700894%202.61164065%2022.93522445%200%2025%20C-2.36010742%2025.34057617%20-2.36010742%2025.34057617%20-5.10546875%2025.29296875%20C-6.08837891%2025.28330078%20-7.07128906%2025.27363281%20-8.08398438%2025.26367188%20C-9.10814453%2025.23853516%20-10.13230469%2025.21339844%20-11.1875%2025.1875%20C-12.22326172%2025.17396484%20-13.25902344%2025.16042969%20-14.32617188%2025.14648438%20C-16.88463699%2025.11111389%20-19.4420578%2025.06175544%20-22%2025%20C-21.93433838%2025.60046143%20-21.86867676%2026.20092285%20-21.80102539%2026.81958008%20C-20.93290834%2035.43139683%20-20.67409758%2044.04154841%20-20.4375%2052.6875%20C-20.39418922%2054.17904546%20-20.35057152%2055.67058205%20-20.30664062%2057.16210938%20C-20.20089527%2060.77464429%20-20.09928034%2064.38728094%20-20%2068%20C-19.05898438%2068.29648437%20-18.11796875%2068.59296875%20-17.1484375%2068.8984375%20C-14.2055568%2069.92808062%20-12.3554191%2071.00695307%20-10%2073%20C-14.03645882%2073.31658501%20-16.32333195%2073.4210379%20-19.8125%2071.25%20C-23.0830854%2067.88596931%20-24.25459399%2065.28097814%20-24.22705078%2060.59863281%20C-24.22689972%2059.7380426%20-24.22674866%2058.87745239%20-24.22659302%2057.99078369%20C-24.21627045%2057.07085632%20-24.20594788%2056.15092896%20-24.1953125%2055.203125%20C-24.1924826%2054.25435486%20-24.18965271%2053.30558472%20-24.18673706%2052.32806396%20C-24.17555448%2049.30191361%20-24.1504533%2046.2760607%20-24.125%2043.25%20C-24.11496772%2041.19661886%20-24.1058423%2039.14323308%20-24.09765625%2037.08984375%20C-24.07732418%2032.05968942%20-24.03817166%2027.03017714%20-24%2022%20C-16.08%2022%20-8.16%2022%200%2022%20C0%2014.74%200%207.48%200%200%20Z%20'%20fill='%23E8FFC2'%20transform='translate(700,468)'/%3e%3cpath%20d='M0%200%20C4.62%200%209.24%200%2014%200%20C14.01458252%201.31081543%2014.02916504%202.62163086%2014.04418945%203.97216797%20C14.10252455%208.87396394%2014.17975352%2013.77531735%2014.26245117%2018.67675781%20C14.29553574%2020.7909421%2014.32361796%2022.90521123%2014.34643555%2025.01953125%20C14.38028608%2028.07328159%2014.43261545%2031.12626594%2014.48828125%2034.1796875%20C14.49467117%2035.11239471%2014.5010611%2036.04510193%2014.50764465%2037.006073%20C14.73562636%2047.37399184%2017.36275127%2057.05256773%2024.6328125%2064.72265625%20C32.92807918%2072.29255208%2042.09690889%2073.40300166%2053.015625%2073.2109375%20C63.64372477%2072.64827339%2071.9753421%2069.49041118%2081%2064%20C81.66%2063.67%2082.32%2063.34%2083%2063%20C82.17631135%2066.60363786%2080.73164913%2068.5598772%2077.8125%2070.6875%20C69.36448472%2075.51927852%2058.57412865%2075.15231016%2049.0625%2075.25%20C48.03491577%2075.2641394%2048.03491577%2075.2641394%2046.98657227%2075.27856445%20C42.010662%2075.24659412%2037.7517971%2074.33793617%2033%2073%20C32.67%2073.66%2032.34%2074.32%2032%2075%20C32%2074.34%2032%2073.68%2032%2073%20C31.2575%2072.731875%2030.515%2072.46375%2029.75%2072.1875%20C27.10938051%2071.04723249%2025.14447156%2069.90619694%2023%2068%20C23%2067.34%2023%2066.68%2023%2066%20C21.68%2065.67%2020.36%2065.34%2019%2065%20C18.67%2063.68%2018.34%2062.36%2018%2061%20C17.34%2061%2016.68%2061%2016%2061%20C12.6082286%2048.17092103%2012.64622924%2035.75435973%2012.8125%2022.5625%20C12.82758403%2020.4629003%2012.84126581%2018.36329003%2012.85351562%2016.26367188%20C12.8862035%2011.17551518%2012.9377776%206.0878777%2013%201%20C8.71%201%204.42%201%200%201%20C0%200.67%200%200.34%200%200%20Z%20'%20fill='%23E8FFC2'%20transform='translate(633,490)'/%3e%3cpath%20d='M0%200%20C0.81434143%202.85160391%201.11881242%205.36626131%201.09765625%208.328125%20C1.09443359%209.12734375%201.09121094%209.9265625%201.08789062%2010.75%20C1.07951172%2011.575%201.07113281%2012.4%201.0625%2013.25%20C1.05798828%2014.09046875%201.05347656%2014.9309375%201.04882812%2015.796875%20C1.03707961%2017.86461401%201.01914522%2019.93231624%201%2022%20C1.99%2022%202.98%2022%204%2022%20C4%2028.27%204%2034.54%204%2041%20C-5.24%2041%20-14.48%2041%20-24%2041%20C-24%2040.67%20-24%2040.34%20-24%2040%20C-22.35%2040%20-20.7%2040%20-19%2040%20C-19%2028.12%20-19%2016.24%20-19%204%20C-18.34%203.67%20-17.68%203.34%20-17%203%20C-17%2015.21%20-17%2027.42%20-17%2040%20C-11.72%2040%20-6.44%2040%20-1%2040%20C-1.00523682%2038.82381104%20-1.01047363%2037.64762207%20-1.01586914%2036.43579102%20C-1.03391663%2032.08797969%20-1.04543108%2027.7401717%20-1.05493164%2023.39233398%20C-1.05997244%2021.5075627%20-1.06680498%2019.62279535%20-1.07543945%2017.73803711%20C-1.08751617%2015.03498364%20-1.09323068%2012.33198169%20-1.09765625%209.62890625%20C-1.10281754%208.78099014%20-1.10797882%207.93307404%20-1.11329651%207.0594635%20C-1.11349195%205.03928932%20-1.06206211%203.01922066%20-1%201%20C-0.67%200.67%20-0.34%200.34%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(369,521)'/%3e%3cpath%20d='M0%200%20C7.92%200%2015.84%200%2024%200%20C24%207.26%2024%2014.52%2024%2022%20C11.625%2022.495%2011.625%2022.495%20-1%2023%20C-1.33%2036.2%20-1.66%2049.4%20-2%2063%20C-2.33%2063%20-2.66%2063%20-3%2063%20C-4.13448821%2053.55756734%20-4.00188302%2044.23836711%20-3.6875%2034.75%20C-3.65277588%2033.53530029%20-3.61805176%2032.32060059%20-3.58227539%2031.0690918%20C-3.5383667%2029.92738525%20-3.49445801%2028.78567871%20-3.44921875%2027.609375%20C-3.41143311%2026.57780273%20-3.37364746%2025.54623047%20-3.3347168%2024.48339844%20C-3%2022%20-3%2022%20-1%2020%20C1.15478516%2019.68115234%201.15478516%2019.68115234%203.7890625%2019.5859375%20C5.20058594%2019.52792969%205.20058594%2019.52792969%206.640625%2019.46875%20C7.62546875%2019.4378125%208.6103125%2019.406875%209.625%2019.375%20C11.11386719%2019.31699219%2011.11386719%2019.31699219%2012.6328125%2019.2578125%20C15.08835385%2019.1633686%2017.5438841%2019.07780125%2020%2019%20C19.98839844%2018.18015625%2019.97679687%2017.3603125%2019.96484375%2016.515625%20C19.95582031%2015.43796875%2019.94679688%2014.3603125%2019.9375%2013.25%20C19.92589844%2012.18265625%2019.91429687%2011.1153125%2019.90234375%2010.015625%20C19.98489913%207.46631499%2020.25382442%205.42066409%2021%203%20C20.01966797%203.29197266%2020.01966797%203.29197266%2019.01953125%203.58984375%20C15.00486508%204.13517357%2011.62136988%203.38864783%207.6875%202.5625%20C6.94693359%202.41490234%206.20636719%202.26730469%205.44335938%202.11523438%20C3.62718357%201.75199921%201.81333589%201.37715682%200%201%20C0%200.67%200%200.34%200%200%20Z%20'%20fill='%23A7EA18'%20transform='translate(676,468)'/%3e%3cpath%20d='M0%200%20C1.98%200%203.96%200%206%200%20C6.96345149%205.39532832%206.9764649%2010.29708307%206.5625%2015.75%20C6.15134315%2021.36947121%206.15134315%2021.36947121%206%2027%20C4.94140625%2029.04296875%204.94140625%2029.04296875%203.5625%2031.1875%20C2.88380859%2032.26064453%202.88380859%2032.26064453%202.19140625%2033.35546875%20C1.79824219%2033.89816406%201.40507812%2034.44085938%201%2035%20C0.67%2035%200.34%2035%200%2035%20C0%2023.45%200%2011.9%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(345,472)'/%3e%3cpath%20d='M0%200%20C0.33%200%200.66%200%201%200%20C1%2025.74%201%2051.48%201%2078%20C0.01%2077.67%20-0.98%2077.34%20-2%2077%20C-1.83734146%2076.29841263%20-1.67468292%2075.59682526%20-1.50709534%2074.87397766%20C-0.97453003%2071.8556482%20-0.87991379%2069.08025882%20-0.88647461%2066.01635742%20C-0.88655014%2064.83551071%20-0.88662567%2063.654664%20-0.88670349%2062.43803406%20C-0.89186478%2061.17328751%20-0.89702606%2059.90854095%20-0.90234375%2058.60546875%20C-0.9037587%2057.30297684%20-0.90517365%2056.00048492%20-0.90663147%2054.65852356%20C-0.91043645%2051.20783546%20-0.92024936%2047.75718992%20-0.93133545%2044.30651855%20C-0.94159311%2040.78052343%20-0.9461384%2037.25452139%20-0.95117188%2033.72851562%20C-0.96187356%2026.81899301%20-0.97892557%2019.90949855%20-1%2013%20C-1.99%2012.67%20-2.98%2012.34%20-4%2012%20C-3.649375%2011.236875%20-3.29875%2010.47375%20-2.9375%209.6875%20C-1.67639116%206.95240621%20-1.67639116%206.95240621%20-3%204%20C-1.625%201.8125%20-1.625%201.8125%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(929,483)'/%3e%3cpath%20d='M0%200%20C0.66%200.33%201.32%200.66%202%201%20C3.78043103%208.12172411%203%2015.65909482%203%2023%20C-16.47%2023%20-35.94%2023%20-56%2023%20C-56%2022.67%20-56%2022.34%20-56%2022%20C-28.775%2021.505%20-28.775%2021.505%20-1%2021%20C-1.66%2018.03%20-2.32%2015.06%20-3%2012%20C-2.70676058%207.60140869%20-1.82135506%204.00698114%200%200%20Z%20'%20fill='%2312003B'%20transform='translate(811,500)'/%3e%3cpath%20d='M0%200%20C10.89%200%2021.78%200%2033%200%20C32%202%2032%202%2028.9375%203.125%20C27.968125%203.41375%2026.99875%203.7025%2026%204%20C26%204.33%2026%204.66%2026%205%20C22.9166866%205.02911321%2019.83340875%205.04683682%2016.75%205.0625%20C15.87730469%205.07087891%2015.00460938%205.07925781%2014.10546875%205.08789062%20C13.26113281%205.09111328%2012.41679687%205.09433594%2011.546875%205.09765625%20C10.38430176%205.10551147%2010.38430176%205.10551147%209.19824219%205.11352539%20C6.99642569%204.99981541%205.11528675%204.60281778%203%204%20C2.2575%203.814375%201.515%203.62875%200.75%203.4375%20C0.1725%203.293125%20-0.405%203.14875%20-1%203%20C-0.67%202.01%20-0.34%201.02%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(127,456)'/%3e%3cpath%20d='M0%200%20C0.33%200%200.66%200%201%200%20C1.00808685%200.61085953%201.01617371%201.22171906%201.02450562%201.85108948%20C1.11077125%208.22686062%201.21028396%2014.60232871%201.31738281%2020.9777832%20C1.355592%2023.35500995%201.39045875%2025.73229292%201.421875%2028.10961914%20C1.46770039%2031.53291881%201.52566668%2034.95583411%201.5859375%2038.37890625%20C1.60326431%2039.9652462%201.60326431%2039.9652462%201.62094116%2041.58363342%20C1.73033867%2047.09218328%202.17067468%2051.79123684%204%2057%20C4.66%2057%205.32%2057%206%2057%20C6.061875%2057.61875%206.12375%2058.2375%206.1875%2058.875%20C6.80875315%2061.2501999%206.80875315%2061.2501999%209.375%2062.0625%20C10.24125%2062.371875%2011.1075%2062.68125%2012%2063%20C13.6875%2064.5625%2013.6875%2064.5625%2015%2066%20C15.66%2066.33%2016.32%2066.66%2017%2067%20C17.625%2069.0625%2017.625%2069.0625%2018%2071%20C11.64674292%2069.72934858%207.98595005%2065.83583279%204%2061%20C-0.20320088%2054.43626224%20-1.13694835%2048.50999461%20-1.09375%2040.75%20C-1.09016479%2040.05398682%20-1.08657959%2039.35797363%20-1.08288574%2038.64086914%20C-1.02339219%2030.75687156%20-0.77025329%2022.87906229%20-0.5%2015%20C-0.4515835%2013.53125787%20-0.40340556%2012.06250786%20-0.35546875%2010.59375%20C-0.23971031%207.06240545%20-0.12078988%203.53117647%200%200%20Z%20'%20fill='%23A7EA18'%20transform='translate(649,490)'/%3e%3cpath%20d='M0%200%20C6.93%200%2013.86%200%2021%200%20C21%200.66%2021%201.32%2021%202%20C23.475%202.99%2023.475%202.99%2026%204%20C26%204.33%2026%204.66%2026%205%20C14.78%205%203.56%205%20-8%205%20C-4%203%20-4%203%20-1%202%20C-0.67%201.34%20-0.34%200.68%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(132,539)'/%3e%3cpath%20d='M0%200%20C0.33%200%200.66%200%201%200%20C1.0093457%201.27117676%201.01869141%202.54235352%201.02832031%203.85205078%20C1.0682865%208.58238362%201.13406414%2013.31207062%201.20751953%2018.04199219%20C1.23569066%2020.08650395%201.25692435%2022.13112384%201.27099609%2024.17578125%20C1.29247887%2027.12035322%201.3391569%2030.06363041%201.390625%2033.0078125%20C1.39246796%2034.3722197%201.39246796%2034.3722197%201.39434814%2035.76419067%20C1.52438447%2041.4384366%202.24925859%2044.66233702%206%2049%20C8.30476633%2050.12133721%208.30476633%2050.12133721%2010.75%2050.375%20C11.54921875%2050.50648438%2012.3484375%2050.63796875%2013.171875%2050.7734375%20C13.77515625%2050.84820313%2014.3784375%2050.92296875%2015%2051%20C15%2051.33%2015%2051.66%2015%2052%20C13.22992286%2052.08114106%2011.45877902%2052.13925505%209.6875%2052.1875%20C8.70136719%2052.22230469%207.71523438%2052.25710938%206.69921875%2052.29296875%20C4%2052%204%2052%202.20703125%2050.67578125%20C1%2049%201%2049%200%2046%20C-0.66%2045.34%20-1.32%2044.68%20-2%2044%20C-2.20927429%2042.1337738%20-2.20927429%2042.1337738%20-2.15112305%2039.84155273%20C-2.13417892%2038.98403915%20-2.1172348%2038.12652557%20-2.09977722%2037.24302673%20C-2.07071793%2036.31591385%20-2.04165863%2035.38880096%20-2.01171875%2034.43359375%20C-1.98906448%2033.48436539%20-1.96641022%2032.53513702%20-1.94306946%2031.55714417%20C-1.8930653%2029.54879358%20-1.83809315%2027.54056154%20-1.77856445%2025.5324707%20C-1.68777846%2022.4469639%20-1.61311485%2019.36138491%20-1.54101562%2016.27539062%20C-1.49053325%2014.32810014%20-1.43913222%2012.38083321%20-1.38671875%2010.43359375%20C-1.36373215%209.50445663%20-1.34074554%208.57531952%20-1.31706238%207.61802673%20C-1.29066177%206.76366531%20-1.26426117%205.90930389%20-1.23706055%205.02905273%20C-1.21548386%204.27341537%20-1.19390717%203.51777802%20-1.17167664%202.73924255%20C-1%201%20-1%201%200%200%20Z%20'%20fill='%23C7FF57'%20transform='translate(675,490)'/%3e%3cpath%20d='M0%200%20C0.33%200%200.66%200%201%200%20C1%2014.85%201%2029.7%201%2045%20C-1%2043%20-1%2043%20-1.125%2040.72265625%20C-1.04178877%2038.95181718%20-0.95845579%2037.18098382%20-0.875%2035.41015625%20C-0.80800597%2032.73455911%20-0.80800597%2032.73455911%20-3%2030%20C-2.505%2028.515%20-2.505%2028.515%20-2%2027%20C-2.31050297%2025.32892945%20-2.64717051%2023.66264856%20-3%2022%20C-3.09035285%2020.00160753%20-3.13010313%2018.00042747%20-3.125%2016%20C-3.12757813%2014.989375%20-3.13015625%2013.97875%20-3.1328125%2012.9375%20C-3.00826727%2010.18285256%20-2.62110865%207.68161197%20-2%205%20C-1.34%205%20-0.68%205%200%205%20C0%203.35%200%201.7%200%200%20Z%20'%20fill='%23FFFFFF'%20transform='translate(901,431)'/%3e%3cpath%20d='M0%200%20C2.57069617%203.85604425%202.35065056%207.12746343%202.4140625%2011.60546875%20C2.43342865%2012.44467361%202.4527948%2013.28387848%202.4727478%2014.14851379%20C2.53251213%2016.82807258%202.57891612%2019.5076744%202.625%2022.1875%20C2.6631827%2024.00457599%202.70223461%2025.82163394%202.7421875%2027.63867188%20C2.83821103%2032.09230132%202.92225359%2036.54601551%203%2041%20C3.94101562%2041.29648437%204.88203125%2041.59296875%205.8515625%2041.8984375%20C8.7944432%2042.92808062%2010.6445809%2044.00695307%2013%2046%20C8.86001651%2046.32470459%206.66000999%2046.4304413%203.125%2044.125%20C0.12481839%2041.12481839%200.01401021%2040.48116775%20-0.11352539%2036.10107422%20C-0.11336671%2034.418937%20-0.10769737%2032.73679475%20-0.09765625%2031.0546875%20C-0.0962413%2030.1696756%20-0.09482635%2029.2846637%20-0.09336853%2028.37283325%20C-0.0877614%2025.54018809%20-0.07520771%2022.70762136%20-0.0625%2019.875%20C-0.05748592%2017.95703239%20-0.05292285%2016.03906354%20-0.04882812%2014.12109375%20C-0.03778966%209.41403218%20-0.02052025%204.7070294%200%200%20Z%20'%20fill='%23F2FFD9'%20transform='translate(677,495)'/%3e%3cpath%20d='M0%200%20C0.82200425%206.24723226%20-2.07448606%2010.71317837%20-5%2016%20C-6.95100616%2014.37586398%20-7.92782782%2013.56206818%20-8.2578125%2010.9921875%20C-8.21398437%2010.29351562%20-8.17015625%209.59484375%20-8.125%208.875%20C-8.08375%207.59625%20-8.0425%206.3175%20-8%205%20C-8.98267859%203.79438816%20-8.98267859%203.79438816%20-10.84765625%203.90234375%20C-12.8984375%203.93489583%20-14.94921875%203.96744792%20-17%204%20C-17%203.01%20-17%202.02%20-17%201%20C-14.3541898%200.832959%20-11.70835369%200.66634934%20-9.0625%200.5%20C-8.30775391%200.45230469%20-7.55300781%200.40460938%20-6.77539062%200.35546875%20C-1.11328125%200%20-1.11328125%200%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(369,467)'/%3e%3cpath%20d='M0%200%20C4.29%200%208.58%200%2013%200%20C13.02505615%201.34747314%2013.0501123%202.69494629%2013.07592773%204.08325195%20C13.17000223%209.07602678%2013.27022294%2014.06866249%2013.37231445%2019.0612793%20C13.41566313%2021.2233556%2013.45733825%2023.38546613%2013.49731445%2025.54760742%20C13.55501844%2028.65293702%2013.61871272%2031.75809436%2013.68359375%2034.86328125%20C13.70030624%2035.83211746%2013.71701874%2036.80095367%2013.73423767%2037.79914856%20C13.75418289%2038.6998558%2013.77412811%2039.60056305%2013.79467773%2040.52856445%20C13.81022202%2041.32132278%2013.8257663%2042.11408112%2013.84178162%2042.93086243%20C13.93081226%2045.19739774%2013.93081226%2045.19739774%2015%2048%20C15.12781786%2050.67394964%2015.04391871%2053.32095857%2015%2056%20C14.67%2056%2014.34%2056%2014%2056%20C13.29066112%2053.54623548%2012.60781467%2051.08945724%2011.9375%2048.625%20C11.73833984%2047.94566406%2011.53917969%2047.26632812%2011.33398438%2046.56640625%20C10.04560625%2041.72933752%2010.02964032%2037.78697173%2010.67358398%2032.84228516%20C11.33901124%2027.04804123%2011.37950304%2021.20090331%2011.5625%2015.375%20C11.60568359%2014.08464844%2011.64886719%2012.79429687%2011.69335938%2011.46484375%20C11.79852148%208.30998067%2011.90066604%205.15505105%2012%202%20C11.25363281%202.17402344%2010.50726562%202.34804688%209.73828125%202.52734375%20C6.30488867%203.11998355%203.41085419%202.60191545%200%202%20C0%201.34%200%200.68%200%200%20Z%20'%20fill='%23F2FFD9'%20transform='translate(633,491)'/%3e%3cpath%20d='M0%200%20C7.26%200%2014.52%200%2022%200%20C21.34%200.66%2020.68%201.32%2020%202%20C20.33%202.66%2020.66%203.32%2021%204%20C14.73%204%208.46%204%202%204%20C2%206.64%202%209.28%202%2012%20C1.34%2012.66%200.68%2013.32%200%2014%20C0.01160156%2013.30132812%200.02320313%2012.60265625%200.03515625%2011.8828125%20C0.04417969%2010.97273438%200.05320313%2010.06265625%200.0625%209.125%20C0.07410156%208.22007812%200.08570313%207.31515625%200.09765625%206.3828125%20C0.16249257%203.9831415%200.16249257%203.9831415%20-1%202%20C-0.67%201.34%20-0.34%200.68%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(230,468)'/%3e%3cpath%20d='M0%200%20C3.26587942%200.14550948%206.38789358%200.49324673%209.5625%201.3125%20C9.2325%202.3025%208.9025%203.2925%208.5625%204.3125%20C9.2225%204.6425%209.8825%204.9725%2010.5625%205.3125%20C9.5625%206.3125%209.5625%206.3125%206.87866211%206.42602539%20C5.71085205%206.42078857%204.54304199%206.41555176%203.33984375%206.41015625%20C2.07978516%206.40693359%200.81972656%206.40371094%20-0.47851562%206.40039062%20C-1.81901109%206.39203403%20-3.15950588%206.38356907%20-4.5%206.375%20C-5.84439942%206.3699866%20-7.1888006%206.36542342%20-8.53320312%206.36132812%20C-11.83467941%206.34949488%20-15.13606803%206.33300971%20-18.4375%206.3125%20C-15.4375%204.3125%20-15.4375%204.3125%20-12%204.4375%20C-8.38721028%204.72990718%20-8.38721028%204.72990718%20-6.5625%202.3125%20C-4.04895307%20-0.05319123%20-3.34014743%200.01650814%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(584.4375,465.6875)'/%3e%3cpath%20d='M0%200%20C1.32%200%202.64%200%204%200%20C4%200.66%204%201.32%204%202%20C4.73605469%201.855625%205.47210937%201.71125%206.23046875%201.5625%20C7.20628906%201.376875%208.18210937%201.19125%209.1875%201%20C10.15042969%200.814375%2011.11335937%200.62875%2012.10546875%200.4375%20C18.83937824%20-0.58031088%2018.83937824%20-0.58031088%2022%201%20C22.99%200.67%2023.98%200.34%2025%200%20C25.33%200.33%2025.66%200.66%2026%201%20C27.99964982%201.08758003%2030.0023611%201.10696576%2032.00390625%201.09765625%20C33.82631836%201.09282227%2033.82631836%201.09282227%2035.68554688%201.08789062%20C36.96494141%201.07951172%2038.24433594%201.07113281%2039.5625%201.0625%20C41.48739258%201.05573242%2041.48739258%201.05573242%2043.45117188%201.04882812%20C46.63416022%201.03699545%2049.81705762%201.02051068%2053%201%20C53.495%201.99%2053.495%201.99%2054%203%20C36.18%203%2018.36%203%200%203%20C0%202.01%200%201.02%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(731,509)'/%3e%3cpath%20d='M0%200%20C3.3%200%206.6%200%2010%200%20C10%200.33%2010%200.66%2010%201%20C7.69%201.33%205.38%201.66%203%202%20C3%204.64%203%207.28%203%2010%20C3.66%209.67%204.32%209.34%205%209%20C6.44848582%208.91657841%207.90070869%208.89267139%209.3515625%208.90234375%20C10.20234375%208.90556641%2011.053125%208.90878906%2011.9296875%208.91210938%20C12.81914063%208.92048828%2013.70859375%208.92886719%2014.625%208.9375%20C15.5221875%208.94201172%2016.419375%208.94652344%2017.34375%208.95117188%20C19.56256648%208.96297409%2021.78125018%208.97943845%2024%209%20C24%209.99%2024%2010.98%2024%2012%20C16.08%2012%208.16%2012%200%2012%20C0%208.04%200%204.08%200%200%20Z%20'%20fill='%23E8FFC2'%20transform='translate(676,456)'/%3e%3cpath%20d='M0%200%20C0.33%200%200.66%200%201%200%20C1.02893932%203.62498334%201.04677792%207.24993713%201.0625%2010.875%20C1.07087891%2011.90753906%201.07925781%2012.94007813%201.08789062%2014.00390625%20C1.09111328%2014.99003906%201.09433594%2015.97617187%201.09765625%2016.9921875%20C1.10289307%2017.90339355%201.10812988%2018.81459961%201.11352539%2019.75341797%20C1%2022%201%2022%200%2024%20C-0.99%2023.67%20-1.98%2023.34%20-3%2023%20C-5.01862148%2017.75866703%20-4.98056566%2010.73616357%20-3.10546875%205.50390625%20C-2.15670432%203.62314001%20-1.08879621%201.80331872%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(831,508)'/%3e%3cpath%20d='M0%200%20C1.98%200%203.96%200%206%200%20C5.67%200.99%205.34%201.98%205%203%20C5.99%203.33%206.98%203.66%208%204%20C7.34%204%206.68%204%206%204%20C6.66%205.65%207.32%207.3%208%209%20C9.65%208.67%2011.3%208.34%2013%208%20C13.33%209.32%2013.66%2010.64%2014%2012%20C16.31%2012%2018.62%2012%2021%2012%20C21%2011.34%2021%2010.68%2021%2010%20C21.66%2010%2022.32%2010%2023%2010%20C23.33%2010.99%2023.66%2011.98%2024%2013%20C18.94576102%2014.68474633%2014.71544468%2014.58019314%209.875%2012.375%20C5.29909504%209.86935884%201.9168134%206.67991608%200.1875%201.625%20C0.125625%201.08875%200.06375%200.5525%200%200%20Z%20'%20fill='%236F9300'%20transform='translate(690,541)'/%3e%3cpath%20d='M0%200%20C6.93%200.33%2013.86%200.66%2021%201%20C20.34%201.66%2019.68%202.32%2019%203%20C19.33%203.66%2019.66%204.32%2020%205%20C17.10410348%205.02706445%2014.20846205%205.04687029%2011.3125%205.0625%20C10.08756836%205.07506836%2010.08756836%205.07506836%208.83789062%205.08789062%20C4.75500916%205.10442051%200.98348293%205.03035098%20-3%204%20C-2.34%203.67%20-1.68%203.34%20-1%203%20C-0.67%202.01%20-0.34%201.02%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(241,593)'/%3e%3cpath%20d='M0%200%20C0.33%200%200.66%200%201%200%20C1%208.25%201%2016.5%201%2025%20C0.34%2025%20-0.32%2025%20-1%2025%20C-3.52775351%2021.20836973%20-3.22443035%2018.19125969%20-3.125%2013.8125%20C-3.11597656%2013.06291016%20-3.10695312%2012.31332031%20-3.09765625%2011.54101562%20C-3.07412578%209.69387346%20-3.03825561%207.84689588%20-3%206%20C-2.67%206%20-2.34%206%20-2%206%20C-1.34%204.02%20-0.68%202.04%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(191,487)'/%3e%3cpath%20d='M0%200%20C0.66%200.66%201.32%201.32%202%202%20C1.525625%202.845625%201.05125%203.69125%200.5625%204.5625%20C-1.69167803%209.67126796%20-1.51097377%2015.18235336%20-1.69140625%2020.671875%20C-2%2024%20-2%2024%20-4%2027%20C-4.39387788%2029.32387947%20-4.73486085%2031.65793749%20-5%2034%20C-5.33%2034%20-5.66%2034%20-6%2034%20C-6.52846015%2021.74266038%20-5.86678537%2011.12575063%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(832,489)'/%3e%3cpath%20d='M0%200%20C0.98742187%200.16242187%201.97484375%200.32484375%202.9921875%200.4921875%20C7.03537925%201.06688527%2011.04640663%201.15126811%2015.125%201.125%20C15.858396%201.12306641%2016.59179199%201.12113281%2017.34741211%201.11914062%20C23.93030125%201.06771738%2030.4468302%200.63822175%2037%200%20C33.42278921%202.9386979%2031.63341748%203.18911908%2027%203%20C22.9008693%203.63063549%2018.97489026%204.83091463%2015%206%20C15%205.34%2015%204.68%2015%204%20C13.02%204.66%2011.04%205.32%209%206%20C8.67%205.34%208.34%204.68%208%204%20C6.8553125%204.12375%206.8553125%204.12375%205.6875%204.25%20C3%204%203%204%201.1875%202%20C0.5996875%201.01%200.5996875%201.01%200%200%20Z%20'%20fill='%23F2FFD9'%20transform='translate(667,563)'/%3e%3cpath%20d='M0%200%20C-1.70577342%200.65256456%20-3.41476089%201.29673041%20-5.125%201.9375%20C-6.07632813%202.29714844%20-7.02765625%202.65679688%20-8.0078125%203.02734375%20C-18.08362171%206.30263943%20-29.94180625%206.28430816%20-40%203%20C-37.09031691%202.16087482%20-34.5469594%201.89148572%20-31.5234375%201.9375%20C-30.27046875%201.94910156%20-30.27046875%201.94910156%20-28.9921875%201.9609375%20C-28.12851562%201.97382812%20-27.26484375%201.98671875%20-26.375%202%20C-24.65370809%202.0254629%20-22.93234349%202.04651171%20-21.2109375%202.0625%20C-20.45087402%202.07410156%20-19.69081055%202.08570313%20-18.90771484%202.09765625%20C-16.91256704%202.12332635%20-16.91256704%202.12332635%20-15%201%20C-12.70190464%200.69130062%20-10.40279871%200.49116352%20-8.09375%200.28125%20C-1.8556701%20-0.55670103%20-1.8556701%20-0.55670103%200%200%20Z%20'%20fill='%23C7FF57'%20transform='translate(707,559)'/%3e%3cpath%20d='M0%200%20C9.57%200%2019.14%200%2029%200%20C29%200.33%2029%200.66%2029%201%20C21.41%201%2013.82%201%206%201%20C6.33%202.32%206.66%203.64%207%205%20C6.87890625%207.359375%206.87890625%207.359375%206.5625%209.75%20C6.46066406%2010.54921875%206.35882813%2011.3484375%206.25390625%2012.171875%20C6.12822266%2013.07679688%206.12822266%2013.07679688%206%2014%20C4.31821339%2011.47732009%203.09893258%209.18908177%201.875%206.4375%20C1.52179688%205.65246094%201.16859375%204.86742187%200.8046875%204.05859375%20C0%202%200%202%200%200%20Z%20'%20fill='%2312003B'%20transform='translate(224,467)'/%3e%3cpath%20d='M0%200%20C0.33%200%200.66%200%201%200%20C1%207.59%201%2015.18%201%2023%20C0.01%2023%20-0.98%2023%20-2%2023%20C-3.53887884%208.19349005%20-3.53887884%208.19349005%20-1%201%20C-0.67%200.67%20-0.34%200.34%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(372,520)'/%3e%3cpath%20d='M0%200%20C6.93%200%2013.86%200%2021%200%20C19.02%200.99%2019.02%200.99%2017%202%20C16.37609375%202.53238281%2015.7521875%203.06476563%2015.109375%203.61328125%20C12.34672115%205.42947035%2010.52244363%205.30437299%207.25%205.1875%20C5.77273438%205.14689453%205.77273438%205.14689453%204.265625%205.10546875%20C3.14414062%205.05326172%203.14414062%205.05326172%202%205%20C2.33%204.01%202.66%203.02%203%202%20C2.01%201.34%201.02%200.68%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(454,466)'/%3e%3cpath%20d='M0%200%20C0.33%200%200.66%200%201%200%20C1%202.97%201%205.94%201%209%20C2.32451172%208.87431641%202.32451172%208.87431641%203.67578125%208.74609375%20C11.27709596%208.10108423%2018.43413122%207.99636435%2026%209%20C26%209.66%2026%2010.32%2026%2011%20C17.42%2011%208.84%2011%200%2011%20C0%207.37%200%203.74%200%200%20Z%20'%20fill='%2312003B'%20transform='translate(904,552)'/%3e%3cpath%20d='M0%200%20C1.28132812%200.00902344%202.56265625%200.01804687%203.8828125%200.02734375%20C4.87023437%200.03894531%205.85765625%200.05054688%206.875%200.0625%20C6.875%200.7225%206.875%201.3825%206.875%202.0625%20C7.535%202.3925%208.195%202.7225%208.875%203.0625%20C7.875%204.0625%207.875%204.0625%204.27734375%204.16015625%20C2.78903133%204.1534822%201.30073568%204.14152183%20-0.1875%204.125%20C-0.94611328%204.12048828%20-1.70472656%204.11597656%20-2.48632812%204.11132812%20C-4.36591871%204.0995068%20-6.24546899%204.08157078%20-8.125%204.0625%20C-8.455%203.0725%20-8.785%202.0825%20-9.125%201.0625%20C-6.12186252%20-0.43906874%20-3.33432478%20-0.03031204%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(874.125,559.9375)'/%3e%3cpath%20d='M0%200%20C0.33%200%200.66%200%201%200%20C1%202.97%201%205.94%201%209%20C3.31%209%205.62%209%208%209%20C6.47291037%2012.43595166%204.40072955%2015.11912454%202%2018%20C1.01%2017.67%200.02%2017.34%20-1%2017%20C-0.67%2011.39%20-0.34%205.78%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(351,479)'/%3e%3cpath%20d='M0%200%20C6.6%200%2013.2%200%2020%200%20C20%200.99%2020%201.98%2020%203%20C15.38%203.33%2010.76%203.66%206%204%20C6%203.67%206%203.34%206%203%20C3.03%202.505%203.03%202.505%200%202%20C0%201.34%200%200.68%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(384,488)'/%3e%3cpath%20d='M0%200%20C14.7664042%20-0.22834646%2014.7664042%20-0.22834646%2022%201%20C23%202%2023%202%2023.09765625%204.50390625%20C23.08605469%205.51324219%2023.07445312%206.52257812%2023.0625%207.5625%20C23.05347656%208.57441406%2023.04445313%209.58632813%2023.03515625%2010.62890625%20C23.02355469%2011.41136719%2023.01195312%2012.19382812%2023%2013%20C22.67%2013%2022.34%2013%2022%2013%20C21.505%208.05%2021.505%208.05%2021%203%20C20.01966797%203.29197266%2020.01966797%203.29197266%2019.01953125%203.58984375%20C15.00486508%204.13517357%2011.62136988%203.38864783%207.6875%202.5625%20C6.94693359%202.41490234%206.20636719%202.26730469%205.44335938%202.11523438%20C3.62718357%201.75199921%201.81333589%201.37715682%200%201%20C0%200.67%200%200.34%200%200%20Z%20'%20fill='%23B6FF2E'%20transform='translate(676,468)'/%3e%3cpath%20d='M0%200%20C5.61%200.33%2011.22%200.66%2017%201%20C14%204%2014%204%2010.64453125%204.29296875%20C9.37996094%204.25816406%208.11539063%204.22335937%206.8125%204.1875%20C5.54019531%204.16042969%204.26789062%204.13335938%202.95703125%204.10546875%20C1.98121094%204.07066406%201.00539063%204.03585937%200%204%20C0%202.68%200%201.36%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(569,540)'/%3e%3cpath%20d='M0%200%20C6.27%200%2012.54%200%2019%200%20C18.01%200.495%2018.01%200.495%2017%201%20C17%201.66%2017%202.32%2017%203%20C11.39%203%205.78%203%200%203%20C0%202.01%200%201.02%200%200%20Z%20'%20fill='%23F0E9FF'%20transform='translate(761,523)'/%3e%3cpath%20d='M0%200%20C0.33%200%200.66%200%201%200%20C1.33%209.24%201.66%2018.48%202%2028%20C2.99%2028.33%203.98%2028.66%205%2029%20C3.69593116%2031.01920337%202.36176581%2033.01924973%201%2035%20C0.67%2035%200.34%2035%200%2035%20C0%2023.45%200%2011.9%200%200%20Z%20'%20fill='%2312003B'%20transform='translate(345,472)'/%3e%3cpath%20d='M0%200%20C0%201.65%200%203.3%200%205%20C-1.134375%205.28875%20-2.26875%205.5775%20-3.4375%205.875%20C-4.613125%206.24625%20-5.78875%206.6175%20-7%207%20C-8.2981424%209.2236068%20-8.2981424%209.2236068%20-8%2013%20C-8.66%2013%20-9.32%2013%20-10%2013%20C-11%2010.4375%20-11%2010.4375%20-11%207%20C-7.98890645%203.33845177%20-4.8796426%200%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(736,475)'/%3e%3cpath%20d='M0%200%20C0.66%200%201.32%200%202%200%20C2%200.66%202%201.32%202%202%20C3.36125%202.37125%203.36125%202.37125%204.75%202.75%20C8.13493865%204.05189948%209.60793414%205.35164137%2012%208%20C12.66%208.33%2013.32%208.66%2014%209%20C14.625%2011.0625%2014.625%2011.0625%2015%2013%20C8.7298413%2011.74596826%204.95911962%207.77173128%201%203%20C0.67%202.01%200.34%201.02%200%200%20Z%20'%20fill='%23C7FF57'%20transform='translate(652,548)'/%3e%3cpath%20d='M0%200%20C0.33%200%200.66%200%201%200%20C1%204.62%201%209.24%201%2014%20C0.01%2014.495%200.01%2014.495%20-1%2015%20C-1%2014.01%20-1%2013.02%20-1%2012%20C-1.99%2012%20-2.98%2012%20-4%2012%20C-3.53439347%207.25081338%20-2.83067342%203.89217595%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(287,513)'/%3e%3cpath%20d='M0%200%20C2.4375%200.8125%202.4375%200.8125%205%202%20C5.33%202.99%205.66%203.98%206%205%20C7.49985609%206.66710346%207.49985609%206.66710346%209%208%20C5.68585212%2012.10954337%203.12159208%2012.43093421%20-2%2013%20C-2.66%2013.66%20-3.32%2014.32%20-4%2015%20C-3.67%2013.35%20-3.34%2011.7%20-3%2010%20C1.455%209.505%201.455%209.505%206%209%20C5.566875%208.43410156%205.13375%207.86820312%204.6875%207.28515625%20C3.8521875%206.18494141%203.8521875%206.18494141%203%205.0625%20C2.1646875%203.96615234%202.1646875%203.96615234%201.3125%202.84765625%20C0%201%200%201%200%200%20Z%20'%20fill='%23F2FFD9'%20transform='translate(682,447)'/%3e%3cpath%20d='M0%200%20C2.31%200%204.62%200%207%200%20C6.67%201.32%206.34%202.64%206%204%20C-1.26%204%20-8.52%204%20-16%204%20C-16%203.67%20-16%203.34%20-16%203%20C-11.05%203%20-6.1%203%20-1%203%20C-0.67%202.01%20-0.34%201.02%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(472,560)'/%3e%3cpath%20d='M0%200%20C3.63%200%207.26%200%2011%200%20C9%204%209%204%207.25%204.8125%20C4.36824559%205.0526462%201.82252185%204.57733402%20-1%204%20C-0.67%202.68%20-0.34%201.36%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(449,506)'/%3e%3cpath%20d='M0%200%20C3.3%200.33%206.6%200.66%2010%201%20C10.33%202.32%2010.66%203.64%2011%205%20C9.58376784%205.05447047%208.16691809%205.09300508%206.75%205.125%20C5.96109375%205.14820313%205.1721875%205.17140625%204.359375%205.1953125%20C1.79268059%204.9828378%200.2083933%204.28654105%20-2%203%20C-1.34%202.01%20-0.68%201.02%200%200%20Z%20'%20fill='%23F0E9FF'%20transform='translate(760,537)'/%3e%3cpath%20d='M0%200%20C0.66%200.33%201.32%200.66%202%201%20C1.67%201.99%201.34%202.98%201%204%20C1.74765625%203.97679687%202.4953125%203.95359375%203.265625%203.9296875%20C4.25046875%203.91164063%205.2353125%203.89359375%206.25%203.875%20C7.22453125%203.85179687%208.1990625%203.82859375%209.203125%203.8046875%20C12%204%2012%204%2016%206%20C9.73%206%203.46%206%20-3%206%20C-3%204.68%20-3%203.36%20-3%202%20C-2.01%202%20-1.02%202%200%202%20C0%201.34%200%200.68%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(447,506)'/%3e%3cpath%20d='M0%200%20C0.33%200%200.66%200%201%200%20C1.22212255%202.74951693%201.42815588%205.49865612%201.625%208.25%20C1.68945312%209.02730469%201.75390625%209.80460937%201.8203125%2010.60546875%20C2.30707097%2017.72431144%202.30707097%2017.72431144%200%2021%20C-0.86860031%2016.51223172%20-1.13464852%2012.25607233%20-1.125%207.6875%20C-1.12757813%206.45386719%20-1.13015625%205.22023438%20-1.1328125%203.94921875%20C-1%201%20-1%201%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(553,496)'/%3e%3cpath%20d='M0%200%20C0%201.65%200%203.3%200%205%20C-3.63%205%20-7.26%205%20-11%205%20C-11.33%204.34%20-11.66%203.68%20-12%203%20C-10.75336669%202.49166409%20-9.50250613%201.99368855%20-8.25%201.5%20C-7.55390625%201.2215625%20-6.8578125%200.943125%20-6.140625%200.65625%20C-4%200%20-4%200%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(454,467)'/%3e%3cpath%20d='M0%200%20C0.98613281%200.03480469%201.97226562%200.06960938%202.98828125%200.10546875%20C3.98214844%200.13253906%204.97601563%200.15960937%206%200.1875%20C7.13888672%200.23970703%207.13888672%200.23970703%208.30078125%200.29296875%20C8.63078125%201.28296875%208.96078125%202.27296875%209.30078125%203.29296875%20C4.35078125%203.29296875%20-0.59921875%203.29296875%20-5.69921875%203.29296875%20C-2.69921875%200.29296875%20-2.69921875%200.29296875%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(461.69921875,559.70703125)'/%3e%3cpath%20d='M0%200%20C0.56203125%200.30679688%201.1240625%200.61359375%201.703125%200.9296875%20C4.06346934%202.02957585%206.20465562%202.60095851%208.75%203.125%20C9.54921875%203.29257812%2010.3484375%203.46015625%2011.171875%203.6328125%20C11.77515625%203.75398437%2012.3784375%203.87515625%2013%204%20C13%204.66%2013%205.32%2013%206%20C8.126739%207.5912689%204.19209404%208.21192221%20-1%208%20C0.32%207.34%201.64%206.68%203%206%20C2.690625%205.38125%202.38125%204.7625%202.0625%204.125%20C1.375%202.75%200.6875%201.375%200%200%20Z%20'%20fill='%23A7EA18'%20transform='translate(695,552)'/%3e%3cpath%20d='M0%200%20C-0.99%201.485%20-0.99%201.485%20-2%203%20C-4.8984375%203.36328125%20-4.8984375%203.36328125%20-8.375%203.3125%20C-9.51710938%203.30863281%20-10.65921875%203.30476562%20-11.8359375%203.30078125%20C-14.80057739%203.01895746%20-16.49947121%202.54589341%20-19%201%20C-12.65758005%20-0.15316726%20-6.43311296%20-0.09507063%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(884,541)'/%3e%3cpath%20d='M0%200%20C1.58323688%20-0.027193%203.16661062%20-0.04648306%204.75%20-0.0625%20C6.07257812%20-0.07990234%206.07257812%20-0.07990234%207.421875%20-0.09765625%20C9.7818838%20-0.00826198%2011.74498524%200.33087179%2014%201%20C14%201.66%2014%202.32%2014%203%20C9.05%203%204.1%203%20-1%203%20C-0.67%202.01%20-0.34%201.02%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(581,560)'/%3e%3cpath%20d='M0%200%20C0%200.99%200%201.98%200%203%20C-5.28%203%20-10.56%203%20-16%203%20C-16%202.34%20-16%201.68%20-16%201%20C-10.62915894%200.31798844%20-5.41499441%20-0.11521265%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(479,541)'/%3e%3cpath%20d='M0%200%20C0.33%200%200.66%200%201%200%20C1%205.28%201%2010.56%201%2016%20C-2.37152003%2012.62847997%20-2.82142723%2011.64289204%20-3%207%20C-2.21181089%204.49988422%20-1.17946058%202.35892116%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(247,504)'/%3e%3cpath%20d='M0%200%20C0.66%200.33%201.32%200.66%202%201%20C2.08082094%202.95766281%202.13910778%204.91626728%202.1875%206.875%20C2.23970703%208.51082031%202.23970703%208.51082031%202.29296875%2010.1796875%20C2.19628906%2011.11039062%202.09960938%2012.04109375%202%2013%20C1.01%2013.66%200.02%2014.32%20-1%2015%20C-1.02685412%2012.68756208%20-1.04632841%2010.3750373%20-1.0625%208.0625%20C-1.07410156%206.77472656%20-1.08570312%205.48695313%20-1.09765625%204.16015625%20C-1%201%20-1%201%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(121,466)'/%3e%3cpath%20d='M0%200%20C0%202.97%200%205.94%200%209%20C-0.99%209.495%20-0.99%209.495%20-2%2010%20C-3.32%206.7%20-4.64%203.4%20-6%200%20C-2%20-1%20-2%20-1%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(254,523)'/%3e%3cpath%20d='M0%200%20C2.64%200.33%205.28%200.66%208%201%20C7.34%202.32%206.68%203.64%206%205%20C3.69%205%201.38%205%20-1%205%20C-0.67%203.35%20-0.34%201.7%200%200%20Z%20'%20fill='%23F0E9FF'%20transform='translate(880,489)'/%3e%3cpath%20d='M0%200%20C1.953125%200.390625%203.90625%200.78125%205.859375%201.171875%20C5.859375%202.161875%205.859375%203.151875%205.859375%204.171875%20C1.899375%204.171875%20-2.060625%204.171875%20-6.140625%204.171875%20C-2.140625%200.171875%20-2.140625%200.171875%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(780.140625,467.828125)'/%3e%3cpath%20d='M0%200%20C0.598125%200.20625%201.19625%200.4125%201.8125%200.625%20C0.8225%200.955%20-0.1675%201.285%20-1.1875%201.625%20C-1.5175%205.915%20-1.8475%2010.205%20-2.1875%2014.625%20C-2.8475%2014.295%20-3.5075%2013.965%20-4.1875%2013.625%20C-4.6015625%2010.90234375%20-4.6015625%2010.90234375%20-4.8125%207.5625%20C-4.88726563%206.45777344%20-4.96203125%205.35304688%20-5.0390625%204.21484375%20C-5.08804688%203.36019531%20-5.13703125%202.50554687%20-5.1875%201.625%20C-2.1875%20-0.375%20-2.1875%20-0.375%200%200%20Z%20'%20fill='%23C7FF57'%20transform='translate(678.1875,453.375)'/%3e%3cpath%20d='M0%200%20C3%203.75%203%203.75%203%206%20C0.03%206%20-2.94%206%20-6%206%20C-5.67%204.68%20-5.34%203.36%20-5%202%20C-2.4375%200.75%20-2.4375%200.75%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(743,538)'/%3e%3cpath%20d='M0%200%20C3.63%200%207.26%200%2011%200%20C9.515%201.98%209.515%201.98%208%204%20C4.8125%204.25%204.8125%204.25%202%204%20C1.34%202.68%200.68%201.36%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(473,506)'/%3e%3cpath%20d='M0%200%20C0.33%200%200.66%200%201%200%20C2.62227918%205.43940666%203.3864587%209.33862697%202%2015%20C1.01%2015.495%201.01%2015.495%200%2016%20C0%2013.36%200%2010.72%200%208%20C-0.66%207.67%20-1.32%207.34%20-2%207%20C-1.125%202.25%20-1.125%202.25%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(294,496)'/%3e%3cpath%20d='M0%200%20C1.134375%200.020625%202.26875%200.04125%203.4375%200.0625%20C4.0975%202.0425%204.7575%204.0225%205.4375%206.0625%20C4.4475%206.7225%203.4575%207.3825%202.4375%208.0625%20C0.10416667%205.72916667%20-2.22916667%203.39583333%20-4.5625%201.0625%20C-3.5625%200.0625%20-3.5625%200.0625%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(594.5625,489.9375)'/%3e%3cpath%20d='M0%200%20C0%200.33%200%200.66%200%201%20C-2.31%201%20-4.62%201%20-7%201%20C-7%201.66%20-7%202.32%20-7%203%20C-7.99%203%20-8.98%203%20-10%203%20C-10%203.66%20-10%204.32%20-10%205%20C-11.65%205%20-13.3%205%20-15%205%20C-15%204.34%20-15%203.68%20-15%203%20C-15.66%202.67%20-16.32%202.34%20-17%202%20C-11.19233704%200.4943096%20-6.0018137%20-0.21824777%200%200%20Z%20'%20fill='%2312003B'%20transform='translate(750,506)'/%3e%3cpath%20d='M0%200%20C0.33%200%200.66%200%201%200%20C1%203.63%201%207.26%201%2011%20C0.34%209.68%20-0.32%208.36%20-1%207%20C-2.32%207.33%20-3.64%207.66%20-5%208%20C-4.67%206.35%20-4.34%204.7%20-4%203%20C-3.01%203%20-2.02%203%20-1%203%20C-0.67%202.01%20-0.34%201.02%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(303,481)'/%3e%3cpath%20d='M0%200%20C4.62%200%209.24%200%2014%200%20C14%200.66%2014%201.32%2014%202%20C11%203%2011%203%208.625%202.4375%20C5.45352412%201.90892069%203.84890119%202.61624799%201%204%20C0.67%202.68%200.34%201.36%200%200%20Z%20'%20fill='%2394D600'%20transform='translate(634,469)'/%3e%3cpath%20d='M0%200%20C0.33%200%200.66%200%201%200%20C1%202.64%201%205.28%201%208%20C-5.27%207.67%20-11.54%207.34%20-18%207%20C-18%206.67%20-18%206.34%20-18%206%20C-9.585%205.505%20-9.585%205.505%20-1%205%20C-0.67%203.35%20-0.34%201.7%200%200%20Z%20'%20fill='%23F0E9FF'%20transform='translate(931,557)'/%3e%3cpath%20d='M0%200%20C0.66%200.33%201.32%200.66%202%201%20C1.34%203.31%200.68%205.62%200%208%20C-0.99%208%20-1.98%208%20-3%208%20C-3%205.69%20-3%203.38%20-3%201%20C-2.01%200.67%20-1.02%200.34%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(621,536)'/%3e%3cpath%20d='M0%200%20C0.33%200%200.66%200%201%200%20C1.66%202.97%202.32%205.94%203%209%20C-0.96%209%20-4.92%209%20-9%209%20C-8.67%208.34%20-8.34%207.68%20-8%207%20C-5.69%207%20-3.38%207%20-1%207%20C-0.67%204.69%20-0.34%202.38%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(808,513)'/%3e%3cpath%20d='M0%200%20C0%203.73675706%20-1.26051811%205.72174568%20-3%209%20C-3.391875%209.78375%20-3.78375%2010.5675%20-4.1875%2011.375%20C-4.455625%2011.91125%20-4.72375%2012.4475%20-5%2013%20C-5.99%2013%20-6.98%2013%20-8%2013%20C-7.51294002%208.6164602%20-6.21626567%206.93247752%20-3%204%20C-1.97676564%202.68441297%20-0.96873032%201.35622245%200%200%20Z%20'%20fill='%23A7EA18'%20transform='translate(648,441)'/%3e%3cpath%20d='M0%200%20C0.66%200.33%201.32%200.66%202%201%20C2.36923077%206.53846154%202.36923077%206.53846154%200.5%208.875%20C-0.2425%209.431875%20-0.2425%209.431875%20-1%2010%20C-1.66%209.67%20-2.32%209.34%20-3%209%20C-2.30058404%205.85262818%20-1.23921302%202.97411124%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(228,582)'/%3e%3cpath%20d='M0%200%20C0.66%200%201.32%200%202%200%20C2.125%205.75%202.125%205.75%201%208%20C0.34%208%20-0.32%208%20-1%208%20C-1.33%208.99%20-1.66%209.98%20-2%2011%20C-3.13643966%207.59068103%20-2.86747764%206.99664544%20-1.5625%203.8125%20C-1.13130859%202.73935547%20-1.13130859%202.73935547%20-0.69140625%201.64453125%20C-0.46324219%201.10183594%20-0.23507812%200.55914063%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(350,514)'/%3e%3cpath%20d='M0%200%20C3.3%200%206.6%200%2010%200%20C10.33%201.32%2010.66%202.64%2011%204%20C9.35%204%207.7%204%206%204%20C6%203.67%206%203.34%206%203%20C3.03%202.505%203.03%202.505%200%202%20C0%201.34%200%200.68%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(384,488)'/%3e%3cpath%20d='M0%200%20C0.845625%200.804375%201.69125%201.60875%202.5625%202.4375%20C5.8515158%205.21628662%208.68629604%205.74117776%2013%206%20C13%206.33%2013%206.66%2013%207%20C11.20866022%207.05391993%209.41686101%207.09275571%207.625%207.125%20C6.62726562%207.14820313%205.62953125%207.17140625%204.6015625%207.1953125%20C2%207%202%207%200%205%20C-0.125%202.375%20-0.125%202.375%200%200%20Z%20'%20fill='%23DFFF99'%20transform='translate(677,535)'/%3e%3cpath%20d='M0%200%20C0.33%201.65%200.66%203.3%201%205%20C-1.97%205%20-4.94%205%20-8%205%20C-3%200%20-3%200%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(175,531)'/%3e%3cpath%20d='M0%200%20C2.97%200%205.94%200%209%200%20C9.33%200.66%209.66%201.32%2010%202%20C3.71428571%204.42857143%203.71428571%204.42857143%200%203%20C0%202.01%200%201.02%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(739,522)'/%3e%3cpath%20d='M0%200%20C0.66%200%201.32%200%202%200%20C2.33%203.63%202.66%207.26%203%2011%20C2.01%2011%201.02%2011%200%2011%20C0%207.37%200%203.74%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(304,520)'/%3e%3cpath%20d='M0%200%20C0%200.66%200%201.32%200%202%20C-4.95%202%20-9.9%202%20-15%202%20C-11.5998228%200.2999114%20-9.96676075%20-0.32111638%20-6.375%20-0.6875%20C-5.21097656%20-0.81705078%20-5.21097656%20-0.81705078%20-4.0234375%20-0.94921875%20C-2%20-1%20-2%20-1%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(507,520)'/%3e%3cpath%20d='M0%200%20C0.33%200%200.66%200%201%200%20C1.33%202.97%201.66%205.94%202%209%20C1.01%209.33%200.02%209.66%20-1%2010%20C-2.1875%207.8125%20-2.1875%207.8125%20-3%205%20C-1.6875%202.1875%20-1.6875%202.1875%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(421,489)'/%3e%3cpath%20d='M0%200%20C0.66%200%201.32%200%202%200%20C2%203.96%202%207.92%202%2012%20C1.01%2011.67%200.02%2011.34%20-1%2011%20C-0.67%207.37%20-0.34%203.74%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(238,488)'/%3e%3cpath%20d='M0%200%20C1.32%200%202.64%200%204%200%20C4%200.99%204%201.98%204%203%20C4.66%203%205.32%203%206%203%20C7.0625%204.8125%207.0625%204.8125%208%207%20C7.67%207.99%207.34%208.98%207%2010%20C5.83043409%208.52312468%204.66441854%207.04343707%203.5%205.5625%20C2.8503125%204.73878906%202.200625%203.91507812%201.53125%203.06640625%20C0%201%200%201%200%200%20Z%20'%20fill='%23E8FFC2'%20transform='translate(674,437)'/%3e%3cpath%20d='M0%200%20C3.23739279%201.6186964%204.42244771%204.84489543%206%208%20C2.31245243%207.50168276%200.39509338%206.89932357%20-2%204%20C-1.34%202.68%20-0.68%201.36%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(230,587)'/%3e%3cpath%20d='M0%200%20C0.33%200%200.66%200%201%200%20C1%203.3%201%206.6%201%2010%20C0.01%2010.495%200.01%2010.495%20-1%2011%20C-2.1875%208.3125%20-2.1875%208.3125%20-3%205%20C-1.6875%202.125%20-1.6875%202.125%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(533,527)'/%3e%3cpath%20d='M0%200%20C0.33%200%200.66%200%201%200%20C1.22151549%201.79008467%201.42682213%203.58218162%201.625%205.375%20C1.74101563%206.37273438%201.85703125%207.37046875%201.9765625%208.3984375%20C1.98429688%209.25695312%201.99203125%2010.11546875%202%2011%20C1.34%2011.66%200.68%2012.32%200%2013%20C-0.66%2010.03%20-1.32%207.06%20-2%204%20C-1.34%204%20-0.68%204%200%204%20C0%202.68%200%201.36%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(554,513)'/%3e%3cpath%20d='M0%200%20C0.33%200.66%200.66%201.32%201%202%20C-3.51718381%203.36884358%20-6.58774263%202.47075246%20-11%201%20C-6.78915963%20-1.80722691%20-4.88445782%20-0.94537893%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(399,468)'/%3e%3cpath%20d='M0%200%20C-0.66%200.66%20-1.32%201.32%20-2%202%20C-1.34%202.66%20-0.68%203.32%200%204%20C-3.96%203.67%20-7.92%203.34%20-12%203%20C-7.27030266%20-0.54727301%20-5.56673301%20-1.35407019%200%200%20Z%20'%20fill='%23F0E9FF'%20transform='translate(167,435)'/%3e%3cpath%20d='M0%200%20C0.33%200.66%200.66%201.32%201%202%20C0.0625%204.625%200.0625%204.625%20-1%207%20C-1.33%206.34%20-1.66%205.68%20-2%205%20C-4.32156597%204.59270772%20-6.6568787%204.25561323%20-9%204%20C-9%203.67%20-9%203.34%20-9%203%20C-6.03%202.01%20-3.06%201.02%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(891,537)'/%3e%3cpath%20d='M0%200%20C0.66%200%201.32%200%202%200%20C2%202.31%202%204.62%202%207%20C2.66%207%203.32%207%204%207%20C4%207.99%204%208.98%204%2010%20C2.68%2010%201.36%2010%200%2010%20C0%206.7%200%203.4%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(296,537)'/%3e%3cpath%20d='M0%200%20C1.7074998%201.28062485%203.37373596%202.61767557%205%204%20C5%204.66%205%205.32%205%206%20C1.04%206%20-2.92%206%20-7%206%20C-7%205.67%20-7%205.34%20-7%205%20C-3.535%204.505%20-3.535%204.505%200%204%20C0%202.68%200%201.36%200%200%20Z%20'%20fill='%23DFFF99'%20transform='translate(683,450)'/%3e%3cpath%20d='M0%200%20C5.94%200.99%205.94%200.99%2012%202%20C12%202.66%2012%203.32%2012%204%20C10.56416999%204.10836453%209.1259798%204.18576167%207.6875%204.25%20C6.48673828%204.31960938%206.48673828%204.31960938%205.26171875%204.390625%20C3%204%203%204%200%200%20Z%20'%20fill='%23F2FFD9'%20transform='translate(667,563)'/%3e%3cpath%20d='M0%200%20C1.65%200%203.3%200%205%200%20C5.33%201.98%205.66%203.96%206%206%20C3.69%205.01%201.38%204.02%20-1%203%20C-0.67%202.01%20-0.34%201.02%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(848,554)'/%3e%3cpath%20d='M0%200%20C3%204%203%204%204%207%20C0.25%2010%200.25%2010%20-2%2010%20C-1.34%206.7%20-0.68%203.4%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(187,506)'/%3e%3cpath%20d='M0%200%20C1.9451%202.91765%202.45276317%204.62537285%203%208%20C1.02%208.99%201.02%208.99%20-1%2010%20C-0.67%206.7%20-0.34%203.4%200%200%20Z%20'%20fill='%2312003B'%20transform='translate(715,500)'/%3e%3cpath%20d='M0%200%20C2.9375%201.1875%202.9375%201.1875%203.9375%203.1875%20C1.02267222%203.99717438%20-0.52363217%204.40595993%20-3.375%203.25%20C-3.931875%202.899375%20-4.48875%202.54875%20-5.0625%202.1875%20C-5.0625%201.5275%20-5.0625%200.8675%20-5.0625%200.1875%20C-3.0625%20-0.8125%20-3.0625%20-0.8125%200%200%20Z%20'%20fill='%23F0E9FF'%20transform='translate(606.0625,467.8125)'/%3e%3cpath%20d='M0%200%20C0.5625%201.9375%200.5625%201.9375%201%204%20C0%205%200%205%20-3.0625%205.0625%20C-4.031875%205.041875%20-5.00125%205.02125%20-6%205%20C-6.33%204.34%20-6.66%203.68%20-7%203%20C-4.69%202.01%20-2.38%201.02%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(485,537)'/%3e%3cpath%20d='M0%200%20C0.99%200.33%201.98%200.66%203%201%20C2.01%203.97%201.02%206.94%200%2010%20C-0.33%2010%20-0.66%2010%20-1%2010%20C-1.125%202.25%20-1.125%202.25%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(322,486)'/%3e%3cpath%20d='M0%200%20C1.65%200%203.3%200%205%200%20C5%200.99%205%201.98%205%203%20C3.35%203.66%201.7%204.32%200%205%20C0%203.35%200%201.7%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(738,552)'/%3e%3cpath%20d='M0%200%20C0.91007813%200.00902344%201.82015625%200.01804687%202.7578125%200.02734375%20C3.45648438%200.03894531%204.15515625%200.05054688%204.875%200.0625%20C5.205%200.7225%205.535%201.3825%205.875%202.0625%20C4.82699219%202.15337891%204.82699219%202.15337891%203.7578125%202.24609375%20C2.84773437%202.32988281%201.93765625%202.41367187%201%202.5%20C0.09507812%202.58121094%20-0.80984375%202.66242188%20-1.7421875%202.74609375%20C-4.13610861%202.93239285%20-4.13610861%202.93239285%20-6.125%204.0625%20C-6.455%203.0725%20-6.785%202.0825%20-7.125%201.0625%20C-4.60024538%20-0.19987731%20-2.81299534%20-0.03606404%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(128.125,458.9375)'/%3e%3cpath%20d='M0%200%20C0.66%200.33%201.32%200.66%202%201%20C0.515%204.465%200.515%204.465%20-1%208%20C-1.66%208%20-2.32%208%20-3%208%20C-3%206.02%20-3%204.04%20-3%202%20C-2.01%202%20-1.02%202%200%202%20C0%201.34%200%200.68%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(294,556)'/%3e%3cpath%20d='M0%200%20C1.51400391%200.01740234%201.51400391%200.01740234%203.05859375%200.03515625%20C4.07050781%200.04417969%205.08242188%200.05320312%206.125%200.0625%20C7.29869141%200.07990234%207.29869141%200.07990234%208.49609375%200.09765625%20C8.49609375%200.42765625%208.49609375%200.75765625%208.49609375%201.09765625%20C5.52609375%201.09765625%202.55609375%201.09765625%20-0.50390625%201.09765625%20C-0.50390625%201.75765625%20-0.50390625%202.41765625%20-0.50390625%203.09765625%20C-2.81390625%203.09765625%20-5.12390625%203.09765625%20-7.50390625%203.09765625%20C-6.86453125%202.78828125%20-6.22515625%202.47890625%20-5.56640625%202.16015625%20C-1.48563778%200.05794219%20-1.48563778%200.05794219%200%200%20Z%20'%20fill='%2312003B'%20transform='translate(463.50390625,540.90234375)'/%3e%3cpath%20d='M0%200%20C0.33%200.66%200.66%201.32%201%202%20C2.32%201.67%203.64%201.34%205%201%20C3.9024777%203.99324263%203.32317108%204.84610901%200.375%206.25%20C-0.40875%206.4975%20-1.1925%206.745%20-2%207%20C-1.34%204.69%20-0.68%202.38%200%200%20Z%20'%20fill='%23F0E9FF'%20transform='translate(306,531)'/%3e%3cpath%20d='M0%200%20C0.33%200.99%200.66%201.98%201%203%20C-0.98%204.98%20-2.96%206.96%20-5%209%20C-5.99%208.67%20-6.98%208.34%20-8%208%20C-5.33333333%205.33333333%20-2.66666667%202.66666667%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(601,528)'/%3e%3cpath%20d='M0%200%20C0.99%200%201.98%200%203%200%20C3.125%202.875%203.125%202.875%203%206%20C2.34%206.66%201.68%207.32%201%208%20C0%207%200%207%20-0.0625%203.4375%20C-0.041875%202.303125%20-0.02125%201.16875%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(272,520)'/%3e%3cpath%20d='M0%200%20C0.66%200.33%201.32%200.66%202%201%20C1.67%201.66%201.34%202.32%201%203%20C0.95977609%205.3329866%200.95679753%207.66706666%201%2010%20C0.34%2010%20-0.32%2010%20-1%2010%20C-1.9765625%203.9453125%20-1.9765625%203.9453125%20-2%202%20C-1.34%201.34%20-0.68%200.68%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(359,502)'/%3e%3cpath%20d='M0%200%20C3.63%200.66%207.26%201.32%2011%202%20C11%202.33%2011%202.66%2011%203%20C7.37%203%203.74%203%200%203%20C0%202.01%200%201.02%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(387,469)'/%3e%3cpath%20d='M0%200%20C2.31%200.33%204.62%200.66%207%201%20C6.67%201.66%206.34%202.32%206%203%20C4.35%203%202.7%203%201%203%20C1%203.99%201%204.98%201%206%20C0.01%206%20-0.98%206%20-2%206%20C-1.34%204.02%20-0.68%202.04%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(305,468)'/%3e%3cpath%20d='M0%200%20C1.65%200.33%203.3%200.66%205%201%20C5%201.99%205%202.98%205%204%20C3.35%204%201.7%204%200%204%20C0%202.68%200%201.36%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(549,552)'/%3e%3cpath%20d='M0%200%20C0.94875%200.04125%201.8975%200.0825%202.875%200.125%20C2.875%200.785%202.875%201.445%202.875%202.125%20C0.895%202.785%20-1.085%203.445%20-3.125%204.125%20C-3.785%203.465%20-4.445%202.805%20-5.125%202.125%20C-3.125%200.125%20-3.125%200.125%200%200%20Z%20'%20fill='%2312003B'%20transform='translate(181.125,553.875)'/%3e%3cpath%20d='M0%200%20C1.9375%200.3125%201.9375%200.3125%204%201%20C4.33%201.99%204.66%202.98%205%204%20C2.69%204%200.38%204%20-2%204%20C-1.34%202.68%20-0.68%201.36%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(587,540)'/%3e%3cpath%20d='M0%200%20C0%202.31%200%204.62%200%207%20C-0.99%207.495%20-0.99%207.495%20-2%208%20C-2%207.01%20-2%206.02%20-2%205%20C-2.66%205%20-3.32%205%20-4%205%20C-3.625%203.0625%20-3.625%203.0625%20-3%201%20C-1%200%20-1%200%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(185,520)'/%3e%3cpath%20d='M0%200%20C0.66%200%201.32%200%202%200%20C1.67%202.64%201.34%205.28%201%208%20C0.01%207.67%20-0.98%207.34%20-2%207%20C-1.34%207%20-0.68%207%200%207%20C0%206.01%200%205.02%200%204%20C-1.32%203.67%20-2.64%203.34%20-4%203%20C-2.68%202.67%20-1.36%202.34%200%202%20C0%201.34%200%200.68%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(616,486)'/%3e%3cpath%20d='M0%200%20C3.125%20-0.1875%203.125%20-0.1875%206%200%20C6%200.99%206%201.98%206%203%20C3.36%203%200.72%203%20-2%203%20C-1.34%202.01%20-0.68%201.02%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(842,477)'/%3e%3cpath%20d='M0%200%20C2.475%200.495%202.475%200.495%205%201%20C4.67%202.32%204.34%203.64%204%205%20C2.68%205.33%201.36%205.66%200%206%20C0%204.02%200%202.04%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(920,472)'/%3e%3cpath%20d='M0%200%20C1.65%200%203.3%200%205%200%20C5.33%200.99%205.66%201.98%206%203%20C3.69%203%201.38%203%20-1%203%20C-0.67%202.01%20-0.34%201.02%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(568,560)'/%3e%3cpath%20d='M0%200%20C3.39609044%201.19322096%205.62433927%202.28495916%208%205%20C8.66%205.66%209.32%206.32%2010%207%20C7.29068581%206.84518205%205.53415961%206.51827919%203.5546875%204.59765625%20C2.32320358%203.10228292%201.1570163%201.5537076%200%200%20Z%20'%20fill='%23A7EA18'%20transform='translate(656,551)'/%3e%3cpath%20d='M0%200%20C-3.6441774%202.4294516%20-5.71241272%202.16179575%20-10%202%20C-10%201.34%20-10%200.68%20-10%200%20C-6.33694766%20-0.74926071%20-3.57644848%20-1.2380014%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(762,542)'/%3e%3cpath%20d='M0%200%20C1.32%200%202.64%200%204%200%20C4%201.65%204%203.3%204%205%20C3.01%205%202.02%205%201%205%20C0.34%203.68%20-0.32%202.36%20-1%201%20C-0.67%200.67%20-0.34%200.34%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(780,539)'/%3e%3cpath%20d='M0%200%20C0%201.98%200%203.96%200%206%20C-0.99%206%20-1.98%206%20-3%206%20C-3.66%204.68%20-4.32%203.36%20-5%202%20C-1.125%200%20-1.125%200%200%200%20Z%20'%20fill='%23F0E9FF'%20transform='translate(611,497)'/%3e%3cpath%20d='M0%200%20C2%203%202%203%201.625%205.1875%20C1.41875%205.785625%201.2125%206.38375%201%207%20C0.01%207%20-0.98%207%20-2%207%20C-2%205.35%20-2%203.7%20-2%202%20C-1.34%202%20-0.68%202%200%202%20C0%201.34%200%200.68%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(260,485)'/%3e%3cpath%20d='M0%200%20C0.99%200.33%201.98%200.66%203%201%20C3.33%202.98%203.66%204.96%204%207%20C2.35%206.01%200.7%205.02%20-1%204%20C-0.67%202.68%20-0.34%201.36%200%200%20Z%20'%20fill='%23F0E9FF'%20transform='translate(896,467)'/%3e%3cpath%20d='M0%200%20C2.97%200%205.94%200%209%200%20C9%201.32%209%202.64%209%204%20C8.01%204%207.02%204%206%204%20C5.67%203.34%205.34%202.68%205%202%20C2.47266765%201.34444881%202.47266765%201.34444881%200%201%20C0%200.67%200%200.34%200%200%20Z%20'%20fill='%2312003B'%20transform='translate(396,466)'/%3e%3cpath%20d='M0%200%20C1.32%200.33%202.64%200.66%204%201%20C4%201.99%204%202.98%204%204%20C1.69%204.33%20-0.62%204.66%20-3%205%20C-2.01%203.35%20-1.02%201.7%200%200%20Z%20'%20fill='%23DFFF99'%20transform='translate(660,423)'/%3e%3cpath%20d='M0%200%20C1.32%200.33%202.64%200.66%204%201%20C4.33%202.65%204.66%204.3%205%206%20C4.01%206%203.02%206%202%206%20C1.34%204.02%200.68%202.04%200%200%20Z%20'%20fill='%236F9300'%20transform='translate(690,541)'/%3e%3cpath%20d='M0%200%20C1.32%200.99%202.64%201.98%204%203%20C3.67%203.66%203.34%204.32%203%205%20C1.35%205%20-0.3%205%20-2%205%20C-1.34%203.35%20-0.68%201.7%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(858,531)'/%3e%3cpath%20d='M0%200%20C0.66%200.99%201.32%201.98%202%203%20C1.67%203.99%201.34%204.98%201%206%20C-1.5625%207.1875%20-1.5625%207.1875%20-4%208%20C-2.68%205.36%20-1.36%202.72%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(373,482)'/%3e%3cpath%20d='M0%200%20C1.74959319%202.62438979%202.62068453%203.96547627%203%207%20C2.01%208.485%202.01%208.485%201%2010%20C0.34%209.67%20-0.32%209.34%20-1%209%20C-0.67%208.34%20-0.34%207.68%200%207%20C0.04022391%204.6670134%200.04320247%202.33293334%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(360,477)'/%3e%3cpath%20d='M0%200%20C0%200.66%200%201.32%200%202%20C-0.66%202%20-1.32%202%20-2%202%20C-2%202.99%20-2%203.98%20-2%205%20C-3.32%205%20-4.64%205%20-6%205%20C-5.6875%203.0625%20-5.6875%203.0625%20-5%201%20C-2%200%20-2%200%200%200%20Z%20'%20fill='%23F0E9FF'%20transform='translate(891,561)'/%3e%3cpath%20d='M0%200%20C0.33%200.66%200.66%201.32%201%202%20C0.01%203.32%20-0.98%204.64%20-2%206%20C-3.32%205.34%20-4.64%204.68%20-6%204%20C-4.02%202.68%20-2.04%201.36%200%200%20Z%20'%20fill='%23F0E9FF'%20transform='translate(715,553)'/%3e%3cpath%20d='M0%200%20C1.98%200%203.96%200%206%200%20C6.33%201.65%206.66%203.3%207%205%20C3.535%203.02%203.535%203.02%200%201%20C0%200.67%200%200.34%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(432,552)'/%3e%3cpath%20d='M0%200%20C0.66%200.33%201.32%200.66%202%201%20C1.60196439%203.88575819%201.20990931%204.82189513%20-1.0625%206.75%20C-1.701875%207.1625%20-2.34125%207.575%20-3%208%20C-1.125%201.125%20-1.125%201.125%200%200%20Z%20'%20fill='%23F0E9FF'%20transform='translate(299,549)'/%3e%3cpath%20d='M0%200%20C0.66%200.33%201.32%200.66%202%201%20C2%201.99%202%202.98%202%204%20C-1.13349732%205.04449911%20-1.98968256%204.93423645%20-5%204%20C-3.35%202.68%20-1.7%201.36%200%200%20Z%20'%20fill='%23F0E9FF'%20transform='translate(198,546)'/%3e%3cpath%20d='M0%200%20C1.32%200.33%202.64%200.66%204%201%20C4%204%204%204%202.5%205.6875%20C2.005%206.120625%201.51%206.55375%201%207%20C0.67%204.69%200.34%202.38%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(802,545)'/%3e%3cpath%20d='M0%200%20C2%201.3125%202%201.3125%204%203%20C4%203.99%204%204.98%204%206%20C2.02%205.34%200.04%204.68%20-2%204%20C-1.34%202.68%20-0.68%201.36%200%200%20Z%20'%20fill='%23F0E9FF'%20transform='translate(617,530)'/%3e%3cpath%20d='M0%200%20C2%201.8125%202%201.8125%204%204%20C4%204.99%204%205.98%204%207%20C2.68%207.33%201.36%207.66%200%208%20C0%205.36%200%202.72%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(552,520)'/%3e%3cpath%20d='M0%200%20C0.66%200.33%201.32%200.66%202%201%20C0.1875%204%200.1875%204%20-2%207%20C-2.99%207%20-3.98%207%20-5%207%20C-3.35%204.69%20-1.7%202.38%200%200%20Z%20'%20fill='%231E0259'%20transform='translate(715,519)'/%3e%3cpath%20d='M0%200%20C2.50037734%202.17424117%203.43628586%203.73045798%204%207%20C2.68%206.67%201.36%206.34%200%206%20C0%204.02%200%202.04%200%200%20Z%20'%20fill='%23F0E9FF'%20transform='translate(483,496)'/%3e%3cpath%20d='M0%200%20C0.66%200.33%201.32%200.66%202%201%20C1.67%202.98%201.34%204.96%201%207%20C0.34%206.67%20-0.32%206.34%20-1%206%20C-1.625%203.4375%20-1.625%203.4375%20-2%201%20C-1.34%200.67%20-0.68%200.34%200%200%20Z%20'%20fill='%230D0026'%20transform='translate(182,471)'/%3e%3cpath%20d='M0%200%20C0.33%201.32%200.66%202.64%201%204%20C3.31%204%205.62%204%208%204%20C8%204.33%208%204.66%208%205%20C4.7%205%201.4%205%20-2%205%20C-1.34%203.35%20-0.68%201.7%200%200%20Z%20'%20fill='%23DFFF99'%20transform='translate(638,451)'/%3e%3c/svg%3e",
1110
- alt: "Dyrected",
1111
- className: "dy-h-7 dy-w-auto"
1112
- })
1113
- }), /* @__PURE__ */ jsxs("div", {
1114
- className: "dy-ml-auto dy-flex dy-items-center dy-gap-1.5",
1115
- children: [
1116
- /* @__PURE__ */ jsx(ThemeSelector, { mobile: true }),
1117
- user && /* @__PURE__ */ jsx("div", {
1118
- className: "dy-flex dy-h-8 dy-w-8 dy-items-center dy-justify-center dy-rounded-full dy-bg-primary/10 dy-text-primary dy-font-semibold dy-text-xs dy-shrink-0",
1119
- children: (user.name || user.email || "?").charAt(0).toUpperCase()
1120
- }),
1121
- /* @__PURE__ */ jsx("button", {
1122
- type: "button",
1123
- onClick: () => setMobileOpen(true),
1124
- className: "dy-flex dy-h-9 dy-w-9 dy-items-center dy-justify-center dy-rounded-md dy-text-muted-foreground hover:dy-bg-accent hover:dy-text-foreground dy-transition-colors",
1125
- "aria-label": "Open menu",
1126
- children: /* @__PURE__ */ jsx(Menu, { className: "dy-h-5 dy-w-5" })
1127
- })
1128
- ]
1129
- })]
1107
+ children: [!isEmbedded && /* @__PURE__ */ jsx("button", {
1108
+ type: "button",
1109
+ onClick: () => setMobileOpen(true),
1110
+ className: "dy-fixed md:dy-hidden dy-z-10 dy-top-2 dy-right-2 dy-flex dy-h-9 dy-w-9 dy-items-center dy-justify-center dy-rounded-md dy-text-muted-foreground dy-bg-background hover:dy-bg-accent hover:dy-text-foreground dy-transition-colors",
1111
+ "aria-label": "Open menu",
1112
+ children: /* @__PURE__ */ jsx(Menu, { className: "dy-h-5 dy-w-5" })
1130
1113
  }), /* @__PURE__ */ jsx("div", {
1131
1114
  className: "dy-flex-1 dy-py-6 dy-px-4 lg:dy-py-10 lg:dy-px-6",
1132
1115
  children
@@ -1219,7 +1202,7 @@ function getStatusLabel(doc) {
1219
1202
  }
1220
1203
  function Dashboard() {
1221
1204
  const { client, components, user } = useDyrected();
1222
- const currentVersion = "2.5.58";
1205
+ const currentVersion = "2.5.60";
1223
1206
  const [latestVersion, setLatestVersion] = useState(() => {
1224
1207
  if (typeof window === "undefined") return null;
1225
1208
  return localStorage.getItem("dyrected_latest_release");
@@ -2985,26 +2968,357 @@ function CsvImporter({ slug, schema, onClose }) {
2985
2968
  });
2986
2969
  }
2987
2970
  //#endregion
2971
+ //#region src/lib/format.ts
2972
+ /** Normalize the shorthand string form into the object form. */
2973
+ function resolveNumberFormat(format) {
2974
+ if (!format) return null;
2975
+ return typeof format === "string" ? { type: format } : format;
2976
+ }
2977
+ /** Normalize the shorthand string form into the object form. */
2978
+ function resolveDateFormat(format) {
2979
+ if (!format) return null;
2980
+ return typeof format === "string" ? { type: format } : format;
2981
+ }
2982
+ function toNumber(value) {
2983
+ if (typeof value === "number") return Number.isFinite(value) ? value : null;
2984
+ if (typeof value === "string" && value.trim() !== "") {
2985
+ const parsed = Number(value);
2986
+ return Number.isFinite(parsed) ? parsed : null;
2987
+ }
2988
+ return null;
2989
+ }
2990
+ /**
2991
+ * When the field uses the `rating` format, return the numeric value and star
2992
+ * count so the caller can render stars. Returns `null` for every other format,
2993
+ * signalling that {@link formatNumber} should be used instead.
2994
+ */
2995
+ function getRatingSpec(value, format) {
2996
+ const resolved = resolveNumberFormat(format);
2997
+ if (!resolved || resolved.type !== "rating") return null;
2998
+ const num = toNumber(value);
2999
+ if (num === null) return null;
3000
+ const max = typeof resolved.max === "number" && resolved.max > 0 ? Math.floor(resolved.max) : 5;
3001
+ return {
3002
+ value: Math.max(0, Math.min(num, max)),
3003
+ max
3004
+ };
3005
+ }
3006
+ var BYTE_UNITS_DECIMAL = [
3007
+ "B",
3008
+ "KB",
3009
+ "MB",
3010
+ "GB",
3011
+ "TB",
3012
+ "PB",
3013
+ "EB"
3014
+ ];
3015
+ var BYTE_UNITS_BINARY = [
3016
+ "B",
3017
+ "KiB",
3018
+ "MiB",
3019
+ "GiB",
3020
+ "TiB",
3021
+ "PiB",
3022
+ "EiB"
3023
+ ];
3024
+ function formatBytes$1(bytes, binary, maximumFractionDigits) {
3025
+ const base = binary ? 1024 : 1e3;
3026
+ const units = binary ? BYTE_UNITS_BINARY : BYTE_UNITS_DECIMAL;
3027
+ const sign = bytes < 0 ? "-" : "";
3028
+ let amount = Math.abs(bytes);
3029
+ let unitIndex = 0;
3030
+ while (amount >= base && unitIndex < units.length - 1) {
3031
+ amount /= base;
3032
+ unitIndex += 1;
3033
+ }
3034
+ const digits = unitIndex === 0 ? 0 : maximumFractionDigits;
3035
+ return `${sign}${amount.toFixed(digits).replace(/\.?0+$/, "")} ${units[unitIndex]}`;
3036
+ }
3037
+ /**
3038
+ * Format a numeric field value for display. Returns a plain string for every
3039
+ * format except `rating` (use {@link getRatingSpec} for that). Non-numeric input
3040
+ * is stringified unchanged.
3041
+ */
3042
+ function formatNumber(value, format) {
3043
+ const resolved = resolveNumberFormat(format);
3044
+ const num = toNumber(value);
3045
+ if (!resolved || num === null) return value == null ? "" : String(value);
3046
+ try {
3047
+ switch (resolved.type) {
3048
+ case "decimal": return new Intl.NumberFormat(resolved.locale, {
3049
+ minimumFractionDigits: resolved.minimumFractionDigits,
3050
+ maximumFractionDigits: resolved.maximumFractionDigits
3051
+ }).format(num);
3052
+ case "currency": return new Intl.NumberFormat(resolved.locale, {
3053
+ style: "currency",
3054
+ currency: resolved.currency ?? "USD",
3055
+ minimumFractionDigits: resolved.minimumFractionDigits,
3056
+ maximumFractionDigits: resolved.maximumFractionDigits
3057
+ }).format(num);
3058
+ case "percent": {
3059
+ const ratio = resolved.scale === false ? num / 100 : num;
3060
+ return new Intl.NumberFormat(resolved.locale, {
3061
+ style: "percent",
3062
+ minimumFractionDigits: resolved.minimumFractionDigits,
3063
+ maximumFractionDigits: resolved.maximumFractionDigits
3064
+ }).format(ratio);
3065
+ }
3066
+ case "unit": return new Intl.NumberFormat(resolved.locale, {
3067
+ style: "unit",
3068
+ unit: resolved.unit,
3069
+ unitDisplay: resolved.unitDisplay,
3070
+ maximumFractionDigits: resolved.maximumFractionDigits
3071
+ }).format(num);
3072
+ case "compact": return new Intl.NumberFormat(resolved.locale, {
3073
+ notation: "compact",
3074
+ maximumFractionDigits: resolved.maximumFractionDigits ?? 1
3075
+ }).format(num);
3076
+ case "bytes": return formatBytes$1(num, resolved.binary === true, resolved.maximumFractionDigits ?? 1);
3077
+ case "rating": return `${num}/${typeof resolved.max === "number" ? resolved.max : 5}`;
3078
+ default: return String(num);
3079
+ }
3080
+ } catch {
3081
+ return String(num);
3082
+ }
3083
+ }
3084
+ var RELATIVE_DIVISIONS = [
3085
+ {
3086
+ amount: 60,
3087
+ unit: "second"
3088
+ },
3089
+ {
3090
+ amount: 60,
3091
+ unit: "minute"
3092
+ },
3093
+ {
3094
+ amount: 24,
3095
+ unit: "hour"
3096
+ },
3097
+ {
3098
+ amount: 7,
3099
+ unit: "day"
3100
+ },
3101
+ {
3102
+ amount: 4.34524,
3103
+ unit: "week"
3104
+ },
3105
+ {
3106
+ amount: 12,
3107
+ unit: "month"
3108
+ },
3109
+ {
3110
+ amount: Number.POSITIVE_INFINITY,
3111
+ unit: "year"
3112
+ }
3113
+ ];
3114
+ function formatRelative(date, locale, now) {
3115
+ const rtf = new Intl.RelativeTimeFormat(locale, { numeric: "auto" });
3116
+ let duration = (date.getTime() - now) / 1e3;
3117
+ for (const division of RELATIVE_DIVISIONS) {
3118
+ if (Math.abs(duration) < division.amount) return rtf.format(Math.round(duration), division.unit);
3119
+ duration /= division.amount;
3120
+ }
3121
+ return rtf.format(Math.round(duration), "year");
3122
+ }
3123
+ /**
3124
+ * Format a date/datetime/time field value for display. `now` is injected so the
3125
+ * `relative` format stays deterministic and testable. Unparseable input is
3126
+ * stringified unchanged.
3127
+ */
3128
+ function formatDate(value, format, fieldType, now = Date.now()) {
3129
+ const resolved = resolveDateFormat(format);
3130
+ if (value == null || value === "") return "";
3131
+ const raw = String(value);
3132
+ const date = fieldType === "time" && /^\d{1,2}:\d{2}/.test(raw) ? /* @__PURE__ */ new Date(`1970-01-01T${raw}`) : new Date(raw);
3133
+ if (Number.isNaN(date.getTime())) return raw;
3134
+ const type = resolved?.type ?? fieldType;
3135
+ try {
3136
+ switch (type) {
3137
+ case "relative": return formatRelative(date, resolved && "locale" in resolved ? resolved.locale : void 0, now);
3138
+ case "time": return date.toLocaleTimeString(resolved?.locale, resolved?.type === "time" ? { timeStyle: resolved.timeStyle ?? "short" } : { timeStyle: "short" });
3139
+ case "datetime": return date.toLocaleString(resolved?.locale, resolved?.type === "datetime" ? {
3140
+ dateStyle: resolved.dateStyle ?? "medium",
3141
+ timeStyle: resolved.timeStyle ?? "short"
3142
+ } : {
3143
+ dateStyle: "medium",
3144
+ timeStyle: "short"
3145
+ });
3146
+ default: return date.toLocaleDateString(resolved?.locale, resolved?.type === "date" ? { dateStyle: resolved.dateStyle ?? "medium" } : { dateStyle: "medium" });
3147
+ }
3148
+ } catch {
3149
+ return date.toLocaleString();
3150
+ }
3151
+ }
3152
+ /**
3153
+ * Soft pill classes per {@link DisplayTone}. Kept here (not as JSX) so the same
3154
+ * mapping can drive list cells, previews, and tests. Composed with the base pill
3155
+ * classes by the caller.
3156
+ */
3157
+ var DISPLAY_TONE_CLASS = {
3158
+ neutral: "dy-border-border dy-bg-muted dy-text-muted-foreground",
3159
+ primary: "dy-border-primary/20 dy-bg-primary/10 dy-text-primary",
3160
+ success: "dy-border-emerald-500/20 dy-bg-emerald-500/10 dy-text-emerald-600",
3161
+ warning: "dy-border-amber-500/20 dy-bg-amber-500/10 dy-text-amber-600",
3162
+ danger: "dy-border-red-500/20 dy-bg-red-500/10 dy-text-red-600",
3163
+ info: "dy-border-blue-500/20 dy-bg-blue-500/10 dy-text-blue-600"
3164
+ };
3165
+ /** The color classes for a tone, falling back to `neutral`. */
3166
+ function displayToneClass(tone) {
3167
+ return DISPLAY_TONE_CLASS[tone ?? "neutral"] ?? DISPLAY_TONE_CLASS.neutral;
3168
+ }
3169
+ function resolveOptionFormat(format) {
3170
+ if (!format) return null;
3171
+ return typeof format === "string" ? { type: format } : format;
3172
+ }
3173
+ function optionLabel(value, options) {
3174
+ if (Array.isArray(options)) {
3175
+ for (const option of options) if (typeof option === "string") {
3176
+ if (option === value) return option;
3177
+ } else if (option && option.value === value) return option.label ?? String(option.value);
3178
+ }
3179
+ return value == null ? "" : String(value);
3180
+ }
3181
+ /**
3182
+ * Resolve a single option value into a badge label + tone. Returns `null` when
3183
+ * the field has no badge format, signalling the caller to render plainly.
3184
+ */
3185
+ function getOptionBadge(value, format, options) {
3186
+ const resolved = resolveOptionFormat(format);
3187
+ if (!resolved || resolved.type !== "badge") return null;
3188
+ const key = value == null ? "" : String(value);
3189
+ return {
3190
+ label: resolved.labels?.[key] ?? optionLabel(value, options),
3191
+ tone: resolved.tones?.[key] ?? resolved.defaultTone ?? "neutral"
3192
+ };
3193
+ }
3194
+ /**
3195
+ * Resolve a boolean value into a custom label + tone. Returns `null` when the
3196
+ * field has no boolean format, so the caller keeps the default Yes/No badge.
3197
+ */
3198
+ function getBooleanBadge(value, format) {
3199
+ if (!format || format.type !== "boolean") return null;
3200
+ const side = value ? format.true : format.false;
3201
+ return {
3202
+ label: side?.label ?? (value ? "Yes" : "No"),
3203
+ tone: side?.tone ?? (value ? "success" : "neutral")
3204
+ };
3205
+ }
3206
+ function resolveTextFormat(format) {
3207
+ if (!format) return null;
3208
+ return typeof format === "string" ? { type: format } : format;
3209
+ }
3210
+ function capitalizeWords(text) {
3211
+ return text.replace(/\b\w/g, (char) => char.toUpperCase());
3212
+ }
3213
+ /** Apply a display-only transform to a text value. */
3214
+ function formatText(value, format) {
3215
+ const resolved = resolveTextFormat(format);
3216
+ const text = value == null ? "" : String(value);
3217
+ if (!resolved) return text;
3218
+ switch (resolved.type) {
3219
+ case "uppercase": return text.toUpperCase();
3220
+ case "lowercase": return text.toLowerCase();
3221
+ case "capitalize": return capitalizeWords(text);
3222
+ case "code": return text;
3223
+ case "truncate": return text.length > resolved.length ? `${text.slice(0, resolved.length)}…` : text;
3224
+ case "mask": {
3225
+ const reveal = typeof resolved.reveal === "number" ? Math.max(0, resolved.reveal) : 4;
3226
+ const char = resolved.character ?? "•";
3227
+ if (text.length <= reveal) return text;
3228
+ return `${char.repeat(Math.min(text.length - reveal, 8))}${text.slice(text.length - reveal)}`;
3229
+ }
3230
+ default: return text;
3231
+ }
3232
+ }
3233
+ /** Whether a text format should render in a monospace pill. */
3234
+ function isCodeText(format) {
3235
+ return resolveTextFormat(format)?.type === "code";
3236
+ }
3237
+ /**
3238
+ * Resolve a url/email value into a link spec. Returns `null` when the field has
3239
+ * no link format. `fieldType` selects between an `http` link and a `mailto:`.
3240
+ */
3241
+ function getLinkSpec(value, format, fieldType) {
3242
+ if (!format) return null;
3243
+ const resolved = typeof format === "string" ? { type: "link" } : format;
3244
+ if (resolved.type !== "link") return null;
3245
+ const raw = value == null ? "" : String(value);
3246
+ if (!raw) return null;
3247
+ return {
3248
+ href: fieldType === "email" ? `mailto:${raw}` : raw,
3249
+ label: raw,
3250
+ newTab: resolved.newTab !== false && fieldType === "url"
3251
+ };
3252
+ }
3253
+ /** Format a JSON value as a compact summary or truncated code preview. */
3254
+ function formatJson(value, format) {
3255
+ if ((typeof format === "string" ? { type: format } : format)?.type === "summary" && value && typeof value === "object") {
3256
+ const count = Array.isArray(value) ? value.length : Object.keys(value).length;
3257
+ return Array.isArray(value) ? `[ ${count} items ]` : `{ ${count} keys }`;
3258
+ }
3259
+ const json = JSON.stringify(value);
3260
+ if (!json) return "";
3261
+ return json.length > 40 ? `${json.slice(0, 40)}…` : json;
3262
+ }
3263
+ //#endregion
2988
3264
  //#region src/components/ui/render-cell.tsx
3265
+ var PILL_BASE = "dy-inline-flex dy-items-center dy-rounded-full dy-border dy-px-2.5 dy-py-0.5 dy-text-xs dy-font-medium";
3266
+ function TonePill({ spec }) {
3267
+ return /* @__PURE__ */ jsx("span", {
3268
+ className: cn(PILL_BASE, displayToneClass(spec.tone)),
3269
+ children: spec.label
3270
+ });
3271
+ }
2989
3272
  function RenderCell({ value, field, client, schemas }) {
2990
3273
  if (value === null || value === void 0) return /* @__PURE__ */ jsx("span", {
2991
3274
  className: "dy-text-muted-foreground",
2992
3275
  children: "-"
2993
3276
  });
2994
- if (field.type === "boolean" || typeof value === "boolean") return /* @__PURE__ */ jsx(Badge, {
2995
- variant: value ? "default" : "secondary",
2996
- children: value ? "Yes" : "No"
3277
+ if (field.type === "boolean" || typeof value === "boolean") {
3278
+ const badge = getBooleanBadge(value, field.admin?.format);
3279
+ if (badge) return /* @__PURE__ */ jsx(TonePill, { spec: badge });
3280
+ return /* @__PURE__ */ jsx(Badge, {
3281
+ variant: value ? "default" : "secondary",
3282
+ children: value ? "Yes" : "No"
3283
+ });
3284
+ }
3285
+ if (field.type === "select" || field.type === "radio") {
3286
+ const badge = getOptionBadge(value, field.admin?.format, field.options);
3287
+ if (badge) return /* @__PURE__ */ jsx(TonePill, { spec: badge });
3288
+ }
3289
+ if (field.type === "multiSelect" && Array.isArray(value) && field.admin?.format) return /* @__PURE__ */ jsxs("div", {
3290
+ className: "dy-flex dy-flex-wrap dy-gap-1",
3291
+ children: [value.slice(0, 3).map((item, i) => {
3292
+ const badge = getOptionBadge(item, field.admin?.format, field.options);
3293
+ return badge ? /* @__PURE__ */ jsx(TonePill, { spec: badge }, i) : null;
3294
+ }), value.length > 3 && /* @__PURE__ */ jsxs("span", {
3295
+ className: "dy-text-[10px] dy-text-muted-foreground",
3296
+ children: [
3297
+ "+",
3298
+ value.length - 3,
3299
+ " more"
3300
+ ]
3301
+ })]
2997
3302
  });
2998
- if (field.type === "date") {
2999
- const date = new Date(value);
3000
- return /* @__PURE__ */ jsxs("div", {
3001
- className: "dy-flex dy-items-center dy-gap-1.5 dy-text-muted-foreground",
3002
- children: [/* @__PURE__ */ jsx(Calendar, { className: "dy-h-3 dy-w-3" }), /* @__PURE__ */ jsx("span", {
3003
- className: "dy-text-xs",
3004
- children: date.toLocaleDateString()
3005
- })]
3303
+ if (field.type === "number") {
3304
+ const rating = getRatingSpec(value, field.admin?.format);
3305
+ if (rating) return /* @__PURE__ */ jsx("div", {
3306
+ className: "dy-flex dy-items-center dy-gap-0.5",
3307
+ title: `${rating.value} / ${rating.max}`,
3308
+ children: Array.from({ length: rating.max }, (_, i) => /* @__PURE__ */ jsx(Star, { className: i < Math.round(rating.value) ? "dy-h-3.5 dy-w-3.5 dy-fill-amber-400 dy-text-amber-400" : "dy-h-3.5 dy-w-3.5 dy-text-muted-foreground/30" }, i))
3309
+ });
3310
+ return /* @__PURE__ */ jsx("span", {
3311
+ className: "dy-text-sm dy-font-medium dy-tabular-nums",
3312
+ children: formatNumber(value, field.admin?.format)
3006
3313
  });
3007
3314
  }
3315
+ if (field.type === "date" || field.type === "datetime" || field.type === "time") return /* @__PURE__ */ jsxs("div", {
3316
+ className: "dy-flex dy-items-center dy-gap-1.5 dy-text-muted-foreground",
3317
+ children: [/* @__PURE__ */ jsx(Calendar, { className: "dy-h-3 dy-w-3" }), /* @__PURE__ */ jsx("span", {
3318
+ className: "dy-text-xs",
3319
+ children: formatDate(value, field.admin?.format, field.type)
3320
+ })]
3321
+ });
3008
3322
  const relationTo = field.relationTo || field.collection;
3009
3323
  if (field.type === "image" || field.type === "relationship" && isUploadCollection(relationTo, schemas)) {
3010
3324
  if (!value) return /* @__PURE__ */ jsx("span", {
@@ -3037,6 +3351,10 @@ function RenderCell({ value, field, client, schemas }) {
3037
3351
  })
3038
3352
  });
3039
3353
  }
3354
+ if (field.type === "json" && typeof value === "object") return /* @__PURE__ */ jsx("span", {
3355
+ className: "dy-text-[11px] dy-text-muted-foreground dy-font-mono dy-bg-muted/30 dy-px-1.5 dy-py-0.5 dy-rounded",
3356
+ children: formatJson(value, field.admin?.format)
3357
+ });
3040
3358
  if (Array.isArray(value)) return /* @__PURE__ */ jsxs("div", {
3041
3359
  className: "dy-flex dy-flex-wrap dy-gap-1",
3042
3360
  children: [value.slice(0, 2).map((item, i) => /* @__PURE__ */ jsx(Badge, {
@@ -3053,7 +3371,7 @@ function RenderCell({ value, field, client, schemas }) {
3053
3371
  })]
3054
3372
  });
3055
3373
  if (typeof value === "object" && !Array.isArray(value)) {
3056
- const entries = Object.entries(value).filter(([_, v]) => typeof v !== "object" && v !== null && v !== void 0).slice(0, 3);
3374
+ const entries = Object.entries(value).filter(([, v]) => typeof v !== "object" && v !== null && v !== void 0).slice(0, 3);
3057
3375
  if (entries.length > 0) return /* @__PURE__ */ jsxs("span", {
3058
3376
  className: "dy-text-[11px] dy-text-muted-foreground dy-font-medium dy-leading-tight",
3059
3377
  children: [entries.map(([k, v]) => `${k}: ${String(v)}`).join(", "), Object.keys(value).length > 3 ? "..." : ""]
@@ -3063,6 +3381,29 @@ function RenderCell({ value, field, client, schemas }) {
3063
3381
  children: [JSON.stringify(value).slice(0, 30), JSON.stringify(value).length > 30 ? "..." : ""]
3064
3382
  });
3065
3383
  }
3384
+ if ((field.type === "url" || field.type === "email") && field.admin?.format) {
3385
+ const link = getLinkSpec(value, field.admin.format, field.type);
3386
+ if (link) return /* @__PURE__ */ jsxs("a", {
3387
+ href: link.href,
3388
+ target: link.newTab ? "_blank" : void 0,
3389
+ rel: link.newTab ? "noreferrer" : void 0,
3390
+ onClick: (e) => e.stopPropagation(),
3391
+ className: "dy-inline-flex dy-items-center dy-gap-1 dy-text-sm dy-font-medium dy-text-primary hover:dy-underline",
3392
+ children: [link.label, field.type === "url" && /* @__PURE__ */ jsx(ExternalLink, { className: "dy-h-3 dy-w-3 dy-opacity-60" })]
3393
+ });
3394
+ }
3395
+ if ((field.type === "text" || field.type === "textarea") && field.admin?.format) {
3396
+ const formatted = formatText(value, field.admin.format);
3397
+ if (isCodeText(field.admin.format)) return /* @__PURE__ */ jsx("span", {
3398
+ className: "dy-text-xs dy-font-mono dy-bg-muted/50 dy-px-1.5 dy-py-0.5 dy-rounded dy-border",
3399
+ children: formatted
3400
+ });
3401
+ return /* @__PURE__ */ jsx("span", {
3402
+ className: "dy-text-sm dy-font-medium",
3403
+ title: String(value),
3404
+ children: formatted
3405
+ });
3406
+ }
3066
3407
  let text = String(value);
3067
3408
  if (field.type === "richText") text = text.replace(/<[^>]*>/g, "");
3068
3409
  const truncated = text.slice(0, 30);
@@ -6029,7 +6370,9 @@ function TextField({ schema, field, disabled }) {
6029
6370
  ...field,
6030
6371
  value: field.value ?? "",
6031
6372
  placeholder: schema.admin?.placeholder || "0",
6032
- disabled
6373
+ disabled,
6374
+ min: getMin(schema),
6375
+ max: getMax(schema)
6033
6376
  });
6034
6377
  case "email": return /* @__PURE__ */ jsx(Input, {
6035
6378
  type: "email",
@@ -6057,6 +6400,21 @@ function TextField({ schema, field, disabled }) {
6057
6400
  });
6058
6401
  }
6059
6402
  })();
6403
+ const numberFormat = schema.type === "number" ? schema.admin?.format : void 0;
6404
+ if (numberFormat && field.value !== null && field.value !== void 0 && field.value !== "") {
6405
+ const rating = getRatingSpec(field.value, numberFormat);
6406
+ return /* @__PURE__ */ jsxs("div", {
6407
+ className: "dy-space-y-1",
6408
+ children: [inputEl, rating ? /* @__PURE__ */ jsx("div", {
6409
+ className: "dy-flex dy-items-center dy-gap-0.5",
6410
+ title: `${rating.value} / ${rating.max}`,
6411
+ children: Array.from({ length: rating.max }, (_, i) => /* @__PURE__ */ jsx(Star, { className: i < Math.round(rating.value) ? "dy-h-4 dy-w-4 dy-fill-amber-400 dy-text-amber-400" : "dy-h-4 dy-w-4 dy-text-muted-foreground/30" }, i))
6412
+ }) : /* @__PURE__ */ jsx("span", {
6413
+ className: "dy-text-xs dy-text-muted-foreground",
6414
+ children: formatNumber(field.value, numberFormat)
6415
+ })]
6416
+ });
6417
+ }
6060
6418
  const hasMaxLength = maxLength && typeof maxLength === "number";
6061
6419
  const hasMaxWords = maxWords && typeof maxWords === "number";
6062
6420
  if (hasMaxLength || hasMaxWords) return /* @__PURE__ */ jsxs("div", {
@@ -6092,6 +6450,14 @@ function getMaxWords(schema) {
6092
6450
  if (schema.type !== "text") return;
6093
6451
  return schema.maxWords ?? schema.admin?.maxWords;
6094
6452
  }
6453
+ function getMin(schema) {
6454
+ if (schema.type !== "number") return;
6455
+ return schema.min ?? schema.admin?.min;
6456
+ }
6457
+ function getMax(schema) {
6458
+ if (schema.type !== "number") return;
6459
+ return schema.max ?? schema.admin?.max;
6460
+ }
6095
6461
  //#endregion
6096
6462
  //#region src/components/forms/fields/text-area-field.tsx
6097
6463
  function TextAreaField({ schema, field, disabled }) {
@@ -6161,6 +6527,21 @@ function CheckboxField({ field, disabled }) {
6161
6527
  });
6162
6528
  }
6163
6529
  //#endregion
6530
+ //#region src/hooks/use-debounced-value.ts
6531
+ /**
6532
+ * Returns a debounced copy of `value` that only updates after `delayMs` have
6533
+ * elapsed without a further change. Use it to throttle server requests driven
6534
+ * by fast-changing input, such as a search box.
6535
+ */
6536
+ function useDebouncedValue(value, delayMs = 250) {
6537
+ const [debounced, setDebounced] = React$1.useState(value);
6538
+ React$1.useEffect(() => {
6539
+ const timer = setTimeout(() => setDebounced(value), delayMs);
6540
+ return () => clearTimeout(timer);
6541
+ }, [value, delayMs]);
6542
+ return debounced;
6543
+ }
6544
+ //#endregion
6164
6545
  //#region src/components/forms/fields/select-field.tsx
6165
6546
  /**
6166
6547
  * SelectField Component
@@ -6179,18 +6560,21 @@ function SelectField({ schema, field, disabled, collection, siblingValues }) {
6179
6560
  const [searchVal, setSearchVal] = React$1.useState("");
6180
6561
  const label = schema.label || schema.name.charAt(0).toUpperCase() + schema.name.slice(1);
6181
6562
  const isDynamic = !!(schema.options && typeof schema.options === "object" && "_dynamic" in schema.options);
6182
- const { data: dynamicOptions, isLoading } = useQuery({
6563
+ const debouncedSearch = useDebouncedValue(searchVal.trim(), 250);
6564
+ const { data: dynamicOptions, isLoading, isFetching } = useQuery({
6183
6565
  queryKey: [
6184
6566
  "options",
6185
6567
  collection,
6186
6568
  schema.name,
6187
- siblingValues
6569
+ siblingValues,
6570
+ debouncedSearch
6188
6571
  ],
6189
6572
  queryFn: async () => {
6190
6573
  const q = new URLSearchParams();
6191
6574
  if (siblingValues) Object.entries(siblingValues).forEach(([k, v]) => {
6192
6575
  if (typeof v === "string" || typeof v === "number" || typeof v === "boolean") q.append(k, String(v));
6193
6576
  });
6577
+ if (debouncedSearch) q.append("search", debouncedSearch);
6194
6578
  const url = `${client?.getBaseUrl() || ""}/api/dyrected/options/${collection}/${schema.name}?${q.toString()}`;
6195
6579
  const authHeaders = {};
6196
6580
  const token = typeof window !== "undefined" ? localStorage.getItem("dyrected_token") : null;
@@ -6202,7 +6586,8 @@ function SelectField({ schema, field, disabled, collection, siblingValues }) {
6202
6586
  if (!res.ok) throw new Error("Failed to fetch options");
6203
6587
  return res.json();
6204
6588
  },
6205
- enabled: !!client && isDynamic && !!collection && !!schema.name
6589
+ enabled: !!client && isDynamic && !!collection && !!schema.name,
6590
+ placeholderData: keepPreviousData
6206
6591
  });
6207
6592
  const options = normalizeOptions(isDynamic ? dynamicOptions || [] : schema.options).map((opt) => ({
6208
6593
  label: opt.label,
@@ -6254,41 +6639,48 @@ function SelectField({ schema, field, disabled, collection, siblingValues }) {
6254
6639
  }), /* @__PURE__ */ jsx(PopoverContent, {
6255
6640
  className: "dy-w-[var(--radix-popover-trigger-width)] dy-p-0 dy-rounded-xl dy-border-border/40 dy-shadow-xl",
6256
6641
  align: "start",
6257
- children: /* @__PURE__ */ jsxs(Command$1, { children: [/* @__PURE__ */ jsx(CommandInput, {
6258
- placeholder: `Search ${label.toLowerCase()}...`,
6259
- value: searchVal,
6260
- onValueChange: setSearchVal
6261
- }), /* @__PURE__ */ jsxs(CommandList, { children: [
6262
- showCustomOption && /* @__PURE__ */ jsx(CommandGroup, {
6263
- heading: "Custom Value",
6264
- children: /* @__PURE__ */ jsxs(CommandItem, {
6265
- value: searchVal,
6642
+ children: /* @__PURE__ */ jsxs(Command$1, {
6643
+ shouldFilter: !isDynamic,
6644
+ children: [/* @__PURE__ */ jsx(CommandInput, {
6645
+ placeholder: `Search ${label.toLowerCase()}...`,
6646
+ value: searchVal,
6647
+ onValueChange: setSearchVal
6648
+ }), /* @__PURE__ */ jsxs(CommandList, { children: [
6649
+ isDynamic && isFetching && /* @__PURE__ */ jsx("div", {
6650
+ className: "dy-py-6 dy-text-center dy-text-sm dy-text-muted-foreground",
6651
+ children: "Searching…"
6652
+ }),
6653
+ showCustomOption && /* @__PURE__ */ jsx(CommandGroup, {
6654
+ heading: "Custom Value",
6655
+ children: /* @__PURE__ */ jsxs(CommandItem, {
6656
+ value: searchVal,
6657
+ onSelect: () => {
6658
+ field.onChange(trimmedSearch);
6659
+ handleOpenChange(false);
6660
+ },
6661
+ className: "dy-rounded-lg dy-py-2.5 dy-text-primary dy-font-medium",
6662
+ children: [/* @__PURE__ */ jsx(Plus, { className: "dy-mr-2 dy-h-4 dy-w-4" }), /* @__PURE__ */ jsxs("span", { children: [
6663
+ "Use \"",
6664
+ trimmedSearch,
6665
+ "\""
6666
+ ] })]
6667
+ })
6668
+ }),
6669
+ /* @__PURE__ */ jsx(CommandEmpty, { children: "No option found." }),
6670
+ /* @__PURE__ */ jsx(CommandGroup, { children: options.map((opt) => /* @__PURE__ */ jsxs(CommandItem, {
6671
+ value: `${opt.label} ${opt.value}`,
6266
6672
  onSelect: () => {
6267
- field.onChange(trimmedSearch);
6673
+ field.onChange(opt.value);
6268
6674
  handleOpenChange(false);
6269
6675
  },
6270
- className: "dy-rounded-lg dy-py-2.5 dy-text-primary dy-font-medium",
6271
- children: [/* @__PURE__ */ jsx(Plus, { className: "dy-mr-2 dy-h-4 dy-w-4" }), /* @__PURE__ */ jsxs("span", { children: [
6272
- "Use \"",
6273
- trimmedSearch,
6274
- "\""
6275
- ] })]
6276
- })
6277
- }),
6278
- /* @__PURE__ */ jsx(CommandEmpty, { children: "No option found." }),
6279
- /* @__PURE__ */ jsx(CommandGroup, { children: options.map((opt) => /* @__PURE__ */ jsxs(CommandItem, {
6280
- value: `${opt.label} ${opt.value}`,
6281
- onSelect: () => {
6282
- field.onChange(opt.value);
6283
- handleOpenChange(false);
6284
- },
6285
- className: "dy-rounded-lg dy-py-2.5",
6286
- children: [/* @__PURE__ */ jsx(Check, { className: cn("dy-mr-2 dy-h-4 dy-w-4", currentValue === opt.value ? "dy-opacity-100" : "dy-opacity-0") }), /* @__PURE__ */ jsx("span", {
6287
- className: "dy-truncate",
6288
- children: opt.label
6289
- })]
6290
- }, opt.value || "__empty")) })
6291
- ] })] })
6676
+ className: "dy-rounded-lg dy-py-2.5",
6677
+ children: [/* @__PURE__ */ jsx(Check, { className: cn("dy-mr-2 dy-h-4 dy-w-4", currentValue === opt.value ? "dy-opacity-100" : "dy-opacity-0") }), /* @__PURE__ */ jsx("span", {
6678
+ className: "dy-truncate",
6679
+ children: opt.label
6680
+ })]
6681
+ }, opt.value || "__empty")) })
6682
+ ] })]
6683
+ })
6292
6684
  })]
6293
6685
  });
6294
6686
  }
@@ -6387,19 +6779,23 @@ function RadioField({ schema, field, disabled, collection, siblingValues }) {
6387
6779
  function MultiSelect({ options, value = [], onChange, label, placeholder = "Select options...", disabled, collection, siblingValues, schema }) {
6388
6780
  const { client } = useDyrected();
6389
6781
  const [open, setOpen] = React$1.useState(false);
6782
+ const [searchVal, setSearchVal] = React$1.useState("");
6390
6783
  const isDynamic = !!(schema?.options && typeof schema.options === "object" && "_dynamic" in schema.options);
6391
- const { data: dynamicOptions, isLoading } = useQuery({
6784
+ const debouncedSearch = useDebouncedValue(searchVal.trim(), 250);
6785
+ const { data: dynamicOptions, isLoading, isFetching } = useQuery({
6392
6786
  queryKey: [
6393
6787
  "options",
6394
6788
  collection,
6395
6789
  schema?.name,
6396
- siblingValues
6790
+ siblingValues,
6791
+ debouncedSearch
6397
6792
  ],
6398
6793
  queryFn: async () => {
6399
6794
  const q = new URLSearchParams();
6400
6795
  if (siblingValues) Object.entries(siblingValues).forEach(([k, v]) => {
6401
6796
  if (typeof v === "string" || typeof v === "number" || typeof v === "boolean") q.append(k, String(v));
6402
6797
  });
6798
+ if (debouncedSearch) q.append("search", debouncedSearch);
6403
6799
  const url = `${client?.getBaseUrl() || ""}/api/dyrected/options/${collection}/${schema?.name}?${q.toString()}`;
6404
6800
  const authHeaders = {};
6405
6801
  const token = typeof window !== "undefined" ? localStorage.getItem("dyrected_token") : null;
@@ -6411,7 +6807,8 @@ function MultiSelect({ options, value = [], onChange, label, placeholder = "Sele
6411
6807
  if (!res.ok) throw new Error("Failed to fetch options");
6412
6808
  return res.json();
6413
6809
  },
6414
- enabled: !!client && isDynamic && !!collection && !!schema?.name
6810
+ enabled: !!client && isDynamic && !!collection && !!schema?.name,
6811
+ placeholderData: keepPreviousData
6415
6812
  });
6416
6813
  const rawOptions = isDynamic ? dynamicOptions || [] : options;
6417
6814
  const normalizedOpts = (Array.isArray(rawOptions) ? rawOptions : []).map((opt) => {
@@ -6494,127 +6891,88 @@ function MultiSelect({ options, value = [], onChange, label, placeholder = "Sele
6494
6891
  }), /* @__PURE__ */ jsx(PopoverContent, {
6495
6892
  className: "dy-w-[var(--radix-popover-trigger-width)] dy-p-0 dy-rounded-xl dy-border-border/40 dy-shadow-xl",
6496
6893
  align: "start",
6497
- children: /* @__PURE__ */ jsxs(Command$1, { children: [/* @__PURE__ */ jsx(CommandInput, { placeholder: "Search options..." }), /* @__PURE__ */ jsxs(CommandList, { children: [/* @__PURE__ */ jsx(CommandEmpty, { children: "No option found." }), /* @__PURE__ */ jsx(CommandGroup, { children: normalizedOpts.map((option) => {
6498
- const isSelected = value.includes(option.value);
6499
- return /* @__PURE__ */ jsxs(CommandItem, {
6500
- value: `${option.label} ${option.value}`,
6501
- onSelect: () => handleSelect(option.value),
6502
- className: "dy-rounded-lg dy-py-2.5",
6503
- children: [/* @__PURE__ */ jsx(Check, { className: cn("dy-mr-2 dy-h-4 dy-w-4", isSelected ? "dy-opacity-100" : "dy-opacity-0") }), option.label]
6504
- }, option.value);
6505
- }) })] })] })
6894
+ children: /* @__PURE__ */ jsxs(Command$1, {
6895
+ shouldFilter: !isDynamic,
6896
+ children: [/* @__PURE__ */ jsx(CommandInput, {
6897
+ placeholder: "Search options...",
6898
+ value: searchVal,
6899
+ onValueChange: setSearchVal
6900
+ }), /* @__PURE__ */ jsxs(CommandList, { children: [
6901
+ isDynamic && isFetching && /* @__PURE__ */ jsx("div", {
6902
+ className: "dy-py-6 dy-text-center dy-text-sm dy-text-muted-foreground",
6903
+ children: "Searching…"
6904
+ }),
6905
+ /* @__PURE__ */ jsx(CommandEmpty, { children: "No option found." }),
6906
+ /* @__PURE__ */ jsx(CommandGroup, { children: normalizedOpts.map((option) => {
6907
+ const isSelected = value.includes(option.value);
6908
+ return /* @__PURE__ */ jsxs(CommandItem, {
6909
+ value: `${option.label} ${option.value}`,
6910
+ onSelect: () => handleSelect(option.value),
6911
+ className: "dy-rounded-lg dy-py-2.5",
6912
+ children: [/* @__PURE__ */ jsx(Check, { className: cn("dy-mr-2 dy-h-4 dy-w-4", isSelected ? "dy-opacity-100" : "dy-opacity-0") }), option.label]
6913
+ }, option.value);
6914
+ }) })
6915
+ ] })]
6916
+ })
6506
6917
  })]
6507
6918
  })]
6508
6919
  });
6509
6920
  }
6510
6921
  //#endregion
6511
6922
  //#region src/components/ui/calendar.tsx
6512
- function Calendar$1({ className, classNames, showOutsideDays = true, captionLayout = "label", buttonVariant = "ghost", formatters, components, ...props }) {
6513
- const defaultClassNames = getDefaultClassNames();
6923
+ function Calendar$1({ className, classNames, showOutsideDays = true, ...props }) {
6514
6924
  return /* @__PURE__ */ jsx(DayPicker, {
6515
6925
  showOutsideDays,
6516
- className: cn("dy-bg-background dy-group/calendar dy-p-4 [--cell-size:2.25rem] dy-shadow-sm dy-rounded-xl dy-border dy-border-border/40", String.raw`rtl:**:[.rdp-button\_next>svg]:rotate-180`, String.raw`rtl:**:[.rdp-button\_previous>svg]:rotate-180`, className),
6517
- captionLayout,
6518
- formatters: {
6519
- formatMonthDropdown: (date) => date.toLocaleString("default", { month: "short" }),
6520
- ...formatters
6521
- },
6926
+ className: cn("dy-p-3 dy-bg-background dy-rounded-xl dy-border dy-border-border/40 dy-shadow-sm", className),
6522
6927
  classNames: {
6523
- root: cn("dy-w-fit", defaultClassNames.root),
6524
- months: cn("dy-relative dy-flex dy-flex-col dy-gap-4 md:dy-flex-row", defaultClassNames.months),
6525
- month: cn("dy-flex dy-w-full dy-flex-col dy-gap-4", defaultClassNames.month),
6526
- nav: cn("dy-absolute dy-inset-x-0 dy-top-0 dy-z-10 dy-flex dy-w-full dy-items-center dy-justify-between dy-gap-1", defaultClassNames.nav),
6527
- button_previous: cn(buttonVariants({ variant: buttonVariant }), "dy-h-[--cell-size] dy-w-[--cell-size] dy-select-none dy-p-0 aria-disabled:dy-opacity-50", defaultClassNames.button_previous),
6528
- button_next: cn(buttonVariants({ variant: buttonVariant }), "dy-h-[--cell-size] dy-w-[--cell-size] dy-select-none dy-p-0 aria-disabled:dy-opacity-50", defaultClassNames.button_next),
6529
- month_caption: cn("dy-flex dy-h-[--cell-size] dy-w-full dy-items-center dy-justify-center dy-px-[--cell-size] dy-mb-4", defaultClassNames.month_caption),
6530
- dropdowns: cn("dy-flex dy-h-[--cell-size] dy-w-full dy-items-center dy-justify-center dy-gap-1.5 dy-text-sm dy-font-medium", defaultClassNames.dropdowns),
6531
- dropdown_root: cn("has-focus:dy-border-ring dy-border-input dy-shadow-xs has-focus:dy-ring-ring/50 has-focus:dy-ring-[3px] dy-relative dy-rounded-md dy-border", defaultClassNames.dropdown_root),
6532
- dropdown: cn("dy-bg-popover dy-absolute dy-inset-0 dy-opacity-0", defaultClassNames.dropdown),
6533
- caption_label: cn("dy-select-none dy-font-semibold dy-text-lg dy-tracking-tight", captionLayout === "label" ? "dy-text-sm" : "[&>svg]:dy-text-muted-foreground dy-flex dy-h-8 dy-items-center dy-gap-1 dy-rounded-md dy-pl-2 dy-pr-1 dy-text-sm [&>svg]:dy-size-3.5", defaultClassNames.caption_label),
6534
- table: "dy-w-full dy-border-collapse",
6535
- weekdays: cn("dy-grid dy-grid-cols-7 dy-mb-2", defaultClassNames.weekdays),
6536
- weekday: cn("dy-text-muted-foreground dy-text-center dy-select-none dy-text-[0.8rem] dy-font-medium", defaultClassNames.weekday),
6537
- week: cn("dy-grid dy-grid-cols-7 dy-w-full dy-mt-1", defaultClassNames.week),
6538
- week_number_header: cn("dy-w-[--cell-size] dy-select-none", defaultClassNames.week_number_header),
6539
- week_number: cn("dy-text-muted-foreground dy-select-none dy-text-[0.8rem]", defaultClassNames.week_number),
6540
- day: cn("dy-group/day dy-relative dy-flex dy-items-center dy-justify-center dy-h-[--cell-size] dy-w-full dy-select-none dy-p-0 dy-text-center", defaultClassNames.day),
6541
- range_start: cn("dy-bg-primary dy-text-primary-foreground dy-rounded-l-md", defaultClassNames.range_start),
6542
- range_middle: cn("dy-bg-accent dy-text-accent-foreground dy-rounded-none", defaultClassNames.range_middle),
6543
- range_end: cn("dy-bg-primary dy-text-primary-foreground dy-rounded-r-md", defaultClassNames.range_end),
6544
- today: cn("dy-bg-accent/50 dy-text-accent-foreground dy-font-bold dy-rounded-md", defaultClassNames.today),
6545
- outside: cn("dy-text-muted-foreground/40 aria-selected:dy-text-muted-foreground/40 dy-opacity-50", defaultClassNames.outside),
6546
- disabled: cn("dy-text-muted-foreground dy-opacity-50", defaultClassNames.disabled),
6547
- hidden: cn("dy-invisible", defaultClassNames.hidden),
6928
+ months: "dy-flex dy-flex-col sm:dy-flex-row dy-space-y-4 sm:dy-space-x-4 sm:dy-space-y-0",
6929
+ month: "dy-space-y-4",
6930
+ caption: "dy-flex dy-justify-center dy-pt-1 dy-relative dy-items-center",
6931
+ caption_label: "dy-text-sm dy-font-semibold dy-tracking-tight",
6932
+ nav: "dy-space-x-1 dy-flex dy-items-center",
6933
+ nav_button: cn(buttonVariants({ variant: "outline" }), "dy-h-7 dy-w-7 dy-bg-transparent dy-p-0 dy-opacity-50 hover:dy-opacity-100"),
6934
+ nav_button_previous: "dy-absolute dy-left-1",
6935
+ nav_button_next: "dy-absolute dy-right-1",
6936
+ table: "dy-w-full dy-border-collapse dy-space-y-1",
6937
+ head_row: "dy-flex",
6938
+ head_cell: "dy-text-muted-foreground dy-rounded-md dy-w-9 dy-font-medium dy-text-[0.8rem]",
6939
+ row: "dy-flex dy-w-full dy-mt-2",
6940
+ cell: "dy-h-9 dy-w-9 dy-text-center dy-text-sm dy-p-0 dy-relative [&:has([aria-selected].day-range-end)]:dy-rounded-r-md [&:has([aria-selected].day-outside)]:dy-bg-accent/50 [&:has([aria-selected])]:dy-bg-accent first:[&:has([aria-selected])]:dy-rounded-l-md last:[&:has([aria-selected])]:dy-rounded-r-md focus-within:dy-relative focus-within:dy-z-20",
6941
+ day: cn(buttonVariants({ variant: "ghost" }), "dy-h-9 dy-w-9 dy-p-0 dy-font-normal aria-selected:dy-opacity-100"),
6942
+ day_range_end: "dy-day-range-end",
6943
+ day_selected: "dy-bg-primary dy-text-primary-foreground hover:dy-bg-primary hover:dy-text-primary-foreground focus:dy-bg-primary focus:dy-text-primary-foreground",
6944
+ day_today: "dy-bg-accent dy-text-accent-foreground",
6945
+ day_outside: "dy-day-outside dy-text-muted-foreground dy-opacity-50 aria-selected:dy-bg-accent/50 aria-selected:dy-text-muted-foreground aria-selected:dy-opacity-30",
6946
+ day_disabled: "dy-text-muted-foreground dy-opacity-50",
6947
+ day_range_middle: "aria-selected:dy-bg-accent aria-selected:dy-text-accent-foreground",
6948
+ day_hidden: "dy-invisible",
6548
6949
  ...classNames
6549
6950
  },
6550
6951
  components: {
6551
- Root: ({ className, rootRef, ...props }) => {
6552
- return /* @__PURE__ */ jsx("div", {
6553
- "data-slot": "calendar",
6554
- ref: rootRef,
6555
- className: cn(className),
6556
- ...props
6557
- });
6558
- },
6559
- Chevron: ({ className, orientation, ...props }) => {
6560
- if (orientation === "left") return /* @__PURE__ */ jsx(ChevronLeftIcon, {
6561
- className: cn("dy-size-4", className),
6562
- ...props
6563
- });
6564
- if (orientation === "right") return /* @__PURE__ */ jsx(ChevronRightIcon, {
6565
- className: cn("dy-size-4", className),
6566
- ...props
6567
- });
6568
- return /* @__PURE__ */ jsx(ChevronDownIcon, {
6569
- className: cn("dy-size-4", className),
6570
- ...props
6571
- });
6572
- },
6573
- DayButton: CalendarDayButton,
6574
- WeekNumber: ({ children, ...props }) => {
6575
- return /* @__PURE__ */ jsx("td", {
6576
- ...props,
6577
- children: /* @__PURE__ */ jsx("div", {
6578
- className: "dy-flex dy-size-[--cell-size] dy-items-center dy-justify-center dy-text-center",
6579
- children
6580
- })
6581
- });
6582
- },
6583
- ...components
6952
+ IconLeft: ({ ...props }) => /* @__PURE__ */ jsx(ChevronLeftIcon, {
6953
+ ...props,
6954
+ className: "dy-h-4 dy-w-4"
6955
+ }),
6956
+ IconRight: ({ ...props }) => /* @__PURE__ */ jsx(ChevronRightIcon, {
6957
+ ...props,
6958
+ className: "dy-h-4 dy-w-4"
6959
+ })
6584
6960
  },
6585
6961
  ...props
6586
6962
  });
6587
6963
  }
6588
- function CalendarDayButton({ className, day, modifiers, ...props }) {
6589
- const ref = React$1.useRef(null);
6590
- React$1.useEffect(() => {
6591
- if (!modifiers.focused) return;
6592
- const frame = requestAnimationFrame(() => ref.current?.focus());
6593
- return () => cancelAnimationFrame(frame);
6594
- }, [modifiers.focused]);
6595
- return /* @__PURE__ */ jsx(Button, {
6596
- ref,
6597
- variant: "ghost",
6598
- size: "icon",
6599
- "data-day": day.date.toLocaleDateString(),
6600
- "data-selected-single": modifiers.selected && !modifiers.range_start && !modifiers.range_end && !modifiers.range_middle,
6601
- "data-range-start": modifiers.range_start,
6602
- "data-range-end": modifiers.range_end,
6603
- "data-range-middle": modifiers.range_middle,
6604
- className: cn("dy-flex dy-items-center dy-justify-center dy-h-[--cell-size] dy-w-full dy-min-w-[--cell-size] dy-p-0 dy-font-normal dy-transition-all", "hover:dy-bg-accent hover:dy-text-accent-foreground", "data-[selected-single=true]:dy-bg-primary data-[selected-single=true]:dy-text-primary-foreground data-[selected-single=true]:dy-rounded-full data-[selected-single=true]:dy-shadow-lg", "data-[range-middle=true]:dy-bg-accent data-[range-middle=true]:dy-text-accent-foreground data-[range-middle=true]:dy-rounded-none", "data-[range-start=true]:dy-bg-primary data-[range-start=true]:dy-text-primary-foreground data-[range-start=true]:dy-rounded-l-md", "data-[range-end=true]:dy-bg-primary data-[range-end=true]:dy-text-primary-foreground data-[range-end=true]:dy-rounded-r-md", "dy-group-data-[focused=true]/day:dy-ring-2 dy-group-data-[focused=true]/day:dy-ring-ring dy-group-data-[focused=true]/day:dy-relative dy-group-data-[focused=true]/day:dy-z-10", className),
6605
- ...props
6606
- });
6607
- }
6964
+ Calendar$1.displayName = "Calendar";
6608
6965
  //#endregion
6609
6966
  //#region src/components/forms/fields/date-picker.tsx
6610
6967
  function InlinePicker({ open, setOpen, triggerRef, children }) {
6611
6968
  React$1.useEffect(() => {
6612
6969
  if (!open) return;
6613
6970
  const handle = (e) => {
6971
+ if (e.target && !document.contains(e.target)) return;
6614
6972
  if (triggerRef.current && !triggerRef.current.contains(e.target)) setOpen(false);
6615
6973
  };
6616
- document.addEventListener("mousedown", handle);
6617
- return () => document.removeEventListener("mousedown", handle);
6974
+ document.addEventListener("pointerdown", handle, { capture: true });
6975
+ return () => document.removeEventListener("pointerdown", handle, { capture: true });
6618
6976
  }, [
6619
6977
  open,
6620
6978
  setOpen,
@@ -6622,7 +6980,7 @@ function InlinePicker({ open, setOpen, triggerRef, children }) {
6622
6980
  ]);
6623
6981
  return /* @__PURE__ */ jsx("div", {
6624
6982
  className: cn("dy-absolute dy-left-0 dy-top-full dy-z-50 dy-mt-1 dy-rounded-xl dy-border dy-border-border/50 dy-bg-popover dy-shadow-2xl dy-transition-[opacity,transform] dy-duration-100 dy-origin-top-left", open ? "dy-opacity-100 dy-scale-100 dy-pointer-events-auto" : "dy-opacity-0 dy-scale-95 dy-pointer-events-none dy-invisible"),
6625
- "aria-hidden": !open,
6983
+ inert: !open ? true : void 0,
6626
6984
  children
6627
6985
  });
6628
6986
  }
@@ -8790,6 +9148,8 @@ function FormFieldRenderer({ schema, basePath, control, collection, documentId }
8790
9148
  const condition = schema.admin?.condition;
8791
9149
  const readAccess = schema.access?.read;
8792
9150
  const updateAccess = schema.access?.update;
9151
+ const createAccess = schema.access?.create;
9152
+ const writeAccess = documentId ? updateAccess : createAccess ?? updateAccess;
8793
9153
  const compiledCondition = React$1.useMemo(() => {
8794
9154
  if (typeof condition !== "string") return null;
8795
9155
  try {
@@ -8820,10 +9180,10 @@ function FormFieldRenderer({ schema, basePath, control, collection, documentId }
8820
9180
  }
8821
9181
  }, [readAccess]);
8822
9182
  const compiledUpdateAccess = React$1.useMemo(() => {
8823
- if (typeof updateAccess !== "string") return null;
9183
+ if (typeof writeAccess !== "string") return null;
8824
9184
  try {
8825
9185
  return {
8826
- expr: jexl.compile(updateAccess),
9186
+ expr: jexl.compile(writeAccess),
8827
9187
  error: null
8828
9188
  };
8829
9189
  } catch (e) {
@@ -8832,7 +9192,7 @@ function FormFieldRenderer({ schema, basePath, control, collection, documentId }
8832
9192
  error: `Update access compile error: ${e.message || String(e)}`
8833
9193
  };
8834
9194
  }
8835
- }, [updateAccess]);
9195
+ }, [writeAccess]);
8836
9196
  if (schema.admin?.hidden) return null;
8837
9197
  let isVisible = true;
8838
9198
  let jexlError = null;
@@ -8860,7 +9220,7 @@ function FormFieldRenderer({ schema, basePath, control, collection, documentId }
8860
9220
  }
8861
9221
  if (!canRead && !jexlError) return null;
8862
9222
  let canUpdate = true;
8863
- if (updateAccess === false) canUpdate = false;
9223
+ if (writeAccess === false) canUpdate = false;
8864
9224
  else if (compiledUpdateAccess) {
8865
9225
  if (compiledUpdateAccess.error) jexlError = jexlError ? `${jexlError} | ${compiledUpdateAccess.error}` : compiledUpdateAccess.error;
8866
9226
  else if (compiledUpdateAccess.expr) try {
@@ -9105,7 +9465,7 @@ function FormFieldRendererInner({ schema, basePath, control, collection, canUpda
9105
9465
  //#region src/components/forms/form-engine.tsx
9106
9466
  /** Query-string key holding the active form tab (replace-navigated). */
9107
9467
  var TAB_PARAM = "tab";
9108
- function FormEngineInner({ collection, fields, defaultValues = {}, onSubmit, onChange, isLoading, submitLabel = "Save", readOnly, onDataChange, passwordChangeMode = null, documentId, defaultTabLabel }) {
9468
+ function FormEngineInner({ collection, fields, defaultValues = {}, onSubmit, onChange, isLoading, submitLabel = "Save", hideSubmit = false, readOnly, onDataChange, passwordChangeMode = null, documentId, defaultTabLabel }) {
9109
9469
  const { activePath, navigateToPath, getStableId } = useNestedEditor();
9110
9470
  const [searchParams, setSearchParams] = useSearchParams();
9111
9471
  const isDrilledIn = activePath.length > 0;
@@ -9569,7 +9929,7 @@ function FormEngineInner({ collection, fields, defaultValues = {}, onSubmit, onC
9569
9929
  })
9570
9930
  ]
9571
9931
  }),
9572
- /* @__PURE__ */ jsx("div", {
9932
+ !hideSubmit && /* @__PURE__ */ jsx("div", {
9573
9933
  className: "dy-flex dy-justify-end dy-gap-4",
9574
9934
  children: !readOnly && /* @__PURE__ */ jsx(Button, {
9575
9935
  type: "submit",
@@ -10724,24 +11084,53 @@ function CollectionListPage({ slug }) {
10724
11084
  }
10725
11085
  });
10726
11086
  const [exporting, setExporting] = React$1.useState(false);
11087
+ const exportDocsToCsv = React$1.useCallback((docs, filenameSuffix = "") => {
11088
+ if (!schema || !client) return;
11089
+ const csvColumns = [
11090
+ {
11091
+ key: "id",
11092
+ label: "ID"
11093
+ },
11094
+ ...schema.fields.filter((f) => f.name !== "password" && !f.admin?.hidden && f.type !== "row" && f.type !== "join").filter((f) => !!f.name).map((f) => ({
11095
+ key: f.name,
11096
+ label: f.label || f.name
11097
+ })),
11098
+ {
11099
+ key: "updatedAt",
11100
+ label: "Last Updated"
11101
+ }
11102
+ ];
11103
+ const flattenForCsv = (val) => {
11104
+ if (val === null || val === void 0) return "";
11105
+ if (typeof val === "boolean") return val ? "true" : "false";
11106
+ if (typeof val === "number" || typeof val === "string") return String(val);
11107
+ if (Array.isArray(val)) return val.map((item) => flattenForCsv(item)).filter(Boolean).join("; ");
11108
+ if (typeof val === "object" && val !== null) {
11109
+ const obj = val;
11110
+ if (obj.url || obj.filename) return getMediaUrl(obj, client?.getBaseUrl() || "");
11111
+ if (obj.id) return String(obj.title || obj.name || obj.label || obj.id);
11112
+ return JSON.stringify(val);
11113
+ }
11114
+ return String(val);
11115
+ };
11116
+ const escapeCsv = (val) => /[",\n\r]/.test(val) ? `"${val.replace(/"/g, "\"\"")}"` : val;
11117
+ const csv = [csvColumns.map((c) => escapeCsv(flattenForCsv(c.label))).join(","), ...docs.map((doc) => csvColumns.map((c) => escapeCsv(flattenForCsv(doc[c.key]))).join(","))].join("\n");
11118
+ const blob = new Blob([csv], { type: "text/csv;charset=utf-8;" });
11119
+ const url = URL.createObjectURL(blob);
11120
+ const link = document.createElement("a");
11121
+ link.href = url;
11122
+ link.download = `${slug}-export${filenameSuffix}.csv`;
11123
+ link.click();
11124
+ URL.revokeObjectURL(url);
11125
+ }, [
11126
+ schema,
11127
+ client,
11128
+ slug
11129
+ ]);
10727
11130
  const handleExportCsv = React$1.useCallback(async () => {
10728
11131
  if (!schema || !client) return;
10729
11132
  setExporting(true);
10730
11133
  try {
10731
- const csvColumns = [
10732
- {
10733
- key: "id",
10734
- label: "ID"
10735
- },
10736
- ...schema.fields.filter((f) => f.name !== "password" && !f.admin?.hidden && f.type !== "row" && f.type !== "join").filter((f) => !!f.name).map((f) => ({
10737
- key: f.name,
10738
- label: f.label || f.name
10739
- })),
10740
- {
10741
- key: "updatedAt",
10742
- label: "Last Updated"
10743
- }
10744
- ];
10745
11134
  const allDocs = [];
10746
11135
  let pg = 1;
10747
11136
  let totalPages = 1;
@@ -10755,27 +11144,7 @@ function CollectionListPage({ slug }) {
10755
11144
  totalPages = res.totalPages ?? 1;
10756
11145
  pg++;
10757
11146
  }
10758
- const flattenForCsv = (val) => {
10759
- if (val === null || val === void 0) return "";
10760
- if (typeof val === "boolean") return val ? "true" : "false";
10761
- if (typeof val === "number" || typeof val === "string") return String(val);
10762
- if (Array.isArray(val)) return val.map((item) => flattenForCsv(item)).filter(Boolean).join("; ");
10763
- if (typeof val === "object" && val !== null) {
10764
- const obj = val;
10765
- if (obj.url || obj.filename) return getMediaUrl(obj, client?.getBaseUrl() || "");
10766
- if (obj.id) return String(obj.title || obj.name || obj.label || obj.id);
10767
- return JSON.stringify(val);
10768
- }
10769
- return String(val);
10770
- };
10771
- const csv = [csvColumns.map((c) => flattenForCsv(c.label)).join(","), ...allDocs.map((doc) => csvColumns.map((c) => flattenForCsv(doc[c.key])).join(","))].join("\n");
10772
- const blob = new Blob([csv], { type: "text/csv;charset=utf-8;" });
10773
- const url = URL.createObjectURL(blob);
10774
- const link = document.createElement("a");
10775
- link.href = url;
10776
- link.download = `${slug}-export.csv`;
10777
- link.click();
10778
- URL.revokeObjectURL(url);
11147
+ exportDocsToCsv(allDocs);
10779
11148
  toast.success(`Exported ${allDocs.length} entries`);
10780
11149
  } catch (err) {
10781
11150
  toast.error("Export failed", { description: err instanceof Error ? err.message : String(err) });
@@ -10785,8 +11154,15 @@ function CollectionListPage({ slug }) {
10785
11154
  }, [
10786
11155
  schema,
10787
11156
  client,
10788
- slug
11157
+ slug,
11158
+ exportDocsToCsv
10789
11159
  ]);
11160
+ const handleExportSelected = React$1.useCallback((ids) => {
11161
+ const selectedDocs = ids.map((id) => response?.docs?.find((d) => d.id === id)).filter((d) => !!d);
11162
+ if (selectedDocs.length === 0) return;
11163
+ exportDocsToCsv(selectedDocs, "-selected");
11164
+ toast.success(`Exported ${selectedDocs.length} selected ${selectedDocs.length === 1 ? "entry" : "entries"}`);
11165
+ }, [response, exportDocsToCsv]);
10790
11166
  const handleDelete = React$1.useCallback((id) => {
10791
11167
  if (schema?.auth && id === user?.id) {
10792
11168
  toast.error("Action not allowed", { description: "You cannot delete your own account." });
@@ -11358,7 +11734,19 @@ function CollectionListPage({ slug }) {
11358
11734
  }
11359
11735
  return canDelete;
11360
11736
  });
11361
- return /* @__PURE__ */ jsxs(Button, {
11737
+ return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs(Button, {
11738
+ variant: "outline",
11739
+ size: "sm",
11740
+ className: "dy-h-8",
11741
+ onClick: () => handleExportSelected(selectedIds),
11742
+ disabled: selectedIds.length === 0,
11743
+ children: [
11744
+ /* @__PURE__ */ jsx(FileDown, { className: "dy-h-4 dy-w-4 dy-mr-2" }),
11745
+ "Export Selected (",
11746
+ selectedIds.length,
11747
+ ")"
11748
+ ]
11749
+ }), /* @__PURE__ */ jsxs(Button, {
11362
11750
  variant: "destructive",
11363
11751
  size: "sm",
11364
11752
  className: "dy-h-8",
@@ -11370,7 +11758,7 @@ function CollectionListPage({ slug }) {
11370
11758
  deletableIds.length,
11371
11759
  ")"
11372
11760
  ]
11373
- });
11761
+ })] });
11374
11762
  }
11375
11763
  }, slug),
11376
11764
  /* @__PURE__ */ jsx(AdminComponentSlot, {
@@ -11400,12 +11788,67 @@ function CollectionListPage({ slug }) {
11400
11788
  }
11401
11789
  //#endregion
11402
11790
  //#region src/components/live-preview/LivePreviewPane.tsx
11403
- function LivePreviewPane({ previewUrl, data, mode = "postMessage", onFieldFocus }) {
11791
+ /** Append the preview token to a resolved (absolute) preview URL. */
11792
+ function withPreviewToken(url, token) {
11793
+ try {
11794
+ const u = new URL(url);
11795
+ u.searchParams.set(PREVIEW_TOKEN_PARAM, token);
11796
+ return u.toString();
11797
+ } catch {
11798
+ return `${url}${url.includes("?") ? "&" : "?"}${PREVIEW_TOKEN_PARAM}=${encodeURIComponent(token)}`;
11799
+ }
11800
+ }
11801
+ function safeStringify(value) {
11802
+ try {
11803
+ return JSON.stringify(value) ?? "";
11804
+ } catch {
11805
+ return "";
11806
+ }
11807
+ }
11808
+ function LivePreviewPane({ previewUrl, data, mode = "postMessage", collectionSlug, documentId, onFieldFocus }) {
11404
11809
  const iframeRef = useRef(null);
11810
+ const { client } = useDyrected();
11405
11811
  const [isReady, setIsReady] = useState(false);
11406
11812
  const [viewMode, setViewMode] = useState("desktop");
11407
11813
  const [zoom, setZoom] = useState(.75);
11408
11814
  const [editMode, setEditMode] = useState(true);
11815
+ const [tokenSrc, setTokenSrc] = useState(null);
11816
+ const [tokenError, setTokenError] = useState(null);
11817
+ const lastDataKeyRef = useRef(null);
11818
+ useEffect(() => {
11819
+ if (mode !== "token" || !client || !collectionSlug) return;
11820
+ const key = safeStringify(data);
11821
+ if (key === lastDataKeyRef.current) return;
11822
+ let cancelled = false;
11823
+ const timer = setTimeout(async () => {
11824
+ try {
11825
+ const { token } = await client.createPreviewToken({
11826
+ collectionSlug,
11827
+ documentId,
11828
+ data
11829
+ });
11830
+ if (cancelled) return;
11831
+ lastDataKeyRef.current = key;
11832
+ setTokenSrc(withPreviewToken(previewUrl, token));
11833
+ setTokenError(null);
11834
+ } catch (err) {
11835
+ if (cancelled) return;
11836
+ setTokenError(err instanceof Error ? err.message : "Failed to create preview token.");
11837
+ }
11838
+ }, 800);
11839
+ return () => {
11840
+ cancelled = true;
11841
+ clearTimeout(timer);
11842
+ };
11843
+ }, [
11844
+ mode,
11845
+ client,
11846
+ collectionSlug,
11847
+ documentId,
11848
+ previewUrl,
11849
+ data
11850
+ ]);
11851
+ const iframeSrc = mode === "token" ? tokenSrc ?? previewUrl : previewUrl;
11409
11852
  useEffect(() => {
11410
11853
  if (mode !== "postMessage") return;
11411
11854
  const handleMessage = (event) => {
@@ -11441,7 +11884,7 @@ function LivePreviewPane({ previewUrl, data, mode = "postMessage", onFieldFocus
11441
11884
  }, [editMode, isReady]);
11442
11885
  const reload = () => {
11443
11886
  if (iframeRef.current) {
11444
- iframeRef.current.src = previewUrl;
11887
+ iframeRef.current.src = iframeSrc;
11445
11888
  setIsReady(false);
11446
11889
  }
11447
11890
  };
@@ -11500,24 +11943,32 @@ function LivePreviewPane({ previewUrl, data, mode = "postMessage", onFieldFocus
11500
11943
  ]
11501
11944
  }), /* @__PURE__ */ jsxs("div", {
11502
11945
  className: "dy-flex dy-items-center dy-gap-2",
11503
- children: [/* @__PURE__ */ jsx(Button, {
11504
- variant: "ghost",
11505
- size: "icon",
11506
- className: "dy-h-8 dy-w-8",
11507
- onClick: reload,
11508
- children: /* @__PURE__ */ jsx(RotateCcw, { className: "dy-h-3.5 dy-w-3.5" })
11509
- }), /* @__PURE__ */ jsx(Button, {
11510
- variant: "ghost",
11511
- size: "icon",
11512
- className: "dy-h-8 dy-w-8",
11513
- asChild: true,
11514
- children: /* @__PURE__ */ jsx("a", {
11515
- href: previewUrl,
11516
- target: "_blank",
11517
- rel: "noreferrer",
11518
- children: /* @__PURE__ */ jsx(ExternalLink, { className: "dy-h-3.5 dy-w-3.5" })
11946
+ children: [
11947
+ mode === "token" && tokenError && /* @__PURE__ */ jsx("span", {
11948
+ className: "dy-text-[11px] dy-font-medium dy-text-destructive dy-truncate dy-max-w-[220px]",
11949
+ title: tokenError,
11950
+ children: "Preview token failed"
11951
+ }),
11952
+ /* @__PURE__ */ jsx(Button, {
11953
+ variant: "ghost",
11954
+ size: "icon",
11955
+ className: "dy-h-8 dy-w-8",
11956
+ onClick: reload,
11957
+ children: /* @__PURE__ */ jsx(RotateCcw, { className: "dy-h-3.5 dy-w-3.5" })
11958
+ }),
11959
+ /* @__PURE__ */ jsx(Button, {
11960
+ variant: "ghost",
11961
+ size: "icon",
11962
+ className: "dy-h-8 dy-w-8",
11963
+ asChild: true,
11964
+ children: /* @__PURE__ */ jsx("a", {
11965
+ href: previewUrl,
11966
+ target: "_blank",
11967
+ rel: "noreferrer",
11968
+ children: /* @__PURE__ */ jsx(ExternalLink, { className: "dy-h-3.5 dy-w-3.5" })
11969
+ })
11519
11970
  })
11520
- })]
11971
+ ]
11521
11972
  })]
11522
11973
  }), /* @__PURE__ */ jsx("div", {
11523
11974
  className: "dy-flex-1 dy-flex dy-items-center dy-justify-center dy-p-0 dy-overflow-hidden dy-bg-muted/5",
@@ -11525,7 +11976,7 @@ function LivePreviewPane({ previewUrl, data, mode = "postMessage", onFieldFocus
11525
11976
  className: `dy-bg-background dy-shadow-[0_20px_50px_rgba(0,0,0,0.1)] dy-transition-all dy-duration-500 dy-overflow-hidden dy-border dy-border-border/40 ${viewMode === "mobile" ? "dy-w-[375px] dy-h-[667px]" : "dy-w-full dy-h-full"}`,
11526
11977
  children: /* @__PURE__ */ jsx("iframe", {
11527
11978
  ref: iframeRef,
11528
- src: previewUrl,
11979
+ src: iframeSrc,
11529
11980
  className: cn("dy-border-none dy-transition-transform dy-duration-300", editMode && "dy-cursor-crosshair"),
11530
11981
  style: viewMode === "desktop" ? {
11531
11982
  width: `${100 / zoom}%`,
@@ -11956,7 +12407,7 @@ function HeaderAction({ icon: Icon, label, onClick, active, disabled, busy, titl
11956
12407
  * the editor into that block, then (one tick later, once the sub-form mounts)
11957
12408
  * scrolls to and focuses the specific input.
11958
12409
  */
11959
- function PreviewPaneWithNav({ previewUrl, data, mode, fields, active, onFieldNavigate }) {
12410
+ function PreviewPaneWithNav({ previewUrl, data, mode, collectionSlug, documentId, fields, active, onFieldNavigate }) {
11960
12411
  const { navigateToPath, getStableId } = useNestedEditor();
11961
12412
  const sidebar = useSidebarControl();
11962
12413
  const setCollapsed = sidebar?.setCollapsed;
@@ -12003,9 +12454,25 @@ function PreviewPaneWithNav({ previewUrl, data, mode, fields, active, onFieldNav
12003
12454
  previewUrl,
12004
12455
  data,
12005
12456
  mode,
12457
+ collectionSlug,
12458
+ documentId,
12006
12459
  onFieldFocus: handleFieldFocus
12007
12460
  });
12008
12461
  }
12462
+ function getEntryTitle(entry, schema) {
12463
+ if (!entry) return "";
12464
+ const titleField = schema?.admin?.useAsTitle || "title";
12465
+ if (entry[titleField]) return String(entry[titleField]);
12466
+ for (const f of [
12467
+ "title",
12468
+ "name",
12469
+ "label",
12470
+ "heading",
12471
+ "email",
12472
+ "subject"
12473
+ ]) if (entry[f]) return String(entry[f]);
12474
+ return String(entry.id);
12475
+ }
12009
12476
  function EditEntryPage() {
12010
12477
  const { slug, id } = useParams();
12011
12478
  const [searchParams] = useSearchParams();
@@ -12013,7 +12480,7 @@ function EditEntryPage() {
12013
12480
  const navigate = useNavigate();
12014
12481
  const queryClient = useQueryClient();
12015
12482
  const [showPreview, setShowPreview] = useState(false);
12016
- const [showWorkflow, setShowWorkflow] = useState(false);
12483
+ const [activeTab, setActiveTab] = useState("edit");
12017
12484
  const [mobilePreview, setMobilePreview] = useState(false);
12018
12485
  const [isDirty, setIsDirty] = useState(false);
12019
12486
  const [previewData, setPreviewData] = useState(null);
@@ -12124,7 +12591,7 @@ function EditEntryPage() {
12124
12591
  ]);
12125
12592
  const hasWorkflow = !!schema?.workflow;
12126
12593
  const syncShowWorkflow = useState(() => (next) => {
12127
- setShowWorkflow((prev) => prev === next ? prev : next);
12594
+ setActiveTab((prev) => next ? "versions" : prev === "versions" ? "edit" : prev);
12128
12595
  })[0];
12129
12596
  useEffect(() => {
12130
12597
  if (!hasWorkflow || schemaPreviewUrl) return;
@@ -12143,6 +12610,29 @@ function EditEntryPage() {
12143
12610
  queryFn: () => client.collection(slug).findOne(id),
12144
12611
  enabled: !!client && isEdit
12145
12612
  });
12613
+ const [switcherOpen, setSwitcherOpen] = useState(false);
12614
+ const [searchQuery, setSearchQuery] = useState("");
12615
+ const [debouncedSearchQuery, setDebouncedSearchQuery] = useState("");
12616
+ useEffect(() => {
12617
+ const timer = setTimeout(() => {
12618
+ setDebouncedSearchQuery(searchQuery);
12619
+ }, 300);
12620
+ return () => clearTimeout(timer);
12621
+ }, [searchQuery]);
12622
+ const { data: siblingEntries, isLoading: isSiblingsLoading } = useQuery({
12623
+ queryKey: [
12624
+ "collection-siblings",
12625
+ slug,
12626
+ debouncedSearchQuery
12627
+ ],
12628
+ queryFn: async () => {
12629
+ const displayField = schema?.admin?.useAsTitle || "title";
12630
+ let qb = client.collection(slug).find({ limit: 50 });
12631
+ if (debouncedSearchQuery) qb = qb.where({ [displayField]: { like: `%${debouncedSearchQuery}%` } });
12632
+ return qb.exec();
12633
+ },
12634
+ enabled: !!client && !!slug && isEdit && switcherOpen
12635
+ });
12146
12636
  const syncPreviewData = useState(() => (next) => {
12147
12637
  setPreviewData((prev) => prev === next ? prev : next);
12148
12638
  })[0];
@@ -12206,6 +12696,9 @@ function EditEntryPage() {
12206
12696
  const workflowMeta = isEdit && entry ? entry._workflow ?? null : null;
12207
12697
  const hasStatus = schema?.fields.some((f) => f.name === "status");
12208
12698
  const currentStatus = entry?.status || "draft";
12699
+ const workflowState = workflowConfig && workflowMeta ? workflowConfig.states?.find((s) => s.name === workflowMeta.state) : null;
12700
+ const isPublished = workflowState ? !!workflowState.published : currentStatus === "published";
12701
+ const showStatusBadge = workflowConfig ? !!workflowMeta : hasStatus;
12209
12702
  const siteUrl = getSiteUrl(schemas?.admin?.siteUrl);
12210
12703
  const previewUrl = resolvePreviewUrl(schema.admin?.previewUrl, previewData || entry, siteUrl);
12211
12704
  const readAccess = schema.access?.read;
@@ -12258,15 +12751,26 @@ function EditEntryPage() {
12258
12751
  } catch (e) {
12259
12752
  console.warn("Update access eval failed:", e);
12260
12753
  }
12754
+ const auditAccess = schema.access?.readAudit ?? readAccess;
12755
+ let canReadAudit = true;
12756
+ if (auditAccess === false) canReadAudit = false;
12757
+ else if (typeof auditAccess === "string") try {
12758
+ canReadAudit = jexl.evalSync(auditAccess, {
12759
+ user,
12760
+ ...previewData || entry || {}
12761
+ });
12762
+ } catch {
12763
+ canReadAudit = false;
12764
+ }
12261
12765
  const workflowAvailable = !!(workflowConfig && isEdit && workflowMeta);
12262
- const showLivePreview = showPreview && !!previewUrl;
12263
- const showWorkflowSidebar = workflowAvailable && showWorkflow;
12766
+ const showLivePreview = activeTab === "edit" && showPreview && !!previewUrl;
12767
+ const docsToDisplay = debouncedSearchQuery ? siblingEntries?.docs || [] : siblingEntries?.docs?.filter((d) => String(d.id) !== id).slice(0, 4) || [];
12264
12768
  return /* @__PURE__ */ jsx(NestedEditorProvider, {
12265
12769
  drillInEnabled: !!showLivePreview,
12266
12770
  children: /* @__PURE__ */ jsxs("div", {
12267
12771
  className: cn("dy-flex dy-flex-col dy--mt-6 dy--mb-6 dy--mx-4 lg:dy--mt-10 lg:dy--mb-10 lg:dy--mx-6", showLivePreview ? "dy-h-screen" : ""),
12268
12772
  children: [/* @__PURE__ */ jsxs("div", {
12269
- className: "dy-flex dy-shrink-0 dy-items-center dy-gap-2 dy-border-b dy-border-border/50 dy-bg-background dy-px-3 dy-py-2",
12773
+ className: "dy-flex dy-flex-wrap dy-shrink-0 dy-items-center dy-gap-2 dy-border-b dy-border-border/50 dy-bg-background dy-px-3 dy-py-2",
12270
12774
  children: [
12271
12775
  /* @__PURE__ */ jsx(Button, {
12272
12776
  variant: "ghost",
@@ -12278,13 +12782,52 @@ function EditEntryPage() {
12278
12782
  }),
12279
12783
  /* @__PURE__ */ jsxs("div", {
12280
12784
  className: "dy-flex dy-items-center dy-gap-2 dy-min-w-0",
12281
- children: [/* @__PURE__ */ jsx("h1", {
12785
+ children: [isEdit ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
12786
+ className: "dy-text-base dy-font-serif dy-font-bold dy-tracking-tight dy-text-foreground dy-mr-0.5",
12787
+ children: "Edit"
12788
+ }), /* @__PURE__ */ jsxs(Popover, {
12789
+ open: switcherOpen,
12790
+ onOpenChange: setSwitcherOpen,
12791
+ children: [/* @__PURE__ */ jsxs(PopoverTrigger, {
12792
+ className: "dy-flex dy-items-center dy-gap-1 dy-text-base dy-font-serif dy-font-bold dy-tracking-tight dy-text-foreground hover:dy-bg-muted/80 dy-px-2 dy-py-1 dy-rounded-lg dy-transition-all dy-outline-none dy-min-w-0",
12793
+ children: [/* @__PURE__ */ jsx("span", {
12794
+ className: "dy-truncate dy-max-w-[150px] sm:dy-max-w-none dy-inline-block",
12795
+ children: isEdit && entry ? getEntryTitle(entry, schema) : "..."
12796
+ }), /* @__PURE__ */ jsx(ChevronDown, { className: "dy-h-4 dy-w-4 dy-text-muted-foreground/80 dy-shrink-0" })]
12797
+ }), /* @__PURE__ */ jsx(PopoverContent, {
12798
+ align: "start",
12799
+ className: "dy-w-64 dy-p-0 dy-z-[101]",
12800
+ children: /* @__PURE__ */ jsxs(Command$1, {
12801
+ shouldFilter: false,
12802
+ children: [/* @__PURE__ */ jsx(CommandInput, {
12803
+ placeholder: "Search entries...",
12804
+ value: searchQuery,
12805
+ onValueChange: setSearchQuery
12806
+ }), /* @__PURE__ */ jsx(CommandList, { children: isSiblingsLoading ? /* @__PURE__ */ jsx("div", {
12807
+ className: "dy-py-6 dy-text-center dy-text-sm dy-text-muted-foreground",
12808
+ children: "Loading..."
12809
+ }) : docsToDisplay.length === 0 ? /* @__PURE__ */ jsx(CommandEmpty, { children: "No entries found." }) : /* @__PURE__ */ jsx(CommandGroup, { children: docsToDisplay.map((sibling) => /* @__PURE__ */ jsx(CommandItem, {
12810
+ value: sibling.id,
12811
+ onSelect: (val) => {
12812
+ navigate(`/collections/${slug}/edit/${val}`);
12813
+ setSwitcherOpen(false);
12814
+ setSearchQuery("");
12815
+ },
12816
+ className: "dy-cursor-pointer dy-py-2 dy-px-3 dy-rounded-lg",
12817
+ children: /* @__PURE__ */ jsx("span", {
12818
+ className: "dy-text-sm dy-text-foreground",
12819
+ children: getEntryTitle(sibling, schema)
12820
+ })
12821
+ }, sibling.id)) }) })]
12822
+ })
12823
+ })]
12824
+ })] }) : /* @__PURE__ */ jsxs("h1", {
12282
12825
  className: "dy-text-base dy-font-serif dy-font-bold dy-tracking-tight dy-text-foreground dy-truncate",
12283
- children: isEdit ? `Edit ${schema?.labels?.plural || schema?.slug}` : `New ${schema?.labels?.singular || schema?.slug}`
12284
- }), hasStatus && !workflowConfig && /* @__PURE__ */ jsx(Badge, {
12285
- className: cn("dy-px-2 dy-py-0 dy-rounded-full dy-text-[10px] dy-font-bold dy-uppercase dy-tracking-wider dy-shrink-0", currentStatus === "published" ? "dy-bg-emerald-100 dy-text-emerald-700 dy-border-emerald-200" : "dy-bg-amber-100 dy-text-amber-700 dy-border-amber-200"),
12826
+ children: ["New ", schema?.labels?.singular || schema?.slug]
12827
+ }), showStatusBadge && /* @__PURE__ */ jsx(Badge, {
12828
+ className: cn("dy-px-2 dy-py-0 dy-rounded-full dy-text-[10px] dy-font-bold dy-uppercase dy-tracking-wider dy-shrink-0", isPublished ? "dy-bg-emerald-100 dy-text-emerald-700 dy-border-emerald-200" : "dy-bg-amber-100 dy-text-amber-700 dy-border-amber-200"),
12286
12829
  variant: "outline",
12287
- children: currentStatus === "published" ? "Live" : "Draft"
12830
+ children: isPublished ? "Live" : "Draft"
12288
12831
  })]
12289
12832
  }),
12290
12833
  /* @__PURE__ */ jsxs("div", {
@@ -12313,12 +12856,19 @@ function EditEntryPage() {
12313
12856
  }),
12314
12857
  workflowAvailable && /* @__PURE__ */ jsx(HeaderAction, {
12315
12858
  icon: Workflow,
12316
- label: "Workflow",
12317
- active: showWorkflow,
12318
- title: showWorkflow ? "Hide Workflow" : "Show Workflow",
12319
- onClick: () => setShowWorkflow((v) => !v)
12859
+ label: "Versions",
12860
+ active: activeTab === "versions",
12861
+ title: activeTab === "versions" ? "Hide Version History" : "Show Version History",
12862
+ onClick: () => setActiveTab((tab) => tab === "versions" ? "edit" : "versions")
12320
12863
  }),
12321
- previewUrl && /* @__PURE__ */ jsx(HeaderAction, {
12864
+ schema?.audit && isEdit && canReadAudit && /* @__PURE__ */ jsx(HeaderAction, {
12865
+ icon: History,
12866
+ label: "Audit Log",
12867
+ active: activeTab === "audit",
12868
+ title: activeTab === "audit" ? "Hide Audit Log" : "Show Audit Log",
12869
+ onClick: () => setActiveTab((tab) => tab === "audit" ? "edit" : "audit")
12870
+ }),
12871
+ previewUrl && activeTab === "edit" && /* @__PURE__ */ jsx(HeaderAction, {
12322
12872
  icon: showPreview ? Eye : EyeOff,
12323
12873
  label: "Preview",
12324
12874
  active: showPreview,
@@ -12376,45 +12926,65 @@ function EditEntryPage() {
12376
12926
  })]
12377
12927
  })] })]
12378
12928
  })] }),
12379
- (isEdit ? canUpdate : canCreate) && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", { className: "dy-mx-1 dy-h-6 dy-w-px dy-bg-border/60" }), /* @__PURE__ */ jsx(Button, {
12380
- size: "sm",
12381
- className: "dy-h-9 dy-rounded-lg dy-px-4 dy-font-bold dy-bg-primary dy-text-primary-foreground hover:dy-bg-primary/90 dy-shadow-sm dy-shrink-0",
12382
- onClick: () => document.getElementById("dyrected-form-submit")?.click(),
12383
- disabled: saveMutation.isPending,
12384
- title: isEdit ? "Save Changes (⌘S)" : "Create Entry (⌘S)",
12385
- children: saveMutation.isPending ? /* @__PURE__ */ jsxs("span", {
12386
- className: "dy-flex dy-items-center dy-gap-2",
12387
- children: [/* @__PURE__ */ jsx("span", { className: "dy-h-3.5 dy-w-3.5 dy-animate-spin dy-rounded-full dy-border-2 dy-border-current dy-border-t-transparent" }), "Saving…"]
12388
- }) : /* @__PURE__ */ jsxs("span", {
12389
- className: "dy-flex dy-items-center dy-gap-2",
12390
- children: [/* @__PURE__ */ jsx(Save, { className: "dy-h-3.5 dy-w-3.5" }), isEdit ? "Save" : "Create"]
12391
- })
12392
- })] })
12929
+ (isEdit ? canUpdate : canCreate) && activeTab === "edit" && /* @__PURE__ */ jsxs("div", {
12930
+ className: "dy-hidden md:dy-flex dy-items-center",
12931
+ children: [/* @__PURE__ */ jsx("div", { className: "dy-mx-1 dy-h-6 dy-w-px dy-bg-border/60" }), /* @__PURE__ */ jsx(Button, {
12932
+ size: "sm",
12933
+ className: "dy-h-9 dy-rounded-lg dy-px-4 dy-font-bold dy-bg-primary dy-text-primary-foreground hover:dy-bg-primary/90 dy-shadow-sm dy-shrink-0",
12934
+ onClick: () => document.getElementById("dyrected-form-submit")?.click(),
12935
+ disabled: saveMutation.isPending,
12936
+ title: isEdit ? "Save Changes (⌘S)" : "Create Entry (⌘S)",
12937
+ children: saveMutation.isPending ? /* @__PURE__ */ jsxs("span", {
12938
+ className: "dy-flex dy-items-center dy-gap-2",
12939
+ children: [/* @__PURE__ */ jsx("span", { className: "dy-h-3.5 dy-w-3.5 dy-animate-spin dy-rounded-full dy-border-2 dy-border-current dy-border-t-transparent" }), "Saving…"]
12940
+ }) : /* @__PURE__ */ jsxs("span", {
12941
+ className: "dy-flex dy-items-center dy-gap-2",
12942
+ children: [/* @__PURE__ */ jsx(Save, { className: "dy-h-3.5 dy-w-3.5" }), isEdit ? "Save" : "Create"]
12943
+ })
12944
+ })]
12945
+ })
12393
12946
  ]
12394
12947
  })
12395
12948
  ]
12396
12949
  }), /* @__PURE__ */ jsxs("div", {
12397
12950
  className: "dy-flex dy-flex-1 dy-min-h-0",
12398
- children: [
12399
- previewUrl && /* @__PURE__ */ jsx("div", {
12400
- className: cn("dy-border-r dy-border-border/50 dy-bg-muted/5 dy-transition-all dy-duration-500 dy-overflow-hidden lg:dy-block", showLivePreview ? "lg:dy-flex-1 lg:dy-opacity-100" : "lg:dy-w-0 lg:dy-opacity-0 lg:dy-border-r-0", mobilePreview && showLivePreview ? "dy-flex-1 dy-opacity-100" : "dy-hidden"),
12401
- children: /* @__PURE__ */ jsx("div", {
12402
- className: "dy-h-full",
12403
- children: /* @__PURE__ */ jsx(PreviewPaneWithNav, {
12404
- previewUrl,
12405
- data: previewData || entry,
12406
- mode: schema.admin?.previewMode,
12407
- fields: orderedFields,
12408
- active: !!showLivePreview,
12409
- onFieldNavigate: () => setMobilePreview(false)
12410
- })
12951
+ children: [previewUrl && /* @__PURE__ */ jsx("div", {
12952
+ className: cn("dy-border-r dy-border-border/50 dy-bg-muted/5 dy-transition-all dy-duration-500 dy-overflow-hidden lg:dy-block", showLivePreview ? "lg:dy-flex-1 lg:dy-opacity-100" : "lg:dy-w-0 lg:dy-opacity-0 lg:dy-border-r-0", mobilePreview && showLivePreview ? "dy-flex-1 dy-opacity-100" : "dy-hidden"),
12953
+ children: /* @__PURE__ */ jsx("div", {
12954
+ className: "dy-h-full",
12955
+ children: /* @__PURE__ */ jsx(PreviewPaneWithNav, {
12956
+ previewUrl,
12957
+ data: previewData || entry,
12958
+ mode: schema.admin?.previewMode,
12959
+ collectionSlug: slug,
12960
+ documentId: id && id !== "new" ? id : void 0,
12961
+ fields: orderedFields,
12962
+ active: !!showLivePreview,
12963
+ onFieldNavigate: () => setMobilePreview(false)
12411
12964
  })
12412
- }),
12413
- /* @__PURE__ */ jsx("div", {
12414
- className: cn("dy-px-4 dy-py-6 md:dy-px-4 lg:dy-px-4 lg:dy-py-6 dy-transition-all dy-duration-500", showLivePreview ? "dy-flex-none dy-w-full lg:dy-w-2/6 xl:dy-w-2/7 dy-min-w-0 dy-overflow-y-auto" : showWorkflowSidebar ? "dy-flex-1 dy-max-w-3xl xl:dy-max-w-4xl dy-mx-auto dy-w-full dy-overflow-y-auto" : "dy-flex-1 dy-max-w-4xl xl:dy-max-w-5xl dy-mx-auto dy-w-full dy-overflow-y-auto", mobilePreview && showLivePreview ? "dy-hidden lg:dy-block" : ""),
12415
- children: /* @__PURE__ */ jsx("div", {
12416
- className: "dy-space-y-4",
12417
- children: /* @__PURE__ */ jsxs("div", {
12965
+ })
12966
+ }), /* @__PURE__ */ jsx("div", {
12967
+ className: cn("dy-px-4 dy-py-6 md:dy-px-4 lg:dy-px-4 lg:dy-py-6 dy-transition-all dy-duration-500", showLivePreview ? "dy-flex-none dy-w-full lg:dy-w-2/6 xl:dy-w-2/7 dy-min-w-0 dy-overflow-y-auto" : "dy-flex-1 dy-max-w-4xl xl:dy-max-w-5xl dy-mx-auto dy-w-full dy-overflow-y-auto", mobilePreview && showLivePreview ? "dy-hidden lg:dy-block" : ""),
12968
+ children: /* @__PURE__ */ jsxs("div", {
12969
+ className: "dy-space-y-4",
12970
+ children: [
12971
+ activeTab === "versions" && workflowAvailable && /* @__PURE__ */ jsx("div", {
12972
+ className: "dy-animate-in dy-fade-in dy-duration-200 dy-max-w-3xl dy-mx-auto dy-py-6",
12973
+ children: /* @__PURE__ */ jsx(WorkflowPanel, {
12974
+ collection: slug,
12975
+ documentId: id,
12976
+ workflowMeta,
12977
+ workflowConfig
12978
+ })
12979
+ }),
12980
+ activeTab === "audit" && /* @__PURE__ */ jsx("div", {
12981
+ className: "dy-animate-in dy-fade-in dy-duration-200 dy-max-w-3xl dy-mx-auto dy-py-6",
12982
+ children: /* @__PURE__ */ jsx(AuditPanel, {
12983
+ collection: slug,
12984
+ documentId: id
12985
+ })
12986
+ }),
12987
+ activeTab === "edit" && /* @__PURE__ */ jsxs("div", {
12418
12988
  className: "dy-animate-in dy-space-y-8 dy-pb-32",
12419
12989
  children: [
12420
12990
  !canUpdate && isEdit && /* @__PURE__ */ jsxs("div", {
@@ -12595,6 +13165,7 @@ function EditEntryPage() {
12595
13165
  onChange: (dirty) => setIsDirty(dirty),
12596
13166
  isLoading: saveMutation.isPending || isPreferenceLoading,
12597
13167
  submitLabel: isEdit ? "Save Changes" : "Create Entry",
13168
+ hideSubmit: true,
12598
13169
  readOnly: isEdit ? !canUpdate : !canCreate,
12599
13170
  passwordChangeMode: isEdit ? passwordChangeMode : null,
12600
13171
  documentId: id,
@@ -12608,7 +13179,7 @@ function EditEntryPage() {
12608
13179
  className: "dy-hidden"
12609
13180
  }),
12610
13181
  (isDirty || !isEdit) && (isEdit ? canUpdate : canCreate) && /* @__PURE__ */ jsx("div", {
12611
- className: "dy-sticky dy-bottom-0 dy-left-0 dy-right-0 dy-z-20 dy-pointer-events-none",
13182
+ className: "dy-hidden md:dy-block dy-sticky dy-bottom-0 dy-left-0 dy-right-0 dy-z-20 dy-pointer-events-none",
12612
13183
  children: /* @__PURE__ */ jsx("div", {
12613
13184
  className: "dy-pointer-events-auto dy-mx-auto dy-max-w-2xl dy-px-4 dy-pb-4",
12614
13185
  children: /* @__PURE__ */ jsxs("div", {
@@ -12631,25 +13202,158 @@ function EditEntryPage() {
12631
13202
  })]
12632
13203
  })
12633
13204
  })
13205
+ }),
13206
+ (isEdit ? canUpdate : canCreate) && /* @__PURE__ */ jsx("div", {
13207
+ className: "md:dy-hidden dy-sticky dy-bottom-0 dy-left-0 dy-right-0 dy-z-20 dy-border-t dy-border-border dy-bg-background/95 dy-backdrop-blur-sm dy-px-4 dy-py-3",
13208
+ children: /* @__PURE__ */ jsx(Button, {
13209
+ className: "dy-w-full dy-h-11 dy-rounded-xl dy-font-bold dy-bg-primary dy-text-primary-foreground hover:dy-bg-primary/90 dy-shadow-sm",
13210
+ onClick: () => document.getElementById("dyrected-form-submit")?.click(),
13211
+ disabled: saveMutation.isPending || !(isDirty || !isEdit),
13212
+ children: saveMutation.isPending ? /* @__PURE__ */ jsxs("span", {
13213
+ className: "dy-flex dy-items-center dy-gap-2",
13214
+ children: [/* @__PURE__ */ jsx("span", { className: "dy-h-4 dy-w-4 dy-animate-spin dy-border-2 dy-border-current dy-border-t-transparent dy-rounded-full" }), "Saving..."]
13215
+ }) : /* @__PURE__ */ jsxs("span", {
13216
+ className: "dy-flex dy-items-center dy-gap-2",
13217
+ children: [/* @__PURE__ */ jsx(Save, { className: "dy-h-4 dy-w-4" }), isEdit ? "Save Changes" : "Create Entry"]
13218
+ })
13219
+ })
12634
13220
  })
12635
13221
  ]
12636
13222
  })
12637
- })
12638
- }),
12639
- showWorkflowSidebar && /* @__PURE__ */ jsx("div", {
12640
- className: "dy-hidden lg:dy-block dy-w-72 dy-shrink-0 dy-border-l dy-border-border/50 dy-bg-muted/5 dy-px-4 dy-py-8 dy-overflow-y-auto",
12641
- children: /* @__PURE__ */ jsx(WorkflowPanel, {
12642
- collection: slug,
12643
- documentId: id,
12644
- workflowMeta,
12645
- workflowConfig
12646
- })
13223
+ ]
12647
13224
  })
12648
- ]
13225
+ })]
12649
13226
  })]
12650
13227
  }, id || "new")
12651
13228
  });
12652
13229
  }
13230
+ function AuditPanel({ collection, documentId }) {
13231
+ const { client } = useDyrected();
13232
+ const { data: auditData, isLoading } = useQuery({
13233
+ queryKey: [
13234
+ "audit-log",
13235
+ collection,
13236
+ documentId
13237
+ ],
13238
+ queryFn: async () => {
13239
+ return await client.collectionAudit(collection, { where: { documentId } });
13240
+ }
13241
+ });
13242
+ if (isLoading) return /* @__PURE__ */ jsx("div", {
13243
+ className: "dy-flex dy-items-center dy-justify-center dy-py-12",
13244
+ children: /* @__PURE__ */ jsx(Loader2, { className: "dy-h-6 dy-w-6 dy-animate-spin dy-text-muted-foreground" })
13245
+ });
13246
+ const logs = auditData?.docs || [];
13247
+ if (logs.length === 0) return /* @__PURE__ */ jsx("div", {
13248
+ className: "dy-text-center dy-py-12 dy-text-muted-foreground dy-text-sm",
13249
+ children: "No audit logs found for this document."
13250
+ });
13251
+ return /* @__PURE__ */ jsxs("div", {
13252
+ className: "dy-space-y-6",
13253
+ children: [/* @__PURE__ */ jsx("div", {
13254
+ className: "dy-flex dy-items-center dy-justify-between",
13255
+ children: /* @__PURE__ */ jsx("h2", {
13256
+ className: "dy-text-lg dy-font-bold",
13257
+ children: "Audit History"
13258
+ })
13259
+ }), /* @__PURE__ */ jsx("div", {
13260
+ className: "dy-space-y-4",
13261
+ children: logs.map((log) => {
13262
+ let changeDetails = null;
13263
+ try {
13264
+ const parsed = JSON.parse(log.changes);
13265
+ const before = parsed.before || {};
13266
+ const after = parsed.after || {};
13267
+ const diffs = [];
13268
+ const allKeys = Array.from(/* @__PURE__ */ new Set([...Object.keys(before), ...Object.keys(after)]));
13269
+ for (const key of allKeys) {
13270
+ if ([
13271
+ "updatedAt",
13272
+ "updatedBy",
13273
+ "createdAt",
13274
+ "createdBy",
13275
+ "id"
13276
+ ].includes(key)) continue;
13277
+ if (JSON.stringify(before[key]) !== JSON.stringify(after[key])) diffs.push({
13278
+ field: key,
13279
+ from: before[key],
13280
+ to: after[key]
13281
+ });
13282
+ }
13283
+ if (diffs.length > 0) changeDetails = /* @__PURE__ */ jsx("div", {
13284
+ className: "dy-mt-3 dy-overflow-x-auto dy-rounded-lg dy-border dy-border-border/40",
13285
+ children: /* @__PURE__ */ jsxs("table", {
13286
+ className: "dy-w-full dy-text-left dy-text-xs",
13287
+ children: [/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", {
13288
+ className: "dy-bg-muted/40 dy-border-b dy-border-border/40",
13289
+ children: [
13290
+ /* @__PURE__ */ jsx("th", {
13291
+ className: "dy-px-3 dy-py-2 dy-font-semibold dy-text-muted-foreground",
13292
+ children: "Field"
13293
+ }),
13294
+ /* @__PURE__ */ jsx("th", {
13295
+ className: "dy-px-3 dy-py-2 dy-font-semibold dy-text-muted-foreground",
13296
+ children: "Before"
13297
+ }),
13298
+ /* @__PURE__ */ jsx("th", {
13299
+ className: "dy-px-3 dy-py-2 dy-font-semibold dy-text-muted-foreground",
13300
+ children: "After"
13301
+ })
13302
+ ]
13303
+ }) }), /* @__PURE__ */ jsx("tbody", {
13304
+ className: "dy-divide-y dy-divide-border/30",
13305
+ children: diffs.map((diff) => /* @__PURE__ */ jsxs("tr", { children: [
13306
+ /* @__PURE__ */ jsx("td", {
13307
+ className: "dy-px-3 dy-py-2 dy-font-mono dy-font-semibold dy-text-foreground",
13308
+ children: diff.field
13309
+ }),
13310
+ /* @__PURE__ */ jsx("td", {
13311
+ className: "dy-px-3 dy-py-2 dy-text-muted-foreground dy-max-w-[200px] dy-truncate",
13312
+ title: JSON.stringify(diff.from),
13313
+ children: diff.from === null || diff.from === void 0 ? /* @__PURE__ */ jsx("span", {
13314
+ className: "dy-italic dy-text-muted-foreground/40",
13315
+ children: "empty"
13316
+ }) : typeof diff.from === "object" ? JSON.stringify(diff.from) : String(diff.from)
13317
+ }),
13318
+ /* @__PURE__ */ jsx("td", {
13319
+ className: "dy-px-3 dy-py-2 dy-text-foreground dy-max-w-[200px] dy-truncate",
13320
+ title: JSON.stringify(diff.to),
13321
+ children: diff.to === null || diff.to === void 0 ? /* @__PURE__ */ jsx("span", {
13322
+ className: "dy-italic dy-text-muted-foreground/40",
13323
+ children: "empty"
13324
+ }) : typeof diff.to === "object" ? JSON.stringify(diff.to) : String(diff.to)
13325
+ })
13326
+ ] }, diff.field))
13327
+ })]
13328
+ })
13329
+ });
13330
+ } catch {}
13331
+ return /* @__PURE__ */ jsxs("div", {
13332
+ className: "dy-p-5 dy-rounded-2xl dy-border dy-border-border/60 dy-bg-card dy-shadow-sm dy-space-y-2",
13333
+ children: [/* @__PURE__ */ jsxs("div", {
13334
+ className: "dy-flex dy-items-center dy-justify-between",
13335
+ children: [/* @__PURE__ */ jsxs("div", {
13336
+ className: "dy-flex dy-items-center dy-gap-2",
13337
+ children: [/* @__PURE__ */ jsx("span", {
13338
+ className: cn("dy-px-2 dy-py-0.5 dy-rounded-full dy-text-[10px] dy-font-bold dy-uppercase dy-tracking-wider", log.operation === "create" ? "dy-bg-emerald-50 dy-text-emerald-700 dy-border dy-border-emerald-200" : log.operation === "delete" ? "dy-bg-red-50 dy-text-red-700 dy-border dy-border-red-200" : "dy-bg-blue-50 dy-text-blue-700 dy-border dy-border-blue-200"),
13339
+ children: log.operation
13340
+ }), /* @__PURE__ */ jsxs("span", {
13341
+ className: "dy-text-xs dy-text-muted-foreground",
13342
+ children: ["by ", /* @__PURE__ */ jsx("span", {
13343
+ className: "dy-font-mono dy-text-foreground",
13344
+ children: log.user || "System"
13345
+ })]
13346
+ })]
13347
+ }), /* @__PURE__ */ jsx("span", {
13348
+ className: "dy-text-xs dy-text-muted-foreground",
13349
+ children: new Date(log.timestamp).toLocaleString()
13350
+ })]
13351
+ }), changeDetails]
13352
+ }, log.id);
13353
+ })
13354
+ })]
13355
+ });
13356
+ }
12653
13357
  //#endregion
12654
13358
  //#region src/components/ui/card.tsx
12655
13359
  var Card = React$1.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", {
@@ -13968,7 +14672,7 @@ function SetupPromptUI({ config }) {
13968
14672
  setCopied(true);
13969
14673
  window.setTimeout(() => setCopied(false), 1800);
13970
14674
  }
13971
- const currentVersion = "2.5.58";
14675
+ const currentVersion = "2.5.60";
13972
14676
  const [latestVersion, setLatestVersion] = useState(() => {
13973
14677
  if (typeof window === "undefined") return null;
13974
14678
  return localStorage.getItem("dyrected_latest_release");
@@ -14142,6 +14846,85 @@ function SetupPromptUI({ config }) {
14142
14846
  });
14143
14847
  }
14144
14848
  //#endregion
14849
+ //#region src/components/document-meta.tsx
14850
+ /** Turn a slug like `blog-posts` into a readable `Blog Posts` fallback. */
14851
+ function humanize(slug) {
14852
+ return slug.split(/[-_]/).filter(Boolean).map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
14853
+ }
14854
+ /**
14855
+ * Derive a human page label from the current admin path, e.g. "Posts",
14856
+ * "New Post", "Edit Post", or "Dashboard". Uses the collection/global labels
14857
+ * from the loaded schemas, falling back to a humanized slug.
14858
+ */
14859
+ function pageLabel(pathname, collections, globals) {
14860
+ const segments = pathname.split("/").filter(Boolean);
14861
+ if (segments.length === 0) return "Dashboard";
14862
+ if (segments[0] === "setup") return "Setup";
14863
+ if (segments[0] === "collections" && segments[1]) {
14864
+ const slug = segments[1];
14865
+ const collection = collections.find((c) => c.slug === slug);
14866
+ const singular = collection?.labels?.singular ?? humanize(slug);
14867
+ const plural = collection?.labels?.plural ?? humanize(slug);
14868
+ if (segments[2] === "new") return `New ${singular}`;
14869
+ if (segments[2] === "edit") return `Edit ${singular}`;
14870
+ return plural;
14871
+ }
14872
+ if (segments[0] === "globals" && segments[1]) {
14873
+ const slug = segments[1];
14874
+ return globals.find((g) => g.slug === slug)?.label ?? humanize(slug);
14875
+ }
14876
+ return "";
14877
+ }
14878
+ /**
14879
+ * Keeps the browser tab in sync with the admin: sets `document.title` from the
14880
+ * current page plus `admin.meta.titleSuffix`, updating on every route change,
14881
+ * and applies `admin.branding.favicon` to the page favicon.
14882
+ *
14883
+ * Renders nothing. Must be mounted inside the router (needs `useLocation`) and
14884
+ * inside `DyrectedProvider` (needs the loaded schemas).
14885
+ */
14886
+ function DocumentMeta() {
14887
+ const location = useLocation();
14888
+ const { schemas } = useDyrected();
14889
+ const admin = schemas?.admin;
14890
+ const titleSuffix = admin?.meta?.titleSuffix ?? "- Dyrected";
14891
+ const favicon = admin?.branding?.favicon;
14892
+ const originalTitleRef = useRef(null);
14893
+ useEffect(() => {
14894
+ if (typeof document === "undefined") return;
14895
+ if (originalTitleRef.current === null) originalTitleRef.current = document.title;
14896
+ return () => {
14897
+ if (originalTitleRef.current !== null) document.title = originalTitleRef.current;
14898
+ };
14899
+ }, []);
14900
+ useEffect(() => {
14901
+ if (typeof document === "undefined") return;
14902
+ const next = [pageLabel(location.pathname, schemas?.collections ?? [], schemas?.globals ?? []), titleSuffix].filter(Boolean).join(" ");
14903
+ if (next && document.title !== next) document.title = next;
14904
+ }, [
14905
+ location.pathname,
14906
+ schemas,
14907
+ titleSuffix
14908
+ ]);
14909
+ useEffect(() => {
14910
+ if (typeof document === "undefined" || !favicon) return;
14911
+ let link = document.querySelector("link[rel~=\"icon\"]");
14912
+ const created = !link;
14913
+ if (!link) {
14914
+ link = document.createElement("link");
14915
+ link.rel = "icon";
14916
+ document.head.appendChild(link);
14917
+ }
14918
+ const previousHref = link.getAttribute("href");
14919
+ link.setAttribute("href", favicon);
14920
+ return () => {
14921
+ if (created) link?.remove();
14922
+ else if (previousHref !== null) link?.setAttribute("href", previousHref);
14923
+ };
14924
+ }, [favicon]);
14925
+ return null;
14926
+ }
14927
+ //#endregion
14145
14928
  //#region src/pages/auth/login-page.tsx
14146
14929
  function LoginPage({ collectionSlug, onLogin }) {
14147
14930
  const { client } = useDyrected();
@@ -14903,32 +15686,36 @@ function NavigationSync({ onNavigate }) {
14903
15686
  function AdminRoutes({ onNavigate, isEmbedded = false }) {
14904
15687
  return /* @__PURE__ */ jsx(AuthGate, { children: /* @__PURE__ */ jsxs(AdminShell, {
14905
15688
  isEmbedded,
14906
- children: [/* @__PURE__ */ jsx(NavigationSync, { onNavigate }), /* @__PURE__ */ jsx(ErrorBoundary, { children: /* @__PURE__ */ jsxs(Routes, { children: [
14907
- /* @__PURE__ */ jsx(Route, {
14908
- path: "/",
14909
- element: /* @__PURE__ */ jsx(Dashboard, {})
14910
- }),
14911
- /* @__PURE__ */ jsx(Route, {
14912
- path: "/collections/:slug",
14913
- element: /* @__PURE__ */ jsx(CollectionRoute, {})
14914
- }),
14915
- /* @__PURE__ */ jsx(Route, {
14916
- path: "/collections/:slug/new",
14917
- element: /* @__PURE__ */ jsx(EditEntryPage, {})
14918
- }),
14919
- /* @__PURE__ */ jsx(Route, {
14920
- path: "/collections/:slug/edit/:id",
14921
- element: /* @__PURE__ */ jsx(EditEntryPage, {})
14922
- }),
14923
- /* @__PURE__ */ jsx(Route, {
14924
- path: "/globals/:slug",
14925
- element: /* @__PURE__ */ jsx(GlobalEditorPage, {})
14926
- }),
14927
- /* @__PURE__ */ jsx(Route, {
14928
- path: "/setup",
14929
- element: /* @__PURE__ */ jsx(SetupPage, {})
14930
- })
14931
- ] }) })]
15689
+ children: [
15690
+ /* @__PURE__ */ jsx(NavigationSync, { onNavigate }),
15691
+ /* @__PURE__ */ jsx(DocumentMeta, {}),
15692
+ /* @__PURE__ */ jsx(ErrorBoundary, { children: /* @__PURE__ */ jsxs(Routes, { children: [
15693
+ /* @__PURE__ */ jsx(Route, {
15694
+ path: "/",
15695
+ element: /* @__PURE__ */ jsx(Dashboard, {})
15696
+ }),
15697
+ /* @__PURE__ */ jsx(Route, {
15698
+ path: "/collections/:slug",
15699
+ element: /* @__PURE__ */ jsx(CollectionRoute, {})
15700
+ }),
15701
+ /* @__PURE__ */ jsx(Route, {
15702
+ path: "/collections/:slug/new",
15703
+ element: /* @__PURE__ */ jsx(EditEntryPage, {})
15704
+ }),
15705
+ /* @__PURE__ */ jsx(Route, {
15706
+ path: "/collections/:slug/edit/:id",
15707
+ element: /* @__PURE__ */ jsx(EditEntryPage, {})
15708
+ }),
15709
+ /* @__PURE__ */ jsx(Route, {
15710
+ path: "/globals/:slug",
15711
+ element: /* @__PURE__ */ jsx(GlobalEditorPage, {})
15712
+ }),
15713
+ /* @__PURE__ */ jsx(Route, {
15714
+ path: "/setup",
15715
+ element: /* @__PURE__ */ jsx(SetupPage, {})
15716
+ })
15717
+ ] }) })
15718
+ ]
14932
15719
  }) });
14933
15720
  }
14934
15721
  /**