├── .eslintrc.json ├── app ├── favicon.ico ├── (dashboard) │ ├── nft-marketplace │ │ ├── variables │ │ │ ├── tableColumnsTopCreators.ts │ │ │ └── tableDataTopCreators.json │ │ ├── components │ │ │ ├── Banner.tsx │ │ │ ├── HistoryCard.tsx │ │ │ └── TableTopCreators.tsx │ │ └── page.tsx │ ├── dashboard │ │ ├── variables │ │ │ ├── tableDataComplex.json │ │ │ ├── tableDataCheck.json │ │ │ └── columnsData.ts │ │ ├── components │ │ │ ├── WeeklyRevenue.tsx │ │ │ ├── DailyTraffic.tsx │ │ │ ├── TotalSpent.tsx │ │ │ ├── PieChartCard.tsx │ │ │ ├── TaskCard.tsx │ │ │ ├── CheckTable.tsx │ │ │ └── ComplexTable.tsx │ │ └── page.tsx │ ├── data-tables │ │ ├── variables │ │ │ ├── tableDataComplex.json │ │ │ ├── tableDataColumns.json │ │ │ ├── columnsData.ts │ │ │ ├── tableDataCheck.json │ │ │ └── tableDataDevelopment.json │ │ ├── page.tsx │ │ └── components │ │ │ ├── ColumnsTable.tsx │ │ │ ├── CheckTable.tsx │ │ │ ├── ComplexTable.tsx │ │ │ └── DevelopmentTable.tsx │ ├── profile │ │ ├── page.tsx │ │ └── components │ │ │ ├── Storage.tsx │ │ │ ├── Banner.tsx │ │ │ ├── Upload.tsx │ │ │ ├── General.tsx │ │ │ ├── Notification.tsx │ │ │ └── Project.tsx │ └── layout.tsx ├── layout.tsx ├── globals.css ├── auth │ ├── layout.tsx │ └── page.tsx └── page.tsx ├── next.config.js ├── postcss.config.js ├── components ├── icons │ ├── CloseIcon.jsx │ ├── SearchIcon.jsx │ ├── ProfileIcon.jsx │ ├── DotIcon.jsx │ ├── ClockIcon.jsx │ ├── SignIn.jsx │ ├── DashIcon.tsx │ ├── MarketIcon.jsx │ ├── KanbanIcon.jsx │ ├── DarkmodeIcon.jsx │ ├── NotificationIcon.jsx │ ├── ClockIcon1.jsx │ ├── ThemsIcon.jsx │ ├── TablesIcon.jsx │ ├── WidgetIcon │ │ ├── ChartIcon.jsx │ │ ├── PDFIcon.jsx │ │ └── DollarIcon.jsx │ └── VideoIcon.jsx ├── tooltip │ └── index.jsx ├── card │ ├── index.tsx │ ├── CardMenu.tsx │ └── NftCard.tsx ├── charts │ ├── PieChart.tsx │ ├── LineChart.tsx │ └── BarChart.tsx ├── popover │ └── index.jsx ├── calendar │ ├── MiniCalendar.tsx │ └── MiniCalendar.css ├── fields │ ├── SwitchField.tsx │ ├── TextField.jsx │ └── InputField.tsx ├── fixedPlugin │ └── FixedPlugin.tsx ├── widget │ └── Widget.tsx ├── dropdown │ └── index.tsx ├── footer │ ├── Footer.tsx │ └── FooterAuthDefault.tsx ├── sidebar │ ├── index.tsx │ └── components │ │ ├── SidebarCard.tsx │ │ └── Links.tsx ├── progress │ └── index.tsx ├── switch │ └── index.tsx ├── checkbox │ └── index.tsx └── radio │ └── index.tsx ├── public ├── img │ ├── horizon.png │ ├── auth │ │ └── auth.png │ ├── nfts │ │ ├── Nft1.png │ │ ├── Nft2.png │ │ ├── Nft3.png │ │ ├── Nft4.png │ │ ├── Nft5.png │ │ ├── Nft6.png │ │ └── NftBanner1.png │ ├── layout │ │ ├── Navbar.png │ │ └── logoWhite.png │ ├── avatars │ │ ├── avatar1.png │ │ ├── avatar10.png │ │ ├── avatar11.png │ │ ├── avatar2.png │ │ ├── avatar3.png │ │ ├── avatar4.png │ │ ├── avatar5.png │ │ ├── avatar6.png │ │ ├── avatar7.png │ │ ├── avatar8.png │ │ ├── avatar9.png │ │ └── avatarSimmmple.png │ ├── dashboards │ │ ├── Debit.png │ │ ├── usa.png │ │ ├── balanceImg.png │ │ ├── fakeGraph.png │ │ ├── starbucks.jpg │ │ └── elipse-light.png │ └── profile │ │ ├── banner.png │ │ ├── image1.png │ │ ├── image2.png │ │ └── image3.png ├── svg │ └── checked.svg ├── vercel.svg └── next.svg ├── middleware.ts ├── .gitignore ├── hooks └── useMobileView.tsx ├── tsconfig.json ├── package.json ├── data ├── routes.tsx └── charts.ts ├── providers ├── SidebarProvider.tsx └── ThemeProvider.tsx ├── README.md ├── types └── react-table-config.d.ts └── tailwind.config.js /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next/core-web-vitals" 3 | } 4 | -------------------------------------------------------------------------------- /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/app/favicon.ico -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = {} 3 | 4 | module.exports = nextConfig 5 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /components/icons/CloseIcon.jsx: -------------------------------------------------------------------------------- 1 | const CloseIcon = () => { 2 | return
hello
; 3 | }; 4 | 5 | export default CloseIcon; 6 | -------------------------------------------------------------------------------- /public/img/horizon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/horizon.png -------------------------------------------------------------------------------- /public/img/auth/auth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/auth/auth.png -------------------------------------------------------------------------------- /public/img/nfts/Nft1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/nfts/Nft1.png -------------------------------------------------------------------------------- /public/img/nfts/Nft2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/nfts/Nft2.png -------------------------------------------------------------------------------- /public/img/nfts/Nft3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/nfts/Nft3.png -------------------------------------------------------------------------------- /public/img/nfts/Nft4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/nfts/Nft4.png -------------------------------------------------------------------------------- /public/img/nfts/Nft5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/nfts/Nft5.png -------------------------------------------------------------------------------- /public/img/nfts/Nft6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/nfts/Nft6.png -------------------------------------------------------------------------------- /public/img/layout/Navbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/layout/Navbar.png -------------------------------------------------------------------------------- /public/img/avatars/avatar1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/avatars/avatar1.png -------------------------------------------------------------------------------- /public/img/avatars/avatar10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/avatars/avatar10.png -------------------------------------------------------------------------------- /public/img/avatars/avatar11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/avatars/avatar11.png -------------------------------------------------------------------------------- /public/img/avatars/avatar2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/avatars/avatar2.png -------------------------------------------------------------------------------- /public/img/avatars/avatar3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/avatars/avatar3.png -------------------------------------------------------------------------------- /public/img/avatars/avatar4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/avatars/avatar4.png -------------------------------------------------------------------------------- /public/img/avatars/avatar5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/avatars/avatar5.png -------------------------------------------------------------------------------- /public/img/avatars/avatar6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/avatars/avatar6.png -------------------------------------------------------------------------------- /public/img/avatars/avatar7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/avatars/avatar7.png -------------------------------------------------------------------------------- /public/img/avatars/avatar8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/avatars/avatar8.png -------------------------------------------------------------------------------- /public/img/avatars/avatar9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/avatars/avatar9.png -------------------------------------------------------------------------------- /public/img/dashboards/Debit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/dashboards/Debit.png -------------------------------------------------------------------------------- /public/img/dashboards/usa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/dashboards/usa.png -------------------------------------------------------------------------------- /public/img/layout/logoWhite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/layout/logoWhite.png -------------------------------------------------------------------------------- /public/img/nfts/NftBanner1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/nfts/NftBanner1.png -------------------------------------------------------------------------------- /public/img/profile/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/profile/banner.png -------------------------------------------------------------------------------- /public/img/profile/image1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/profile/image1.png -------------------------------------------------------------------------------- /public/img/profile/image2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/profile/image2.png -------------------------------------------------------------------------------- /public/img/profile/image3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/profile/image3.png -------------------------------------------------------------------------------- /public/img/dashboards/balanceImg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/dashboards/balanceImg.png -------------------------------------------------------------------------------- /public/img/dashboards/fakeGraph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/dashboards/fakeGraph.png -------------------------------------------------------------------------------- /public/img/dashboards/starbucks.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/dashboards/starbucks.jpg -------------------------------------------------------------------------------- /public/img/avatars/avatarSimmmple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/avatars/avatarSimmmple.png -------------------------------------------------------------------------------- /public/img/dashboards/elipse-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ichsankurnia/next13-horizon-admin-dashboard-ts-tailwind/HEAD/public/img/dashboards/elipse-light.png -------------------------------------------------------------------------------- /public/svg/checked.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/(dashboard)/nft-marketplace/variables/tableColumnsTopCreators.ts: -------------------------------------------------------------------------------- 1 | export const tableColumnsTopCreators = [ 2 | { 3 | Header: "Name", 4 | accessor: "name", 5 | }, 6 | { 7 | Header: "Artworks", 8 | accessor: "artworks", 9 | }, 10 | { 11 | Header: "Rating", 12 | accessor: "rating", 13 | }, 14 | ]; 15 | -------------------------------------------------------------------------------- /middleware.ts: -------------------------------------------------------------------------------- 1 | import { NextResponse } from 'next/server'; 2 | import type { NextRequest } from 'next/server'; 3 | 4 | // This function can be marked `async` if using `await` inside 5 | export function middleware(request: NextRequest) { 6 | if (request.nextUrl.pathname === '/') { 7 | return NextResponse.redirect(new URL('/dashboard', request.url)); 8 | } 9 | } 10 | 11 | 12 | 13 | export const config = { 14 | matcher: ['/'], 15 | } -------------------------------------------------------------------------------- /components/tooltip/index.jsx: -------------------------------------------------------------------------------- 1 | import { Tooltip } from "@chakra-ui/tooltip"; 2 | const TooltipHorizon = (props) => { 3 | const { extra, trigger, content, placement } = props; 4 | return ( 5 | 10 | {trigger} 11 | 12 | ); 13 | }; 14 | 15 | export default TooltipHorizon; 16 | -------------------------------------------------------------------------------- /components/card/index.tsx: -------------------------------------------------------------------------------- 1 | import { type ReactNode } from 'react' 2 | 3 | type Props = { 4 | className?: string 5 | children?: ReactNode 6 | } 7 | 8 | function Card(props: Props) { 9 | const { className, children } = props; 10 | return ( 11 |
12 | {children} 13 |
14 | ); 15 | } 16 | 17 | export default Card; 18 | -------------------------------------------------------------------------------- /components/charts/PieChart.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { ApexOptions } from "apexcharts"; 4 | import Chart from "react-apexcharts"; 5 | 6 | type Props = { 7 | series: ApexAxisChartSeries | any 8 | options: ApexOptions 9 | } 10 | 11 | const PieChart = (props: Props) => { 12 | const { series, options } = props; 13 | 14 | return ( 15 | 22 | ); 23 | }; 24 | 25 | export default PieChart; 26 | -------------------------------------------------------------------------------- /components/charts/LineChart.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { ApexOptions } from "apexcharts"; 4 | import Chart from "react-apexcharts"; 5 | 6 | type Props = { 7 | series: ApexAxisChartSeries | any 8 | options: ApexOptions 9 | } 10 | 11 | const LineChart = (props: Props) => { 12 | const { series, options } = props; 13 | 14 | return ( 15 | 22 | ); 23 | }; 24 | 25 | export default LineChart; 26 | -------------------------------------------------------------------------------- /components/icons/SearchIcon.jsx: -------------------------------------------------------------------------------- 1 | const SearchIcon = () => { 2 | return ( 3 | 10 | 16 | 17 | ); 18 | }; 19 | 20 | export default SearchIcon; 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env*.local 29 | 30 | # vercel 31 | .vercel 32 | 33 | # typescript 34 | *.tsbuildinfo 35 | next-env.d.ts 36 | 37 | package-lock.json 38 | -------------------------------------------------------------------------------- /components/icons/ProfileIcon.jsx: -------------------------------------------------------------------------------- 1 | const ProfileIcon = () => { 2 | return ( 3 | 10 | 14 | 15 | ); 16 | }; 17 | 18 | export default ProfileIcon; 19 | -------------------------------------------------------------------------------- /components/popover/index.jsx: -------------------------------------------------------------------------------- 1 | import { Popover, PopoverTrigger, PopoverContent } from "@chakra-ui/popover"; 2 | const PopoverHorizon = (props) => { 3 | const { extra, trigger, content } = props; 4 | return ( 5 | 6 | {trigger} 7 | 10 | {content} 11 | 12 | 13 | ); 14 | }; 15 | 16 | export default PopoverHorizon; 17 | -------------------------------------------------------------------------------- /components/charts/BarChart.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { FC } from 'react'; 4 | import Chart from 'react-apexcharts'; 5 | import { type ApexOptions } from 'apexcharts'; 6 | 7 | type Props = { 8 | chartOptions?: ApexOptions 9 | chartData?: any 10 | }; 11 | 12 | const BarChart: FC = ({ chartData, chartOptions }) => { 13 | return ( 14 | <> 15 | 22 | 23 | ); 24 | } 25 | 26 | export default BarChart; -------------------------------------------------------------------------------- /components/icons/DotIcon.jsx: -------------------------------------------------------------------------------- 1 | const DotIcon = () => { 2 | return ( 3 | 10 | 14 | 15 | ); 16 | }; 17 | 18 | export default DotIcon; 19 | -------------------------------------------------------------------------------- /components/icons/ClockIcon.jsx: -------------------------------------------------------------------------------- 1 | const ClockIcon = () => { 2 | return ( 3 | 10 | 14 | 15 | ); 16 | }; 17 | 18 | export default ClockIcon; 19 | -------------------------------------------------------------------------------- /app/(dashboard)/dashboard/variables/tableDataComplex.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "Marketplace", 4 | "status": "Approved", 5 | "date": "24.Jan.2021", 6 | "progress": 30 7 | }, 8 | { 9 | "name": "Marketplace", 10 | "status": "Disable", 11 | "date": "30.Dec.2021", 12 | "progress": 30 13 | }, 14 | { 15 | "name": "Marketplace", 16 | "status": "Error", 17 | "date": "20.May.2021", 18 | "progress": 30 19 | }, 20 | { 21 | "name": "Marketplace", 22 | "status": "Approved", 23 | "date": "12.Jul.2021", 24 | "progress": 30 25 | } 26 | ] 27 | -------------------------------------------------------------------------------- /app/(dashboard)/data-tables/variables/tableDataComplex.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "Marketplace", 4 | "status": "Approved", 5 | "date": "24.Jan.2021", 6 | "progress": 30 7 | }, 8 | { 9 | "name": "Marketplace", 10 | "status": "Disable", 11 | "date": "30.Dec.2021", 12 | "progress": 30 13 | }, 14 | { 15 | "name": "Marketplace", 16 | "status": "Error", 17 | "date": "20.May.2021", 18 | "progress": 30 19 | }, 20 | { 21 | "name": "Marketplace", 22 | "status": "Approved", 23 | "date": "12.Jul.2021", 24 | "progress": 30 25 | } 26 | ] 27 | -------------------------------------------------------------------------------- /public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /components/icons/SignIn.jsx: -------------------------------------------------------------------------------- 1 | const SignIn = () => { 2 | return ( 3 | 10 | 14 | 15 | ); 16 | }; 17 | 18 | export default SignIn; 19 | -------------------------------------------------------------------------------- /hooks/useMobileView.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from 'react'; 2 | 3 | const useMobileView = () => { 4 | const [width, setWidth] = useState(typeof window !== 'undefined' ? window.innerWidth : 1366); 5 | 6 | function handleWindowSizeChange() { 7 | setWidth(window?.innerWidth); 8 | } 9 | 10 | useEffect(() => { 11 | window.addEventListener('resize', handleWindowSizeChange); 12 | return () => { 13 | window.removeEventListener('resize', handleWindowSizeChange); 14 | } 15 | }, []); 16 | 17 | return { 18 | isMobile: width <= 768, 19 | windowWidth: width 20 | }; 21 | } 22 | 23 | export default useMobileView; -------------------------------------------------------------------------------- /app/(dashboard)/data-tables/variables/tableDataColumns.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "Marketplace", 4 | "quantity": 2458, 5 | "date": "12.Jan.2021", 6 | "progress": 75.5 7 | }, 8 | { 9 | "name": "Venus DB PRO", 10 | "quantity": 1485, 11 | "date": "21.Feb.2021", 12 | "progress": 35.4 13 | }, 14 | { 15 | "name": "Venus DS", 16 | "quantity": 1024, 17 | "date": "13.Mar.2021", 18 | "progress": 25 19 | }, 20 | { 21 | "name": "Venus 3D Asset", 22 | "quantity": 858, 23 | "date": "24.Jan.2021", 24 | "progress": 100 25 | }, 26 | { 27 | "name": "Marketplace", 28 | "quantity": 258, 29 | "date": "Oct 24, 2022", 30 | "progress": 75 31 | } 32 | ] 33 | -------------------------------------------------------------------------------- /components/icons/DashIcon.tsx: -------------------------------------------------------------------------------- 1 | const DashIcon = () => { 2 | return ( 3 | 10 | 14 | 15 | ); 16 | }; 17 | 18 | export default DashIcon; 19 | -------------------------------------------------------------------------------- /app/(dashboard)/dashboard/variables/tableDataCheck.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": ["Marketplace", false], 4 | "quantity": 2458, 5 | "date": "Apr 26, 2022", 6 | "progress": 75.5 7 | }, 8 | { 9 | "name": ["Venus DB PRO", true], 10 | "quantity": 1485, 11 | "date": "Jul 20, 2022", 12 | "progress": 35.4 13 | }, 14 | { 15 | "name": ["Venus DS", true], 16 | "quantity": 1024, 17 | "date": "Sep 30, 2022", 18 | "progress": 25 19 | }, 20 | { 21 | "name": ["Venus 3D Asset", true], 22 | "quantity": 858, 23 | "date": "Oct 24, 2022", 24 | "progress": 100 25 | }, 26 | { 27 | "name": ["Marketplace", false], 28 | "quantity": 258, 29 | "date": "Nov 29, 2022", 30 | "progress": 75.5 31 | } 32 | ] 33 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "noEmit": true, 10 | "esModuleInterop": true, 11 | "module": "esnext", 12 | "moduleResolution": "node", 13 | "resolveJsonModule": true, 14 | "isolatedModules": true, 15 | "jsx": "preserve", 16 | "incremental": true, 17 | "plugins": [ 18 | { 19 | "name": "next" 20 | } 21 | ], 22 | "paths": { 23 | "@/*": ["./*"], 24 | } 25 | }, 26 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 27 | "exclude": ["node_modules"] 28 | } 29 | -------------------------------------------------------------------------------- /components/icons/MarketIcon.jsx: -------------------------------------------------------------------------------- 1 | const MarketIcon = () => { 2 | return ( 3 | 10 | 14 | 15 | ); 16 | }; 17 | 18 | export default MarketIcon; 19 | -------------------------------------------------------------------------------- /components/icons/KanbanIcon.jsx: -------------------------------------------------------------------------------- 1 | const KanbanIcon = () => { 2 | return ( 3 | 10 | 14 | 15 | ); 16 | }; 17 | 18 | export default KanbanIcon; 19 | -------------------------------------------------------------------------------- /components/calendar/MiniCalendar.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { useState } from "react"; 4 | import Calendar from "react-calendar"; 5 | import { MdChevronLeft, MdChevronRight } from "react-icons/md"; 6 | import Card from "@/components/card"; 7 | 8 | const MiniCalendar = () => { 9 | const [value, onChange] = useState(new Date()); 10 | 11 | return ( 12 |
13 | 14 | } 18 | nextLabel={} 19 | view={"month"} 20 | /> 21 | 22 |
23 | ); 24 | }; 25 | 26 | export default MiniCalendar; 27 | -------------------------------------------------------------------------------- /components/icons/DarkmodeIcon.jsx: -------------------------------------------------------------------------------- 1 | const DarkmodeIcon = () => { 2 | return ( 3 | 4 | 11 | 15 | 16 | 17 | ); 18 | }; 19 | 20 | export default DarkmodeIcon; 21 | -------------------------------------------------------------------------------- /components/fields/SwitchField.tsx: -------------------------------------------------------------------------------- 1 | import Switch from "@/components/switch"; 2 | 3 | type Props = { 4 | id?: string 5 | label?: string 6 | desc?: string 7 | mt?: string 8 | mb?: string 9 | } 10 | 11 | const SwitchField = (props: Props) => { 12 | const { id, label, desc, mt, mb } = props; 13 | 14 | return ( 15 |
16 | 25 |
26 | 27 |
28 |
29 | ); 30 | }; 31 | 32 | export default SwitchField; 33 | -------------------------------------------------------------------------------- /components/fixedPlugin/FixedPlugin.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { useThemeContext } from "@/providers/ThemeProvider"; 4 | import { RiMoonFill, RiSunFill } from "react-icons/ri"; 5 | 6 | export default function FixedPlugin() { 7 | const { theme, setTheme } = useThemeContext() 8 | 9 | return ( 10 | 24 | ); 25 | } 26 | -------------------------------------------------------------------------------- /components/icons/NotificationIcon.jsx: -------------------------------------------------------------------------------- 1 | const NotificationIcon = () => { 2 | return ( 3 | 4 | 11 | 15 | 16 | 17 | ); 18 | }; 19 | 20 | export default NotificationIcon; 21 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "horizon-admin-dashboard", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev -p 6323", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "@types/node": "20.2.5", 13 | "@types/react": "18.2.8", 14 | "@types/react-dom": "18.2.4", 15 | "apexcharts": "^3.40.0", 16 | "autoprefixer": "10.4.14", 17 | "eslint": "8.42.0", 18 | "eslint-config-next": "13.4.4", 19 | "next": "13.4.4", 20 | "postcss": "8.4.24", 21 | "react": "18.2.0", 22 | "react-apexcharts": "^1.4.0", 23 | "react-calendar": "^4.2.1", 24 | "react-dom": "18.2.0", 25 | "react-icons": "^4.9.0", 26 | "react-table": "^7.8.0", 27 | "tailwindcss": "3.3.2", 28 | "tailwindcss-rtl": "^0.9.0", 29 | "typescript": "5.1.3" 30 | }, 31 | "devDependencies": { 32 | "@types/react-table": "^7.7.14" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /components/icons/ClockIcon1.jsx: -------------------------------------------------------------------------------- 1 | const ClockIcon1 = () => { 2 | return ( 3 | 10 | 14 | 15 | ); 16 | }; 17 | 18 | export default ClockIcon1; 19 | -------------------------------------------------------------------------------- /components/icons/ThemsIcon.jsx: -------------------------------------------------------------------------------- 1 | const ThemsIcon = () => { 2 | return ( 3 | 4 | 11 | 12 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | ); 25 | }; 26 | 27 | export default ThemsIcon; 28 | -------------------------------------------------------------------------------- /data/routes.tsx: -------------------------------------------------------------------------------- 1 | // Icon Imports 2 | import { 3 | MdHome, 4 | MdOutlineShoppingCart, 5 | MdBarChart, 6 | MdPerson, 7 | } from "react-icons/md"; 8 | 9 | const routes = [ 10 | { 11 | name: "Main Dashboard", 12 | layout: "/dashboard", 13 | path: "dashboard", 14 | icon: , 15 | }, 16 | { 17 | name: "NFT Marketplace", 18 | layout: "/dashboard", 19 | path: "nft-marketplace", 20 | icon: , 21 | secondary: true, 22 | }, 23 | { 24 | name: "Data Tables", 25 | layout: "/dashboard", 26 | icon: , 27 | path: "data-tables", 28 | }, 29 | { 30 | name: "Profile", 31 | layout: "/dashboard", 32 | path: "profile", 33 | icon: , 34 | }, 35 | { 36 | name: "RTL Admin", 37 | layout: "/rtl", 38 | path: "rtl", 39 | icon: , 40 | }, 41 | ]; 42 | 43 | export default routes; 44 | -------------------------------------------------------------------------------- /components/icons/TablesIcon.jsx: -------------------------------------------------------------------------------- 1 | const TablesIcon = () => { 2 | return ( 3 | 10 | 14 | 15 | ); 16 | }; 17 | 18 | export default TablesIcon; 19 | -------------------------------------------------------------------------------- /components/widget/Widget.tsx: -------------------------------------------------------------------------------- 1 | import { FC, ReactNode } from "react"; 2 | import Card from "@/components/card"; 3 | 4 | type Props = { 5 | icon?: ReactNode | string 6 | title?: string 7 | subtitle?: string 8 | } 9 | 10 | const Widget: FC = ({ icon, title, subtitle }) => { 11 | return ( 12 | 13 |
14 |
15 | 16 | {icon} 17 | 18 |
19 |
20 | 21 |
22 |

