<html lang="en" style="--rem: 16;"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>FAE Global Summit Agenda - Dark Mode (Editable, Exportable)</title> <script src="https://cdn.tailwindcss.com"></script> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin=""> <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet"> <script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js" integrity="sha512-BNaRQnYJYiPSqHHDb58B0yaPfCu+Wgds8Gp/gU33kqBtgNS4tSPHuGibyoeqMV/TJlSKda6FXzoEyYGjTe+vXA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> <script src="https://unpkg.com/jspdf@2.5.1/dist/jspdf.umd.min.js" defer=""></script> <script> // Test log to see if libraries are potentially loaded console.log("External libraries (Tailwind, Fonts, html2canvas, jsPDF) requested."); // Initial checks might still run before deferred script executes if (window.jspdf) { console.log("Initial Check: jsPDF library seems to be loaded (window.jspdf exists)."); } else { console.warn("Initial Check: jsPDF library (window.jspdf) not found immediately after script tag (expected if deferred)."); } if (window.html2canvas) { console.log("Initial Check: html2canvas library seems to be loaded."); } else { console.warn("Initial Check: html2canvas library not found immediately after script tag."); } </script> <style> /* Use Inter font */ body { font-family: 'Inter', sans-serif; background-color: #111827; /* Dark gray background (Tailwind gray-900) */ color: #d1d5db; /* Default light gray text (Tailwind gray-300) */ } /* Style for time slots */ .time-slot { position: relative; /* Needed for absolute positioning of delete button */ display: flex; align-items: flex-start; padding-top: 0.75rem; padding-bottom: 0.75rem; border-bottom: 1px solid #374151; /* Darker border (Tailwind gray-700) */ } .time-slot:last-child { /* border-bottom: none; */ /* Keep border for consistency when adding */ } .time { flex-shrink: 0; width: 95px; font-weight: 500; color: #9ca3af; /* Lighter gray text (Tailwind gray-400) */ margin-right: 1.25rem; padding: 0.25rem 0.1rem; /* Padding for edit focus */ cursor: text; border-radius: 0.25rem; } .time:focus { outline: 1px solid #4b5563; /* Gray-600 outline */ background-color: #374151; /* Gray-700 background */ color: #f3f4f6; /* Gray-100 text */ } .activity { flex-grow: 1; color: #e5e7eb; /* Lighter text (Tailwind gray-200) */ padding: 0.25rem 0.1rem; /* Padding for edit focus */ cursor: text; border-radius: 0.25rem; margin-right: 20px; /* Space for delete button */ } .activity:focus { outline: 1px solid #4b5563; /* Gray-600 outline */ background-color: #374151; /* Gray-700 background */ color: #f9fafb; /* Gray-50 text */ } .activity strong { font-weight: 600; color: #ffffff; /* White for strong elements */ } .activity em { color: #9ca3af; /* Lighter gray for secondary info (Tailwind gray-400) */ font-style: normal; display: block; font-size: 0.875rem; /* text-sm */ margin-top: 0.125rem; } /* Header styling */ .day-header { background-color: #1f2937; /* Darker header (Tailwind gray-800) */ padding: 1rem 1.25rem; font-weight: 600; font-size: 1.125rem; color: #ffffff; /* White header text */ border-bottom: 1px solid #374151; /* Gray-700 border */ border-top-left-radius: 0.5rem; border-top-right-radius: 0.5rem; } .day-header .day-theme { font-weight: 400; color: #9ca3af; /* Gray-400 color */ font-size: 0.9rem; margin-left: 0.5rem; } /* Card styling */ .day-card { border: 1px solid #374151; /* Gray-700 border */ border-radius: 0.5rem; background-color: #1f2937; /* Dark card background (Tailwind gray-800) */ overflow: hidden; /* Keep overflow hidden */ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); /* Adjusted shadow for dark */ display: flex; /* Use flexbox for card layout */ flex-direction: column; /* Stack header, content, button vertically */ } .day-content { padding: 0 1.25rem; flex-grow: 1; /* Allow content to grow */ } /* Make elements editable on focus (styles adjusted for dark mode) */ [contenteditable="true"]:focus { outline: 1px solid #4b5563; background-color: #374151; color: #f9fafb; /* Ensure text is light on focus background */ } /* Button Styles */ .export-button { background-color: #374151; /* gray-700 */ color: #f3f4f6; /* gray-100 */ padding: 0.6rem 1.2rem; border-radius: 0.375rem; /* rounded-md */ font-weight: 500; margin: 0 0.5rem; cursor: pointer; transition: background-color 0.2s; border: 1px solid #4b5563; /* gray-600 */ } .export-button:hover { background-color: #4b5563; /* gray-600 */ } .export-button:active { background-color: #525a67; } .add-item-button { display: block; /* Make it a block element */ width: calc(100% - 2.5rem); /* Full width minus padding */ background-color: #374151; /* gray-700 */ color: #9ca3af; /* gray-400 */ padding: 0.5rem 1rem; border-radius: 0.375rem; /* rounded-md */ font-weight: 500; text-align: center; cursor: pointer; transition: background-color 0.2s, color 0.2s; border: 1px dashed #4b5563; /* gray-600 */ margin: 1rem 1.25rem; /* Match content padding */ } .add-item-button:hover { background-color: #4b5563; /* gray-600 */ color: #f3f4f6; /* gray-100 */ } .delete-item-button { position: absolute; right: 0.75rem; /* Adjust position */ top: 50%; transform: translateY(-50%); width: 18px; height: 18px; background-color: #4b5563; /* gray-600 */ color: #1f2937; /* gray-800 */ border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: bold; line-height: 1; cursor: pointer; opacity: 0; /* Hidden by default */ transition: opacity 0.2s, background-color 0.2s; border: 1px solid #6b7280; /* gray-500 */ } .time-slot:hover .delete-item-button { opacity: 1; /* Show on hover */ } .delete-item-button:hover { background-color: #ef4444; /* red-500 */ color: white; border-color: #dc2626; /* red-600 */ } /* Style for error messages */ .error-message { color: #f87171; /* Tailwind red-400 */ font-size: 0.875rem; margin-top: 0.5rem; } .status-message { /* General class for status messages */ font-size: 0.875rem; margin-top: 0.5rem; } /* Drag and Drop Styles */ .time-slot.dragging { opacity: 0.5; background: #374151; /* Slightly different background when dragging */ } .day-content.drag-over { /* Add a subtle indicator that it's a drop target */ background-color: rgba(75, 85, 99, 0.3); /* gray-600 with opacity */ border: 1px dashed #6b7280; /* gray-500 */ margin: -1px; /* Adjust margin to keep layout stable */ } .drag-placeholder { height: 40px; /* Example height, adjust as needed */ background-color: rgba(96, 165, 250, 0.3); /* blue-400 with opacity */ border: 1px dashed #60a5fa; /* blue-400 */ margin: 0.5rem 0; border-radius: 0.25rem; } </style> <style>*, ::before, ::after{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgb(59 130 246 / 0.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgb(59 130 246 / 0.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/* ! tailwindcss v3.4.16 | MIT License | https://tailwindcss.com */*,::after,::before{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}::after,::before{--tw-content:''}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.mb-10{margin-bottom:2.5rem}.mb-4{margin-bottom:1rem}.mb-8{margin-bottom:2rem}.mt-10{margin-top:2.5rem}.grid{display:grid}.grid-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr))}.gap-8{gap:2rem}.p-4{padding:1rem}.text-center{text-align:center}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:0.875rem;line-height:1.25rem}.font-bold{font-weight:700}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}@media (min-width: 768px){.md\:grid-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr))}.md\:p-8{padding:2rem}.md\:text-4xl{font-size:2.25rem;line-height:2.5rem}}@media (min-width: 1024px){.lg\:grid-cols-3{grid-template-columns:repeat(3, minmax(0, 1fr))}}</style></head><body class="p-4 md:p-8" data-new-gr-c-s-check-loaded="14.1229.0" data-gr-ext-installed="" data-new-gr-c-s-loaded="14.1229.0"> <h1 class="text-3xl md:text-4xl font-bold text-center text-white mb-4">FAE Global Summit 2025</h1> <p class="text-center text-lg text-gray-400 mb-8">June 10th - June 15th | Edinburgh, UK</p> <div class="text-center mb-10"> <button id="export-html-btn" class="export-button">Export HTML</button> <button id="export-pdf-btn" class="export-button">Export PDF</button> </div> <div id="agenda-content" class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8"> <div class="day-card"> <div class="day-header" contenteditable="true">Tuesday, June 10th <span class="day-theme">- Arrival & Welcome</span></div> <div class="day-content"> <div class="time-slot" draggable="true"> <div class="time" contenteditable="true">All Day</div> <div class="activity" contenteditable="true">Arrivals & Moxy Hotel Check-in<div><span style="--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; color: rgb(156, 163, 175); display: block; font-size: 0.875rem; margin-top: 0.125rem;">???</span></div></div> <button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div> <div class="time-slot" draggable="true"> <div class="time" contenteditable="true">15:00 - 17:00</div> <div class="activity" contenteditable="true">Summit Welcome Refreshments<div><span style="--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; color: rgb(156, 163, 175); display: block; font-size: 0.875rem; margin-top: 0.125rem;">???</span></div></div> <button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div> <div class="time-slot" draggable="true"> <div class="time" contenteditable="true">17:00 - 18:00</div> <div class="activity" contenteditable="true" spellcheck="false"> <strong>Opening Welcome & Summit Kick-off</strong><em>Theme: Setting the Stage. Overview of Summit Goals & Agenda</em> </div> <button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div><div class="time-slot" draggable="true"> <div class="time" contenteditable="true">19:00 - 21:00</div> <div class="activity" contenteditable="true">Welcome Reception & Dinner<div><span style="--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; color: rgb(156, 163, 175); display: block; font-size: 0.875rem; margin-top: 0.125rem;">???</span></div></div> <button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div> </div> <button class="add-item-button" aria-label="Add item to Tuesday">Add Item</button> </div> <div class="day-card"> <div class="day-header" contenteditable="true" spellcheck="true">Wednesday, June 11th <span class="day-theme">- Technical Deep Dive</span></div> <div class="day-content"> <div class="time-slot" draggable="true"> <div class="time" contenteditable="true">09:30 - 10:00</div> <div class="activity" contenteditable="true" spellcheck="false">Introductions Breakfast<div><span style="--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; color: rgb(156, 163, 175); display: block; font-size: 0.875rem; margin-top: 0.125rem;">???</span></div></div> <button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div> <div class="time-slot" draggable="true"><div class="time" contenteditable="true">10:00 - 11:00</div><div class="activity" contenteditable="true">Zone monitoring</div><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div> <div class="time-slot" draggable="true"> <div class="time" contenteditable="true">11:00 - 12:00</div> <div class="activity" contenteditable="true" spellcheck="false"><div><font color="#ffffff"><b>Rev 7/Rev 8/DF product roadmap</b></font></div><div><span style="--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; color: rgb(156, 163, 175); display: block; font-size: 0.875rem; margin-top: 0.125rem;">???</span></div></div> <button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div><div class="time-slot" draggable="true"> <div class="time" contenteditable="true">12:00 - 13:00</div> <div class="activity" contenteditable="true" spellcheck="false">Lunch<div><span style="--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; color: rgb(156, 163, 175); display: block; font-size: 0.875rem; margin-top: 0.125rem;">???</span></div></div> <button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div><div class="time-slot" draggable="true"> <div class="time" contenteditable="true">13:00 - 14:00</div> <div class="activity" contenteditable="true" spellcheck="false"><font color="#ffffff"><b>SPAD tutorial 101</b></font><div><div style=""><font color="#9ca3af"><span style="font-size: 14px;">basics, how it works, histogram, etc.</span></font><b style="color: rgb(255, 255, 255);"> Tarek/Robert</b></div></div></div> <button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div> <div class="time-slot" draggable="true"> <div class="time" contenteditable="true">14:00 - 15:00</div> <div class="activity" contenteditable="true" spellcheck="false"><div><font color="#ffffff"><b>SPAD tutorial 102 </b></font></div><span style="--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-weight: bolder; color: rgb(255, 255, 255);"><font color="#9ca3af" style="--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-weight: 400;"><span style="--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-size: 14px;">competitive products, future developments Tarek/Robert</span></font></span></div> <button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div><div class="time-slot" draggable="true"><div class="time" contenteditable="true">15:00 - 16:00</div><div class="activity" contenteditable="true">FUSA w/s (Eric Y)</div><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div></div> <button class="add-item-button" aria-label="Add item to Wednesday">Add Item</button> </div> <div class="day-card"> <div class="day-header" contenteditable="true" spellcheck="true">Thursday, June 12th <span class="day-theme">- Emotional Intelligence & AI</span></div> <div class="day-content"> <div class="time-slot" draggable="true"> <div class="time" contenteditable="true">08:00 - 09:30</div> <div class="activity" contenteditable="true">Breakfast<div><span style="--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; color: rgb(156, 163, 175); display: block; font-size: 0.875rem; margin-top: 0.125rem;">???</span></div></div> <button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div> <div class="time-slot" draggable="true"> <div class="time" contenteditable="true">09:30 - 10:15</div> <div class="activity" contenteditable="true" spellcheck="false"><div><font color="#ffffff"><b>Cronos</b></font></div><div><span style="--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; color: rgb(156, 163, 175); display: block; font-size: 0.875rem; margin-top: 0.125rem;">Design/specs/status, etc. Neil</span></div></div> <button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div><div class="time-slot" draggable="true"> <div class="time" contenteditable="true">10:15 - 11:00</div> <div class="activity" contenteditable="true" spellcheck="false">L4/Rev9 Teaser<div><span style="--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; color: rgb(156, 163, 175); display: block; font-size: 0.875rem; margin-top: 0.125rem;">PRD, status: Neil</span></div></div> <button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div> <div class="time-slot" draggable="true"> <div class="time" contenteditable="true">11:00 - 12:30</div> <div class="activity" contenteditable="true" spellcheck="false"><strong>Workshop: Advanced Demo Techniques / Value Selling for FAEs</strong><div><span style="--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; color: rgb(156, 163, 175); display: block; font-size: 0.875rem; margin-top: 0.125rem;">Mayb remove</span></div></div> <button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div><div class="time-slot" draggable="true"> <div class="time" contenteditable="true">12:30 - 13:30</div> <div class="activity" contenteditable="true">Lunch<div><span style="--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; color: rgb(156, 163, 175); display: block; font-size: 0.875rem; margin-top: 0.125rem;">???</span></div></div> <button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div><div class="time-slot" draggable="true"><div class="time" contenteditable="true">13:30 - 14:30</div><div class="activity" contenteditable="true" spellcheck="false"><div>Examples of main use cases </div><div><font color="#9ca3af"><span style="font-size: 14px;">(robotics/autonomy/etc.) - each FAE 5 min</span></font></div></div><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div><div class="time-slot" draggable="true"> <div class="time" contenteditable="true">14:30 - 15:15</div> <div class="activity" contenteditable="true" spellcheck="false"><div><font color="#ffffff"><b>Gemini and Blue City Demos</b></font></div><div><span style="--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; color: rgb(156, 163, 175); display: block; font-size: 0.875rem; margin-top: 0.125rem;">???</span></div></div> <button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div><div class="time-slot" draggable="true"><div class="time" contenteditable="true">15:15 - 16:15</div><div class="activity" contenteditable="true">placeholder</div><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div><div class="time-slot" draggable="true"> <div class="time" contenteditable="true">16:15 - 17:15</div> <div class="activity" contenteditable="true" spellcheck="false"><strong>Competitive Landscape & Positioning</strong> (Marketing/Competitive Intel)<div><span style="--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; color: rgb(156, 163, 175); display: block; font-size: 0.875rem; margin-top: 0.125rem;">Tom Grey: get presentation </span></div></div> <button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div></div> <button class="add-item-button" aria-label="Add item to Thursday">Add Item</button> </div> <div class="day-card"> <div class="day-header" contenteditable="true" spellcheck="true">Friday, June 13th <span class="day-theme">- Knowledge Sharing & Customer Focus</span></div> <div class="day-content"> <div class="time-slot" draggable="true"> <div class="time" contenteditable="true">08:00 - 09:00</div> <div class="activity" contenteditable="true">Breakfast<div><span style="--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; color: rgb(156, 163, 175); display: block; font-size: 0.875rem; margin-top: 0.125rem;">???</span></div></div> <button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div> <div class="time-slot" draggable="true"> <div class="time" contenteditable="true">10:00 - 11:00</div> <div class="activity" contenteditable="true" spellcheck="false"><strong>FAE Best Practices Sharing Session / Open time</strong><div><span style="--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; color: rgb(156, 163, 175); display: block; font-size: 0.875rem; margin-top: 0.125rem;">???</span></div></div> <button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div><div class="time-slot" draggable="true"> <div class="time" contenteditable="true">11:00 - 11:30</div> <div class="activity" contenteditable="true" spellcheck="false"><font color="#ffffff"><b>AI Challenge Presentations</b></font><br><div><span style="--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; color: rgb(156, 163, 175); display: block; font-size: 0.875rem; margin-top: 0.125rem;">???</span></div></div> <button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div><div class="time-slot" draggable="true"> <div class="time" contenteditable="true">11:30 - 12:00</div> <div class="activity" contenteditable="true" spellcheck="false"><font color="#ffffff"><b>AI Tools are the Future</b></font><br><div><span style="--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; color: rgb(156, 163, 175); display: block; font-size: 0.875rem; margin-top: 0.125rem;">???</span></div></div> <button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div> <div class="time-slot" draggable="true"> <div class="time" contenteditable="true">12:00 - 13:00</div> <div class="activity" contenteditable="true">Lunch<div><span style="--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; color: rgb(156, 163, 175); display: block; font-size: 0.875rem; margin-top: 0.125rem;">???</span></div></div> <button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div><div class="time-slot" draggable="true"> <div class="time" contenteditable="true">13:00 - 14:00</div> <div class="activity" contenteditable="true" spellcheck="false"><strong>Summit Wrap-up & Key Takeaways</strong> (FAE Leadership)<div><span style="--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; color: rgb(156, 163, 175); display: block; font-size: 0.875rem; margin-top: 0.125rem;">???</span></div></div> <button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div><div class="time-slot" draggable="true"> <div class="time" contenteditable="true">14:00 - 14:30</div> <div class="activity" contenteditable="true" spellcheck="false"><strong>Closing Remarks & Thank You</strong> (Exec Sponsor)<div><span style="--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; color: rgb(156, 163, 175); display: block; font-size: 0.875rem; margin-top: 0.125rem;">???</span></div></div> <button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div><div class="time-slot" draggable="true"><div class="time" contenteditable="true">14:30 - 15:15</div><div class="activity" contenteditable="true">Transition to Dinner</div><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div><div class="time-slot" draggable="true"><div class="time" contenteditable="true">15:15 - 16:00</div><div class="activity" contenteditable="true" spellcheck="false"><div>FAE internal sessions - ideas:</div><div> SDK w/s</div><div> Gemini/Blue city w/s</div><div> FAE blockers/challenges for customer satisfaction</div><div> Good practices</div></div><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div><div class="time-slot" draggable="true"> <div class="time" contenteditable="true">16:00 - 18:00</div> <div class="activity" contenteditable="true" spellcheck="false">Beers/Scotch/Dinner w/ Edinburgh Team<div><span style="--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; color: rgb(156, 163, 175); display: block; font-size: 0.875rem; margin-top: 0.125rem;">???</span></div></div> <button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div> </div> <button class="add-item-button" aria-label="Add item to Friday">Add Item</button> </div> <div class="day-card"> <div class="day-header" contenteditable="true">Saturday, June 14th <span class="day-theme">- Team Building & Wrap-up</span></div> <div class="day-content"> <div class="time-slot" draggable="true"> <div class="time" contenteditable="true">All Day</div> <div class="activity" contenteditable="true" spellcheck="false"><strong>Team Building Activity</strong> <em>(e.g., Edinburgh-based challenge, workshop) Bike: https://www.tripadvisor.com/AttractionProductReview-g186525-d16840471-Edinburgh_Sky_to_Sea_Bike_or_E_Bike_Tour_with_Transfer_by_TBC-Edinburgh_Scotland.html</em></div> <button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div> </div> <button class="add-item-button" aria-label="Add item to Saturday">Add Item</button> </div> <div class="day-card"> <div class="day-header" contenteditable="true">Sunday, June 15th <span class="day-theme">- Departures</span></div> <div class="day-content"> <div class="time-slot" draggable="true"> <div class="time" contenteditable="true">Morning</div> <div class="activity" contenteditable="true">Breakfast Available<div><span style="--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; color: rgb(156, 163, 175); display: block; font-size: 0.875rem; margin-top: 0.125rem;"><br></span></div></div> <button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div> <div class="time-slot" draggable="true"> <div class="time" contenteditable="true">All Day</div> <div class="activity" contenteditable="true">Check-out & Departures<div><span style="--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; color: rgb(156, 163, 175); display: block; font-size: 0.875rem; margin-top: 0.125rem;"><br></span></div></div> <button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button><button class="delete-item-button" aria-label="Delete item">×</button></div> </div> <button class="add-item-button" aria-label="Add item to Sunday">Add Item</button> </div> </div> <div id="status-notes" class="mt-10 text-center text-sm text-gray-500"> <p><strong>Note:</strong> You can click directly on the time slots and activity descriptions to edit the text.</p> <p>(Edits are temporary. Use the export buttons to save your changes.)</p> <p class="status-message" style="color: rgb(52, 211, 153);">Cleaned HTML export successful!</p></div> <script> // --- Function Definitions --- // Helper function to display status messages function showStatusMessage(message, isError = true) { const statusNotes = document.getElementById('status-notes'); if (!statusNotes) { console.error("Status notes container not found!"); return; } const existingMessages = statusNotes.querySelectorAll('.status-message'); existingMessages.forEach(msg => msg.remove()); const messageElement = document.createElement('p'); messageElement.textContent = message; messageElement.classList.add('status-message'); if (isError) { messageElement.classList.add('error-message'); } else { messageElement.style.color = '#34d399'; // Tailwind green-400 } statusNotes.appendChild(messageElement); } // --- HTML Export Function --- function exportHtml() { console.log("Export HTML button clicked."); let cleanedHtml = ''; try { // --- Clone the document element --- const clonedDoc = document.documentElement.cloneNode(true); console.log("Document cloned for cleaning."); // --- Find and remove extension elements from the clone --- const knownExtensionSelectors = [ '[data-grammarly-shadow-root]', 'grammarly-extension', 'grammarly-extension-vbars', 'grammarly-desktop-integration', 'grammarly-desktop-integration-vbars', 'grammarly-desktop-integration-vbars-v2', 'grammarly-desktop-integration-vbars-v3', 'grammarly-desktop-integration-vbars-v4', 'grammarly-desktop-integration-vbars-v5', 'grammarly-desktop-integration-vbars-v6', // Selectors for Seamless.ai (add more specific ones if known) '[id^="seamless-ai-"]', '[class*="seamless-ai"]', '.seamless-button', '.seamless-overlay', 'seamless-flyout', '.seamless-flyout-container', '.seamless-flyout-content', '.seamless-flyout-header', '.seamless-flyout-body', '.seamless-flyout-footer', '.seamless-flyout-close', '.seamless-flyout-title', '.seamless-flyout-description', '.seamless-flyout-link', '.seamless-flyout-button' // Add other known extension selectors here if needed ]; knownExtensionSelectors.forEach(selector => { const elementsToRemove = clonedDoc.querySelectorAll(selector); elementsToRemove.forEach(el => { console.log("Removing extension element:", el.tagName, el.id ? `#${el.id}` : '', el.className ? `.${el.className}`: ''); el.remove(); }); }); console.log("Known extension elements removed from clone."); // ---------------------------------------------------- // Get the outerHTML of the cleaned clone cleanedHtml = clonedDoc.outerHTML; if (!cleanedHtml) { throw new Error("Failed to generate cleaned HTML."); } showStatusMessage("Generating cleaned HTML file...", false); // Create the Blob from the cleaned HTML const blob = new Blob([cleanedHtml], { type: 'text/html' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'fae_summit_agenda_cleaned.html'; // Changed filename slightly document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); console.log("Cleaned HTML export successful."); showStatusMessage("Cleaned HTML export successful!", false); } catch (error) { console.error("Error exporting cleaned HTML:", error); showStatusMessage(`Cleaned HTML export failed: ${error.message}`); } } // --- PDF Export Function --- function exportPdf() { console.log("Export PDF button clicked."); showStatusMessage("Exporting PDF...", false); console.log("Checking for PDF libraries inside exportPdf function..."); if (typeof html2canvas === 'undefined') { console.error("exportPdf: html2canvas library is not loaded."); showStatusMessage("PDF Export Error: html2canvas library not found."); return; } else { console.log("exportPdf: html2canvas found."); } if (typeof window.jspdf === 'undefined' || typeof window.jspdf.jsPDF === 'undefined') { console.error("exportPdf: jsPDF library or constructor is not loaded correctly (window.jspdf or window.jspdf.jsPDF is undefined)."); if (typeof window.jspdf === 'undefined') { showStatusMessage("PDF Export Error: Core jsPDF object (window.jspdf) not found."); } else { showStatusMessage("PDF Export Error: jsPDF constructor (window.jspdf.jsPDF) not found."); } // *** Add a check for window object properties for debugging *** console.log("Current window properties:", Object.keys(window).sort()); return; } else { console.log("exportPdf: jsPDF and constructor found (window.jspdf.jsPDF)."); } try { const elementToCapture = document.body; // Capture the entire body const buttons = document.querySelector('.text-center.mb-10'); const note = document.getElementById('status-notes'); // Add padding temporarily for visual spacing in the PDF const originalBodyPadding = document.body.style.padding; document.body.style.padding = "2rem"; // Apply padding for capture if (!elementToCapture) { throw new Error("Main content area not found."); // Should not happen if body exists } if (buttons) buttons.style.visibility = 'hidden'; if (note) note.style.visibility = 'hidden'; console.log("Starting PDF export. Capturing element:", elementToCapture); html2canvas(elementToCapture, { scale: 2, // Higher scale for better resolution useCORS: true, backgroundColor: '#111827', logging: true, windowWidth: document.documentElement.scrollWidth, // Try to capture full width windowHeight: document.documentElement.scrollHeight // Try to capture full height }).then(canvas => { console.log("Canvas generated successfully by html2canvas."); const imgData = canvas.toDataURL('image/png'); const pdf = new window.jspdf.jsPDF({ orientation: 'p', // Changed to portrait as body is taller unit: 'pt', format: 'a4' }); console.log("jsPDF instance created."); const pdfWidth = pdf.internal.pageSize.getWidth(); const pdfHeight = pdf.internal.pageSize.getHeight(); const canvasWidth = canvas.width; const canvasHeight = canvas.height; const aspectRatio = canvasWidth / canvasHeight; let imgWidth = pdfWidth - 40; // pdf width - margins let imgHeight = imgWidth / aspectRatio; // If the calculated height is too tall for the page, fit to height instead if (imgHeight > pdfHeight - 40) { imgHeight = pdfHeight - 40; // pdf height - margins imgWidth = imgHeight * aspectRatio; } const x = (pdfWidth - imgWidth) / 2; // Center horizontally const y = 20; // Top margin pdf.addImage(imgData, 'PNG', x, y, imgWidth, imgHeight); pdf.save('fae_summit_agenda.pdf'); console.log("PDF saved."); showStatusMessage("PDF export successful!", false); // Restore styles after saving document.body.style.padding = originalBodyPadding; if (buttons) buttons.style.visibility = 'visible'; if (note) note.style.visibility = 'visible'; }).catch(err => { console.error("Error during html2canvas processing:", err); showStatusMessage(`PDF generation failed during canvas step: ${err.message || err}`); document.body.style.padding = originalBodyPadding; // Restore padding on error if (buttons) buttons.style.visibility = 'visible'; if (note) note.style.visibility = 'visible'; }); } catch (error) { console.error("Error setting up PDF export:", error); showStatusMessage(`PDF export setup failed: ${error.message}`); const buttons = document.querySelector('.text-center.mb-10'); const note = document.getElementById('status-notes'); if (buttons) buttons.style.visibility = 'visible'; if (note) note.style.visibility = 'visible'; } } // --- Time Parsing/Formatting Helpers --- // Parses "HH:MM - HH:MM" into minutes from midnight // Returns { start: number, end: number } or null function parseTimeRange(timeString) { if (!timeString) return null; const match = timeString.trim().match(/^(\d{1,2}):(\d{2})\s*-\s*(\d{1,2}):(\d{2})$/); if (match) { const startHour = parseInt(match[1], 10); const startMin = parseInt(match[2], 10); const endHour = parseInt(match[3], 10); const endMin = parseInt(match[4], 10); if (startHour >= 0 && startHour < 24 && startMin >= 0 && startMin < 60 && endHour >= 0 && endHour < 24 && endMin >= 0 && endMin < 60) { const start = startHour * 60 + startMin; let end = endHour * 60 + endMin; // Handle midnight case (e.g., 23:00 - 00:30) if (end < start) end += 24 * 60; return { start, end }; } } return null; } // Formats minutes from midnight into "HH:MM - HH:MM" function formatTimeRange(startMinutes, endMinutes) { if (startMinutes == null || endMinutes == null || endMinutes < startMinutes) { return "Invalid Time"; // Or return original if needed } const format = (totalMinutes) => { const hours = Math.floor(totalMinutes / 60) % 24; const minutes = totalMinutes % 60; return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`; }; return `${format(startMinutes)} - ${format(endMinutes)}`; } // Calculates duration in minutes, returns null if unparseable function calculateDuration(timeString) { const parsed = parseTimeRange(timeString); if (parsed) { return parsed.end - parsed.start; } return null; } // --- Function to Add Drag Listeners (Moved to global scope) --- let draggedItem = null; // Keep track of the dragged item globally let placeholder = null; // Keep track of the placeholder globally function addDragListenersToItem(item) { item.addEventListener('dragstart', (e) => { draggedItem = item; setTimeout(() => item.classList.add('dragging'), 0); e.dataTransfer.effectAllowed = 'move'; e.dataTransfer.setData('text/plain', ''); // console.log('Drag Start:', draggedItem); }); item.addEventListener('dragend', () => { if (draggedItem) { draggedItem.classList.remove('dragging'); // console.log('Drag End:', draggedItem); draggedItem = null; } if (placeholder && placeholder.parentNode) { placeholder.parentNode.removeChild(placeholder); } placeholder = null; document.querySelectorAll('.day-content.drag-over').forEach(container => { container.classList.remove('drag-over'); }); }); } // Function to create placeholder (Moved to global scope) function createPlaceholder() { placeholder = document.createElement('div'); placeholder.classList.add('drag-placeholder'); return placeholder; } // Function to get drag after element (Moved to global scope) function getDragAfterElement(container, y) { const draggableElements = [...container.querySelectorAll('.time-slot:not(.dragging)')]; return draggableElements.reduce((closest, child) => { const box = child.getBoundingClientRect(); const offset = y - box.top - box.height / 2; if (offset < 0 && offset > closest.offset) { return { offset: offset, element: child }; } else { return closest; } }, { offset: Number.NEGATIVE_INFINITY }).element; } // --- Add/Delete Item Functionality --- // Function to create a new, empty time slot element function createTimeSlotElement() { const timeSlot = document.createElement('div'); timeSlot.classList.add('time-slot'); const timeDiv = document.createElement('div'); timeDiv.classList.add('time'); timeDiv.setAttribute('contenteditable', 'true'); timeDiv.textContent = 'New Time'; // Placeholder const activityDiv = document.createElement('div'); activityDiv.classList.add('activity'); activityDiv.setAttribute('contenteditable', 'true'); activityDiv.textContent = 'New Activity'; // Placeholder timeSlot.appendChild(timeDiv); timeSlot.appendChild(activityDiv); timeSlot.setAttribute('draggable', 'true'); // Make new items draggable // Add delete button to the new slot addDeleteButton(timeSlot); // Add drag listeners to the new slot addDragListenersToItem(timeSlot); return timeSlot; } // Function to add a delete button to a time slot function addDeleteButton(timeSlotElement) { const deleteBtn = document.createElement('button'); deleteBtn.classList.add('delete-item-button'); deleteBtn.innerHTML = '×'; // Use '×' symbol deleteBtn.setAttribute('aria-label', 'Delete item'); // Event listener for delete is handled by delegation timeSlotElement.appendChild(deleteBtn); } // Function to handle adding an item function handleAddItem(event) { const addButton = event.target; // Find the '.day-content' div within the same '.day-card' const dayCard = addButton.closest('.day-card'); if (!dayCard) return; // Should not happen const dayContent = dayCard.querySelector('.day-content'); if (!dayContent) return; // Should not happen // --- Calculate next time slot --- let newStartTime = 9 * 60; // Default start: 09:00 let newEndTime = newStartTime + 60; // Default end: 10:00 const timeSlots = dayContent.querySelectorAll('.time-slot'); if (timeSlots.length > 0) { let lastValidEndTime = null; // Iterate backwards to find the last valid numerical time for (let i = timeSlots.length - 1; i >= 0; i--) { const timeElement = timeSlots[i].querySelector('.time'); if (timeElement) { const parsed = parseTimeRange(timeElement.textContent); if (parsed && parsed.end != null) { lastValidEndTime = parsed.end; break; // Found the last valid one } } } if (lastValidEndTime !== null) { newStartTime = lastValidEndTime; // Start immediately after the last one newEndTime = newStartTime + 60; } else { // No valid numerical time found, keep the default 09:00 - 10:00 console.log("No valid numerical time found in existing slots, defaulting to 09:00 - 10:00"); } } const formattedTime = formatTimeRange(newStartTime, newEndTime); // --- End Calculation --- const newItem = createTimeSlotElement(); // Set the calculated time const newItemTimeDiv = newItem.querySelector('.time'); if (newItemTimeDiv) { newItemTimeDiv.textContent = formattedTime; } // Set default activity text const newItemActivityDiv = newItem.querySelector('.activity'); if (newItemActivityDiv) { newItemActivityDiv.textContent = 'New Activity'; // Keep placeholder text } dayContent.appendChild(newItem); // Optional: Scroll the new item into view or focus the activity field newItem.querySelector('.activity').focus(); } // Function to handle deleting an item (called via event delegation) function handleDeleteItem(event) { // Check if the clicked element is actually the delete button if (event.target.classList.contains('delete-item-button')) { const timeSlot = event.target.closest('.time-slot'); if (timeSlot) { timeSlot.remove(); // Add a visual confirmation or undo option here if desired } } } // --- Add Event Listeners after DOM is loaded --- document.addEventListener('DOMContentLoaded', (event) => { console.log("DOM fully loaded and parsed."); if (typeof html2canvas === 'undefined') { console.error("DOM Ready: html2canvas library is still not loaded."); } else { console.log("DOM Ready: html2canvas found."); } if (typeof window.jspdf === 'undefined' || typeof window.jspdf.jsPDF === 'undefined') { console.error("DOM Ready: jsPDF library or constructor is still not loaded correctly."); if (typeof window.jspdf === 'undefined') { console.error("DOM Ready: window.jspdf is undefined."); } else { console.error("DOM Ready: window.jspdf.jsPDF is undefined."); } } else { console.log("DOM Ready: jsPDF and constructor found."); } const htmlButton = document.getElementById('export-html-btn'); const pdfButton = document.getElementById('export-pdf-btn'); if (htmlButton) { htmlButton.addEventListener('click', exportHtml); console.log("HTML export listener attached."); } else { console.error("HTML export button not found!"); showStatusMessage("Initialization Error: HTML button missing."); } if (pdfButton) { pdfButton.addEventListener('click', exportPdf); console.log("PDF export listener attached."); } else { console.error("PDF export button not found!"); showStatusMessage("Initialization Error: PDF button missing."); } // Add listeners for "Add Item" buttons const addButtons = document.querySelectorAll('.add-item-button'); addButtons.forEach(button => { button.addEventListener('click', handleAddItem); }); console.log(`Attached 'click' listeners to ${addButtons.length} 'Add Item' buttons.`); // Add delete buttons to existing items const existingTimeSlots = document.querySelectorAll('#agenda-content .time-slot'); existingTimeSlots.forEach(slot => { addDeleteButton(slot); }); console.log(`Added delete buttons to ${existingTimeSlots.length} existing time slots.`); // Add delegated event listener for delete buttons const agendaContent = document.getElementById('agenda-content'); if (agendaContent) { agendaContent.addEventListener('click', handleDeleteItem); console.log("Attached delegated 'click' listener to #agenda-content for delete buttons."); } else { console.error("Could not find #agenda-content to attach delete listener."); showStatusMessage("Initialization Error: Agenda container not found for delete functionality."); } // --- Drag and Drop Initialization (Inside DOMContentLoaded) --- // Add draggable attribute and listeners to existing items const initialTimeSlots = document.querySelectorAll('#agenda-content .time-slot'); initialTimeSlots.forEach(item => { item.setAttribute('draggable', 'true'); // REMOVED inline dragstart/dragend listeners here addDragListenersToItem(item); // Add drag listeners using the function }); console.log(`Made ${initialTimeSlots.length} existing time slots draggable.`); // Add listeners to potential drop containers (.day-content) const dayContainers = document.querySelectorAll('#agenda-content .day-content'); dayContainers.forEach(container => { container.addEventListener('dragenter', (e) => { // Check if the drag originates from a valid draggable item if (draggedItem) { e.preventDefault(); container.classList.add('drag-over'); console.log('Drag Enter:', container.parentNode.querySelector('.day-header').textContent.trim()); } }); container.addEventListener('dragover', (e) => { if (draggedItem) { e.preventDefault(); // Allow drop container.classList.add('drag-over'); // Ensure class is present // Placeholder logic const afterElement = getDragAfterElement(container, e.clientY); if (!placeholder) { placeholder = createPlaceholder(); } // Insert placeholder if (afterElement == null) { container.appendChild(placeholder); } else { container.insertBefore(placeholder, afterElement); } } }); container.addEventListener('dragleave', (e) => { // Check if the mouse is leaving the container itself, not just moving over a child element if (draggedItem && !container.contains(e.relatedTarget)) { container.classList.remove('drag-over'); if (placeholder && placeholder.parentNode === container) { container.removeChild(placeholder); placeholder = null; // Reset placeholder when leaving a container } console.log('Drag Leave:', container.parentNode.querySelector('.day-header').textContent.trim()); } }); container.addEventListener('drop', (e) => { if (draggedItem) { e.preventDefault(); // Prevent default action (like navigating) container.classList.remove('drag-over'); // --- Pre-insertion logic --- const droppedTimeElement = draggedItem.querySelector('.time'); const droppedOriginalText = droppedTimeElement ? droppedTimeElement.textContent : ""; const droppedOriginalParsed = parseTimeRange(droppedOriginalText); const droppedOriginalDuration = calculateDuration(droppedOriginalText); // Returns null if not HH:MM-HH:MM const isDroppedTimeNumerical = droppedOriginalParsed !== null && droppedOriginalDuration !== null; // Store original first item reference *before* inserting dragged item, // useful for finding the *intended* first start time if needed. // const originalFirstItem = container.querySelector('.time-slot:not(.dragging)'); // Finding the actual first item AFTER insertion seems more reliable for cascade. // Use placeholder to determine drop position if (placeholder && placeholder.parentNode === container) { container.insertBefore(draggedItem, placeholder); container.removeChild(placeholder); } else { const afterElement = getDragAfterElement(container, e.clientY); if (afterElement) { container.insertBefore(draggedItem, afterElement); } else { container.appendChild(draggedItem); // Append if no element after cursor } } if (placeholder && placeholder.parentNode) { // Clean up if still around placeholder.parentNode.removeChild(placeholder); } placeholder = null; // Reset placeholder after drop // --- Attempt to auto-adjust time ONLY for items with numerical time --- let initialDraggedItemEndTime = null; // Store the end time *after* this initial adjustment if (isDroppedTimeNumerical && droppedTimeElement) { console.log(`Adjusting time for dropped item: ${droppedOriginalText}`); try { let newStartTime = null; let newEndTime = null; // Check if it's dropped at the very top (no preceding time-slot sibling) let isAtTop = true; let prevEl = draggedItem.previousElementSibling; while(prevEl) { if (prevEl.classList.contains('time-slot')) { isAtTop = false; break; } prevEl = prevEl.previousElementSibling; } if (isAtTop) { // --- Dropped at the top --- console.log("Dropped at the top. Finding first valid numerical time below..."); let sibling = draggedItem.nextElementSibling; let foundFirstNumericalStartTime = null; while (sibling) { if (sibling.classList.contains('time-slot')) { const siblingTimeElement = sibling.querySelector('.time'); const siblingParsed = parseTimeRange(siblingTimeElement?.textContent); if (siblingParsed && siblingParsed.start != null) { foundFirstNumericalStartTime = siblingParsed.start; console.log(`Using start time ${formatTimeRange(foundFirstNumericalStartTime, null).split(' - ')[0]} from first numerical item below.`); break; // Found the first valid time } } sibling = sibling.nextElementSibling; } if (foundFirstNumericalStartTime !== null) { // Adopt the start time of the item it displaced newStartTime = foundFirstNumericalStartTime; } else { // If no numerical time below, keep its original start time newStartTime = droppedOriginalParsed.start; console.log("No numerical time found below, keeping original start time."); } newEndTime = newStartTime + droppedOriginalDuration; } else { // --- Dropped somewhere else (Not at the top) --- let prevSibling = draggedItem.previousElementSibling; let foundPreviousNumericalEndTime = null; // Find the first PRECEDING sibling with a valid numerical time while(prevSibling) { if (prevSibling.classList.contains('time-slot')) { const prevTimeElement = prevSibling.querySelector('.time'); const prevParsed = parseTimeRange(prevTimeElement?.textContent); if (prevParsed && prevParsed.end != null) { foundPreviousNumericalEndTime = prevParsed.end; console.log(`Using end time ${formatTimeRange(null, foundPreviousNumericalEndTime).split(' - ')[1]} from first valid numerical item above.`); break; // Found the first valid time } } prevSibling = prevSibling.previousElementSibling; } if (foundPreviousNumericalEndTime !== null) { // Set start time based on previous item's end time newStartTime = foundPreviousNumericalEndTime; console.log("Calculated new start time based on valid previous item:", formatTimeRange(newStartTime, null).split(' - ')[0]); } else { // No numerical item above. Check BELOW. console.log("No numerical item above. Checking below..."); let sibling = draggedItem.nextElementSibling; let foundFirstNumericalStartTimeBelow = null; while (sibling) { if (sibling.classList.contains('time-slot')) { const siblingTimeElement = sibling.querySelector('.time'); const siblingParsed = parseTimeRange(siblingTimeElement?.textContent); if (siblingParsed && siblingParsed.start != null) { foundFirstNumericalStartTimeBelow = siblingParsed.start; console.log(`Using start time ${formatTimeRange(foundFirstNumericalStartTimeBelow, null).split(' - ')[0]} from first numerical item below.`); break; // Found the first valid time } } sibling = sibling.nextElementSibling; } if (foundFirstNumericalStartTimeBelow !== null) { // Adopt the start time of the item below it newStartTime = foundFirstNumericalStartTimeBelow; console.log("Adopted start time from item below."); } else { // Fallback: If no numerical item above OR below, keep original start time newStartTime = droppedOriginalParsed.start; console.log("Could not find valid numerical time above or below, keeping original start time as fallback."); } } newEndTime = newStartTime + droppedOriginalDuration; } // Update the dragged item's time text if a new valid time was calculated const newFormattedTime = formatTimeRange(newStartTime, newEndTime); console.log("Updating dropped item time to:", newFormattedTime); droppedTimeElement.textContent = newFormattedTime; initialDraggedItemEndTime = newEndTime; // Store for cascade } catch (timeError) { console.error("Error during initial time adjustment for dropped item:", timeError); // If adjustment fails, try to get end time from original for cascade if(droppedOriginalParsed && droppedOriginalParsed.end != null) { initialDraggedItemEndTime = droppedOriginalParsed.end; } } } else { // Item has non-numerical time ("All Day", etc.) or time element missing console.log(`Skipping time adjustment for non-numerical item: ${droppedOriginalText}`); initialDraggedItemEndTime = null; // Ensure cascade doesn't use non-numerical item } // ------------------------------------- // --- Cascade time adjustments to subsequent items --- let lastValidEndTime = initialDraggedItemEndTime; // Use the end time calculated above (or null) let currentItem = draggedItem.nextElementSibling; // Start cascade from item AFTER the dropped one while (currentItem) { if (!currentItem.classList.contains('time-slot')) { currentItem = currentItem.nextElementSibling; // Skip non-time-slots continue; } const timeElement = currentItem.querySelector('.time'); if (!timeElement) { console.warn("Cascade: Could not find time element in item:", currentItem.textContent.substring(0,50)); currentItem = currentItem.nextElementSibling; // Move to next continue; // Cannot process without a time element } const currentParsedTime = parseTimeRange(timeElement.textContent); const currentDuration = calculateDuration(timeElement.textContent); // Use existing duration if (currentParsedTime === null || currentDuration === null) { // Item has invalid time format (e.g., "All Day") or unparsable duration console.log(`Cascade: Skipping item with non-standard time or duration: ${timeElement.textContent}`); // Do NOT update lastValidEndTime, keep the value from the previous valid item } else { // Item has a valid time format, adjust it based on the last valid end time if (lastValidEndTime !== null) { const newStartTime = lastValidEndTime; const newEndTime = newStartTime + currentDuration; const newFormattedTime = formatTimeRange(newStartTime, newEndTime); console.log(`Cascade: Updating item ${timeElement.textContent} to ${newFormattedTime}`); timeElement.textContent = newFormattedTime; lastValidEndTime = newEndTime; // Update for the next iteration } else { // If the preceding item was invalid, we can't adjust based on it. // We *should* however update lastValidEndTime based on this *current* valid item's end time // so subsequent items can adjust correctly relative to this one. console.warn(`Cascade: Preceding item invalid, cannot adjust ${timeElement.textContent}. Updating lastValidEndTime based on its current end time.`); lastValidEndTime = currentParsedTime.end; } } currentItem = currentItem.nextElementSibling; // Move to the next item } // ------------------------------------- // Note: dragend event on the draggedItem handles removing the .dragging class } }); }); console.log(`Attached drag/drop listeners to ${dayContainers.length} day containers.`); }); </script> </body></html>