├── bun.lockb ├── .example.env ├── app ├── favicon.ico ├── opengraph-image.tsx ├── layout.tsx ├── page.tsx ├── context │ └── ThemeContext.tsx └── globals.css ├── public ├── vercel.svg ├── window.svg ├── file.svg ├── globe.svg └── next.svg ├── postcss.config.mjs ├── next.config.ts ├── tailwind.config.ts ├── eslint.config.mjs ├── lib └── cosmic.ts ├── .gitignore ├── tsconfig.json ├── package.json ├── components ├── ThemeToggle.tsx └── Slideshow.tsx ├── README.md └── bucket.json /bun.lockb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmicjs/cosmic-slideshow/main/bun.lockb -------------------------------------------------------------------------------- /.example.env: -------------------------------------------------------------------------------- 1 | COSMIC_BUCKET_SLUG=your_bucket_slug 2 | COSMIC_READ_KEY=your_bucket_read_key 3 | -------------------------------------------------------------------------------- /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmicjs/cosmic-slideshow/main/app/favicon.ico -------------------------------------------------------------------------------- /public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /postcss.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('postcss-load-config').Config} */ 2 | const config = { 3 | plugins: { 4 | tailwindcss: {}, 5 | }, 6 | }; 7 | 8 | export default config; 9 | -------------------------------------------------------------------------------- /next.config.ts: -------------------------------------------------------------------------------- 1 | import type { NextConfig } from "next"; 2 | 3 | const nextConfig: NextConfig = { 4 | /* config options here */ 5 | images: { 6 | remotePatterns: [ 7 | { 8 | hostname: "imgix.cosmicjs.com", 9 | }, 10 | ], 11 | }, 12 | }; 13 | 14 | export default nextConfig; 15 | -------------------------------------------------------------------------------- /public/window.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/file.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tailwind.config.ts: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | import typography from "@tailwindcss/typography"; 3 | 4 | export default { 5 | content: [ 6 | "./pages/**/*.{js,ts,jsx,tsx,mdx}", 7 | "./components/**/*.{js,ts,jsx,tsx,mdx}", 8 | "./app/**/*.{js,ts,jsx,tsx,mdx}", 9 | ], 10 | darkMode: "class", 11 | theme: { 12 | extend: {}, 13 | }, 14 | plugins: [typography], 15 | }; 16 | -------------------------------------------------------------------------------- /app/opengraph-image.tsx: -------------------------------------------------------------------------------- 1 | /* eslint-disable @next/next/no-img-element */ 2 | import { ImageResponse } from "next/og"; 3 | import { getSettings } from "@/lib/cosmic"; 4 | 5 | export default async function Image() { 6 | const settings = await getSettings(); 7 | return new ImageResponse( 8 | ( 9 | {settings.metadata.title} 13 | ) 14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import { dirname } from "path"; 2 | import { fileURLToPath } from "url"; 3 | import { FlatCompat } from "@eslint/eslintrc"; 4 | 5 | const __filename = fileURLToPath(import.meta.url); 6 | const __dirname = dirname(__filename); 7 | 8 | const compat = new FlatCompat({ 9 | baseDirectory: __dirname, 10 | }); 11 | 12 | const eslintConfig = [ 13 | ...compat.extends("next/core-web-vitals", "next/typescript"), 14 | ]; 15 | 16 | export default eslintConfig; 17 | -------------------------------------------------------------------------------- /lib/cosmic.ts: -------------------------------------------------------------------------------- 1 | import { createBucketClient } from "@cosmicjs/sdk"; 2 | 3 | const cosmic = createBucketClient({ 4 | bucketSlug: process.env.COSMIC_BUCKET_SLUG as string, 5 | readKey: process.env.COSMIC_READ_KEY as string, 6 | }); 7 | 8 | export default cosmic; 9 | 10 | export const getSettings = async (): Promise<{ 11 | metadata: { 12 | title: string; 13 | description: string; 14 | og_image: { imgix_url: string }; 15 | }; 16 | }> => { 17 | const { object: settings } = await cosmic.objects 18 | .findOne({ 19 | type: "settings", 20 | slug: "settings", 21 | }) 22 | .props(`metadata`); 23 | return settings; 24 | }; 25 | -------------------------------------------------------------------------------- /app/layout.tsx: -------------------------------------------------------------------------------- 1 | import "./globals.css"; 2 | import { ThemeProvider } from "./context/ThemeContext"; 3 | import { getSettings } from "@/lib/cosmic"; 4 | 5 | export const generateMetadata = async () => { 6 | const settings = await getSettings(); 7 | return { 8 | title: settings.metadata.title, 9 | description: settings.metadata.description, 10 | }; 11 | }; 12 | 13 | export default function RootLayout({ 14 | children, 15 | }: { 16 | children: React.ReactNode; 17 | }) { 18 | return ( 19 | 20 | 21 | {children} 22 | 23 | 24 | ); 25 | } 26 | -------------------------------------------------------------------------------- /.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.* 7 | .yarn/* 8 | !.yarn/patches 9 | !.yarn/plugins 10 | !.yarn/releases 11 | !.yarn/versions 12 | 13 | # testing 14 | /coverage 15 | 16 | # next.js 17 | /.next/ 18 | /out/ 19 | 20 | # production 21 | /build 22 | 23 | # misc 24 | .DS_Store 25 | *.pem 26 | 27 | # debug 28 | npm-debug.log* 29 | yarn-debug.log* 30 | yarn-error.log* 31 | .pnpm-debug.log* 32 | 33 | # env files (can opt-in for committing if needed) 34 | .env* 35 | 36 | # vercel 37 | .vercel 38 | 39 | # typescript 40 | *.tsbuildinfo 41 | next-env.d.ts 42 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2017", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "noEmit": true, 9 | "esModuleInterop": true, 10 | "module": "esnext", 11 | "moduleResolution": "bundler", 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "jsx": "preserve", 15 | "incremental": true, 16 | "plugins": [ 17 | { 18 | "name": "next" 19 | } 20 | ], 21 | "paths": { 22 | "@/*": ["./*"] 23 | } 24 | }, 25 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 26 | "exclude": ["node_modules"] 27 | } 28 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cosmic-slideshow", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev --turbopack", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "@cosmicjs/sdk": "^1.3.1", 13 | "framer-motion": "^11.14.1", 14 | "lucide-react": "^0.468.0", 15 | "next": "15.1.0", 16 | "react": "^19.0.0", 17 | "react-dom": "^19.0.0", 18 | "react-markdown": "^9.0.1", 19 | "react-swipeable": "^7.0.2" 20 | }, 21 | "devDependencies": { 22 | "@eslint/eslintrc": "^3", 23 | "@tailwindcss/typography": "^0.5.15", 24 | "@types/node": "^20", 25 | "@types/react": "^19", 26 | "@types/react-dom": "^19", 27 | "eslint": "^9", 28 | "eslint-config-next": "15.1.0", 29 | "postcss": "^8", 30 | "tailwindcss": "^3.4.1", 31 | "typescript": "^5" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /public/globe.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /components/ThemeToggle.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { useTheme } from "@/app/context/ThemeContext"; 4 | import { SunIcon, MoonIcon } from "lucide-react"; 5 | import { useState, useEffect } from "react"; 6 | 7 | export default function ThemeToggle() { 8 | const { theme, toggleTheme } = useTheme(); 9 | const [isMac, setIsMac] = useState(false); 10 | 11 | useEffect(() => { 12 | setIsMac(navigator.platform.toUpperCase().indexOf("MAC") >= 0); 13 | }, []); 14 | 15 | return ( 16 | 32 | ); 33 | } 34 | -------------------------------------------------------------------------------- /public/next.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Cosmic Slideshow Template 2 | 3 | ![Cosmic 2024 Year In Review](https://imgix.cosmicjs.com/b6528c00-b8b1-11ef-bee4-3bb1d3c55332-onboarding.png?w=1200) 4 | 5 | [View the demo](https://year-end-wrap-up-2024.vercel.app/) 6 | 7 | ## Getting started 8 | 1. Create a new project in the [Cosmic dashboard](https://app.cosmicjs.com/login). 9 | 2. In your project, go to the Settings > Import / Export area. 10 | 3. Download and install the [Bucket JSON file](https://github.com/cosmicjs/cosmic-slideshow/blob/main/bucket.json) to install the slideshow content model and demo content. See screenshot below: 11 | CleanShot 2024-12-18 at 12 16 41@2x 12 | 13 | 14 | ## Download and run locally 15 | Download this code: 16 | ```bash 17 | git clone https://github.com/cosmicjs/cosmic-slideshow 18 | cd cosmic-slideshow 19 | ``` 20 | Copy the `.example.env` file to `.env`: 21 | ```bash 22 | mv .example.env .env 23 | ``` 24 | 25 | Add your API keys found in the Cosmic dashboard located in Project > API keys. 26 | ```bash 27 | COSMIC_BUCKET_SLUG=your_bucket_slug 28 | COSMIC_READ_KEY=your_bucket_read_key 29 | ``` 30 | Install packages 31 | ```bash 32 | npm i 33 | # or 34 | pnpm i 35 | # or 36 | yarn i 37 | # or 38 | bun i 39 | ``` 40 | Run locally 41 | ```bash 42 | npm run dev 43 | # or 44 | pnpm run dev 45 | # or 46 | yarn dev 47 | # or 48 | bun dev 49 | ``` 50 | 51 | -------------------------------------------------------------------------------- /app/page.tsx: -------------------------------------------------------------------------------- 1 | import Link from "next/link"; 2 | import Slideshow from "@/components/Slideshow"; 3 | import cosmic from "@/lib/cosmic"; 4 | import ThemeToggle from "@/components/ThemeToggle"; 5 | import { HomeIcon, GithubIcon } from "lucide-react"; 6 | 7 | export default async function Home({ 8 | searchParams, 9 | }: { 10 | searchParams: Promise<{ slide?: string }>; 11 | }) { 12 | const { slide } = await searchParams; 13 | 14 | const { objects } = await cosmic.objects 15 | .find({ 16 | type: "webinar-slides", 17 | }) 18 | .props(["slug", "title", "metadata"]) 19 | .depth(1) 20 | .sort("-order"); 21 | 22 | const initialSlide = slide 23 | ? Math.min(Math.max(parseInt(slide) - 1, 0), objects.length - 1) 24 | : 0; 25 | 26 | return ( 27 |
28 |
29 | 30 | 31 | 32 |
33 | 40 | 41 | 42 | 43 |
44 |
45 | 46 |
47 | ); 48 | } 49 | -------------------------------------------------------------------------------- /app/context/ThemeContext.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { createContext, useContext, useEffect, useState } from "react"; 4 | 5 | type Theme = "light" | "dark"; 6 | 7 | type ThemeContextType = { 8 | theme: Theme; 9 | toggleTheme: () => void; 10 | }; 11 | 12 | const ThemeContext = createContext(undefined); 13 | 14 | export function ThemeProvider({ children }: { children: React.ReactNode }) { 15 | const [theme, setTheme] = useState("dark"); 16 | 17 | useEffect(() => { 18 | const savedTheme = localStorage.getItem("theme") as Theme; 19 | if (savedTheme) { 20 | setTheme(savedTheme); 21 | document.documentElement.classList.toggle("dark", savedTheme === "dark"); 22 | } 23 | 24 | const handleKeyDown = (e: KeyboardEvent) => { 25 | if (e.key === "/" && (e.metaKey || e.ctrlKey)) { 26 | e.preventDefault(); 27 | const newTheme = theme === "light" ? "dark" : "light"; 28 | setTheme(newTheme); 29 | localStorage.setItem("theme", newTheme); 30 | document.documentElement.classList.toggle("dark", newTheme === "dark"); 31 | } 32 | }; 33 | 34 | window.addEventListener("keydown", handleKeyDown); 35 | return () => window.removeEventListener("keydown", handleKeyDown); 36 | }, [theme]); 37 | 38 | const toggleTheme = () => { 39 | const newTheme = theme === "light" ? "dark" : "light"; 40 | setTheme(newTheme); 41 | localStorage.setItem("theme", newTheme); 42 | document.documentElement.classList.toggle("dark", newTheme === "dark"); 43 | }; 44 | 45 | return ( 46 | 47 | {children} 48 | 49 | ); 50 | } 51 | 52 | export function useTheme() { 53 | const context = useContext(ThemeContext); 54 | if (context === undefined) { 55 | throw new Error("useTheme must be used within a ThemeProvider"); 56 | } 57 | return context; 58 | } 59 | -------------------------------------------------------------------------------- /app/globals.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | html, 6 | body { 7 | margin: 0; 8 | padding: 0; 9 | overflow: hidden; 10 | font-size: 20px; 11 | } 12 | 13 | /* Custom prose styles */ 14 | .prose h1 { 15 | font-size: 2.5rem !important; 16 | line-height: 1.2 !important; 17 | margin-bottom: 1rem !important; 18 | font-weight: 700 !important; 19 | } 20 | 21 | @media (min-width: 640px) { 22 | .prose h1 { 23 | font-size: 4rem !important; 24 | } 25 | } 26 | 27 | .prose h2 { 28 | font-size: 1.5rem !important; 29 | line-height: 1.2 !important; 30 | margin-bottom: 1.25rem !important; 31 | margin-top: 1.25rem !important; 32 | font-weight: 700 !important; 33 | } 34 | 35 | @media (min-width: 640px) { 36 | .prose h2 { 37 | font-size: 2rem !important; 38 | margin-bottom: 1.5rem !important; 39 | margin-top: 1.5rem !important; 40 | } 41 | } 42 | 43 | .prose ul { 44 | list-style-type: disc !important; 45 | margin-left: .5rem !important; 46 | } 47 | 48 | .prose li { 49 | margin-bottom: 0.5rem !important; 50 | } 51 | 52 | .prose ol { 53 | list-style-type: decimal !important; 54 | margin-left: 2rem !important; 55 | } 56 | 57 | img { 58 | @apply rounded-lg; 59 | } 60 | 61 | .prose a { 62 | color: #2d6cdf !important; 63 | text-decoration: underline !important; 64 | text-underline-offset: 2px !important; 65 | } 66 | 67 | .prose a:hover { 68 | opacity: 0.8 !important; 69 | } 70 | 71 | .prose p { 72 | margin-top: 0.5rem !important; 73 | margin-bottom: 0.5rem !important; 74 | } 75 | 76 | /* Custom scrollbar styles */ 77 | .prose::-webkit-scrollbar { 78 | width: 8px; 79 | } 80 | 81 | .prose::-webkit-scrollbar-track { 82 | background: rgba(255, 255, 255, 0.1); 83 | border-radius: 4px; 84 | } 85 | 86 | .prose::-webkit-scrollbar-thumb { 87 | background: rgba(255, 255, 255, 0.3); 88 | border-radius: 4px; 89 | } 90 | 91 | .prose::-webkit-scrollbar-thumb:hover { 92 | background: rgba(255, 255, 255, 0.4); 93 | } -------------------------------------------------------------------------------- /components/Slideshow.tsx: -------------------------------------------------------------------------------- 1 | /* eslint-disable @next/next/no-img-element */ 2 | "use client"; 3 | 4 | import { useState, useEffect, useCallback } from "react"; 5 | import { motion, AnimatePresence } from "framer-motion"; 6 | import ReactMarkdown from "react-markdown"; 7 | import { useRouter, useSearchParams } from "next/navigation"; 8 | import { useTheme } from "@/app/context/ThemeContext"; 9 | import { useSwipeable } from "react-swipeable"; 10 | import Image from "next/image"; 11 | type Slide = { 12 | title: string; 13 | metadata: { 14 | slide_image?: { imgix_url: string }; 15 | slide_title?: string; 16 | slide_content: string; 17 | }; 18 | }; 19 | 20 | const fadeVariants = { 21 | hidden: { 22 | opacity: 0, 23 | }, 24 | visible: { 25 | opacity: 1, 26 | }, 27 | }; 28 | 29 | export default function Slideshow({ 30 | slides, 31 | initialSlide = 0, 32 | }: { 33 | slides: Slide[]; 34 | initialSlide?: number; 35 | }) { 36 | const [currentIndex, setCurrentIndex] = useState(initialSlide); 37 | const router = useRouter(); 38 | const searchParams = useSearchParams(); 39 | const { theme } = useTheme(); 40 | 41 | useEffect(() => { 42 | setCurrentIndex(initialSlide); 43 | }, [initialSlide]); 44 | 45 | const updateURL = useCallback( 46 | (index: number) => { 47 | const params = new URLSearchParams(searchParams); 48 | params.set("slide", (index + 1).toString()); 49 | router.push(`?${params.toString()}`, { scroll: false }); 50 | }, 51 | [router, searchParams] 52 | ); 53 | 54 | useEffect(() => { 55 | const handleKeyPress = (e: KeyboardEvent) => { 56 | if (e.key === "ArrowRight") { 57 | const nextIndex = (currentIndex + 1) % slides.length; 58 | setCurrentIndex(nextIndex); 59 | updateURL(nextIndex); 60 | } else if (e.key === "ArrowLeft") { 61 | const nextIndex = (currentIndex - 1 + slides.length) % slides.length; 62 | setCurrentIndex(nextIndex); 63 | updateURL(nextIndex); 64 | } 65 | }; 66 | 67 | window.addEventListener("keydown", handleKeyPress); 68 | return () => window.removeEventListener("keydown", handleKeyPress); 69 | }, [currentIndex, slides.length, updateURL]); 70 | 71 | const handleNavigation = useCallback( 72 | (direction: "next" | "prev") => { 73 | const nextIndex = 74 | direction === "next" 75 | ? (currentIndex + 1) % slides.length 76 | : (currentIndex - 1 + slides.length) % slides.length; 77 | setCurrentIndex(nextIndex); 78 | updateURL(nextIndex); 79 | }, 80 | [currentIndex, slides.length, updateURL] 81 | ); 82 | 83 | const currentSlide = slides[currentIndex]; 84 | 85 | const swipeHandlers = useSwipeable({ 86 | onSwipedLeft: () => handleNavigation("next"), 87 | onSwipedRight: () => handleNavigation("prev"), 88 | preventScrollOnSwipe: true, 89 | trackMouse: false, 90 | }); 91 | 92 | return ( 93 |
94 |
95 | 96 | 105 |
106 | {currentSlide.metadata.slide_title && ( 107 |

108 | {currentSlide.metadata.slide_title} 109 |

110 | )} 111 | {currentSlide.metadata.slide_image && ( 112 |
113 | {currentSlide.title} 120 |
121 | )} 122 | 153 |
154 |
155 |
156 |
157 |
158 | 165 | 166 | {currentIndex + 1} / {slides.length} 167 | 168 | 175 |
176 |
177 | ); 178 | } 179 | -------------------------------------------------------------------------------- /bucket.json: -------------------------------------------------------------------------------- 1 | {"version":"2","bucket":{"slug":"year-end-wrap-up-2024","title":"2024 Webinar","thumbnail":"b6528c00-b8b1-11ef-bee4-3bb1d3c55332-onboarding.png"},"object_types":[{"title":"Settings","slug":"settings","singular":"Settings","metafields":[{"id":"2deefe44-ee18-4083-a114-29a6628926a3","title":"Title","key":"title","type":"text","value":"","helptext":"","required":false,"is_root":false},{"id":"e7dd8453-832a-4e96-9ec1-2a8deb7f0e09","title":"Description","key":"description","type":"textarea","value":"","helptext":"","required":false,"is_root":false},{"id":"544303a1-bf3a-4788-a78c-621fd84f7cdc","title":"OG Image","key":"og_image","type":"file","value":"","helptext":"","required":false,"is_root":false,"media_validation_type":"image"}],"options":{"slug_field":true,"content_editor":false},"emoji":"⚙️","singleton":true,"created_at":"2024-12-13T21:06:34.485Z","modified_at":"2024-12-13T21:06:34.485Z","localization":false,"locales":[],"priority_locale":"","order":1},{"title":"Webinar Slides","slug":"webinar-slides","singular":"Webinar Slide","metafields":[{"type":"text","title":"Slide Title","key":"slide_title","required":true,"value":"","id":"b15573f4-d009-4922-955c-3d754a49d1b5"},{"type":"markdown","title":"Slide Content","key":"slide_content","value":"","id":"c0981263-643b-415e-8354-cfdf8e9f4be7"},{"type":"file","title":"Slide Image","key":"slide_image","value":"","media_validation_type":"image","id":"4355d064-a339-4f80-a4f9-501dcb764bbc"}],"options":{"slug_field":true,"content_editor":false},"emoji":"🎯","created_at":"2024-12-12T17:17:31.040Z","modified_at":"2024-12-12T18:29:16.330Z","localization":false,"locales":[],"priority_locale":"","folder":"","singleton":false,"order":0}],"objects":[{"_id":"675b1b1d88767cdc34b9b5d6","slug":"welcome","title":"Welcome","content":"","metafields":[{"id":"b15573f4-d009-4922-955c-3d754a49d1b5","key":"slide_title","value":"Welcome","type":"text"},{"id":"c0981263-643b-415e-8354-cfdf8e9f4be7","key":"slide_content","value":"In this slideshow, we'll cover:\n\n### 🧱 Blocks\n\n### ✨ Cosmic Intelligence\n\n### 🛠 JavaScript SDK updates\n\n### 📝 Cosmic Chrome Extension\n\n### 🏎 Dashboard updates\n\n### 😍 Showcase page\n\n### 🎁 Referral Program","type":"markdown"},{"id":"4355d064-a339-4f80-a4f9-501dcb764bbc","key":"slide_image","value":"afdaeb50-b8c6-11ef-bee4-3bb1d3c55332-cosmic-year-2024.png","type":"file"}],"type_slug":"webinar-slides","created_at":"2024-12-12T19:16:11.505Z","modified_at":"2024-12-16T19:12:59.713Z","status":"published","published_at":"2024-12-16T19:12:59.713Z","root_metadata":{},"order":1734031422680.001,"object_type_rev_id":"675b2b7c88767cdc34b9b620","publish_at":null,"thumbnail":"https://imgix.cosmicjs.com/afdaeb50-b8c6-11ef-bee4-3bb1d3c55332-cosmic-year-2024.png","publish_to_web":true},{"_id":"675b1d5388767cdc34b9b5dd","slug":"cosmic-intelligence","title":"Cosmic Intelligence","content":"","metafields":[{"id":"b15573f4-d009-4922-955c-3d754a49d1b5","key":"slide_title","value":"Cosmic Intelligence","type":"text"},{"id":"c0981263-643b-415e-8354-cfdf8e9f4be7","key":"slide_content","value":"## What can you do with Cosmic Intelligence?\n\n📝 Create AI generated text\n\n🎨 Create AI generated images\n\n🌎 Automatically translate content\n\n✨ Automatically add image alt text\n\n🏗 Use AI to generate content models\n\n🧑🏻\u200d💻 Use AI for development assistance and API chat\n\n📃 Get insights into media assets including PDFs and spreadsheets\n\n\n### Learn more\n\n[Read the Cosmic Intelligence blog post announcement](https://www.cosmicjs.com/blog/introducing-cosmic-intelligence)","type":"markdown"},{"id":"4355d064-a339-4f80-a4f9-501dcb764bbc","key":"slide_image","value":"316963c0-b8b0-11ef-bee4-3bb1d3c55332-image.png","type":"file"}],"type_slug":"webinar-slides","created_at":"2024-12-12T17:28:51.257Z","modified_at":"2024-12-13T21:46:39.641Z","status":"published","published_at":"2024-12-13T21:46:39.641Z","root_metadata":{},"order":1734023965198.999,"object_type_rev_id":"675b2b7c88767cdc34b9b620","publish_at":null,"thumbnail":"https://imgix.cosmicjs.com/316963c0-b8b0-11ef-bee4-3bb1d3c55332-image.png"},{"_id":"675b2b7488767cdc34b9b61e","slug":"blocks","title":"Blocks","content":"","metafields":[{"id":"b15573f4-d009-4922-955c-3d754a49d1b5","key":"slide_title","value":"Blocks","type":"text"},{"id":"c0981263-643b-415e-8354-cfdf8e9f4be7","key":"slide_content","value":"## What are Blocks?\n\n[Blocks](https://blocks.cosmicjs.com) are prebuilt website components you can drop into your project. Build optimized website features faster 🚀\n\n## Blocks features include\n\n📝 Blog\n\n👥 User management\n\n🏠 Landing page\n\n🛍️ Ecommerce (powered by Stripe 🛒)\n\n📨 Contact form (powered by Resend ✉️)\n\n📅 Events\n\n❓ FAQs\n\n⭐ Testimonials\n\n🧭 Navigation\n\n💬 Comments\n\n🖼️ Image gallery\n\n📤 File upload\n\n- and more!\n\n## Built with\n- React Server Components\n- Tailwind CSS\n- TypeScript\n- Next.js\n\n## Templates\n- [Agency Template](https://cosmic-agency-template.vercel.app/)\n- [Podcast Network](https://cosmic-podcast-network.vercel.app/)\n\n### Learn more\n\n[Read the Blocks blog post announcement](https://www.cosmicjs.com/blog/introducing-blocks)","type":"markdown"},{"id":"4355d064-a339-4f80-a4f9-501dcb764bbc","key":"slide_image","value":"bc9fc280-b8b6-11ef-bee4-3bb1d3c55332-image.png","type":"file"}],"type_slug":"webinar-slides","created_at":"2024-12-12T18:29:08.259Z","modified_at":"2024-12-18T17:46:48.363Z","status":"published","published_at":"2024-12-18T17:46:48.363Z","root_metadata":{},"order":1734028148259,"object_type_rev_id":"675b2b7c88767cdc34b9b620","publish_at":null,"thumbnail":"https://imgix.cosmicjs.com/bc9fc280-b8b6-11ef-bee4-3bb1d3c55332-image.png"},{"_id":"675b339888767cdc34b9b662","slug":"mission","title":"Mission","content":"","metafields":[{"id":"b15573f4-d009-4922-955c-3d754a49d1b5","key":"slide_title","value":"Our Mission","type":"text"},{"id":"c0981263-643b-415e-8354-cfdf8e9f4be7","key":"slide_content","value":"## Our aim is to build the best CMS in the world\n\nOur mission is to make the development process faster and easier for teams of developers and content editors. And make products people truly love.\n\n![CleanShot-2024-12-12-at-11-08-162x.png](https://imgix.cosmicjs.com/79320b60-b8bc-11ef-bee4-3bb1d3c55332-CleanShot-2024-12-12-at-11-08-162x.png)","type":"markdown"},{"id":"4355d064-a339-4f80-a4f9-501dcb764bbc","key":"slide_image","value":"31447e00-b8ad-11ef-bee4-3bb1d3c55332-generated-image.png","type":"file"}],"type_slug":"webinar-slides","created_at":"2024-12-12T19:03:55.666Z","modified_at":"2024-12-13T21:56:36.551Z","status":"published","published_at":"2024-12-13T21:56:36.551Z","root_metadata":{},"order":1734028148259.0005,"object_type_rev_id":"675b2b7c88767cdc34b9b620","publish_at":null,"thumbnail":"https://imgix.cosmicjs.com/31447e00-b8ad-11ef-bee4-3bb1d3c55332-generated-image.png"},{"_id":"675b383e88767cdc34b9b675","slug":"javascript-sdk-updates","title":"JavaScript SDK updates","content":"","metafields":[{"id":"b15573f4-d009-4922-955c-3d754a49d1b5","key":"slide_title","value":"JavaScript SDK updates","type":"text"},{"id":"c0981263-643b-415e-8354-cfdf8e9f4be7","key":"slide_content","value":"## A beautiful way to deliver content\n\nUpdates to the [Cosmic JavaScript SDK](https://www.npmjs.com/package/@cosmicjs/sdk) include:\n\n**Props graph syntax**\n\nWith the release of the JavaScript SDK v1.2.0 you can use graph style syntax to declare your API response properties. The shape you request is the shape you get.\n\n![image.png](https://imgix.cosmicjs.com/67cf2360-b8be-11ef-bee4-3bb1d3c55332-image.png)\n\n**Additional Media data**\n\n- Alt text\n- Dimensions\n\nRequest additional data using the `options` method.\n\n![CleanShot-2024-12-14-at-11-26-272x.png](https://imgix.cosmicjs.com/5c6d77d0-ba51-11ef-bee4-3bb1d3c55332-CleanShot-2024-12-14-at-11-26-272x.png)\n\nGet additional data from the API response.\n\n![CleanShot-2024-12-12-at-11-25-222x.png](https://imgix.cosmicjs.com/e031ecc0-b8be-11ef-bee4-3bb1d3c55332-CleanShot-2024-12-12-at-11-25-222x.png)\n\n### Learn more\nRead more in the [JavaScript SDK blog post](https://www.cosmicjs.com/blog/cosmic-javascript-sdk-updates-v120).","type":"markdown"},{"id":"4355d064-a339-4f80-a4f9-501dcb764bbc","key":"slide_image","value":"e3c960d0-b8bd-11ef-bee4-3bb1d3c55332-generated-image.png","type":"file"}],"type_slug":"webinar-slides","created_at":"2024-12-12T19:26:23.767Z","modified_at":"2024-12-14T19:28:06.368Z","status":"published","published_at":"2024-12-14T19:28:06.368Z","root_metadata":{},"order":1734023965198.998,"object_type_rev_id":"675b2b7c88767cdc34b9b620","publish_at":null,"thumbnail":"https://imgix.cosmicjs.com/e3c960d0-b8bd-11ef-bee4-3bb1d3c55332-generated-image.png"},{"_id":"675b3b1c88767cdc34b9b683","slug":"dashboard-updates","title":"Dashboard Updates","content":"","metafields":[{"id":"b15573f4-d009-4922-955c-3d754a49d1b5","key":"slide_title","value":"Dashboard Updates","type":"text"},{"id":"c0981263-643b-415e-8354-cfdf8e9f4be7","key":"slide_content","value":"We shipped features and improvements to the dashboard including:\n\n## 🌃 Media updates\n- Multi media metafield to create multimedia galleries easily\n![image.png](https://imgix.cosmicjs.com/dca1fe20-658e-11ef-b5ae-a594bb4a8e67-multi-media-metafield-light.gif?auto=compress)\n- Image cropper tool\n![image.png](https://imgix.cosmicjs.com/136459b0-b8c0-11ef-bee4-3bb1d3c55332-image.png)\n\n## 🔍 Improved contextual search\n- Now search by area in the dashboard\n![Video Title](https://cdn.cosmicjs.com/6041eae0-2842-11ef-adb1-8b946b3a80e4-contextual-search-media.mp4)\n\n## ↕️ Sort by metadata\n\nSorting by metadata became available in the dashboard and API. Go to the [Cosmic docs Objects section](https://www.cosmicjs.com/docs/api/objects#get-objects) for instructions on how to use metadata sorting in the API and client SDKs.\n\n![metadata-search.gif](https://imgix.cosmicjs.com/92966020-b99c-11ef-bee4-3bb1d3c55332-metadata-search.gif)\n\n## 📄 Cosmic Pages\n- Share Cosmic Objects easily to anyone without having to log into Cosmic\n![image.png](https://imgix.cosmicjs.com/6d6ee330-b8c0-11ef-bee4-3bb1d3c55332-image.png)\n\n## 🔧 More integrations\n- We've expanded our ecosystem to include more powerful third-party integrations. Enabling seamless connections to deployment, communication, ecommerce, search, and more.\n![CleanShot-2024-12-14-at-11-23-352x.png](https://imgix.cosmicjs.com/00a0cbf0-ba51-11ef-bee4-3bb1d3c55332-CleanShot-2024-12-14-at-11-23-352x.png)","type":"markdown"},{"id":"4355d064-a339-4f80-a4f9-501dcb764bbc","key":"slide_image","value":"95dcbaf0-b8bf-11ef-bee4-3bb1d3c55332-generated-image.png","type":"file"}],"type_slug":"webinar-slides","created_at":"2024-12-13T22:03:12.565Z","modified_at":"2024-12-14T19:24:46.572Z","status":"published","published_at":"2024-12-14T19:24:46.572Z","root_metadata":{},"order":1734023965198.9985,"object_type_rev_id":"675b2b7c88767cdc34b9b620","publish_at":null,"thumbnail":"https://imgix.cosmicjs.com/95dcbaf0-b8bf-11ef-bee4-3bb1d3c55332-generated-image.png"},{"_id":"675b3e8588767cdc34b9b68f","slug":"showcase-page","title":"Showcase Page","content":"","metafields":[{"id":"b15573f4-d009-4922-955c-3d754a49d1b5","key":"slide_title","value":"Showcase Page","type":"text"},{"id":"c0981263-643b-415e-8354-cfdf8e9f4be7","key":"slide_content","value":"We shipped a new showcase page that shows off some of the beautiful products built with Cosmic. 😍\n\n### Learn more\nGo to the [showcase page](https://www.cosmicjs.com/showcase).","type":"markdown"},{"id":"4355d064-a339-4f80-a4f9-501dcb764bbc","key":"slide_image","value":"35523180-b8c2-11ef-bee4-3bb1d3c55332-CleanShot-2024-12-12-at-11-49-042x.png","type":"file"}],"type_slug":"webinar-slides","created_at":"2024-12-12T19:50:29.585Z","modified_at":"2024-12-13T22:32:50.751Z","status":"published","thumbnail":"https://imgix.cosmicjs.com/35523180-b8c2-11ef-bee4-3bb1d3c55332-CleanShot-2024-12-12-at-11-49-042x.png","published_at":"2024-12-13T22:32:50.751Z","root_metadata":{},"order":1734023965198.996,"object_type_rev_id":"675b2b7c88767cdc34b9b620","publish_at":null},{"_id":"675b3ef788767cdc34b9b693","slug":"referral-program","title":"Referral Program","content":"","metafields":[{"id":"b15573f4-d009-4922-955c-3d754a49d1b5","key":"slide_title","value":"Cosmic Referral Program","type":"text"},{"id":"c0981263-643b-415e-8354-cfdf8e9f4be7","key":"slide_content","value":"Join the Cosmic Referral Program and earn rewards for you and anyone you refer to Cosmic.\n\n### Learn more\nGo to the [Cosmic Referral Program blog post](https://www.cosmicjs.com/blog/introducing-the-cosmic-referral-program).","type":"markdown"},{"id":"4355d064-a339-4f80-a4f9-501dcb764bbc","key":"slide_image","value":"85668770-b8c2-11ef-bee4-3bb1d3c55332-image.png","type":"file"}],"type_slug":"webinar-slides","created_at":"2024-12-12T19:52:23.876Z","modified_at":"2024-12-16T16:29:55.123Z","status":"published","thumbnail":"https://imgix.cosmicjs.com/85668770-b8c2-11ef-bee4-3bb1d3c55332-image.png","published_at":"2024-12-16T16:29:55.123Z","root_metadata":{},"order":1734023965198.995,"object_type_rev_id":"675b2b7c88767cdc34b9b620","publish_at":null},{"_id":"675b403188767cdc34b9b69c","slug":"thank-you","title":"Thank You","content":"","metafields":[{"id":"b15573f4-d009-4922-955c-3d754a49d1b5","key":"slide_title","value":"Thank You","type":"text"},{"id":"c0981263-643b-415e-8354-cfdf8e9f4be7","key":"slide_content","value":"## Cheers to a great year 🥂\n\nThank you for being a part of our mission to provide the best CMS experience in the world. Cheers to 2024, we can't wait to see what you build in 2025!\n\n## Links\n- [Cosmic Discord Community](https://discord.gg/MSCwQ7D6Mg)\n- [Cosmic Feature Requests](https://cosmic.canny.io/feature-requests)","type":"markdown"},{"id":"4355d064-a339-4f80-a4f9-501dcb764bbc","key":"slide_image","value":"7fec70b0-b8c3-11ef-bee4-3bb1d3c55332-generated-image.png","type":"file"}],"type_slug":"webinar-slides","created_at":"2024-12-12T20:00:34.691Z","modified_at":"2024-12-18T17:54:05.121Z","status":"published","thumbnail":"https://imgix.cosmicjs.com/7fec70b0-b8c3-11ef-bee4-3bb1d3c55332-generated-image.png","published_at":"2024-12-18T17:54:05.121Z","root_metadata":{},"order":1734023965198.9941,"object_type_rev_id":"675b2b7c88767cdc34b9b620","publish_at":null},{"_id":"675ca2e488767cdc34b9b938","slug":"settings","title":"Settings","content":"","metafields":[{"id":"2deefe44-ee18-4083-a114-29a6628926a3","key":"title","value":"Cosmic 2024 Year End Wrap Up","type":"text"},{"id":"e7dd8453-832a-4e96-9ec1-2a8deb7f0e09","key":"description","value":"Cosmic 2024 Year End Wrap Up Slideshow","type":"textarea"},{"id":"544303a1-bf3a-4788-a78c-621fd84f7cdc","key":"og_image","value":"afdaeb50-b8c6-11ef-bee4-3bb1d3c55332-cosmic-year-2024.png","type":"file"}],"type_slug":"settings","created_at":"2024-12-13T21:11:00.405Z","modified_at":"2024-12-13T21:11:00.405Z","status":"published","thumbnail":"https://imgix.cosmicjs.com/afdaeb50-b8c6-11ef-bee4-3bb1d3c55332-cosmic-year-2024.png","published_at":"2024-12-13T21:11:00.405Z","root_metadata":{},"order":1734124260405,"object_type_rev_id":"675ca1da88767cdc34b9b937"},{"_id":"675ca51e88767cdc34b9b93d","slug":"who","title":"Who?","content":"","metafields":[{"id":"b15573f4-d009-4922-955c-3d754a49d1b5","key":"slide_title","value":"Who's this guy?","type":"text"},{"id":"c0981263-643b-415e-8354-cfdf8e9f4be7","key":"slide_content","value":"## Tony Spiro\n\n- CEO of Cosmic. ✨\n- Grew up in Los Angeles, California. ☀️\n- Studied music composition and performance because I love jazz music. 🎶\n- After graduating music school, performed professionally all over the world. 🌎\n- Spent 20 years living in Texas. 🤠\n- Self-taught software engineer. 💻\n- Founded Cosmic in 2016. 🛠️\n- Attended Y Combinator (W19). 🟧\n- Live in SF bay area. 🌉\n- When not building digital products, find me playing music (🥁, 🎹, 🎸), hiking 🗻, surfing 🏄🏻\u200d♂️, and grilling. 🥩\n\n\nWant to learn more? [Follow me on X](https://x.com/tonyspiro).","type":"markdown"},{"id":"4355d064-a339-4f80-a4f9-501dcb764bbc","key":"slide_image","value":"b509ca60-b998-11ef-bee4-3bb1d3c55332-IMG_5622.jpg","type":"file"}],"type_slug":"webinar-slides","created_at":"2024-12-13T21:25:33.129Z","modified_at":"2024-12-14T19:30:52.788Z","status":"published","published_at":"2024-12-14T19:30:52.788Z","root_metadata":{},"order":1734029785469.5007,"object_type_rev_id":"675b2b7c88767cdc34b9b620","publish_at":null,"thumbnail":"https://imgix.cosmicjs.com/b509ca60-b998-11ef-bee4-3bb1d3c55332-IMG_5622.jpg"},{"_id":"675ca82888767cdc34b9b94b","slug":"lfg-2025","title":"LFG 2025","content":"","metafields":[{"id":"b15573f4-d009-4922-955c-3d754a49d1b5","key":"slide_title","value":"LFG 2025","type":"text"},{"id":"c0981263-643b-415e-8354-cfdf8e9f4be7","key":"slide_content","value":"## What's on the roadmap?\n\n💬 Comments\n\n📁 More powerful media organization (did someone say subfolders?)\n\n✨ AI workflow improvements (end-to-end natural language content editing and development)\n\n🚀 API improvements (options for flattened metadata, AI enhanced content creation and delivery)\n\nand more 🤐 \n\n\n### Learn more\n- Follow [our changelog](https://www.cosmicjs.com/changelog).\n- Add your own [feature requests](https://cosmic.canny.io/feature-requests).\n","type":"markdown"},{"id":"4355d064-a339-4f80-a4f9-501dcb764bbc","key":"slide_image","value":"de7a3320-b999-11ef-bee4-3bb1d3c55332-generated-image.png","type":"file"}],"type_slug":"webinar-slides","created_at":"2024-12-13T22:31:52.750Z","modified_at":"2024-12-16T16:31:09.905Z","status":"published","thumbnail":"https://imgix.cosmicjs.com/de7a3320-b999-11ef-bee4-3bb1d3c55332-generated-image.png","published_at":"2024-12-16T16:31:09.905Z","root_metadata":{},"order":1734023965198.9946,"object_type_rev_id":"675b2b7c88767cdc34b9b620","publish_at":null},{"_id":"67607917cc2a5b8f4dddba77","slug":"cosmic-chrome-extension","title":"Cosmic Chrome Extension","content":"","metafields":[{"id":"b15573f4-d009-4922-955c-3d754a49d1b5","key":"slide_title","value":"Cosmic Chrome Extension","type":"text"},{"id":"c0981263-643b-415e-8354-cfdf8e9f4be7","key":"slide_content","value":"We released the [Cosmic Chrome Extension](https://chromewebstore.google.com/detail/cosmic-chrome-extension/ooihoppnbephpmmpiadjmpeicihmjong) to help create seamless links between your website and your content in your Cosmic dashboard.\n\n### Example\nCheck out the [Cosmic Podcast Network](https://cosmic-podcast-network.vercel.app/) for an example.\n\n### Learn more\n- Read about how to use the [Cosmic Chrome Extension in the docs](https://www.cosmicjs.com/docs/chrome-extension).","type":"markdown"},{"id":"4355d064-a339-4f80-a4f9-501dcb764bbc","key":"slide_image","value":"12f8ac10-bbe0-11ef-bee4-3bb1d3c55332-image.png","type":"file"}],"type_slug":"webinar-slides","created_at":"2024-12-16T19:01:43.046Z","modified_at":"2024-12-18T17:49:18.815Z","status":"published","published_at":"2024-12-18T17:49:18.815Z","root_metadata":{},"order":1734023965198.997,"object_type_rev_id":"675b2b7c88767cdc34b9b620","publish_at":null,"thumbnail":"https://imgix.cosmicjs.com/12f8ac10-bbe0-11ef-bee4-3bb1d3c55332-image.png"}],"media":[{"name":"00a0cbf0-ba51-11ef-bee4-3bb1d3c55332-CleanShot-2024-12-14-at-11-23-352x.png","original_name":"CleanShot-2024-12-14-at-11-23-352x.png","size":722112,"type":"image/png","created_at":"2024-12-14T19:24:13.896Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-14T19:24:13.896Z","modified_by":"63c18747a06c7f0008255851","width":2366,"height":1312},{"name":"0b1e3200-b8be-11ef-bee4-3bb1d3c55332-generated-image.png","original_name":"generated-image.png","size":2240491,"type":"image/png","created_at":"2024-12-12T19:19:44.275Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-12T19:19:44.275Z","modified_by":"63c18747a06c7f0008255851","width":1024,"height":1024},{"name":"115fd160-ac2e-11ef-bee4-3bb1d3c55332-generated-image.png","original_name":"generated-image.png","size":1781494,"type":"image/png","created_at":"2024-11-26T19:38:53.319Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-11-26T19:38:53.319Z","modified_by":"63c18747a06c7f0008255851","width":1024,"height":1024},{"name":"12f8ac10-bbe0-11ef-bee4-3bb1d3c55332-image.png","original_name":"image.png","size":552460,"type":"image/png","created_at":"2024-12-16T19:00:53.831Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-16T19:00:53.831Z","modified_by":"63c18747a06c7f0008255851","width":2000,"height":1400},{"name":"136459b0-b8c0-11ef-bee4-3bb1d3c55332-image.png","original_name":"image.png","size":657725,"type":"image/png","created_at":"2024-12-12T19:34:17.320Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-12T19:34:17.320Z","modified_by":"63c18747a06c7f0008255851","width":1200,"height":862},{"name":"195814a0-b8bc-11ef-bee4-3bb1d3c55332-CleanShot-2024-12-12-at-11-05-322x.png","original_name":"CleanShot-2024-12-12-at-11-05-322x.png","size":80141,"type":"image/png","created_at":"2024-12-12T19:05:49.259Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-12T19:05:49.259Z","modified_by":"63c18747a06c7f0008255851","width":1200,"height":412},{"name":"22c0cab0-b8bb-11ef-bee4-3bb1d3c55332-image.png","original_name":"image.png","size":1519102,"type":"image/png","created_at":"2024-12-12T18:58:55.467Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-12T18:58:55.467Z","modified_by":"63c18747a06c7f0008255851","width":2000,"height":1302},{"name":"31447e00-b8ad-11ef-bee4-3bb1d3c55332-generated-image.png","original_name":"generated-image.png","size":2096439,"type":"image/png","created_at":"2024-12-12T17:19:06.997Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-12T17:19:06.997Z","modified_by":"63c18747a06c7f0008255851","width":1024,"height":1024},{"name":"316963c0-b8b0-11ef-bee4-3bb1d3c55332-image.png","original_name":"image.png","size":469887,"type":"image/png","created_at":"2024-12-12T17:40:35.589Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-12T17:40:35.589Z","modified_by":"63c18747a06c7f0008255851","width":2000,"height":1093},{"name":"35523180-b8c2-11ef-bee4-3bb1d3c55332-CleanShot-2024-12-12-at-11-49-042x.png","original_name":"CleanShot-2024-12-12-at-11-49-042x.png","size":3571368,"type":"image/png","created_at":"2024-12-12T19:49:33.244Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-12T19:49:33.244Z","modified_by":"63c18747a06c7f0008255851","width":3248,"height":2638},{"name":"3c3ae320-ac2e-11ef-bee4-3bb1d3c55332-generated-image.png","original_name":"generated-image.png","size":2070885,"type":"image/png","created_at":"2024-11-26T19:40:05.203Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-11-26T19:40:05.203Z","modified_by":"63c18747a06c7f0008255851","width":1024,"height":1024},{"name":"4cfa99c0-b8c3-11ef-bee4-3bb1d3c55332-generated-image.png","original_name":"generated-image.png","size":1701726,"type":"image/png","created_at":"2024-12-12T19:57:22.336Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-12T19:57:22.336Z","modified_by":"63c18747a06c7f0008255851","width":1024,"height":1024},{"name":"5ad5ba90-b8c1-11ef-bee4-3bb1d3c55332-image.png","original_name":"image.png","size":952414,"type":"image/png","created_at":"2024-12-12T19:43:26.744Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-12T19:43:26.744Z","modified_by":"63c18747a06c7f0008255851","width":1200,"height":849},{"name":"5c6d77d0-ba51-11ef-bee4-3bb1d3c55332-CleanShot-2024-12-14-at-11-26-272x.png","original_name":"CleanShot-2024-12-14-at-11-26-272x.png","size":72505,"type":"image/png","created_at":"2024-12-14T19:26:47.863Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-14T19:26:47.863Z","modified_by":"63c18747a06c7f0008255851","width":1366,"height":510},{"name":"67cf2360-b8be-11ef-bee4-3bb1d3c55332-image.png","original_name":"image.png","size":313379,"type":"image/png","created_at":"2024-12-12T19:22:19.837Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-12T19:22:19.837Z","modified_by":"63c18747a06c7f0008255851","width":2000,"height":993},{"name":"6d6ee330-b8c0-11ef-bee4-3bb1d3c55332-image.png","original_name":"image.png","size":962449,"type":"image/png","created_at":"2024-12-12T19:36:48.240Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-12T19:36:48.240Z","modified_by":"63c18747a06c7f0008255851","width":1600,"height":1062},{"name":"79320b60-b8bc-11ef-bee4-3bb1d3c55332-CleanShot-2024-12-12-at-11-08-162x.png","original_name":"CleanShot-2024-12-12-at-11-08-162x.png","size":108127,"type":"image/png","created_at":"2024-12-12T19:08:29.893Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-12T19:08:29.893Z","modified_by":"63c18747a06c7f0008255851","width":1188,"height":718},{"name":"7fec70b0-b8c3-11ef-bee4-3bb1d3c55332-generated-image.png","original_name":"generated-image.png","size":1388526,"type":"image/png","created_at":"2024-12-12T19:58:47.829Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-12T19:58:47.829Z","modified_by":"63c18747a06c7f0008255851","width":1024,"height":1024},{"name":"8142f240-b8be-11ef-bee4-3bb1d3c55332-CleanShot-2024-12-12-at-11-22-482x.png","original_name":"CleanShot-2024-12-12-at-11-22-482x.png","size":104346,"type":"image/png","created_at":"2024-12-12T19:23:02.420Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-12T19:23:02.420Z","modified_by":"63c18747a06c7f0008255851","width":1448,"height":898},{"name":"85668770-b8c2-11ef-bee4-3bb1d3c55332-image.png","original_name":"image.png","size":406713,"type":"image/png","created_at":"2024-12-12T19:51:47.467Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-12T19:51:47.467Z","modified_by":"63c18747a06c7f0008255851","width":2000,"height":1093},{"name":"92966020-b99c-11ef-bee4-3bb1d3c55332-metadata-search.gif","original_name":"metadata-search.gif","size":5056230,"type":"image/gif","created_at":"2024-12-13T21:52:39.967Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-13T21:52:39.967Z","modified_by":"63c18747a06c7f0008255851","width":832,"height":480},{"name":"95dcbaf0-b8bf-11ef-bee4-3bb1d3c55332-generated-image.png","original_name":"generated-image.png","size":1814536,"type":"image/png","created_at":"2024-12-12T19:30:46.661Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-12T19:30:46.661Z","modified_by":"63c18747a06c7f0008255851","width":1024,"height":1024},{"name":"afdaeb50-b8c6-11ef-bee4-3bb1d3c55332-cosmic-year-2024.png","original_name":"cosmic-year-2024.png","size":669628,"type":"image/png","created_at":"2024-12-12T20:21:36.647Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-12T20:21:36.647Z","modified_by":"63c18747a06c7f0008255851","width":1316,"height":719},{"name":"b509ca60-b998-11ef-bee4-3bb1d3c55332-IMG_5622.jpg","original_name":"IMG_5622.jpg","size":2599504,"type":"image/jpeg","created_at":"2024-12-13T21:24:59.698Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-13T21:24:59.698Z","modified_by":"63c18747a06c7f0008255851","width":3024,"height":4032},{"name":"bc9fc280-b8b6-11ef-bee4-3bb1d3c55332-image.png","original_name":"image.png","size":902097,"type":"image/png","created_at":"2024-12-12T18:27:26.097Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-12T18:27:26.097Z","modified_by":"63c18747a06c7f0008255851","width":1316,"height":719},{"name":"caf4e690-b8ba-11ef-bee4-3bb1d3c55332-image.png","original_name":"image.png","size":553254,"type":"image/png","created_at":"2024-12-12T18:56:28.130Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-12T18:56:28.130Z","modified_by":"63c18747a06c7f0008255851","width":1316,"height":719},{"name":"d7307640-b8ba-11ef-bee4-3bb1d3c55332-image.png","original_name":"image.png","size":858766,"type":"image/png","created_at":"2024-12-12T18:56:48.740Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-12T18:56:48.740Z","modified_by":"63c18747a06c7f0008255851","width":1316,"height":719},{"name":"db659fd0-bd6d-11ef-bee4-3bb1d3c55332-generated-image.png","original_name":"generated-image.png","size":1637355,"type":"image/png","created_at":"2024-12-18T18:28:20.344Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-18T18:29:43.655Z","modified_by":"63c18747a06c7f0008255851","width":1024,"height":1024,"alt_text":"A luxury bedroom with ambient lighting, featuring a large bed with plush pillows and a headboard. The room includes elegant side tables, modern lamps, framed artwork, and cozy seating."},{"name":"de7a3320-b999-11ef-bee4-3bb1d3c55332-generated-image.png","original_name":"generated-image.png","size":2062529,"type":"image/png","created_at":"2024-12-13T21:33:18.642Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-13T21:33:18.642Z","modified_by":"63c18747a06c7f0008255851","width":1024,"height":1024},{"name":"e02fbf50-b8bd-11ef-bee4-3bb1d3c55332-generated-image.png","original_name":"generated-image.png","size":1975599,"type":"image/png","created_at":"2024-12-12T19:18:32.334Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-12T19:18:32.334Z","modified_by":"63c18747a06c7f0008255851","width":1024,"height":1024},{"name":"e031ecc0-b8be-11ef-bee4-3bb1d3c55332-CleanShot-2024-12-12-at-11-25-222x.png","original_name":"CleanShot-2024-12-12-at-11-25-222x.png","size":97681,"type":"image/png","created_at":"2024-12-12T19:25:41.746Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-12T19:25:41.746Z","modified_by":"63c18747a06c7f0008255851","width":1374,"height":830},{"name":"e3c960d0-b8bd-11ef-bee4-3bb1d3c55332-generated-image.png","original_name":"generated-image.png","size":2053728,"type":"image/png","created_at":"2024-12-12T19:18:38.320Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-12T19:18:38.320Z","modified_by":"63c18747a06c7f0008255851","width":1024,"height":1024},{"name":"f17f2020-bd6d-11ef-bee4-3bb1d3c55332-generated-image.png","original_name":"generated-image.png","size":1938029,"type":"image/png","created_at":"2024-12-18T18:28:57.423Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-18T18:29:43.654Z","modified_by":"63c18747a06c7f0008255851","width":1024,"height":1024,"alt_text":"Luxurious bedroom with purple tones, elegant bedding, cozy chairs, and soft lighting. Large windows offer a stunning city skyline view, creating a stylish and inviting atmosphere."},{"name":"f48e5e50-b8bf-11ef-bee4-3bb1d3c55332-image.png","original_name":"image.png","size":1802742,"type":"image/png","created_at":"2024-12-12T19:33:25.448Z","created_by":"63c18747a06c7f0008255851","modified_at":"2024-12-12T19:33:25.448Z","modified_by":"63c18747a06c7f0008255851","width":2000,"height":1516}],"extensions":[]} --------------------------------------------------------------------------------