{title}

23 |

24 | {subtitle} 25 |

26 |
27 |
28 | ); 29 | }; 30 | 31 | export default Widget; 32 | -------------------------------------------------------------------------------- /components/icons/WidgetIcon/ChartIcon.jsx: -------------------------------------------------------------------------------- 1 | const ChartIcon = () => { 2 | return ( 3 | 10 | 14 | 15 | ); 16 | }; 17 | 18 | export default ChartIcon; 19 | -------------------------------------------------------------------------------- /components/icons/WidgetIcon/PDFIcon.jsx: -------------------------------------------------------------------------------- 1 | const PDFIcon = () => { 2 | return ( 3 | 10 | 14 | 15 | ); 16 | }; 17 | 18 | export default PDFIcon; 19 | -------------------------------------------------------------------------------- /app/layout.tsx: -------------------------------------------------------------------------------- 1 | import { type Metadata } from 'next' 2 | import './globals.css' 3 | // import "react-calendar/dist/Calendar.css"; 4 | import "@/components/calendar/MiniCalendar.css"; 5 | import ThemeProvider from '@/providers/ThemeProvider'; 6 | 7 | 8 | export const metadata: Metadata = { 9 | title: 'Horizon UI by Ories', 10 | description: 'Generated by create next app', 11 | applicationName: 'Horizon UI', 12 | keywords: ["react", "server components", 'nextjs', 'tailwind', 'admin', 'dashboard'], 13 | themeColor: '#422AFB', 14 | icons: [ 15 | // { rel: "icon", type: 'image/svg', url: "/map/location.svg" }, 16 | { rel: "apple-touch-icon", type: 'image/png', url: "/img/horizon.png" } 17 | ], 18 | generator: 'ichsankurnia', 19 | authors: [{ name: 'ichsankurnia', url: 'https://ories.goes2nobel.com' }], 20 | creator: 'ichsankurnia' 21 | } 22 | 23 | export default function RootLayout({ 24 | children, 25 | }: { 26 | children: React.ReactNode 27 | }) { 28 | return ( 29 | 30 | 31 | 32 | {children} 33 | 34 | 35 | 36 | ) 37 | } 38 | -------------------------------------------------------------------------------- /providers/SidebarProvider.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | import { createContext, ReactNode, useState, useContext, useEffect } from 'react'; 3 | 4 | 5 | export interface SidebarContextInterface { 6 | openSidebar: boolean, 7 | setOpenSidebar: (state: boolean) => any 8 | } 9 | 10 | export const SidebarContext = createContext({} as SidebarContextInterface); 11 | 12 | 13 | type Props = { 14 | children: ReactNode 15 | }; 16 | 17 | export default function SidebarProvider({ children }: Props) { 18 | const [openSidebar, setOpenSidebar] = useState(true); 19 | 20 | useEffect(() => { 21 | window.addEventListener("resize", () => 22 | window.innerWidth < 1200 ? setOpenSidebar(false) : setOpenSidebar(true) 23 | ); 24 | 25 | return () => { 26 | window.removeEventListener('resize', () => { }); 27 | } 28 | }, []); 29 | 30 | return ( 31 | 36 | {children} 37 | 38 | ); 39 | } 40 | 41 | export function useSidebarContext() { 42 | return useContext(SidebarContext) 43 | } -------------------------------------------------------------------------------- /components/icons/VideoIcon.jsx: -------------------------------------------------------------------------------- 1 | const VideoIcon = () => { 2 | return ( 3 | 10 | 14 | 15 | ); 16 | }; 17 | 18 | export default VideoIcon; 19 | -------------------------------------------------------------------------------- /public/next.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/globals.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@100;200;300;400;500;600;700;800&display=swap'); 2 | @import url('https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700&display=swap'); 3 | 4 | @tailwind base; 5 | @tailwind components; 6 | @tailwind utilities; 7 | 8 | @layer base { 9 | html { 10 | font-family: 'DM Sans', sans-serif !important; 11 | font-feature-settings: 'kern' !important; 12 | -webkit-font-smoothing: antialiased; 13 | letter-spacing: -0.5px; 14 | } 15 | } 16 | 17 | input.defaultCheckbox::before { 18 | content: url(/svg/checked.svg); 19 | color: white; 20 | opacity: 0; 21 | height: 16px; 22 | width: 16px; 23 | position: absolute; 24 | left: 50%; 25 | transform: translate(-50%, 0px); 26 | } 27 | 28 | input:checked.defaultCheckbox::before { 29 | opacity: 1; 30 | } 31 | 32 | /* SCROLLBAR */ 33 | /* width */ 34 | ::-webkit-scrollbar { 35 | width: 8px; 36 | height: 8px; 37 | } 38 | 39 | /* Track */ 40 | ::-webkit-scrollbar-track { 41 | box-shadow: inset 0 0 5px gray; 42 | border-radius: 50px; 43 | } 44 | 45 | /* Handle */ 46 | ::-webkit-scrollbar-thumb { 47 | background: #4318FF; 48 | border-radius: 20px; 49 | } 50 | 51 | /* Handle on hover */ 52 | ::-webkit-scrollbar-thumb:hover { 53 | background: #868CFF; 54 | cursor: pointer; 55 | } 56 | /* END SCROLLBAR */ -------------------------------------------------------------------------------- /components/icons/WidgetIcon/DollarIcon.jsx: -------------------------------------------------------------------------------- 1 | const DollarIcon = () => { 2 | return ( 3 | 10 | 14 | 15 | ); 16 | }; 17 | 18 | export default DollarIcon; 19 | -------------------------------------------------------------------------------- /app/(dashboard)/dashboard/variables/columnsData.ts: -------------------------------------------------------------------------------- 1 | export const columnsDataDevelopment = [ 2 | { 3 | Header: "NAME", 4 | accessor: "name", 5 | }, 6 | { 7 | Header: "TECH", 8 | accessor: "tech", 9 | }, 10 | { 11 | Header: "DATE", 12 | accessor: "date", 13 | }, 14 | { 15 | Header: "PROGRESS", 16 | accessor: "progress", 17 | }, 18 | ]; 19 | 20 | export const columnsDataCheck = [ 21 | { 22 | Header: "NAME", 23 | accessor: "name", 24 | }, 25 | { 26 | Header: "PROGRESS", 27 | accessor: "progress", 28 | }, 29 | { 30 | Header: "QUANTITY", 31 | accessor: "quantity", 32 | }, 33 | { 34 | Header: "DATE", 35 | accessor: "date", 36 | }, 37 | ]; 38 | 39 | export const columnsDataColumns = [ 40 | { 41 | Header: "NAME", 42 | accessor: "name", 43 | }, 44 | { 45 | Header: "PROGRESS", 46 | accessor: "progress", 47 | }, 48 | { 49 | Header: "QUANTITY", 50 | accessor: "quantity", 51 | }, 52 | { 53 | Header: "DATE", 54 | accessor: "date", 55 | }, 56 | ]; 57 | 58 | export const columnsDataComplex = [ 59 | { 60 | Header: "NAME", 61 | accessor: "name", 62 | }, 63 | { 64 | Header: "STATUS", 65 | accessor: "status", 66 | }, 67 | { 68 | Header: "DATE", 69 | accessor: "date", 70 | }, 71 | { 72 | Header: "PROGRESS", 73 | accessor: "progress", 74 | }, 75 | ]; 76 | -------------------------------------------------------------------------------- /app/(dashboard)/data-tables/variables/columnsData.ts: -------------------------------------------------------------------------------- 1 | export const columnsDataDevelopment = [ 2 | { 3 | Header: "NAME", 4 | accessor: "name", 5 | }, 6 | { 7 | Header: "TECH", 8 | accessor: "tech", 9 | }, 10 | { 11 | Header: "DATE", 12 | accessor: "date", 13 | }, 14 | { 15 | Header: "PROGRESS", 16 | accessor: "progress", 17 | }, 18 | ]; 19 | 20 | export const columnsDataCheck = [ 21 | { 22 | Header: "NAME", 23 | accessor: "name", 24 | }, 25 | { 26 | Header: "PROGRESS", 27 | accessor: "progress", 28 | }, 29 | { 30 | Header: "QUANTITY", 31 | accessor: "quantity", 32 | }, 33 | { 34 | Header: "DATE", 35 | accessor: "date", 36 | }, 37 | ]; 38 | 39 | export const columnsDataColumns = [ 40 | { 41 | Header: "NAME", 42 | accessor: "name", 43 | }, 44 | { 45 | Header: "PROGRESS", 46 | accessor: "progress", 47 | }, 48 | { 49 | Header: "QUANTITY", 50 | accessor: "quantity", 51 | }, 52 | { 53 | Header: "DATE", 54 | accessor: "date", 55 | }, 56 | ]; 57 | 58 | export const columnsDataComplex = [ 59 | { 60 | Header: "NAME", 61 | accessor: "name", 62 | }, 63 | { 64 | Header: "STATUS", 65 | accessor: "status", 66 | }, 67 | { 68 | Header: "DATE", 69 | accessor: "date", 70 | }, 71 | { 72 | Header: "PROGRESS", 73 | accessor: "progress", 74 | }, 75 | ]; 76 | -------------------------------------------------------------------------------- /app/(dashboard)/nft-marketplace/components/Banner.tsx: -------------------------------------------------------------------------------- 1 | const Banner1 = () => { 2 | return ( 3 |
4 |
5 |

