@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/admin.css +148 -107
- package/dist/components/document-meta.d.ts +9 -0
- package/dist/components/forms/form-engine.d.ts +5 -0
- package/dist/components/live-preview/LivePreviewPane.d.ts +5 -1
- package/dist/components/ui/calendar.d.ts +7 -7
- package/dist/hooks/use-debounced-value.d.ts +6 -0
- package/dist/index.d.ts +0 -9
- package/dist/index.mjs +1145 -358
- package/dist/lib/format.d.ts +77 -0
- package/dist/lib/format.test.d.ts +1 -0
- package/dist/types/admin-components.d.ts +19 -10
- package/package.json +5 -5
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,
|
|
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
|
|
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
|
|
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
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
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 =
|
|
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:
|
|
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.
|
|
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
|
|
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__ */
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
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.
|
|
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")
|
|
2995
|
-
|
|
2996
|
-
|
|
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 === "
|
|
2999
|
-
const
|
|
3000
|
-
return /* @__PURE__ */
|
|
3001
|
-
className: "dy-flex dy-items-center dy-gap-
|
|
3002
|
-
|
|
3003
|
-
|
|
3004
|
-
|
|
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(([
|
|
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
|
|
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, {
|
|
6258
|
-
|
|
6259
|
-
|
|
6260
|
-
|
|
6261
|
-
|
|
6262
|
-
|
|
6263
|
-
|
|
6264
|
-
|
|
6265
|
-
|
|
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(
|
|
6673
|
+
field.onChange(opt.value);
|
|
6268
6674
|
handleOpenChange(false);
|
|
6269
6675
|
},
|
|
6270
|
-
className: "dy-rounded-lg dy-py-2.5
|
|
6271
|
-
children: [/* @__PURE__ */ jsx(
|
|
6272
|
-
|
|
6273
|
-
|
|
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
|
|
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, {
|
|
6498
|
-
|
|
6499
|
-
|
|
6500
|
-
|
|
6501
|
-
|
|
6502
|
-
|
|
6503
|
-
|
|
6504
|
-
|
|
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,
|
|
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-
|
|
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
|
-
|
|
6524
|
-
|
|
6525
|
-
|
|
6526
|
-
|
|
6527
|
-
|
|
6528
|
-
|
|
6529
|
-
|
|
6530
|
-
|
|
6531
|
-
|
|
6532
|
-
|
|
6533
|
-
|
|
6534
|
-
|
|
6535
|
-
|
|
6536
|
-
|
|
6537
|
-
|
|
6538
|
-
|
|
6539
|
-
|
|
6540
|
-
|
|
6541
|
-
|
|
6542
|
-
|
|
6543
|
-
|
|
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
|
-
|
|
6552
|
-
|
|
6553
|
-
|
|
6554
|
-
|
|
6555
|
-
|
|
6556
|
-
|
|
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
|
-
|
|
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("
|
|
6617
|
-
return () => document.removeEventListener("
|
|
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
|
-
|
|
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
|
|
9183
|
+
if (typeof writeAccess !== "string") return null;
|
|
8824
9184
|
try {
|
|
8825
9185
|
return {
|
|
8826
|
-
expr: jexl.compile(
|
|
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
|
-
}, [
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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: [
|
|
11504
|
-
|
|
11505
|
-
|
|
11506
|
-
|
|
11507
|
-
|
|
11508
|
-
|
|
11509
|
-
|
|
11510
|
-
|
|
11511
|
-
|
|
11512
|
-
|
|
11513
|
-
|
|
11514
|
-
|
|
11515
|
-
|
|
11516
|
-
|
|
11517
|
-
|
|
11518
|
-
|
|
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:
|
|
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 [
|
|
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
|
-
|
|
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
|
|
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("
|
|
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:
|
|
12284
|
-
}),
|
|
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",
|
|
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:
|
|
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: "
|
|
12317
|
-
active:
|
|
12318
|
-
title:
|
|
12319
|
-
onClick: () =>
|
|
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
|
-
|
|
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) &&
|
|
12380
|
-
|
|
12381
|
-
|
|
12382
|
-
|
|
12383
|
-
|
|
12384
|
-
|
|
12385
|
-
|
|
12386
|
-
|
|
12387
|
-
children:
|
|
12388
|
-
|
|
12389
|
-
|
|
12390
|
-
|
|
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
|
-
|
|
12400
|
-
|
|
12401
|
-
|
|
12402
|
-
|
|
12403
|
-
|
|
12404
|
-
|
|
12405
|
-
|
|
12406
|
-
|
|
12407
|
-
|
|
12408
|
-
|
|
12409
|
-
|
|
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
|
-
|
|
12414
|
-
|
|
12415
|
-
|
|
12416
|
-
|
|
12417
|
-
|
|
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.
|
|
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: [
|
|
14907
|
-
/* @__PURE__ */ jsx(
|
|
14908
|
-
|
|
14909
|
-
|
|
14910
|
-
|
|
14911
|
-
|
|
14912
|
-
|
|
14913
|
-
|
|
14914
|
-
|
|
14915
|
-
|
|
14916
|
-
|
|
14917
|
-
|
|
14918
|
-
|
|
14919
|
-
|
|
14920
|
-
|
|
14921
|
-
|
|
14922
|
-
|
|
14923
|
-
|
|
14924
|
-
|
|
14925
|
-
|
|
14926
|
-
|
|
14927
|
-
|
|
14928
|
-
|
|
14929
|
-
|
|
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
|
/**
|