diff --git a/.gitignore b/.gitignore index 86b4663..135c17f 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,8 @@ backend/target/ frontend/node_modules/ frontend/.svelte-kit/ frontend/build/ +frontend/export-viewer/node_modules/ +frontend/export-viewer/.svelte-kit/ # Media uploads (mounted volume in production) media/ diff --git a/backend/Cargo.lock b/backend/Cargo.lock index a5ac022..6ce95e0 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -896,8 +896,8 @@ dependencies = [ "dotenvy", "futures", "image", + "include_dir", "jsonwebtoken", - "minijinja", "oxipng", "rand 0.9.2", "serde", @@ -1577,6 +1577,25 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7c5cedc30da3a610cac6b4ba17597bdf7152cf974e8aab3afb3d54455e371c8" +[[package]] +name = "include_dir" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" +dependencies = [ + "include_dir_macros", +] + +[[package]] +name = "include_dir_macros" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" +dependencies = [ + "proc-macro2", + "quote", +] + [[package]] name = "indexmap" version = "2.13.0" @@ -1832,12 +1851,6 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" -[[package]] -name = "memo-map" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d1115007560874e373613744c6fba374c17688327a71c1476d1a5954cc857b" - [[package]] name = "mime" version = "0.3.17" @@ -1854,16 +1867,6 @@ dependencies = [ "unicase", ] -[[package]] -name = "minijinja" -version = "2.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "328251e58ad8e415be6198888fc207502727dc77945806421ab34f35bf012e7d" -dependencies = [ - "memo-map", - "serde", -] - [[package]] name = "miniz_oxide" version = "0.8.9" diff --git a/backend/Cargo.toml b/backend/Cargo.toml index d909aed..6704236 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -29,7 +29,7 @@ sysinfo = "0.32" image = "0.25" oxipng = "9" async_zip = { version = "0.0.17", features = ["tokio", "deflate"] } -minijinja = { version = "2", features = ["json"] } +include_dir = "0.7" [profile.release] opt-level = 3 diff --git a/backend/Dockerfile b/backend/Dockerfile index 0da036e..39e4159 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -11,6 +11,7 @@ RUN mkdir src && echo "fn main(){}" > src/main.rs && \ rm -rf src COPY src ./src +COPY static ./static RUN touch src/main.rs && cargo build --release # --- Runtime stage --- diff --git a/backend/src/services/export.rs b/backend/src/services/export.rs index 2dd6e83..0665f16 100644 --- a/backend/src/services/export.rs +++ b/backend/src/services/export.rs @@ -5,6 +5,7 @@ use async_zip::tokio::write::ZipFileWriter; use async_zip::{Compression, ZipEntryBuilder}; use chrono::{DateTime, Utc}; use futures::io::{copy as fcopy, AllowStdIo}; +use include_dir::{include_dir, Dir}; use serde::Serialize; use sqlx::PgPool; use tokio::sync::broadcast; @@ -13,6 +14,10 @@ use uuid::Uuid; use crate::state::SseEvent; +// ── Embedded viewer assets (pre-built SvelteKit static output) ────────────── + +static VIEWER_DIR: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR/static/export-viewer"); + // ── DB query rows ──────────────────────────────────────────────────────────── #[derive(sqlx::FromRow)] @@ -34,26 +39,45 @@ struct ExportCommentRow { created_at: DateTime, } -// ── Template context structs ───────────────────────────────────────────────── +// ── Viewer JSON structs (serialised to data.json) ─────────────────────────── #[derive(Serialize)] -struct TmplComment { - uploader_name: String, - body: String, - created_at: String, +struct ViewerData { + event: ViewerEvent, + posts: Vec, } #[derive(Serialize)] -struct TmplUpload { +struct ViewerEvent { + name: String, + exported_at: String, +} + +#[derive(Serialize)] +struct ViewerPost { id: String, - path: String, - is_video: bool, + uploader: String, caption: String, - uploader_name: String, - like_count: i64, - created_at: String, - comments: Vec, - hashtags: Vec, + tags: Vec, + timestamp: String, + likes: i64, + comments: Vec, + media: ViewerMedia, +} + +#[derive(Serialize)] +struct ViewerComment { + author: String, + text: String, + timestamp: String, +} + +#[derive(Serialize)] +struct ViewerMedia { + #[serde(rename = "type")] + media_type: String, + thumb: String, + full: String, } // ── Entry point ────────────────────────────────────────────────────────────── @@ -162,7 +186,7 @@ async fn run_zip_export( Ok(()) } -// ── HTML export ────────────────────────────────────────────────────────────── +// ── HTML viewer export ────────────────────────────────────────────────────── async fn run_html_export( event_id: Uuid, @@ -173,70 +197,180 @@ async fn run_html_export( ) -> Result<()> { mark_running(pool, event_id, "html").await; + // 1. Query data let uploads = query_uploads(pool, event_id).await?; let comments = query_comments(pool, event_id).await?; let hashtags_per_upload = query_hashtags(pool, event_id).await?; let total = uploads.len().max(1) as f32; + update_progress(pool, event_id, "html", 5).await; + let exports_dir = media_path.join("exports"); tokio::fs::create_dir_all(&exports_dir).await?; - // Build template context - let mut tmpl_uploads: Vec = Vec::new(); - for (i, row) in uploads.iter().enumerate() { - let ext = ext_from_path(&row.original_path); - let date_str = row.created_at.format("%Y-%m-%d_%H-%M").to_string(); - let name_safe = sanitize_name(&row.uploader_name); - let folder = if row.mime_type.starts_with("video/") { "Videos" } else { "Photos" }; - let filename = format!("{date_str}_{name_safe}_{}.{ext}", row.id); + // 2. Create temp directory for media processing + let tmp_dir = exports_dir.join(format!("viewer_tmp_{event_id}")); + let media_tmp = tmp_dir.join("media"); + tokio::fs::create_dir_all(&media_tmp).await?; - let upload_comments: Vec = comments + // 3. Process media and build post data + let mut viewer_posts: Vec = Vec::new(); + + for (i, row) in uploads.iter().enumerate() { + let src = media_path.join(&row.original_path); + if !src.exists() { + continue; + } + + let is_video = row.mime_type.starts_with("video/"); + let id_str = row.id.to_string(); + + // Generate thumbnail and full variant + let (thumb_name, full_name) = if is_video { + let thumb = format!("{id_str}_thumb.jpg"); + let full_ext = ext_from_path(&row.original_path); + let full = format!("{id_str}.{full_ext}"); + + // Video thumbnail via ffmpeg + let thumb_path = media_tmp.join(&thumb); + let ffmpeg_result = tokio::process::Command::new("ffmpeg") + .args([ + "-i", + src.to_str().unwrap_or_default(), + "-vframes", + "1", + "-ss", + "00:00:01", + "-vf", + "scale=400:-1", + "-y", + thumb_path.to_str().unwrap_or_default(), + ]) + .output() + .await; + + match ffmpeg_result { + Ok(output) if output.status.success() => {} + _ => { + tracing::warn!("ffmpeg thumbnail failed for upload {}, skipping thumb", row.id); + // Create empty thumb entry — viewer handles missing thumbs gracefully + } + } + + // Copy video as-is + tokio::fs::copy(&src, media_tmp.join(&full)).await?; + + (thumb, full) + } else { + let thumb = format!("{id_str}_thumb.jpg"); + let ext = ext_from_path(&row.original_path); + let full = format!("{id_str}_full.{ext}"); + + // Image thumbnail: resize to 400px wide + let src_clone = src.clone(); + let thumb_path = media_tmp.join(&thumb); + let thumb_path_clone = thumb_path.clone(); + + let thumb_result = tokio::task::spawn_blocking(move || -> Result<()> { + let img = image::open(&src_clone).context("failed to open image for thumbnail")?; + let resized = img.resize(400, 400, image::imageops::FilterType::Lanczos3); + resized + .save_with_format(&thumb_path_clone, image::ImageFormat::Jpeg) + .context("failed to save thumbnail")?; + Ok(()) + }) + .await?; + + if let Err(e) = thumb_result { + tracing::warn!("thumbnail generation failed for upload {}: {e:#}", row.id); + } + + // Full variant: compress if >5MB, otherwise copy original + let src_meta = tokio::fs::metadata(&src).await?; + let full_path = media_tmp.join(&full); + + if src_meta.len() > 5_000_000 { + // Resize to max 2000px + let src_clone = src.clone(); + let full_path_clone = full_path.clone(); + + let compress_result = tokio::task::spawn_blocking(move || -> Result<()> { + let img = + image::open(&src_clone).context("failed to open image for compression")?; + let resized = img.resize(2000, 2000, image::imageops::FilterType::Lanczos3); + resized + .save_with_format(&full_path_clone, image::ImageFormat::Jpeg) + .context("failed to save compressed full image")?; + Ok(()) + }) + .await?; + + if let Err(e) = compress_result { + tracing::warn!("compression failed for upload {}, copying original: {e:#}", row.id); + tokio::fs::copy(&src, &full_path).await?; + } + } else { + tokio::fs::copy(&src, &full_path).await?; + } + + (thumb, full) + }; + + // Build comments for this upload + let post_comments: Vec = comments .iter() .filter(|c| c.upload_id == row.id) - .map(|c| TmplComment { - uploader_name: c.uploader_name.clone(), - body: c.body.clone(), - created_at: c.created_at.format("%d.%m.%Y %H:%M").to_string(), + .map(|c| ViewerComment { + author: c.uploader_name.clone(), + text: c.body.clone(), + timestamp: c.created_at.to_rfc3339(), }) .collect(); + // Build tags for this upload let tags: Vec = hashtags_per_upload .iter() .filter(|(uid, _)| *uid == row.id) .map(|(_, tag)| tag.clone()) .collect(); - tmpl_uploads.push(TmplUpload { - id: row.id.to_string(), - path: format!("{folder}/{filename}"), - is_video: row.mime_type.starts_with("video/"), + viewer_posts.push(ViewerPost { + id: id_str, + uploader: row.uploader_name.clone(), caption: row.caption.clone().unwrap_or_default(), - uploader_name: row.uploader_name.clone(), - like_count: row.like_count, - created_at: row.created_at.format("%d.%m.%Y %H:%M").to_string(), - comments: upload_comments, - hashtags: tags, + tags, + timestamp: row.created_at.to_rfc3339(), + likes: row.like_count, + comments: post_comments, + media: ViewerMedia { + media_type: if is_video { + "video".to_string() + } else { + "image".to_string() + }, + thumb: format!("media/{thumb_name}"), + full: format!("media/{full_name}"), + }, }); - let pct = ((i + 1) as f32 / total * 50.0) as i16; - update_progress(pool, event_id, "html", pct.min(49)).await; + let pct = 10 + ((i + 1) as f32 / total * 60.0) as i16; + update_progress(pool, event_id, "html", pct.min(69)).await; } - // Render HTML - let mut env = minijinja::Environment::new(); - env.add_template("memories", MEMORIES_TEMPLATE) - .context("template compile error")?; - let tmpl = env.get_template("memories").unwrap(); - let html = tmpl - .render(minijinja::context!( - event_name => event_name, - uploads => minijinja::Value::from_serialize(&tmpl_uploads), - generated_at => Utc::now().format("%d.%m.%Y").to_string(), - )) - .context("template render error")?; + // 4. Build data.json + let viewer_data = ViewerData { + event: ViewerEvent { + name: event_name.to_string(), + exported_at: Utc::now().to_rfc3339(), + }, + posts: viewer_posts, + }; + let data_json = + serde_json::to_string_pretty(&viewer_data).context("failed to serialize data.json")?; - update_progress(pool, event_id, "html", 55).await; + update_progress(pool, event_id, "html", 72).await; + // 5. Create ZIP let tmp_path = exports_dir.join("Memories.zip.tmp"); let out_path = exports_dir.join("Memories.zip"); @@ -244,56 +378,69 @@ async fn run_html_export( let file = tokio::fs::File::create(&tmp_path).await?; let mut zip = ZipFileWriter::with_tokio(file); - // Memories.html + // Write embedded viewer assets (index.html, _app/*, etc.) + write_dir_to_zip(&VIEWER_DIR, &mut zip).await?; + + update_progress(pool, event_id, "html", 75).await; + + // Write data.json { - let builder = - ZipEntryBuilder::new("Memories/Memories.html".into(), Compression::Deflate); + let builder = ZipEntryBuilder::new("data.json".into(), Compression::Deflate); let mut entry = zip.write_entry_stream(builder).await?; - let mut cursor = AllowStdIo::new(std::io::Cursor::new(html.as_bytes())); + let mut cursor = AllowStdIo::new(std::io::Cursor::new(data_json.as_bytes())); fcopy(&mut cursor, &mut entry).await?; entry.close().await?; } - update_progress(pool, event_id, "html", 60).await; - - // README.txt + // Write README.txt { - let builder = - ZipEntryBuilder::new("Memories/README.txt".into(), Compression::Deflate); + let builder = ZipEntryBuilder::new("README.txt".into(), Compression::Deflate); let mut entry = zip.write_entry_stream(builder).await?; let mut cursor = AllowStdIo::new(std::io::Cursor::new(README_TEXT.as_bytes())); fcopy(&mut cursor, &mut entry).await?; entry.close().await?; } - // Media files - for (i, row) in uploads.iter().enumerate() { - let src = media_path.join(&row.original_path); - if !src.exists() { - continue; + update_progress(pool, event_id, "html", 78).await; + + // Write media files from temp directory + let mut media_entries = tokio::fs::read_dir(&media_tmp).await?; + let mut file_count = 0u32; + let mut files_written = 0u32; + + // Count files first + { + let mut counter = tokio::fs::read_dir(&media_tmp).await?; + while counter.next_entry().await?.is_some() { + file_count += 1; } - let ext = ext_from_path(&row.original_path); - let date_str = row.created_at.format("%Y-%m-%d_%H-%M").to_string(); - let name_safe = sanitize_name(&row.uploader_name); - let folder = if row.mime_type.starts_with("video/") { "Videos" } else { "Photos" }; - let filename = format!("{date_str}_{name_safe}_{}.{ext}", row.id); - let entry_name = format!("Memories/{folder}/{filename}"); + } + let file_total = file_count.max(1) as f32; + + while let Some(dir_entry) = media_entries.next_entry().await? { + let filename = dir_entry.file_name(); + let entry_name = format!("media/{}", filename.to_string_lossy()); let builder = ZipEntryBuilder::new(entry_name.into(), Compression::Stored); - let mut entry = zip.write_entry_stream(builder).await?; - let mut f = tokio::fs::File::open(&src).await?.compat(); - fcopy(&mut f, &mut entry).await?; - entry.close().await?; + let mut zip_entry = zip.write_entry_stream(builder).await?; + let mut f = tokio::fs::File::open(dir_entry.path()).await?.compat(); + fcopy(&mut f, &mut zip_entry).await?; + zip_entry.close().await?; - let pct = 60 + ((i + 1) as f32 / total * 39.0) as i16; - update_progress(pool, event_id, "html", pct.min(99)).await; + files_written += 1; + let pct = 78 + (files_written as f32 / file_total * 20.0) as i16; + update_progress(pool, event_id, "html", pct.min(98)).await; } zip.close().await?; } + // 6. Finalise tokio::fs::rename(&tmp_path, &out_path).await?; + // Clean up temp directory + let _ = tokio::fs::remove_dir_all(&tmp_dir).await; + sqlx::query( "UPDATE export_job SET status = 'done', progress_pct = 100, file_path = $2, completed_at = NOW() WHERE event_id = $1 AND type = 'html'::export_type", @@ -313,7 +460,7 @@ async fn run_html_export( data: serde_json::json!({ "type": "html", "progress_pct": 100 }).to_string(), }); - tracing::info!("HTML export complete for event {event_id}"); + tracing::info!("HTML viewer export complete for event {event_id}"); Ok(()) } @@ -421,6 +568,26 @@ async fn maybe_broadcast_complete( } } +/// Recursively write all files from an embedded `include_dir::Dir` into a ZIP. +async fn write_dir_to_zip( + dir: &include_dir::Dir<'_>, + zip: &mut ZipFileWriter, +) -> Result<()> { + for file in dir.files() { + let path = file.path().to_string_lossy().to_string(); + let contents = file.contents(); + let builder = ZipEntryBuilder::new(path.into(), Compression::Deflate); + let mut entry = zip.write_entry_stream(builder).await?; + let mut cursor = AllowStdIo::new(std::io::Cursor::new(contents)); + fcopy(&mut cursor, &mut entry).await?; + entry.close().await?; + } + for sub_dir in dir.dirs() { + Box::pin(write_dir_to_zip(sub_dir, zip)).await?; + } + Ok(()) +} + fn ext_from_path(path: &str) -> &str { path.rsplit('.').next().unwrap_or("bin") } @@ -433,137 +600,18 @@ fn sanitize_name(name: &str) -> String { // ── Static content ─────────────────────────────────────────────────────────── -const README_TEXT: &str = "Willkommen in der Event-Galerie!\n\ +const README_TEXT: &str = "EventSnap Offline-Galerie\n\ \n\ So geht's:\n\ 1. Entpacke diese ZIP-Datei\n\ (Windows: Rechtsklick > \"Alle extrahieren\"; Mac: Doppelklick;\n\ Handy: Dateimanager-App verwenden).\n\ -2. Öffne die Datei \"Memories.html\" in deinem Browser\n\ +2. Öffne \"index.html\" im Browser\n\ (z. B. Chrome, Safari oder Firefox).\n\ 3. Stöbere durch alle Fotos und Videos.\n\ - Du kannst nach Hashtags filtern — klicke einfach auf einen Hashtag.\n\ + Du kannst zwischen Listen- und Rasteransicht wechseln,\n\ + nach Hashtags filtern und nach Nutzern suchen.\n\ 4. Eine Internetverbindung ist nicht nötig.\n\ Alles ist lokal auf deinem Gerät gespeichert.\n\ \n\ Viel Freude mit den Erinnerungen!\n"; - -const MEMORIES_TEMPLATE: &str = r#" - - - - -{{ event_name }} – Erinnerungen - - - -
-

