diff --git a/package-lock.json b/package-lock.json index d95f8f0b..fc3f6c13 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,13 +12,15 @@ "@heroicons/react": "^2.1.1", "@types/geojson": "^7946.0.10", "axios": "^1.6.5", + "date-fns": "^3.3.1", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-rnd": "^10.4.1", "react-router-dom": "^6.11.2", - "utopia-ui": "^3.0.0-alpha.77" + "utopia-ui": "^3.0.0-alpha.89" }, "devDependencies": { - "@types/react": "^18.0.28", + "@types/react": "^18.2.60", "@types/react-dom": "^18.0.11", "@typescript-eslint/eslint-plugin": "^5.57.1", "@typescript-eslint/parser": "^5.57.1", @@ -1965,20 +1967,20 @@ } }, "node_modules/@tanstack/query-core": { - "version": "5.21.7", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.21.7.tgz", - "integrity": "sha512-z0NSWFsM75esVmkxeuDWeyo9Wv4CZ/WsLMZgu1Zz164S6Oc/57NMia88dTu/d51wdVowMTAcDMQgRmiWmyPMxQ==", + "version": "5.24.1", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.24.1.tgz", + "integrity": "sha512-DZ6Nx9p7BhjkG50ayJ+MKPgff+lMeol7QYXkvuU5jr2ryW/4ok5eanaS9W5eooA4xN0A/GPHdLGOZGzArgf5Cg==", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" } }, "node_modules/@tanstack/react-query": { - "version": "5.21.7", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.21.7.tgz", - "integrity": "sha512-Op9nVL/L0Lg+aSPFSGbrymu6d3tzUoZ+FZ+rRIZpu5HkGasflqzhsXkL26Sa+MEwLyox7Q1erSFwNIRO3TYjXQ==", + "version": "5.24.1", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.24.1.tgz", + "integrity": "sha512-4+09JEdO4d6+Gc8Y/g2M/MuxDK5IY0QV8+2wL2304wPKJgJ54cBbULd3nciJ5uvh/as8rrxx6s0mtIwpRuGd1g==", "dependencies": { - "@tanstack/query-core": "5.21.7" + "@tanstack/query-core": "5.24.1" }, "funding": { "type": "github", @@ -2001,9 +2003,9 @@ "license": "MIT" }, "node_modules/@types/estree-jsx": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.4.tgz", - "integrity": "sha512-5idy3hvI9lAMqsyilBM+N+boaCf1MgoefbDxN6KEO5aK17TOHwFAYT9sjxzeKAiIWRUBgLxmZ9mPcnzZXtTcRQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", "dependencies": { "@types/estree": "*" } @@ -2053,8 +2055,9 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.2.6", - "license": "MIT", + "version": "18.2.60", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.60.tgz", + "integrity": "sha512-dfiPj9+k20jJrLGOu9Nf6eqxm2EyJRrq2NvwOFsfbb7sFExZ9WELPs67UImHj3Ayxg8ruTtKtNnbjaF8olPq0A==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -2919,6 +2922,15 @@ "url": "https://opencollective.com/daisyui" } }, + "node_modules/date-fns": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.3.1.tgz", + "integrity": "sha512-y8e109LYGgoQDveiEBD3DYXKba1jWf5BA8YU1FL5Tvm0BTdEfy54WLCwnuYWZNnzzvALy/QQ4Hov+Q9RVRv+Zw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, "node_modules/debug": { "version": "4.3.4", "license": "MIT", @@ -3528,6 +3540,11 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-memoize": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", + "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==" + }, "node_modules/fastparse": { "version": "1.1.2", "dev": true, @@ -5794,6 +5811,18 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/re-resizable": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.9.6.tgz", + "integrity": "sha512-0xYKS5+Z0zk+vICQlcZW+g54CcJTTmHluA7JUUgvERDxnKAnytylcyPsA+BSFi759s5hPlHmBRegFrwXs2FuBQ==", + "dependencies": { + "fast-memoize": "^2.5.1" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react": { "version": "18.2.0", "license": "MIT", @@ -5824,6 +5853,19 @@ "react": "^18.2.0" } }, + "node_modules/react-draggable": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.5.tgz", + "integrity": "sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g==", + "dependencies": { + "clsx": "^1.1.1", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": ">= 16.3.0", + "react-dom": ">= 16.3.0" + } + }, "node_modules/react-image-crop": { "version": "10.1.8", "resolved": "https://registry.npmjs.org/react-image-crop/-/react-image-crop-10.1.8.tgz", @@ -5897,6 +5939,25 @@ "node": ">=0.10.0" } }, + "node_modules/react-rnd": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.4.1.tgz", + "integrity": "sha512-0m887AjQZr6p2ADLNnipquqsDq4XJu/uqVqI3zuoGD19tRm6uB83HmZWydtkilNp5EWsOHbLGF4IjWMdd5du8Q==", + "dependencies": { + "re-resizable": "6.9.6", + "react-draggable": "4.4.5", + "tslib": "2.3.1" + }, + "peerDependencies": { + "react": ">=16.3.0", + "react-dom": ">=16.3.0" + } + }, + "node_modules/react-rnd/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, "node_modules/react-router": { "version": "6.16.0", "license": "MIT", @@ -7168,14 +7229,15 @@ "license": "MIT" }, "node_modules/utopia-ui": { - "version": "3.0.0-alpha.77", - "resolved": "https://registry.npmjs.org/utopia-ui/-/utopia-ui-3.0.0-alpha.77.tgz", - "integrity": "sha512-w+NeAZEKySDDjEDsKpaJho4tEBS5BGcJShnFal4VFzYlvsJ5Zrg/meqjJ5Vlpt8WmdsoHNGrgiAmF7stYqG9+w==", + "version": "3.0.0-alpha.89", + "resolved": "https://registry.npmjs.org/utopia-ui/-/utopia-ui-3.0.0-alpha.89.tgz", + "integrity": "sha512-/3KLLY/HcKWSLuJpmkx4bB5aOPycfC56ZJGAuvUBxOCGlY74a/FvI3yMLTVeDWtj9rkCOXPS/PA79YpHeomGcA==", "dependencies": { "@heroicons/react": "^2.0.17", "@tanstack/react-query": "^5.17.8", "@types/offscreencanvas": "^2019.7.1", "axios": "^1.6.5", + "date-fns": "^3.3.1", "leaflet": "^1.9.4", "leaflet.locatecontrol": "^0.79.0", "prop-types": "^15.8.1", diff --git a/package.json b/package.json index d2e5cdd0..d6d9ce3a 100644 --- a/package.json +++ b/package.json @@ -14,13 +14,15 @@ "@heroicons/react": "^2.1.1", "@types/geojson": "^7946.0.10", "axios": "^1.6.5", + "date-fns": "^3.3.1", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-rnd": "^10.4.1", "react-router-dom": "^6.11.2", - "utopia-ui": "^3.0.0-alpha.77" + "utopia-ui": "^3.0.0-alpha.89" }, "devDependencies": { - "@types/react": "^18.0.28", + "@types/react": "^18.2.60", "@types/react-dom": "^18.0.11", "@typescript-eslint/eslint-plugin": "^5.57.1", "@typescript-eslint/parser": "^5.57.1", diff --git a/public/bg1.webp b/public/bg1.webp new file mode 100644 index 00000000..44d94aa8 Binary files /dev/null and b/public/bg1.webp differ diff --git a/src/App.css b/src/App.css index ce9ad712..cf7a655b 100644 --- a/src/App.css +++ b/src/App.css @@ -7,3 +7,25 @@ height: calc(100dvh - 64px); } +.fadeable-div { + transition: opacity 1000ms ease; + opacity: 1; +} + +.div-hidden { + opacity: 0; +} + +.movable-div { + transition: transform 600ms ease; + transform: translateX(0); +} + +.move-out-right { + transform: translateX(100vw); /* Verschiebt das Div um die Breite des Viewports */ +} + + +.move-out-left { + transform: translateX(-100vw); /* Verschiebt das Div um die Breite des Viewports */ +} \ No newline at end of file diff --git a/src/App.tsx b/src/App.tsx index 2a82d5db..516e60e1 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,17 +1,29 @@ -import { AppShell, SideBar, Content, AuthProvider, Modal, LoginPage, SignupPage, Quests, RequestPasswordPage, SetNewPasswordPage, OverlayProfile, OverlayProfileSettings, OverlayUserSettings } from 'utopia-ui' +import { AppShell, SideBar, Content, AuthProvider, Modal, LoginPage, SignupPage, Quests, RequestPasswordPage, SetNewPasswordPage, OverlayProfile, OverlayProfileSettings, OverlayUserSettings, ItemsIndexPage, ItemViewPage } from 'utopia-ui' import { bottomRoutes, routes } from './routes/sidebar' import { Route, Routes } from 'react-router-dom' import MapContainer from "./pages/MapContainer" import './App.css' import Concept from './pages/Concept' import { userApi } from './api/userApi' -import Projects from './pages/Projects' -import { ProjectView } from './pages/ProjectView' import { assetsApi } from './api/assetsApi' import { ModalContent } from './ModalContent' +import { Calendar } from './pages/Calendar' +import { MoonCalendar } from 'utopia-ui' +import { Landingpage } from './pages/Landingpage' +import { useEffect, useState } from 'react' +import { Project } from './api/directus' +import { itemsApi } from './api/itemsApi' function App() { + const [questsApi, setQuestsApi] = useState>(); + + + useEffect(() => { + setQuestsApi(new itemsApi('quests',undefined, undefined, {"status":{"_eq": "published"}})); + }, []) + + return (
@@ -33,10 +45,13 @@ function App() { } /> } /> } /> + } /> + } /> + } /> } /> - } /> - } /> + } /> + } /> diff --git a/src/pages/Calendar.tsx b/src/pages/Calendar.tsx new file mode 100644 index 00000000..826a346e --- /dev/null +++ b/src/pages/Calendar.tsx @@ -0,0 +1,102 @@ +import React, { useState } from 'react' +import { + add, + eachDayOfInterval, + endOfMonth, + endOfWeek, + format, + getDay, + isSameMonth, + isToday, + parse, + startOfToday, + startOfWeek, + } from "date-fns"; +import { ChevronLeftIcon, ChevronRightIcon } from '@heroicons/react/24/outline'; +import { MapOverlayPage } from 'utopia-ui'; + + +export const Calendar = () => { + const today = startOfToday(); + const days = ["sun", "mon", "tue", "wed", "thu", "fri", "sat"]; + const colStartClasses = [ + "", + "col-start-2", + "col-start-3", + "col-start-4", + "col-start-5", + "col-start-6", + "col-start-7", + ]; + + const [currMonth, setCurrMonth] = useState(() => format(today, "MMM-yyyy")); + let firstDayOfMonth = parse(currMonth, "MMM-yyyy", new Date()); + + const daysInMonth = eachDayOfInterval({ + start: startOfWeek(firstDayOfMonth), + end: endOfWeek(endOfMonth(firstDayOfMonth)), + }); + + const getPrevMonth = (event: React.MouseEvent) => { + event.preventDefault(); + const firstDayOfPrevMonth = add(firstDayOfMonth, { months: -1 }); + setCurrMonth(format(firstDayOfPrevMonth, "MMM-yyyy")); + }; + + const getNextMonth = (event: React.MouseEvent) => { + event.preventDefault(); + const firstDayOfNextMonth = add(firstDayOfMonth, { months: 1 }); + setCurrMonth(format(firstDayOfNextMonth, "MMM-yyyy")); + }; + + return ( + +
+

+ {format(firstDayOfMonth, "MMMM yyyy")} +

+
+ + +
+
+
+
+ {days.map((day, idx) => { + return ( +
+ {capitalizeFirstLetter(day)} +
+ ); + })} +
+
+ {daysInMonth.map((day, idx) => { + return ( +
+

+ {format(day, "d")} +

+
+ ); + })} +
+
+ ); +} + +const capitalizeFirstLetter = (string: string) => { + return string +} \ No newline at end of file diff --git a/src/pages/Landingpage.tsx b/src/pages/Landingpage.tsx new file mode 100644 index 00000000..da1183c6 --- /dev/null +++ b/src/pages/Landingpage.tsx @@ -0,0 +1,199 @@ +import { useEffect, useState } from 'react'; +import { useNavigate } from 'react-router-dom' +import { MapOverlayPage } from 'utopia-ui' +import { itemsApi } from '../api/itemsApi'; + +export const Landingpage = () => { + + const [isLandingpageVisible, setIsLandingpageVisible] = useState(true); + const [isBoxVisible, setIsBoxVisible] = useState(true); + const [isPhoneVisible, setIsPhoneVisible] = useState(true); + + const [featuresApi, setFeaturesApi] = useState>(); + const [features, setFeatures] = useState(); + + + const [teamApi, setTeamApi] = useState>(); + const [team, setTeam] = useState(); + + const loadFeatures = async () => { + const items = await featuresApi?.getItems(); + setFeatures(items as any); + } + + const loadTeam = async () => { + const items = await teamApi?.getItems(); + setTeam(items as any); + } + + useEffect(() => { + setFeaturesApi(new itemsApi('features',undefined, undefined, {"status":{"_eq": "published"}})); + setTeamApi(new itemsApi('team')); + loadTeam(); + loadFeatures(); + }, []) + + useEffect(() => { + loadFeatures(); + }, [featuresApi]) + + + useEffect(() => { + loadTeam(); + }, [teamApi]) + + + + const navigate = useNavigate(); + + const startGame = () => { + setTimeout(() => { + setIsBoxVisible(false) + }, 200 + ) + setTimeout(() => { + setIsPhoneVisible(false) + }, 200 + ) + setTimeout(() => { + setIsLandingpageVisible(false) + }, 500 + ) + setTimeout(() => { + navigate("/") + }, 1500 + ) + } + + + + + + return ( + +
+
+
+
+ + + +
+

Utopia Game

+

ist mehr als nur ein Spiel. Es ist eine Bewegung, die darauf abzielt, die Spieler aus ihren virtuellen Welten zu befreien und sie zu inspirieren, das echte Leben zu erkunden, Fähigkeiten zu entwickeln und die Welt um sie herum zu gestalten. Bist du bereit, Teil dieser Revolution zu werden?

+
Play ▶
+
+ + +
+
+ + +
+
    + { + features?.map((item, idx) => ( +
  • +
    + {item.symbol} +
    +

    + {item.heading} +

    +

    + {item.text} +

    +
  • + )) + } +
+
+ +
+
+
+

+ Meet our team +

+

+ Lorem Ipsum is simply dummy text of the printing and typesetting industry.Lorem Ipsum has been the industry's standard dummy. +

+
+
+
    + { + team?.map((item, idx) => ( +
  • +
    + +
    +
    +

    {item.name}

    +

    {item.role}

    +

    {item.text}

    +
    +
    +
    +
  • + )) + } +
+
+
+
+ + +
+
+ + + +
+ ) +} diff --git a/src/pages/MapContainer.tsx b/src/pages/MapContainer.tsx index 80522fdb..fcfa061e 100644 --- a/src/pages/MapContainer.tsx +++ b/src/pages/MapContainer.tsx @@ -4,7 +4,7 @@ import { permissionsApi } from '../api/permissionsApi'; import { Place, Event, Tag } from '../api/directus'; import { useEffect, useState } from 'react'; import {CalendarDaysIcon, MapPinIcon, UserIcon} from '@heroicons/react/20/solid' -// import { refiBcnApi } from '../api/refiBcnApi'; + import { refiBcnApi } from '../api/refiBcnApi'; function MapContainer() { @@ -14,6 +14,7 @@ function MapContainer() { const [tagsApi, setTagsApi] = useState>(); const [permissionsApiInstance, setPermissionsApiInstance] = useState(); const [updatesApiInstance, setUpdatesApiInstance] = useState>(); + const [refiApi, setRefiApi] = useState(); @@ -25,6 +26,7 @@ function MapContainer() { setUpdatesApiInstance(new itemsApi('updates',"b4dd8b6b-80e8-4173-9682-4a5755e7b9cb", undefined, {"latest":{"_eq": true}})); setTagsApi(new itemsApi('tags', undefined, "8bf681a4-1b8d-44ba-afba-c6dbf79a769f")); setPermissionsApiInstance(new permissionsApi()); + setRefiApi(new refiBcnApi('refi')); }, []); @@ -94,8 +96,8 @@ function MapContainer() {
- {/** - */} + + diff --git a/src/pages/ProfileView.tsx b/src/pages/ProfileView.tsx deleted file mode 100644 index 5e24c7ed..00000000 --- a/src/pages/ProfileView.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { useState, useEffect } from "react"; -import { useLocation } from "react-router-dom"; -import { CardPage } from "utopia-ui"; -import { readUserApi } from "../api/readUserApi"; -import { UserItem } from "utopia-ui/dist/types"; - -export const ProfileView = () => { - - const [userApi, setUserApi] = useState(); - const [user, setUser] = useState(); - - let location = useLocation(); - - - const loadProject = async () => { - const user: unknown = await userApi?.getItem(location.pathname.split("/")[2]); - setUser(user as UserItem); - - } - - useEffect(() => { - setUserApi(new readUserApi()); - }, []) - - useEffect(() => { - loadProject(); - }, [userApi]) - - return ( - - {user && - <> -
- -

{user.avatar && } {user?.first_name}

- -
-

{user?.description}

- - - } - -
- ) -} diff --git a/src/pages/ProjectView.tsx b/src/pages/ProjectView.tsx deleted file mode 100644 index 170d2c65..00000000 --- a/src/pages/ProjectView.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { useState, useEffect } from "react"; -import { itemsApi } from "../api/itemsApi"; -import { Project } from '../api/directus' -import { useLocation } from "react-router-dom"; -import { CardPage } from "utopia-ui"; - -export const ProjectView = () => { - - const [projectsApi, setProjectsApi] = useState>(); - const [project, setProject] = useState(); - - let location = useLocation(); - - - const loadProject = async () => { - const project: unknown = await projectsApi?.getItem(location.pathname.split("/")[2]); - setProject(project as Project); - - } - - useEffect(() => { - setProjectsApi(new itemsApi('projects')); - }, []) - - useEffect(() => { - loadProject(); - }, [projectsApi]) - - return ( - - {project && - <> - -

{project?.subname}

-

{project?.text}

- - - } - -
- ) -} diff --git a/src/pages/Projects.tsx b/src/pages/Projects.tsx deleted file mode 100644 index 1adb421f..00000000 --- a/src/pages/Projects.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import { TitleCard } from 'utopia-ui' -import { useEffect, useState } from 'react' -import { Link } from 'react-router-dom' -import { itemsApi } from '../api/itemsApi' -import { Project } from '../api/directus' - - - - -export default function Projects() { - - - const [projectsApi, setProjectsApi] = useState>(); - const [projects, setProjects] = useState(); - - const loadProjects = async () => { - const projects = await projectsApi?.getItems(); - setProjects(projects as any); - } - - useEffect(() => { - setProjectsApi(new itemsApi('projects')); - loadProjects(); - }, []) - - useEffect(() => { - loadProjects(); - }, [projectsApi]) - - return ( -
-
-
-
    -
  • Home
  • -
  • Projects
  • -
-
- {/** -
- { setSearch(val) }}> - { }} placeholder="Type" containerStyle=' hidden md:grid' defaultValue='PLACEHOLDER' options={[{ name: "local", value: "local" }, { name: "project", value: "project" }]} /> -
-
- - */} - - - -
- { - projects?.map((i, k) => { - return ( - - - -

{i.subname}

- -

{i.text}

- {/** - *
-
 2
-
 5
-
 9
-
- - */} - - -
- - ) - - }) - } -
-
-
- - - ) -} diff --git a/src/routes/sidebar.tsx b/src/routes/sidebar.tsx index 86949e97..19d4a9ce 100644 --- a/src/routes/sidebar.tsx +++ b/src/routes/sidebar.tsx @@ -1,5 +1,5 @@ -import { BookOpenIcon, RectangleGroupIcon, MapIcon } from '@heroicons/react/24/outline' +import { BookOpenIcon, CheckBadgeIcon, MapIcon } from '@heroicons/react/24/outline' //const iconClasses = `h-6 w-6` //const submenuIconClasses = `h-5 w-5` @@ -12,9 +12,9 @@ export const routes = [ name: 'Map', }, { - path: '/projects', // url - icon: , // icon component - name: 'Projects', // name that appear in Sidebar + path: '/quests', // url + icon: , // icon component + name: 'Quests', // name that appear in Sidebar }/** { path: '/people', // url diff --git a/tailwind.config.js b/tailwind.config.js index ace4f2c0..51cedbf7 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -2,7 +2,12 @@ export default { content: ["./src/**/*.{html,js,jsx,tsx,ts}"], theme: { - extend: {}, + extend: { + // that is animation class + animation: { + fade: 'fadeOut 1s ease-in-out', + }, + }, }, plugins: [require("daisyui")], daisyui: { diff --git a/tsconfig.json b/tsconfig.json index 49c2e5fa..0e007872 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -19,6 +19,6 @@ "noUnusedParameters": true, "noFallthroughCasesInSwitch": true }, - "include": ["src", "../utopia-ui/src/Components/Templates/CardPage.tsx"], + "include": ["src", "../utopia-ui/src/Components/Templates/CardPage.tsx", "../../workspace/utopia-ui/src/Components/Templates/MoonCalendar.tsx", "../../workspace/utopia-ui/src/Components/Templates/ItemIndexPage.tsx"], "references": [{ "path": "./tsconfig.node.json" }] }