6 | Discover, collect, and sell extraordinary NFTs 7 |

8 |

9 | Enter in this creative world. Discover now the latest NFTs or start 10 | creating your own! 11 |

12 | 13 |
14 | 17 | 22 |
23 |
24 |
25 | ); 26 | }; 27 | 28 | export default Banner1; 29 | -------------------------------------------------------------------------------- /app/(dashboard)/data-tables/variables/tableDataCheck.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": ["Marketplace", false], 4 | "quantity": 2458, 5 | "date": "12.Jan.2021", 6 | "progress": 75.5 7 | }, 8 | { 9 | "name": ["Venus DB PRO", true], 10 | "quantity": 1485, 11 | "date": "21.Feb.2021", 12 | "progress": 35.4 13 | }, 14 | { 15 | "name": ["Venus DS", true], 16 | "quantity": 1024, 17 | "date": "13.Mar.2021", 18 | "progress": 25 19 | }, 20 | { 21 | "name": ["Venus 3D Asset", true], 22 | "quantity": 858, 23 | "date": "24.Jan.2021", 24 | "progress": 100 25 | }, 26 | { 27 | "name": ["Marketplace", false], 28 | "quantity": 258, 29 | "date": "Oct 24, 2022", 30 | "progress": 75.5 31 | }, 32 | { 33 | "name": ["Marketplace", false], 34 | "quantity": 258, 35 | "date": "Oct 24, 2022", 36 | "progress": 75.5 37 | }, 38 | { 39 | "name": ["Marketplace", false], 40 | "quantity": 258, 41 | "date": "12.Jan.2021", 42 | "progress": 75.5 43 | }, 44 | { 45 | "name": ["Venus DB PRO", false], 46 | "quantity": 858, 47 | "date": "21.Feb.2021", 48 | "progress": 35.4 49 | }, 50 | { 51 | "name": ["Venus DS", false], 52 | "quantity": 1024, 53 | "date": "13.Mar.2021", 54 | "progress": 25 55 | }, 56 | { 57 | "name": ["Venus 3D Asset", false], 58 | "quantity": 258, 59 | "date": "24.Jan.2021", 60 | "progress": 100 61 | } 62 | ] 63 | -------------------------------------------------------------------------------- /app/(dashboard)/dashboard/components/WeeklyRevenue.tsx: -------------------------------------------------------------------------------- 1 | import Card from "@/components/card"; 2 | import dynamic from "next/dynamic"; 3 | import { 4 | barChartDataWeeklyRevenue, 5 | barChartOptionsWeeklyRevenue, 6 | } from "@/data/charts"; 7 | import { MdBarChart } from "react-icons/md"; 8 | 9 | const BarChart = dynamic(() => import("@/components/charts/BarChart"), { 10 | loading: () =>

