From 516ed3d17ed6461ae3e9e13eb292db4768114895 Mon Sep 17 00:00:00 2001 From: shadcn Date: Tue, 18 Mar 2025 13:42:39 +0400 Subject: [PATCH] feat(www): add dashboard-01 (#6961) * fix(v4): minor fixes * fix: format * feat(www): add dashboard-01 block * chore: capture screenshots --- apps/v4/__registry__/index.tsx | 95 ++ .../dashboard/components/section-cards.tsx | 2 +- apps/v4/public/android-chrome-192x192.png | Bin 0 -> 2640 bytes apps/v4/public/android-chrome-512x512.png | Bin 0 -> 8816 bytes apps/v4/public/apple-touch-icon.png | Bin 0 -> 3630 bytes apps/v4/public/favicon-16x16.png | Bin 0 -> 191 bytes apps/v4/public/favicon-32x32.png | Bin 0 -> 241 bytes apps/v4/public/favicon.ico | Bin 0 -> 379 bytes apps/v4/public/site.webmanifest | 19 + apps/v4/registry.json | 86 ++ .../dashboard-01/components/app-sidebar.tsx | 181 ++++ .../components/chart-area-interactive.tsx | 292 +++++++ .../dashboard-01/components/data-table.tsx | 807 +++++++++++++++++ .../dashboard-01/components/nav-documents.tsx | 92 ++ .../dashboard-01/components/nav-main.tsx | 58 ++ .../dashboard-01/components/nav-secondary.tsx | 42 + .../dashboard-01/components/nav-user.tsx | 110 +++ .../dashboard-01/components/section-cards.tsx | 102 +++ .../dashboard-01/components/site-header.tsx | 30 + .../new-york-v4/blocks/dashboard-01/data.json | 614 +++++++++++++ .../new-york-v4/blocks/dashboard-01/page.tsx | 40 + apps/v4/scripts/build-registry.mts | 14 +- .../default/blocks/dashboard-01/page.tsx | 30 + apps/www/__registry__/index.tsx | 110 +++ .../new-york/blocks/dashboard-01/page.tsx | 30 + apps/www/actions/edit-in-v0.ts | 101 +++ apps/www/app/(app)/blocks/page.tsx | 8 +- apps/www/package.json | 5 + .../public/r/styles/default/dashboard-01.json | 107 +++ .../r/styles/new-york-v4/dashboard-01.json | 98 +++ .../r/styles/new-york/dashboard-01-dark.png | Bin 0 -> 358721 bytes .../r/styles/new-york/dashboard-01-light.png | Bin 0 -> 361369 bytes .../r/styles/new-york/dashboard-01.json | 107 +++ .../r/styles/new-york/sidebar-16-dark.png | Bin 0 -> 120286 bytes .../r/styles/new-york/sidebar-16-light.png | Bin 0 -> 119553 bytes .../dashboard-01/components/app-sidebar.tsx | 181 ++++ .../components/chart-area-interactive.tsx | 295 +++++++ .../dashboard-01/components/data-table.tsx | 823 ++++++++++++++++++ .../dashboard-01/components/nav-documents.tsx | 85 ++ .../dashboard-01/components/nav-main.tsx | 58 ++ .../dashboard-01/components/nav-secondary.tsx | 42 + .../dashboard-01/components/nav-user.tsx | 110 +++ .../dashboard-01/components/section-cards.tsx | 101 +++ .../dashboard-01/components/site-header.tsx | 17 + .../default/blocks/dashboard-01/data.json | 614 +++++++++++++ .../default/blocks/dashboard-01/page.tsx | 30 + .../dashboard-01/components/app-sidebar.tsx | 181 ++++ .../components/chart-area-interactive.tsx | 295 +++++++ .../dashboard-01/components/data-table.tsx | 823 ++++++++++++++++++ .../dashboard-01/components/nav-documents.tsx | 85 ++ .../dashboard-01/components/nav-main.tsx | 58 ++ .../dashboard-01/components/nav-secondary.tsx | 42 + .../dashboard-01/components/nav-user.tsx | 110 +++ .../dashboard-01/components/section-cards.tsx | 101 +++ .../dashboard-01/components/site-header.tsx | 17 + .../new-york/blocks/dashboard-01/data.json | 614 +++++++++++++ .../new-york/blocks/dashboard-01/page.tsx | 30 + apps/www/registry/registry-blocks.ts | 83 ++ apps/www/scripts/capture-registry.mts | 4 +- pnpm-lock.yaml | 56 ++ tailwind.config.cjs | 5 +- 61 files changed, 8032 insertions(+), 8 deletions(-) create mode 100644 apps/v4/public/android-chrome-192x192.png create mode 100644 apps/v4/public/android-chrome-512x512.png create mode 100644 apps/v4/public/apple-touch-icon.png create mode 100644 apps/v4/public/favicon-16x16.png create mode 100644 apps/v4/public/favicon-32x32.png create mode 100644 apps/v4/public/favicon.ico create mode 100644 apps/v4/public/site.webmanifest create mode 100644 apps/v4/registry/new-york-v4/blocks/dashboard-01/components/app-sidebar.tsx create mode 100644 apps/v4/registry/new-york-v4/blocks/dashboard-01/components/chart-area-interactive.tsx create mode 100644 apps/v4/registry/new-york-v4/blocks/dashboard-01/components/data-table.tsx create mode 100644 apps/v4/registry/new-york-v4/blocks/dashboard-01/components/nav-documents.tsx create mode 100644 apps/v4/registry/new-york-v4/blocks/dashboard-01/components/nav-main.tsx create mode 100644 apps/v4/registry/new-york-v4/blocks/dashboard-01/components/nav-secondary.tsx create mode 100644 apps/v4/registry/new-york-v4/blocks/dashboard-01/components/nav-user.tsx create mode 100644 apps/v4/registry/new-york-v4/blocks/dashboard-01/components/section-cards.tsx create mode 100644 apps/v4/registry/new-york-v4/blocks/dashboard-01/components/site-header.tsx create mode 100644 apps/v4/registry/new-york-v4/blocks/dashboard-01/data.json create mode 100644 apps/v4/registry/new-york-v4/blocks/dashboard-01/page.tsx create mode 100644 apps/www/__registry__/default/blocks/dashboard-01/page.tsx create mode 100644 apps/www/__registry__/new-york/blocks/dashboard-01/page.tsx create mode 100644 apps/www/public/r/styles/default/dashboard-01.json create mode 100644 apps/www/public/r/styles/new-york-v4/dashboard-01.json create mode 100644 apps/www/public/r/styles/new-york/dashboard-01-dark.png create mode 100644 apps/www/public/r/styles/new-york/dashboard-01-light.png create mode 100644 apps/www/public/r/styles/new-york/dashboard-01.json create mode 100644 apps/www/public/r/styles/new-york/sidebar-16-dark.png create mode 100644 apps/www/public/r/styles/new-york/sidebar-16-light.png create mode 100644 apps/www/registry/default/blocks/dashboard-01/components/app-sidebar.tsx create mode 100644 apps/www/registry/default/blocks/dashboard-01/components/chart-area-interactive.tsx create mode 100644 apps/www/registry/default/blocks/dashboard-01/components/data-table.tsx create mode 100644 apps/www/registry/default/blocks/dashboard-01/components/nav-documents.tsx create mode 100644 apps/www/registry/default/blocks/dashboard-01/components/nav-main.tsx create mode 100644 apps/www/registry/default/blocks/dashboard-01/components/nav-secondary.tsx create mode 100644 apps/www/registry/default/blocks/dashboard-01/components/nav-user.tsx create mode 100644 apps/www/registry/default/blocks/dashboard-01/components/section-cards.tsx create mode 100644 apps/www/registry/default/blocks/dashboard-01/components/site-header.tsx create mode 100644 apps/www/registry/default/blocks/dashboard-01/data.json create mode 100644 apps/www/registry/default/blocks/dashboard-01/page.tsx create mode 100644 apps/www/registry/new-york/blocks/dashboard-01/components/app-sidebar.tsx create mode 100644 apps/www/registry/new-york/blocks/dashboard-01/components/chart-area-interactive.tsx create mode 100644 apps/www/registry/new-york/blocks/dashboard-01/components/data-table.tsx create mode 100644 apps/www/registry/new-york/blocks/dashboard-01/components/nav-documents.tsx create mode 100644 apps/www/registry/new-york/blocks/dashboard-01/components/nav-main.tsx create mode 100644 apps/www/registry/new-york/blocks/dashboard-01/components/nav-secondary.tsx create mode 100644 apps/www/registry/new-york/blocks/dashboard-01/components/nav-user.tsx create mode 100644 apps/www/registry/new-york/blocks/dashboard-01/components/section-cards.tsx create mode 100644 apps/www/registry/new-york/blocks/dashboard-01/components/site-header.tsx create mode 100644 apps/www/registry/new-york/blocks/dashboard-01/data.json create mode 100644 apps/www/registry/new-york/blocks/dashboard-01/page.tsx diff --git a/apps/v4/__registry__/index.tsx b/apps/v4/__registry__/index.tsx index 624cf5bfc8..49843dde87 100644 --- a/apps/v4/__registry__/index.tsx +++ b/apps/v4/__registry__/index.tsx @@ -1081,6 +1081,101 @@ export const Index: Record = { }), meta: undefined, }, + "dashboard-01": { + name: "dashboard-01", + description: "A dashboard with sidebar, charts and data table.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "label", + "chart", + "card", + "select", + "tabs", + "table", + "toggle-group", + "badge", + "button", + "checkbox", + "dropdown-menu", + "drawer", + "input", + "avatar", + "sheet", + "sonner", + ], + files: [ + { + path: "registry/blocks/dashboard-01/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/blocks/dashboard-01/data.json", + type: "registry:file", + target: "app/dashboard/data.json", + }, + { + path: "registry/blocks/dashboard-01/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/blocks/dashboard-01/components/chart-area-interactive.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/blocks/dashboard-01/components/data-table.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/blocks/dashboard-01/components/nav-documents.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/blocks/dashboard-01/components/nav-main.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/blocks/dashboard-01/components/nav-secondary.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/blocks/dashboard-01/components/nav-user.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/blocks/dashboard-01/components/section-cards.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/blocks/dashboard-01/components/site-header.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/new-york-v4/blocks/dashboard-01/page.tsx" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || item.name + return { default: mod.default || mod[exportName] } + }), + meta: undefined, + }, "sidebar-01": { name: "sidebar-01", description: "A simple sidebar with navigation grouped by section.", diff --git a/apps/v4/app/(examples)/dashboard/components/section-cards.tsx b/apps/v4/app/(examples)/dashboard/components/section-cards.tsx index f723986c3c..4a69bf5ea8 100644 --- a/apps/v4/app/(examples)/dashboard/components/section-cards.tsx +++ b/apps/v4/app/(examples)/dashboard/components/section-cards.tsx @@ -26,7 +26,7 @@ export function SectionCards() { - +
Trending up this month
diff --git a/apps/v4/public/android-chrome-192x192.png b/apps/v4/public/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..12cf161a081b7e20f8993192d82a8caaf7be7c01 GIT binary patch literal 2640 zcmds(`#;nD8^=GhwT3yy!$c-ImD8M(>XXqT6+>x!b687G>A0Mldxm0~^DG^N``$YG zhAD-Hi7eBqyQqaZERh88njzvc07v|XdRYKG#lC=HurFp`ZG{uznU*w2=7q{} zN5EOz1%lMRr*J8RT+FCaCDN+i-$+IBkuX013bXSN9Ri|F|5r+L*zE21j}O~#Ns<*+ zdZY{IXNC_aCGA%`mzla5#piYQ870KU6%P$X7#bUwPEQ|;J9311?V81OoyqdlmlY@b4*RQlH`w{%SbupF!ZW6$nd zMIZ?ux61A7($bRCwrwVqNVJ+GO>2Y2CZD6SlLwkc(I}KPb!S9qsBax*u8c$*e`75- z?8*hz)zweE>(XfYK$#bEgb^g1%QK>6XJ?XNm3Uu zIs5dqD+&KS#S!~`k8^0Tn5nvd8Wxk~DhbX7CueOV^OI>Z@%4Hqu9bdXut7WUcGmCS zX0DY^>(0k0Q{C$dEi?I8hcR@lBeX%C>vPWL?{<`_PU}~OQtf=F!3_SSELkL>gNuv| z$ZSl+Ngopa&{;l^Kf3&;rn90emj+oaXl-=n-r%YbY4BMqxr_F4xKg)T6u%1d<@BZmV`3(0qLOoqk=|#I32NJ@?d8L2X^Q3F8%Nztg9hQKZt-*4atpc310fF@byJILwY_n@T|Oj8WpTzSY^ocPAnYO0 zN;8_@(?LV5DApHQ!2Ry0PxE-`KO?SRzdkm9ylsX}qFsb5i7;LY zcj2?Fpg=S3=uy_MA*iUh(BAHuy7WD9Po^j^8$$Y^y-OC_Mr|nvDfbt87vyreD`$LS zf-$4UWHKGCH~Of;13qd8$(l}#W+Jt;dY)a~QXO<=b}YBto$RfgxsoWdaREec^I1KL zeR#9^gJY803&O|(Sx=e6ONqqp?%lg;B_gsloPKi!_lA>o46P$at7mX93|AsbM8WA* zE4eo|a|DIxo+k1H9ji0`q-Q%F>^n?GXG*GnPCTz{>3x0GWd?BNtdsA{nR_SDYD!zI z=cO&a92gY$nwRmrDZ%%c!P014mgW=@jVy+x$>GD8Xn>B$Vq@3(Xe=pQGM5D`C zEd9v-|E5&%p!@h@p$rf;f`*=G5G?mq#IJ#)Gw9&xW0N7svi3+keiMO`veH!E zyF@ymTKu>gMA531vXIc`ZvAVcBio?b6gt>Wg)7NM0wuE$8#bl-BOd<(ZYtNNWV!;} z9P!>y9d(mh?VTnhe2a}|v<6nTR^Dqwo&V{#nkL>Z%XLy%{(i%)p^|^gTsn>m0VQ6T zv>-zLMw}Iv$X~L~HPo5kthphz_TOX;_4x0E)_CPaH)=8#~?sf6XgEaAnujlOVx1`Q_Cr$P1-`d29j4ObdXJuiq z@PKN&x5L8@$K~u>^Y`zHEER?* ze}3D9ZpL7^OmxM~U?%#xNaXuxz|K}{o104W;OeAitHTE_^l}VbA;>Ck?+gnS6u;#1 z*T0lDq4$Y(9S(qo1TiCeVHnzK!xa}0L|}LPONP=~1gvB8bsf7>u=#l^yOk0P*U249H*vE#keCa=>o}Gz|JO}NJa$WC<6mLp*-DED`0nt> J)p!vz{{bmPtJ(kn literal 0 HcmV?d00001 diff --git a/apps/v4/public/android-chrome-512x512.png b/apps/v4/public/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..5bafcab3800b06b6c1ecb3c54272e10d5f08c05c GIT binary patch literal 8816 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 literal 0 HcmV?d00001 diff --git a/apps/v4/public/apple-touch-icon.png b/apps/v4/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..10279359cb02867f3103e7cf74360a08a618bad5 GIT binary patch literal 3630 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 literal 0 HcmV?d00001 diff --git a/apps/v4/public/favicon-16x16.png b/apps/v4/public/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..d2ad2370f82f43e767bece4c26bb53c1a01c5e6c GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBeu$@wV@L(#*@+u@85B5J>RH?pobNiAmx^p% zuppp0qi1?dr9b0`849~R?rIsCT`WAN_W!8LuB3Nj6ZaIx@P} i9c<8?m-y?aAn)$Y#(r-z4yOXmXYh3Ob6Mw<&;$SwEIkbX literal 0 HcmV?d00001 diff --git a/apps/v4/public/favicon-32x32.png b/apps/v4/public/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..2aaeed4bb1e6db6c24de7b1e352f97e25393d08e GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?2=RS;(M3{v?36l5$8 za(7}_cTVOdki(Mh=?4D-m%g7afYmUga;%}C+O*>Do=k$K$DYuP5RbGHW)tzI(6V?BF@2r_* zTC~|KZmPcNqNy=k8Jq(Fes|9`UO^?8J-fj$2IBI5Oe?wK|8E-05C*eU1)6r@fnUm3e>4HS%q4tJ&}> z`=m5W!>1|BYaBm0Jp9DVHI04S>iJvuTu9#kht=!TA>Q9lwAY9$uG*t8i9daV*uU?E z^Iu7;ESSf(>Z3fH) { + return ( + + + + + + + + Acme Inc. + + + + + + + + + + + + + + + ) +} diff --git a/apps/v4/registry/new-york-v4/blocks/dashboard-01/components/chart-area-interactive.tsx b/apps/v4/registry/new-york-v4/blocks/dashboard-01/components/chart-area-interactive.tsx new file mode 100644 index 0000000000..dab596a813 --- /dev/null +++ b/apps/v4/registry/new-york-v4/blocks/dashboard-01/components/chart-area-interactive.tsx @@ -0,0 +1,292 @@ +"use client" + +import * as React from "react" +import { Area, AreaChart, CartesianGrid, XAxis } from "recharts" + +import { useIsMobile } from "@/registry/new-york-v4/hooks/use-mobile" +import { + Card, + CardAction, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/registry/new-york-v4/ui/card" +import { + ChartConfig, + ChartContainer, + ChartTooltip, + ChartTooltipContent, +} from "@/registry/new-york-v4/ui/chart" +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/registry/new-york-v4/ui/select" +import { + ToggleGroup, + ToggleGroupItem, +} from "@/registry/new-york-v4/ui/toggle-group" + +export const description = "An interactive area chart" + +const chartData = [ + { date: "2024-04-01", desktop: 222, mobile: 150 }, + { date: "2024-04-02", desktop: 97, mobile: 180 }, + { date: "2024-04-03", desktop: 167, mobile: 120 }, + { date: "2024-04-04", desktop: 242, mobile: 260 }, + { date: "2024-04-05", desktop: 373, mobile: 290 }, + { date: "2024-04-06", desktop: 301, mobile: 340 }, + { date: "2024-04-07", desktop: 245, mobile: 180 }, + { date: "2024-04-08", desktop: 409, mobile: 320 }, + { date: "2024-04-09", desktop: 59, mobile: 110 }, + { date: "2024-04-10", desktop: 261, mobile: 190 }, + { date: "2024-04-11", desktop: 327, mobile: 350 }, + { date: "2024-04-12", desktop: 292, mobile: 210 }, + { date: "2024-04-13", desktop: 342, mobile: 380 }, + { date: "2024-04-14", desktop: 137, mobile: 220 }, + { date: "2024-04-15", desktop: 120, mobile: 170 }, + { date: "2024-04-16", desktop: 138, mobile: 190 }, + { date: "2024-04-17", desktop: 446, mobile: 360 }, + { date: "2024-04-18", desktop: 364, mobile: 410 }, + { date: "2024-04-19", desktop: 243, mobile: 180 }, + { date: "2024-04-20", desktop: 89, mobile: 150 }, + { date: "2024-04-21", desktop: 137, mobile: 200 }, + { date: "2024-04-22", desktop: 224, mobile: 170 }, + { date: "2024-04-23", desktop: 138, mobile: 230 }, + { date: "2024-04-24", desktop: 387, mobile: 290 }, + { date: "2024-04-25", desktop: 215, mobile: 250 }, + { date: "2024-04-26", desktop: 75, mobile: 130 }, + { date: "2024-04-27", desktop: 383, mobile: 420 }, + { date: "2024-04-28", desktop: 122, mobile: 180 }, + { date: "2024-04-29", desktop: 315, mobile: 240 }, + { date: "2024-04-30", desktop: 454, mobile: 380 }, + { date: "2024-05-01", desktop: 165, mobile: 220 }, + { date: "2024-05-02", desktop: 293, mobile: 310 }, + { date: "2024-05-03", desktop: 247, mobile: 190 }, + { date: "2024-05-04", desktop: 385, mobile: 420 }, + { date: "2024-05-05", desktop: 481, mobile: 390 }, + { date: "2024-05-06", desktop: 498, mobile: 520 }, + { date: "2024-05-07", desktop: 388, mobile: 300 }, + { date: "2024-05-08", desktop: 149, mobile: 210 }, + { date: "2024-05-09", desktop: 227, mobile: 180 }, + { date: "2024-05-10", desktop: 293, mobile: 330 }, + { date: "2024-05-11", desktop: 335, mobile: 270 }, + { date: "2024-05-12", desktop: 197, mobile: 240 }, + { date: "2024-05-13", desktop: 197, mobile: 160 }, + { date: "2024-05-14", desktop: 448, mobile: 490 }, + { date: "2024-05-15", desktop: 473, mobile: 380 }, + { date: "2024-05-16", desktop: 338, mobile: 400 }, + { date: "2024-05-17", desktop: 499, mobile: 420 }, + { date: "2024-05-18", desktop: 315, mobile: 350 }, + { date: "2024-05-19", desktop: 235, mobile: 180 }, + { date: "2024-05-20", desktop: 177, mobile: 230 }, + { date: "2024-05-21", desktop: 82, mobile: 140 }, + { date: "2024-05-22", desktop: 81, mobile: 120 }, + { date: "2024-05-23", desktop: 252, mobile: 290 }, + { date: "2024-05-24", desktop: 294, mobile: 220 }, + { date: "2024-05-25", desktop: 201, mobile: 250 }, + { date: "2024-05-26", desktop: 213, mobile: 170 }, + { date: "2024-05-27", desktop: 420, mobile: 460 }, + { date: "2024-05-28", desktop: 233, mobile: 190 }, + { date: "2024-05-29", desktop: 78, mobile: 130 }, + { date: "2024-05-30", desktop: 340, mobile: 280 }, + { date: "2024-05-31", desktop: 178, mobile: 230 }, + { date: "2024-06-01", desktop: 178, mobile: 200 }, + { date: "2024-06-02", desktop: 470, mobile: 410 }, + { date: "2024-06-03", desktop: 103, mobile: 160 }, + { date: "2024-06-04", desktop: 439, mobile: 380 }, + { date: "2024-06-05", desktop: 88, mobile: 140 }, + { date: "2024-06-06", desktop: 294, mobile: 250 }, + { date: "2024-06-07", desktop: 323, mobile: 370 }, + { date: "2024-06-08", desktop: 385, mobile: 320 }, + { date: "2024-06-09", desktop: 438, mobile: 480 }, + { date: "2024-06-10", desktop: 155, mobile: 200 }, + { date: "2024-06-11", desktop: 92, mobile: 150 }, + { date: "2024-06-12", desktop: 492, mobile: 420 }, + { date: "2024-06-13", desktop: 81, mobile: 130 }, + { date: "2024-06-14", desktop: 426, mobile: 380 }, + { date: "2024-06-15", desktop: 307, mobile: 350 }, + { date: "2024-06-16", desktop: 371, mobile: 310 }, + { date: "2024-06-17", desktop: 475, mobile: 520 }, + { date: "2024-06-18", desktop: 107, mobile: 170 }, + { date: "2024-06-19", desktop: 341, mobile: 290 }, + { date: "2024-06-20", desktop: 408, mobile: 450 }, + { date: "2024-06-21", desktop: 169, mobile: 210 }, + { date: "2024-06-22", desktop: 317, mobile: 270 }, + { date: "2024-06-23", desktop: 480, mobile: 530 }, + { date: "2024-06-24", desktop: 132, mobile: 180 }, + { date: "2024-06-25", desktop: 141, mobile: 190 }, + { date: "2024-06-26", desktop: 434, mobile: 380 }, + { date: "2024-06-27", desktop: 448, mobile: 490 }, + { date: "2024-06-28", desktop: 149, mobile: 200 }, + { date: "2024-06-29", desktop: 103, mobile: 160 }, + { date: "2024-06-30", desktop: 446, mobile: 400 }, +] + +const chartConfig = { + visitors: { + label: "Visitors", + }, + desktop: { + label: "Desktop", + color: "var(--primary)", + }, + mobile: { + label: "Mobile", + color: "var(--primary)", + }, +} satisfies ChartConfig + +export function ChartAreaInteractive() { + const isMobile = useIsMobile() + const [timeRange, setTimeRange] = React.useState("90d") + + React.useEffect(() => { + if (isMobile) { + setTimeRange("7d") + } + }, [isMobile]) + + const filteredData = chartData.filter((item) => { + const date = new Date(item.date) + const referenceDate = new Date("2024-06-30") + let daysToSubtract = 90 + if (timeRange === "30d") { + daysToSubtract = 30 + } else if (timeRange === "7d") { + daysToSubtract = 7 + } + const startDate = new Date(referenceDate) + startDate.setDate(startDate.getDate() - daysToSubtract) + return date >= startDate + }) + + return ( + + + Total Visitors + + + Total for the last 3 months + + Last 3 months + + + + Last 3 months + Last 30 days + Last 7 days + + + + + + + + + + + + + + + + + + + { + const date = new Date(value) + return date.toLocaleDateString("en-US", { + month: "short", + day: "numeric", + }) + }} + /> + { + return new Date(value).toLocaleDateString("en-US", { + month: "short", + day: "numeric", + }) + }} + indicator="dot" + /> + } + /> + + + + + + + ) +} diff --git a/apps/v4/registry/new-york-v4/blocks/dashboard-01/components/data-table.tsx b/apps/v4/registry/new-york-v4/blocks/dashboard-01/components/data-table.tsx new file mode 100644 index 0000000000..857d769d5e --- /dev/null +++ b/apps/v4/registry/new-york-v4/blocks/dashboard-01/components/data-table.tsx @@ -0,0 +1,807 @@ +"use client" + +import * as React from "react" +import { + DndContext, + KeyboardSensor, + MouseSensor, + TouchSensor, + closestCenter, + useSensor, + useSensors, + type DragEndEvent, + type UniqueIdentifier, +} from "@dnd-kit/core" +import { restrictToVerticalAxis } from "@dnd-kit/modifiers" +import { + SortableContext, + arrayMove, + useSortable, + verticalListSortingStrategy, +} from "@dnd-kit/sortable" +import { CSS } from "@dnd-kit/utilities" +import { + IconChevronDown, + IconChevronLeft, + IconChevronRight, + IconChevronsLeft, + IconChevronsRight, + IconCircleCheckFilled, + IconDotsVertical, + IconGripVertical, + IconLayoutColumns, + IconLoader, + IconPlus, + IconTrendingUp, +} from "@tabler/icons-react" +import { + ColumnDef, + ColumnFiltersState, + Row, + SortingState, + VisibilityState, + flexRender, + getCoreRowModel, + getFacetedRowModel, + getFacetedUniqueValues, + getFilteredRowModel, + getPaginationRowModel, + getSortedRowModel, + useReactTable, +} from "@tanstack/react-table" +import { Area, AreaChart, CartesianGrid, XAxis } from "recharts" +import { toast } from "sonner" +import { z } from "zod" + +import { useIsMobile } from "@/registry/new-york-v4/hooks/use-mobile" +import { Badge } from "@/registry/new-york-v4/ui/badge" +import { Button } from "@/registry/new-york-v4/ui/button" +import { + ChartConfig, + ChartContainer, + ChartTooltip, + ChartTooltipContent, +} from "@/registry/new-york-v4/ui/chart" +import { Checkbox } from "@/registry/new-york-v4/ui/checkbox" +import { + Drawer, + DrawerClose, + DrawerContent, + DrawerDescription, + DrawerFooter, + DrawerHeader, + DrawerTitle, + DrawerTrigger, +} from "@/registry/new-york-v4/ui/drawer" +import { + DropdownMenu, + DropdownMenuCheckboxItem, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "@/registry/new-york-v4/ui/dropdown-menu" +import { Input } from "@/registry/new-york-v4/ui/input" +import { Label } from "@/registry/new-york-v4/ui/label" +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/registry/new-york-v4/ui/select" +import { Separator } from "@/registry/new-york-v4/ui/separator" +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/registry/new-york-v4/ui/table" +import { + Tabs, + TabsContent, + TabsList, + TabsTrigger, +} from "@/registry/new-york-v4/ui/tabs" + +export const schema = z.object({ + id: z.number(), + header: z.string(), + type: z.string(), + status: z.string(), + target: z.string(), + limit: z.string(), + reviewer: z.string(), +}) + +// Create a separate component for the drag handle +function DragHandle({ id }: { id: number }) { + const { attributes, listeners } = useSortable({ + id, + }) + + return ( + + ) +} + +const columns: ColumnDef>[] = [ + { + id: "drag", + header: () => null, + cell: ({ row }) => , + }, + { + id: "select", + header: ({ table }) => ( +
+ table.toggleAllPageRowsSelected(!!value)} + aria-label="Select all" + /> +
+ ), + cell: ({ row }) => ( +
+ row.toggleSelected(!!value)} + aria-label="Select row" + /> +
+ ), + enableSorting: false, + enableHiding: false, + }, + { + accessorKey: "header", + header: "Header", + cell: ({ row }) => { + return + }, + enableHiding: false, + }, + { + accessorKey: "type", + header: "Section Type", + cell: ({ row }) => ( +
+ + {row.original.type} + +
+ ), + }, + { + accessorKey: "status", + header: "Status", + cell: ({ row }) => ( + + {row.original.status === "Done" ? ( + + ) : ( + + )} + {row.original.status} + + ), + }, + { + accessorKey: "target", + header: () =>
Target
, + cell: ({ row }) => ( +
{ + e.preventDefault() + toast.promise(new Promise((resolve) => setTimeout(resolve, 1000)), { + loading: `Saving ${row.original.header}`, + success: "Done", + error: "Error", + }) + }} + > + + +
+ ), + }, + { + accessorKey: "limit", + header: () =>
Limit
, + cell: ({ row }) => ( +
{ + e.preventDefault() + toast.promise(new Promise((resolve) => setTimeout(resolve, 1000)), { + loading: `Saving ${row.original.header}`, + success: "Done", + error: "Error", + }) + }} + > + + +
+ ), + }, + { + accessorKey: "reviewer", + header: "Reviewer", + cell: ({ row }) => { + const isAssigned = row.original.reviewer !== "Assign reviewer" + + if (isAssigned) { + return row.original.reviewer + } + + return ( + <> + + + + ) + }, + }, + { + id: "actions", + cell: () => ( + + + + + + Edit + Make a copy + Favorite + + Delete + + + ), + }, +] + +function DraggableRow({ row }: { row: Row> }) { + const { transform, transition, setNodeRef, isDragging } = useSortable({ + id: row.original.id, + }) + + return ( + + {row.getVisibleCells().map((cell) => ( + + {flexRender(cell.column.columnDef.cell, cell.getContext())} + + ))} + + ) +} + +export function DataTable({ + data: initialData, +}: { + data: z.infer[] +}) { + const [data, setData] = React.useState(() => initialData) + const [rowSelection, setRowSelection] = React.useState({}) + const [columnVisibility, setColumnVisibility] = + React.useState({}) + const [columnFilters, setColumnFilters] = React.useState( + [] + ) + const [sorting, setSorting] = React.useState([]) + const [pagination, setPagination] = React.useState({ + pageIndex: 0, + pageSize: 10, + }) + const sortableId = React.useId() + const sensors = useSensors( + useSensor(MouseSensor, {}), + useSensor(TouchSensor, {}), + useSensor(KeyboardSensor, {}) + ) + + const dataIds = React.useMemo( + () => data?.map(({ id }) => id) || [], + [data] + ) + + const table = useReactTable({ + data, + columns, + state: { + sorting, + columnVisibility, + rowSelection, + columnFilters, + pagination, + }, + getRowId: (row) => row.id.toString(), + enableRowSelection: true, + onRowSelectionChange: setRowSelection, + onSortingChange: setSorting, + onColumnFiltersChange: setColumnFilters, + onColumnVisibilityChange: setColumnVisibility, + onPaginationChange: setPagination, + getCoreRowModel: getCoreRowModel(), + getFilteredRowModel: getFilteredRowModel(), + getPaginationRowModel: getPaginationRowModel(), + getSortedRowModel: getSortedRowModel(), + getFacetedRowModel: getFacetedRowModel(), + getFacetedUniqueValues: getFacetedUniqueValues(), + }) + + function handleDragEnd(event: DragEndEvent) { + const { active, over } = event + if (active && over && active.id !== over.id) { + setData((data) => { + const oldIndex = dataIds.indexOf(active.id) + const newIndex = dataIds.indexOf(over.id) + return arrayMove(data, oldIndex, newIndex) + }) + } + } + + return ( + +
+ + + + Outline + + Past Performance 3 + + + Key Personnel 2 + + Focus Documents + +
+ + + + + + {table + .getAllColumns() + .filter( + (column) => + typeof column.accessorFn !== "undefined" && + column.getCanHide() + ) + .map((column) => { + return ( + + column.toggleVisibility(!!value) + } + > + {column.id} + + ) + })} + + + +
+
+ +
+ + + + {table.getHeaderGroups().map((headerGroup) => ( + + {headerGroup.headers.map((header) => { + return ( + + {header.isPlaceholder + ? null + : flexRender( + header.column.columnDef.header, + header.getContext() + )} + + ) + })} + + ))} + + + {table.getRowModel().rows?.length ? ( + + {table.getRowModel().rows.map((row) => ( + + ))} + + ) : ( + + + No results. + + + )} + +
+
+
+
+
+ {table.getFilteredSelectedRowModel().rows.length} of{" "} + {table.getFilteredRowModel().rows.length} row(s) selected. +
+
+
+ + +
+
+ Page {table.getState().pagination.pageIndex + 1} of{" "} + {table.getPageCount()} +
+
+ + + + +
+
+
+
+ +
+
+ +
+
+ +
+
+
+ ) +} + +const chartData = [ + { month: "January", desktop: 186, mobile: 80 }, + { month: "February", desktop: 305, mobile: 200 }, + { month: "March", desktop: 237, mobile: 120 }, + { month: "April", desktop: 73, mobile: 190 }, + { month: "May", desktop: 209, mobile: 130 }, + { month: "June", desktop: 214, mobile: 140 }, +] + +const chartConfig = { + desktop: { + label: "Desktop", + color: "var(--primary)", + }, + mobile: { + label: "Mobile", + color: "var(--primary)", + }, +} satisfies ChartConfig + +function TableCellViewer({ item }: { item: z.infer }) { + const isMobile = useIsMobile() + + return ( + + + + + + + {item.header} + + Showing total visitors for the last 6 months + + +
+ {!isMobile && ( + <> + + + + value.slice(0, 3)} + hide + /> + } + /> + + + + + +
+
+ Trending up by 5.2% this month{" "} + +
+
+ Showing total visitors for the last 6 months. This is just + some random text to test the layout. It spans multiple lines + and should wrap around. +
+
+ + + )} +
+
+ + +
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+ + +
+
+
+ + + + + + +
+
+ ) +} diff --git a/apps/v4/registry/new-york-v4/blocks/dashboard-01/components/nav-documents.tsx b/apps/v4/registry/new-york-v4/blocks/dashboard-01/components/nav-documents.tsx new file mode 100644 index 0000000000..503c59938a --- /dev/null +++ b/apps/v4/registry/new-york-v4/blocks/dashboard-01/components/nav-documents.tsx @@ -0,0 +1,92 @@ +"use client" + +import { + IconDots, + IconFolder, + IconShare3, + IconTrash, + type Icon, +} from "@tabler/icons-react" + +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "@/registry/new-york-v4/ui/dropdown-menu" +import { + SidebarGroup, + SidebarGroupLabel, + SidebarMenu, + SidebarMenuAction, + SidebarMenuButton, + SidebarMenuItem, + useSidebar, +} from "@/registry/new-york-v4/ui/sidebar" + +export function NavDocuments({ + items, +}: { + items: { + name: string + url: string + icon: Icon + }[] +}) { + const { isMobile } = useSidebar() + + return ( + + Documents + + {items.map((item) => ( + + + + + {item.name} + + + + + + + More + + + + + + Open + + + + Share + + + + + Delete + + + + + ))} + + + + More + + + + + ) +} diff --git a/apps/v4/registry/new-york-v4/blocks/dashboard-01/components/nav-main.tsx b/apps/v4/registry/new-york-v4/blocks/dashboard-01/components/nav-main.tsx new file mode 100644 index 0000000000..79ffb5cd6e --- /dev/null +++ b/apps/v4/registry/new-york-v4/blocks/dashboard-01/components/nav-main.tsx @@ -0,0 +1,58 @@ +"use client" + +import { IconCirclePlusFilled, IconMail, type Icon } from "@tabler/icons-react" + +import { Button } from "@/registry/new-york-v4/ui/button" +import { + SidebarGroup, + SidebarGroupContent, + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, +} from "@/registry/new-york-v4/ui/sidebar" + +export function NavMain({ + items, +}: { + items: { + title: string + url: string + icon?: Icon + }[] +}) { + return ( + + + + + + + Quick Create + + + + + + {items.map((item) => ( + + + {item.icon && } + {item.title} + + + ))} + + + + ) +} diff --git a/apps/v4/registry/new-york-v4/blocks/dashboard-01/components/nav-secondary.tsx b/apps/v4/registry/new-york-v4/blocks/dashboard-01/components/nav-secondary.tsx new file mode 100644 index 0000000000..c4f2ea77e6 --- /dev/null +++ b/apps/v4/registry/new-york-v4/blocks/dashboard-01/components/nav-secondary.tsx @@ -0,0 +1,42 @@ +"use client" + +import * as React from "react" +import { type Icon } from "@tabler/icons-react" + +import { + SidebarGroup, + SidebarGroupContent, + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, +} from "@/registry/new-york-v4/ui/sidebar" + +export function NavSecondary({ + items, + ...props +}: { + items: { + title: string + url: string + icon: Icon + }[] +} & React.ComponentPropsWithoutRef) { + return ( + + + + {items.map((item) => ( + + + + + {item.title} + + + + ))} + + + + ) +} diff --git a/apps/v4/registry/new-york-v4/blocks/dashboard-01/components/nav-user.tsx b/apps/v4/registry/new-york-v4/blocks/dashboard-01/components/nav-user.tsx new file mode 100644 index 0000000000..4d63e06cf8 --- /dev/null +++ b/apps/v4/registry/new-york-v4/blocks/dashboard-01/components/nav-user.tsx @@ -0,0 +1,110 @@ +"use client" + +import { + IconCreditCard, + IconDotsVertical, + IconLogout, + IconNotification, + IconUserCircle, +} from "@tabler/icons-react" + +import { + Avatar, + AvatarFallback, + AvatarImage, +} from "@/registry/new-york-v4/ui/avatar" +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "@/registry/new-york-v4/ui/dropdown-menu" +import { + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, + useSidebar, +} from "@/registry/new-york-v4/ui/sidebar" + +export function NavUser({ + user, +}: { + user: { + name: string + email: string + avatar: string + } +}) { + const { isMobile } = useSidebar() + + return ( + + + + + + + + CN + +
+ {user.name} + + {user.email} + +
+ +
+
+ + +
+ + + CN + +
+ {user.name} + + {user.email} + +
+
+
+ + + + + Account + + + + Billing + + + + Notifications + + + + + + Log out + +
+
+
+
+ ) +} diff --git a/apps/v4/registry/new-york-v4/blocks/dashboard-01/components/section-cards.tsx b/apps/v4/registry/new-york-v4/blocks/dashboard-01/components/section-cards.tsx new file mode 100644 index 0000000000..4a69bf5ea8 --- /dev/null +++ b/apps/v4/registry/new-york-v4/blocks/dashboard-01/components/section-cards.tsx @@ -0,0 +1,102 @@ +import { IconTrendingDown, IconTrendingUp } from "@tabler/icons-react" + +import { Badge } from "@/registry/new-york-v4/ui/badge" +import { + Card, + CardAction, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "@/registry/new-york-v4/ui/card" + +export function SectionCards() { + return ( +
+ + + Total Revenue + + $1,250.00 + + + + + +12.5% + + + + +
+ Trending up this month +
+
+ Visitors for the last 6 months +
+
+
+ + + New Customers + + 1,234 + + + + + -20% + + + + +
+ Down 20% this period +
+
+ Acquisition needs attention +
+
+
+ + + Active Accounts + + 45,678 + + + + + +12.5% + + + + +
+ Strong user retention +
+
Engagement exceed targets
+
+
+ + + Growth Rate + + 4.5% + + + + + +4.5% + + + + +
+ Steady performance increase +
+
Meets growth projections
+
+
+
+ ) +} diff --git a/apps/v4/registry/new-york-v4/blocks/dashboard-01/components/site-header.tsx b/apps/v4/registry/new-york-v4/blocks/dashboard-01/components/site-header.tsx new file mode 100644 index 0000000000..dd4210d31c --- /dev/null +++ b/apps/v4/registry/new-york-v4/blocks/dashboard-01/components/site-header.tsx @@ -0,0 +1,30 @@ +import { Button } from "@/registry/new-york-v4/ui/button" +import { Separator } from "@/registry/new-york-v4/ui/separator" +import { SidebarTrigger } from "@/registry/new-york-v4/ui/sidebar" + +export function SiteHeader() { + return ( +
+
+ + +

Documents

+
+ +
+
+
+ ) +} diff --git a/apps/v4/registry/new-york-v4/blocks/dashboard-01/data.json b/apps/v4/registry/new-york-v4/blocks/dashboard-01/data.json new file mode 100644 index 0000000000..ec0873641b --- /dev/null +++ b/apps/v4/registry/new-york-v4/blocks/dashboard-01/data.json @@ -0,0 +1,614 @@ +[ + { + "id": 1, + "header": "Cover page", + "type": "Cover page", + "status": "In Process", + "target": "18", + "limit": "5", + "reviewer": "Eddie Lake" + }, + { + "id": 2, + "header": "Table of contents", + "type": "Table of contents", + "status": "Done", + "target": "29", + "limit": "24", + "reviewer": "Eddie Lake" + }, + { + "id": 3, + "header": "Executive summary", + "type": "Narrative", + "status": "Done", + "target": "10", + "limit": "13", + "reviewer": "Eddie Lake" + }, + { + "id": 4, + "header": "Technical approach", + "type": "Narrative", + "status": "Done", + "target": "27", + "limit": "23", + "reviewer": "Jamik Tashpulatov" + }, + { + "id": 5, + "header": "Design", + "type": "Narrative", + "status": "In Process", + "target": "2", + "limit": "16", + "reviewer": "Jamik Tashpulatov" + }, + { + "id": 6, + "header": "Capabilities", + "type": "Narrative", + "status": "In Process", + "target": "20", + "limit": "8", + "reviewer": "Jamik Tashpulatov" + }, + { + "id": 7, + "header": "Integration with existing systems", + "type": "Narrative", + "status": "In Process", + "target": "19", + "limit": "21", + "reviewer": "Jamik Tashpulatov" + }, + { + "id": 8, + "header": "Innovation and Advantages", + "type": "Narrative", + "status": "Done", + "target": "25", + "limit": "26", + "reviewer": "Assign reviewer" + }, + { + "id": 9, + "header": "Overview of EMR's Innovative Solutions", + "type": "Technical content", + "status": "Done", + "target": "7", + "limit": "23", + "reviewer": "Assign reviewer" + }, + { + "id": 10, + "header": "Advanced Algorithms and Machine Learning", + "type": "Narrative", + "status": "Done", + "target": "30", + "limit": "28", + "reviewer": "Assign reviewer" + }, + { + "id": 11, + "header": "Adaptive Communication Protocols", + "type": "Narrative", + "status": "Done", + "target": "9", + "limit": "31", + "reviewer": "Assign reviewer" + }, + { + "id": 12, + "header": "Advantages Over Current Technologies", + "type": "Narrative", + "status": "Done", + "target": "12", + "limit": "0", + "reviewer": "Assign reviewer" + }, + { + "id": 13, + "header": "Past Performance", + "type": "Narrative", + "status": "Done", + "target": "22", + "limit": "33", + "reviewer": "Assign reviewer" + }, + { + "id": 14, + "header": "Customer Feedback and Satisfaction Levels", + "type": "Narrative", + "status": "Done", + "target": "15", + "limit": "34", + "reviewer": "Assign reviewer" + }, + { + "id": 15, + "header": "Implementation Challenges and Solutions", + "type": "Narrative", + "status": "Done", + "target": "3", + "limit": "35", + "reviewer": "Assign reviewer" + }, + { + "id": 16, + "header": "Security Measures and Data Protection Policies", + "type": "Narrative", + "status": "In Process", + "target": "6", + "limit": "36", + "reviewer": "Assign reviewer" + }, + { + "id": 17, + "header": "Scalability and Future Proofing", + "type": "Narrative", + "status": "Done", + "target": "4", + "limit": "37", + "reviewer": "Assign reviewer" + }, + { + "id": 18, + "header": "Cost-Benefit Analysis", + "type": "Plain language", + "status": "Done", + "target": "14", + "limit": "38", + "reviewer": "Assign reviewer" + }, + { + "id": 19, + "header": "User Training and Onboarding Experience", + "type": "Narrative", + "status": "Done", + "target": "17", + "limit": "39", + "reviewer": "Assign reviewer" + }, + { + "id": 20, + "header": "Future Development Roadmap", + "type": "Narrative", + "status": "Done", + "target": "11", + "limit": "40", + "reviewer": "Assign reviewer" + }, + { + "id": 21, + "header": "System Architecture Overview", + "type": "Technical content", + "status": "In Process", + "target": "24", + "limit": "18", + "reviewer": "Maya Johnson" + }, + { + "id": 22, + "header": "Risk Management Plan", + "type": "Narrative", + "status": "Done", + "target": "15", + "limit": "22", + "reviewer": "Carlos Rodriguez" + }, + { + "id": 23, + "header": "Compliance Documentation", + "type": "Legal", + "status": "In Process", + "target": "31", + "limit": "27", + "reviewer": "Sarah Chen" + }, + { + "id": 24, + "header": "API Documentation", + "type": "Technical content", + "status": "Done", + "target": "8", + "limit": "12", + "reviewer": "Raj Patel" + }, + { + "id": 25, + "header": "User Interface Mockups", + "type": "Visual", + "status": "In Process", + "target": "19", + "limit": "25", + "reviewer": "Leila Ahmadi" + }, + { + "id": 26, + "header": "Database Schema", + "type": "Technical content", + "status": "Done", + "target": "22", + "limit": "20", + "reviewer": "Thomas Wilson" + }, + { + "id": 27, + "header": "Testing Methodology", + "type": "Technical content", + "status": "In Process", + "target": "17", + "limit": "14", + "reviewer": "Assign reviewer" + }, + { + "id": 28, + "header": "Deployment Strategy", + "type": "Narrative", + "status": "Done", + "target": "26", + "limit": "30", + "reviewer": "Eddie Lake" + }, + { + "id": 29, + "header": "Budget Breakdown", + "type": "Financial", + "status": "In Process", + "target": "13", + "limit": "16", + "reviewer": "Jamik Tashpulatov" + }, + { + "id": 30, + "header": "Market Analysis", + "type": "Research", + "status": "Done", + "target": "29", + "limit": "32", + "reviewer": "Sophia Martinez" + }, + { + "id": 31, + "header": "Competitor Comparison", + "type": "Research", + "status": "In Process", + "target": "21", + "limit": "19", + "reviewer": "Assign reviewer" + }, + { + "id": 32, + "header": "Maintenance Plan", + "type": "Technical content", + "status": "Done", + "target": "16", + "limit": "23", + "reviewer": "Alex Thompson" + }, + { + "id": 33, + "header": "User Personas", + "type": "Research", + "status": "In Process", + "target": "27", + "limit": "24", + "reviewer": "Nina Patel" + }, + { + "id": 34, + "header": "Accessibility Compliance", + "type": "Legal", + "status": "Done", + "target": "18", + "limit": "21", + "reviewer": "Assign reviewer" + }, + { + "id": 35, + "header": "Performance Metrics", + "type": "Technical content", + "status": "In Process", + "target": "23", + "limit": "26", + "reviewer": "David Kim" + }, + { + "id": 36, + "header": "Disaster Recovery Plan", + "type": "Technical content", + "status": "Done", + "target": "14", + "limit": "17", + "reviewer": "Jamik Tashpulatov" + }, + { + "id": 37, + "header": "Third-party Integrations", + "type": "Technical content", + "status": "In Process", + "target": "25", + "limit": "28", + "reviewer": "Eddie Lake" + }, + { + "id": 38, + "header": "User Feedback Summary", + "type": "Research", + "status": "Done", + "target": "20", + "limit": "15", + "reviewer": "Assign reviewer" + }, + { + "id": 39, + "header": "Localization Strategy", + "type": "Narrative", + "status": "In Process", + "target": "12", + "limit": "19", + "reviewer": "Maria Garcia" + }, + { + "id": 40, + "header": "Mobile Compatibility", + "type": "Technical content", + "status": "Done", + "target": "28", + "limit": "31", + "reviewer": "James Wilson" + }, + { + "id": 41, + "header": "Data Migration Plan", + "type": "Technical content", + "status": "In Process", + "target": "19", + "limit": "22", + "reviewer": "Assign reviewer" + }, + { + "id": 42, + "header": "Quality Assurance Protocols", + "type": "Technical content", + "status": "Done", + "target": "30", + "limit": "33", + "reviewer": "Priya Singh" + }, + { + "id": 43, + "header": "Stakeholder Analysis", + "type": "Research", + "status": "In Process", + "target": "11", + "limit": "14", + "reviewer": "Eddie Lake" + }, + { + "id": 44, + "header": "Environmental Impact Assessment", + "type": "Research", + "status": "Done", + "target": "24", + "limit": "27", + "reviewer": "Assign reviewer" + }, + { + "id": 45, + "header": "Intellectual Property Rights", + "type": "Legal", + "status": "In Process", + "target": "17", + "limit": "20", + "reviewer": "Sarah Johnson" + }, + { + "id": 46, + "header": "Customer Support Framework", + "type": "Narrative", + "status": "Done", + "target": "22", + "limit": "25", + "reviewer": "Jamik Tashpulatov" + }, + { + "id": 47, + "header": "Version Control Strategy", + "type": "Technical content", + "status": "In Process", + "target": "15", + "limit": "18", + "reviewer": "Assign reviewer" + }, + { + "id": 48, + "header": "Continuous Integration Pipeline", + "type": "Technical content", + "status": "Done", + "target": "26", + "limit": "29", + "reviewer": "Michael Chen" + }, + { + "id": 49, + "header": "Regulatory Compliance", + "type": "Legal", + "status": "In Process", + "target": "13", + "limit": "16", + "reviewer": "Assign reviewer" + }, + { + "id": 50, + "header": "User Authentication System", + "type": "Technical content", + "status": "Done", + "target": "28", + "limit": "31", + "reviewer": "Eddie Lake" + }, + { + "id": 51, + "header": "Data Analytics Framework", + "type": "Technical content", + "status": "In Process", + "target": "21", + "limit": "24", + "reviewer": "Jamik Tashpulatov" + }, + { + "id": 52, + "header": "Cloud Infrastructure", + "type": "Technical content", + "status": "Done", + "target": "16", + "limit": "19", + "reviewer": "Assign reviewer" + }, + { + "id": 53, + "header": "Network Security Measures", + "type": "Technical content", + "status": "In Process", + "target": "29", + "limit": "32", + "reviewer": "Lisa Wong" + }, + { + "id": 54, + "header": "Project Timeline", + "type": "Planning", + "status": "Done", + "target": "14", + "limit": "17", + "reviewer": "Eddie Lake" + }, + { + "id": 55, + "header": "Resource Allocation", + "type": "Planning", + "status": "In Process", + "target": "27", + "limit": "30", + "reviewer": "Assign reviewer" + }, + { + "id": 56, + "header": "Team Structure and Roles", + "type": "Planning", + "status": "Done", + "target": "20", + "limit": "23", + "reviewer": "Jamik Tashpulatov" + }, + { + "id": 57, + "header": "Communication Protocols", + "type": "Planning", + "status": "In Process", + "target": "15", + "limit": "18", + "reviewer": "Assign reviewer" + }, + { + "id": 58, + "header": "Success Metrics", + "type": "Planning", + "status": "Done", + "target": "30", + "limit": "33", + "reviewer": "Eddie Lake" + }, + { + "id": 59, + "header": "Internationalization Support", + "type": "Technical content", + "status": "In Process", + "target": "23", + "limit": "26", + "reviewer": "Jamik Tashpulatov" + }, + { + "id": 60, + "header": "Backup and Recovery Procedures", + "type": "Technical content", + "status": "Done", + "target": "18", + "limit": "21", + "reviewer": "Assign reviewer" + }, + { + "id": 61, + "header": "Monitoring and Alerting System", + "type": "Technical content", + "status": "In Process", + "target": "25", + "limit": "28", + "reviewer": "Daniel Park" + }, + { + "id": 62, + "header": "Code Review Guidelines", + "type": "Technical content", + "status": "Done", + "target": "12", + "limit": "15", + "reviewer": "Eddie Lake" + }, + { + "id": 63, + "header": "Documentation Standards", + "type": "Technical content", + "status": "In Process", + "target": "27", + "limit": "30", + "reviewer": "Jamik Tashpulatov" + }, + { + "id": 64, + "header": "Release Management Process", + "type": "Planning", + "status": "Done", + "target": "22", + "limit": "25", + "reviewer": "Assign reviewer" + }, + { + "id": 65, + "header": "Feature Prioritization Matrix", + "type": "Planning", + "status": "In Process", + "target": "19", + "limit": "22", + "reviewer": "Emma Davis" + }, + { + "id": 66, + "header": "Technical Debt Assessment", + "type": "Technical content", + "status": "Done", + "target": "24", + "limit": "27", + "reviewer": "Eddie Lake" + }, + { + "id": 67, + "header": "Capacity Planning", + "type": "Planning", + "status": "In Process", + "target": "21", + "limit": "24", + "reviewer": "Jamik Tashpulatov" + }, + { + "id": 68, + "header": "Service Level Agreements", + "type": "Legal", + "status": "Done", + "target": "26", + "limit": "29", + "reviewer": "Assign reviewer" + } +] diff --git a/apps/v4/registry/new-york-v4/blocks/dashboard-01/page.tsx b/apps/v4/registry/new-york-v4/blocks/dashboard-01/page.tsx new file mode 100644 index 0000000000..c936e0c06d --- /dev/null +++ b/apps/v4/registry/new-york-v4/blocks/dashboard-01/page.tsx @@ -0,0 +1,40 @@ +import { AppSidebar } from "@/registry/new-york-v4/blocks/dashboard-01/components/app-sidebar" +import { ChartAreaInteractive } from "@/registry/new-york-v4/blocks/dashboard-01/components/chart-area-interactive" +import { DataTable } from "@/registry/new-york-v4/blocks/dashboard-01/components/data-table" +import { SectionCards } from "@/registry/new-york-v4/blocks/dashboard-01/components/section-cards" +import { SiteHeader } from "@/registry/new-york-v4/blocks/dashboard-01/components/site-header" +import { + SidebarInset, + SidebarProvider, +} from "@/registry/new-york-v4/ui/sidebar" + +import data from "./data.json" + +export default function Page() { + return ( + + + + +
+
+
+ +
+ +
+ +
+
+
+
+
+ ) +} diff --git a/apps/v4/scripts/build-registry.mts b/apps/v4/scripts/build-registry.mts index 4af9071c0c..7eeb8ed6a0 100644 --- a/apps/v4/scripts/build-registry.mts +++ b/apps/v4/scripts/build-registry.mts @@ -74,9 +74,17 @@ const registry = { }, ], }, - ].filter((item) => { - return !DEPRECATED_ITEMS.includes(item.name) - }) + ] + .filter((item) => { + return !DEPRECATED_ITEMS.includes(item.name) + }) + .map((item) => { + // Temporary fix for dashboard-01. + if (item.name === "dashboard-01") { + item.dependencies?.push("@tabler/icons-react") + } + return item + }) ), } satisfies Registry diff --git a/apps/www/__registry__/default/blocks/dashboard-01/page.tsx b/apps/www/__registry__/default/blocks/dashboard-01/page.tsx new file mode 100644 index 0000000000..083e2a7f01 --- /dev/null +++ b/apps/www/__registry__/default/blocks/dashboard-01/page.tsx @@ -0,0 +1,30 @@ +import { AppSidebar } from "@/registry/default/blocks/dashboard-01/components/app-sidebar" +import { ChartAreaInteractive } from "@/registry/default/blocks/dashboard-01/components/chart-area-interactive" +import { DataTable } from "@/registry/default/blocks/dashboard-01/components/data-table" +import { SectionCards } from "@/registry/default/blocks/dashboard-01/components/section-cards" +import { SiteHeader } from "@/registry/default/blocks/dashboard-01/components/site-header" +import { SidebarInset, SidebarProvider } from "@/registry/default/ui/sidebar" + +import data from "./data.json" + +export default function Page() { + return ( + + + + +
+
+
+ +
+ +
+ +
+
+
+
+
+ ) +} diff --git a/apps/www/__registry__/index.tsx b/apps/www/__registry__/index.tsx index 5f33147abd..21f232da8a 100644 --- a/apps/www/__registry__/index.tsx +++ b/apps/www/__registry__/index.tsx @@ -718,6 +718,61 @@ export const Index: Record = { source: "", meta: undefined, }, + "dashboard-01": { + name: "dashboard-01", + description: "A dashboard with sidebar, charts and data table.", + type: "registry:block", + registryDependencies: ["sidebar","breadcrumb","separator","label","chart","card","select","tabs","table","toggle-group","badge","button","checkbox","dropdown-menu","drawer","input","avatar","sheet","sonner"], + files: [{ + path: "registry/new-york/blocks/dashboard-01/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx" + },{ + path: "registry/new-york/blocks/dashboard-01/data.json", + type: "registry:file", + target: "app/dashboard/data.json" + },{ + path: "registry/new-york/blocks/dashboard-01/components/app-sidebar.tsx", + type: "registry:component", + target: "" + },{ + path: "registry/new-york/blocks/dashboard-01/components/chart-area-interactive.tsx", + type: "registry:component", + target: "" + },{ + path: "registry/new-york/blocks/dashboard-01/components/data-table.tsx", + type: "registry:component", + target: "" + },{ + path: "registry/new-york/blocks/dashboard-01/components/nav-documents.tsx", + type: "registry:component", + target: "" + },{ + path: "registry/new-york/blocks/dashboard-01/components/nav-main.tsx", + type: "registry:component", + target: "" + },{ + path: "registry/new-york/blocks/dashboard-01/components/nav-secondary.tsx", + type: "registry:component", + target: "" + },{ + path: "registry/new-york/blocks/dashboard-01/components/nav-user.tsx", + type: "registry:component", + target: "" + },{ + path: "registry/new-york/blocks/dashboard-01/components/section-cards.tsx", + type: "registry:component", + target: "" + },{ + path: "registry/new-york/blocks/dashboard-01/components/site-header.tsx", + type: "registry:component", + target: "" + }], + categories: ["dashboard"], + component: React.lazy(() => import("@/registry/new-york/blocks/dashboard-01/page.tsx")), + source: "__registry__/new-york/blocks/dashboard-01/page.tsx", + meta: undefined, + }, "sidebar-01": { name: "sidebar-01", description: "A simple sidebar with navigation grouped by section.", @@ -6016,6 +6071,61 @@ export const Index: Record = { source: "", meta: undefined, }, + "dashboard-01": { + name: "dashboard-01", + description: "A dashboard with sidebar, charts and data table.", + type: "registry:block", + registryDependencies: ["sidebar","breadcrumb","separator","label","chart","card","select","tabs","table","toggle-group","badge","button","checkbox","dropdown-menu","drawer","input","avatar","sheet","sonner"], + files: [{ + path: "registry/default/blocks/dashboard-01/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx" + },{ + path: "registry/default/blocks/dashboard-01/data.json", + type: "registry:file", + target: "app/dashboard/data.json" + },{ + path: "registry/default/blocks/dashboard-01/components/app-sidebar.tsx", + type: "registry:component", + target: "" + },{ + path: "registry/default/blocks/dashboard-01/components/chart-area-interactive.tsx", + type: "registry:component", + target: "" + },{ + path: "registry/default/blocks/dashboard-01/components/data-table.tsx", + type: "registry:component", + target: "" + },{ + path: "registry/default/blocks/dashboard-01/components/nav-documents.tsx", + type: "registry:component", + target: "" + },{ + path: "registry/default/blocks/dashboard-01/components/nav-main.tsx", + type: "registry:component", + target: "" + },{ + path: "registry/default/blocks/dashboard-01/components/nav-secondary.tsx", + type: "registry:component", + target: "" + },{ + path: "registry/default/blocks/dashboard-01/components/nav-user.tsx", + type: "registry:component", + target: "" + },{ + path: "registry/default/blocks/dashboard-01/components/section-cards.tsx", + type: "registry:component", + target: "" + },{ + path: "registry/default/blocks/dashboard-01/components/site-header.tsx", + type: "registry:component", + target: "" + }], + categories: ["dashboard"], + component: React.lazy(() => import("@/registry/default/blocks/dashboard-01/page.tsx")), + source: "__registry__/default/blocks/dashboard-01/page.tsx", + meta: undefined, + }, "sidebar-01": { name: "sidebar-01", description: "A simple sidebar with navigation grouped by section.", diff --git a/apps/www/__registry__/new-york/blocks/dashboard-01/page.tsx b/apps/www/__registry__/new-york/blocks/dashboard-01/page.tsx new file mode 100644 index 0000000000..e5602a4af1 --- /dev/null +++ b/apps/www/__registry__/new-york/blocks/dashboard-01/page.tsx @@ -0,0 +1,30 @@ +import { AppSidebar } from "@/registry/new-york/blocks/dashboard-01/components/app-sidebar" +import { ChartAreaInteractive } from "@/registry/new-york/blocks/dashboard-01/components/chart-area-interactive" +import { DataTable } from "@/registry/new-york/blocks/dashboard-01/components/data-table" +import { SectionCards } from "@/registry/new-york/blocks/dashboard-01/components/section-cards" +import { SiteHeader } from "@/registry/new-york/blocks/dashboard-01/components/site-header" +import { SidebarInset, SidebarProvider } from "@/registry/new-york/ui/sidebar" + +import data from "./data.json" + +export default function Page() { + return ( + + + + +
+
+
+ +
+ +
+ +
+
+
+
+
+ ) +} diff --git a/apps/www/actions/edit-in-v0.ts b/apps/www/actions/edit-in-v0.ts index ca10b12654..98caeffa6f 100644 --- a/apps/www/actions/edit-in-v0.ts +++ b/apps/www/actions/edit-in-v0.ts @@ -6,6 +6,8 @@ import { capitalCase } from "change-case" import { getRegistryItem } from "@/lib/registry" import { Style } from "@/registry/registry-styles" +const TAILWIND_CONFIG_BLOCKS = ["dashboard-01"] + export async function editInV0({ name, style, @@ -48,6 +50,15 @@ export async function editInV0({ return file }) + if (TAILWIND_CONFIG_BLOCKS.includes(name)) { + registryItem.files?.push({ + path: "tailwind.config.js", + type: "registry:file", + target: "tailwind.config.js", + content: TAILWIND_CONFIG, + }) + } + const payload = { version: 2, payload: registryItem, @@ -95,3 +106,93 @@ export async function editInV0({ } } } + +const TAILWIND_CONFIG = `const { fontFamily } = require("tailwindcss/defaultTheme") + +/** @type {import('tailwindcss').Config} */ +module.exports = { + darkMode: ["class"], + content: ["app/**/*.{ts,tsx}", "components/**/*.{ts,tsx}"], + theme: { + extend: { + fontFamily: { + sans: ["var(--font-geist-sans)", ...fontFamily.sans], + mono: ["var(--font-geist-mono)", ...fontFamily.mono], + }, + colors: { + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive) / )", + foreground: "hsl(var(--destructive-foreground) / )", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + sidebar: { + DEFAULT: "hsl(var(--sidebar-background))", + foreground: "hsl(var(--sidebar-foreground))", + primary: "hsl(var(--sidebar-primary))", + "primary-foreground": "hsl(var(--sidebar-primary-foreground))", + accent: "hsl(var(--sidebar-accent))", + "accent-foreground": "hsl(var(--sidebar-accent-foreground))", + border: "hsl(var(--sidebar-border))", + ring: "hsl(var(--sidebar-ring))", + }, + }, + borderRadius: { + xl: "calc(var(--radius) + 4px)", + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + keyframes: { + "accordion-down": { + from: { height: "0" }, + to: { height: "var(--radix-accordion-content-height)" }, + }, + "accordion-up": { + from: { height: "var(--radix-accordion-content-height)" }, + to: { height: "0" }, + }, + "caret-blink": { + "0%,70%,100%": { opacity: "1" }, + "20%,50%": { opacity: "0" }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + "caret-blink": "caret-blink 1.25s ease-out infinite", + }, + }, + }, + plugins: [ + require("tailwindcss-animate"), + require("@tailwindcss/container-queries"), + ], +}` diff --git a/apps/www/app/(app)/blocks/page.tsx b/apps/www/app/(app)/blocks/page.tsx index 9e5a5544cf..199985bf68 100644 --- a/apps/www/app/(app)/blocks/page.tsx +++ b/apps/www/app/(app)/blocks/page.tsx @@ -3,7 +3,13 @@ import Link from "next/link" import { BlockDisplay } from "@/components/block-display" import { Button } from "@/registry/new-york/ui/button" -const FEATURED_BLOCKS = ["sidebar-07", "sidebar-03", "login-03", "login-04"] +const FEATURED_BLOCKS = [ + "dashboard-01", + "sidebar-07", + "sidebar-03", + "login-03", + "login-04", +] export default async function BlocksPage() { return ( diff --git a/apps/www/package.json b/apps/www/package.json index 10ce6e2034..9a7917b2cd 100644 --- a/apps/www/package.json +++ b/apps/www/package.json @@ -20,6 +20,10 @@ "format:check": "prettier --check \"**/*.{ts,tsx,mdx}\" --cache" }, "dependencies": { + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/modifiers": "^9.0.0", + "@dnd-kit/sortable": "^10.0.0", + "@dnd-kit/utilities": "^3.2.2", "@emotion/is-prop-valid": "^1.3.1", "@faker-js/faker": "^8.2.0", "@hookform/resolvers": "^3.1.0", @@ -53,6 +57,7 @@ "@radix-ui/react-toggle": "^1.0.3", "@radix-ui/react-toggle-group": "^1.0.4", "@radix-ui/react-tooltip": "^1.0.6", + "@tailwindcss/container-queries": "^0.1.1", "@tanstack/react-table": "^8.9.1", "@vercel/analytics": "^1.2.2", "@vercel/og": "^0.0.21", diff --git a/apps/www/public/r/styles/default/dashboard-01.json b/apps/www/public/r/styles/default/dashboard-01.json new file mode 100644 index 0000000000..9bde5db6e6 --- /dev/null +++ b/apps/www/public/r/styles/default/dashboard-01.json @@ -0,0 +1,107 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "dashboard-01", + "type": "registry:block", + "author": "shadcn (https://ui.shadcn.com)", + "description": "A dashboard with sidebar, charts and data table.", + "dependencies": [ + "@dnd-kit/core", + "@dnd-kit/modifiers", + "@dnd-kit/sortable", + "@dnd-kit/utilities", + "@tanstack/react-table", + "zod" + ], + "registryDependencies": [ + "sidebar", + "breadcrumb", + "separator", + "label", + "chart", + "card", + "select", + "tabs", + "table", + "toggle-group", + "badge", + "button", + "checkbox", + "dropdown-menu", + "drawer", + "input", + "avatar", + "sheet", + "sonner" + ], + "files": [ + { + "path": "blocks/dashboard-01/page.tsx", + "content": "import { AppSidebar } from \"@/registry/default/blocks/dashboard-01/components/app-sidebar\"\nimport { ChartAreaInteractive } from \"@/registry/default/blocks/dashboard-01/components/chart-area-interactive\"\nimport { DataTable } from \"@/registry/default/blocks/dashboard-01/components/data-table\"\nimport { SectionCards } from \"@/registry/default/blocks/dashboard-01/components/section-cards\"\nimport { SiteHeader } from \"@/registry/default/blocks/dashboard-01/components/site-header\"\nimport { SidebarInset, SidebarProvider } from \"@/registry/default/ui/sidebar\"\n\nimport data from \"./data.json\"\n\nexport default function Page() {\n return (\n \n \n \n \n
\n
\n
\n \n
\n \n
\n \n
\n
\n
\n
\n
\n )\n}\n", + "type": "registry:page", + "target": "app/dashboard/page.tsx" + }, + { + "path": "blocks/dashboard-01/data.json", + "content": "[\n {\n \"id\": 1,\n \"header\": \"Cover page\",\n \"type\": \"Cover page\",\n \"status\": \"In Process\",\n \"target\": \"18\",\n \"limit\": \"5\",\n \"reviewer\": \"Eddie Lake\"\n },\n {\n \"id\": 2,\n \"header\": \"Table of contents\",\n \"type\": \"Table of contents\",\n \"status\": \"Done\",\n \"target\": \"29\",\n \"limit\": \"24\",\n \"reviewer\": \"Eddie Lake\"\n },\n {\n \"id\": 3,\n \"header\": \"Executive summary\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"10\",\n \"limit\": \"13\",\n \"reviewer\": \"Eddie Lake\"\n },\n {\n \"id\": 4,\n \"header\": \"Technical approach\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"27\",\n \"limit\": \"23\",\n \"reviewer\": \"Jamik Tashpulatov\"\n },\n {\n \"id\": 5,\n \"header\": \"Design\",\n \"type\": \"Narrative\",\n \"status\": \"In Process\",\n \"target\": \"2\",\n \"limit\": \"16\",\n \"reviewer\": \"Jamik Tashpulatov\"\n },\n {\n \"id\": 6,\n \"header\": \"Capabilities\",\n \"type\": \"Narrative\",\n \"status\": \"In Process\",\n \"target\": \"20\",\n \"limit\": \"8\",\n \"reviewer\": \"Jamik Tashpulatov\"\n },\n {\n \"id\": 7,\n \"header\": \"Integration with existing systems\",\n \"type\": \"Narrative\",\n \"status\": \"In Process\",\n \"target\": \"19\",\n \"limit\": \"21\",\n \"reviewer\": \"Jamik Tashpulatov\"\n },\n {\n \"id\": 8,\n \"header\": \"Innovation and Advantages\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"25\",\n \"limit\": \"26\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 9,\n \"header\": \"Overview of EMR's Innovative Solutions\",\n \"type\": \"Technical content\",\n \"status\": \"Done\",\n \"target\": \"7\",\n \"limit\": \"23\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 10,\n \"header\": \"Advanced Algorithms and Machine Learning\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"30\",\n \"limit\": \"28\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 11,\n \"header\": \"Adaptive Communication Protocols\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"9\",\n \"limit\": \"31\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 12,\n \"header\": \"Advantages Over Current Technologies\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"12\",\n \"limit\": \"0\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 13,\n \"header\": \"Past Performance\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"22\",\n \"limit\": \"33\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 14,\n \"header\": \"Customer Feedback and Satisfaction Levels\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"15\",\n \"limit\": \"34\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 15,\n \"header\": \"Implementation Challenges and Solutions\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"3\",\n \"limit\": \"35\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 16,\n \"header\": \"Security Measures and Data Protection Policies\",\n \"type\": \"Narrative\",\n \"status\": \"In Process\",\n \"target\": \"6\",\n \"limit\": \"36\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 17,\n \"header\": \"Scalability and Future Proofing\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"4\",\n \"limit\": \"37\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 18,\n \"header\": \"Cost-Benefit Analysis\",\n \"type\": \"Plain language\",\n \"status\": \"Done\",\n \"target\": \"14\",\n \"limit\": \"38\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 19,\n \"header\": \"User Training and Onboarding Experience\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"17\",\n \"limit\": \"39\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 20,\n \"header\": \"Future Development Roadmap\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"11\",\n \"limit\": \"40\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 21,\n \"header\": \"System Architecture Overview\",\n \"type\": \"Technical content\",\n \"status\": \"In Process\",\n \"target\": \"24\",\n \"limit\": \"18\",\n \"reviewer\": \"Maya Johnson\"\n },\n {\n \"id\": 22,\n \"header\": \"Risk Management Plan\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"15\",\n \"limit\": \"22\",\n \"reviewer\": \"Carlos Rodriguez\"\n },\n {\n \"id\": 23,\n \"header\": \"Compliance Documentation\",\n \"type\": \"Legal\",\n \"status\": \"In Process\",\n \"target\": \"31\",\n \"limit\": \"27\",\n \"reviewer\": \"Sarah Chen\"\n },\n {\n \"id\": 24,\n \"header\": \"API Documentation\",\n \"type\": \"Technical content\",\n \"status\": \"Done\",\n \"target\": \"8\",\n \"limit\": \"12\",\n \"reviewer\": \"Raj Patel\"\n },\n {\n \"id\": 25,\n \"header\": \"User Interface Mockups\",\n \"type\": \"Visual\",\n \"status\": \"In Process\",\n \"target\": \"19\",\n \"limit\": \"25\",\n \"reviewer\": \"Leila Ahmadi\"\n },\n {\n \"id\": 26,\n \"header\": \"Database Schema\",\n \"type\": \"Technical content\",\n \"status\": \"Done\",\n \"target\": \"22\",\n \"limit\": \"20\",\n \"reviewer\": \"Thomas Wilson\"\n },\n {\n \"id\": 27,\n \"header\": \"Testing Methodology\",\n \"type\": \"Technical content\",\n \"status\": \"In Process\",\n \"target\": \"17\",\n \"limit\": \"14\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 28,\n \"header\": \"Deployment Strategy\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"26\",\n \"limit\": \"30\",\n \"reviewer\": \"Eddie Lake\"\n },\n {\n \"id\": 29,\n \"header\": \"Budget Breakdown\",\n \"type\": \"Financial\",\n \"status\": \"In Process\",\n \"target\": \"13\",\n \"limit\": \"16\",\n \"reviewer\": \"Jamik Tashpulatov\"\n },\n {\n \"id\": 30,\n \"header\": \"Market Analysis\",\n \"type\": \"Research\",\n \"status\": \"Done\",\n \"target\": \"29\",\n \"limit\": \"32\",\n \"reviewer\": \"Sophia Martinez\"\n },\n {\n \"id\": 31,\n \"header\": \"Competitor Comparison\",\n \"type\": \"Research\",\n \"status\": \"In Process\",\n \"target\": \"21\",\n \"limit\": \"19\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 32,\n \"header\": \"Maintenance Plan\",\n \"type\": \"Technical content\",\n \"status\": \"Done\",\n \"target\": \"16\",\n \"limit\": \"23\",\n \"reviewer\": \"Alex Thompson\"\n },\n {\n \"id\": 33,\n \"header\": \"User Personas\",\n \"type\": \"Research\",\n \"status\": \"In Process\",\n \"target\": \"27\",\n \"limit\": \"24\",\n \"reviewer\": \"Nina Patel\"\n },\n {\n \"id\": 34,\n \"header\": \"Accessibility Compliance\",\n \"type\": \"Legal\",\n \"status\": \"Done\",\n \"target\": \"18\",\n \"limit\": \"21\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 35,\n \"header\": \"Performance Metrics\",\n \"type\": \"Technical content\",\n \"status\": \"In Process\",\n \"target\": \"23\",\n \"limit\": \"26\",\n \"reviewer\": \"David Kim\"\n },\n {\n \"id\": 36,\n \"header\": \"Disaster Recovery Plan\",\n \"type\": \"Technical content\",\n \"status\": \"Done\",\n \"target\": \"14\",\n \"limit\": \"17\",\n \"reviewer\": \"Jamik Tashpulatov\"\n },\n {\n \"id\": 37,\n \"header\": \"Third-party Integrations\",\n \"type\": \"Technical content\",\n \"status\": \"In Process\",\n \"target\": \"25\",\n \"limit\": \"28\",\n \"reviewer\": \"Eddie Lake\"\n },\n {\n \"id\": 38,\n \"header\": \"User Feedback Summary\",\n \"type\": \"Research\",\n \"status\": \"Done\",\n \"target\": \"20\",\n \"limit\": \"15\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 39,\n \"header\": \"Localization Strategy\",\n \"type\": \"Narrative\",\n \"status\": \"In Process\",\n \"target\": \"12\",\n \"limit\": \"19\",\n \"reviewer\": \"Maria Garcia\"\n },\n {\n \"id\": 40,\n \"header\": \"Mobile Compatibility\",\n \"type\": \"Technical content\",\n \"status\": \"Done\",\n \"target\": \"28\",\n \"limit\": \"31\",\n \"reviewer\": \"James Wilson\"\n },\n {\n \"id\": 41,\n \"header\": \"Data Migration Plan\",\n \"type\": \"Technical content\",\n \"status\": \"In Process\",\n \"target\": \"19\",\n \"limit\": \"22\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 42,\n \"header\": \"Quality Assurance Protocols\",\n \"type\": \"Technical content\",\n \"status\": \"Done\",\n \"target\": \"30\",\n \"limit\": \"33\",\n \"reviewer\": \"Priya Singh\"\n },\n {\n \"id\": 43,\n \"header\": \"Stakeholder Analysis\",\n \"type\": \"Research\",\n \"status\": \"In Process\",\n \"target\": \"11\",\n \"limit\": \"14\",\n \"reviewer\": \"Eddie Lake\"\n },\n {\n \"id\": 44,\n \"header\": \"Environmental Impact Assessment\",\n \"type\": \"Research\",\n \"status\": \"Done\",\n \"target\": \"24\",\n \"limit\": \"27\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 45,\n \"header\": \"Intellectual Property Rights\",\n \"type\": \"Legal\",\n \"status\": \"In Process\",\n \"target\": \"17\",\n \"limit\": \"20\",\n \"reviewer\": \"Sarah Johnson\"\n },\n {\n \"id\": 46,\n \"header\": \"Customer Support Framework\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"22\",\n \"limit\": \"25\",\n \"reviewer\": \"Jamik Tashpulatov\"\n },\n {\n \"id\": 47,\n \"header\": \"Version Control Strategy\",\n \"type\": \"Technical content\",\n \"status\": \"In Process\",\n \"target\": \"15\",\n \"limit\": \"18\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 48,\n \"header\": \"Continuous Integration Pipeline\",\n \"type\": \"Technical content\",\n \"status\": \"Done\",\n \"target\": \"26\",\n \"limit\": \"29\",\n \"reviewer\": \"Michael Chen\"\n },\n {\n \"id\": 49,\n \"header\": \"Regulatory Compliance\",\n \"type\": \"Legal\",\n \"status\": \"In Process\",\n \"target\": \"13\",\n \"limit\": \"16\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 50,\n \"header\": \"User Authentication System\",\n \"type\": \"Technical content\",\n \"status\": \"Done\",\n \"target\": \"28\",\n \"limit\": \"31\",\n \"reviewer\": \"Eddie Lake\"\n },\n {\n \"id\": 51,\n \"header\": \"Data Analytics Framework\",\n \"type\": \"Technical content\",\n \"status\": \"In Process\",\n \"target\": \"21\",\n \"limit\": \"24\",\n \"reviewer\": \"Jamik Tashpulatov\"\n },\n {\n \"id\": 52,\n \"header\": \"Cloud Infrastructure\",\n \"type\": \"Technical content\",\n \"status\": \"Done\",\n \"target\": \"16\",\n \"limit\": \"19\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 53,\n \"header\": \"Network Security Measures\",\n \"type\": \"Technical content\",\n \"status\": \"In Process\",\n \"target\": \"29\",\n \"limit\": \"32\",\n \"reviewer\": \"Lisa Wong\"\n },\n {\n \"id\": 54,\n \"header\": \"Project Timeline\",\n \"type\": \"Planning\",\n \"status\": \"Done\",\n \"target\": \"14\",\n \"limit\": \"17\",\n \"reviewer\": \"Eddie Lake\"\n },\n {\n \"id\": 55,\n \"header\": \"Resource Allocation\",\n \"type\": \"Planning\",\n \"status\": \"In Process\",\n \"target\": \"27\",\n \"limit\": \"30\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 56,\n \"header\": \"Team Structure and Roles\",\n \"type\": \"Planning\",\n \"status\": \"Done\",\n \"target\": \"20\",\n \"limit\": \"23\",\n \"reviewer\": \"Jamik Tashpulatov\"\n },\n {\n \"id\": 57,\n \"header\": \"Communication Protocols\",\n \"type\": \"Planning\",\n \"status\": \"In Process\",\n \"target\": \"15\",\n \"limit\": \"18\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 58,\n \"header\": \"Success Metrics\",\n \"type\": \"Planning\",\n \"status\": \"Done\",\n \"target\": \"30\",\n \"limit\": \"33\",\n \"reviewer\": \"Eddie Lake\"\n },\n {\n \"id\": 59,\n \"header\": \"Internationalization Support\",\n \"type\": \"Technical content\",\n \"status\": \"In Process\",\n \"target\": \"23\",\n \"limit\": \"26\",\n \"reviewer\": \"Jamik Tashpulatov\"\n },\n {\n \"id\": 60,\n \"header\": \"Backup and Recovery Procedures\",\n \"type\": \"Technical content\",\n \"status\": \"Done\",\n \"target\": \"18\",\n \"limit\": \"21\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 61,\n \"header\": \"Monitoring and Alerting System\",\n \"type\": \"Technical content\",\n \"status\": \"In Process\",\n \"target\": \"25\",\n \"limit\": \"28\",\n \"reviewer\": \"Daniel Park\"\n },\n {\n \"id\": 62,\n \"header\": \"Code Review Guidelines\",\n \"type\": \"Technical content\",\n \"status\": \"Done\",\n \"target\": \"12\",\n \"limit\": \"15\",\n \"reviewer\": \"Eddie Lake\"\n },\n {\n \"id\": 63,\n \"header\": \"Documentation Standards\",\n \"type\": \"Technical content\",\n \"status\": \"In Process\",\n \"target\": \"27\",\n \"limit\": \"30\",\n \"reviewer\": \"Jamik Tashpulatov\"\n },\n {\n \"id\": 64,\n \"header\": \"Release Management Process\",\n \"type\": \"Planning\",\n \"status\": \"Done\",\n \"target\": \"22\",\n \"limit\": \"25\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 65,\n \"header\": \"Feature Prioritization Matrix\",\n \"type\": \"Planning\",\n \"status\": \"In Process\",\n \"target\": \"19\",\n \"limit\": \"22\",\n \"reviewer\": \"Emma Davis\"\n },\n {\n \"id\": 66,\n \"header\": \"Technical Debt Assessment\",\n \"type\": \"Technical content\",\n \"status\": \"Done\",\n \"target\": \"24\",\n \"limit\": \"27\",\n \"reviewer\": \"Eddie Lake\"\n },\n {\n \"id\": 67,\n \"header\": \"Capacity Planning\",\n \"type\": \"Planning\",\n \"status\": \"In Process\",\n \"target\": \"21\",\n \"limit\": \"24\",\n \"reviewer\": \"Jamik Tashpulatov\"\n },\n {\n \"id\": 68,\n \"header\": \"Service Level Agreements\",\n \"type\": \"Legal\",\n \"status\": \"Done\",\n \"target\": \"26\",\n \"limit\": \"29\",\n \"reviewer\": \"Assign reviewer\"\n }\n]\n", + "type": "registry:file", + "target": "app/dashboard/data.json" + }, + { + "path": "blocks/dashboard-01/components/app-sidebar.tsx", + "content": "\"use client\"\n\nimport * as React from \"react\"\nimport {\n ArrowUpCircleIcon,\n BarChartIcon,\n CameraIcon,\n ClipboardListIcon,\n DatabaseIcon,\n FileCodeIcon,\n FileIcon,\n FileTextIcon,\n FolderIcon,\n HelpCircleIcon,\n LayoutDashboardIcon,\n ListIcon,\n SearchIcon,\n SettingsIcon,\n UsersIcon,\n} from \"lucide-react\"\n\nimport { NavDocuments } from \"@/registry/default/blocks/dashboard-01/components/nav-documents\"\nimport { NavMain } from \"@/registry/default/blocks/dashboard-01/components/nav-main\"\nimport { NavSecondary } from \"@/registry/default/blocks/dashboard-01/components/nav-secondary\"\nimport { NavUser } from \"@/registry/default/blocks/dashboard-01/components/nav-user\"\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarHeader,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n} from \"@/registry/default/ui/sidebar\"\n\nconst data = {\n user: {\n name: \"shadcn\",\n email: \"m@example.com\",\n avatar: \"/avatars/shadcn.jpg\",\n },\n navMain: [\n {\n title: \"Dashboard\",\n url: \"#\",\n icon: LayoutDashboardIcon,\n },\n {\n title: \"Lifecycle\",\n url: \"#\",\n icon: ListIcon,\n },\n {\n title: \"Analytics\",\n url: \"#\",\n icon: BarChartIcon,\n },\n {\n title: \"Projects\",\n url: \"#\",\n icon: FolderIcon,\n },\n {\n title: \"Team\",\n url: \"#\",\n icon: UsersIcon,\n },\n ],\n navClouds: [\n {\n title: \"Capture\",\n icon: CameraIcon,\n isActive: true,\n url: \"#\",\n items: [\n {\n title: \"Active Proposals\",\n url: \"#\",\n },\n {\n title: \"Archived\",\n url: \"#\",\n },\n ],\n },\n {\n title: \"Proposal\",\n icon: FileTextIcon,\n url: \"#\",\n items: [\n {\n title: \"Active Proposals\",\n url: \"#\",\n },\n {\n title: \"Archived\",\n url: \"#\",\n },\n ],\n },\n {\n title: \"Prompts\",\n icon: FileCodeIcon,\n url: \"#\",\n items: [\n {\n title: \"Active Proposals\",\n url: \"#\",\n },\n {\n title: \"Archived\",\n url: \"#\",\n },\n ],\n },\n ],\n navSecondary: [\n {\n title: \"Settings\",\n url: \"#\",\n icon: SettingsIcon,\n },\n {\n title: \"Get Help\",\n url: \"#\",\n icon: HelpCircleIcon,\n },\n {\n title: \"Search\",\n url: \"#\",\n icon: SearchIcon,\n },\n ],\n documents: [\n {\n name: \"Data Library\",\n url: \"#\",\n icon: DatabaseIcon,\n },\n {\n name: \"Reports\",\n url: \"#\",\n icon: ClipboardListIcon,\n },\n {\n name: \"Word Assistant\",\n url: \"#\",\n icon: FileIcon,\n },\n ],\n}\n\nexport function AppSidebar({ ...props }: React.ComponentProps) {\n return (\n \n \n \n \n \n \n \n Acme Inc.\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n", + "type": "registry:component", + "target": "" + }, + { + "path": "blocks/dashboard-01/components/chart-area-interactive.tsx", + "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { Area, AreaChart, CartesianGrid, XAxis } from \"recharts\"\n\nimport { useIsMobile } from \"@/registry/default/hooks/use-mobile\"\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"@/registry/default/ui/card\"\nimport {\n ChartConfig,\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n} from \"@/registry/default/ui/chart\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/default/ui/select\"\nimport {\n ToggleGroup,\n ToggleGroupItem,\n} from \"@/registry/default/ui/toggle-group\"\nconst chartData = [\n { date: \"2024-04-01\", desktop: 222, mobile: 150 },\n { date: \"2024-04-02\", desktop: 97, mobile: 180 },\n { date: \"2024-04-03\", desktop: 167, mobile: 120 },\n { date: \"2024-04-04\", desktop: 242, mobile: 260 },\n { date: \"2024-04-05\", desktop: 373, mobile: 290 },\n { date: \"2024-04-06\", desktop: 301, mobile: 340 },\n { date: \"2024-04-07\", desktop: 245, mobile: 180 },\n { date: \"2024-04-08\", desktop: 409, mobile: 320 },\n { date: \"2024-04-09\", desktop: 59, mobile: 110 },\n { date: \"2024-04-10\", desktop: 261, mobile: 190 },\n { date: \"2024-04-11\", desktop: 327, mobile: 350 },\n { date: \"2024-04-12\", desktop: 292, mobile: 210 },\n { date: \"2024-04-13\", desktop: 342, mobile: 380 },\n { date: \"2024-04-14\", desktop: 137, mobile: 220 },\n { date: \"2024-04-15\", desktop: 120, mobile: 170 },\n { date: \"2024-04-16\", desktop: 138, mobile: 190 },\n { date: \"2024-04-17\", desktop: 446, mobile: 360 },\n { date: \"2024-04-18\", desktop: 364, mobile: 410 },\n { date: \"2024-04-19\", desktop: 243, mobile: 180 },\n { date: \"2024-04-20\", desktop: 89, mobile: 150 },\n { date: \"2024-04-21\", desktop: 137, mobile: 200 },\n { date: \"2024-04-22\", desktop: 224, mobile: 170 },\n { date: \"2024-04-23\", desktop: 138, mobile: 230 },\n { date: \"2024-04-24\", desktop: 387, mobile: 290 },\n { date: \"2024-04-25\", desktop: 215, mobile: 250 },\n { date: \"2024-04-26\", desktop: 75, mobile: 130 },\n { date: \"2024-04-27\", desktop: 383, mobile: 420 },\n { date: \"2024-04-28\", desktop: 122, mobile: 180 },\n { date: \"2024-04-29\", desktop: 315, mobile: 240 },\n { date: \"2024-04-30\", desktop: 454, mobile: 380 },\n { date: \"2024-05-01\", desktop: 165, mobile: 220 },\n { date: \"2024-05-02\", desktop: 293, mobile: 310 },\n { date: \"2024-05-03\", desktop: 247, mobile: 190 },\n { date: \"2024-05-04\", desktop: 385, mobile: 420 },\n { date: \"2024-05-05\", desktop: 481, mobile: 390 },\n { date: \"2024-05-06\", desktop: 498, mobile: 520 },\n { date: \"2024-05-07\", desktop: 388, mobile: 300 },\n { date: \"2024-05-08\", desktop: 149, mobile: 210 },\n { date: \"2024-05-09\", desktop: 227, mobile: 180 },\n { date: \"2024-05-10\", desktop: 293, mobile: 330 },\n { date: \"2024-05-11\", desktop: 335, mobile: 270 },\n { date: \"2024-05-12\", desktop: 197, mobile: 240 },\n { date: \"2024-05-13\", desktop: 197, mobile: 160 },\n { date: \"2024-05-14\", desktop: 448, mobile: 490 },\n { date: \"2024-05-15\", desktop: 473, mobile: 380 },\n { date: \"2024-05-16\", desktop: 338, mobile: 400 },\n { date: \"2024-05-17\", desktop: 499, mobile: 420 },\n { date: \"2024-05-18\", desktop: 315, mobile: 350 },\n { date: \"2024-05-19\", desktop: 235, mobile: 180 },\n { date: \"2024-05-20\", desktop: 177, mobile: 230 },\n { date: \"2024-05-21\", desktop: 82, mobile: 140 },\n { date: \"2024-05-22\", desktop: 81, mobile: 120 },\n { date: \"2024-05-23\", desktop: 252, mobile: 290 },\n { date: \"2024-05-24\", desktop: 294, mobile: 220 },\n { date: \"2024-05-25\", desktop: 201, mobile: 250 },\n { date: \"2024-05-26\", desktop: 213, mobile: 170 },\n { date: \"2024-05-27\", desktop: 420, mobile: 460 },\n { date: \"2024-05-28\", desktop: 233, mobile: 190 },\n { date: \"2024-05-29\", desktop: 78, mobile: 130 },\n { date: \"2024-05-30\", desktop: 340, mobile: 280 },\n { date: \"2024-05-31\", desktop: 178, mobile: 230 },\n { date: \"2024-06-01\", desktop: 178, mobile: 200 },\n { date: \"2024-06-02\", desktop: 470, mobile: 410 },\n { date: \"2024-06-03\", desktop: 103, mobile: 160 },\n { date: \"2024-06-04\", desktop: 439, mobile: 380 },\n { date: \"2024-06-05\", desktop: 88, mobile: 140 },\n { date: \"2024-06-06\", desktop: 294, mobile: 250 },\n { date: \"2024-06-07\", desktop: 323, mobile: 370 },\n { date: \"2024-06-08\", desktop: 385, mobile: 320 },\n { date: \"2024-06-09\", desktop: 438, mobile: 480 },\n { date: \"2024-06-10\", desktop: 155, mobile: 200 },\n { date: \"2024-06-11\", desktop: 92, mobile: 150 },\n { date: \"2024-06-12\", desktop: 492, mobile: 420 },\n { date: \"2024-06-13\", desktop: 81, mobile: 130 },\n { date: \"2024-06-14\", desktop: 426, mobile: 380 },\n { date: \"2024-06-15\", desktop: 307, mobile: 350 },\n { date: \"2024-06-16\", desktop: 371, mobile: 310 },\n { date: \"2024-06-17\", desktop: 475, mobile: 520 },\n { date: \"2024-06-18\", desktop: 107, mobile: 170 },\n { date: \"2024-06-19\", desktop: 341, mobile: 290 },\n { date: \"2024-06-20\", desktop: 408, mobile: 450 },\n { date: \"2024-06-21\", desktop: 169, mobile: 210 },\n { date: \"2024-06-22\", desktop: 317, mobile: 270 },\n { date: \"2024-06-23\", desktop: 480, mobile: 530 },\n { date: \"2024-06-24\", desktop: 132, mobile: 180 },\n { date: \"2024-06-25\", desktop: 141, mobile: 190 },\n { date: \"2024-06-26\", desktop: 434, mobile: 380 },\n { date: \"2024-06-27\", desktop: 448, mobile: 490 },\n { date: \"2024-06-28\", desktop: 149, mobile: 200 },\n { date: \"2024-06-29\", desktop: 103, mobile: 160 },\n { date: \"2024-06-30\", desktop: 446, mobile: 400 },\n]\n\nconst chartConfig = {\n visitors: {\n label: \"Visitors\",\n },\n desktop: {\n label: \"Desktop\",\n color: \"hsl(var(--chart-1))\",\n },\n mobile: {\n label: \"Mobile\",\n color: \"hsl(var(--chart-2))\",\n },\n} satisfies ChartConfig\n\nexport function ChartAreaInteractive() {\n const isMobile = useIsMobile()\n const [timeRange, setTimeRange] = React.useState(\"30d\")\n\n React.useEffect(() => {\n if (isMobile) {\n setTimeRange(\"7d\")\n }\n }, [isMobile])\n\n const filteredData = chartData.filter((item) => {\n const date = new Date(item.date)\n const referenceDate = new Date(\"2024-06-30\")\n let daysToSubtract = 90\n if (timeRange === \"30d\") {\n daysToSubtract = 30\n } else if (timeRange === \"7d\") {\n daysToSubtract = 7\n }\n const startDate = new Date(referenceDate)\n startDate.setDate(startDate.getDate() - daysToSubtract)\n return date >= startDate\n })\n\n return (\n \n \n Total Visitors\n \n \n Total for the last 3 months\n \n Last 3 months\n \n
\n \n \n Last 3 months\n \n \n Last 30 days\n \n \n Last 7 days\n \n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {\n const date = new Date(value)\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n })\n }}\n />\n {\n return new Date(value).toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n })\n }}\n indicator=\"dot\"\n />\n }\n />\n \n \n \n \n \n
\n )\n}\n", + "type": "registry:component", + "target": "" + }, + { + "path": "blocks/dashboard-01/components/data-table.tsx", + "content": "\"use client\"\n\nimport * as React from \"react\"\nimport {\n DndContext,\n KeyboardSensor,\n MouseSensor,\n TouchSensor,\n closestCenter,\n useSensor,\n useSensors,\n type DragEndEvent,\n type UniqueIdentifier,\n} from \"@dnd-kit/core\"\nimport { restrictToVerticalAxis } from \"@dnd-kit/modifiers\"\nimport {\n SortableContext,\n arrayMove,\n useSortable,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\"\nimport { CSS } from \"@dnd-kit/utilities\"\nimport {\n ColumnDef,\n ColumnFiltersState,\n Row,\n SortingState,\n VisibilityState,\n flexRender,\n getCoreRowModel,\n getFacetedRowModel,\n getFacetedUniqueValues,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n} from \"@tanstack/react-table\"\nimport {\n CheckCircle2Icon,\n CheckCircleIcon,\n ChevronDownIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n ChevronsLeftIcon,\n ChevronsRightIcon,\n ColumnsIcon,\n GripVerticalIcon,\n LoaderIcon,\n MoreVerticalIcon,\n PlusIcon,\n TrendingUpIcon,\n} from \"lucide-react\"\nimport { Area, AreaChart, CartesianGrid, XAxis } from \"recharts\"\nimport { toast } from \"sonner\"\nimport { z } from \"zod\"\n\nimport { useIsMobile } from \"@/registry/default/hooks/use-mobile\"\nimport { Badge } from \"@/registry/default/ui/badge\"\nimport { Button } from \"@/registry/default/ui/button\"\nimport {\n ChartConfig,\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n} from \"@/registry/default/ui/chart\"\nimport { Checkbox } from \"@/registry/default/ui/checkbox\"\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/registry/default/ui/dropdown-menu\"\nimport { Input } from \"@/registry/default/ui/input\"\nimport { Label } from \"@/registry/default/ui/label\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/default/ui/select\"\nimport { Separator } from \"@/registry/default/ui/separator\"\nimport {\n Sheet,\n SheetClose,\n SheetContent,\n SheetDescription,\n SheetFooter,\n SheetHeader,\n SheetTitle,\n SheetTrigger,\n} from \"@/registry/default/ui/sheet\"\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/registry/default/ui/table\"\nimport {\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from \"@/registry/default/ui/tabs\"\n\nexport const schema = z.object({\n id: z.number(),\n header: z.string(),\n type: z.string(),\n status: z.string(),\n target: z.string(),\n limit: z.string(),\n reviewer: z.string(),\n})\n\n// Create a separate component for the drag handle\nfunction DragHandle({ id }: { id: number }) {\n const { attributes, listeners } = useSortable({\n id,\n })\n\n return (\n \n \n Drag to reorder\n \n )\n}\n\nconst columns: ColumnDef>[] = [\n {\n id: \"drag\",\n header: () => null,\n cell: ({ row }) => ,\n },\n {\n id: \"select\",\n header: ({ table }) => (\n
\n table.toggleAllPageRowsSelected(!!value)}\n aria-label=\"Select all\"\n />\n
\n ),\n cell: ({ row }) => (\n
\n row.toggleSelected(!!value)}\n aria-label=\"Select row\"\n />\n
\n ),\n enableSorting: false,\n enableHiding: false,\n },\n {\n accessorKey: \"header\",\n header: \"Header\",\n cell: ({ row }) => {\n return \n },\n enableHiding: false,\n },\n {\n accessorKey: \"type\",\n header: \"Section Type\",\n cell: ({ row }) => (\n
\n \n {row.original.type}\n \n
\n ),\n },\n {\n accessorKey: \"status\",\n header: \"Status\",\n cell: ({ row }) => (\n \n {row.original.status === \"Done\" ? (\n \n ) : (\n \n )}\n {row.original.status}\n \n ),\n },\n {\n accessorKey: \"target\",\n header: () =>
Target
,\n cell: ({ row }) => (\n {\n e.preventDefault()\n toast.promise(new Promise((resolve) => setTimeout(resolve, 1000)), {\n loading: `Saving ${row.original.header}`,\n success: \"Done\",\n error: \"Error\",\n })\n }}\n >\n \n \n \n ),\n },\n {\n accessorKey: \"limit\",\n header: () =>
Limit
,\n cell: ({ row }) => (\n {\n e.preventDefault()\n toast.promise(new Promise((resolve) => setTimeout(resolve, 1000)), {\n loading: `Saving ${row.original.header}`,\n success: \"Done\",\n error: \"Error\",\n })\n }}\n >\n \n \n \n ),\n },\n {\n accessorKey: \"reviewer\",\n header: \"Reviewer\",\n cell: ({ row }) => {\n const isAssigned = row.original.reviewer !== \"Assign reviewer\"\n\n if (isAssigned) {\n return row.original.reviewer\n }\n\n return (\n <>\n \n \n \n )\n },\n },\n {\n id: \"actions\",\n cell: () => (\n \n \n \n \n Open menu\n \n \n \n Edit\n Make a copy\n Favorite\n \n Delete\n \n \n ),\n },\n]\n\nfunction DraggableRow({ row }: { row: Row> }) {\n const { transform, transition, setNodeRef, isDragging } = useSortable({\n id: row.original.id,\n })\n\n return (\n \n {row.getVisibleCells().map((cell) => (\n \n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n \n ))}\n \n )\n}\n\nexport function DataTable({\n data: initialData,\n}: {\n data: z.infer[]\n}) {\n const [data, setData] = React.useState(() => initialData)\n const [rowSelection, setRowSelection] = React.useState({})\n const [columnVisibility, setColumnVisibility] =\n React.useState({})\n const [columnFilters, setColumnFilters] = React.useState(\n []\n )\n const [sorting, setSorting] = React.useState([])\n const [pagination, setPagination] = React.useState({\n pageIndex: 0,\n pageSize: 10,\n })\n const sortableId = React.useId()\n const sensors = useSensors(\n useSensor(MouseSensor, {}),\n useSensor(TouchSensor, {}),\n useSensor(KeyboardSensor, {})\n )\n\n const dataIds = React.useMemo(\n () => data?.map(({ id }) => id) || [],\n [data]\n )\n\n const table = useReactTable({\n data,\n columns,\n state: {\n sorting,\n columnVisibility,\n rowSelection,\n columnFilters,\n pagination,\n },\n getRowId: (row) => row.id.toString(),\n enableRowSelection: true,\n onRowSelectionChange: setRowSelection,\n onSortingChange: setSorting,\n onColumnFiltersChange: setColumnFilters,\n onColumnVisibilityChange: setColumnVisibility,\n onPaginationChange: setPagination,\n getCoreRowModel: getCoreRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getFacetedRowModel: getFacetedRowModel(),\n getFacetedUniqueValues: getFacetedUniqueValues(),\n })\n\n function handleDragEnd(event: DragEndEvent) {\n const { active, over } = event\n if (active && over && active.id !== over.id) {\n setData((data) => {\n const oldIndex = dataIds.indexOf(active.id)\n const newIndex = dataIds.indexOf(over.id)\n return arrayMove(data, oldIndex, newIndex)\n })\n }\n }\n\n return (\n \n
\n \n \n \n Outline\n \n Past Performance{\" \"}\n \n 3\n \n \n \n Key Personnel{\" \"}\n \n 2\n \n \n Focus Documents\n \n
\n \n \n \n \n \n {table\n .getAllColumns()\n .filter(\n (column) =>\n typeof column.accessorFn !== \"undefined\" &&\n column.getCanHide()\n )\n .map((column) => {\n return (\n \n column.toggleVisibility(!!value)\n }\n >\n {column.id}\n \n )\n })}\n \n \n \n
\n
\n \n
\n \n \n \n {table.getHeaderGroups().map((headerGroup) => (\n \n {headerGroup.headers.map((header) => {\n return (\n \n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n \n )\n })}\n \n ))}\n \n \n {table.getRowModel().rows?.length ? (\n \n {table.getRowModel().rows.map((row) => (\n \n ))}\n \n ) : (\n \n \n No results.\n \n \n )}\n \n
\n \n
\n
\n
\n {table.getFilteredSelectedRowModel().rows.length} of{\" \"}\n {table.getFilteredRowModel().rows.length} row(s) selected.\n
\n
\n
\n \n {\n table.setPageSize(Number(value))\n }}\n >\n \n \n \n \n {[10, 20, 30, 40, 50].map((pageSize) => (\n \n {pageSize}\n \n ))}\n \n \n
\n
\n Page {table.getState().pagination.pageIndex + 1} of{\" \"}\n {table.getPageCount()}\n
\n
\n table.setPageIndex(0)}\n disabled={!table.getCanPreviousPage()}\n >\n Go to first page\n \n \n table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n >\n Go to previous page\n \n \n table.nextPage()}\n disabled={!table.getCanNextPage()}\n >\n Go to next page\n \n \n table.setPageIndex(table.getPageCount() - 1)}\n disabled={!table.getCanNextPage()}\n >\n Go to last page\n \n \n
\n
\n
\n \n \n
\n \n \n
\n
\n \n
\n \n \n )\n}\n\nconst chartData = [\n { month: \"January\", desktop: 186, mobile: 80 },\n { month: \"February\", desktop: 305, mobile: 200 },\n { month: \"March\", desktop: 237, mobile: 120 },\n { month: \"April\", desktop: 73, mobile: 190 },\n { month: \"May\", desktop: 209, mobile: 130 },\n { month: \"June\", desktop: 214, mobile: 140 },\n]\n\nconst chartConfig = {\n desktop: {\n label: \"Desktop\",\n color: \"var(--primary)\",\n },\n mobile: {\n label: \"Mobile\",\n color: \"var(--primary)\",\n },\n} satisfies ChartConfig\n\nfunction TableCellViewer({ item }: { item: z.infer }) {\n const isMobile = useIsMobile()\n\n return (\n \n \n \n \n \n \n {item.header}\n \n Showing total visitors for the last 6 months\n \n \n
\n {!isMobile && (\n <>\n \n \n \n value.slice(0, 3)}\n hide\n />\n }\n />\n \n \n \n \n \n
\n
\n Trending up by 5.2% this month{\" \"}\n \n
\n
\n Showing total visitors for the last 6 months. This is just\n some random text to test the layout. It spans multiple lines\n and should wrap around.\n
\n
\n \n \n )}\n
\n
\n \n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n \n \n
\n
\n
\n \n \n \n \n \n \n
\n
\n )\n}\n", + "type": "registry:component", + "target": "" + }, + { + "path": "blocks/dashboard-01/components/nav-documents.tsx", + "content": "\"use client\"\n\nimport {\n FolderIcon,\n MoreHorizontalIcon,\n ShareIcon,\n type LucideIcon,\n} from \"lucide-react\"\n\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@/registry/default/ui/dropdown-menu\"\nimport {\n SidebarGroup,\n SidebarGroupLabel,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuButton,\n SidebarMenuItem,\n useSidebar,\n} from \"@/registry/default/ui/sidebar\"\n\nexport function NavDocuments({\n items,\n}: {\n items: {\n name: string\n url: string\n icon: LucideIcon\n }[]\n}) {\n const { isMobile } = useSidebar()\n\n return (\n \n Documents\n \n {items.map((item) => (\n \n \n \n \n {item.name}\n \n \n \n \n \n \n More\n \n \n \n \n \n Open\n \n \n \n Share\n \n \n \n \n ))}\n \n \n \n More\n \n \n \n \n )\n}\n", + "type": "registry:component", + "target": "" + }, + { + "path": "blocks/dashboard-01/components/nav-main.tsx", + "content": "\"use client\"\n\nimport { MailIcon, PlusCircleIcon, type LucideIcon } from \"lucide-react\"\n\nimport { Button } from \"@/registry/default/ui/button\"\nimport {\n SidebarGroup,\n SidebarGroupContent,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n} from \"@/registry/default/ui/sidebar\"\n\nexport function NavMain({\n items,\n}: {\n items: {\n title: string\n url: string\n icon?: LucideIcon\n }[]\n}) {\n return (\n \n \n \n \n \n \n Quick Create\n \n \n \n Inbox\n \n \n \n \n {items.map((item) => (\n \n \n {item.icon && }\n {item.title}\n \n \n ))}\n \n \n \n )\n}\n", + "type": "registry:component", + "target": "" + }, + { + "path": "blocks/dashboard-01/components/nav-secondary.tsx", + "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { LucideIcon } from \"lucide-react\"\n\nimport {\n SidebarGroup,\n SidebarGroupContent,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n} from \"@/registry/default/ui/sidebar\"\n\nexport function NavSecondary({\n items,\n ...props\n}: {\n items: {\n title: string\n url: string\n icon: LucideIcon\n }[]\n} & React.ComponentPropsWithoutRef) {\n return (\n \n \n \n {items.map((item) => (\n \n \n \n \n {item.title}\n \n \n \n ))}\n \n \n \n )\n}\n", + "type": "registry:component", + "target": "" + }, + { + "path": "blocks/dashboard-01/components/nav-user.tsx", + "content": "\"use client\"\n\nimport {\n BellIcon,\n CreditCardIcon,\n LogOutIcon,\n MoreVerticalIcon,\n UserCircleIcon,\n} from \"lucide-react\"\n\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n} from \"@/registry/default/ui/avatar\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/registry/default/ui/dropdown-menu\"\nimport {\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n useSidebar,\n} from \"@/registry/default/ui/sidebar\"\n\nexport function NavUser({\n user,\n}: {\n user: {\n name: string\n email: string\n avatar: string\n }\n}) {\n const { isMobile } = useSidebar()\n\n return (\n \n \n \n \n \n \n \n CN\n \n
\n {user.name}\n \n {user.email}\n \n
\n \n \n
\n \n \n
\n \n \n CN\n \n
\n {user.name}\n \n {user.email}\n \n
\n
\n
\n \n \n \n \n Account\n \n \n \n Billing\n \n \n \n Notifications\n \n \n \n \n \n Log out\n \n \n
\n
\n
\n )\n}\n", + "type": "registry:component", + "target": "" + }, + { + "path": "blocks/dashboard-01/components/section-cards.tsx", + "content": "import { TrendingDownIcon, TrendingUpIcon } from \"lucide-react\"\n\nimport { Badge } from \"@/registry/default/ui/badge\"\nimport {\n Card,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n} from \"@/registry/default/ui/card\"\n\nexport function SectionCards() {\n return (\n
\n \n \n Total Revenue\n \n $1,250.00\n \n
\n \n \n +12.5%\n \n
\n
\n \n
\n Trending up this month \n
\n
\n Visitors for the last 6 months\n
\n
\n
\n \n \n New Customers\n \n 1,234\n \n
\n \n \n -20%\n \n
\n
\n \n
\n Down 20% this period \n
\n
\n Acquisition needs attention\n
\n
\n
\n \n \n Active Accounts\n \n 45,678\n \n
\n \n \n +12.5%\n \n
\n
\n \n
\n Strong user retention \n
\n
Engagement exceed targets
\n
\n
\n \n \n Growth Rate\n \n 4.5%\n \n
\n \n \n +4.5%\n \n
\n
\n \n
\n Steady performance \n
\n
Meets growth projections
\n
\n
\n
\n )\n}\n", + "type": "registry:component", + "target": "" + }, + { + "path": "blocks/dashboard-01/components/site-header.tsx", + "content": "import { Separator } from \"@/registry/default/ui/separator\"\nimport { SidebarTrigger } from \"@/registry/default/ui/sidebar\"\n\nexport function SiteHeader() {\n return (\n
\n
\n \n \n

Documents

\n
\n
\n )\n}\n", + "type": "registry:component", + "target": "" + } + ], + "categories": [ + "dashboard" + ] +} \ No newline at end of file diff --git a/apps/www/public/r/styles/new-york-v4/dashboard-01.json b/apps/www/public/r/styles/new-york-v4/dashboard-01.json new file mode 100644 index 0000000000..c2cff77439 --- /dev/null +++ b/apps/www/public/r/styles/new-york-v4/dashboard-01.json @@ -0,0 +1,98 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "dashboard-01", + "type": "registry:block", + "description": "A dashboard with sidebar, charts and data table.", + "dependencies": [ + "@dnd-kit/core", + "@dnd-kit/modifiers", + "@dnd-kit/sortable", + "@dnd-kit/utilities", + "@tanstack/react-table", + "zod", + "@tabler/icons-react" + ], + "registryDependencies": [ + "sidebar", + "breadcrumb", + "separator", + "label", + "chart", + "card", + "select", + "tabs", + "table", + "toggle-group", + "badge", + "button", + "checkbox", + "dropdown-menu", + "drawer", + "input", + "avatar", + "sheet", + "sonner" + ], + "files": [ + { + "path": "registry/new-york-v4/blocks/dashboard-01/page.tsx", + "content": "import { AppSidebar } from \"@/registry/new-york-v4/blocks/dashboard-01/components/app-sidebar\"\nimport { ChartAreaInteractive } from \"@/registry/new-york-v4/blocks/dashboard-01/components/chart-area-interactive\"\nimport { DataTable } from \"@/registry/new-york-v4/blocks/dashboard-01/components/data-table\"\nimport { SectionCards } from \"@/registry/new-york-v4/blocks/dashboard-01/components/section-cards\"\nimport { SiteHeader } from \"@/registry/new-york-v4/blocks/dashboard-01/components/site-header\"\nimport {\n SidebarInset,\n SidebarProvider,\n} from \"@/registry/new-york-v4/ui/sidebar\"\n\nimport data from \"./data.json\"\n\nexport default function Page() {\n return (\n \n \n \n \n
\n
\n
\n \n
\n \n
\n \n
\n
\n
\n
\n \n )\n}\n", + "type": "registry:page", + "target": "app/dashboard/page.tsx" + }, + { + "path": "registry/new-york-v4/blocks/dashboard-01/data.json", + "content": "[\n {\n \"id\": 1,\n \"header\": \"Cover page\",\n \"type\": \"Cover page\",\n \"status\": \"In Process\",\n \"target\": \"18\",\n \"limit\": \"5\",\n \"reviewer\": \"Eddie Lake\"\n },\n {\n \"id\": 2,\n \"header\": \"Table of contents\",\n \"type\": \"Table of contents\",\n \"status\": \"Done\",\n \"target\": \"29\",\n \"limit\": \"24\",\n \"reviewer\": \"Eddie Lake\"\n },\n {\n \"id\": 3,\n \"header\": \"Executive summary\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"10\",\n \"limit\": \"13\",\n \"reviewer\": \"Eddie Lake\"\n },\n {\n \"id\": 4,\n \"header\": \"Technical approach\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"27\",\n \"limit\": \"23\",\n \"reviewer\": \"Jamik Tashpulatov\"\n },\n {\n \"id\": 5,\n \"header\": \"Design\",\n \"type\": \"Narrative\",\n \"status\": \"In Process\",\n \"target\": \"2\",\n \"limit\": \"16\",\n \"reviewer\": \"Jamik Tashpulatov\"\n },\n {\n \"id\": 6,\n \"header\": \"Capabilities\",\n \"type\": \"Narrative\",\n \"status\": \"In Process\",\n \"target\": \"20\",\n \"limit\": \"8\",\n \"reviewer\": \"Jamik Tashpulatov\"\n },\n {\n \"id\": 7,\n \"header\": \"Integration with existing systems\",\n \"type\": \"Narrative\",\n \"status\": \"In Process\",\n \"target\": \"19\",\n \"limit\": \"21\",\n \"reviewer\": \"Jamik Tashpulatov\"\n },\n {\n \"id\": 8,\n \"header\": \"Innovation and Advantages\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"25\",\n \"limit\": \"26\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 9,\n \"header\": \"Overview of EMR's Innovative Solutions\",\n \"type\": \"Technical content\",\n \"status\": \"Done\",\n \"target\": \"7\",\n \"limit\": \"23\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 10,\n \"header\": \"Advanced Algorithms and Machine Learning\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"30\",\n \"limit\": \"28\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 11,\n \"header\": \"Adaptive Communication Protocols\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"9\",\n \"limit\": \"31\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 12,\n \"header\": \"Advantages Over Current Technologies\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"12\",\n \"limit\": \"0\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 13,\n \"header\": \"Past Performance\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"22\",\n \"limit\": \"33\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 14,\n \"header\": \"Customer Feedback and Satisfaction Levels\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"15\",\n \"limit\": \"34\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 15,\n \"header\": \"Implementation Challenges and Solutions\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"3\",\n \"limit\": \"35\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 16,\n \"header\": \"Security Measures and Data Protection Policies\",\n \"type\": \"Narrative\",\n \"status\": \"In Process\",\n \"target\": \"6\",\n \"limit\": \"36\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 17,\n \"header\": \"Scalability and Future Proofing\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"4\",\n \"limit\": \"37\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 18,\n \"header\": \"Cost-Benefit Analysis\",\n \"type\": \"Plain language\",\n \"status\": \"Done\",\n \"target\": \"14\",\n \"limit\": \"38\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 19,\n \"header\": \"User Training and Onboarding Experience\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"17\",\n \"limit\": \"39\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 20,\n \"header\": \"Future Development Roadmap\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"11\",\n \"limit\": \"40\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 21,\n \"header\": \"System Architecture Overview\",\n \"type\": \"Technical content\",\n \"status\": \"In Process\",\n \"target\": \"24\",\n \"limit\": \"18\",\n \"reviewer\": \"Maya Johnson\"\n },\n {\n \"id\": 22,\n \"header\": \"Risk Management Plan\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"15\",\n \"limit\": \"22\",\n \"reviewer\": \"Carlos Rodriguez\"\n },\n {\n \"id\": 23,\n \"header\": \"Compliance Documentation\",\n \"type\": \"Legal\",\n \"status\": \"In Process\",\n \"target\": \"31\",\n \"limit\": \"27\",\n \"reviewer\": \"Sarah Chen\"\n },\n {\n \"id\": 24,\n \"header\": \"API Documentation\",\n \"type\": \"Technical content\",\n \"status\": \"Done\",\n \"target\": \"8\",\n \"limit\": \"12\",\n \"reviewer\": \"Raj Patel\"\n },\n {\n \"id\": 25,\n \"header\": \"User Interface Mockups\",\n \"type\": \"Visual\",\n \"status\": \"In Process\",\n \"target\": \"19\",\n \"limit\": \"25\",\n \"reviewer\": \"Leila Ahmadi\"\n },\n {\n \"id\": 26,\n \"header\": \"Database Schema\",\n \"type\": \"Technical content\",\n \"status\": \"Done\",\n \"target\": \"22\",\n \"limit\": \"20\",\n \"reviewer\": \"Thomas Wilson\"\n },\n {\n \"id\": 27,\n \"header\": \"Testing Methodology\",\n \"type\": \"Technical content\",\n \"status\": \"In Process\",\n \"target\": \"17\",\n \"limit\": \"14\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 28,\n \"header\": \"Deployment Strategy\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"26\",\n \"limit\": \"30\",\n \"reviewer\": \"Eddie Lake\"\n },\n {\n \"id\": 29,\n \"header\": \"Budget Breakdown\",\n \"type\": \"Financial\",\n \"status\": \"In Process\",\n \"target\": \"13\",\n \"limit\": \"16\",\n \"reviewer\": \"Jamik Tashpulatov\"\n },\n {\n \"id\": 30,\n \"header\": \"Market Analysis\",\n \"type\": \"Research\",\n \"status\": \"Done\",\n \"target\": \"29\",\n \"limit\": \"32\",\n \"reviewer\": \"Sophia Martinez\"\n },\n {\n \"id\": 31,\n \"header\": \"Competitor Comparison\",\n \"type\": \"Research\",\n \"status\": \"In Process\",\n \"target\": \"21\",\n \"limit\": \"19\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 32,\n \"header\": \"Maintenance Plan\",\n \"type\": \"Technical content\",\n \"status\": \"Done\",\n \"target\": \"16\",\n \"limit\": \"23\",\n \"reviewer\": \"Alex Thompson\"\n },\n {\n \"id\": 33,\n \"header\": \"User Personas\",\n \"type\": \"Research\",\n \"status\": \"In Process\",\n \"target\": \"27\",\n \"limit\": \"24\",\n \"reviewer\": \"Nina Patel\"\n },\n {\n \"id\": 34,\n \"header\": \"Accessibility Compliance\",\n \"type\": \"Legal\",\n \"status\": \"Done\",\n \"target\": \"18\",\n \"limit\": \"21\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 35,\n \"header\": \"Performance Metrics\",\n \"type\": \"Technical content\",\n \"status\": \"In Process\",\n \"target\": \"23\",\n \"limit\": \"26\",\n \"reviewer\": \"David Kim\"\n },\n {\n \"id\": 36,\n \"header\": \"Disaster Recovery Plan\",\n \"type\": \"Technical content\",\n \"status\": \"Done\",\n \"target\": \"14\",\n \"limit\": \"17\",\n \"reviewer\": \"Jamik Tashpulatov\"\n },\n {\n \"id\": 37,\n \"header\": \"Third-party Integrations\",\n \"type\": \"Technical content\",\n \"status\": \"In Process\",\n \"target\": \"25\",\n \"limit\": \"28\",\n \"reviewer\": \"Eddie Lake\"\n },\n {\n \"id\": 38,\n \"header\": \"User Feedback Summary\",\n \"type\": \"Research\",\n \"status\": \"Done\",\n \"target\": \"20\",\n \"limit\": \"15\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 39,\n \"header\": \"Localization Strategy\",\n \"type\": \"Narrative\",\n \"status\": \"In Process\",\n \"target\": \"12\",\n \"limit\": \"19\",\n \"reviewer\": \"Maria Garcia\"\n },\n {\n \"id\": 40,\n \"header\": \"Mobile Compatibility\",\n \"type\": \"Technical content\",\n \"status\": \"Done\",\n \"target\": \"28\",\n \"limit\": \"31\",\n \"reviewer\": \"James Wilson\"\n },\n {\n \"id\": 41,\n \"header\": \"Data Migration Plan\",\n \"type\": \"Technical content\",\n \"status\": \"In Process\",\n \"target\": \"19\",\n \"limit\": \"22\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 42,\n \"header\": \"Quality Assurance Protocols\",\n \"type\": \"Technical content\",\n \"status\": \"Done\",\n \"target\": \"30\",\n \"limit\": \"33\",\n \"reviewer\": \"Priya Singh\"\n },\n {\n \"id\": 43,\n \"header\": \"Stakeholder Analysis\",\n \"type\": \"Research\",\n \"status\": \"In Process\",\n \"target\": \"11\",\n \"limit\": \"14\",\n \"reviewer\": \"Eddie Lake\"\n },\n {\n \"id\": 44,\n \"header\": \"Environmental Impact Assessment\",\n \"type\": \"Research\",\n \"status\": \"Done\",\n \"target\": \"24\",\n \"limit\": \"27\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 45,\n \"header\": \"Intellectual Property Rights\",\n \"type\": \"Legal\",\n \"status\": \"In Process\",\n \"target\": \"17\",\n \"limit\": \"20\",\n \"reviewer\": \"Sarah Johnson\"\n },\n {\n \"id\": 46,\n \"header\": \"Customer Support Framework\",\n \"type\": \"Narrative\",\n \"status\": \"Done\",\n \"target\": \"22\",\n \"limit\": \"25\",\n \"reviewer\": \"Jamik Tashpulatov\"\n },\n {\n \"id\": 47,\n \"header\": \"Version Control Strategy\",\n \"type\": \"Technical content\",\n \"status\": \"In Process\",\n \"target\": \"15\",\n \"limit\": \"18\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 48,\n \"header\": \"Continuous Integration Pipeline\",\n \"type\": \"Technical content\",\n \"status\": \"Done\",\n \"target\": \"26\",\n \"limit\": \"29\",\n \"reviewer\": \"Michael Chen\"\n },\n {\n \"id\": 49,\n \"header\": \"Regulatory Compliance\",\n \"type\": \"Legal\",\n \"status\": \"In Process\",\n \"target\": \"13\",\n \"limit\": \"16\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 50,\n \"header\": \"User Authentication System\",\n \"type\": \"Technical content\",\n \"status\": \"Done\",\n \"target\": \"28\",\n \"limit\": \"31\",\n \"reviewer\": \"Eddie Lake\"\n },\n {\n \"id\": 51,\n \"header\": \"Data Analytics Framework\",\n \"type\": \"Technical content\",\n \"status\": \"In Process\",\n \"target\": \"21\",\n \"limit\": \"24\",\n \"reviewer\": \"Jamik Tashpulatov\"\n },\n {\n \"id\": 52,\n \"header\": \"Cloud Infrastructure\",\n \"type\": \"Technical content\",\n \"status\": \"Done\",\n \"target\": \"16\",\n \"limit\": \"19\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 53,\n \"header\": \"Network Security Measures\",\n \"type\": \"Technical content\",\n \"status\": \"In Process\",\n \"target\": \"29\",\n \"limit\": \"32\",\n \"reviewer\": \"Lisa Wong\"\n },\n {\n \"id\": 54,\n \"header\": \"Project Timeline\",\n \"type\": \"Planning\",\n \"status\": \"Done\",\n \"target\": \"14\",\n \"limit\": \"17\",\n \"reviewer\": \"Eddie Lake\"\n },\n {\n \"id\": 55,\n \"header\": \"Resource Allocation\",\n \"type\": \"Planning\",\n \"status\": \"In Process\",\n \"target\": \"27\",\n \"limit\": \"30\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 56,\n \"header\": \"Team Structure and Roles\",\n \"type\": \"Planning\",\n \"status\": \"Done\",\n \"target\": \"20\",\n \"limit\": \"23\",\n \"reviewer\": \"Jamik Tashpulatov\"\n },\n {\n \"id\": 57,\n \"header\": \"Communication Protocols\",\n \"type\": \"Planning\",\n \"status\": \"In Process\",\n \"target\": \"15\",\n \"limit\": \"18\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 58,\n \"header\": \"Success Metrics\",\n \"type\": \"Planning\",\n \"status\": \"Done\",\n \"target\": \"30\",\n \"limit\": \"33\",\n \"reviewer\": \"Eddie Lake\"\n },\n {\n \"id\": 59,\n \"header\": \"Internationalization Support\",\n \"type\": \"Technical content\",\n \"status\": \"In Process\",\n \"target\": \"23\",\n \"limit\": \"26\",\n \"reviewer\": \"Jamik Tashpulatov\"\n },\n {\n \"id\": 60,\n \"header\": \"Backup and Recovery Procedures\",\n \"type\": \"Technical content\",\n \"status\": \"Done\",\n \"target\": \"18\",\n \"limit\": \"21\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 61,\n \"header\": \"Monitoring and Alerting System\",\n \"type\": \"Technical content\",\n \"status\": \"In Process\",\n \"target\": \"25\",\n \"limit\": \"28\",\n \"reviewer\": \"Daniel Park\"\n },\n {\n \"id\": 62,\n \"header\": \"Code Review Guidelines\",\n \"type\": \"Technical content\",\n \"status\": \"Done\",\n \"target\": \"12\",\n \"limit\": \"15\",\n \"reviewer\": \"Eddie Lake\"\n },\n {\n \"id\": 63,\n \"header\": \"Documentation Standards\",\n \"type\": \"Technical content\",\n \"status\": \"In Process\",\n \"target\": \"27\",\n \"limit\": \"30\",\n \"reviewer\": \"Jamik Tashpulatov\"\n },\n {\n \"id\": 64,\n \"header\": \"Release Management Process\",\n \"type\": \"Planning\",\n \"status\": \"Done\",\n \"target\": \"22\",\n \"limit\": \"25\",\n \"reviewer\": \"Assign reviewer\"\n },\n {\n \"id\": 65,\n \"header\": \"Feature Prioritization Matrix\",\n \"type\": \"Planning\",\n \"status\": \"In Process\",\n \"target\": \"19\",\n \"limit\": \"22\",\n \"reviewer\": \"Emma Davis\"\n },\n {\n \"id\": 66,\n \"header\": \"Technical Debt Assessment\",\n \"type\": \"Technical content\",\n \"status\": \"Done\",\n \"target\": \"24\",\n \"limit\": \"27\",\n \"reviewer\": \"Eddie Lake\"\n },\n {\n \"id\": 67,\n \"header\": \"Capacity Planning\",\n \"type\": \"Planning\",\n \"status\": \"In Process\",\n \"target\": \"21\",\n \"limit\": \"24\",\n \"reviewer\": \"Jamik Tashpulatov\"\n },\n {\n \"id\": 68,\n \"header\": \"Service Level Agreements\",\n \"type\": \"Legal\",\n \"status\": \"Done\",\n \"target\": \"26\",\n \"limit\": \"29\",\n \"reviewer\": \"Assign reviewer\"\n }\n]\n", + "type": "registry:file", + "target": "app/dashboard/data.json" + }, + { + "path": "registry/new-york-v4/blocks/dashboard-01/components/app-sidebar.tsx", + "content": "\"use client\"\n\nimport * as React from \"react\"\nimport {\n IconCamera,\n IconChartBar,\n IconDashboard,\n IconDatabase,\n IconFileAi,\n IconFileDescription,\n IconFileWord,\n IconFolder,\n IconHelp,\n IconInnerShadowTop,\n IconListDetails,\n IconReport,\n IconSearch,\n IconSettings,\n IconUsers,\n} from \"@tabler/icons-react\"\n\nimport { NavDocuments } from \"@/registry/new-york-v4/blocks/dashboard-01/components/nav-documents\"\nimport { NavMain } from \"@/registry/new-york-v4/blocks/dashboard-01/components/nav-main\"\nimport { NavSecondary } from \"@/registry/new-york-v4/blocks/dashboard-01/components/nav-secondary\"\nimport { NavUser } from \"@/registry/new-york-v4/blocks/dashboard-01/components/nav-user\"\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarHeader,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n} from \"@/registry/new-york-v4/ui/sidebar\"\n\nconst data = {\n user: {\n name: \"shadcn\",\n email: \"m@example.com\",\n avatar: \"/avatars/shadcn.jpg\",\n },\n navMain: [\n {\n title: \"Dashboard\",\n url: \"#\",\n icon: IconDashboard,\n },\n {\n title: \"Lifecycle\",\n url: \"#\",\n icon: IconListDetails,\n },\n {\n title: \"Analytics\",\n url: \"#\",\n icon: IconChartBar,\n },\n {\n title: \"Projects\",\n url: \"#\",\n icon: IconFolder,\n },\n {\n title: \"Team\",\n url: \"#\",\n icon: IconUsers,\n },\n ],\n navClouds: [\n {\n title: \"Capture\",\n icon: IconCamera,\n isActive: true,\n url: \"#\",\n items: [\n {\n title: \"Active Proposals\",\n url: \"#\",\n },\n {\n title: \"Archived\",\n url: \"#\",\n },\n ],\n },\n {\n title: \"Proposal\",\n icon: IconFileDescription,\n url: \"#\",\n items: [\n {\n title: \"Active Proposals\",\n url: \"#\",\n },\n {\n title: \"Archived\",\n url: \"#\",\n },\n ],\n },\n {\n title: \"Prompts\",\n icon: IconFileAi,\n url: \"#\",\n items: [\n {\n title: \"Active Proposals\",\n url: \"#\",\n },\n {\n title: \"Archived\",\n url: \"#\",\n },\n ],\n },\n ],\n navSecondary: [\n {\n title: \"Settings\",\n url: \"#\",\n icon: IconSettings,\n },\n {\n title: \"Get Help\",\n url: \"#\",\n icon: IconHelp,\n },\n {\n title: \"Search\",\n url: \"#\",\n icon: IconSearch,\n },\n ],\n documents: [\n {\n name: \"Data Library\",\n url: \"#\",\n icon: IconDatabase,\n },\n {\n name: \"Reports\",\n url: \"#\",\n icon: IconReport,\n },\n {\n name: \"Word Assistant\",\n url: \"#\",\n icon: IconFileWord,\n },\n ],\n}\n\nexport function AppSidebar({ ...props }: React.ComponentProps) {\n return (\n \n \n \n \n \n \n \n Acme Inc.\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n", + "type": "registry:component" + }, + { + "path": "registry/new-york-v4/blocks/dashboard-01/components/chart-area-interactive.tsx", + "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { Area, AreaChart, CartesianGrid, XAxis } from \"recharts\"\n\nimport { useIsMobile } from \"@/registry/new-york-v4/hooks/use-mobile\"\nimport {\n Card,\n CardAction,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"@/registry/new-york-v4/ui/card\"\nimport {\n ChartConfig,\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n} from \"@/registry/new-york-v4/ui/chart\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/new-york-v4/ui/select\"\nimport {\n ToggleGroup,\n ToggleGroupItem,\n} from \"@/registry/new-york-v4/ui/toggle-group\"\n\nexport const description = \"An interactive area chart\"\n\nconst chartData = [\n { date: \"2024-04-01\", desktop: 222, mobile: 150 },\n { date: \"2024-04-02\", desktop: 97, mobile: 180 },\n { date: \"2024-04-03\", desktop: 167, mobile: 120 },\n { date: \"2024-04-04\", desktop: 242, mobile: 260 },\n { date: \"2024-04-05\", desktop: 373, mobile: 290 },\n { date: \"2024-04-06\", desktop: 301, mobile: 340 },\n { date: \"2024-04-07\", desktop: 245, mobile: 180 },\n { date: \"2024-04-08\", desktop: 409, mobile: 320 },\n { date: \"2024-04-09\", desktop: 59, mobile: 110 },\n { date: \"2024-04-10\", desktop: 261, mobile: 190 },\n { date: \"2024-04-11\", desktop: 327, mobile: 350 },\n { date: \"2024-04-12\", desktop: 292, mobile: 210 },\n { date: \"2024-04-13\", desktop: 342, mobile: 380 },\n { date: \"2024-04-14\", desktop: 137, mobile: 220 },\n { date: \"2024-04-15\", desktop: 120, mobile: 170 },\n { date: \"2024-04-16\", desktop: 138, mobile: 190 },\n { date: \"2024-04-17\", desktop: 446, mobile: 360 },\n { date: \"2024-04-18\", desktop: 364, mobile: 410 },\n { date: \"2024-04-19\", desktop: 243, mobile: 180 },\n { date: \"2024-04-20\", desktop: 89, mobile: 150 },\n { date: \"2024-04-21\", desktop: 137, mobile: 200 },\n { date: \"2024-04-22\", desktop: 224, mobile: 170 },\n { date: \"2024-04-23\", desktop: 138, mobile: 230 },\n { date: \"2024-04-24\", desktop: 387, mobile: 290 },\n { date: \"2024-04-25\", desktop: 215, mobile: 250 },\n { date: \"2024-04-26\", desktop: 75, mobile: 130 },\n { date: \"2024-04-27\", desktop: 383, mobile: 420 },\n { date: \"2024-04-28\", desktop: 122, mobile: 180 },\n { date: \"2024-04-29\", desktop: 315, mobile: 240 },\n { date: \"2024-04-30\", desktop: 454, mobile: 380 },\n { date: \"2024-05-01\", desktop: 165, mobile: 220 },\n { date: \"2024-05-02\", desktop: 293, mobile: 310 },\n { date: \"2024-05-03\", desktop: 247, mobile: 190 },\n { date: \"2024-05-04\", desktop: 385, mobile: 420 },\n { date: \"2024-05-05\", desktop: 481, mobile: 390 },\n { date: \"2024-05-06\", desktop: 498, mobile: 520 },\n { date: \"2024-05-07\", desktop: 388, mobile: 300 },\n { date: \"2024-05-08\", desktop: 149, mobile: 210 },\n { date: \"2024-05-09\", desktop: 227, mobile: 180 },\n { date: \"2024-05-10\", desktop: 293, mobile: 330 },\n { date: \"2024-05-11\", desktop: 335, mobile: 270 },\n { date: \"2024-05-12\", desktop: 197, mobile: 240 },\n { date: \"2024-05-13\", desktop: 197, mobile: 160 },\n { date: \"2024-05-14\", desktop: 448, mobile: 490 },\n { date: \"2024-05-15\", desktop: 473, mobile: 380 },\n { date: \"2024-05-16\", desktop: 338, mobile: 400 },\n { date: \"2024-05-17\", desktop: 499, mobile: 420 },\n { date: \"2024-05-18\", desktop: 315, mobile: 350 },\n { date: \"2024-05-19\", desktop: 235, mobile: 180 },\n { date: \"2024-05-20\", desktop: 177, mobile: 230 },\n { date: \"2024-05-21\", desktop: 82, mobile: 140 },\n { date: \"2024-05-22\", desktop: 81, mobile: 120 },\n { date: \"2024-05-23\", desktop: 252, mobile: 290 },\n { date: \"2024-05-24\", desktop: 294, mobile: 220 },\n { date: \"2024-05-25\", desktop: 201, mobile: 250 },\n { date: \"2024-05-26\", desktop: 213, mobile: 170 },\n { date: \"2024-05-27\", desktop: 420, mobile: 460 },\n { date: \"2024-05-28\", desktop: 233, mobile: 190 },\n { date: \"2024-05-29\", desktop: 78, mobile: 130 },\n { date: \"2024-05-30\", desktop: 340, mobile: 280 },\n { date: \"2024-05-31\", desktop: 178, mobile: 230 },\n { date: \"2024-06-01\", desktop: 178, mobile: 200 },\n { date: \"2024-06-02\", desktop: 470, mobile: 410 },\n { date: \"2024-06-03\", desktop: 103, mobile: 160 },\n { date: \"2024-06-04\", desktop: 439, mobile: 380 },\n { date: \"2024-06-05\", desktop: 88, mobile: 140 },\n { date: \"2024-06-06\", desktop: 294, mobile: 250 },\n { date: \"2024-06-07\", desktop: 323, mobile: 370 },\n { date: \"2024-06-08\", desktop: 385, mobile: 320 },\n { date: \"2024-06-09\", desktop: 438, mobile: 480 },\n { date: \"2024-06-10\", desktop: 155, mobile: 200 },\n { date: \"2024-06-11\", desktop: 92, mobile: 150 },\n { date: \"2024-06-12\", desktop: 492, mobile: 420 },\n { date: \"2024-06-13\", desktop: 81, mobile: 130 },\n { date: \"2024-06-14\", desktop: 426, mobile: 380 },\n { date: \"2024-06-15\", desktop: 307, mobile: 350 },\n { date: \"2024-06-16\", desktop: 371, mobile: 310 },\n { date: \"2024-06-17\", desktop: 475, mobile: 520 },\n { date: \"2024-06-18\", desktop: 107, mobile: 170 },\n { date: \"2024-06-19\", desktop: 341, mobile: 290 },\n { date: \"2024-06-20\", desktop: 408, mobile: 450 },\n { date: \"2024-06-21\", desktop: 169, mobile: 210 },\n { date: \"2024-06-22\", desktop: 317, mobile: 270 },\n { date: \"2024-06-23\", desktop: 480, mobile: 530 },\n { date: \"2024-06-24\", desktop: 132, mobile: 180 },\n { date: \"2024-06-25\", desktop: 141, mobile: 190 },\n { date: \"2024-06-26\", desktop: 434, mobile: 380 },\n { date: \"2024-06-27\", desktop: 448, mobile: 490 },\n { date: \"2024-06-28\", desktop: 149, mobile: 200 },\n { date: \"2024-06-29\", desktop: 103, mobile: 160 },\n { date: \"2024-06-30\", desktop: 446, mobile: 400 },\n]\n\nconst chartConfig = {\n visitors: {\n label: \"Visitors\",\n },\n desktop: {\n label: \"Desktop\",\n color: \"var(--primary)\",\n },\n mobile: {\n label: \"Mobile\",\n color: \"var(--primary)\",\n },\n} satisfies ChartConfig\n\nexport function ChartAreaInteractive() {\n const isMobile = useIsMobile()\n const [timeRange, setTimeRange] = React.useState(\"90d\")\n\n React.useEffect(() => {\n if (isMobile) {\n setTimeRange(\"7d\")\n }\n }, [isMobile])\n\n const filteredData = chartData.filter((item) => {\n const date = new Date(item.date)\n const referenceDate = new Date(\"2024-06-30\")\n let daysToSubtract = 90\n if (timeRange === \"30d\") {\n daysToSubtract = 30\n } else if (timeRange === \"7d\") {\n daysToSubtract = 7\n }\n const startDate = new Date(referenceDate)\n startDate.setDate(startDate.getDate() - daysToSubtract)\n return date >= startDate\n })\n\n return (\n \n \n Total Visitors\n \n \n Total for the last 3 months\n \n Last 3 months\n \n \n \n Last 3 months\n Last 30 days\n Last 7 days\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {\n const date = new Date(value)\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n })\n }}\n />\n {\n return new Date(value).toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n })\n }}\n indicator=\"dot\"\n />\n }\n />\n \n \n \n \n \n \n )\n}\n", + "type": "registry:component" + }, + { + "path": "registry/new-york-v4/blocks/dashboard-01/components/data-table.tsx", + "content": "\"use client\"\n\nimport * as React from \"react\"\nimport {\n DndContext,\n KeyboardSensor,\n MouseSensor,\n TouchSensor,\n closestCenter,\n useSensor,\n useSensors,\n type DragEndEvent,\n type UniqueIdentifier,\n} from \"@dnd-kit/core\"\nimport { restrictToVerticalAxis } from \"@dnd-kit/modifiers\"\nimport {\n SortableContext,\n arrayMove,\n useSortable,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\"\nimport { CSS } from \"@dnd-kit/utilities\"\nimport {\n IconChevronDown,\n IconChevronLeft,\n IconChevronRight,\n IconChevronsLeft,\n IconChevronsRight,\n IconCircleCheckFilled,\n IconDotsVertical,\n IconGripVertical,\n IconLayoutColumns,\n IconLoader,\n IconPlus,\n IconTrendingUp,\n} from \"@tabler/icons-react\"\nimport {\n ColumnDef,\n ColumnFiltersState,\n Row,\n SortingState,\n VisibilityState,\n flexRender,\n getCoreRowModel,\n getFacetedRowModel,\n getFacetedUniqueValues,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n} from \"@tanstack/react-table\"\nimport { Area, AreaChart, CartesianGrid, XAxis } from \"recharts\"\nimport { toast } from \"sonner\"\nimport { z } from \"zod\"\n\nimport { useIsMobile } from \"@/registry/new-york-v4/hooks/use-mobile\"\nimport { Badge } from \"@/registry/new-york-v4/ui/badge\"\nimport { Button } from \"@/registry/new-york-v4/ui/button\"\nimport {\n ChartConfig,\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n} from \"@/registry/new-york-v4/ui/chart\"\nimport { Checkbox } from \"@/registry/new-york-v4/ui/checkbox\"\nimport {\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@/registry/new-york-v4/ui/drawer\"\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/registry/new-york-v4/ui/dropdown-menu\"\nimport { Input } from \"@/registry/new-york-v4/ui/input\"\nimport { Label } from \"@/registry/new-york-v4/ui/label\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/new-york-v4/ui/select\"\nimport { Separator } from \"@/registry/new-york-v4/ui/separator\"\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/registry/new-york-v4/ui/table\"\nimport {\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from \"@/registry/new-york-v4/ui/tabs\"\n\nexport const schema = z.object({\n id: z.number(),\n header: z.string(),\n type: z.string(),\n status: z.string(),\n target: z.string(),\n limit: z.string(),\n reviewer: z.string(),\n})\n\n// Create a separate component for the drag handle\nfunction DragHandle({ id }: { id: number }) {\n const { attributes, listeners } = useSortable({\n id,\n })\n\n return (\n \n \n Drag to reorder\n \n )\n}\n\nconst columns: ColumnDef>[] = [\n {\n id: \"drag\",\n header: () => null,\n cell: ({ row }) => ,\n },\n {\n id: \"select\",\n header: ({ table }) => (\n
\n table.toggleAllPageRowsSelected(!!value)}\n aria-label=\"Select all\"\n />\n
\n ),\n cell: ({ row }) => (\n
\n row.toggleSelected(!!value)}\n aria-label=\"Select row\"\n />\n
\n ),\n enableSorting: false,\n enableHiding: false,\n },\n {\n accessorKey: \"header\",\n header: \"Header\",\n cell: ({ row }) => {\n return \n },\n enableHiding: false,\n },\n {\n accessorKey: \"type\",\n header: \"Section Type\",\n cell: ({ row }) => (\n
\n \n {row.original.type}\n \n
\n ),\n },\n {\n accessorKey: \"status\",\n header: \"Status\",\n cell: ({ row }) => (\n \n {row.original.status === \"Done\" ? (\n \n ) : (\n \n )}\n {row.original.status}\n \n ),\n },\n {\n accessorKey: \"target\",\n header: () =>
Target
,\n cell: ({ row }) => (\n {\n e.preventDefault()\n toast.promise(new Promise((resolve) => setTimeout(resolve, 1000)), {\n loading: `Saving ${row.original.header}`,\n success: \"Done\",\n error: \"Error\",\n })\n }}\n >\n \n \n \n ),\n },\n {\n accessorKey: \"limit\",\n header: () =>
Limit
,\n cell: ({ row }) => (\n {\n e.preventDefault()\n toast.promise(new Promise((resolve) => setTimeout(resolve, 1000)), {\n loading: `Saving ${row.original.header}`,\n success: \"Done\",\n error: \"Error\",\n })\n }}\n >\n \n \n \n ),\n },\n {\n accessorKey: \"reviewer\",\n header: \"Reviewer\",\n cell: ({ row }) => {\n const isAssigned = row.original.reviewer !== \"Assign reviewer\"\n\n if (isAssigned) {\n return row.original.reviewer\n }\n\n return (\n <>\n \n \n \n )\n },\n },\n {\n id: \"actions\",\n cell: () => (\n \n \n \n \n Open menu\n \n \n \n Edit\n Make a copy\n Favorite\n \n Delete\n \n \n ),\n },\n]\n\nfunction DraggableRow({ row }: { row: Row> }) {\n const { transform, transition, setNodeRef, isDragging } = useSortable({\n id: row.original.id,\n })\n\n return (\n \n {row.getVisibleCells().map((cell) => (\n \n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n \n ))}\n \n )\n}\n\nexport function DataTable({\n data: initialData,\n}: {\n data: z.infer[]\n}) {\n const [data, setData] = React.useState(() => initialData)\n const [rowSelection, setRowSelection] = React.useState({})\n const [columnVisibility, setColumnVisibility] =\n React.useState({})\n const [columnFilters, setColumnFilters] = React.useState(\n []\n )\n const [sorting, setSorting] = React.useState([])\n const [pagination, setPagination] = React.useState({\n pageIndex: 0,\n pageSize: 10,\n })\n const sortableId = React.useId()\n const sensors = useSensors(\n useSensor(MouseSensor, {}),\n useSensor(TouchSensor, {}),\n useSensor(KeyboardSensor, {})\n )\n\n const dataIds = React.useMemo(\n () => data?.map(({ id }) => id) || [],\n [data]\n )\n\n const table = useReactTable({\n data,\n columns,\n state: {\n sorting,\n columnVisibility,\n rowSelection,\n columnFilters,\n pagination,\n },\n getRowId: (row) => row.id.toString(),\n enableRowSelection: true,\n onRowSelectionChange: setRowSelection,\n onSortingChange: setSorting,\n onColumnFiltersChange: setColumnFilters,\n onColumnVisibilityChange: setColumnVisibility,\n onPaginationChange: setPagination,\n getCoreRowModel: getCoreRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getFacetedRowModel: getFacetedRowModel(),\n getFacetedUniqueValues: getFacetedUniqueValues(),\n })\n\n function handleDragEnd(event: DragEndEvent) {\n const { active, over } = event\n if (active && over && active.id !== over.id) {\n setData((data) => {\n const oldIndex = dataIds.indexOf(active.id)\n const newIndex = dataIds.indexOf(over.id)\n return arrayMove(data, oldIndex, newIndex)\n })\n }\n }\n\n return (\n \n
\n \n \n \n
\n \n \n \n \n \n {table\n .getAllColumns()\n .filter(\n (column) =>\n typeof column.accessorFn !== \"undefined\" &&\n column.getCanHide()\n )\n .map((column) => {\n return (\n \n column.toggleVisibility(!!value)\n }\n >\n {column.id}\n \n )\n })}\n \n \n \n
\n
\n \n
\n \n \n \n {table.getHeaderGroups().map((headerGroup) => (\n \n {headerGroup.headers.map((header) => {\n return (\n \n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n \n )\n })}\n \n ))}\n \n \n {table.getRowModel().rows?.length ? (\n \n {table.getRowModel().rows.map((row) => (\n \n ))}\n \n ) : (\n \n \n No results.\n \n \n )}\n \n
\n \n
\n
\n \n
\n
\n \n {\n table.setPageSize(Number(value))\n }}\n >\n \n \n \n \n {[10, 20, 30, 40, 50].map((pageSize) => (\n \n {pageSize}\n \n ))}\n \n \n
\n
\n Page {table.getState().pagination.pageIndex + 1} of{\" \"}\n {table.getPageCount()}\n
\n
\n table.setPageIndex(0)}\n disabled={!table.getCanPreviousPage()}\n >\n Go to first page\n \n \n table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n >\n Go to previous page\n \n \n table.nextPage()}\n disabled={!table.getCanNextPage()}\n >\n Go to next page\n \n \n table.setPageIndex(table.getPageCount() - 1)}\n disabled={!table.getCanNextPage()}\n >\n Go to last page\n \n \n
\n
\n
\n \n \n
\n \n \n
\n
\n \n
\n \n \n )\n}\n\nconst chartData = [\n { month: \"January\", desktop: 186, mobile: 80 },\n { month: \"February\", desktop: 305, mobile: 200 },\n { month: \"March\", desktop: 237, mobile: 120 },\n { month: \"April\", desktop: 73, mobile: 190 },\n { month: \"May\", desktop: 209, mobile: 130 },\n { month: \"June\", desktop: 214, mobile: 140 },\n]\n\nconst chartConfig = {\n desktop: {\n label: \"Desktop\",\n color: \"var(--primary)\",\n },\n mobile: {\n label: \"Mobile\",\n color: \"var(--primary)\",\n },\n} satisfies ChartConfig\n\nfunction TableCellViewer({ item }: { item: z.infer }) {\n const isMobile = useIsMobile()\n\n return (\n \n \n \n \n \n \n {item.header}\n \n Showing total visitors for the last 6 months\n \n \n
\n {!isMobile && (\n <>\n \n \n \n value.slice(0, 3)}\n hide\n />\n }\n />\n \n \n \n \n \n
\n
\n Trending up by 5.2% this month{\" \"}\n \n
\n
\n Showing total visitors for the last 6 months. This is just\n some random text to test the layout. It spans multiple lines\n and should wrap around.\n
\n
\n \n \n )}\n
\n
\n \n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n \n \n
\n
\n
\n \n \n \n \n \n \n
\n
\n )\n}\n", + "type": "registry:component" + }, + { + "path": "registry/new-york-v4/blocks/dashboard-01/components/nav-documents.tsx", + "content": "\"use client\"\n\nimport {\n IconDots,\n IconFolder,\n IconShare3,\n IconTrash,\n type Icon,\n} from \"@tabler/icons-react\"\n\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/registry/new-york-v4/ui/dropdown-menu\"\nimport {\n SidebarGroup,\n SidebarGroupLabel,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuButton,\n SidebarMenuItem,\n useSidebar,\n} from \"@/registry/new-york-v4/ui/sidebar\"\n\nexport function NavDocuments({\n items,\n}: {\n items: {\n name: string\n url: string\n icon: Icon\n }[]\n}) {\n const { isMobile } = useSidebar()\n\n return (\n \n Documents\n \n {items.map((item) => (\n \n \n \n \n {item.name}\n \n \n \n \n \n \n More\n \n \n \n \n \n Open\n \n \n \n Share\n \n \n \n \n Delete\n \n \n \n \n ))}\n \n \n \n More\n \n \n \n \n )\n}\n", + "type": "registry:component" + }, + { + "path": "registry/new-york-v4/blocks/dashboard-01/components/nav-main.tsx", + "content": "\"use client\"\n\nimport { IconCirclePlusFilled, IconMail, type Icon } from \"@tabler/icons-react\"\n\nimport { Button } from \"@/registry/new-york-v4/ui/button\"\nimport {\n SidebarGroup,\n SidebarGroupContent,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n} from \"@/registry/new-york-v4/ui/sidebar\"\n\nexport function NavMain({\n items,\n}: {\n items: {\n title: string\n url: string\n icon?: Icon\n }[]\n}) {\n return (\n \n \n \n \n \n \n Quick Create\n \n \n \n Inbox\n \n \n \n \n {items.map((item) => (\n \n \n {item.icon && }\n {item.title}\n \n \n ))}\n \n \n \n )\n}\n", + "type": "registry:component" + }, + { + "path": "registry/new-york-v4/blocks/dashboard-01/components/nav-secondary.tsx", + "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { type Icon } from \"@tabler/icons-react\"\n\nimport {\n SidebarGroup,\n SidebarGroupContent,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n} from \"@/registry/new-york-v4/ui/sidebar\"\n\nexport function NavSecondary({\n items,\n ...props\n}: {\n items: {\n title: string\n url: string\n icon: Icon\n }[]\n} & React.ComponentPropsWithoutRef) {\n return (\n \n \n \n {items.map((item) => (\n \n \n \n \n {item.title}\n \n \n \n ))}\n \n \n \n )\n}\n", + "type": "registry:component" + }, + { + "path": "registry/new-york-v4/blocks/dashboard-01/components/nav-user.tsx", + "content": "\"use client\"\n\nimport {\n IconCreditCard,\n IconDotsVertical,\n IconLogout,\n IconNotification,\n IconUserCircle,\n} from \"@tabler/icons-react\"\n\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n} from \"@/registry/new-york-v4/ui/avatar\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/registry/new-york-v4/ui/dropdown-menu\"\nimport {\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n useSidebar,\n} from \"@/registry/new-york-v4/ui/sidebar\"\n\nexport function NavUser({\n user,\n}: {\n user: {\n name: string\n email: string\n avatar: string\n }\n}) {\n const { isMobile } = useSidebar()\n\n return (\n \n \n \n \n \n \n \n CN\n \n
\n {user.name}\n \n {user.email}\n \n
\n \n \n
\n \n \n
\n \n \n CN\n \n
\n {user.name}\n \n {user.email}\n \n
\n
\n
\n \n \n \n \n Account\n \n \n \n Billing\n \n \n \n Notifications\n \n \n \n \n \n Log out\n \n \n
\n
\n
\n )\n}\n", + "type": "registry:component" + }, + { + "path": "registry/new-york-v4/blocks/dashboard-01/components/section-cards.tsx", + "content": "import { IconTrendingDown, IconTrendingUp } from \"@tabler/icons-react\"\n\nimport { Badge } from \"@/registry/new-york-v4/ui/badge\"\nimport {\n Card,\n CardAction,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n} from \"@/registry/new-york-v4/ui/card\"\n\nexport function SectionCards() {\n return (\n
\n \n \n Total Revenue\n \n $1,250.00\n \n \n \n \n +12.5%\n \n \n \n \n
\n Trending up this month \n
\n
\n Visitors for the last 6 months\n
\n
\n
\n \n \n New Customers\n \n 1,234\n \n \n \n \n -20%\n \n \n \n \n
\n Down 20% this period \n
\n
\n Acquisition needs attention\n
\n
\n
\n \n \n Active Accounts\n \n 45,678\n \n \n \n \n +12.5%\n \n \n \n \n
\n Strong user retention \n
\n
Engagement exceed targets
\n
\n
\n \n \n Growth Rate\n \n 4.5%\n \n \n \n \n +4.5%\n \n \n \n \n
\n Steady performance increase \n
\n
Meets growth projections
\n
\n
\n
\n )\n}\n", + "type": "registry:component" + }, + { + "path": "registry/new-york-v4/blocks/dashboard-01/components/site-header.tsx", + "content": "import { Button } from \"@/registry/new-york-v4/ui/button\"\nimport { Separator } from \"@/registry/new-york-v4/ui/separator\"\nimport { SidebarTrigger } from \"@/registry/new-york-v4/ui/sidebar\"\n\nexport function SiteHeader() {\n return (\n
\n
\n \n \n

Documents

\n
\n \n
\n
\n
\n )\n}\n", + "type": "registry:component" + } + ], + "categories": [ + "dashboard" + ] +} \ No newline at end of file diff --git a/apps/www/public/r/styles/new-york/dashboard-01-dark.png b/apps/www/public/r/styles/new-york/dashboard-01-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..e5e3d644ec3126f5d3d56ae0fa86d2c88db3fe8e GIT binary patch literal 358721 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%0A2*i6C7tFd6#gU_J;nfn0eVMk!~1h6kj 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