{{ event_name }}

-

Erinnerungen · Erstellt am {{ generated_at }}

-
-{% set ns = namespace(all_tags=[]) %} -{% for u in uploads %}{% for t in u.hashtags %}{% if t not in ns.all_tags %}{% set ns.all_tags = ns.all_tags + [t] %}{% endif %}{% endfor %}{% endfor %} -{% if ns.all_tags %} -
- Alle - {% for tag in ns.all_tags %}#{{ tag }}{% endfor %} -
-{% endif %} -{% if uploads %} -
- {% for u in uploads %} -
-
- {% if u.is_video %} - -
- {% else %} - - {% endif %} -
-
-
{{ u.uploader_name }} · {{ u.created_at }}
- {% if u.caption %}
{{ u.caption }}
{% endif %} -
- ♡ {{ u.like_count }} - {% if u.comments %}💬 {{ u.comments | length }}{% endif %} -
-
-
- {% endfor %} -
-{% else %} -
Noch keine Fotos vorhanden.
-{% endif %} -
- × -
-
-
-
{{ event_name }} · Offline-Galerie · EventSnap
- - -"#; diff --git a/backend/static/export-viewer/_app/env.js b/backend/static/export-viewer/_app/env.js new file mode 100644 index 0000000..f5427da --- /dev/null +++ b/backend/static/export-viewer/_app/env.js @@ -0,0 +1 @@ +export const env={} \ No newline at end of file diff --git a/backend/static/export-viewer/_app/immutable/assets/0.DHiZegc-.css b/backend/static/export-viewer/_app/immutable/assets/0.DHiZegc-.css new file mode 100644 index 0000000..c82b791 --- /dev/null +++ b/backend/static/export-viewer/_app/immutable/assets/0.DHiZegc-.css @@ -0,0 +1 @@ +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-200:oklch(88.5% .062 18.334);--color-red-700:oklch(50.5% .213 27.518);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-700:oklch(55.5% .163 48.998);--color-green-100:oklch(96.2% .044 156.743);--color-green-700:oklch(52.7% .154 150.069);--color-teal-100:oklch(95.3% .051 180.801);--color-teal-700:oklch(51.1% .096 186.391);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-900:oklch(37.9% .146 265.522);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-700:oklch(49.6% .265 301.924);--color-rose-100:oklch(94.1% .03 12.58);--color-rose-700:oklch(51.4% .222 16.935);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--animate-spin:spin 1s linear infinite;--aspect-video:16 / 9;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}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;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.top-0{top:calc(var(--spacing) * 0)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-full{top:100%}.right-0{right:calc(var(--spacing) * 0)}.right-2{right:calc(var(--spacing) * 2)}.bottom-0{bottom:calc(var(--spacing) * 0)}.left-0{left:calc(var(--spacing) * 0)}.left-2{left:calc(var(--spacing) * 2)}.z-10{z-index:10}.z-30{z-index:30}.z-50{z-index:50}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-8{margin-top:calc(var(--spacing) * 8)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.inline-block{display:inline-block}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-full{height:100%}.max-h-\[50vh\]{max-height:50vh}.max-h-\[95vh\]{max-height:95vh}.min-h-screen{min-height:100vh}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-12{width:calc(var(--spacing) * 12)}.w-14{width:calc(var(--spacing) * 14)}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.border-red-200{border-color:var(--color-red-200)}.border-t-blue-600{border-top-color:var(--color-blue-600)}.bg-amber-100{background-color:var(--color-amber-100)}.bg-black{background-color:var(--color-black)}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.bg-black\/80{background-color:color-mix(in oklab,var(--color-black) 80%,transparent)}}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-gray-800{background-color:var(--color-gray-800)}.bg-gray-900{background-color:var(--color-gray-900)}.bg-green-100{background-color:var(--color-green-100)}.bg-purple-100{background-color:var(--color-purple-100)}.bg-red-50{background-color:var(--color-red-50)}.bg-rose-100{background-color:var(--color-rose-100)}.bg-teal-100{background-color:var(--color-teal-100)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-white\/95{background-color:#fffffff2}@supports (color:color-mix(in lab,red,red)){.bg-white\/95{background-color:color-mix(in oklab,var(--color-white) 95%,transparent)}}.bg-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-black\/60{--tw-gradient-from:#0009}@supports (color:color-mix(in lab,red,red)){.from-black\/60{--tw-gradient-from:color-mix(in oklab, var(--color-black) 60%, transparent)}}.from-black\/60{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-1{padding:calc(var(--spacing) * 1)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-20{padding-block:calc(var(--spacing) * 20)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-8{padding-bottom:calc(var(--spacing) * 8)}.pl-0\.5{padding-left:calc(var(--spacing) * .5)}.text-center{text-align:center}.text-left{text-align:left}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.\[overflow-wrap\:anywhere\]{overflow-wrap:anywhere}.text-amber-700{color:var(--color-amber-700)}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-green-700{color:var(--color-green-700)}.text-purple-700{color:var(--color-purple-700)}.text-red-700{color:var(--color-red-700)}.text-rose-700{color:var(--color-rose-700)}.text-teal-700{color:var(--color-teal-700)}.text-white{color:var(--color-white)}.text-white\/80{color:#fffc}@supports (color:color-mix(in lab,red,red)){.text-white\/80{color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.placeholder-gray-400::placeholder{color:var(--color-gray-400)}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.outline-none{--tw-outline-style:none;outline-style:none}.focus-within\:border-blue-400:focus-within{border-color:var(--color-blue-400)}.focus-within\:bg-white:focus-within{background-color:var(--color-white)}.focus-within\:ring-1:focus-within{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-within\:ring-blue-200:focus-within{--tw-ring-color:var(--color-blue-200)}@media(hover:hover){.hover\:bg-black\/70:hover{background-color:#000000b3}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/70:hover{background-color:color-mix(in oklab,var(--color-black) 70%,transparent)}}.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\:bg-gray-300:hover{background-color:var(--color-gray-300)}.hover\:text-blue-900:hover{color:var(--color-blue-900)}.hover\:text-gray-600:hover{color:var(--color-gray-600)}.hover\:underline:hover{text-decoration-line:underline}}@media(min-width:40rem){.sm\:m-4{margin:calc(var(--spacing) * 4)}}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}} diff --git a/backend/static/export-viewer/_app/immutable/chunks/BJ__EZ0W.js b/backend/static/export-viewer/_app/immutable/chunks/BJ__EZ0W.js new file mode 100644 index 0000000..e2828ba --- /dev/null +++ b/backend/static/export-viewer/_app/immutable/chunks/BJ__EZ0W.js @@ -0,0 +1 @@ +import{u as o,n as t,o as c}from"./CcONa1Mr.js";function u(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function r(e){t===null&&u(),o(()=>{const n=c(e);if(typeof n=="function")return n})}export{r as o}; diff --git a/backend/static/export-viewer/_app/immutable/chunks/BRDva_z9.js b/backend/static/export-viewer/_app/immutable/chunks/BRDva_z9.js new file mode 100644 index 0000000..63c2ac7 --- /dev/null +++ b/backend/static/export-viewer/_app/immutable/chunks/BRDva_z9.js @@ -0,0 +1 @@ +import{f as l,g as o,p as u,i as n,j as d,k as m,h as p,e as _,m as v,l as k}from"./CcONa1Mr.js";class w{anchor;#t=new Map;#s=new Map;#e=new Map;#i=new Set;#f=!0;constructor(t,s=!0){this.anchor=t,this.#f=s}#a=t=>{if(this.#t.has(t)){var s=this.#t.get(t),e=this.#s.get(s);if(e)l(e),this.#i.delete(s);else{var f=this.#e.get(s);f&&(this.#s.set(s,f.effect),this.#e.delete(s),f.fragment.lastChild.remove(),this.anchor.before(f.fragment),e=f.effect)}for(const[i,a]of this.#t){if(this.#t.delete(i),i===t)break;const r=this.#e.get(a);r&&(o(r.effect),this.#e.delete(a))}for(const[i,a]of this.#s){if(i===s||this.#i.has(i))continue;const r=()=>{if(Array.from(this.#t.values()).includes(i)){var c=document.createDocumentFragment();v(a,c),c.append(n()),this.#e.set(i,{effect:a,fragment:c})}else o(a);this.#i.delete(i),this.#s.delete(i)};this.#f||!e?(this.#i.add(i),u(a,r,!1)):r()}}};#r=t=>{this.#t.delete(t);const s=Array.from(this.#t.values());for(const[e,f]of this.#e)s.includes(e)||(o(f.effect),this.#e.delete(e))};ensure(t,s){var e=m,f=k();if(s&&!this.#s.has(t)&&!this.#e.has(t))if(f){var i=document.createDocumentFragment(),a=n();i.append(a),this.#e.set(t,{effect:d(()=>s(a)),fragment:i})}else this.#s.set(t,d(()=>s(this.anchor)));if(this.#t.set(e,t),f){for(const[r,h]of this.#s)r===t?e.unskip_effect(h):e.skip_effect(h);for(const[r,h]of this.#e)r===t?e.unskip_effect(h.effect):e.skip_effect(h.effect);e.oncommit(this.#a),e.ondiscard(this.#r)}else p&&(this.anchor=_),this.#a(e)}}export{w as B}; diff --git a/backend/static/export-viewer/_app/immutable/chunks/Bb9JxzU7.js b/backend/static/export-viewer/_app/immutable/chunks/Bb9JxzU7.js new file mode 100644 index 0000000..4bb2d3b --- /dev/null +++ b/backend/static/export-viewer/_app/immutable/chunks/Bb9JxzU7.js @@ -0,0 +1,2 @@ +import{I as G,J as j,K as ee,L as z,o as te,M as T,N as H,e as g,h as v,B as m,O as P,b as re,a as se,P as ie,Q as V,j as p,i as J,p as F,k as W,m as ne,S as ae,U as A,V as D,W as $,X as fe,Y as he,Z as U,n as K,_ as oe,g as x,c as O,$ as le,s as de,a0 as S,E as ce,a1 as ue,a2 as _e,a3 as pe,a4 as ge,a5 as ve,a6 as ye,a7 as L,C as be,a8 as Q,a9 as me,aa as Ee,ab as M,d as N,ac as we,ad as Te,ae as Se,af as Ne,q as Re,ag as Ae,ah as De,w as Oe}from"./CcONa1Mr.js";import{b as ke}from"./RsTAN2PN.js";function Fe(t){let e=0,r=z(0),i;return()=>{G()&&(j(r),ee(()=>(e===0&&(i=te(()=>t(()=>H(r)))),e+=1,()=>{T(()=>{e-=1,e===0&&(i?.(),i=void 0,H(r))})})))}}var xe=ce|ue;function Le(t,e,r,i){new Me(t,e,r,i)}class Me{parent;is_pending=!1;transform_error;#t;#_=v?g:null;#i;#o;#e;#n=null;#r=null;#s=null;#a=null;#l=0;#h=0;#d=!1;#p=new Set;#g=new Set;#f=null;#b=Fe(()=>(this.#f=z(this.#l),()=>{this.#f=null}));constructor(e,r,i,n){this.#t=e,this.#i=r,this.#o=s=>{var a=m;a.b=this,a.f|=P,i(s)},this.parent=m.b,this.transform_error=n??this.parent?.transform_error??(s=>s),this.#e=re(()=>{if(v){const s=this.#_;se();const a=s.data===ie;if(s.data.startsWith(V)){const f=JSON.parse(s.data.slice(V.length));this.#E(f)}else a?this.#w():this.#m()}else this.#v()},xe),v&&(this.#t=g)}#m(){try{this.#n=p(()=>this.#o(this.#t))}catch(e){this.error(e)}}#E(e){const r=this.#i.failed;r&&(this.#s=p(()=>{r(this.#t,()=>e,()=>()=>{})}))}#w(){const e=this.#i.pending;e&&(this.is_pending=!0,this.#r=p(()=>e(this.#t)),T(()=>{var r=this.#a=document.createDocumentFragment(),i=J();r.append(i),this.#n=this.#u(()=>p(()=>this.#o(i))),this.#h===0&&(this.#t.before(r),this.#a=null,F(this.#r,()=>{this.#r=null}),this.#c(W))}))}#v(){try{if(this.is_pending=this.has_pending_snippet(),this.#h=0,this.#l=0,this.#n=p(()=>{this.#o(this.#t)}),this.#h>0){var e=this.#a=document.createDocumentFragment();ne(this.#n,e);const r=this.#i.pending;this.#r=p(()=>r(this.#t))}else this.#c(W)}catch(r){this.error(r)}}#c(e){this.is_pending=!1,e.transfer_effects(this.#p,this.#g)}defer_effect(e){ae(e,this.#p,this.#g)}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!this.#i.pending}#u(e){var r=m,i=U,n=K;A(this.#e),D(this.#e),$(this.#e.ctx);try{return fe.ensure(),e()}catch(s){return he(s),null}finally{A(r),D(i),$(n)}}#y(e,r){if(!this.has_pending_snippet()){this.parent&&this.parent.#y(e,r);return}this.#h+=e,this.#h===0&&(this.#c(r),this.#r&&F(this.#r,()=>{this.#r=null}),this.#a&&(this.#t.before(this.#a),this.#a=null))}update_pending_count(e,r){this.#y(e,r),this.#l+=e,!(!this.#f||this.#d)&&(this.#d=!0,T(()=>{this.#d=!1,this.#f&&oe(this.#f,this.#l)}))}get_effect_pending(){return this.#b(),j(this.#f)}error(e){var r=this.#i.onerror;let i=this.#i.failed;if(!r&&!i)throw e;this.#n&&(x(this.#n),this.#n=null),this.#r&&(x(this.#r),this.#r=null),this.#s&&(x(this.#s),this.#s=null),v&&(O(this.#_),le(),O(de()));var n=!1,s=!1;const a=()=>{if(n){pe();return}n=!0,s&&_e(),this.#s!==null&&F(this.#s,()=>{this.#s=null}),this.#u(()=>{this.#v()})},c=f=>{try{s=!0,r?.(f,a),s=!1}catch(h){S(h,this.#e&&this.#e.parent)}i&&(this.#s=this.#u(()=>{try{return p(()=>{var h=m;h.b=this,h.f|=P,i(this.#t,()=>f,()=>a)})}catch(h){return S(h,this.#e.parent),null}}))};T(()=>{var f;try{f=this.transform_error(e)}catch(h){S(h,this.#e&&this.#e.parent);return}f!==null&&typeof f=="object"&&typeof f.then=="function"?f.then(c,h=>S(h,this.#e&&this.#e.parent)):c(f)})}}const Ie=["touchstart","touchmove"];function Ce(t){return Ie.includes(t)}const w=Symbol("events"),X=new Set,I=new Set;function Ye(t,e,r,i={}){function n(s){if(i.capture||C.call(e,s),!s.cancelBubble)return ve(()=>r?.call(this,s))}return t.startsWith("pointer")||t.startsWith("touch")||t==="wheel"?T(()=>{e.addEventListener(t,n,i)}):e.addEventListener(t,n,i),n}function Ve(t,e,r,i,n){var s={capture:i,passive:n},a=Ye(t,e,r,s);(e===document.body||e===window||e===document||e instanceof HTMLMediaElement)&&ge(()=>{e.removeEventListener(t,a,s)})}function We(t,e,r){(e[w]??={})[t]=r}function $e(t){for(var e=0;e{throw u});throw _}}finally{t[w]=e,delete t.currentTarget,D(y),A(E)}}}function qe(t,e){var r=e==null?"":typeof e=="object"?`${e}`:e;r!==(t.__t??=t.nodeValue)&&(t.__t=r,t.nodeValue=`${r}`)}function Be(t,e){return Z(t,e)}function je(t,e){L(),e.intro=e.intro??!1;const r=e.target,i=v,n=g;try{for(var s=be(r);s&&(s.nodeType!==Q||s.data!==me);)s=Ee(s);if(!s)throw M;N(!0),O(s);const a=Z(t,{...e,anchor:s});return N(!1),a}catch(a){if(a instanceof Error&&a.message.split(` +`).some(c=>c.startsWith("https://svelte.dev/e/")))throw a;return a!==M&&console.warn("Failed to hydrate: ",a),e.recover===!1&&we(),L(),Te(r),N(!1),Be(t,e)}finally{N(i),O(n)}}const R=new Map;function Z(t,{target:e,anchor:r,props:i={},events:n,context:s,intro:a=!0,transformError:c}){L();var f=void 0,h=Se(()=>{var y=r??e.appendChild(J());Le(y,{pending:()=>{}},l=>{Re({});var o=K;if(s&&(o.c=s),n&&(i.$$events=n),v&&ke(l,null),f=t(l,i)||{},v&&(m.nodes.end=g,g===null||g.nodeType!==Q||g.data!==Ae))throw De(),M;Oe()},c);var E=new Set,_=l=>{for(var o=0;o{for(var l of E)for(const u of[e,document]){var o=R.get(u),d=o.get(l);--d==0?(u.removeEventListener(l,C),o.delete(l),o.size===0&&R.delete(u)):o.set(l,d)}I.delete(_),y!==r&&y.parentNode?.removeChild(y)}});return Y.set(f,h),f}let Y=new WeakMap;function ze(t,e){const r=Y.get(t);return r?(Y.delete(t),r(e)):Promise.resolve()}export{We as a,$e as d,Ve as e,je as h,Be as m,qe as s,ze as u}; diff --git a/backend/static/export-viewer/_app/immutable/chunks/Bxn6SmGf.js b/backend/static/export-viewer/_app/immutable/chunks/Bxn6SmGf.js new file mode 100644 index 0000000..fa51aaf --- /dev/null +++ b/backend/static/export-viewer/_app/immutable/chunks/Bxn6SmGf.js @@ -0,0 +1 @@ +import{b as c,h as o,a as l,E as b,r as p,s as v,c as g,d,e as m}from"./CcONa1Mr.js";import{B as y}from"./BRDva_z9.js";function k(f,h,_=!1){var n;o&&(n=m,l());var s=new y(f),u=_?b:0;function t(a,r){if(o){var e=p(n);if(a!==parseInt(e.substring(1))){var i=v();g(i),s.anchor=i,d(!1),s.ensure(a,r),d(!0);return}}s.ensure(a,r)}c(()=>{var a=!1;h((r,e=0)=>{a=!0,t(e,r)}),a||t(-1,null)},u)}export{k as i}; diff --git a/backend/static/export-viewer/_app/immutable/chunks/CcONa1Mr.js b/backend/static/export-viewer/_app/immutable/chunks/CcONa1Mr.js new file mode 100644 index 0000000..99e9d0b --- /dev/null +++ b/backend/static/export-viewer/_app/immutable/chunks/CcONa1Mr.js @@ -0,0 +1 @@ +var jt=Array.isArray,Yt=Array.prototype.indexOf,ie=Array.prototype.includes,In=Array.from,Dn=Object.defineProperty,ve=Object.getOwnPropertyDescriptor,Cn=Object.getOwnPropertyDescriptors,Ht=Object.prototype,qt=Array.prototype,Ut=Object.getPrototypeOf,We=Object.isExtensible;const Vt=()=>{};function Bt(e){for(var t=0;t{e=r,t=s});return{promise:n,resolve:e,reject:t}}function Pn(e,t){if(Array.isArray(e))return e;if(!(Symbol.iterator in e))return Array.from(e);const n=[];for(const r of e)if(n.push(r),n.length===t)break;return n}const E=2,ae=4,pe=8,at=1<<24,H=16,P=32,J=64,zt=128,x=512,g=1024,b=2048,M=4096,D=8192,C=16384,re=32768,$e=1<<25,be=65536,Ce=1<<17,Gt=1<<18,we=1<<19,lt=1<<20,Mn=1<<25,Q=65536,Pe=1<<21,xe=1<<22,V=1<<23,Oe=Symbol("$state"),Fn=Symbol("legacy props"),Ln=Symbol(""),Y=new class extends Error{name="StaleReactionError";message="The reaction that called `getAbortSignal()` was re-run or destroyed"},Yn=!!globalThis.document?.contentType&&globalThis.document.contentType.includes("xml"),ke=3,ft=8;function Kt(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function Hn(e,t,n){throw new Error("https://svelte.dev/e/each_key_duplicate")}function Xt(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function Zt(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function Wt(e){throw new Error("https://svelte.dev/e/effect_orphan")}function $t(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function qn(){throw new Error("https://svelte.dev/e/hydration_failed")}function Un(e){throw new Error("https://svelte.dev/e/props_invalid_value")}function Jt(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function Qt(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function en(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function Vn(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const Bn=1,zn=2,Gn=4,Kn=8,Xn=16,Zn=1,Wn=4,$n=8,Jn=16,Qn=1,er=2,tn="[",nn="[!",tr="[?",rn="]",Ye={},m=Symbol(),sn="http://www.w3.org/1999/xhtml";function He(e){console.warn("https://svelte.dev/e/hydration_mismatch")}function nr(){console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}let ee=!1;function rr(e){ee=e}let A;function le(e){if(e===null)throw He(),Ye;return A=e}function sr(){return le(K(A))}function ir(e){if(ee){if(K(A)!==null)throw He(),Ye;A=e}}function ar(e=1){if(ee){for(var t=e,n=A;t--;)n=K(n);A=n}}function lr(e=!0){for(var t=0,n=A;;){if(n.nodeType===ft){var r=n.data;if(r===rn){if(t===0)return n;t-=1}else(r===tn||r===nn||r[0]==="["&&!isNaN(Number(r.slice(1))))&&(t+=1)}var s=K(n);e&&n.remove(),n=s}}function fr(e){if(!e||e.nodeType!==ft)throw He(),Ye;return e.data}function ut(e){return e===this.v}function an(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function ot(e){return!an(e,this.v)}let F=null;function Te(e){F=e}function ur(e,t=!1,n){F={p:F,i:!1,c:null,e:null,s:e,x:null,r:d,l:null}}function or(e){var t=F,n=t.e;if(n!==null){t.e=null;for(var r of n)St(r)}return t.i=!0,F=t.p,{}}function ct(){return!0}let Z=[];function _t(){var e=Z;Z=[],Bt(e)}function Je(e){if(Z.length===0&&!de){var t=Z;queueMicrotask(()=>{t===Z&&_t()})}Z.push(e)}function ln(){for(;Z.length>0;)_t()}function fn(e){var t=d;if(t===null)return v.f|=V,e;if((t.f&re)===0&&(t.f&ae)===0)throw e;Ae(e,t)}function Ae(e,t){for(;t!==null;){if((t.f&zt)!==0){if((t.f&re)===0)throw e;try{t.b.error(e);return}catch(n){e=n}}t=t.parent}throw e}const un=-7169;function y(e,t){e.f=e.f&un|t}function qe(e){(e.f&x)!==0||e.deps===null?y(e,g):y(e,M)}function vt(e){if(e!==null)for(const t of e)(t.f&E)===0||(t.f&Q)===0||(t.f^=Q,vt(t.deps))}function on(e,t,n){(e.f&b)!==0?t.add(e):(e.f&M)!==0&&n.add(e),vt(e.deps),y(e,g)}const q=new Set;let w=null,O=null,Me=null,de=!1,Ie=!1,se=null,Ee=null;var Qe=0;let cn=1;class z{id=cn++;current=new Map;previous=new Map;#l=new Set;#f=new Set;#r=new Map;#t=new Map;#_=null;#e=[];#v=[];#i=new Set;#s=new Set;#n=new Map;is_fork=!1;#u=!1;#a=new Set;#o(){return this.is_fork||this.#t.size>0}#p(){for(const r of this.#a)for(const s of r.#t.keys()){for(var t=!1,n=s;n.parent!==null;){if(this.#n.has(n)){t=!0;break}n=n.parent}if(!t)return!0}return!1}skip_effect(t){this.#n.has(t)||this.#n.set(t,{d:[],m:[]})}unskip_effect(t){var n=this.#n.get(t);if(n){this.#n.delete(t);for(var r of n.d)y(r,b),this.schedule(r);for(r of n.m)y(r,M),this.schedule(r)}}#c(){if(Qe++>1e3&&(q.delete(this),vn()),!this.#o()){for(const a of this.#i)this.#s.delete(a),y(a,b),this.schedule(a);for(const a of this.#s)y(a,M),this.schedule(a)}const t=this.#e;this.#e=[],this.apply();var n=se=[],r=[],s=Ee=[];for(const a of t)try{this.#d(a,n,r)}catch(l){throw pt(a),l}if(w=null,s.length>0){var i=z.ensure();for(const a of s)i.schedule(a)}if(se=null,Ee=null,this.#o()||this.#p()){this.#h(r),this.#h(n);for(const[a,l]of this.#n)ht(a,l)}else{this.#r.size===0&&q.delete(this),this.#i.clear(),this.#s.clear();for(const a of this.#l)a(this);this.#l.clear(),et(r),et(n),this.#_?.resolve()}var u=w;if(this.#e.length>0){const a=u??=this;a.#e.push(...this.#e.filter(l=>!a.#e.includes(l)))}u!==null&&(q.add(u),u.#c()),q.has(this)||this.#w()}#d(t,n,r){t.f^=g;for(var s=t.first;s!==null;){var i=s.f,u=(i&(P|J))!==0,a=u&&(i&g)!==0,l=a||(i&D)!==0||this.#n.has(s);if(!l&&s.fn!==null){u?s.f^=g:(i&ae)!==0?n.push(s):ye(s)&&((i&H)!==0&&this.#s.add(s),ue(s));var o=s.first;if(o!==null){s=o;continue}}for(;s!==null;){var f=s.next;if(f!==null){s=f;break}s=s.parent}}}#h(t){for(var n=0;n!this.current.has(c));if(s.length===0)t&&f.discard();else if(n.length>0){f.activate();var i=new Set,u=new Map;for(var a of n)dt(a,s,i,u);u=new Map;var l=[...f.current.keys()].filter(c=>this.current.has(c)?this.current.get(c)[0]!==c:!0);for(const c of this.#v)(c.f&(C|D|Ce))===0&&Ue(c,l,u)&&((c.f&(xe|H))!==0?(y(c,b),f.schedule(c)):f.#i.add(c));if(f.#e.length>0){f.apply();for(var o of f.#e)f.#d(o,[],[]);f.#e=[]}f.deactivate()}}for(const f of q)f.#a.has(this)&&(f.#a.delete(this),f.#a.size===0&&!f.#o()&&(f.activate(),f.#c()))}increment(t,n){let r=this.#r.get(n)??0;if(this.#r.set(n,r+1),t){let s=this.#t.get(n)??0;this.#t.set(n,s+1)}}decrement(t,n,r){let s=this.#r.get(n)??0;if(s===1?this.#r.delete(n):this.#r.set(n,s-1),t){let i=this.#t.get(n)??0;i===1?this.#t.delete(n):this.#t.set(n,i-1)}this.#u||r||(this.#u=!0,Je(()=>{this.#u=!1,this.flush()}))}transfer_effects(t,n){for(const r of t)this.#i.add(r);for(const r of n)this.#s.add(r);t.clear(),n.clear()}oncommit(t){this.#l.add(t)}ondiscard(t){this.#f.add(t)}settled(){return(this.#_??=it()).promise}static ensure(){if(w===null){const t=w=new z;Ie||(q.add(w),de||Je(()=>{w===t&&t.flush()}))}return w}apply(){{O=null;return}}schedule(t){if(Me=t,t.b?.is_pending&&(t.f&(ae|pe|at))!==0&&(t.f&re)===0){t.b.defer_effect(t);return}for(var n=t;n.parent!==null;){n=n.parent;var r=n.f;if(se!==null&&n===d&&(v===null||(v.f&E)===0))return;if((r&(J|P))!==0){if((r&g)===0)return;n.f^=g}}this.#e.push(n)}}function _n(e){var t=de;de=!0;try{for(var n;;){if(ln(),w===null)return n;w.flush()}}finally{de=t}}function vn(){try{$t()}catch(e){Ae(e,Me)}}let j=null;function et(e){var t=e.length;if(t!==0){for(var n=0;n0)){B.clear();for(const s of j){if((s.f&(C|D))!==0)continue;const i=[s];let u=s.parent;for(;u!==null;)j.has(u)&&(j.delete(u),i.push(u)),u=u.parent;for(let a=i.length-1;a>=0;a--){const l=i[a];(l.f&(C|D))===0&&ue(l)}}j.clear()}}j=null}}function dt(e,t,n,r){if(!n.has(e)&&(n.add(e),e.reactions!==null))for(const s of e.reactions){const i=s.f;(i&E)!==0?dt(s,t,n,r):(i&(xe|H))!==0&&(i&b)===0&&Ue(s,t,r)&&(y(s,b),Ve(s))}}function Ue(e,t,n){const r=n.get(e);if(r!==void 0)return r;if(e.deps!==null)for(const s of e.deps){if(ie.call(t,s))return!0;if((s.f&E)!==0&&Ue(s,t,n))return n.set(s,!0),!0}return n.set(e,!1),!1}function Ve(e){w.schedule(e)}function ht(e,t){if(!((e.f&P)!==0&&(e.f&g)!==0)){(e.f&b)!==0?t.d.push(e):(e.f&M)!==0&&t.m.push(e),y(e,g);for(var n=e.first;n!==null;)ht(n,t),n=n.next}}function pt(e){y(e,g);for(var t=e.first;t!==null;)pt(t),t=t.next}function dn(e,t,n,r){const s=Be;var i=e.filter(_=>!_.settled);if(n.length===0&&i.length===0){r(t.map(s));return}var u=d,a=hn(),l=i.length===1?i[0].promise:i.length>1?Promise.all(i.map(_=>_.promise)):null;function o(_){a();try{r(_)}catch(p){(u.f&C)===0&&Ae(p,u)}Re()}if(n.length===0){l.then(()=>o(t.map(s)));return}var f=wt();function c(){Promise.all(n.map(_=>pn(_))).then(_=>o([...t.map(s),..._])).catch(_=>Ae(_,u)).finally(()=>f())}l?l.then(()=>{a(),c(),Re()}):c()}function hn(){var e=d,t=v,n=F,r=w;return function(i=!0){fe(e),G(t),Te(n),i&&(e.f&C)===0&&(r?.activate(),r?.apply())}}function Re(e=!0){fe(null),G(null),Te(null),e&&w?.deactivate()}function wt(){var e=d,t=e.b,n=w,r=t.is_rendered();return t.update_pending_count(1,n),n.increment(r,e),(s=!1)=>{t.update_pending_count(-1,n),n.decrement(r,e,s)}}function Be(e){var t=E|b,n=v!==null&&(v.f&E)!==0?v:null;return d!==null&&(d.f|=we),{ctx:F,deps:null,effects:null,equals:ut,f:t,fn:e,reactions:null,rv:0,v:m,wv:0,parent:n??d,ac:null}}function pn(e,t,n){let r=d;r===null&&Kt();var s=void 0,i=Ge(m),u=!v,a=new Map;return Rn(()=>{var l=d,o=it();s=o.promise;try{Promise.resolve(e()).then(o.resolve,o.reject).finally(Re)}catch(p){o.reject(p),Re()}var f=w;if(u){if((l.f&re)!==0)var c=wt();if(r.b.is_rendered())a.get(f)?.reject(Y),a.delete(f);else{for(const p of a.values())p.reject(Y);a.clear()}a.set(f,o)}const _=(p,h=void 0)=>{if(c){var N=h===Y;c(N)}if(!(h===Y||(l.f&C)!==0)){if(f.activate(),h)i.f|=V,Le(i,h);else{(i.f&V)!==0&&(i.f^=V),Le(i,p);for(const[oe,ge]of a){if(a.delete(oe),oe===f)break;ge.reject(Y)}}f.deactivate()}};o.promise.then(_,p=>_(null,p||"unknown"))}),An(()=>{for(const l of a.values())l.reject(Y)}),new Promise(l=>{function o(f){function c(){f===s?l(i):o(s)}f.then(c,c)}o(s)})}function cr(e){const t=Be(e);return It(t),t}function _r(e){const t=Be(e);return t.equals=ot,t}function wn(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;n0&&!Et&&En()}return t}function En(){Et=!1;for(const e of Fe)(e.f&g)!==0&&y(e,M),ye(e)&&ue(e);Fe.clear()}function De(e){X(e,e.v+1)}function mt(e,t,n){var r=e.reactions;if(r!==null)for(var s=r.length,i=0;i{if($===i)return a();var l=v,o=$;G(null),st(i);var f=a();return G(l),st(o),f};return r&&n.set("length",U(e.length)),new Proxy(e,{defineProperty(a,l,o){(!("value"in o)||o.configurable===!1||o.enumerable===!1||o.writable===!1)&&Jt();var f=n.get(l);return f===void 0?u(()=>{var c=U(o.value);return n.set(l,c),c}):X(f,o.value,!0),!0},deleteProperty(a,l){var o=n.get(l);if(o===void 0){if(l in a){const f=u(()=>U(m));n.set(l,f),De(s)}}else X(o,m),De(s);return!0},get(a,l,o){if(l===Oe)return e;var f=n.get(l),c=l in a;if(f===void 0&&(!c||ve(a,l)?.writable)&&(f=u(()=>{var p=ce(c?a[l]:m),h=U(p);return h}),n.set(l,f)),f!==void 0){var _=_e(f);return _===m?void 0:_}return Reflect.get(a,l,o)},getOwnPropertyDescriptor(a,l){var o=Reflect.getOwnPropertyDescriptor(a,l);if(o&&"value"in o){var f=n.get(l);f&&(o.value=_e(f))}else if(o===void 0){var c=n.get(l),_=c?.v;if(c!==void 0&&_!==m)return{enumerable:!0,configurable:!0,value:_,writable:!0}}return o},has(a,l){if(l===Oe)return!0;var o=n.get(l),f=o!==void 0&&o.v!==m||Reflect.has(a,l);if(o!==void 0||d!==null&&(!f||ve(a,l)?.writable)){o===void 0&&(o=u(()=>{var _=f?ce(a[l]):m,p=U(_);return p}),n.set(l,o));var c=_e(o);if(c===m)return!1}return f},set(a,l,o,f){var c=n.get(l),_=l in a;if(r&&l==="length")for(var p=o;pU(m)),n.set(p+"",h))}if(c===void 0)(!_||ve(a,l)?.writable)&&(c=u(()=>U(void 0)),X(c,ce(o)),n.set(l,c));else{_=c.v!==m;var N=u(()=>ce(o));X(c,N)}var oe=Reflect.getOwnPropertyDescriptor(a,l);if(oe?.set&&oe.set.call(f,o),!_){if(r&&typeof l=="string"){var ge=n.get("length"),Ne=Number(l);Number.isInteger(Ne)&&Ne>=ge.v&&X(ge,Ne+1)}De(s)}return!0},ownKeys(a){_e(s);var l=Reflect.ownKeys(a).filter(c=>{var _=n.get(c);return _===void 0||_.v!==m});for(var[o,f]of n)f.v!==m&&!(o in a)&&l.push(o);return l},setPrototypeOf(){Qt()}})}var tt,mn,bt,Tt;function dr(){if(tt===void 0){tt=window,mn=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,n=Text.prototype;bt=ve(t,"firstChild").get,Tt=ve(t,"nextSibling").get,We(e)&&(e.__click=void 0,e.__className=void 0,e.__attributes=null,e.__style=void 0,e.__e=void 0),We(n)&&(n.__t=void 0)}}function Se(e=""){return document.createTextNode(e)}function je(e){return bt.call(e)}function K(e){return Tt.call(e)}function hr(e,t){if(!ee)return je(e);var n=je(A);if(n===null)n=A.appendChild(Se());else if(t&&n.nodeType!==ke){var r=Se();return n?.before(r),le(r),r}return t&&Ke(n),le(n),n}function pr(e,t=!1){if(!ee){var n=je(e);return n instanceof Comment&&n.data===""?K(n):n}if(t){if(A?.nodeType!==ke){var r=Se();return A?.before(r),le(r),r}Ke(A)}return A}function wr(e,t=1,n=!1){let r=ee?A:e;for(var s;t--;)s=r,r=K(r);if(!ee)return r;if(n){if(r?.nodeType!==ke){var i=Se();return r===null?s?.after(i):r.before(i),le(i),i}Ke(r)}return le(r),r}function yr(e){e.textContent=""}function gr(){return!1}function Er(e,t,n){return document.createElementNS(sn,e,void 0)}function Ke(e){if(e.nodeValue.length<65536)return;let t=e.nextSibling;for(;t!==null&&t.nodeType===ke;)t.remove(),e.nodeValue+=t.nodeValue,t=e.nextSibling}let nt=!1;function bn(){nt||(nt=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{if(!e.defaultPrevented)for(const t of e.target.elements)t.__on_r?.()})},{capture:!0}))}function Xe(e){var t=v,n=d;G(null),fe(null);try{return e()}finally{G(t),fe(n)}}function mr(e,t,n,r=n){e.addEventListener(t,()=>Xe(n));const s=e.__on_r;s?e.__on_r=()=>{s(),r(!0)}:e.__on_r=()=>r(!0),bn()}function At(e){d===null&&(v===null&&Wt(),Zt()),ne&&Xt()}function Tn(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function L(e,t){var n=d;n!==null&&(n.f&D)!==0&&(e|=D);var r={ctx:F,deps:null,nodes:null,f:e|b|x,first:null,fn:t,last:null,next:null,parent:n,b:n&&n.b,prev:null,teardown:null,wv:0,ac:null};w?.register_created_effect(r);var s=r;if((e&ae)!==0)se!==null?se.push(r):z.ensure().schedule(r);else if(t!==null){try{ue(r)}catch(u){throw te(r),u}s.deps===null&&s.teardown===null&&s.nodes===null&&s.first===s.last&&(s.f&we)===0&&(s=s.first,(e&H)!==0&&(e&be)!==0&&s!==null&&(s.f|=be))}if(s!==null&&(s.parent=n,n!==null&&Tn(s,n),v!==null&&(v.f&E)!==0&&(e&J)===0)){var i=v;(i.effects??=[]).push(s)}return r}function Rt(){return v!==null&&!I}function An(e){const t=L(pe,null);return y(t,g),t.teardown=e,t}function br(e){At();var t=d.f,n=!v&&(t&P)!==0&&(t&re)===0;if(n){var r=F;(r.e??=[]).push(e)}else return St(e)}function St(e){return L(ae|lt,e)}function Tr(e){return At(),L(pe|lt,e)}function Ar(e){z.ensure();const t=L(J|we,e);return(n={})=>new Promise(r=>{n.outro?kn(t,()=>{te(t),r(void 0)}):(te(t),r(void 0))})}function Rr(e){return L(ae,e)}function Rn(e){return L(xe|we,e)}function Sr(e,t=0){return L(pe|t,e)}function xr(e,t=[],n=[],r=[]){dn(r,t,n,s=>{L(pe,()=>e(...s.map(_e)))})}function kr(e,t=0){var n=L(H|t,e);return n}function Nr(e){return L(P|we,e)}function xt(e){var t=e.teardown;if(t!==null){const n=ne,r=v;rt(!0),G(null);try{t.call(null)}finally{rt(n),G(r)}}}function Ze(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){const s=n.ac;s!==null&&Xe(()=>{s.abort(Y)});var r=n.next;(n.f&J)!==0?n.parent=null:te(n,t),n=r}}function Sn(e){for(var t=e.first;t!==null;){var n=t.next;(t.f&P)===0&&te(t),t=n}}function te(e,t=!0){var n=!1;(t||(e.f&Gt)!==0)&&e.nodes!==null&&e.nodes.end!==null&&(xn(e.nodes.start,e.nodes.end),n=!0),y(e,$e),Ze(e,t&&!n),he(e,0);var r=e.nodes&&e.nodes.t;if(r!==null)for(const i of r)i.stop();xt(e),e.f^=$e,e.f|=C;var s=e.parent;s!==null&&s.first!==null&&kt(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function xn(e,t){for(;e!==null;){var n=e===t?null:K(e);e.remove(),e=n}}function kt(e){var t=e.parent,n=e.prev,r=e.next;n!==null&&(n.next=r),r!==null&&(r.prev=n),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=n))}function kn(e,t,n=!0){var r=[];Nt(e,r,!0);var s=()=>{n&&te(e),t&&t()},i=r.length;if(i>0){var u=()=>--i||s();for(var a of r)a.out(u)}else s()}function Nt(e,t,n){if((e.f&D)===0){e.f^=D;var r=e.nodes&&e.nodes.t;if(r!==null)for(const a of r)(a.is_global||n)&&t.push(a);for(var s=e.first;s!==null;){var i=s.next,u=(s.f&be)!==0||(s.f&P)!==0&&(e.f&H)!==0;Nt(s,t,u?n:!1),s=i}}}function Or(e){Ot(e,!0)}function Ot(e,t){if((e.f&D)!==0){e.f^=D,(e.f&g)===0&&(y(e,b),z.ensure().schedule(e));for(var n=e.first;n!==null;){var r=n.next,s=(n.f&be)!==0||(n.f&P)!==0;Ot(n,s?t:!1),n=r}var i=e.nodes&&e.nodes.t;if(i!==null)for(const u of i)(u.is_global||t)&&u.in()}}function Ir(e,t){if(e.nodes)for(var n=e.nodes.start,r=e.nodes.end;n!==null;){var s=n===r?null:K(n);t.append(n),n=s}}let me=!1,ne=!1;function rt(e){ne=e}let v=null,I=!1;function G(e){v=e}let d=null;function fe(e){d=e}let k=null;function It(e){v!==null&&(k===null?k=[e]:k.push(e))}let T=null,R=0,S=null;function Nn(e){S=e}let Dt=1,W=0,$=W;function st(e){$=e}function Ct(){return++Dt}function ye(e){var t=e.f;if((t&b)!==0)return!0;if(t&E&&(e.f&=~Q),(t&M)!==0){for(var n=e.deps,r=n.length,s=0;se.wv)return!0}(t&x)!==0&&O===null&&y(e,g)}return!1}function Pt(e,t,n=!0){var r=e.reactions;if(r!==null&&!(k!==null&&ie.call(k,e)))for(var s=0;s{e.ac.abort(Y)}),e.ac=null);try{e.f|=Pe;var f=e.fn,c=f();e.f|=re;var _=e.deps,p=w?.is_fork;if(T!==null){var h;if(p||he(e,R),_!==null&&R>0)for(_.length=R+T.length,h=0;h{r.delete(c),r.size===0&&n&&(n(),n=null)}}return{set:a,update:i,subscribe:s}}class xe{constructor(t,n){this.status=t,typeof n=="string"?this.body={message:n}:n?this.body=n:this.body={message:`Error: ${t}`}}toString(){return JSON.stringify(this.body)}}class Le{constructor(t,n){this.status=t,this.location=n}}class Ae extends Error{constructor(t,n,r){super(r),this.status=t,this.text=n}}new URL("sveltekit-internal://");function vt(e,t){return e==="/"||t==="ignore"?e:t==="never"?e.endsWith("/")?e.slice(0,-1):e:t==="always"&&!e.endsWith("/")?e+"/":e}function yt(e){return e.split("%25").map(decodeURI).join("%25")}function bt(e){for(const t in e)e[t]=decodeURIComponent(e[t]);return e}function me({href:e}){return e.split("#")[0]}function kt(...e){let t=5381;for(const n of e)if(typeof n=="string"){let r=n.length;for(;r;)t=t*33^n.charCodeAt(--r)}else if(ArrayBuffer.isView(n)){const r=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let a=r.length;for(;a;)t=t*33^r[--a]}else throw new TypeError("value must be a string or TypedArray");return(t>>>0).toString(36)}new TextEncoder;new TextDecoder;function Et(e){const t=atob(e),n=new Uint8Array(t.length);for(let r=0;r((e instanceof Request?e.method:t?.method||"GET")!=="GET"&&W.delete(Ue(e)),St(e,t));const W=new Map;function Rt(e,t){const n=Ue(e,t),r=document.querySelector(n);if(r?.textContent){r.remove();let{body:a,...i}=JSON.parse(r.textContent);const s=r.getAttribute("data-ttl");return s&&W.set(n,{body:a,init:i,ttl:1e3*Number(s)}),r.getAttribute("data-b64")!==null&&(a=Et(a)),Promise.resolve(new Response(a,i))}return window.fetch(e,t)}function xt(e,t,n){if(W.size>0){const r=Ue(e,n),a=W.get(r);if(a){if(performance.now(){const a=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(r);if(a)return t.push({name:a[1],matcher:a[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const i=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(r);if(i)return t.push({name:i[1],matcher:i[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!r)return;const s=r.split(/\[(.+?)\](?!\])/);return"/"+s.map((l,c)=>{if(c%2){if(l.startsWith("x+"))return we(String.fromCharCode(parseInt(l.slice(2),16)));if(l.startsWith("u+"))return we(String.fromCharCode(...l.slice(2).split("-").map(_=>parseInt(_,16))));const f=Lt.exec(l),[,p,w,h,u]=f;return t.push({name:h,matcher:u,optional:!!p,rest:!!w,chained:w?c===1&&s[0]==="":!1}),w?"([^]*?)":p?"([^/]*)?":"([^/]+?)"}return we(l)}).join("")}).join("")}/?$`),params:t}}function Ut(e){return e!==""&&!/^\([^)]+\)$/.test(e)}function Tt(e){return e.slice(1).split("/").filter(Ut)}function It(e,t,n){const r={},a=e.slice(1),i=a.filter(o=>o!==void 0);let s=0;for(let o=0;of).join("/"),s=0),c===void 0)if(l.rest)c="";else continue;if(!l.matcher||n[l.matcher](c)){r[l.name]=c;const f=t[o+1],p=a[o+1];f&&!f.rest&&f.optional&&p&&l.chained&&(s=0),!f&&!p&&Object.keys(r).length===i.length&&(s=0);continue}if(l.optional&&l.chained){s++;continue}return}if(!s)return r}function we(e){return e.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function Ot({nodes:e,server_loads:t,dictionary:n,matchers:r}){const a=new Set(t);return Object.entries(n).map(([o,[l,c,f]])=>{const{pattern:p,params:w}=At(o),h={id:o,exec:u=>{const _=p.exec(u);if(_)return It(_,w,r)},errors:[1,...f||[]].map(u=>e[u]),layouts:[0,...c||[]].map(s),leaf:i(l)};return h.errors.length=h.layouts.length=Math.max(h.errors.length,h.layouts.length),h});function i(o){const l=o<0;return l&&(o=~o),[l,e[o]]}function s(o){return o===void 0?o:[a.has(o),e[o]]}}function Je(e,t=JSON.parse){try{return t(sessionStorage[e])}catch{}}function Be(e,t,n=JSON.stringify){const r=n(t);try{sessionStorage[e]=r}catch{}}const L=globalThis.__sveltekit_ftrcoq?.base??"",Pt=globalThis.__sveltekit_ftrcoq?.assets??L??"",$t="1775501323159",He="sveltekit:snapshot",Xe="sveltekit:scroll",Ze="sveltekit:states",Ct="sveltekit:pageurl",B="sveltekit:history",J="sveltekit:navigation",j={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},Te=location.origin;function Qe(e){if(e instanceof URL)return e;let t=document.baseURI;if(!t){const n=document.getElementsByTagName("base");t=n.length?n[0].href:document.URL}return new URL(e,t)}function N(){return{x:pageXOffset,y:pageYOffset}}function V(e,t){return e.getAttribute(`data-sveltekit-${t}`)}const Ke={...j,"":j.hover};function et(e){let t=e.assignedSlot??e.parentNode;return t?.nodeType===11&&(t=t.host),t}function tt(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()==="A"&&e.hasAttribute("href"))return e;e=et(e)}}function be(e,t,n){let r;try{if(r=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI),n&&r.hash.match(/^#[^/]/)){const o=location.hash.split("#")[1]||"/";r.hash=`#${o}${r.hash}`}}catch{}const a=e instanceof SVGAElement?e.target.baseVal:e.target,i=!r||!!a||de(r,t,n)||(e.getAttribute("rel")||"").split(/\s+/).includes("external"),s=r?.origin===Te&&e.hasAttribute("download");return{url:r,external:i,target:a,download:s}}function re(e){let t=null,n=null,r=null,a=null,i=null,s=null,o=e;for(;o&&o!==document.documentElement;)r===null&&(r=V(o,"preload-code")),a===null&&(a=V(o,"preload-data")),t===null&&(t=V(o,"keepfocus")),n===null&&(n=V(o,"noscroll")),i===null&&(i=V(o,"reload")),s===null&&(s=V(o,"replacestate")),o=et(o);function l(c){switch(c){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:Ke[r??"off"],preload_data:Ke[a??"off"],keepfocus:l(t),noscroll:l(n),reload:l(i),replace_state:l(s)}}function Fe(e){const t=Re(e);let n=!0;function r(){n=!0,t.update(s=>s)}function a(s){n=!1,t.set(s)}function i(s){let o;return t.subscribe(l=>{(o===void 0||n&&l!==o)&&s(o=l)})}return{notify:r,set:a,subscribe:i}}const nt={v:()=>{}};function jt(){const{set:e,subscribe:t}=Re(!1);let n;async function r(){clearTimeout(n);try{const a=await fetch(`${Pt}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!a.ok)return!1;const s=(await a.json()).version!==$t;return s&&(e(!0),nt.v(),clearTimeout(n)),s}catch{return!1}}return{subscribe:t,check:r}}function de(e,t,n){return e.origin!==Te||!e.pathname.startsWith(t)?!0:n?e.pathname!==location.pathname:!1}function fn(e){}const rt=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...rt];const qt=new Set([...rt]);[...qt];function Nt(e){return e.filter(t=>t!=null)}function Ie(e){return e instanceof xe||e instanceof Ae?e.status:500}function Dt(e){return e instanceof Ae?e.text:"Internal Error"}let E,H,ve;const Vt=Ve.toString().includes("$$")||/function \w+\(\) \{\}/.test(Ve.toString()),Me="a:";Vt?(E={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL(Me)},H={current:null},ve={current:!1}):(E=new class{#e=A({});get data(){return U(this.#e)}set data(t){T(this.#e,t)}#t=A(null);get form(){return U(this.#t)}set form(t){T(this.#t,t)}#n=A(null);get error(){return U(this.#n)}set error(t){T(this.#n,t)}#r=A({});get params(){return U(this.#r)}set params(t){T(this.#r,t)}#a=A({id:null});get route(){return U(this.#a)}set route(t){T(this.#a,t)}#o=A({});get state(){return U(this.#o)}set state(t){T(this.#o,t)}#s=A(-1);get status(){return U(this.#s)}set status(t){T(this.#s,t)}#i=A(new URL(Me));get url(){return U(this.#i)}set url(t){T(this.#i,t)}},H=new class{#e=A(null);get current(){return U(this.#e)}set current(t){T(this.#e,t)}},ve=new class{#e=A(!1);get current(){return U(this.#e)}set current(t){T(this.#e,t)}},nt.v=()=>ve.current=!0);function Bt(e){Object.assign(E,e)}const Kt=new Set(["icon","shortcut icon","apple-touch-icon"]);let z=null;const C=Je(Xe)??{},X=Je(He)??{},$={url:Fe({}),page:Fe({}),navigating:Re(null),updated:jt()};function Oe(e){C[e]=N()}function Ft(e,t){let n=e+1;for(;C[n];)delete C[n],n+=1;for(n=t+1;X[n];)delete X[n],n+=1}function Z(e,t=!1){return t?location.replace(e.href):location.href=e.href,new Promise(()=>{})}async function at(){if("serviceWorker"in navigator){const e=await navigator.serviceWorker.getRegistration(L||"/");e&&await e.update()}}function ze(){}let Pe,ke,ae,I,Ee,y;const oe=[],se=[];let R=null;function ie(){R?.fork?.then(e=>e?.discard()),R=null}const te=new Map,ot=new Set,Mt=new Set,Y=new Set;let m={branch:[],error:null,url:null},st=!1,le=!1,Ge=!0,Q=!1,G=!1,it=!1,$e=!1,lt,v,x,q;const ce=new Set,We=new Map;async function gn(e,t,n){globalThis.__sveltekit_ftrcoq&&(globalThis.__sveltekit_ftrcoq.query,globalThis.__sveltekit_ftrcoq.prerender),document.URL!==location.href&&(location.href=location.href),y=e,await e.hooks.init?.(),Pe=Ot(e),I=document.documentElement,Ee=t,ke=e.nodes[0],ae=e.nodes[1],ke(),ae(),v=history.state?.[B],x=history.state?.[J],v||(v=x=Date.now(),history.replaceState({...history.state,[B]:v,[J]:x},""));const r=C[v];function a(){r&&(history.scrollRestoration="manual",scrollTo(r.x,r.y))}n?(a(),await an(Ee,n)):(await K({type:"enter",url:Qe(y.hash?ln(new URL(location.href)):location.href),replace_state:!0}),a()),rn()}function zt(){oe.length=0,$e=!1}function ct(e){se.some(t=>t?.snapshot)&&(X[e]=se.map(t=>t?.snapshot?.capture()))}function ut(e){X[e]?.forEach((t,n)=>{se[n]?.snapshot?.restore(t)})}function Ye(){Oe(v),Be(Xe,C),ct(x),Be(He,X)}async function Gt(e,t,n,r){let a;t.invalidateAll&&ie(),await K({type:"goto",url:Qe(e),keepfocus:t.keepFocus,noscroll:t.noScroll,replace_state:t.replaceState,state:t.state,redirect_count:n,nav_token:r,accept:()=>{t.invalidateAll&&($e=!0,a=[],We.forEach((i,s)=>{for(const o of i.keys())a.push(s+"/"+o)})),t.invalidate&&t.invalidate.forEach(nn)}}),t.invalidateAll&&ne().then(ne).then(()=>{We.forEach((i,s)=>{i.forEach(({resource:o},l)=>{a?.includes(s+"/"+l)&&o.refresh?.()})})})}async function Wt(e){if(e.id!==R?.id){ie();const t={};ce.add(t),R={id:e.id,token:t,promise:dt({...e,preload:t}).then(n=>(ce.delete(t),n.type==="loaded"&&n.state.error&&ie(),n)),fork:null}}return R.promise}async function ye(e){const t=(await he(e,!1))?.route;t&&await Promise.all([...t.layouts,t.leaf].filter(Boolean).map(n=>n[1]()))}async function ft(e,t,n){const r={params:m.params,route:{id:m.route?.id??null},url:new URL(location.href)};m={...e.state,nav:r};const a=document.querySelector("style[data-sveltekit]");if(a&&a.remove(),Object.assign(E,e.props.page),lt=new y.root({target:t,props:{...e.props,stores:$,components:se},hydrate:n,sync:!1,transformError:void 0}),await Promise.resolve(),ut(x),n){const i={from:null,to:{...r,scroll:C[v]??N()},willUnload:!1,type:"enter",complete:Promise.resolve()};Y.forEach(s=>s(i))}le=!0}async function ue({url:e,params:t,branch:n,errors:r,status:a,error:i,route:s,form:o}){let l="never";if(L&&(e.pathname===L||e.pathname===L+"/"))l="always";else for(const u of n)u?.slash!==void 0&&(l=u.slash);e.pathname=vt(e.pathname,l),e.search=e.search;const c={type:"loaded",state:{url:e,params:t,branch:n,error:i,route:s},props:{constructors:Nt(n).map(u=>u.node.component),page:De(E)}};o!==void 0&&(c.props.form=o);let f={},p=!E,w=0;for(let u=0;uo(new URL(s))))return!0;return!1}function je(e,t){return e?.type==="data"?e:e?.type==="skip"?t??null:null}function Ht(e,t){if(!e)return new Set(t.searchParams.keys());const n=new Set([...e.searchParams.keys(),...t.searchParams.keys()]);for(const r of n){const a=e.searchParams.getAll(r),i=t.searchParams.getAll(r);a.every(s=>i.includes(s))&&i.every(s=>a.includes(s))&&n.delete(r)}return n}function Xt({error:e,url:t,route:n,params:r}){return{type:"loaded",state:{error:e,url:t,route:n,params:r,branch:[]},props:{page:De(E),constructors:[]}}}async function dt({id:e,invalidating:t,url:n,params:r,route:a,preload:i}){if(R?.id===e)return ce.delete(R.token),R.promise;const{errors:s,layouts:o,leaf:l}=a,c=[...o,l];s.forEach(g=>g?.().catch(()=>{})),c.forEach(g=>g?.[1]().catch(()=>{}));const f=m.url?e!==fe(m.url):!1,p=m.route?a.id!==m.route.id:!1,w=Ht(m.url,n);let h=!1;const u=c.map(async(g,d)=>{if(!g)return;const b=m.branch[d];return g[1]===b?.loader&&!Jt(h,p,f,w,b.universal?.uses,r)?b:(h=!0,Ce({loader:g[1],url:n,params:r,route:a,parent:async()=>{const O={};for(let P=0;P{});const _=[];for(let g=0;gPromise.resolve({}),server_data_node:je(i)}),o={node:await ae(),loader:ae,universal:null,server:null,data:null};return ue({url:n,params:a,branch:[s,o],status:e,error:t,errors:[],route:null})}catch(s){if(s instanceof Le)return Gt(new URL(s.location,location.href),{},0);throw s}}async function Qt(e){const t=e.href;if(te.has(t))return te.get(t);let n;try{const r=(async()=>{let a=await y.hooks.reroute({url:new URL(e),fetch:async(i,s)=>Yt(i,s,e).promise})??e;if(typeof a=="string"){const i=new URL(e);y.hash?i.hash=a:i.pathname=a,a=i}return a})();te.set(t,r),n=await r}catch{te.delete(t);return}return n}async function he(e,t){if(e&&!de(e,L,y.hash)){const n=await Qt(e);if(!n)return;const r=en(n);for(const a of Pe){const i=a.exec(r);if(i)return{id:fe(e),invalidating:t,route:a,params:bt(i),url:e}}}}function en(e){return yt(y.hash?e.hash.replace(/^#/,"").replace(/[?#].+/,""):e.pathname.slice(L.length))||"/"}function fe(e){return(y.hash?e.hash.replace(/^#/,""):e.pathname)+e.search}function ht({url:e,type:t,intent:n,delta:r,event:a,scroll:i}){let s=!1;const o=Ne(m,n,e,t,i??null);r!==void 0&&(o.navigation.delta=r),a!==void 0&&(o.navigation.event=a);const l={...o.navigation,cancel:()=>{s=!0,o.reject(new Error("navigation cancelled"))}};return Q||ot.forEach(c=>c(l)),s?null:o}async function K({type:e,url:t,popped:n,keepfocus:r,noscroll:a,replace_state:i,state:s={},redirect_count:o=0,nav_token:l={},accept:c=ze,block:f=ze,event:p}){const w=q;q=l;const h=await he(t,!1),u=e==="enter"?Ne(m,h,t,e):ht({url:t,type:e,delta:n?.delta,intent:h,scroll:n?.scroll,event:p});if(!u){f(),q===l&&(q=w);return}const _=v,g=x;c(),Q=!0,le&&u.navigation.type!=="enter"&&$.navigating.set(H.current=u.navigation);let d=h&&await dt(h);if(!d){if(de(t,L,y.hash))return await Z(t,i);d=await pt(t,{id:null},await ee(new Ae(404,"Not Found",`Not found: ${t.pathname}`),{url:t,params:{},route:{id:null}}),404,i)}if(t=h?.url||t,q!==l)return u.reject(new Error("navigation aborted")),!1;if(d.type==="redirect"){if(o<20){await K({type:e,url:new URL(d.location,t),popped:n,keepfocus:r,noscroll:a,replace_state:i,state:s,redirect_count:o+1,nav_token:l}),u.fulfil(void 0);return}d=await qe({status:500,error:await ee(new Error("Redirect loop"),{url:t,params:{},route:{id:null}}),url:t,route:{id:null}})}else d.props.page.status>=400&&await $.updated.check()&&(await at(),await Z(t,i));if(zt(),Oe(_),ct(g),d.props.page.url.pathname!==t.pathname&&(t.pathname=d.props.page.url.pathname),s=n?n.state:s,!n){const k=i?0:1,F={[B]:v+=k,[J]:x+=k,[Ze]:s};(i?history.replaceState:history.pushState).call(history,F,"",t),i||Ft(v,x)}const b=h&&R?.id===h.id?R.fork:null;R?.fork&&!b&&ie(),R=null,d.props.page.state=s;let S;if(le){const k=(await Promise.all(Array.from(Mt,M=>M(u.navigation)))).filter(M=>typeof M=="function");if(k.length>0){let M=function(){k.forEach(ge=>{Y.delete(ge)})};k.push(M),k.forEach(ge=>{Y.add(ge)})}const F=u.navigation.to;m={...d.state,nav:{params:F.params,route:F.route,url:F.url}},d.props.page&&(d.props.page.url=t);const pe=b&&await b;pe?S=pe.commit():(z=null,lt.$set(d.props),z&&Object.assign(d.props.page,z),Bt(d.props.page),S=wt?.()),it=!0}else await ft(d,Ee,!1);const{activeElement:O}=document;await S,await ne(),await ne();let P=null;if(Ge){const k=n?n.scroll:a?N():null;k?scrollTo(k.x,k.y):(P=t.hash&&document.getElementById(gt(t)))?P.scrollIntoView():scrollTo(0,0)}const _t=document.activeElement!==O&&document.activeElement!==document.body;!r&&!_t&&sn(t,!P),Ge=!0,d.props.page&&(z&&Object.assign(d.props.page,z),Object.assign(E,d.props.page)),Q=!1,e==="popstate"&&ut(x),u.fulfil(void 0),u.navigation.to&&(u.navigation.to.scroll=N()),Y.forEach(k=>k(u.navigation)),$.navigating.set(H.current=null)}async function pt(e,t,n,r,a){return e.origin===Te&&e.pathname===location.pathname&&!st?await qe({status:r,error:n,url:e,route:t}):await Z(e,a)}function tn(){let e,t={element:void 0,href:void 0},n;I.addEventListener("mousemove",o=>{const l=o.target;clearTimeout(e),e=setTimeout(()=>{i(l,j.hover)},20)});function r(o){o.defaultPrevented||i(o.composedPath()[0],j.tap)}I.addEventListener("mousedown",r),I.addEventListener("touchstart",r,{passive:!0});const a=new IntersectionObserver(o=>{for(const l of o)l.isIntersecting&&(ye(new URL(l.target.href)),a.unobserve(l.target))},{threshold:0});async function i(o,l){const c=tt(o,I),f=c===t.element&&c?.href===t.href&&l>=n;if(!c||f)return;const{url:p,external:w,download:h}=be(c,L,y.hash);if(w||h)return;const u=re(c),_=p&&fe(m.url)===fe(p);if(!(u.reload||_))if(l<=u.preload_data){t={element:c,href:c.href},n=j.tap;const g=await he(p,!1);if(!g)return;Wt(g)}else l<=u.preload_code&&(t={element:c,href:c.href},n=l,ye(p))}function s(){a.disconnect();for(const o of I.querySelectorAll("a")){const{url:l,external:c,download:f}=be(o,L,y.hash);if(c||f)continue;const p=re(o);p.reload||(p.preload_code===j.viewport&&a.observe(o),p.preload_code===j.eager&&ye(l))}}Y.add(s),s()}function ee(e,t){if(e instanceof xe)return e.body;const n=Ie(e),r=Dt(e);return y.hooks.handleError({error:e,event:t,status:n,message:r})??{message:r}}function nn(e){if(typeof e=="function")oe.push(e);else{const{href:t}=new URL(e,location.href);oe.push(n=>n.href===t)}}function rn(){history.scrollRestoration="manual",addEventListener("beforeunload",t=>{let n=!1;if(Ye(),!Q){const r=Ne(m,void 0,null,"leave"),a={...r.navigation,cancel:()=>{n=!0,r.reject(new Error("navigation cancelled"))}};ot.forEach(i=>i(a))}n?(t.preventDefault(),t.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&Ye()}),navigator.connection?.saveData||tn(),I.addEventListener("click",async t=>{if(t.button||t.which!==1||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.defaultPrevented)return;const n=tt(t.composedPath()[0],I);if(!n)return;const{url:r,external:a,target:i,download:s}=be(n,L,y.hash);if(!r)return;if(i==="_parent"||i==="_top"){if(window.parent!==window)return}else if(i&&i!=="_self")return;const o=re(n);if(!(n instanceof SVGAElement)&&r.protocol!==location.protocol&&!(r.protocol==="https:"||r.protocol==="http:")||s)return;const[c,f]=(y.hash?r.hash.replace(/^#/,""):r.href).split("#"),p=c===me(location);if(a||o.reload&&(!p||!f)){ht({url:r,type:"link",event:t})?Q=!0:t.preventDefault();return}if(f!==void 0&&p){const[,w]=m.url.href.split("#");if(w===f){if(t.preventDefault(),f===""||f==="top"&&n.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const h=n.ownerDocument.getElementById(decodeURIComponent(f));h&&(h.scrollIntoView(),h.focus())}return}if(G=!0,Oe(v),e(r),!o.replace_state)return;G=!1}t.preventDefault(),await new Promise(w=>{requestAnimationFrame(()=>{setTimeout(w,0)}),setTimeout(w,100)}),await K({type:"link",url:r,keepfocus:o.keepfocus,noscroll:o.noscroll,replace_state:o.replace_state??r.href===location.href,event:t})}),I.addEventListener("submit",t=>{if(t.defaultPrevented)return;const n=HTMLFormElement.prototype.cloneNode.call(t.target),r=t.submitter;if((r?.formTarget||n.target)==="_blank"||(r?.formMethod||n.method)!=="get")return;const s=new URL(r?.hasAttribute("formaction")&&r?.formAction||n.action);if(de(s,L,!1))return;const o=t.target,l=re(o);if(l.reload)return;t.preventDefault(),t.stopPropagation();const c=new FormData(o,r);s.search=new URLSearchParams(c).toString(),K({type:"form",url:s,keepfocus:l.keepfocus,noscroll:l.noscroll,replace_state:l.replace_state??s.href===location.href,event:t})}),addEventListener("popstate",async t=>{if(!Se){if(t.state?.[B]){const n=t.state[B];if(q={},n===v)return;const r=C[n],a=t.state[Ze]??{},i=new URL(t.state[Ct]??location.href),s=t.state[J],o=m.url?me(location)===me(m.url):!1;if(s===x&&(it||o)){a!==E.state&&(E.state=a),e(i),C[v]=N(),r&&scrollTo(r.x,r.y),v=n;return}const c=n-v;await K({type:"popstate",url:i,popped:{state:a,scroll:r,delta:c},accept:()=>{v=n,x=s},block:()=>{history.go(-c)},nav_token:q,event:t})}else if(!G){const n=new URL(location.href);e(n),y.hash&&location.reload()}}}),addEventListener("hashchange",()=>{G&&(G=!1,history.replaceState({...history.state,[B]:++v,[J]:x},"",location.href))});for(const t of document.querySelectorAll("link"))Kt.has(t.rel)&&(t.href=t.href);addEventListener("pageshow",t=>{t.persisted&&$.navigating.set(H.current=null)});function e(t){m.url=E.url=t,$.page.set(De(E)),$.page.notify()}}async function an(e,{status:t=200,error:n,node_ids:r,params:a,route:i,server_route:s,data:o,form:l}){st=!0;const c=new URL(location.href);let f;({params:a={},route:i={id:null}}=await he(c,!1)||{}),f=Pe.find(({id:h})=>h===i.id);let p,w=!0;try{const h=r.map(async(_,g)=>{const d=o[g];return d?.uses&&(d.uses=on(d.uses)),Ce({loader:y.nodes[_],url:c,params:a,route:i,parent:async()=>{const b={};for(let S=0;S{const o=history.state;Se=!0,location.replace(new URL(`#${r}`,location.href)),history.replaceState(o,"",e),t&&scrollTo(i,s),Se=!1})}else{const i=document.body,s=i.getAttribute("tabindex");i.tabIndex=-1,i.focus({preventScroll:!0,focusVisible:!1}),s!==null?i.setAttribute("tabindex",s):i.removeAttribute("tabindex")}const a=getSelection();if(a&&a.type!=="None"){const i=[];for(let s=0;s{if(a.rangeCount===i.length){for(let s=0;s{i=c,s=f});return o.catch(()=>{}),{navigation:{from:{params:e.params,route:{id:e.route?.id??null},url:e.url,scroll:N()},to:n&&{params:t?.params??null,route:{id:t?.route?.id??null},url:n,scroll:a},willUnload:!t,type:r,complete:o},fulfil:i,reject:s}}function De(e){return{data:e.data,error:e.error,form:e.form,params:e.params,route:e.route,state:e.state,status:e.status,url:e.url}}function ln(e){const t=new URL(e);return t.hash=decodeURIComponent(e.hash),t}function gt(e){let t;if(y.hash){const[,,n]=e.hash.split("#",3);t=n??""}else t=e.hash.slice(1);return decodeURIComponent(t)}export{gn as a,fn as l,E as p,$ as s}; diff --git a/backend/static/export-viewer/_app/immutable/chunks/RsTAN2PN.js b/backend/static/export-viewer/_app/immutable/chunks/RsTAN2PN.js new file mode 100644 index 0000000..3064077 --- /dev/null +++ b/backend/static/export-viewer/_app/immutable/chunks/RsTAN2PN.js @@ -0,0 +1 @@ +import{A as v,i as d,B as l,C as u,D as T,T as p,F as h,h as i,e as s,R as E,a as y,G as g,c as w,H as N}from"./CcONa1Mr.js";const A=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:t=>t});function M(t){return A?.createHTML(t)??t}function x(t){var r=v("template");return r.innerHTML=M(t.replaceAll("","")),r.content}function n(t,r){var e=l;e.nodes===null&&(e.nodes={start:t,end:r,a:null,t:null})}function b(t,r){var e=(r&p)!==0,f=(r&h)!==0,a,_=!t.startsWith("");return()=>{if(i)return n(s,null),s;a===void 0&&(a=x(_?t:""+t),e||(a=u(a)));var o=f||T?document.importNode(a,!0):a.cloneNode(!0);if(e){var c=u(o),m=o.lastChild;n(c,m)}else n(o,o);return o}}function C(t=""){if(!i){var r=d(t+"");return n(r,r),r}var e=s;return e.nodeType!==g?(e.before(e=d()),w(e)):N(e),n(e,e),e}function O(){if(i)return n(s,null),s;var t=document.createDocumentFragment(),r=document.createComment(""),e=d();return t.append(r,e),n(r,e),t}function P(t,r){if(i){var e=l;((e.f&E)===0||e.nodes.end===null)&&(e.nodes.end=s),y();return}t!==null&&t.before(r)}const L="5";typeof window<"u"&&((window.__svelte??={}).v??=new Set).add(L);export{P as a,n as b,O as c,b as f,C as t}; diff --git a/backend/static/export-viewer/_app/immutable/entry/app.jfkZT8Zg.js b/backend/static/export-viewer/_app/immutable/entry/app.jfkZT8Zg.js new file mode 100644 index 0000000..3ec5546 --- /dev/null +++ b/backend/static/export-viewer/_app/immutable/entry/app.jfkZT8Zg.js @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.CTJa-e61.js","../chunks/RsTAN2PN.js","../chunks/CcONa1Mr.js","../chunks/BRDva_z9.js","../assets/0.DHiZegc-.css","../nodes/1.GLhNnP-h.js","../chunks/Bb9JxzU7.js","../chunks/Dy1jDy4J.js","../chunks/BJ__EZ0W.js","../nodes/2.CkuIG73r.js","../chunks/Bxn6SmGf.js"])))=>i.map(i=>d[i]); +import{h as B,a as Q,b as Z,E as X,r as $,s as ee,c as te,d as M,a9 as re,e as ae,n as ne,aJ as se,K as ie,o as U,B as q,aK as oe,aL as V,aM as ce,aN as ue,aO as fe,J as g,aE as le,aF as w,aP as de,ar as _e,aQ as me,aR as he,aS as ve,ak as ge,aT as ye,aU as F,aV as Ee,a6 as be,ap as Pe,q as Se,aW as Re,u as we,aC as Oe,t as O,z as Te,w as Ae,aD as A,x as xe,y as Ie,v as Le,aH as x}from"../chunks/CcONa1Mr.js";import{h as De,m as ke,u as Ne,s as Ce}from"../chunks/Bb9JxzU7.js";import{a as S,c as I,f as z,t as je}from"../chunks/RsTAN2PN.js";import{o as Be}from"../chunks/BJ__EZ0W.js";import{i as L}from"../chunks/Bxn6SmGf.js";import{B as Me}from"../chunks/BRDva_z9.js";let T=!1;function Ye(r){var e=T;try{return T=!1,[r(),T]}finally{T=e}}function D(r,e,s){var o;B&&(o=ae,Q());var i=new Me(r);Z(()=>{var a=e()??null;if(B){var t=$(o),n=t===re,f=a!==null;if(n!==f){var _=ee();te(_),i.anchor=_,M(!1),i.ensure(a,a&&(c=>s(c,a))),M(!0);return}}i.ensure(a,a&&(c=>s(c,a)))},X)}function Y(r,e){return r===e||r?.[V]===e}function k(r={},e,s,o){var i=ne.r,a=q;return se(()=>{var t,n;return ie(()=>{t=n,n=[],U(()=>{r!==s(...n)&&(e(r,...n),t&&Y(s(...t),r)&&e(null,...t))})}),()=>{let f=a;for(;f!==i&&f.parent!==null&&f.parent.f&oe;)f=f.parent;const _=()=>{n&&Y(s(...n),r)&&e(null,...n)},c=f.teardown;f.teardown=()=>{_(),c?.()}}}),r}function N(r,e,s,o){var i=(s&me)!==0,a=(s&ye)!==0,t=o,n=!0,f=()=>(n&&(n=!1,t=a?U(o):o),t);let _;if(i){var c=V in r||F in r;_=ce(r,e)?.set??(c&&e in r?l=>r[e]=l:void 0)}var m,y=!1;i?[m,y]=Ye(()=>r[e]):m=r[e],m===void 0&&o!==void 0&&(m=f(),_&&(ue(),_(m)));var d;if(d=()=>{var l=r[e];return l===void 0?f():(n=!0,l)},(s&fe)===0)return d;if(_){var E=r.$$legacy;return(function(l,v){return arguments.length>0?((!v||E||y)&&_(v?d():l),l):d()})}var u=!1,h=((s&he)!==0?ve:ge)(()=>(u=!1,d()));i&&g(h);var b=q;return(function(l,v){if(arguments.length>0){const P=v?g(h):i?le(l):l;return w(h,P),u=!0,t!==void 0&&(t=P),l}return de&&u||(b.f&_e)!==0?h.v:g(h)})}function pe(r){return class extends Ue{constructor(e){super({component:r,...e})}}}class Ue{#t;#e;constructor(e){var s=new Map,o=(a,t)=>{var n=Pe(t,!1,!1);return s.set(a,n),n};const i=new Proxy({...e.props||{},$$events:{}},{get(a,t){return g(s.get(t)??o(t,Reflect.get(a,t)))},has(a,t){return t===F?!0:(g(s.get(t)??o(t,Reflect.get(a,t))),Reflect.has(a,t))},set(a,t,n){return w(s.get(t)??o(t,n),n),Reflect.set(a,t,n)}});this.#e=(e.hydrate?De:ke)(e.component,{target:e.target,anchor:e.anchor,props:i,context:e.context,intro:e.intro??!1,recover:e.recover,transformError:e.transformError}),(!e?.props?.$$host||e.sync===!1)&&Ee(),this.#t=i.$$events;for(const a of Object.keys(this.#e))a==="$set"||a==="$destroy"||a==="$on"||be(this,a,{get(){return this.#e[a]},set(t){this.#e[a]=t},enumerable:!0});this.#e.$set=a=>{Object.assign(i,a)},this.#e.$destroy=()=>{Ne(this.#e)}}$set(e){this.#e.$set(e)}$on(e,s){this.#t[e]=this.#t[e]||[];const o=(...i)=>s.call(this,...i);return this.#t[e].push(o),()=>{this.#t[e]=this.#t[e].filter(i=>i!==o)}}$destroy(){this.#e.$destroy()}}const qe="modulepreload",Ve=function(r,e){return new URL(r,e).href},p={},C=function(e,s,o){let i=Promise.resolve();if(s&&s.length>0){let _=function(c){return Promise.all(c.map(m=>Promise.resolve(m).then(y=>({status:"fulfilled",value:y}),y=>({status:"rejected",reason:y}))))};const t=document.getElementsByTagName("link"),n=document.querySelector("meta[property=csp-nonce]"),f=n?.nonce||n?.getAttribute("nonce");i=_(s.map(c=>{if(c=Ve(c,o),c in p)return;p[c]=!0;const m=c.endsWith(".css"),y=m?'[rel="stylesheet"]':"";if(o)for(let E=t.length-1;E>=0;E--){const u=t[E];if(u.href===c&&(!m||u.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${c}"]${y}`))return;const d=document.createElement("link");if(d.rel=m?"stylesheet":qe,m||(d.as="script"),d.crossOrigin="",d.href=c,f&&d.setAttribute("nonce",f),document.head.appendChild(d),m)return new Promise((E,u)=>{d.addEventListener("load",E),d.addEventListener("error",()=>u(new Error(`Unable to preload CSS for ${c}`)))})}))}function a(t){const n=new Event("vite:preloadError",{cancelable:!0});if(n.payload=t,window.dispatchEvent(n),!n.defaultPrevented)throw t}return i.then(t=>{for(const n of t||[])n.status==="rejected"&&a(n.reason);return e().catch(a)})},et={};var Fe=z('
'),ze=z(" ",1);function Ge(r,e){Se(e,!0);let s=N(e,"components",23,()=>[]),o=N(e,"data_0",3,null),i=N(e,"data_1",3,null);Re(()=>e.stores.page.set(e.page)),we(()=>{e.stores,e.page,e.constructors,s(),e.form,o(),i(),e.stores.page.notify()});let a=A(!1),t=A(!1),n=A(null);Be(()=>{const u=e.stores.page.subscribe(()=>{g(a)&&(w(t,!0),Oe().then(()=>{w(n,document.title||"untitled page",!0)}))});return w(a,!0),u});const f=x(()=>e.constructors[1]);var _=ze(),c=O(_);{var m=u=>{const h=x(()=>e.constructors[0]);var b=I(),l=O(b);D(l,()=>g(h),(v,P)=>{k(P(v,{get data(){return o()},get form(){return e.form},get params(){return e.page.params},children:(R,Je)=>{var j=I(),H=O(j);D(H,()=>g(f),(J,K)=>{k(K(J,{get data(){return i()},get form(){return e.form},get params(){return e.page.params}}),W=>s()[1]=W,()=>s()?.[1])}),S(R,j)},$$slots:{default:!0}}),R=>s()[0]=R,()=>s()?.[0])}),S(u,b)},y=u=>{const h=x(()=>e.constructors[0]);var b=I(),l=O(b);D(l,()=>g(h),(v,P)=>{k(P(v,{get data(){return o()},get form(){return e.form},get params(){return e.page.params}}),R=>s()[0]=R,()=>s()?.[0])}),S(u,b)};L(c,u=>{e.constructors[1]?u(m):u(y,-1)})}var d=Te(c,2);{var E=u=>{var h=Fe(),b=xe(h);{var l=v=>{var P=je();Le(()=>Ce(P,g(n))),S(v,P)};L(b,v=>{g(t)&&v(l)})}Ie(h),S(u,h)};L(d,u=>{g(a)&&u(E)})}S(r,_),Ae()}const tt=pe(Ge),rt=[()=>C(()=>import("../nodes/0.CTJa-e61.js"),__vite__mapDeps([0,1,2,3,4]),import.meta.url),()=>C(()=>import("../nodes/1.GLhNnP-h.js"),__vite__mapDeps([5,1,2,6,7,8]),import.meta.url),()=>C(()=>import("../nodes/2.CkuIG73r.js"),__vite__mapDeps([9,1,2,8,6,10,3]),import.meta.url)],at=[],nt={"/":[2]},G={handleError:(({error:r})=>{console.error(r)}),reroute:(()=>{}),transport:{}},He=Object.fromEntries(Object.entries(G.transport).map(([r,e])=>[r,e.decode])),st=Object.fromEntries(Object.entries(G.transport).map(([r,e])=>[r,e.encode])),it=!1,ot=(r,e)=>He[r](e);export{ot as decode,He as decoders,nt as dictionary,st as encoders,it as hash,G as hooks,et as matchers,rt as nodes,tt as root,at as server_loads}; diff --git a/backend/static/export-viewer/_app/immutable/entry/start.ctwmcI8C.js b/backend/static/export-viewer/_app/immutable/entry/start.ctwmcI8C.js new file mode 100644 index 0000000..4ed4906 --- /dev/null +++ b/backend/static/export-viewer/_app/immutable/entry/start.ctwmcI8C.js @@ -0,0 +1 @@ +import{l as o,a as r}from"../chunks/Dy1jDy4J.js";export{o as load_css,r as start}; diff --git a/backend/static/export-viewer/_app/immutable/nodes/0.CTJa-e61.js b/backend/static/export-viewer/_app/immutable/nodes/0.CTJa-e61.js new file mode 100644 index 0000000..2ae6f35 --- /dev/null +++ b/backend/static/export-viewer/_app/immutable/nodes/0.CTJa-e61.js @@ -0,0 +1 @@ +import{c as s,a as c}from"../chunks/RsTAN2PN.js";import{b as l,E as p,t as i}from"../chunks/CcONa1Mr.js";import{B as m}from"../chunks/BRDva_z9.js";function u(n,r,...e){var o=new m(n);l(()=>{const t=r()??null;o.ensure(t,t&&(a=>t(a,...e)))},p)}const f=!0,_=!1,g=Object.freeze(Object.defineProperty({__proto__:null,prerender:f,ssr:_},Symbol.toStringTag,{value:"Module"}));function h(n,r){var e=s(),o=i(e);u(o,()=>r.children),c(n,e)}export{h as component,g as universal}; diff --git a/backend/static/export-viewer/_app/immutable/nodes/1.GLhNnP-h.js b/backend/static/export-viewer/_app/immutable/nodes/1.GLhNnP-h.js new file mode 100644 index 0000000..1a8073b --- /dev/null +++ b/backend/static/export-viewer/_app/immutable/nodes/1.GLhNnP-h.js @@ -0,0 +1 @@ +import{a as i,f as h}from"../chunks/RsTAN2PN.js";import{q as g,t as v,v as d,w as l,x as s,y as a,z as x}from"../chunks/CcONa1Mr.js";import{s as o}from"../chunks/Bb9JxzU7.js";import{s as _,p}from"../chunks/Dy1jDy4J.js";const $={get error(){return p.error},get status(){return p.status}};_.updated.check;const m=$;var k=h("