loading...

, 11 | ssr: false 12 | }) 13 | 14 | const WeeklyRevenue = () => { 15 | return ( 16 | 17 |
18 |

19 | Weekly Revenue 20 |

21 | 24 |
25 | 26 |
27 |
28 | 33 |
34 |
35 |
36 | ); 37 | }; 38 | 39 | export default WeeklyRevenue; 40 | -------------------------------------------------------------------------------- /app/(dashboard)/profile/page.tsx: -------------------------------------------------------------------------------- 1 | import { type Metadata } from "next"; 2 | import Banner from "./components/Banner"; 3 | import General from "./components/General"; 4 | import Notification from "./components/Notification"; 5 | import Project from "./components/Project"; 6 | import Storage from "./components/Storage"; 7 | import Upload from "./components/Upload"; 8 | 9 | 10 | export const metadata: Metadata = { 11 | title: 'Profile | Horizon UI by Ories', 12 | } 13 | 14 | const ProfileOverview = () => { 15 | return ( 16 |
17 |
18 |
19 | 20 |
21 | 22 |
23 | 24 |
25 | 26 |
27 | 28 |
29 |
30 | {/* all project & ... */} 31 | 32 |
33 |
34 | 35 |
36 |
37 | 38 |
39 | 40 |
41 | 42 |
43 |
44 |
45 | ); 46 | }; 47 | 48 | export default ProfileOverview; 49 | -------------------------------------------------------------------------------- /app/(dashboard)/layout.tsx: -------------------------------------------------------------------------------- 1 | import Navbar from "@/components/navbar"; 2 | import Sidebar from "@/components/sidebar"; 3 | import Footer from "@/components/footer/Footer"; 4 | import SidebarProvider from "@/providers/SidebarProvider"; 5 | 6 | 7 | export default function DashboardLayout({ 8 | children, // will be a page or nested layout 9 | }: { 10 | children: React.ReactNode; 11 | }) { 12 | 13 | return ( 14 | <> 15 | 16 |
17 | 18 | 19 | {/* Navbar & Main Content */} 20 |
21 | 22 | {/* Main Content */} 23 |
24 | {/* Routes */} 25 |
26 | 27 | 28 |
29 | {children} 30 |
31 | 32 |
33 |
34 |
35 |
36 |
37 | 38 |
39 | 40 |
41 |
42 | 43 | ); 44 | } -------------------------------------------------------------------------------- /app/(dashboard)/profile/components/Storage.tsx: -------------------------------------------------------------------------------- 1 | import Card from "@/components/card"; 2 | import CardMenu from "@/components/card/CardMenu"; 3 | import { BsCloudCheck } from "react-icons/bs"; 4 | 5 | const Storage = () => { 6 | return ( 7 | 8 |
9 | 10 |
11 | {/* Your storage */} 12 |
13 |
14 | 15 |
16 |

17 | Your storage 18 |

19 |

20 | Supervise your drive space in the easiest way 21 |

22 |
23 | 24 | {/* Progress bar */} 25 |
26 |
27 |

25.6 GB

28 |

50 GB

29 |
30 |
31 | 32 |
33 |
34 |
35 | ); 36 | }; 37 | 38 | export default Storage; 39 | -------------------------------------------------------------------------------- /components/fields/TextField.jsx: -------------------------------------------------------------------------------- 1 | // Custom components 2 | import React from "react"; 3 | 4 | function InputField(props) { 5 | const { label, id, extra, placeholder, cols, rows, state, disabled } = props; 6 | 7 | return ( 8 |
9 | 15 |
16 |