",1);function z(c,f){g(f,!0);var t=k(),r=v(t),n=s(r,!0);a(r);var e=x(r,2),u=s(e,!0);a(e),d(()=>{o(n,m.status),o(u,m.error?.message)}),i(c,t),l()}export{z as component}; diff --git a/backend/static/export-viewer/_app/immutable/nodes/2.CkuIG73r.js b/backend/static/export-viewer/_app/immutable/nodes/2.CkuIG73r.js new file mode 100644 index 0000000..f0b5454 --- /dev/null +++ b/backend/static/export-viewer/_app/immutable/nodes/2.CkuIG73r.js @@ -0,0 +1,2 @@ +import{c as Vt,a as h,f as m}from"../chunks/RsTAN2PN.js";import{o as qt}from"../chunks/BJ__EZ0W.js";import{h as ie,c as Ze,C as Pt,i as Ke,a as Ut,b as Zt,J as t,r as Kt,P as Xt,s as ct,d as Xe,e as Re,a8 as Gt,ag as Yt,_ as ut,k as Se,j as et,ai as Wt,l as Jt,aj as ht,ak as Qt,al as $t,af as rt,am as er,L as ft,an as tr,ao as rr,ap as ar,aq as pe,ar as sr,f as _t,p as xt,as as Ge,M as mt,at as lr,au as or,ad as nr,m as ir,g as vr,aa as dr,av as cr,aw as ur,ax as fr,ay as gr,az as pr,aA as hr,aB as _r,aC as xr,o as mr,K as br,q as wr,aD as ge,aE as yr,t as Ne,w as kr,aF as B,aG as Mr,aH as be,x as l,y as r,v as O,z as c,$ as Ye,aI as Cr}from"../chunks/CcONa1Mr.js";import{d as Er,e as We,s as T,a as U}from"../chunks/Bb9JxzU7.js";import{i as I}from"../chunks/Bxn6SmGf.js";function Je(e,s){return s}function Ar(e,s,o){for(var _=[],g=s.length,i,d=s.length,w=0;w{if(i){if(i.pending.delete(J),i.done.add(J),i.pending.size===0){var A=e.outrogroups;tt(e,rt(i.done)),A.delete(i),A.size===0&&(e.outrogroups=null)}}else d-=1},!1)}if(d===0){var v=_.length===0&&o!==null;if(v){var p=o,b=p.parentNode;nr(b),b.append(p),e.items.clear()}tt(e,s,!v)}else i={pending:new Set(s),done:new Set},(e.outrogroups??=new Set).add(i)}function tt(e,s,o=!0){var _;if(e.pending.size>0){_=new Set;for(const d of e.pending.values())for(const w of d)_.add(e.items.get(w).e)}for(var g=0;g{var M=o();return $t(M)?M:M==null?[]:rt(M)}),A,R=new Map,V=!0;function ve(M){(de.effect.f&sr)===0&&(de.pending.delete(M),de.fallback=b,Lr(de,A,d,s,_),b!==null&&(A.length===0?(b.f&pe)===0?_t(b):(b.f^=pe,Ie(b,null,d)):xt(b,()=>{b=null})))}function n(M){de.pending.delete(M)}var j=Zt(()=>{A=t(J);var M=A.length;let X=!1;if(ie){var ye=Kt(d)===Xt;ye!==(M===0)&&(d=ct(),Ze(d),Xe(!1),X=!0)}for(var ce=new Set,Z=Se,xe=Jt(),oe=0;oei(d)):(b=et(()=>i(gt??=Ke())),b.f|=pe)),M>ce.size&&Wt(),ie&&M>0&&Ze(ct()),!V)if(R.set(Z,ce),xe){for(const[De,Oe]of w)ce.has(De)||Z.skip_effect(Oe.e);Z.oncommit(ve),Z.ondiscard(n)}else ve(Z);X&&Xe(!0),t(J)}),de={effect:j,items:w,pending:R,outrogroups:null,fallback:b};V=!1,ie&&(d=Re)}function Be(e){for(;e!==null&&(e.f&lr)===0;)e=e.next;return e}function Lr(e,s,o,_,g){var i=(_&or)!==0,d=s.length,w=e.items,v=Be(e.effect.first),p,b=null,J,A=[],R=[],V,ve,n,j;if(i)for(j=0;j0){var oe=(_&ht)!==0&&d===0?o:null;if(i){for(j=0;j{if(J!==void 0)for(n of J)n.nodes?.a?.apply()})}function Sr(e,s,o,_,g,i,d,w){var v=(d&tr)!==0?(d&rr)===0?ar(o,!1,!1):ft(o):null,p=(d&er)!==0?ft(g):null;return{v,i:p,e:et(()=>(i(s,v??o,p??g,w),()=>{e.delete(_)}))}}function Ie(e,s,o){if(e.nodes)for(var _=e.nodes.start,g=e.nodes.end,i=s&&(s.f&pe)===0?s.nodes.start:o;_!==null;){var d=dr(_);if(i.before(_),_===g)return;_=d}}function we(e,s,o){s===null?e.effect.first=o:s.next=o,o===null?e.effect.last=s:o.prev=s}function Tr(e,s,o){var _=e==null?"":""+e;return _===""?null:_}function He(e,s,o,_,g,i){var d=e.__className;if(ie||d!==o||d===void 0){var w=Tr(o);(!ie||w!==e.getAttribute("class"))&&(w==null?e.removeAttribute("class"):e.className=w),e.__className=o}return i}const jr=Symbol("is custom element"),zr=Symbol("is html"),Nr=gr?"link":"LINK";function Br(e){if(ie){var s=!1,o=()=>{if(!s){if(s=!0,e.hasAttribute("value")){var _=e.value;_e(e,"value",null),e.value=_}if(e.hasAttribute("checked")){var g=e.checked;_e(e,"checked",null),e.checked=g}}};e.__on_r=o,mt(o),cr()}}function _e(e,s,o,_){var g=Hr(e);ie&&(g[s]=e.getAttribute(s),s==="src"||s==="srcset"||s==="href"&&e.nodeName===Nr)||g[s]!==(g[s]=o)&&(s==="loading"&&(e[ur]=o),o==null?e.removeAttribute(s):typeof o!="string"&&Ir(e).includes(s)?e[s]=o:e.setAttribute(s,o))}function Hr(e){return e.__attributes??={[jr]:e.nodeName.includes("-"),[zr]:e.namespaceURI===fr}}var pt=new Map;function Ir(e){var s=e.getAttribute("is")||e.nodeName,o=pt.get(s);if(o)return o;pt.set(s,o=[]);for(var _,g=e,i=Element.prototype;i!==g;){_=hr(g);for(var d in _)_[d].set&&o.push(d);g=pr(g)}return o}function Dr(e,s,o=s){var _=new WeakSet;_r(e,"input",async g=>{var i=g?e.defaultValue:e.value;if(i=Qe(e)?$e(i):i,o(i),Se!==null&&_.add(Se),await xr(),i!==(i=s())){var d=e.selectionStart,w=e.selectionEnd,v=e.value.length;if(e.value=i??"",w!==null){var p=e.value.length;d===w&&w===v&&p>v?(e.selectionStart=p,e.selectionEnd=p):(e.selectionStart=d,e.selectionEnd=Math.min(w,p))}}}),(ie&&e.defaultValue!==e.value||mr(s)==null&&e.value)&&(o(Qe(e)?$e(e.value):e.value),Se!==null&&_.add(Se)),br(()=>{var g=s();if(e===document.activeElement){var i=Se;if(_.has(i))return}Qe(e)&&g===$e(e.value)||e.type==="date"&&!g&&!e.value||g!==e.value&&(e.value=g??"")})}function Qe(e){var s=e.type;return s==="number"||s==="range"}function $e(e){return e===""?null:+e}var Or=m('
'),Rr=m('

'),Fr=m(''),Vr=m('
'),qr=m(''),Pr=m(' ',1),Ur=m('# ',1),Zr=m(''),Kr=m('
'),Xr=m(' '),Gr=m(''),Yr=m('
'),Wr=m('
'),Jr=m(''),Qr=m('

Noch keine Fotos.

'),$r=m(''),ea=m('
'),ta=m(''),ra=m('
'),aa=m('

'),sa=m('

'),la=m('
'),oa=m(''),na=m('
'),ia=m(''),va=m('
'),da=m('

'),ca=m('
'),ua=m(' ',1),fa=m('',2),ga=m(''),pa=m('

'),ha=m('

Keine Kommentare.

'),_a=m('
'),xa=m('
'),ma=m(''),ba=m('

',1);function Ea(e,s){wr(s,!0);let o=ge(null),_=ge(!0),g=ge(""),i=ge("list"),d=ge(""),w=ge(!1),v=ge(yr([])),p=ge(null),b=ge(0),J=0,A=ge(null),R=be(()=>t(o)?.posts??[]),V=be(()=>{const a=new Map;for(const u of t(R))for(const x of u.tags){const G=x.toLowerCase();a.set(G,(a.get(G)??0)+1)}return[...a.entries()].sort((u,x)=>x[1]-u[1])}),ve=be(()=>[...new Set(t(R).map(a=>a.uploader))].sort()),n=be(()=>{const a=t(d).trim();if(!a)return t(w)?[...t(ve).slice(0,3).map(x=>({type:"user",value:x})),...t(V).slice(0,3).map(([x])=>({type:"tag",value:x}))]:[];if(a.startsWith("#")){const x=a.slice(1).toLowerCase();return t(V).filter(([G])=>G.startsWith(x)).slice(0,8).map(([G])=>({type:"tag",value:G}))}const u=a.toLowerCase();return[...t(ve).filter(x=>x.toLowerCase().includes(u)).slice(0,4).map(x=>({type:"user",value:x})),...t(V).filter(([x])=>x.includes(u)).slice(0,4).map(([x])=>({type:"tag",value:x}))]}),j=be(()=>t(A)?t(R).filter(a=>a.tags.some(u=>u.toLowerCase()===t(A))):t(R)),de=be(()=>{if(t(v).length===0)return t(R);const a=t(v).filter(x=>x.type==="tag").map(x=>x.value),u=t(v).filter(x=>x.type==="user").map(x=>x.value);return t(R).filter(x=>{const G=x.tags.map(ze=>ze.toLowerCase()),ke=!a.length||a.some(ze=>G.includes(ze)),je=!u.length||u.includes(x.uploader);return ke&&je})}),M=be(()=>t(i)==="list"?t(j):t(de));qt(async()=>{try{const a=await fetch("./data.json");if(!a.ok)throw new Error(`HTTP ${a.status}`);B(o,await a.json(),!0)}catch{B(g,"Daten konnten nicht geladen werden. Stelle sicher, dass data.json im selben Ordner liegt.")}finally{B(_,!1)}});function X(a){return new Date(a).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric",hour:"2-digit",minute:"2-digit"})}function ye(a){return new Date(a).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit"})}function ce(a){return a[0]?.toUpperCase()??"?"}const Z=["bg-blue-100 text-blue-700","bg-purple-100 text-purple-700","bg-green-100 text-green-700","bg-amber-100 text-amber-700","bg-rose-100 text-rose-700","bg-teal-100 text-teal-700"];function xe(a){let u=0;for(const x of a)u=u*31+x.charCodeAt(0)&255;return Z[u%Z.length]}function oe(a){B(i,a,!0),a==="list"&&(B(d,""),B(w,!1))}function re(a){t(v).some(u=>u.type===a.type&&u.value===a.value)||B(v,[...t(v),a],!0),B(d,""),B(w,!1)}function Ce(a){B(v,t(v).filter(u=>!(u.type===a.type&&u.value===a.value)),!0)}function ae(){B(v,[],!0),B(d,"")}function De(a){B(A,a,!0)}function Oe(a){const u=t(M).indexOf(a);B(b,u>=0?u:0,!0),B(p,a,!0)}function Fe(){B(p,null)}function Te(a){const u=t(M).length;u!==0&&(B(b,(t(b)+a+u)%u),B(p,t(M)[t(b)],!0))}function bt(a){t(p)&&(a.key==="Escape"?Fe():a.key==="ArrowLeft"?Te(-1):a.key==="ArrowRight"&&Te(1))}function wt(a){J=a.touches[0].clientX}function yt(a){const u=a.changedTouches[0].clientX-J;Math.abs(u)>50&&Te(u>0?-1:1)}var at=Vt();We("keydown",Mr,bt);var kt=Ne(at);{var Mt=a=>{var u=Or();h(a,u)},Ct=a=>{var u=Rr(),x=l(u),G=l(x),ke=l(G,!0);r(G),r(x),r(u),O(()=>T(ke,t(g))),h(a,u)},Et=a=>{var u=ba(),x=Ne(u),G=l(x),ke=l(G),je=l(ke),ze=l(je,!0);r(je);var st=c(je,2),Ve=l(st),lt=c(Ve,2);r(st),r(ke);var ot=c(ke,2);{var At=z=>{var C=Vr(),F=l(C),y=l(F),k=c(y,2);Le(k,17,()=>t(V),([D,K])=>D,(D,K)=>{var ue=be(()=>Cr(t(K),2));let se=()=>t(ue)[0],ne=()=>t(ue)[1];var Q=Fr(),E=l(Q),N=c(E),q=l(N,!0);r(N),r(Q),O(()=>{He(Q,1,`shrink-0 rounded-full px-3 py-1 text-sm font-medium transition ${t(A)===se()?"bg-blue-600 text-white":"bg-gray-200 text-gray-700 hover:bg-gray-300"}`),T(E,`#${se()??""} `),T(q,ne())}),U("click",Q,()=>De(se())),h(D,Q)}),r(F),r(C),O(()=>He(y,1,`shrink-0 rounded-full px-3 py-1 text-sm font-medium transition ${t(A)===null?"bg-blue-600 text-white":"bg-gray-200 text-gray-700 hover:bg-gray-300"}`)),U("click",y,()=>De(null)),h(z,C)};I(ot,z=>{t(i)==="list"&&t(V).length>0&&z(At)})}var Lt=c(ot,2);{var St=z=>{var C=Wr(),F=l(C),y=l(F),k=c(l(y),2);Br(k);var D=c(k,2);{var K=E=>{var N=qr();U("click",N,()=>{B(d,"")}),h(E,N)};I(D,E=>{t(d)&&E(K)})}r(y);var ue=c(y,2);{var se=E=>{var N=Kr();Le(N,21,()=>t(n),Je,(q,Y)=>{var $=Zr(),ee=l($);{var W=L=>{var H=Pr(),le=c(Ne(H),2),fe=l(le,!0);r(le),O(()=>T(fe,t(Y).value)),h(L,H)},te=L=>{var H=Ur(),le=c(Ne(H),2),fe=l(le,!0);r(le),O(()=>T(fe,t(Y).value)),h(L,H)};I(ee,L=>{t(Y).type==="user"?L(W):L(te,-1)})}r($),U("mousedown",$,()=>re(t(Y))),h(q,$)}),r(N),h(E,N)};I(ue,E=>{t(w)&&t(n).length>0&&E(se)})}r(F);var ne=c(F,2);{var Q=E=>{var N=Yr(),q=l(N);Le(q,17,()=>t(v),Je,(ee,W)=>{var te=Xr(),L=l(te),H=c(L);r(te),O(()=>T(L,`${t(W).type==="tag"?"#":""}${t(W).value??""} `)),U("click",H,()=>Ce(t(W))),h(ee,te)});var Y=c(q,2);{var $=ee=>{var W=Gr();U("click",W,ae),h(ee,W)};I(Y,ee=>{t(v).length>=2&&ee($)})}r(N),h(E,N)};I(ne,E=>{t(v).length>0&&E(Q)})}r(C),We("focus",k,()=>B(w,!0)),We("blur",k,()=>setTimeout(()=>B(w,!1),150)),Dr(k,()=>t(d),E=>B(d,E)),h(z,C)};I(Lt,z=>{t(i)==="grid"&&z(St)})}r(G);var nt=c(G,2);{var Tt=z=>{var C=Qr(),F=c(l(C),2);{var y=k=>{var D=Jr();U("click",D,ae),h(k,D)};I(F,k=>{t(v).length>0&&k(y)})}r(C),h(z,C)},jt=z=>{var C=la();Le(C,21,()=>t(M),F=>F.id,(F,y)=>{var k=sa(),D=l(k),K=l(D),ue=l(K,!0);r(K);var se=c(K,2),ne=l(se),Q=l(ne,!0);r(ne);var E=c(ne,2),N=l(E,!0);r(E),r(se),r(D);var q=c(D,2),Y=l(q);{var $=P=>{var f=ea(),S=l(f);{var me=he=>{var Ae=$r();O(()=>_e(Ae,"src",t(y).media.thumb)),h(he,Ae)};I(S,he=>{t(y).media.thumb&&he(me)})}Ye(2),r(f),h(P,f)},ee=P=>{var f=ta();O(()=>_e(f,"src",t(y).media.full)),h(P,f)},W=P=>{var f=ra();h(P,f)};I(Y,P=>{t(y).media.type==="video"?P($):t(y).media.full?P(ee,1):P(W,-1)})}r(q);var te=c(q,2),L=l(te),H=c(l(L));r(L);var le=c(L,2),fe=c(l(le));r(le),r(te);var Me=c(te,2);{var Ee=P=>{var f=aa(),S=l(f,!0);r(f),O(()=>T(S,t(y).caption)),h(P,f)};I(Me,P=>{t(y).caption&&P(Ee)})}Ye(2),r(k),O((P,f,S)=>{He(K,1,`flex h-9 w-9 shrink-0 items-center justify-center rounded-full text-sm font-bold + ${P??""}`),T(ue,f),T(Q,t(y).uploader),T(N,S),T(H,` ${t(y).likes??""}`),T(fe,` ${t(y).comments.length??""}`)},[()=>xe(t(y).uploader),()=>ce(t(y).uploader),()=>X(t(y).timestamp)]),U("click",q,()=>Oe(t(y))),h(F,k)}),r(C),h(z,C)},zt=z=>{var C=ca(),F=l(C);Le(F,21,()=>t(M),y=>y.id,(y,k)=>{var D=da(),K=l(D),ue=l(K);{var se=L=>{var H=na(),le=l(H);{var fe=Me=>{var Ee=oa();O(()=>_e(Ee,"src",t(k).media.thumb)),h(Me,Ee)};I(le,Me=>{t(k).media.thumb&&Me(fe)})}Ye(2),r(H),h(L,H)},ne=L=>{var H=ia();O(()=>_e(H,"src",t(k).media.thumb)),h(L,H)},Q=L=>{var H=va();h(L,H)};I(ue,L=>{t(k).media.type==="video"?L(se):t(k).media.thumb?L(ne,1):L(Q,-1)})}r(K);var E=c(K,2),N=l(E),q=l(N,!0);r(N);var Y=c(N,2),$=l(Y),ee=c(l($));r($);var W=c($,2),te=c(l(W));r(W),r(Y),r(E),r(D),O(()=>{T(q,t(k).uploader),T(ee,` ${t(k).likes??""}`),T(te,` ${t(k).comments.length??""}`)}),U("click",K,()=>Oe(t(k))),h(y,D)}),r(F),r(C),h(z,C)};I(nt,z=>{t(M).length===0?z(Tt):t(i)==="list"?z(jt,1):z(zt,-1)})}var it=c(nt,2),qe=l(it),Nt=l(qe);r(qe);var vt=c(qe,2),Bt=l(vt);r(vt),r(it),r(x);var Ht=c(x,2);{var It=z=>{var C=ma(),F=l(C),y=l(F),k=l(y),D=c(k,2);{var K=f=>{var S=ua(),me=Ne(S),he=c(me,2);U("click",me,()=>Te(-1)),U("click",he,()=>Te(1)),h(f,S)};I(D,f=>{t(M).length>1&&f(K)})}var ue=c(D,2);{var se=f=>{var S=fa();O(()=>{_e(S,"src",t(p).media.full),_e(S,"poster",t(p).media.thumb||void 0)}),h(f,S)},ne=f=>{var S=ga();O(()=>_e(S,"src",t(p).media.full)),h(f,S)};I(ue,f=>{t(p).media.type==="video"?f(se):f(ne,-1)})}r(y);var Q=c(y,2),E=l(Q),N=l(E),q=l(N),Y=l(q),$=l(Y,!0);r(Y);var ee=c(Y,2),W=l(ee,!0);r(ee),r(q);var te=c(q,2),L=c(l(te));r(te),r(N);var H=c(N,2);{var le=f=>{var S=pa(),me=l(S,!0);r(S),O(()=>T(me,t(p).caption)),h(f,S)};I(H,f=>{t(p).caption&&f(le)})}r(E);var fe=c(E,2),Me=l(fe);{var Ee=f=>{var S=ha();h(f,S)},P=f=>{var S=xa();Le(S,21,()=>t(p).comments,Je,(me,he)=>{var Ae=_a(),Pe=l(Ae),Dt=l(Pe,!0);r(Pe);var Ue=c(Pe,2),Ot=l(Ue,!0);r(Ue);var dt=c(Ue,2),Rt=l(dt,!0);r(dt),r(Ae),O(Ft=>{T(Dt,t(he).author),T(Ot,t(he).text),T(Rt,Ft)},[()=>ye(t(he).timestamp)]),h(me,Ae)}),r(S),h(f,S)};I(Me,f=>{t(p).comments.length===0?f(Ee):f(P,-1)})}r(fe),r(Q),r(F),r(C),O(f=>{T($,t(p).uploader),T(W,f),T(L,` ${t(p).likes??""}`)},[()=>ye(t(p).timestamp)]),U("click",C,f=>{f.target===f.currentTarget&&Fe()}),U("touchstart",C,wt),U("touchend",C,yt),U("click",k,Fe),h(z,C)};I(Ht,z=>{t(p)&&z(It)})}O(z=>{T(ze,t(o).event.name),He(Ve,1,`rounded-md p-1.5 transition-colors ${t(i)==="list"?"bg-white text-gray-900 shadow-sm":"text-gray-400 hover:text-gray-600"}`),He(lt,1,`rounded-md p-1.5 transition-colors ${t(i)==="grid"?"bg-white text-gray-900 shadow-sm":"text-gray-400 hover:text-gray-600"}`),T(Nt,`${t(o).event.name??""} · Offline-Galerie · EventSnap`),T(Bt,`Exportiert am ${z??""}`)},[()=>X(t(o).event.exported_at)]),U("click",Ve,()=>oe("list")),U("click",lt,()=>oe("grid")),h(a,u)};I(kt,a=>{t(_)?a(Mt):t(g)?a(Ct,1):t(o)&&a(Et,2)})}h(e,at),kr()}Er(["click","mousedown","touchstart","touchend"]);export{Ea as component}; diff --git a/backend/static/export-viewer/_app/version.json b/backend/static/export-viewer/_app/version.json new file mode 100644 index 0000000..4b1a4b4 --- /dev/null +++ b/backend/static/export-viewer/_app/version.json @@ -0,0 +1 @@ +{"version":"1775501323159"} \ No newline at end of file diff --git a/backend/static/export-viewer/index.html b/backend/static/export-viewer/index.html new file mode 100644 index 0000000..0045cf5 --- /dev/null +++ b/backend/static/export-viewer/index.html @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + +
+ +
+ + diff --git a/frontend/export-viewer/package-lock.json b/frontend/export-viewer/package-lock.json new file mode 100644 index 0000000..7c09692 --- /dev/null +++ b/frontend/export-viewer/package-lock.json @@ -0,0 +1,2153 @@ +{ + "name": "export-viewer", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "export-viewer", + "version": "0.0.1", + "devDependencies": { + "@sveltejs/adapter-static": "^3.0.0", + "@sveltejs/kit": "^2.50.2", + "@sveltejs/vite-plugin-svelte": "^6.2.4", + "@tailwindcss/vite": "^4.2.2", + "svelte": "^5.54.0", + "tailwindcss": "^4.2.2", + "typescript": "^5.9.3", + "vite": "^7.3.1" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz", + "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz", + "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz", + "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz", + "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz", + "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz", + "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz", + "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz", + "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz", + "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz", + "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz", + "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz", + "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz", + "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz", + "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz", + "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz", + "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz", + "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz", + "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz", + "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz", + "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz", + "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz", + "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz", + "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz", + "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz", + "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.9.tgz", + "integrity": "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8.9.0" + } + }, + "node_modules/@sveltejs/adapter-static": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.10.tgz", + "integrity": "sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@sveltejs/kit": "^2.0.0" + } + }, + "node_modules/@sveltejs/kit": { + "version": "2.56.1", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.56.1.tgz", + "integrity": "sha512-9hDOl3yUh8UXWt+mN29dbcdrW0vNwPvMqi01y2Mw+ceErNIISh8MeEY7fXT2Dx1CjC/kfsVqrbxw7DifYr4hsg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/cookie": "^0.6.0", + "acorn": "^8.14.1", + "cookie": "^0.6.0", + "devalue": "^5.6.4", + "esm-env": "^1.2.2", + "kleur": "^4.1.5", + "magic-string": "^0.30.5", + "mrmime": "^2.0.0", + "set-cookie-parser": "^3.0.0", + "sirv": "^3.0.0" + }, + "bin": { + "svelte-kit": "svelte-kit.js" + }, + "engines": { + "node": ">=18.13" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0", + "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0", + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": "^5.3.3 || ^6.0.0", + "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.2.4.tgz", + "integrity": "sha512-ou/d51QSdTyN26D7h6dSpusAKaZkAiGM55/AKYi+9AGZw7q85hElbjK3kEyzXHhLSnRISHOYzVge6x0jRZ7DXA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", + "deepmerge": "^4.3.1", + "magic-string": "^0.30.21", + "obug": "^2.1.0", + "vitefu": "^1.1.1" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite": "^6.3.0 || ^7.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-5.0.2.tgz", + "integrity": "sha512-TZzRTcEtZffICSAoZGkPSl6Etsj2torOVrx6Uw0KpXxrec9Gg6jFWQ60Q3+LmNGfZSxHRCZL7vXVZIWmuV50Ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "obug": "^2.1.0" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0", + "svelte": "^5.0.0", + "vite": "^6.3.0 || ^7.0.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.2.tgz", + "integrity": "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.2" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.2.tgz", + "integrity": "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-x64": "4.2.2", + "@tailwindcss/oxide-freebsd-x64": "4.2.2", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.2", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-x64-musl": "4.2.2", + "@tailwindcss/oxide-wasm32-wasi": "4.2.2", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.2", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.2" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.2.tgz", + "integrity": "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.2.tgz", + "integrity": "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.2.tgz", + "integrity": "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.2.tgz", + "integrity": "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.2.tgz", + "integrity": "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.2.tgz", + "integrity": "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.2.tgz", + "integrity": "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.2.tgz", + "integrity": "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.2.tgz", + "integrity": "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.2.tgz", + "integrity": "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.2.tgz", + "integrity": "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz", + "integrity": "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.2.tgz", + "integrity": "sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.2.2", + "@tailwindcss/oxide": "4.2.2", + "tailwindcss": "4.2.2" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/types": { + "version": "8.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.0.tgz", + "integrity": "sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aria-query": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.1.tgz", + "integrity": "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devalue": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.4.tgz", + "integrity": "sha512-Gp6rDldRsFh/7XuouDbxMH3Mx8GMCcgzIb1pDTvNyn8pZGQ22u+Wa+lGV9dQCltFQ7uVw0MhRyb8XDskNFOReA==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/esbuild": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.7", + "@esbuild/android-arm": "0.27.7", + "@esbuild/android-arm64": "0.27.7", + "@esbuild/android-x64": "0.27.7", + "@esbuild/darwin-arm64": "0.27.7", + "@esbuild/darwin-x64": "0.27.7", + "@esbuild/freebsd-arm64": "0.27.7", + "@esbuild/freebsd-x64": "0.27.7", + "@esbuild/linux-arm": "0.27.7", + "@esbuild/linux-arm64": "0.27.7", + "@esbuild/linux-ia32": "0.27.7", + "@esbuild/linux-loong64": "0.27.7", + "@esbuild/linux-mips64el": "0.27.7", + "@esbuild/linux-ppc64": "0.27.7", + "@esbuild/linux-riscv64": "0.27.7", + "@esbuild/linux-s390x": "0.27.7", + "@esbuild/linux-x64": "0.27.7", + "@esbuild/netbsd-arm64": "0.27.7", + "@esbuild/netbsd-x64": "0.27.7", + "@esbuild/openbsd-arm64": "0.27.7", + "@esbuild/openbsd-x64": "0.27.7", + "@esbuild/openharmony-arm64": "0.27.7", + "@esbuild/sunos-x64": "0.27.7", + "@esbuild/win32-arm64": "0.27.7", + "@esbuild/win32-ia32": "0.27.7", + "@esbuild/win32-x64": "0.27.7" + } + }, + "node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/esrap": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.4.tgz", + "integrity": "sha512-suICpxAmZ9A8bzJjEl/+rLJiDKC0X4gYWUxT6URAWBLvlXmtbZd5ySMu/N2ZGEtMCAmflUDPSehrP9BQcsGcSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15", + "@typescript-eslint/types": "^8.2.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.6" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "dev": true, + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz", + "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.1", + "@rollup/rollup-android-arm64": "4.60.1", + "@rollup/rollup-darwin-arm64": "4.60.1", + "@rollup/rollup-darwin-x64": "4.60.1", + "@rollup/rollup-freebsd-arm64": "4.60.1", + "@rollup/rollup-freebsd-x64": "4.60.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", + "@rollup/rollup-linux-arm-musleabihf": "4.60.1", + "@rollup/rollup-linux-arm64-gnu": "4.60.1", + "@rollup/rollup-linux-arm64-musl": "4.60.1", + "@rollup/rollup-linux-loong64-gnu": "4.60.1", + "@rollup/rollup-linux-loong64-musl": "4.60.1", + "@rollup/rollup-linux-ppc64-gnu": "4.60.1", + "@rollup/rollup-linux-ppc64-musl": "4.60.1", + "@rollup/rollup-linux-riscv64-gnu": "4.60.1", + "@rollup/rollup-linux-riscv64-musl": "4.60.1", + "@rollup/rollup-linux-s390x-gnu": "4.60.1", + "@rollup/rollup-linux-x64-gnu": "4.60.1", + "@rollup/rollup-linux-x64-musl": "4.60.1", + "@rollup/rollup-openbsd-x64": "4.60.1", + "@rollup/rollup-openharmony-arm64": "4.60.1", + "@rollup/rollup-win32-arm64-msvc": "4.60.1", + "@rollup/rollup-win32-ia32-msvc": "4.60.1", + "@rollup/rollup-win32-x64-gnu": "4.60.1", + "@rollup/rollup-win32-x64-msvc": "4.60.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/set-cookie-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-3.1.0.tgz", + "integrity": "sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svelte": { + "version": "5.55.1", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.55.1.tgz", + "integrity": "sha512-QjvU7EFemf6mRzdMGlAFttMWtAAVXrax61SZYHdkD6yoVGQ89VeyKfZD4H1JrV1WLmJBxWhFch9H6ig/87VGjw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/estree": "^1.0.5", + "@types/trusted-types": "^2.0.7", + "acorn": "^8.12.1", + "aria-query": "5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "devalue": "^5.6.4", + "esm-env": "^1.2.1", + "esrap": "^2.2.4", + "is-reference": "^3.0.3", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tailwindcss": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz", + "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz", + "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/vite": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz", + "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz", + "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==", + "dev": true, + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/zimmerframe": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", + "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/frontend/export-viewer/package.json b/frontend/export-viewer/package.json new file mode 100644 index 0000000..82086ad --- /dev/null +++ b/frontend/export-viewer/package.json @@ -0,0 +1,22 @@ +{ + "name": "export-viewer", + "private": true, + "version": "0.0.1", + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "prepare": "svelte-kit sync || echo ''" + }, + "devDependencies": { + "@sveltejs/adapter-static": "^3.0.0", + "@sveltejs/kit": "^2.50.2", + "@sveltejs/vite-plugin-svelte": "^6.2.4", + "@tailwindcss/vite": "^4.2.2", + "svelte": "^5.54.0", + "tailwindcss": "^4.2.2", + "typescript": "^5.9.3", + "vite": "^7.3.1" + } +} diff --git a/frontend/export-viewer/src/app.css b/frontend/export-viewer/src/app.css new file mode 100644 index 0000000..f1d8c73 --- /dev/null +++ b/frontend/export-viewer/src/app.css @@ -0,0 +1 @@ +@import "tailwindcss"; diff --git a/frontend/export-viewer/src/app.html b/frontend/export-viewer/src/app.html new file mode 100644 index 0000000..6841a6b --- /dev/null +++ b/frontend/export-viewer/src/app.html @@ -0,0 +1,11 @@ + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/frontend/export-viewer/src/lib/types.ts b/frontend/export-viewer/src/lib/types.ts new file mode 100644 index 0000000..e7f4071 --- /dev/null +++ b/frontend/export-viewer/src/lib/types.ts @@ -0,0 +1,28 @@ +export interface ViewerData { + event: { + name: string; + exported_at: string; + }; + posts: ViewerPost[]; +} + +export interface ViewerPost { + id: string; + uploader: string; + caption: string; + tags: string[]; + timestamp: string; + likes: number; + comments: ViewerComment[]; + media: { + type: 'image' | 'video'; + thumb: string; + full: string; + }; +} + +export interface ViewerComment { + author: string; + text: string; + timestamp: string; +} diff --git a/frontend/export-viewer/src/routes/+layout.svelte b/frontend/export-viewer/src/routes/+layout.svelte new file mode 100644 index 0000000..726b46c --- /dev/null +++ b/frontend/export-viewer/src/routes/+layout.svelte @@ -0,0 +1,6 @@ + + +{@render children()} diff --git a/frontend/export-viewer/src/routes/+layout.ts b/frontend/export-viewer/src/routes/+layout.ts new file mode 100644 index 0000000..ceccaaf --- /dev/null +++ b/frontend/export-viewer/src/routes/+layout.ts @@ -0,0 +1,2 @@ +export const prerender = true; +export const ssr = false; diff --git a/frontend/export-viewer/src/routes/+page.svelte b/frontend/export-viewer/src/routes/+page.svelte new file mode 100644 index 0000000..aa891d5 --- /dev/null +++ b/frontend/export-viewer/src/routes/+page.svelte @@ -0,0 +1,613 @@ + + + + +{#if loading} +
+
+
+{:else if error} +
+
+

{error}

+
+
+{:else if data} +
+ +
+
+

{data.event.name}

+ + +
+ + +
+
+ + + {#if viewMode === 'list' && allTags.length > 0} +
+
+ + {#each allTags as [tag, count] (tag)} + + {/each} +
+
+ {/if} + + + {#if viewMode === 'grid'} +
+
+
+ + + + (showAutocomplete = true)} + onblur={() => setTimeout(() => (showAutocomplete = false), 150)} + class="min-w-0 flex-1 bg-transparent text-sm text-gray-900 placeholder-gray-400 outline-none" + /> + {#if searchQuery} + + {/if} +
+ + + {#if showAutocomplete && suggestions.length > 0} +
+ {#each suggestions as item} + + {/each} +
+ {/if} +
+ + + {#if activeFilters.length > 0} +
+ {#each activeFilters as filter} + + {filter.type === 'tag' ? '#' : ''}{filter.value} + + + {/each} + {#if activeFilters.length >= 2} + + {/if} +
+ {/if} +
+ {/if} +
+ + + {#if displayPosts.length === 0} +
+

Noch keine Fotos.

+ {#if activeFilters.length > 0} + + {/if} +
+ {:else if viewMode === 'list'} + +
+ {#each displayPosts as post (post.id)} +
+ +
+
+ {initial(post.uploader)} +
+
+

{post.uploader}

+

{formatDate(post.timestamp)}

+
+
+ + + + + +
+ + + + + {post.likes} + + + + + + {post.comments.length} + +
+ + + {#if post.caption} +

+ {post.caption} +

+ {/if} + +
+
+ {/each} +
+ {:else} + +
+
+ {#each displayPosts as post (post.id)} +
+ + + +
+

{post.uploader}

+
+ + + + + {post.likes} + + + + + + {post.comments.length} + +
+
+
+ {/each} +
+
+ {/if} + + +
+

{data.event.name} · Offline-Galerie · EventSnap

+

Exportiert am {formatDate(data.event.exported_at)}

+
+
+ + + {#if selectedPost} + + {/if} +{/if} diff --git a/frontend/export-viewer/svelte.config.js b/frontend/export-viewer/svelte.config.js new file mode 100644 index 0000000..041c549 --- /dev/null +++ b/frontend/export-viewer/svelte.config.js @@ -0,0 +1,21 @@ +import adapter from '@sveltejs/adapter-static'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + compilerOptions: { + runes: true + }, + kit: { + adapter: adapter({ + pages: '../../backend/static/export-viewer', + assets: '../../backend/static/export-viewer', + fallback: 'index.html', + strict: false + }), + paths: { + relative: true + } + } +}; + +export default config; diff --git a/frontend/export-viewer/tsconfig.json b/frontend/export-viewer/tsconfig.json new file mode 100644 index 0000000..feea18b --- /dev/null +++ b/frontend/export-viewer/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "rewriteRelativeImportExtensions": true, + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } +} diff --git a/frontend/export-viewer/vite.config.ts b/frontend/export-viewer/vite.config.ts new file mode 100644 index 0000000..bf699a8 --- /dev/null +++ b/frontend/export-viewer/vite.config.ts @@ -0,0 +1,7 @@ +import { sveltekit } from '@sveltejs/kit/vite'; +import tailwindcss from '@tailwindcss/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [tailwindcss(), sveltekit()] +}); diff --git a/frontend/src/routes/export/+page.svelte b/frontend/src/routes/export/+page.svelte index d806671..327a28f 100644 --- a/frontend/src/routes/export/+page.svelte +++ b/frontend/src/routes/export/+page.svelte @@ -113,7 +113,7 @@

Hinweis zum HTML-Viewer

  1. 1. ZIP-Datei entpacken (Windows: Rechtsklick → "Alle extrahieren"; Mac: Doppelklick).
  2. -
  3. 2. Memories.html im Browser öffnen.
  4. +
  5. 2. index.html im Browser öffnen.
  6. 3. Kein Internet nötig — alles ist lokal gespeichert.