From 6eb12993ccbf75238a9c1f578212ea891e72f51f Mon Sep 17 00:00:00 2001 From: Juan Cobo Betancourt Date: Sun, 1 Nov 2026 12:30:24 -0800 Subject: [PATCH 1/4] Redesign the bilingual homepage and documentation Reorganize the guides around exhibition planning, three authoring manuals, teaching resources and a workshop quick guide. Add the updated landing-page demo, illustrated guides, approved Spanish revisions and teaching-access form. --- .github/workflows/pages.yml | 2 +- _config.yml | 1 + _data/compositor_manual.json | 1066 ++++ _data/docs_anchor_aliases.json | 40 + _data/docs_media.json | 368 ++ _data/docs_navigation.json | 4598 +++++++++++++++++ _data/guides.json | 304 ++ _data/guides_sketch.json | 302 ++ _data/homepage_demo.json | 44 + _data/site_copy.json | 8 + _data/teaching_contact.json | 58 + _includes/docs/anchor-aliases.html | 1 + _includes/docs/build-options.html | 4 + _includes/docs/guides-hub.html | 11 + _includes/docs/media.html | 4 + _includes/docs/quick-guide.html | 8 + _includes/docs/section-overview.html | 107 + _includes/docs/story-arc.html | 24 + _includes/docs/teaching-request.html | 25 + _includes/guides-sketch/hub.html | 11 + _includes/guides-sketch/planning.en.html | 26 + _includes/guides-sketch/planning.es.html | 26 + _includes/guides-sketch/quick.html | 8 + _includes/guides-sketch/story-arc.html | 1 + _includes/homepage-demo.html | 19 + _includes/manual-brand.svg | 3 + _includes/manual-overview.html | 14 + _layouts/docs.html | 900 +--- _layouts/guides-sketch.html | 18 + _layouts/landing.html | 51 +- _layouts/manual.html | 49 + _layouts/section.html | 10 +- _plugins/localized_metadata.rb | 17 + assets/css/compositor-manual.css | 15 + assets/css/guides-sketch.css | 20 + assets/css/guides.css | 129 + assets/css/teaching-contact.css | 1 + assets/homepage-demo/LENIS-LICENSE.txt | 9 + assets/homepage-demo/README.md | 24 + assets/homepage-demo/homepage-demo.css | 70 + assets/homepage-demo/homepage-demo.js | 159 + assets/homepage-demo/lenis.css | 26 + assets/homepage-demo/lenis.min.js | 2 + assets/homepage-demo/posters/en.jpg | Bin 0 -> 62710 bytes assets/homepage-demo/posters/es.jpg | Bin 0 -> 64467 bytes assets/homepage-demo/scroll-motion.js | 42 + assets/js/docs.js | 76 + assets/js/teaching-contact.js | 34 + assets/manual/en-iiif-preview.jpg | Bin 0 -> 27868 bytes assets/manual/en-iiif-url.jpg | Bin 0 -> 13263 bytes assets/manual/en-khipu-framing.jpg | Bin 0 -> 109961 bytes assets/manual/es-iiif-preview.jpg | Bin 0 -> 29892 bytes assets/manual/es-iiif-url.jpg | Bin 0 -> 14027 bytes assets/manual/es-khipu-framing.jpg | Bin 0 -> 110645 bytes .../tutorials/en-coordinates-poster.jpg | Bin 0 -> 54536 bytes assets/manual/tutorials/en-coordinates.gif | Bin 0 -> 469459 bytes assets/manual/tutorials/en-create-site.jpg | Bin 0 -> 24969 bytes .../manual/tutorials/en-editor-overview.jpg | Bin 0 -> 116365 bytes assets/manual/tutorials/en-external-media.jpg | Bin 0 -> 23836 bytes assets/manual/tutorials/en-framing-poster.jpg | Bin 0 -> 63201 bytes assets/manual/tutorials/en-framing.gif | Bin 0 -> 621200 bytes assets/manual/tutorials/en-glossary.jpg | Bin 0 -> 79340 bytes assets/manual/tutorials/en-homepage.jpg | Bin 0 -> 57234 bytes assets/manual/tutorials/en-import-poster.jpg | Bin 0 -> 29638 bytes assets/manual/tutorials/en-import.gif | Bin 0 -> 127917 bytes .../manual/tutorials/en-object-metadata.jpg | Bin 0 -> 102046 bytes assets/manual/tutorials/en-objects.jpg | Bin 0 -> 86898 bytes assets/manual/tutorials/en-pages.jpg | Bin 0 -> 64424 bytes assets/manual/tutorials/en-panel-editor.jpg | Bin 0 -> 52857 bytes assets/manual/tutorials/en-panels-poster.jpg | Bin 0 -> 78993 bytes assets/manual/tutorials/en-panels.gif | Bin 0 -> 470738 bytes assets/manual/tutorials/en-preferences.jpg | Bin 0 -> 11604 bytes assets/manual/tutorials/en-public-home.jpg | Bin 0 -> 283568 bytes assets/manual/tutorials/en-public-object.jpg | Bin 0 -> 80774 bytes assets/manual/tutorials/en-stories.jpg | Bin 0 -> 57620 bytes assets/manual/tutorials/en-theme-language.jpg | Bin 0 -> 29948 bytes assets/manual/tutorials/en-upgrade.jpg | Bin 0 -> 31208 bytes .../tutorials/es-coordinates-poster.jpg | Bin 0 -> 55101 bytes assets/manual/tutorials/es-coordinates.gif | Bin 0 -> 466531 bytes assets/manual/tutorials/es-create-site.jpg | Bin 0 -> 26741 bytes .../manual/tutorials/es-editor-overview.jpg | Bin 0 -> 110645 bytes assets/manual/tutorials/es-external-media.jpg | Bin 0 -> 25752 bytes assets/manual/tutorials/es-framing-poster.jpg | Bin 0 -> 57023 bytes assets/manual/tutorials/es-framing.gif | Bin 0 -> 596146 bytes assets/manual/tutorials/es-glossary.jpg | Bin 0 -> 78382 bytes assets/manual/tutorials/es-homepage.jpg | Bin 0 -> 54065 bytes assets/manual/tutorials/es-import-poster.jpg | Bin 0 -> 31769 bytes assets/manual/tutorials/es-import.gif | Bin 0 -> 134700 bytes .../manual/tutorials/es-object-metadata.jpg | Bin 0 -> 103141 bytes assets/manual/tutorials/es-objects.jpg | Bin 0 -> 88147 bytes assets/manual/tutorials/es-pages.jpg | Bin 0 -> 61656 bytes assets/manual/tutorials/es-panel-editor.jpg | Bin 0 -> 55317 bytes assets/manual/tutorials/es-panels-poster.jpg | Bin 0 -> 76887 bytes assets/manual/tutorials/es-panels.gif | Bin 0 -> 465607 bytes assets/manual/tutorials/es-preferences.jpg | Bin 0 -> 12522 bytes assets/manual/tutorials/es-public-home.jpg | Bin 0 -> 280417 bytes assets/manual/tutorials/es-public-object.jpg | Bin 0 -> 82812 bytes assets/manual/tutorials/es-stories.jpg | Bin 0 -> 53340 bytes assets/manual/tutorials/es-theme-language.jpg | Bin 0 -> 31898 bytes assets/manual/tutorials/es-upgrade.jpg | Bin 0 -> 32112 bytes docs/1-0-getting-started.es.md | 40 +- docs/1-0-getting-started.md | 40 +- docs/1-1-compositor.es.md | 18 +- docs/1-1-compositor.md | 16 +- docs/1-2-google-sheets-option.es.md | 4 +- docs/1-2-google-sheets-option.md | 2 +- docs/1-3-local-dev.es.md | 308 +- docs/1-3-local-dev.md | 329 +- docs/1-4-narrative-structure.es.md | 76 +- docs/1-4-narrative-structure.md | 69 +- docs/1-5-add-content.es.md | 119 +- docs/1-5-add-content.md | 120 +- docs/1-6-review-refine.es.md | 70 +- docs/1-6-review-refine.md | 72 +- docs/2-3-upgrading.es.md | 2 +- docs/2-3-upgrading.md | 2 +- docs/4-0-your-content.es.md | 2 +- docs/4-0-your-content.md | 2 +- docs/4-4-stories-panels.es.md | 2 +- docs/4-5-rich-content.es.md | 3 + docs/4-5-rich-content.md | 3 + docs/4-6-markdown-syntax.es.md | 2 +- docs/4-8-pdf-documents.es.md | 2 +- docs/4-9-video-objects.es.md | 4 +- docs/5-0-your-data.es.md | 7 +- docs/5-0-your-data.md | 5 +- docs/5-1-google-sheets.es.md | 120 +- docs/5-1-google-sheets.md | 121 +- docs/5-3-csv-objects.es.md | 2 +- docs/5-4-csv-stories.es.md | 2 +- docs/5-5-csv-glossary.es.md | 2 +- docs/6-1-objects-gallery.es.md | 2 +- docs/6-2-glossary.es.md | 5 +- docs/6-2-glossary.md | 5 +- docs/6-3-private-stories.es.md | 2 +- docs/6-4-custom-pages.es.md | 3 + docs/6-4-custom-pages.md | 3 + docs/7-0-customization.es.md | 3 + docs/7-1-themes.es.md | 3 + docs/7-2-home-page.es.md | 6 + docs/7-2-home-page.md | 3 + docs/7-3-navigation-menu.es.md | 3 + docs/7-3-navigation-menu.md | 3 + docs/8-1-local-development.es.md | 13 +- docs/8-1-local-development.md | 17 +- docs/8-2-github-actions.es.md | 3 + docs/8-4-embedding-system.es.md | 24 +- docs/8-4-embedding-system.md | 24 +- docs/8-5-styling.es.md | 3 + docs/9-0-compositor.es.md | 59 +- docs/9-0-compositor.md | 57 +- docs/9-1-getting-started.es.md | 19 +- docs/9-1-getting-started.md | 19 +- docs/9-2-dashboard.es.md | 70 +- docs/9-2-dashboard.md | 68 +- docs/9-3-objects.es.md | 48 +- docs/9-3-objects.md | 48 +- docs/9-4-story-editor.es.md | 97 +- docs/9-4-story-editor.md | 87 +- docs/9-5-video-audio.es.md | 2 + docs/9-5-video-audio.md | 2 + docs/9-6-publishing.es.md | 8 +- docs/9-6-publishing.md | 10 +- docs/9-7-sync-updates.es.md | 52 +- docs/9-7-sync-updates.md | 50 +- docs/index.es.md | 82 +- docs/index.md | 81 +- empezar.html | 20 +- guide-sketch/index.en.html | 7 + guide-sketch/index.es.html | 7 + guide-sketch/plan.en.html | 7 + guide-sketch/plan.es.html | 7 + guide-sketch/quick.en.html | 7 + guide-sketch/quick.es.html | 7 + guides/compositor-courses.en.md | 52 + guides/compositor-courses.es.md | 52 + guides/compositor-glossary.en.md | 55 + guides/compositor-glossary.es.md | 55 + guides/compositor-pages.en.md | 55 + guides/compositor-pages.es.md | 55 + guides/compositor-recovery.en.md | 46 + guides/compositor-recovery.es.md | 46 + guides/compositor-settings.en.md | 55 + guides/compositor-settings.es.md | 55 + guides/compositor-team.en.md | 46 + guides/compositor-team.es.md | 46 + guides/iiif.en.md | 116 + guides/iiif.es.md | 116 + guides/local-content.en.md | 66 + guides/local-content.es.md | 66 + guides/local-preview.en.md | 61 + guides/local-preview.es.md | 61 + guides/local-publish.en.md | 51 + guides/local-publish.es.md | 51 + guides/local.en.html | 10 + guides/local.es.html | 10 + guides/planning-layers.en.md | 44 + guides/planning-layers.es.md | 44 + guides/planning-layout.en.md | 46 + guides/planning-layout.es.md | 46 + guides/planning-review.en.md | 45 + guides/planning-review.es.md | 45 + guides/planning-sources.en.md | 44 + guides/planning-sources.es.md | 46 + guides/planning.en.html | 35 + guides/planning.es.html | 35 + guides/reference.en.html | 10 + guides/reference.es.html | 10 + guides/sheets.en.html | 10 + guides/sheets.es.html | 10 + guides/teaching-request.en.html | 14 + guides/teaching-request.es.html | 14 + guides/teaching.en.html | 12 + guides/teaching.es.html | 12 + index.html | 99 +- manual/iiif.en.md | 7 + manual/iiif.es.md | 7 + manual/index.en.html | 7 + manual/index.es.html | 7 + manual/review.html | 32 + redirects/en-reference.md | 7 - redirects/es-referencia.md | 7 - start.html | 20 +- 223 files changed, 10665 insertions(+), 2623 deletions(-) create mode 100644 _data/compositor_manual.json create mode 100644 _data/docs_anchor_aliases.json create mode 100644 _data/docs_media.json create mode 100644 _data/docs_navigation.json create mode 100644 _data/guides.json create mode 100644 _data/guides_sketch.json create mode 100644 _data/homepage_demo.json create mode 100644 _data/site_copy.json create mode 100644 _data/teaching_contact.json create mode 100644 _includes/docs/anchor-aliases.html create mode 100644 _includes/docs/build-options.html create mode 100644 _includes/docs/guides-hub.html create mode 100644 _includes/docs/media.html create mode 100644 _includes/docs/quick-guide.html create mode 100644 _includes/docs/section-overview.html create mode 100644 _includes/docs/story-arc.html create mode 100644 _includes/docs/teaching-request.html create mode 100644 _includes/guides-sketch/hub.html create mode 100644 _includes/guides-sketch/planning.en.html create mode 100644 _includes/guides-sketch/planning.es.html create mode 100644 _includes/guides-sketch/quick.html create mode 100644 _includes/guides-sketch/story-arc.html create mode 100644 _includes/homepage-demo.html create mode 100644 _includes/manual-brand.svg create mode 100644 _includes/manual-overview.html create mode 100644 _layouts/guides-sketch.html create mode 100644 _layouts/manual.html create mode 100644 _plugins/localized_metadata.rb create mode 100644 assets/css/compositor-manual.css create mode 100644 assets/css/guides-sketch.css create mode 100644 assets/css/guides.css create mode 100644 assets/css/teaching-contact.css create mode 100644 assets/homepage-demo/LENIS-LICENSE.txt create mode 100644 assets/homepage-demo/README.md create mode 100644 assets/homepage-demo/homepage-demo.css create mode 100644 assets/homepage-demo/homepage-demo.js create mode 100644 assets/homepage-demo/lenis.css create mode 100644 assets/homepage-demo/lenis.min.js create mode 100644 assets/homepage-demo/posters/en.jpg create mode 100644 assets/homepage-demo/posters/es.jpg create mode 100644 assets/homepage-demo/scroll-motion.js create mode 100644 assets/js/docs.js create mode 100644 assets/js/teaching-contact.js create mode 100644 assets/manual/en-iiif-preview.jpg create mode 100644 assets/manual/en-iiif-url.jpg create mode 100644 assets/manual/en-khipu-framing.jpg create mode 100644 assets/manual/es-iiif-preview.jpg create mode 100644 assets/manual/es-iiif-url.jpg create mode 100644 assets/manual/es-khipu-framing.jpg create mode 100644 assets/manual/tutorials/en-coordinates-poster.jpg create mode 100644 assets/manual/tutorials/en-coordinates.gif create mode 100644 assets/manual/tutorials/en-create-site.jpg create mode 100644 assets/manual/tutorials/en-editor-overview.jpg create mode 100644 assets/manual/tutorials/en-external-media.jpg create mode 100644 assets/manual/tutorials/en-framing-poster.jpg create mode 100644 assets/manual/tutorials/en-framing.gif create mode 100644 assets/manual/tutorials/en-glossary.jpg create mode 100644 assets/manual/tutorials/en-homepage.jpg create mode 100644 assets/manual/tutorials/en-import-poster.jpg create mode 100644 assets/manual/tutorials/en-import.gif create mode 100644 assets/manual/tutorials/en-object-metadata.jpg create mode 100644 assets/manual/tutorials/en-objects.jpg create mode 100644 assets/manual/tutorials/en-pages.jpg create mode 100644 assets/manual/tutorials/en-panel-editor.jpg create mode 100644 assets/manual/tutorials/en-panels-poster.jpg create mode 100644 assets/manual/tutorials/en-panels.gif create mode 100644 assets/manual/tutorials/en-preferences.jpg create mode 100644 assets/manual/tutorials/en-public-home.jpg create mode 100644 assets/manual/tutorials/en-public-object.jpg create mode 100644 assets/manual/tutorials/en-stories.jpg create mode 100644 assets/manual/tutorials/en-theme-language.jpg create mode 100644 assets/manual/tutorials/en-upgrade.jpg create mode 100644 assets/manual/tutorials/es-coordinates-poster.jpg create mode 100644 assets/manual/tutorials/es-coordinates.gif create mode 100644 assets/manual/tutorials/es-create-site.jpg create mode 100644 assets/manual/tutorials/es-editor-overview.jpg create mode 100644 assets/manual/tutorials/es-external-media.jpg create mode 100644 assets/manual/tutorials/es-framing-poster.jpg create mode 100644 assets/manual/tutorials/es-framing.gif create mode 100644 assets/manual/tutorials/es-glossary.jpg create mode 100644 assets/manual/tutorials/es-homepage.jpg create mode 100644 assets/manual/tutorials/es-import-poster.jpg create mode 100644 assets/manual/tutorials/es-import.gif create mode 100644 assets/manual/tutorials/es-object-metadata.jpg create mode 100644 assets/manual/tutorials/es-objects.jpg create mode 100644 assets/manual/tutorials/es-pages.jpg create mode 100644 assets/manual/tutorials/es-panel-editor.jpg create mode 100644 assets/manual/tutorials/es-panels-poster.jpg create mode 100644 assets/manual/tutorials/es-panels.gif create mode 100644 assets/manual/tutorials/es-preferences.jpg create mode 100644 assets/manual/tutorials/es-public-home.jpg create mode 100644 assets/manual/tutorials/es-public-object.jpg create mode 100644 assets/manual/tutorials/es-stories.jpg create mode 100644 assets/manual/tutorials/es-theme-language.jpg create mode 100644 assets/manual/tutorials/es-upgrade.jpg create mode 100644 guide-sketch/index.en.html create mode 100644 guide-sketch/index.es.html create mode 100644 guide-sketch/plan.en.html create mode 100644 guide-sketch/plan.es.html create mode 100644 guide-sketch/quick.en.html create mode 100644 guide-sketch/quick.es.html create mode 100644 guides/compositor-courses.en.md create mode 100644 guides/compositor-courses.es.md create mode 100644 guides/compositor-glossary.en.md create mode 100644 guides/compositor-glossary.es.md create mode 100644 guides/compositor-pages.en.md create mode 100644 guides/compositor-pages.es.md create mode 100644 guides/compositor-recovery.en.md create mode 100644 guides/compositor-recovery.es.md create mode 100644 guides/compositor-settings.en.md create mode 100644 guides/compositor-settings.es.md create mode 100644 guides/compositor-team.en.md create mode 100644 guides/compositor-team.es.md create mode 100644 guides/iiif.en.md create mode 100644 guides/iiif.es.md create mode 100644 guides/local-content.en.md create mode 100644 guides/local-content.es.md create mode 100644 guides/local-preview.en.md create mode 100644 guides/local-preview.es.md create mode 100644 guides/local-publish.en.md create mode 100644 guides/local-publish.es.md create mode 100644 guides/local.en.html create mode 100644 guides/local.es.html create mode 100644 guides/planning-layers.en.md create mode 100644 guides/planning-layers.es.md create mode 100644 guides/planning-layout.en.md create mode 100644 guides/planning-layout.es.md create mode 100644 guides/planning-review.en.md create mode 100644 guides/planning-review.es.md create mode 100644 guides/planning-sources.en.md create mode 100644 guides/planning-sources.es.md create mode 100644 guides/planning.en.html create mode 100644 guides/planning.es.html create mode 100644 guides/reference.en.html create mode 100644 guides/reference.es.html create mode 100644 guides/sheets.en.html create mode 100644 guides/sheets.es.html create mode 100644 guides/teaching-request.en.html create mode 100644 guides/teaching-request.es.html create mode 100644 guides/teaching.en.html create mode 100644 guides/teaching.es.html create mode 100644 manual/iiif.en.md create mode 100644 manual/iiif.es.md create mode 100644 manual/index.en.html create mode 100644 manual/index.es.html create mode 100644 manual/review.html delete mode 100644 redirects/en-reference.md delete mode 100644 redirects/es-referencia.md diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index ea249b0..bb56961 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -37,7 +37,7 @@ jobs: JEKYLL_ENV: production - name: Build search index with Pagefind - run: npx -y pagefind --site _site + run: npx -y pagefind@1.5.2 --site _site - name: Upload artifact uses: actions/upload-pages-artifact@v3 diff --git a/_config.yml b/_config.yml index a0ac923..897cbfe 100644 --- a/_config.yml +++ b/_config.yml @@ -71,6 +71,7 @@ telar_release_date: "2026-10-31" # Showcase: form and gallery backed by the telar-showcase Worker showcase_api: "https://showcase.telar.org" +teaching_request_api: "https://showcase.telar.org" showcase_turnstile_site_key: "0x4AAAAAAE2tYZjlIcT_XQw9" # Build settings diff --git a/_data/compositor_manual.json b/_data/compositor_manual.json new file mode 100644 index 0000000..57561d7 --- /dev/null +++ b/_data/compositor_manual.json @@ -0,0 +1,1066 @@ +{ + "date": "2026-10-31", + "compositor_version": "1.5.5-beta", + "baselines": [ + { + "name": "telar", + "sha": "a579828e89b7553c1078ce1605be86f436131f6a", + "branch": "v1.8.3" + }, + { + "name": "telar-compositor", + "sha": "b117ab969feec70a493beb78999446dd07fffccb", + "branch": "main" + }, + { + "name": "telar-docs", + "sha": "46d18487e56f3b3d209894e35d7bd6170fb5f0f4", + "branch": "main" + }, + { + "name": "telar-demo-content", + "sha": "5126c31adaf5651cc3fdae49f481f9c8822b9390", + "branch": "main" + }, + { + "name": "telar-showcase", + "sha": "6de17b2dba5a84b83b5f558ed622352d40c0e5ee", + "branch": "main" + } + ], + "coverage": [ + { + "id": "C01", + "chapter": "workspace", + "task": "Account and interface language", + "repository": "telar-compositor", + "source": "telar-compositor/app/routes/_app.account.tsx", + "existing_english_reference": "/docs/the-compositor/getting-started/", + "status": "missing-guide", + "verification": "source-and-live", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "C02", + "chapter": "first-site", + "task": "Create a new site", + "repository": "telar-compositor", + "source": "telar-compositor/app/routes/onboarding.tsx", + "existing_english_reference": "/docs/getting-started/compositor/", + "status": "needs-update", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "C03", + "chapter": "first-site", + "task": "Connect a repository or import Sheets", + "repository": "telar-compositor", + "source": "telar-compositor/app/routes/onboarding.tsx", + "existing_english_reference": "/docs/the-compositor/getting-started/", + "status": "needs-update", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "C04", + "chapter": "workspace", + "task": "Start and the six setup tasks", + "repository": "telar-compositor", + "source": "telar-compositor/app/routes/_app.start.tsx", + "existing_english_reference": "/docs/the-compositor/dashboard/", + "status": "needs-update", + "verification": "live-inspected", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "C05", + "chapter": "objects", + "task": "Fetch an external IIIF manifest", + "repository": "telar-compositor", + "source": "telar-compositor/app/components/features/objects/AddObjectDialog.tsx", + "existing_english_reference": "/docs/the-compositor/objects/", + "status": "pilot-draft", + "verification": "source-and-live", + "recording": "Pilot script" + }, + { + "id": "C06", + "chapter": "objects", + "task": "Review imported metadata and add the object", + "repository": "telar-compositor", + "source": "telar-compositor/app/routes/_app.objects.tsx", + "existing_english_reference": "/docs/the-compositor/objects/", + "status": "pilot-draft", + "verification": "source-checked", + "recording": "Pilot script" + }, + { + "id": "C07", + "chapter": "objects", + "task": "Upload images, PDF, WEBP and audio", + "repository": "telar-compositor", + "source": "telar-compositor/app/components/features/objects/AddObjectDialog.tsx", + "existing_english_reference": "/docs/the-compositor/objects/", + "status": "needs-update", + "verification": "source-checked", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "C08", + "chapter": "objects", + "task": "Add external video or audio", + "repository": "telar-compositor", + "source": "telar-compositor/app/components/features/objects/AddObjectDialog.tsx", + "existing_english_reference": "/docs/the-compositor/video-audio/", + "status": "needs-update", + "verification": "source-checked", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "C09", + "chapter": "objects", + "task": "Metadata, credits and alternative text", + "repository": "telar-compositor", + "source": "telar-compositor/app/routes/_app.objects.$objectId.tsx", + "existing_english_reference": "/docs/the-compositor/objects/", + "status": "needs-illustrations", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "C10", + "chapter": "objects", + "task": "Find, feature, rename and remove objects", + "repository": "telar-compositor", + "source": "telar-compositor/app/routes/_app.objects.tsx", + "existing_english_reference": "/docs/the-compositor/objects/", + "status": "needs-update", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "C11", + "chapter": "stories", + "task": "Create a story and its title card", + "repository": "telar-compositor", + "source": "telar-compositor/app/routes/_app.stories.tsx", + "existing_english_reference": "/docs/the-compositor/story-editor/", + "status": "needs-update", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "C12", + "chapter": "stories", + "task": "Add steps and choose objects", + "repository": "telar-compositor", + "source": "telar-compositor/app/routes/_app.stories.$storyId.tsx", + "existing_english_reference": "/docs/the-compositor/story-editor/", + "status": "pilot-draft", + "verification": "source-checked", + "recording": "Pilot script" + }, + { + "id": "C13", + "chapter": "stories", + "task": "Reorder steps and add sections", + "repository": "telar-compositor", + "source": "telar-compositor/app/routes/_app.stories.$storyId.tsx", + "existing_english_reference": "/docs/the-compositor/story-editor/", + "status": "needs-illustrations", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "C14", + "chapter": "framing", + "task": "Frame an image and press Capture position", + "repository": "telar-compositor", + "source": "telar-compositor/app/components/features/editor/ViewerBottomBar.tsx", + "existing_english_reference": "/docs/the-compositor/story-editor/", + "status": "pilot-draft", + "verification": "source-checked", + "recording": "Pilot script" + }, + { + "id": "C15", + "chapter": "framing", + "task": "Frame, centre, whole area and text limit", + "repository": "telar-compositor", + "source": "telar-compositor/app/components/features/editor/StoryStage.tsx", + "existing_english_reference": "/docs/the-compositor/story-editor/", + "status": "missing-guide", + "verification": "source-checked", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "C16", + "chapter": "panels", + "task": "Edit answers and layered panels", + "repository": "telar-compositor", + "source": "telar-compositor/app/routes/_app.stories.$storyId.tsx", + "existing_english_reference": "/docs/the-compositor/story-editor/", + "status": "needs-update", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "C17", + "chapter": "panels", + "task": "Widgets, footnotes and mathematics", + "repository": "telar-compositor", + "source": "telar-compositor/app/routes/_app.stories.$storyId.tsx", + "existing_english_reference": "/docs/your-content/widgets/", + "status": "missing-guide", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "C18", + "chapter": "media", + "task": "Capture media clips and looping", + "repository": "telar-compositor", + "source": "telar-compositor/app/routes/_app.stories.$storyId.tsx", + "existing_english_reference": "/docs/the-compositor/video-audio/", + "status": "needs-illustrations", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "C19", + "chapter": "glossary", + "task": "Terms, aliases, kinds and links", + "repository": "telar-compositor", + "source": "telar-compositor/app/routes/_app.glossary.tsx", + "existing_english_reference": "/docs/site-features/glossary/", + "status": "missing-guide", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "C20", + "chapter": "pages", + "task": "Edit the homepage", + "repository": "telar-compositor", + "source": "telar-compositor/app/routes/_app.homepage.tsx", + "existing_english_reference": "/docs/customization/home-page/", + "status": "missing-guide", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "C21", + "chapter": "pages", + "task": "Create pages and arrange navigation", + "repository": "telar-compositor", + "source": "telar-compositor/app/routes/_app.pages.tsx", + "existing_english_reference": "/docs/site-features/custom-pages/", + "status": "missing-guide", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "C22", + "chapter": "pages", + "task": "Themes, site language and settings", + "repository": "telar-compositor", + "source": "telar-compositor/app/routes/_app.config.tsx", + "existing_english_reference": "/docs/configure/configuration/", + "status": "missing-guide", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "C23", + "chapter": "team", + "task": "Invitations, roles and repository access", + "repository": "telar-compositor", + "source": "telar-compositor/app/routes/_app.team.tsx", + "existing_english_reference": "", + "status": "missing-guide", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "C24", + "chapter": "team", + "task": "Presence and simultaneous editing", + "repository": "telar-compositor", + "source": "telar-compositor/app/routes/_app.tsx", + "existing_english_reference": "", + "status": "missing-guide", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "C25", + "chapter": "team", + "task": "Contribution record and its limits", + "repository": "telar-compositor", + "source": "telar-compositor/app/routes/_app.contributions.tsx", + "existing_english_reference": "", + "status": "missing-guide", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "C26", + "chapter": "courses", + "task": "Set up a course and shared objects", + "repository": "telar-compositor", + "source": "telar-compositor/app/routes/_app.course.tsx", + "existing_english_reference": "", + "status": "missing-guide", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "C27", + "chapter": "courses", + "task": "Join a course or join as staff", + "repository": "telar-compositor", + "source": "telar-compositor/app/routes/_app.account.tsx", + "existing_english_reference": "", + "status": "missing-guide", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "C28", + "chapter": "publish", + "task": "Draft, saved state and published site", + "repository": "telar-compositor", + "source": "telar-compositor/app/routes/_app.publish.tsx", + "existing_english_reference": "/docs/the-compositor/publishing/", + "status": "needs-update", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "C29", + "chapter": "publish", + "task": "Validation, publishing and build results", + "repository": "telar-compositor", + "source": "telar-compositor/app/routes/_app.publish.tsx", + "existing_english_reference": "/docs/the-compositor/publishing/", + "status": "needs-illustrations", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "C30", + "chapter": "sync", + "task": "Review individual changes made on GitHub", + "repository": "telar-compositor", + "source": "telar-compositor/app/routes/_app.publish.tsx", + "existing_english_reference": "/docs/the-compositor/sync-updates/", + "status": "needs-update", + "verification": "source-checked", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "C31", + "chapter": "sync", + "task": "Upgrade and interpret build outcomes", + "repository": "telar-compositor", + "source": "telar-compositor/app/routes/_app.upgrade.tsx", + "existing_english_reference": "/docs/the-compositor/sync-updates/", + "status": "needs-update", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "C32", + "chapter": "recovery", + "task": "Reconnect, identify saved work and get help", + "repository": "telar-compositor", + "source": "telar-compositor/app/routes/_app.tsx", + "existing_english_reference": "", + "status": "missing-guide", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "R01", + "chapter": "workspace", + "task": "Browse a site and its stories", + "repository": "telar", + "source": "telar/assets/js/telar-story/main.js", + "existing_english_reference": "", + "status": "missing-reader-guide", + "verification": "live-inspected", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "R02", + "chapter": "framing", + "task": "Scroll, arrow keys, zoom and navigation", + "repository": "telar", + "source": "telar/assets/js/telar-story/navigation.js", + "existing_english_reference": "/docs/developers/story-engine/", + "status": "needs-reader-guide", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "R03", + "chapter": "panels", + "task": "Open panels and glossary definitions", + "repository": "telar", + "source": "telar/assets/js/telar-story/panels.js", + "existing_english_reference": "/docs/site-features/glossary/", + "status": "needs-reader-guide", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "R04", + "chapter": "objects", + "task": "Browse, search and filter the collection", + "repository": "telar", + "source": "telar/scripts/telar/processors/objects/__init__.py", + "existing_english_reference": "/docs/site-features/objects-gallery/", + "status": "needs-reader-guide", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "R05", + "chapter": "media", + "task": "Play video and audio in stories", + "repository": "telar", + "source": "telar/assets/js/telar-story/media-arrangement.js", + "existing_english_reference": "/docs/your-content/video-objects/", + "status": "needs-reader-guide", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "R06", + "chapter": "publish", + "task": "Share and embed in an LMS", + "repository": "telar", + "source": "telar/assets/js/embed.js", + "existing_english_reference": "/docs/site-features/embedding/", + "status": "existing-reference", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "R07", + "chapter": "recovery", + "task": "Private stories and unlocking", + "repository": "telar", + "source": "telar/assets/js/story-unlock.js", + "existing_english_reference": "/docs/site-features/private-stories/", + "status": "existing-reference", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "A01", + "chapter": "first-site", + "task": "Google Sheets setup", + "repository": "telar", + "source": "telar/scripts/fetch_google_sheets.py", + "existing_english_reference": "/docs/getting-started/google-sheets/", + "status": "needs-journey-review", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "A02", + "chapter": "stories", + "task": "CSV object and story authoring", + "repository": "telar", + "source": "telar/scripts/telar/processors/stories.py", + "existing_english_reference": "/docs/your-data/csv-stories/", + "status": "existing-reference", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "A03", + "chapter": "objects", + "task": "Generate IIIF tiles and process PDFs", + "repository": "telar", + "source": "telar/scripts/generate_iiif.py", + "existing_english_reference": "/docs/your-content/self-hosted-images/", + "status": "existing-reference", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "A04", + "chapter": "recovery", + "task": "Build and preview locally", + "repository": "telar", + "source": "telar/scripts/build_local_site.py", + "existing_english_reference": "/docs/developers/local-development/", + "status": "existing-reference", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "A05", + "chapter": "sync", + "task": "Upgrade through scripts and migrations", + "repository": "telar", + "source": "telar/scripts/telar_upgrade.py", + "existing_english_reference": "/docs/setup/upgrading/", + "status": "needs-task-first-guide", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "D01", + "chapter": "workspace", + "task": "Bilingual navigation and search", + "repository": "telar-docs", + "source": "telar-docs/_layouts/docs.html", + "existing_english_reference": "/docs/", + "status": "needs-fixes", + "verification": "source-and-live", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "D02", + "chapter": "first-site", + "task": "Setup generator and validator", + "repository": "telar-docs", + "source": "telar-docs/docs/1-2-google-sheets-option.md", + "existing_english_reference": "/docs/getting-started/google-sheets/", + "status": "needs-accessibility-fixes", + "verification": "source-and-live", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "D03", + "chapter": "workspace", + "task": "Contextual help inside the editor", + "repository": "telar-compositor", + "source": "telar-compositor/app/lib/docs-content.ts", + "existing_english_reference": "", + "status": "needs-content-sync", + "verification": "source-checked", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "D04", + "chapter": "objects", + "task": "Versioned multilingual demo bundles", + "repository": "telar-demo-content", + "source": "telar-demo-content/generator/build-demos.py", + "existing_english_reference": "/docs/customization/demo-content/", + "status": "existing-reference", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "D05", + "chapter": "publish", + "task": "Submit a project to the showcase", + "repository": "telar-showcase", + "source": "telar-showcase/src/index.ts", + "existing_english_reference": "/showcase/submit/", + "status": "missing-guide", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + }, + { + "id": "D06", + "chapter": "publish", + "task": "Public showcase and consent", + "repository": "telar-docs", + "source": "telar-docs/showcase-submit.md", + "existing_english_reference": "/showcase/submit/", + "status": "needs-journey-review", + "verification": "source-mapped", + "recording": "To scope during chapter rehearsal" + } + ], + "chapters": [ + { + "id": "workspace", + "es": "Tu espacio de trabajo", + "en": "Your workspace", + "outcome_es": "Distinguir objetos, historias, pasos, paneles y glosario.", + "outcome_en": "Understand objects, stories, steps, panels and glossary." + }, + { + "id": "first-site", + "es": "Tu primer sitio", + "en": "Your first site", + "outcome_es": "Crear un sitio o conectar uno existente.", + "outcome_en": "Create a site or connect an existing one." + }, + { + "id": "objects", + "es": "Objetos y colecciones", + "en": "Objects and collections", + "outcome_es": "Importar, describir y organizar tus materiales.", + "outcome_en": "Import, describe and organise your materials." + }, + { + "id": "stories", + "es": "Historias y pasos", + "en": "Stories and steps", + "outcome_es": "Construir una secuencia de preguntas, respuestas e invitaciones.", + "outcome_en": "Build a sequence of questions, answers and invitations." + }, + { + "id": "framing", + "es": "Encuadre y posición", + "en": "Framing and position", + "outcome_es": "Elegir qué verá el público y capturar esa vista.", + "outcome_en": "Choose what visitors will see and capture that view." + }, + { + "id": "panels", + "es": "Textos y paneles", + "en": "Text and panels", + "outcome_es": "Desarrollar el relato con formato, imágenes y contenido contextual.", + "outcome_en": "Develop your narrative with formatting, images and contextual content." + }, + { + "id": "media", + "es": "Video y audio", + "en": "Video and audio", + "outcome_es": "Usar clips, reproducción y bucles.", + "outcome_en": "Work with clips, playback and loops." + }, + { + "id": "glossary", + "es": "Glosario", + "en": "Glossary", + "outcome_es": "Crear definiciones y enlazarlas desde tus textos.", + "outcome_en": "Create definitions and link them from your text." + }, + { + "id": "pages", + "es": "Inicio, páginas y apariencia", + "en": "Home, pages and appearance", + "outcome_es": "Configurar la portada, la navegación y la presentación.", + "outcome_en": "Configure the homepage, navigation and appearance." + }, + { + "id": "team", + "es": "Trabajar en equipo", + "en": "Working together", + "outcome_es": "Invitar a otras personas y comprender los roles.", + "outcome_en": "Invite other people and understand the roles." + }, + { + "id": "courses", + "es": "Enseñar con Telar", + "en": "Teaching with Telar", + "outcome_es": "Organizar cursos, grupos y objetos compartidos.", + "outcome_en": "Organise courses, groups and shared objects." + }, + { + "id": "publish", + "es": "Publicar", + "en": "Publishing", + "outcome_es": "Revisar cambios, corregir avisos y seguir la construcción.", + "outcome_en": "Review changes, address notices and follow the build." + }, + { + "id": "sync", + "es": "Cambios en GitHub y actualizaciones", + "en": "GitHub changes and upgrades", + "outcome_es": "Revisar cambios externos y actualizar el sitio.", + "outcome_en": "Review external changes and upgrade your site." + }, + { + "id": "recovery", + "es": "Mantenimiento y recuperación", + "en": "Maintenance and recovery", + "outcome_es": "Reconocer problemas y recuperar el trabajo.", + "outcome_en": "Recognise problems and recover work." + } + ], + "captions": [ + { + "start": 0, + "end": 7, + "es": "Conecta un objeto IIIF con un paso de tu historia.", + "en": "Connect an IIIF object to a step in your story.", + "action": "Show the object and the intended story result." + }, + { + "start": 7, + "end": 15, + "es": "En Objetos, pulsa Agregar objeto y elige Manifiesto IIIF.", + "en": "In Objects, choose Add object, then IIIF manifest.", + "action": "Open the existing dialog. Keep the relevant controls legible." + }, + { + "start": 15, + "end": 25, + "es": "Pega la URL del manifiesto y pulsa Obtener manifiesto.", + "en": "Paste the manifest URL and choose Fetch manifest.", + "action": "Paste the complete URL. Hold after the click; shorten a long wait with an explicit editorial note." + }, + { + "start": 25, + "end": 37, + "es": "Revisa el título, la fuente y el crédito antes de agregar el objeto.", + "en": "Review the title, source and credit before adding the object.", + "action": "Show imported metadata. Do not invent missing cataloguing data." + }, + { + "start": 37, + "end": 46, + "es": "Abre tu historia y agrega un paso.", + "en": "Open your story and add a step.", + "action": "Use the dedicated documentation fixture for the actual recording." + }, + { + "start": 46, + "end": 57, + "es": "Elige el objeto que acabas de agregar.", + "en": "Choose the object you have just added.", + "action": "Show the object picker and the resulting viewer." + }, + { + "start": 57, + "end": 68, + "es": "Escribe una pregunta y una respuesta breve.", + "en": "Write a question and a short answer.", + "action": "Use the reviewed example text from the guide." + }, + { + "start": 68, + "end": 82, + "es": "Encuadra el detalle y pulsa Capturar posición.", + "en": "Frame the detail and choose Capture position.", + "action": "Show the action and its Captured confirmation. Leave time to read the guides." + }, + { + "start": 82, + "end": 94, + "es": "Usa los paneles para desarrollar el contexto.", + "en": "Use panels to develop the context.", + "action": "Open one panel and show how it relates to the step." + }, + { + "start": 94, + "end": 106, + "es": "Revisa tus cambios en Publicar antes de llevarlos al sitio.", + "en": "Review your changes in Publish before sending them to your site.", + "action": "Show the review. Publishing rehearsal on a dedicated fixture remains to do." + }, + { + "start": 106, + "end": 116, + "es": "Comprueba el objeto, el encuadre y el panel en el sitio publicado.", + "en": "Check the object, framing and panel on the published site.", + "action": "Finish on the reader result. The pilot film is not recorded before copy review." + } + ], + "ui_strings": [ + { + "language": "en", + "namespace": "objects", + "key": "title", + "text": "Objects" + }, + { + "language": "en", + "namespace": "objects", + "key": "add_object_button", + "text": "+ Add object" + }, + { + "language": "en", + "namespace": "objects", + "key": "tab_iiif", + "text": "IIIF manifest" + }, + { + "language": "en", + "namespace": "objects", + "key": "add_iiif_url_label", + "text": "IIIF manifest URL" + }, + { + "language": "en", + "namespace": "objects", + "key": "add_iiif_fetch", + "text": "Fetch manifest" + }, + { + "language": "en", + "namespace": "objects", + "key": "add_iiif_confirm", + "text": "Add object" + }, + { + "language": "en", + "namespace": "objects", + "key": "field_title", + "text": "Title" + }, + { + "language": "en", + "namespace": "objects", + "key": "field_creator", + "text": "Creator" + }, + { + "language": "en", + "namespace": "objects", + "key": "field_source", + "text": "Source" + }, + { + "language": "en", + "namespace": "objects", + "key": "field_credit", + "text": "Credit" + }, + { + "language": "en", + "namespace": "objects", + "key": "field_alt_text", + "text": "Description for accessibility" + }, + { + "language": "en", + "namespace": "editor", + "key": "viewer.capture_position", + "text": "Capture position" + }, + { + "language": "en", + "namespace": "editor", + "key": "viewer.captured", + "text": "Captured" + }, + { + "language": "en", + "namespace": "editor", + "key": "viewer.change_object", + "text": "Change object" + }, + { + "language": "en", + "namespace": "editor", + "key": "step.add_step", + "text": "+ Add step" + }, + { + "language": "en", + "namespace": "stories", + "key": "title", + "text": "Stories" + }, + { + "language": "en", + "namespace": "stories", + "key": "new_story_button", + "text": "+ New Story" + }, + { + "language": "en", + "namespace": "stories", + "key": "save", + "text": "Save" + }, + { + "language": "es", + "namespace": "objects", + "key": "title", + "text": "Objetos" + }, + { + "language": "es", + "namespace": "objects", + "key": "add_object_button", + "text": "+ Agregar objeto" + }, + { + "language": "es", + "namespace": "objects", + "key": "tab_iiif", + "text": "Manifiesto IIIF" + }, + { + "language": "es", + "namespace": "objects", + "key": "add_iiif_url_label", + "text": "URL del manifiesto IIIF" + }, + { + "language": "es", + "namespace": "objects", + "key": "add_iiif_fetch", + "text": "Obtener manifiesto" + }, + { + "language": "es", + "namespace": "objects", + "key": "add_iiif_confirm", + "text": "Agregar objeto" + }, + { + "language": "es", + "namespace": "objects", + "key": "field_title", + "text": "Título" + }, + { + "language": "es", + "namespace": "objects", + "key": "field_creator", + "text": "Creador" + }, + { + "language": "es", + "namespace": "objects", + "key": "field_source", + "text": "Fuente" + }, + { + "language": "es", + "namespace": "objects", + "key": "field_credit", + "text": "Crédito" + }, + { + "language": "es", + "namespace": "objects", + "key": "field_alt_text", + "text": "Descripción para accesibilidad" + }, + { + "language": "es", + "namespace": "editor", + "key": "viewer.capture_position", + "text": "Capturar posición" + }, + { + "language": "es", + "namespace": "editor", + "key": "viewer.captured", + "text": "Capturada" + }, + { + "language": "es", + "namespace": "editor", + "key": "viewer.change_object", + "text": "Cambiar objeto" + }, + { + "language": "es", + "namespace": "editor", + "key": "step.add_step", + "text": "+ Agregar paso" + }, + { + "language": "es", + "namespace": "stories", + "key": "title", + "text": "Historias" + }, + { + "language": "es", + "namespace": "stories", + "key": "new_story_button", + "text": "+ Nueva historia" + }, + { + "language": "es", + "namespace": "stories", + "key": "save", + "text": "Guardar" + }, + { + "language": "en", + "namespace": "editor", + "key": "layer.add_panel", + "text": "+ Add panel" + }, + { + "language": "en", + "namespace": "editor", + "key": "stage.edit_panel_title", + "text": "Edit panel title" + }, + { + "language": "en", + "namespace": "editor", + "key": "stage.edit_panel_text", + "text": "Edit panel text" + }, + { + "language": "es", + "namespace": "editor", + "key": "layer.add_panel", + "text": "+ Agregar panel" + }, + { + "language": "es", + "namespace": "editor", + "key": "stage.edit_panel_title", + "text": "Editar título del panel" + }, + { + "language": "es", + "namespace": "editor", + "key": "stage.edit_panel_text", + "text": "Editar texto del panel" + }, + { + "language": "en", + "namespace": "objects", + "key": "field_year", + "text": "Year" + }, + { + "language": "en", + "namespace": "objects", + "key": "field_description", + "text": "Description" + }, + { + "language": "en", + "namespace": "editor", + "key": "step.new_step_dialog.choose", + "text": "Choose another object" + }, + { + "language": "en", + "namespace": "publish", + "key": "title", + "text": "Publish" + }, + { + "language": "es", + "namespace": "objects", + "key": "field_year", + "text": "Año" + }, + { + "language": "es", + "namespace": "objects", + "key": "field_description", + "text": "Descripción" + }, + { + "language": "es", + "namespace": "editor", + "key": "step.new_step_dialog.choose", + "text": "Elegir otro objeto" + }, + { + "language": "es", + "namespace": "publish", + "key": "title", + "text": "Publicar" + } + ], + "manifest": "https://juancobo.com/138la/iiif/khipu/p7/manifest.json", + "pilot_status": "Draft for copy review. Import preview checked in both languages. Existing khipu selected in an authorised unpublished draft step; framing captured and illustrated in both languages. Object creation, panel authoring and publishing remain to rehearse." +} diff --git a/_data/docs_anchor_aliases.json b/_data/docs_anchor_aliases.json new file mode 100644 index 0000000..06692f1 --- /dev/null +++ b/_data/docs_anchor_aliases.json @@ -0,0 +1,40 @@ +{ + "/docs/": { + "top": [ + "documentation" + ], + "planning": [ + "getting-started" + ], + "build": [ + "set-up-your-site" + ], + "reference": [ + "configure-your-site", + "customization", + "for-developers", + "site-features", + "your-content", + "your-data" + ] + }, + "/guia/": { + "top": [ + "documentación" + ], + "planning": [ + "primeros-pasos" + ], + "build": [ + "configura-tu-sitio" + ], + "reference": [ + "configura-tu-proyecto", + "funciones-del-sitio", + "para-desarrolladores", + "personalización", + "tu-contenido", + "tus-datos" + ] + } +} diff --git a/_data/docs_media.json b/_data/docs_media.json new file mode 100644 index 0000000..0344300 --- /dev/null +++ b/_data/docs_media.json @@ -0,0 +1,368 @@ +{ + "labels": { + "en": { + "play": "Play steps", + "stop": "Stop animation", + "open": "Open full-size screenshot", + "gif": "Download GIF" + }, + "es": { + "play": "Ver los pasos", + "stop": "Detener animación", + "open": "Ampliar captura", + "gif": "Descargar GIF" + } + }, + "items": { + "public-object": { + "en": { + "image": "/assets/manual/tutorials/en-public-object.jpg", + "width": 1280, + "height": 720, + "alt": "The khipu object page generated locally by Telar.", + "caption": "The local build produces a zoomable object page with its catalogue information and manifest link.", + "overview": false + }, + "es": { + "image": "/assets/manual/tutorials/es-public-object.jpg", + "width": 1280, + "height": 720, + "alt": "La página del khipu generada localmente por Telar.", + "caption": "El build local genera una página ampliable con la información de catálogo y el enlace al manifiesto.", + "overview": false + } + }, + "create-site": { + "en": { + "image": "/assets/manual/tutorials/en-create-site.jpg", + "width": 640, + "height": 550, + "alt": "The new-site form with repository name, visible title, language and theme.", + "caption": "Choose the repository name, title, language and theme before creating the site.", + "overview": false + }, + "es": { + "image": "/assets/manual/tutorials/es-create-site.jpg", + "width": 640, + "height": 550, + "alt": "El formulario del sitio con nombre de repositorio, título visible, idioma y tema.", + "caption": "Elige el nombre del repositorio, el título, el idioma y el tema antes de crear el sitio.", + "overview": false + } + }, + "objects": { + "en": { + "image": "/assets/manual/tutorials/en-objects.jpg", + "width": 1280, + "height": 664, + "alt": "The Objects list with thumbnails, IDs, usage counts, status and the Add object control.", + "caption": "Each row connects an object to its thumbnail, ID, usage and status. Filter the list or open an object to inspect it.", + "overview": false + }, + "es": { + "image": "/assets/manual/tutorials/es-objects.jpg", + "width": 1280, + "height": 664, + "alt": "La lista de Objetos con miniaturas, IDs, usos, estado y el control Agregar objeto.", + "caption": "Cada fila relaciona un objeto con su miniatura, ID, usos y estado. Filtra la lista o abre el objeto para revisarlo.", + "overview": false + } + }, + "object-metadata": { + "en": { + "image": "/assets/manual/tutorials/en-object-metadata.jpg", + "width": 1280, + "height": 664, + "alt": "The khipu image beside its title, description and catalogue fields.", + "caption": "The image and metadata describe the same khipu. Continue down the form for source, credit and accessibility text.", + "overview": false + }, + "es": { + "image": "/assets/manual/tutorials/es-object-metadata.jpg", + "width": 1280, + "height": 664, + "alt": "La imagen del khipu junto al título, la descripción y los campos de catálogo.", + "caption": "La imagen y los metadatos describen el mismo khipu. Más abajo están la fuente, el crédito y el texto de accesibilidad.", + "overview": false + } + }, + "editor-overview": { + "en": { + "image": "/assets/manual/tutorials/en-editor-overview.jpg", + "width": 1280, + "height": 622, + "alt": "The story outline, step card and khipu viewer in the Compositor.", + "caption": "The outline is on the left, the step text in the centre and the object on the right. Capture position records the view for the selected step.", + "overview": false + }, + "es": { + "image": "/assets/manual/tutorials/es-editor-overview.jpg", + "width": 1280, + "height": 580, + "alt": "El esquema de la historia, la tarjeta del paso y el visor del khipu en el Compositor.", + "caption": "A la izquierda está el esquema; en el centro, el texto del paso; a la derecha, el objeto. Capturar posición guarda la vista del paso seleccionado.", + "overview": false + } + }, + "glossary": { + "en": { + "image": "/assets/manual/tutorials/en-glossary.jpg", + "width": 1232, + "height": 540, + "alt": "A glossary term with its title, kind, ID, usage list, definition editor and reader preview.", + "caption": "The ID connects links to this entry. Edit the definition in the middle and check the reader preview on the right.", + "overview": false + }, + "es": { + "image": "/assets/manual/tutorials/es-glossary.jpg", + "width": 1232, + "height": 540, + "alt": "Un término del glosario con título, tipo, ID, usos, editor de definición y vista previa.", + "caption": "El ID relaciona los enlaces con esta entrada. Edita la definición en el centro y revisa la vista del lector a la derecha.", + "overview": false + } + }, + "pages": { + "en": { + "image": "/assets/manual/tutorials/en-pages.jpg", + "width": 1280, + "height": 664, + "alt": "A supporting page with its title, address and content below the navigation preview.", + "caption": "A supporting page has its own title, address and content. The menu preview above shows how readers will find it.", + "overview": false + }, + "es": { + "image": "/assets/manual/tutorials/es-pages.jpg", + "width": 1280, + "height": 664, + "alt": "Una página de apoyo con título, dirección y contenido bajo la vista previa del menú.", + "caption": "Cada página de apoyo tiene título, dirección y contenido propios. La vista previa superior muestra cómo la encontrará el público.", + "overview": false + } + }, + "homepage": { + "en": { + "image": "/assets/manual/tutorials/en-homepage.jpg", + "width": 1232, + "height": 585, + "alt": "The pinned Home entry selected beside the homepage title and description fields.", + "caption": "Choose the pinned Home entry to edit the introduction. Its editing position is separate from the order of the published menu.", + "overview": false + }, + "es": { + "image": "/assets/manual/tutorials/es-homepage.jpg", + "width": 1232, + "height": 585, + "alt": "La entrada Inicio seleccionada junto a los campos de título y descripción.", + "caption": "Selecciona Inicio en la barra lateral para editar la presentación. Su posición en el editor es independiente del orden del menú público.", + "overview": false + } + }, + "theme-language": { + "en": { + "image": "/assets/manual/tutorials/en-theme-language.jpg", + "width": 800, + "height": 580, + "alt": "Site theme swatches, logo field, exhibition language and hosting settings.", + "caption": "These settings affect the exhibition. The language here controls the site's interface; it does not translate your written content.", + "overview": false + }, + "es": { + "image": "/assets/manual/tutorials/es-theme-language.jpg", + "width": 800, + "height": 580, + "alt": "Los temas, el campo del logo, el idioma de la exhibición y los ajustes de alojamiento.", + "caption": "Estos ajustes afectan la exhibición. El idioma de esta página controla la interfaz del sitio; no traduce el contenido que escribiste.", + "overview": false + } + }, + "preferences": { + "en": { + "image": "/assets/manual/tutorials/en-preferences.jpg", + "width": 720, + "height": 268, + "alt": "Account Preferences with the English and Spanish interface-language options.", + "caption": "Account → Preferences changes the Compositor's interface language. The exhibition's language is a separate site setting.", + "overview": false + }, + "es": { + "image": "/assets/manual/tutorials/es-preferences.jpg", + "width": 720, + "height": 268, + "alt": "Preferencias de la cuenta con las opciones de idioma de interfaz EN y ES.", + "caption": "Cuenta → Preferencias cambia el idioma de la interfaz del Compositor. El idioma de la exhibición es un ajuste separado del sitio.", + "overview": false + } + }, + "stories": { + "en": { + "image": "/assets/manual/tutorials/en-stories.jpg", + "width": 1232, + "height": 555, + "alt": "The story list with order handles, Draft and Private switches and Edit links.", + "caption": "Draft excludes a story from publication; Private uses the site's key. Dragging a row changes the story order.", + "overview": false + }, + "es": { + "image": "/assets/manual/tutorials/es-stories.jpg", + "width": 1232, + "height": 555, + "alt": "La lista de historias con controles de orden, Borrador, Privada y Editar.", + "caption": "Borrador excluye una historia de la publicación; Privada utiliza la clave del sitio. Arrastrar una fila cambia el orden.", + "overview": false + } + }, + "panel-editor": { + "en": { + "image": "/assets/manual/tutorials/en-panel-editor.jpg", + "width": 640, + "height": 480, + "alt": "A contextual panel with its text editor and formatting toolbar open.", + "caption": "Click the panel text to enter editing mode. The toolbar offers formatting, links, images and other content controls.", + "overview": false + }, + "es": { + "image": "/assets/manual/tutorials/es-panel-editor.jpg", + "width": 640, + "height": 480, + "alt": "Un panel contextual con el editor de texto y su barra de formato abiertos.", + "caption": "Haz clic en el texto del panel para editarlo. La barra ofrece formato, enlaces, imágenes y otros controles de contenido.", + "overview": false + } + }, + "upgrade": { + "en": { + "image": "/assets/manual/tutorials/en-upgrade.jpg", + "width": 800, + "height": 460, + "alt": "An example upgrade notice comparing Telar 1.8.2 with 1.8.3.", + "caption": "An example version notice before publication. Compare the versions and review the proposed file changes; the versions shown will vary.", + "overview": false + }, + "es": { + "image": "/assets/manual/tutorials/es-upgrade.jpg", + "width": 800, + "height": 460, + "alt": "Un aviso de actualización que compara, como ejemplo, Telar 1.8.2 y 1.8.3.", + "caption": "Un ejemplo del aviso previo a publicar. Compara las versiones y revisa los archivos propuestos; los números cambian según tu sitio.", + "overview": false + } + }, + "external-media": { + "en": { + "image": "/assets/manual/tutorials/en-external-media.jpg", + "width": 512, + "height": 614, + "alt": "The External media form recognising a Vimeo address and showing a title and object ID.", + "caption": "External media recognises the host from its address. Add a useful title and check the object ID before adding it.", + "overview": false + }, + "es": { + "image": "/assets/manual/tutorials/es-external-media.jpg", + "width": 512, + "height": 614, + "alt": "El formulario Medio externo reconoce una dirección de Vimeo y muestra título e ID.", + "caption": "Medio externo reconoce el proveedor por la dirección. Agrega un título útil y revisa el ID antes de incorporarlo.", + "overview": false + } + }, + "public-home": { + "en": { + "image": "/assets/manual/tutorials/en-public-home.jpg", + "width": 1280, + "height": 1862, + "alt": "The full exhibition homepage with introduction, story cards, featured objects and navigation.", + "caption": "A complete homepage connects the introduction, story choices and object collection. Open the full-size image to examine the layout.", + "overview": true + }, + "es": { + "image": "/assets/manual/tutorials/es-public-home.jpg", + "width": 1280, + "height": 1830, + "alt": "La página de inicio completa con presentación, tarjetas de historias, objetos y navegación.", + "caption": "El inicio conecta la presentación, las historias y la colección de objetos. Abre la captura completa para examinar la organización.", + "overview": true + } + }, + "import": { + "en": { + "image": "/assets/manual/tutorials/en-import-poster.jpg", + "animation": "/assets/manual/tutorials/en-import.gif", + "width": 512, + "height": 640, + "alt": "The IIIF dialog moves from an empty URL to the pasted manifest and the fetched khipu preview.", + "caption": "Paste the manifest, fetch it, then check the returned khipu and metadata. Adding the object is a separate action.", + "bytes": 127917 + }, + "es": { + "image": "/assets/manual/tutorials/es-import-poster.jpg", + "animation": "/assets/manual/tutorials/es-import.gif", + "width": 512, + "height": 640, + "alt": "La ventana IIIF pasa de la URL vacía al manifiesto escrito y a la vista previa del khipu.", + "caption": "Pega el manifiesto, obtén los datos y revisa el khipu y sus metadatos. Agregar el objeto es una acción posterior.", + "bytes": 134700 + } + }, + "framing": { + "en": { + "image": "/assets/manual/tutorials/en-framing-poster.jpg", + "animation": "/assets/manual/tutorials/en-framing.gif", + "width": 612, + "height": 576, + "alt": "The khipu view changes, then Capture position confirms that it has been captured.", + "caption": "Adjust the view, choose Capture position and look for Captured. The same khipu is shown throughout.", + "bytes": 621200 + }, + "es": { + "image": "/assets/manual/tutorials/es-framing-poster.jpg", + "animation": "/assets/manual/tutorials/es-framing.gif", + "width": 612, + "height": 534, + "alt": "Cambia el encuadre del khipu y Capturar posición confirma que quedó guardado.", + "caption": "Ajusta la vista, pulsa Capturar posición y comprueba Capturada. Todo el recorrido muestra el mismo khipu.", + "bytes": 596146 + } + }, + "panels": { + "en": { + "image": "/assets/manual/tutorials/en-panels-poster.jpg", + "animation": "/assets/manual/tutorials/en-panels.gif", + "width": 900, + "height": 496, + "alt": "A story step opens its contextual panel alongside the main card.", + "caption": "Open the step's panel to develop its context. This example uses the existing map-and-painting story.", + "bytes": 470738 + }, + "es": { + "image": "/assets/manual/tutorials/es-panels-poster.jpg", + "animation": "/assets/manual/tutorials/es-panels.gif", + "width": 900, + "height": 496, + "alt": "Un paso abre su panel contextual junto a la tarjeta principal.", + "caption": "Abre el panel del paso para desarrollar el contexto. Este ejemplo usa la historia existente sobre el mapa y la pintura.", + "bytes": 465607 + } + }, + "coordinates": { + "en": { + "image": "/assets/manual/tutorials/en-coordinates-poster.jpg", + "animation": "/assets/manual/tutorials/en-coordinates.gif", + "width": 736, + "height": 600, + "alt": "The khipu is framed on its object page, then the coordinate panel copies X, Y and Zoom for Sheets.", + "caption": "Frame the khipu, scroll to the coordinate panel and copy the values for Sheets or CSV. This is a local example built with Telar.", + "bytes": 469459 + }, + "es": { + "image": "/assets/manual/tutorials/es-coordinates-poster.jpg", + "animation": "/assets/manual/tutorials/es-coordinates.gif", + "width": 736, + "height": 600, + "alt": "Se encuadra el khipu en su página y después se copian X, Y y Zoom desde el panel de coordenadas.", + "caption": "Encuadra el khipu, baja al panel y copia los valores para Sheets o CSV. Es un ejemplo local construido con Telar.", + "bytes": 466531 + } + } + } +} diff --git a/_data/docs_navigation.json b/_data/docs_navigation.json new file mode 100644 index 0000000..e4eead7 --- /dev/null +++ b/_data/docs_navigation.json @@ -0,0 +1,4598 @@ +{ + "routes": { + "en": { + "home": "/docs/", + "quick": "/start/", + "planning": "/docs/plan/", + "compositor": "/docs/the-compositor/", + "sheets": "/docs/google-sheets/", + "local": "/docs/local-authoring/", + "reference": "/docs/reference/", + "teaching": "/docs/teaching/", + "developers": "/docs/developers/", + "iiif": "/docs/the-compositor/iiif-to-story/" + }, + "es": { + "home": "/guia/", + "quick": "/empezar/", + "planning": "/guia/planear/", + "compositor": "/guia/el-compositor/", + "sheets": "/guia/google-sheets/", + "local": "/guia/autoria-local/", + "reference": "/guia/referencia/", + "teaching": "/guia/ensenar/", + "developers": "/guia/desarrolladores/", + "iiif": "/guia/el-compositor/iiif-a-historia/" + } + }, + "labels": { + "en": { + "browse": "Browse guides", + "contents": "In this guide", + "all_guides": "All guides", + "search": "Search the guides", + "close_search": "Close search", + "search_hint": "Search by task, feature or question.", + "search_unavailable": "Search is unavailable.", + "previous": "Previous", + "next": "Next", + "on_page": "On this page", + "copy_code": "Copy code", + "copied": "Copied", + "copy_link": "Copy link to this section", + "link_copied": "Section link copied", + "copy_failed": "Copy was unavailable. Select the text and copy it.", + "table": "Scrollable table", + "preview": "Documentation preview", + "reference": "Shared reference", + "help": "Help improve the guides", + "section": "Guide section", + "index": "Overview", + "code": "Code example", + "open_menu": "Guide contents", + "footer": "Telar is developed by Neogranadina, the UCSB Archives, Memory, and Preservation Lab, the UT Archives, Mapping, and Pedagogy Lab, and collaborators." + }, + "es": { + "browse": "Explora las guías", + "contents": "En esta guía", + "all_guides": "Todas las guías", + "search": "Busca en las guías", + "close_search": "Cerrar búsqueda", + "search_hint": "Busca por tarea, función o pregunta.", + "search_unavailable": "La búsqueda no está disponible.", + "previous": "Anterior", + "next": "Siguiente", + "on_page": "En esta página", + "copy_code": "Copiar código", + "copied": "Copiado", + "copy_link": "Copiar enlace a esta sección", + "link_copied": "Enlace de la sección copiado", + "copy_failed": "No se pudo copiar. Selecciona el texto y cópialo.", + "table": "Tabla desplazable", + "preview": "Vista previa de la documentación", + "reference": "Referencia compartida", + "help": "Ayuda a mejorar las guías", + "section": "Sección de la guía", + "index": "Presentación", + "code": "Ejemplo de código", + "open_menu": "Contenido de la guía", + "footer": "Telar lo desarrollan Neogranadina, el UCSB Archives, Memory, and Preservation Lab, el UT Archives, Mapping, and Pedagogy Lab y quienes colaboran con el proyecto." + } + }, + "order": [ + "quick", + "planning", + "compositor", + "sheets", + "local", + "reference", + "teaching", + "developers" + ], + "sections": { + "en": { + "quick": { + "id": "quick", + "title": "Workshop quick guide", + "url": "/start/", + "items": [ + { + "url": "/start/", + "title": "Workshop quick guide", + "section": "quick", + "group": "main", + "other_url": "/empezar/", + "path": "start.html" + } + ], + "groups": [ + { + "id": "main", + "title": "Guide contents", + "items": [ + { + "url": "/start/", + "title": "Workshop quick guide", + "section": "quick", + "group": "main", + "other_url": "/empezar/", + "path": "start.html" + } + ] + } + ] + }, + "planning": { + "id": "planning", + "title": "Plan an exhibition", + "url": "/docs/plan/", + "items": [ + { + "url": "/docs/plan/", + "title": "Plan an exhibition", + "section": "planning", + "group": "main", + "other_url": "/guia/planear/", + "path": "guides/planning.en.html" + }, + { + "url": "/docs/getting-started/narrative-structure/", + "title": "Sketch the narrative arc", + "section": "planning", + "group": "main", + "other_url": "/guia/primeros-pasos/estructura-narrativa/", + "path": "docs/1-4-narrative-structure.md" + }, + { + "url": "/docs/plan/sources-and-framing/", + "title": "Choose sources and framing", + "section": "planning", + "group": "main", + "other_url": "/guia/planear/fuentes-y-encuadres/", + "path": "guides/planning-sources.en.md" + }, + { + "url": "/docs/plan/layers-and-glossary/", + "title": "Plan panels and glossary links", + "section": "planning", + "group": "main", + "other_url": "/guia/planear/capas-y-glosario/", + "path": "guides/planning-layers.en.md" + }, + { + "url": "/docs/plan/exhibition-layout/", + "title": "Arrange the whole exhibition", + "section": "planning", + "group": "main", + "other_url": "/guia/planear/organizar-la-exhibicion/", + "path": "guides/planning-layout.en.md" + }, + { + "url": "/docs/plan/review/", + "title": "Test the exhibition with readers", + "section": "planning", + "group": "main", + "other_url": "/guia/planear/revision/", + "path": "guides/planning-review.en.md" + } + ], + "groups": [ + { + "id": "main", + "title": "Contents", + "items": [ + { + "url": "/docs/plan/", + "title": "Plan an exhibition", + "section": "planning", + "group": "main", + "other_url": "/guia/planear/", + "path": "guides/planning.en.html" + }, + { + "url": "/docs/getting-started/narrative-structure/", + "title": "Sketch the narrative arc", + "section": "planning", + "group": "main", + "other_url": "/guia/primeros-pasos/estructura-narrativa/", + "path": "docs/1-4-narrative-structure.md" + }, + { + "url": "/docs/plan/sources-and-framing/", + "title": "Choose sources and framing", + "section": "planning", + "group": "main", + "other_url": "/guia/planear/fuentes-y-encuadres/", + "path": "guides/planning-sources.en.md" + }, + { + "url": "/docs/plan/layers-and-glossary/", + "title": "Plan panels and glossary links", + "section": "planning", + "group": "main", + "other_url": "/guia/planear/capas-y-glosario/", + "path": "guides/planning-layers.en.md" + }, + { + "url": "/docs/plan/exhibition-layout/", + "title": "Arrange the whole exhibition", + "section": "planning", + "group": "main", + "other_url": "/guia/planear/organizar-la-exhibicion/", + "path": "guides/planning-layout.en.md" + }, + { + "url": "/docs/plan/review/", + "title": "Test the exhibition with readers", + "section": "planning", + "group": "main", + "other_url": "/guia/planear/revision/", + "path": "guides/planning-review.en.md" + } + ] + } + ] + }, + "compositor": { + "id": "compositor", + "title": "Compositor manual", + "url": "/docs/the-compositor/", + "items": [ + { + "url": "/docs/the-compositor/", + "title": "Compositor manual", + "section": "compositor", + "group": "main", + "other_url": "/guia/el-compositor/", + "path": "docs/9-0-compositor.md", + "order": 9 + }, + { + "url": "/docs/getting-started/compositor/", + "title": "Use the Compositor", + "section": "compositor", + "group": "begin", + "other_url": "/guia/primeros-pasos/compositor/", + "path": "docs/1-1-compositor.md", + "order": 1 + }, + { + "url": "/docs/the-compositor/getting-started/", + "title": "Connect an existing site", + "section": "compositor", + "group": "begin", + "other_url": "/guia/el-compositor/primeros-pasos/", + "path": "docs/9-1-getting-started.md", + "order": 1 + }, + { + "url": "/docs/the-compositor/dashboard/", + "title": "Start and navigation", + "section": "compositor", + "group": "begin", + "other_url": "/guia/el-compositor/panel-de-control/", + "path": "docs/9-2-dashboard.md", + "order": 2 + }, + { + "url": "/docs/the-compositor/objects/", + "title": "Objects", + "section": "compositor", + "group": "compose", + "other_url": "/guia/el-compositor/objetos/", + "path": "docs/9-3-objects.md", + "order": 3 + }, + { + "url": "/docs/the-compositor/iiif-to-story/", + "title": "Use an IIIF object in a story", + "section": "compositor", + "group": "compose", + "other_url": "/guia/el-compositor/iiif-a-historia/", + "path": "guides/iiif.en.md" + }, + { + "url": "/docs/the-compositor/story-editor/", + "title": "Story Editor", + "section": "compositor", + "group": "compose", + "other_url": "/guia/el-compositor/editor-historias/", + "path": "docs/9-4-story-editor.md", + "order": 4 + }, + { + "url": "/docs/the-compositor/video-audio/", + "title": "Video and Audio", + "section": "compositor", + "group": "compose", + "other_url": "/guia/el-compositor/video-y-audio/", + "path": "docs/9-5-video-audio.md", + "order": 5 + }, + { + "url": "/docs/the-compositor/glossary/", + "title": "Create and link glossary entries", + "section": "compositor", + "group": "exhibition", + "other_url": "/guia/el-compositor/glosario/", + "path": "guides/compositor-glossary.en.md" + }, + { + "url": "/docs/the-compositor/pages/", + "title": "Arrange the homepage and pages", + "section": "compositor", + "group": "exhibition", + "other_url": "/guia/el-compositor/paginas/", + "path": "guides/compositor-pages.en.md" + }, + { + "url": "/docs/the-compositor/settings/", + "title": "Adjust appearance and site settings", + "section": "compositor", + "group": "exhibition", + "other_url": "/guia/el-compositor/configuracion/", + "path": "guides/compositor-settings.en.md" + }, + { + "url": "/docs/the-compositor/team/", + "title": "Work with a team", + "section": "compositor", + "group": "team", + "other_url": "/guia/el-compositor/equipo/", + "path": "guides/compositor-team.en.md" + }, + { + "url": "/docs/the-compositor/courses/", + "title": "Run a course with student sites", + "section": "compositor", + "group": "team", + "other_url": "/guia/el-compositor/cursos/", + "path": "guides/compositor-courses.en.md" + }, + { + "url": "/docs/the-compositor/publishing/", + "title": "Publishing", + "section": "compositor", + "group": "publish", + "other_url": "/guia/el-compositor/publicacion/", + "path": "docs/9-6-publishing.md", + "order": 6 + }, + { + "url": "/docs/the-compositor/sync-updates/", + "title": "Sync and Updates", + "section": "compositor", + "group": "publish", + "other_url": "/guia/el-compositor/sincronizacion-y-actualizaciones/", + "path": "docs/9-7-sync-updates.md", + "order": 7 + }, + { + "url": "/docs/the-compositor/troubleshooting/", + "title": "Resolve problems and recover stories", + "section": "compositor", + "group": "publish", + "other_url": "/guia/el-compositor/solucionar-problemas/", + "path": "guides/compositor-recovery.en.md" + } + ], + "groups": [ + { + "id": "main", + "title": "Overview", + "items": [ + { + "url": "/docs/the-compositor/", + "title": "Compositor manual", + "section": "compositor", + "group": "main", + "other_url": "/guia/el-compositor/", + "path": "docs/9-0-compositor.md", + "order": 9 + } + ] + }, + { + "id": "begin", + "title": "Get started", + "items": [ + { + "url": "/docs/getting-started/compositor/", + "title": "Use the Compositor", + "section": "compositor", + "group": "begin", + "other_url": "/guia/primeros-pasos/compositor/", + "path": "docs/1-1-compositor.md", + "order": 1 + }, + { + "url": "/docs/the-compositor/getting-started/", + "title": "Connect an existing site", + "section": "compositor", + "group": "begin", + "other_url": "/guia/el-compositor/primeros-pasos/", + "path": "docs/9-1-getting-started.md", + "order": 1 + }, + { + "url": "/docs/the-compositor/dashboard/", + "title": "Start and navigation", + "section": "compositor", + "group": "begin", + "other_url": "/guia/el-compositor/panel-de-control/", + "path": "docs/9-2-dashboard.md", + "order": 2 + } + ] + }, + { + "id": "compose", + "title": "Sources and stories", + "items": [ + { + "url": "/docs/the-compositor/objects/", + "title": "Objects", + "section": "compositor", + "group": "compose", + "other_url": "/guia/el-compositor/objetos/", + "path": "docs/9-3-objects.md", + "order": 3 + }, + { + "url": "/docs/the-compositor/iiif-to-story/", + "title": "Use an IIIF object in a story", + "section": "compositor", + "group": "compose", + "other_url": "/guia/el-compositor/iiif-a-historia/", + "path": "guides/iiif.en.md" + }, + { + "url": "/docs/the-compositor/story-editor/", + "title": "Story Editor", + "section": "compositor", + "group": "compose", + "other_url": "/guia/el-compositor/editor-historias/", + "path": "docs/9-4-story-editor.md", + "order": 4 + }, + { + "url": "/docs/the-compositor/video-audio/", + "title": "Video and Audio", + "section": "compositor", + "group": "compose", + "other_url": "/guia/el-compositor/video-y-audio/", + "path": "docs/9-5-video-audio.md", + "order": 5 + } + ] + }, + { + "id": "exhibition", + "title": "The exhibition", + "items": [ + { + "url": "/docs/the-compositor/glossary/", + "title": "Create and link glossary entries", + "section": "compositor", + "group": "exhibition", + "other_url": "/guia/el-compositor/glosario/", + "path": "guides/compositor-glossary.en.md" + }, + { + "url": "/docs/the-compositor/pages/", + "title": "Arrange the homepage and pages", + "section": "compositor", + "group": "exhibition", + "other_url": "/guia/el-compositor/paginas/", + "path": "guides/compositor-pages.en.md" + }, + { + "url": "/docs/the-compositor/settings/", + "title": "Adjust appearance and site settings", + "section": "compositor", + "group": "exhibition", + "other_url": "/guia/el-compositor/configuracion/", + "path": "guides/compositor-settings.en.md" + } + ] + }, + { + "id": "team", + "title": "Team and courses", + "items": [ + { + "url": "/docs/the-compositor/team/", + "title": "Work with a team", + "section": "compositor", + "group": "team", + "other_url": "/guia/el-compositor/equipo/", + "path": "guides/compositor-team.en.md" + }, + { + "url": "/docs/the-compositor/courses/", + "title": "Run a course with student sites", + "section": "compositor", + "group": "team", + "other_url": "/guia/el-compositor/cursos/", + "path": "guides/compositor-courses.en.md" + } + ] + }, + { + "id": "publish", + "title": "Publish and maintain", + "items": [ + { + "url": "/docs/the-compositor/publishing/", + "title": "Publishing", + "section": "compositor", + "group": "publish", + "other_url": "/guia/el-compositor/publicacion/", + "path": "docs/9-6-publishing.md", + "order": 6 + }, + { + "url": "/docs/the-compositor/sync-updates/", + "title": "Sync and Updates", + "section": "compositor", + "group": "publish", + "other_url": "/guia/el-compositor/sincronizacion-y-actualizaciones/", + "path": "docs/9-7-sync-updates.md", + "order": 7 + }, + { + "url": "/docs/the-compositor/troubleshooting/", + "title": "Resolve problems and recover stories", + "section": "compositor", + "group": "publish", + "other_url": "/guia/el-compositor/solucionar-problemas/", + "path": "guides/compositor-recovery.en.md" + } + ] + } + ] + }, + "sheets": { + "id": "sheets", + "title": "Google Sheets manual", + "url": "/docs/google-sheets/", + "items": [ + { + "url": "/docs/google-sheets/", + "title": "Google Sheets manual", + "section": "sheets", + "group": "main", + "other_url": "/guia/google-sheets/", + "path": "guides/sheets.en.html" + }, + { + "url": "/docs/getting-started/google-sheets/", + "title": "Set Up with Google Sheets", + "section": "sheets", + "group": "main", + "other_url": "/guia/primeros-pasos/google-sheets/", + "path": "docs/1-2-google-sheets-option.md", + "order": 2 + }, + { + "url": "/docs/setup/manual/", + "title": "Manual Setup", + "section": "sheets", + "group": "main", + "other_url": "/guia/configuracion/configuracion-manual/", + "path": "docs/2-1-manual-setup.md", + "order": 1 + }, + { + "url": "/docs/your-data/google-sheets/", + "title": "Understand the spreadsheet", + "section": "sheets", + "group": "main", + "other_url": "/guia/tus-datos/google-sheets/", + "path": "docs/5-1-google-sheets.md", + "order": 1 + }, + { + "url": "/docs/getting-started/add-content/", + "title": "Add an object and a first story", + "section": "sheets", + "group": "main", + "other_url": "/guia/primeros-pasos/agrega-contenido/", + "path": "docs/1-5-add-content.md", + "order": 5 + }, + { + "url": "/docs/getting-started/review-refine/", + "title": "Frame, review and publish from Sheets", + "section": "sheets", + "group": "main", + "other_url": "/guia/primeros-pasos/revisa-y-perfecciona/", + "path": "docs/1-6-review-refine.md", + "order": 6 + } + ], + "groups": [ + { + "id": "main", + "title": "Guide contents", + "items": [ + { + "url": "/docs/google-sheets/", + "title": "Google Sheets manual", + "section": "sheets", + "group": "main", + "other_url": "/guia/google-sheets/", + "path": "guides/sheets.en.html" + }, + { + "url": "/docs/getting-started/google-sheets/", + "title": "Set Up with Google Sheets", + "section": "sheets", + "group": "main", + "other_url": "/guia/primeros-pasos/google-sheets/", + "path": "docs/1-2-google-sheets-option.md", + "order": 2 + }, + { + "url": "/docs/setup/manual/", + "title": "Manual Setup", + "section": "sheets", + "group": "main", + "other_url": "/guia/configuracion/configuracion-manual/", + "path": "docs/2-1-manual-setup.md", + "order": 1 + }, + { + "url": "/docs/your-data/google-sheets/", + "title": "Understand the spreadsheet", + "section": "sheets", + "group": "main", + "other_url": "/guia/tus-datos/google-sheets/", + "path": "docs/5-1-google-sheets.md", + "order": 1 + }, + { + "url": "/docs/getting-started/add-content/", + "title": "Add an object and a first story", + "section": "sheets", + "group": "main", + "other_url": "/guia/primeros-pasos/agrega-contenido/", + "path": "docs/1-5-add-content.md", + "order": 5 + }, + { + "url": "/docs/getting-started/review-refine/", + "title": "Frame, review and publish from Sheets", + "section": "sheets", + "group": "main", + "other_url": "/guia/primeros-pasos/revisa-y-perfecciona/", + "path": "docs/1-6-review-refine.md", + "order": 6 + } + ] + } + ] + }, + "local": { + "id": "local", + "title": "Local authoring & builds", + "url": "/docs/local-authoring/", + "items": [ + { + "url": "/docs/local-authoring/", + "title": "Local authoring & builds", + "section": "local", + "group": "main", + "other_url": "/guia/autoria-local/", + "path": "guides/local.en.html" + }, + { + "url": "/docs/getting-started/local-dev/", + "title": "Install and run Telar locally", + "section": "local", + "group": "main", + "other_url": "/guia/primeros-pasos/desarrollo-local/", + "path": "docs/1-3-local-dev.md", + "order": 3 + }, + { + "url": "/docs/local-authoring/content/", + "title": "Edit objects, stories and text files", + "section": "local", + "group": "main", + "other_url": "/guia/autoria-local/contenido/", + "path": "guides/local-content.en.md" + }, + { + "url": "/docs/local-authoring/preview/", + "title": "Rebuild and inspect the local site", + "section": "local", + "group": "main", + "other_url": "/guia/autoria-local/vista-previa/", + "path": "guides/local-preview.en.md" + }, + { + "url": "/docs/local-authoring/publish/", + "title": "Publish and maintain a local project", + "section": "local", + "group": "main", + "other_url": "/guia/autoria-local/publicar/", + "path": "guides/local-publish.en.md" + } + ], + "groups": [ + { + "id": "main", + "title": "Contents", + "items": [ + { + "url": "/docs/local-authoring/", + "title": "Local authoring & builds", + "section": "local", + "group": "main", + "other_url": "/guia/autoria-local/", + "path": "guides/local.en.html" + }, + { + "url": "/docs/getting-started/local-dev/", + "title": "Install and run Telar locally", + "section": "local", + "group": "main", + "other_url": "/guia/primeros-pasos/desarrollo-local/", + "path": "docs/1-3-local-dev.md", + "order": 3 + }, + { + "url": "/docs/local-authoring/content/", + "title": "Edit objects, stories and text files", + "section": "local", + "group": "main", + "other_url": "/guia/autoria-local/contenido/", + "path": "guides/local-content.en.md" + }, + { + "url": "/docs/local-authoring/preview/", + "title": "Rebuild and inspect the local site", + "section": "local", + "group": "main", + "other_url": "/guia/autoria-local/vista-previa/", + "path": "guides/local-preview.en.md" + }, + { + "url": "/docs/local-authoring/publish/", + "title": "Publish and maintain a local project", + "section": "local", + "group": "main", + "other_url": "/guia/autoria-local/publicar/", + "path": "guides/local-publish.en.md" + } + ] + } + ] + }, + "reference": { + "id": "reference", + "title": "Reference", + "url": "/docs/reference/", + "items": [ + { + "url": "/docs/setup/", + "title": "Set Up Your Site", + "section": "reference", + "group": "configuration", + "other_url": "/guia/configuracion/", + "path": "docs/2-0-setup.md", + "order": 2 + }, + { + "url": "/docs/setup/upgrading/", + "title": "Upgrading Telar", + "section": "reference", + "group": "support", + "other_url": "/guia/configuracion/actualizacion/", + "path": "docs/2-3-upgrading.md", + "order": 3 + }, + { + "url": "/docs/configure/", + "title": "Configure Your Site", + "section": "reference", + "group": "configuration", + "other_url": "/guia/configurar/", + "path": "docs/3-0-configure.md", + "order": 3 + }, + { + "url": "/docs/configure/config-generator/", + "title": "Config Generator and Editor", + "section": "reference", + "group": "configuration", + "other_url": "/guia/configurar/generador-de-configuracion/", + "path": "docs/3-1-config-generator.md", + "order": 1 + }, + { + "url": "/docs/configure/configuration/", + "title": "Configuration", + "section": "reference", + "group": "configuration", + "other_url": "/guia/configurar/configuracion/", + "path": "docs/3-2-configuration.md", + "order": 2 + }, + { + "url": "/docs/configure/config-validator/", + "title": "Config Validator", + "section": "reference", + "group": "configuration", + "other_url": "/guia/configurar/validador-de-configuracion/", + "path": "docs/3-3-config-validator.md", + "order": 3 + }, + { + "url": "/docs/your-content/", + "title": "Your Content", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/", + "path": "docs/4-0-your-content.md", + "order": 4 + }, + { + "url": "/docs/your-content/objects/", + "title": "Objects", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/objetos/", + "path": "docs/4-1-objects.md", + "order": 1 + }, + { + "url": "/docs/your-content/audio-objects/", + "title": "Audio Objects", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/objetos-de-audio/", + "path": "docs/4-10-audio-objects.md", + "order": 10 + }, + { + "url": "/docs/your-content/self-hosted-images/", + "title": "Self-Hosted Images", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/imagenes-autoalojadas/", + "path": "docs/4-2-self-hosted-images.md", + "order": 2 + }, + { + "url": "/docs/your-content/external-iiif/", + "title": "External IIIF Images", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/iiif-externo/", + "path": "docs/4-3-external-iiif.md", + "order": 3 + }, + { + "url": "/docs/your-content/stories-panels/", + "title": "Stories & Panels", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/historias-paneles/", + "path": "docs/4-4-stories-panels.md", + "order": 4 + }, + { + "url": "/docs/your-content/rich-content/", + "title": "Rich Content with Markdown", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/contenido-enriquecido/", + "path": "docs/4-5-rich-content.md", + "order": 5 + }, + { + "url": "/docs/your-content/markdown-syntax/", + "title": "Markdown Syntax Reference", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/sintaxis-markdown/", + "path": "docs/4-6-markdown-syntax.md", + "order": 6 + }, + { + "url": "/docs/your-content/widgets/", + "title": "Widgets", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/widgets/", + "path": "docs/4-7-widgets.md", + "order": 7 + }, + { + "url": "/docs/your-content/pdf-documents/", + "title": "PDF Documents", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/documentos-pdf/", + "path": "docs/4-8-pdf-documents.md", + "order": 8 + }, + { + "url": "/docs/your-content/video-objects/", + "title": "Video Objects", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/objetos-de-video/", + "path": "docs/4-9-video-objects.md", + "order": 9 + }, + { + "url": "/docs/your-data/", + "title": "Your Data", + "section": "reference", + "group": "data", + "other_url": "/guia/tus-datos/", + "path": "docs/5-0-your-data.md", + "order": 5 + }, + { + "url": "/docs/your-data/csv-project/", + "title": "Project Columns", + "section": "reference", + "group": "data", + "other_url": "/guia/tus-datos/csv-proyecto/", + "path": "docs/5-2-csv-project.md", + "order": 2 + }, + { + "url": "/docs/your-data/csv-objects/", + "title": "Object Columns", + "section": "reference", + "group": "data", + "other_url": "/guia/tus-datos/csv-objetos/", + "path": "docs/5-3-csv-objects.md", + "order": 3 + }, + { + "url": "/docs/your-data/csv-stories/", + "title": "Story Columns", + "section": "reference", + "group": "data", + "other_url": "/guia/tus-datos/csv-historias/", + "path": "docs/5-4-csv-stories.md", + "order": 4 + }, + { + "url": "/docs/your-data/csv-glossary/", + "title": "Glossary Columns", + "section": "reference", + "group": "data", + "other_url": "/guia/tus-datos/csv-glosario/", + "path": "docs/5-5-csv-glossary.md", + "order": 5 + }, + { + "url": "/docs/site-features/", + "title": "Site Features", + "section": "reference", + "group": "features", + "other_url": "/guia/funciones/", + "path": "docs/6-0-site-features.md", + "order": 6 + }, + { + "url": "/docs/site-features/objects-gallery/", + "title": "Objects Gallery", + "section": "reference", + "group": "features", + "other_url": "/guia/funciones/galeria-objetos/", + "path": "docs/6-1-objects-gallery.md", + "order": 1 + }, + { + "url": "/docs/site-features/glossary/", + "title": "Glossary", + "section": "reference", + "group": "features", + "other_url": "/guia/funciones/glosario/", + "path": "docs/6-2-glossary.md", + "order": 2 + }, + { + "url": "/docs/site-features/private-stories/", + "title": "Private Stories", + "section": "reference", + "group": "features", + "other_url": "/guia/funciones/historias-privadas/", + "path": "docs/6-3-private-stories.md", + "order": 3 + }, + { + "url": "/docs/site-features/custom-pages/", + "title": "Custom Pages", + "section": "reference", + "group": "features", + "other_url": "/guia/funciones/paginas-personalizadas/", + "path": "docs/6-4-custom-pages.md", + "order": 4 + }, + { + "url": "/docs/site-features/embedding/", + "title": "Embedding Telar Stories in LMS & Websites", + "section": "reference", + "group": "features", + "other_url": "/guia/funciones/insercion/", + "path": "docs/6-5-embedding.md", + "order": 5 + }, + { + "url": "/docs/customization/", + "title": "Customization", + "section": "reference", + "group": "appearance", + "other_url": "/guia/personalizacion/", + "path": "docs/7-0-customization.md", + "order": 7 + }, + { + "url": "/docs/customization/themes/", + "title": "Themes", + "section": "reference", + "group": "appearance", + "other_url": "/guia/personalizacion/temas/", + "path": "docs/7-1-themes.md", + "order": 1 + }, + { + "url": "/docs/customization/home-page/", + "title": "Customizing the Home Page", + "section": "reference", + "group": "appearance", + "other_url": "/guia/personalizacion/pagina-de-inicio/", + "path": "docs/7-2-home-page.md", + "order": 2 + }, + { + "url": "/docs/customization/navigation-menu/", + "title": "Navigation Menu Configuration", + "section": "reference", + "group": "appearance", + "other_url": "/guia/personalizacion/menu-navegacion/", + "path": "docs/7-3-navigation-menu.md", + "order": 3 + }, + { + "url": "/docs/customization/demo-content/", + "title": "Demo Content", + "section": "reference", + "group": "appearance", + "other_url": "/guia/personalizacion/contenido-demostracion/", + "path": "docs/7-4-demo-content.md", + "order": 4 + }, + { + "url": "/docs/reference/", + "title": "Reference", + "section": "reference", + "group": "main", + "other_url": "/guia/referencia/", + "path": "guides/reference.en.html" + } + ], + "groups": [ + { + "id": "configuration", + "title": "Configuration and hosting", + "items": [ + { + "url": "/docs/setup/", + "title": "Set Up Your Site", + "section": "reference", + "group": "configuration", + "other_url": "/guia/configuracion/", + "path": "docs/2-0-setup.md", + "order": 2 + }, + { + "url": "/docs/configure/", + "title": "Configure Your Site", + "section": "reference", + "group": "configuration", + "other_url": "/guia/configurar/", + "path": "docs/3-0-configure.md", + "order": 3 + }, + { + "url": "/docs/configure/config-generator/", + "title": "Config Generator and Editor", + "section": "reference", + "group": "configuration", + "other_url": "/guia/configurar/generador-de-configuracion/", + "path": "docs/3-1-config-generator.md", + "order": 1 + }, + { + "url": "/docs/configure/configuration/", + "title": "Configuration", + "section": "reference", + "group": "configuration", + "other_url": "/guia/configurar/configuracion/", + "path": "docs/3-2-configuration.md", + "order": 2 + }, + { + "url": "/docs/configure/config-validator/", + "title": "Config Validator", + "section": "reference", + "group": "configuration", + "other_url": "/guia/configurar/validador-de-configuracion/", + "path": "docs/3-3-config-validator.md", + "order": 3 + } + ] + }, + { + "id": "content", + "title": "Sources and content", + "items": [ + { + "url": "/docs/your-content/", + "title": "Your Content", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/", + "path": "docs/4-0-your-content.md", + "order": 4 + }, + { + "url": "/docs/your-content/objects/", + "title": "Objects", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/objetos/", + "path": "docs/4-1-objects.md", + "order": 1 + }, + { + "url": "/docs/your-content/audio-objects/", + "title": "Audio Objects", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/objetos-de-audio/", + "path": "docs/4-10-audio-objects.md", + "order": 10 + }, + { + "url": "/docs/your-content/self-hosted-images/", + "title": "Self-Hosted Images", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/imagenes-autoalojadas/", + "path": "docs/4-2-self-hosted-images.md", + "order": 2 + }, + { + "url": "/docs/your-content/external-iiif/", + "title": "External IIIF Images", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/iiif-externo/", + "path": "docs/4-3-external-iiif.md", + "order": 3 + }, + { + "url": "/docs/your-content/stories-panels/", + "title": "Stories & Panels", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/historias-paneles/", + "path": "docs/4-4-stories-panels.md", + "order": 4 + }, + { + "url": "/docs/your-content/rich-content/", + "title": "Rich Content with Markdown", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/contenido-enriquecido/", + "path": "docs/4-5-rich-content.md", + "order": 5 + }, + { + "url": "/docs/your-content/markdown-syntax/", + "title": "Markdown Syntax Reference", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/sintaxis-markdown/", + "path": "docs/4-6-markdown-syntax.md", + "order": 6 + }, + { + "url": "/docs/your-content/widgets/", + "title": "Widgets", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/widgets/", + "path": "docs/4-7-widgets.md", + "order": 7 + }, + { + "url": "/docs/your-content/pdf-documents/", + "title": "PDF Documents", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/documentos-pdf/", + "path": "docs/4-8-pdf-documents.md", + "order": 8 + }, + { + "url": "/docs/your-content/video-objects/", + "title": "Video Objects", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/objetos-de-video/", + "path": "docs/4-9-video-objects.md", + "order": 9 + } + ] + }, + { + "id": "data", + "title": "Data formats", + "items": [ + { + "url": "/docs/your-data/", + "title": "Your Data", + "section": "reference", + "group": "data", + "other_url": "/guia/tus-datos/", + "path": "docs/5-0-your-data.md", + "order": 5 + }, + { + "url": "/docs/your-data/csv-project/", + "title": "Project Columns", + "section": "reference", + "group": "data", + "other_url": "/guia/tus-datos/csv-proyecto/", + "path": "docs/5-2-csv-project.md", + "order": 2 + }, + { + "url": "/docs/your-data/csv-objects/", + "title": "Object Columns", + "section": "reference", + "group": "data", + "other_url": "/guia/tus-datos/csv-objetos/", + "path": "docs/5-3-csv-objects.md", + "order": 3 + }, + { + "url": "/docs/your-data/csv-stories/", + "title": "Story Columns", + "section": "reference", + "group": "data", + "other_url": "/guia/tus-datos/csv-historias/", + "path": "docs/5-4-csv-stories.md", + "order": 4 + }, + { + "url": "/docs/your-data/csv-glossary/", + "title": "Glossary Columns", + "section": "reference", + "group": "data", + "other_url": "/guia/tus-datos/csv-glosario/", + "path": "docs/5-5-csv-glossary.md", + "order": 5 + } + ] + }, + { + "id": "features", + "title": "Reader features", + "items": [ + { + "url": "/docs/site-features/", + "title": "Site Features", + "section": "reference", + "group": "features", + "other_url": "/guia/funciones/", + "path": "docs/6-0-site-features.md", + "order": 6 + }, + { + "url": "/docs/site-features/objects-gallery/", + "title": "Objects Gallery", + "section": "reference", + "group": "features", + "other_url": "/guia/funciones/galeria-objetos/", + "path": "docs/6-1-objects-gallery.md", + "order": 1 + }, + { + "url": "/docs/site-features/glossary/", + "title": "Glossary", + "section": "reference", + "group": "features", + "other_url": "/guia/funciones/glosario/", + "path": "docs/6-2-glossary.md", + "order": 2 + }, + { + "url": "/docs/site-features/private-stories/", + "title": "Private Stories", + "section": "reference", + "group": "features", + "other_url": "/guia/funciones/historias-privadas/", + "path": "docs/6-3-private-stories.md", + "order": 3 + }, + { + "url": "/docs/site-features/custom-pages/", + "title": "Custom Pages", + "section": "reference", + "group": "features", + "other_url": "/guia/funciones/paginas-personalizadas/", + "path": "docs/6-4-custom-pages.md", + "order": 4 + }, + { + "url": "/docs/site-features/embedding/", + "title": "Embedding Telar Stories in LMS & Websites", + "section": "reference", + "group": "features", + "other_url": "/guia/funciones/insercion/", + "path": "docs/6-5-embedding.md", + "order": 5 + } + ] + }, + { + "id": "appearance", + "title": "Appearance and navigation", + "items": [ + { + "url": "/docs/customization/", + "title": "Customization", + "section": "reference", + "group": "appearance", + "other_url": "/guia/personalizacion/", + "path": "docs/7-0-customization.md", + "order": 7 + }, + { + "url": "/docs/customization/themes/", + "title": "Themes", + "section": "reference", + "group": "appearance", + "other_url": "/guia/personalizacion/temas/", + "path": "docs/7-1-themes.md", + "order": 1 + }, + { + "url": "/docs/customization/home-page/", + "title": "Customizing the Home Page", + "section": "reference", + "group": "appearance", + "other_url": "/guia/personalizacion/pagina-de-inicio/", + "path": "docs/7-2-home-page.md", + "order": 2 + }, + { + "url": "/docs/customization/navigation-menu/", + "title": "Navigation Menu Configuration", + "section": "reference", + "group": "appearance", + "other_url": "/guia/personalizacion/menu-navegacion/", + "path": "docs/7-3-navigation-menu.md", + "order": 3 + }, + { + "url": "/docs/customization/demo-content/", + "title": "Demo Content", + "section": "reference", + "group": "appearance", + "other_url": "/guia/personalizacion/contenido-demostracion/", + "path": "docs/7-4-demo-content.md", + "order": 4 + } + ] + }, + { + "id": "support", + "title": "Maintenance", + "items": [ + { + "url": "/docs/setup/upgrading/", + "title": "Upgrading Telar", + "section": "reference", + "group": "support", + "other_url": "/guia/configuracion/actualizacion/", + "path": "docs/2-3-upgrading.md", + "order": 3 + } + ] + }, + { + "id": "main", + "title": "Guide contents", + "items": [ + { + "url": "/docs/reference/", + "title": "Reference", + "section": "reference", + "group": "main", + "other_url": "/guia/referencia/", + "path": "guides/reference.en.html" + } + ] + } + ] + }, + "teaching": { + "id": "teaching", + "title": "Teaching with Telar", + "url": "/docs/teaching/", + "items": [ + { + "url": "/docs/teaching/", + "title": "Teaching with Telar", + "section": "teaching", + "group": "main", + "other_url": "/guia/ensenar/", + "path": "guides/teaching.en.html" + }, + { + "url": "/docs/teaching/request-access/", + "title": "Request teaching-mode access", + "section": "teaching", + "group": "main", + "other_url": "/guia/ensenar/solicitar-acceso/", + "path": "guides/teaching-request.en.html" + } + ], + "groups": [ + { + "id": "main", + "title": "Guide contents", + "items": [ + { + "url": "/docs/teaching/", + "title": "Teaching with Telar", + "section": "teaching", + "group": "main", + "other_url": "/guia/ensenar/", + "path": "guides/teaching.en.html" + }, + { + "url": "/docs/teaching/request-access/", + "title": "Request teaching-mode access", + "section": "teaching", + "group": "main", + "other_url": "/guia/ensenar/solicitar-acceso/", + "path": "guides/teaching-request.en.html" + } + ] + } + ] + }, + "developers": { + "id": "developers", + "title": "For developers", + "url": "/docs/developers/", + "items": [ + { + "url": "/docs/developers/", + "title": "For Developers", + "section": "developers", + "group": "main", + "other_url": "/guia/desarrolladores/", + "path": "docs/8-0-for-developers.md", + "order": 8 + }, + { + "url": "/docs/developers/local-development/", + "title": "Local Development", + "section": "developers", + "group": "main", + "other_url": "/guia/desarrolladores/desarrollo-local/", + "path": "docs/8-1-local-development.md", + "order": 1 + }, + { + "url": "/docs/developers/github-actions/", + "title": "GitHub Actions Workflow", + "section": "developers", + "group": "main", + "other_url": "/guia/desarrolladores/github-actions/", + "path": "docs/8-2-github-actions.md", + "order": 2 + }, + { + "url": "/docs/developers/demo-system/", + "title": "Demo System Architecture", + "section": "developers", + "group": "main", + "other_url": "/guia/desarrolladores/sistema-demos/", + "path": "docs/8-3-demo-system-architecture.md", + "order": 3 + }, + { + "url": "/docs/developers/embedding-system/", + "title": "Embedding System Reference", + "section": "developers", + "group": "main", + "other_url": "/guia/desarrolladores/sistema-insercion/", + "path": "docs/8-4-embedding-system.md", + "order": 4 + }, + { + "url": "/docs/developers/styling/", + "title": "Advanced Styling", + "section": "developers", + "group": "main", + "other_url": "/guia/desarrolladores/estilos/", + "path": "docs/8-5-styling.md", + "order": 5 + }, + { + "url": "/docs/developers/mobile/", + "title": "Layouts and Small Screens", + "section": "developers", + "group": "main", + "other_url": "/guia/desarrolladores/moviles/", + "path": "docs/8-6-mobile.md", + "order": 6 + }, + { + "url": "/docs/developers/story-engine/", + "title": "Story Engine Vocabulary", + "section": "developers", + "group": "main", + "other_url": "/guia/desarrolladores/motor-de-historias/", + "path": "docs/8-7-story-engine.md", + "order": 7 + } + ], + "groups": [ + { + "id": "main", + "title": "Guide contents", + "items": [ + { + "url": "/docs/developers/", + "title": "For Developers", + "section": "developers", + "group": "main", + "other_url": "/guia/desarrolladores/", + "path": "docs/8-0-for-developers.md", + "order": 8 + }, + { + "url": "/docs/developers/local-development/", + "title": "Local Development", + "section": "developers", + "group": "main", + "other_url": "/guia/desarrolladores/desarrollo-local/", + "path": "docs/8-1-local-development.md", + "order": 1 + }, + { + "url": "/docs/developers/github-actions/", + "title": "GitHub Actions Workflow", + "section": "developers", + "group": "main", + "other_url": "/guia/desarrolladores/github-actions/", + "path": "docs/8-2-github-actions.md", + "order": 2 + }, + { + "url": "/docs/developers/demo-system/", + "title": "Demo System Architecture", + "section": "developers", + "group": "main", + "other_url": "/guia/desarrolladores/sistema-demos/", + "path": "docs/8-3-demo-system-architecture.md", + "order": 3 + }, + { + "url": "/docs/developers/embedding-system/", + "title": "Embedding System Reference", + "section": "developers", + "group": "main", + "other_url": "/guia/desarrolladores/sistema-insercion/", + "path": "docs/8-4-embedding-system.md", + "order": 4 + }, + { + "url": "/docs/developers/styling/", + "title": "Advanced Styling", + "section": "developers", + "group": "main", + "other_url": "/guia/desarrolladores/estilos/", + "path": "docs/8-5-styling.md", + "order": 5 + }, + { + "url": "/docs/developers/mobile/", + "title": "Layouts and Small Screens", + "section": "developers", + "group": "main", + "other_url": "/guia/desarrolladores/moviles/", + "path": "docs/8-6-mobile.md", + "order": 6 + }, + { + "url": "/docs/developers/story-engine/", + "title": "Story Engine Vocabulary", + "section": "developers", + "group": "main", + "other_url": "/guia/desarrolladores/motor-de-historias/", + "path": "docs/8-7-story-engine.md", + "order": 7 + } + ] + } + ] + }, + "guides": { + "id": "guides", + "title": "Guides", + "url": "/docs/", + "items": [], + "groups": [] + } + }, + "es": { + "quick": { + "id": "quick", + "title": "Guía rápida para talleres", + "url": "/empezar/", + "items": [ + { + "url": "/empezar/", + "title": "Guía rápida para talleres", + "section": "quick", + "group": "main", + "other_url": "/start/", + "path": "empezar.html" + } + ], + "groups": [ + { + "id": "main", + "title": "Contenido de la guía", + "items": [ + { + "url": "/empezar/", + "title": "Guía rápida para talleres", + "section": "quick", + "group": "main", + "other_url": "/start/", + "path": "empezar.html" + } + ] + } + ] + }, + "planning": { + "id": "planning", + "title": "Planear una exhibición", + "url": "/guia/planear/", + "items": [ + { + "url": "/guia/planear/", + "title": "Planear una exhibición", + "section": "planning", + "group": "main", + "other_url": "/docs/plan/", + "path": "guides/planning.es.html" + }, + { + "url": "/guia/primeros-pasos/estructura-narrativa/", + "title": "Planea el recorrido de la historia", + "section": "planning", + "group": "main", + "other_url": "/docs/getting-started/narrative-structure/", + "path": "docs/1-4-narrative-structure.es.md" + }, + { + "url": "/guia/planear/fuentes-y-encuadres/", + "title": "Elige fuentes y encuadres", + "section": "planning", + "group": "main", + "other_url": "/docs/plan/sources-and-framing/", + "path": "guides/planning-sources.es.md" + }, + { + "url": "/guia/planear/capas-y-glosario/", + "title": "Planea los paneles y el glosario", + "section": "planning", + "group": "main", + "other_url": "/docs/plan/layers-and-glossary/", + "path": "guides/planning-layers.es.md" + }, + { + "url": "/guia/planear/organizar-la-exhibicion/", + "title": "Organiza toda la exhibición", + "section": "planning", + "group": "main", + "other_url": "/docs/plan/exhibition-layout/", + "path": "guides/planning-layout.es.md" + }, + { + "url": "/guia/planear/revision/", + "title": "Prueba la exhibición con lectores", + "section": "planning", + "group": "main", + "other_url": "/docs/plan/review/", + "path": "guides/planning-review.es.md" + } + ], + "groups": [ + { + "id": "main", + "title": "Contenido", + "items": [ + { + "url": "/guia/planear/", + "title": "Planear una exhibición", + "section": "planning", + "group": "main", + "other_url": "/docs/plan/", + "path": "guides/planning.es.html" + }, + { + "url": "/guia/primeros-pasos/estructura-narrativa/", + "title": "Planea el recorrido de la historia", + "section": "planning", + "group": "main", + "other_url": "/docs/getting-started/narrative-structure/", + "path": "docs/1-4-narrative-structure.es.md" + }, + { + "url": "/guia/planear/fuentes-y-encuadres/", + "title": "Elige fuentes y encuadres", + "section": "planning", + "group": "main", + "other_url": "/docs/plan/sources-and-framing/", + "path": "guides/planning-sources.es.md" + }, + { + "url": "/guia/planear/capas-y-glosario/", + "title": "Planea los paneles y el glosario", + "section": "planning", + "group": "main", + "other_url": "/docs/plan/layers-and-glossary/", + "path": "guides/planning-layers.es.md" + }, + { + "url": "/guia/planear/organizar-la-exhibicion/", + "title": "Organiza toda la exhibición", + "section": "planning", + "group": "main", + "other_url": "/docs/plan/exhibition-layout/", + "path": "guides/planning-layout.es.md" + }, + { + "url": "/guia/planear/revision/", + "title": "Prueba la exhibición con lectores", + "section": "planning", + "group": "main", + "other_url": "/docs/plan/review/", + "path": "guides/planning-review.es.md" + } + ] + } + ] + }, + "compositor": { + "id": "compositor", + "title": "Manual del Compositor", + "url": "/guia/el-compositor/", + "items": [ + { + "url": "/guia/el-compositor/", + "title": "Manual del Compositor", + "section": "compositor", + "group": "main", + "other_url": "/docs/the-compositor/", + "path": "docs/9-0-compositor.es.md", + "order": 9 + }, + { + "url": "/guia/primeros-pasos/compositor/", + "title": "Usa el Compositor", + "section": "compositor", + "group": "begin", + "other_url": "/docs/getting-started/compositor/", + "path": "docs/1-1-compositor.es.md", + "order": 1 + }, + { + "url": "/guia/el-compositor/primeros-pasos/", + "title": "Conectar un sitio existente", + "section": "compositor", + "group": "begin", + "other_url": "/docs/the-compositor/getting-started/", + "path": "docs/9-1-getting-started.es.md", + "order": 1 + }, + { + "url": "/guia/el-compositor/panel-de-control/", + "title": "Inicio y navegación", + "section": "compositor", + "group": "begin", + "other_url": "/docs/the-compositor/dashboard/", + "path": "docs/9-2-dashboard.es.md", + "order": 2 + }, + { + "url": "/guia/el-compositor/objetos/", + "title": "Objetos", + "section": "compositor", + "group": "compose", + "other_url": "/docs/the-compositor/objects/", + "path": "docs/9-3-objects.es.md", + "order": 3 + }, + { + "url": "/guia/el-compositor/iiif-a-historia/", + "title": "Usar un objeto IIIF en una historia", + "section": "compositor", + "group": "compose", + "other_url": "/docs/the-compositor/iiif-to-story/", + "path": "guides/iiif.es.md" + }, + { + "url": "/guia/el-compositor/editor-historias/", + "title": "Editor de historias", + "section": "compositor", + "group": "compose", + "other_url": "/docs/the-compositor/story-editor/", + "path": "docs/9-4-story-editor.es.md", + "order": 4 + }, + { + "url": "/guia/el-compositor/video-y-audio/", + "title": "Video y audio", + "section": "compositor", + "group": "compose", + "other_url": "/docs/the-compositor/video-audio/", + "path": "docs/9-5-video-audio.es.md", + "order": 5 + }, + { + "url": "/guia/el-compositor/glosario/", + "title": "Crea y enlaza entradas del glosario", + "section": "compositor", + "group": "exhibition", + "other_url": "/docs/the-compositor/glossary/", + "path": "guides/compositor-glossary.es.md" + }, + { + "url": "/guia/el-compositor/paginas/", + "title": "Organiza el inicio y las páginas", + "section": "compositor", + "group": "exhibition", + "other_url": "/docs/the-compositor/pages/", + "path": "guides/compositor-pages.es.md" + }, + { + "url": "/guia/el-compositor/configuracion/", + "title": "Ajusta la apariencia y la configuración", + "section": "compositor", + "group": "exhibition", + "other_url": "/docs/the-compositor/settings/", + "path": "guides/compositor-settings.es.md" + }, + { + "url": "/guia/el-compositor/equipo/", + "title": "Trabaja en equipo", + "section": "compositor", + "group": "team", + "other_url": "/docs/the-compositor/team/", + "path": "guides/compositor-team.es.md" + }, + { + "url": "/guia/el-compositor/cursos/", + "title": "Organiza un curso con sitios de estudiantes", + "section": "compositor", + "group": "team", + "other_url": "/docs/the-compositor/courses/", + "path": "guides/compositor-courses.es.md" + }, + { + "url": "/guia/el-compositor/publicacion/", + "title": "Publicación", + "section": "compositor", + "group": "publish", + "other_url": "/docs/the-compositor/publishing/", + "path": "docs/9-6-publishing.es.md", + "order": 6 + }, + { + "url": "/guia/el-compositor/sincronizacion-y-actualizaciones/", + "title": "Sincronización y actualizaciones", + "section": "compositor", + "group": "publish", + "other_url": "/docs/the-compositor/sync-updates/", + "path": "docs/9-7-sync-updates.es.md", + "order": 7 + }, + { + "url": "/guia/el-compositor/solucionar-problemas/", + "title": "Resuelve problemas y recupera historias", + "section": "compositor", + "group": "publish", + "other_url": "/docs/the-compositor/troubleshooting/", + "path": "guides/compositor-recovery.es.md" + } + ], + "groups": [ + { + "id": "main", + "title": "Presentación", + "items": [ + { + "url": "/guia/el-compositor/", + "title": "Manual del Compositor", + "section": "compositor", + "group": "main", + "other_url": "/docs/the-compositor/", + "path": "docs/9-0-compositor.es.md", + "order": 9 + } + ] + }, + { + "id": "begin", + "title": "Comenzar", + "items": [ + { + "url": "/guia/primeros-pasos/compositor/", + "title": "Usa el Compositor", + "section": "compositor", + "group": "begin", + "other_url": "/docs/getting-started/compositor/", + "path": "docs/1-1-compositor.es.md", + "order": 1 + }, + { + "url": "/guia/el-compositor/primeros-pasos/", + "title": "Conectar un sitio existente", + "section": "compositor", + "group": "begin", + "other_url": "/docs/the-compositor/getting-started/", + "path": "docs/9-1-getting-started.es.md", + "order": 1 + }, + { + "url": "/guia/el-compositor/panel-de-control/", + "title": "Inicio y navegación", + "section": "compositor", + "group": "begin", + "other_url": "/docs/the-compositor/dashboard/", + "path": "docs/9-2-dashboard.es.md", + "order": 2 + } + ] + }, + { + "id": "compose", + "title": "Fuentes e historias", + "items": [ + { + "url": "/guia/el-compositor/objetos/", + "title": "Objetos", + "section": "compositor", + "group": "compose", + "other_url": "/docs/the-compositor/objects/", + "path": "docs/9-3-objects.es.md", + "order": 3 + }, + { + "url": "/guia/el-compositor/iiif-a-historia/", + "title": "Usar un objeto IIIF en una historia", + "section": "compositor", + "group": "compose", + "other_url": "/docs/the-compositor/iiif-to-story/", + "path": "guides/iiif.es.md" + }, + { + "url": "/guia/el-compositor/editor-historias/", + "title": "Editor de historias", + "section": "compositor", + "group": "compose", + "other_url": "/docs/the-compositor/story-editor/", + "path": "docs/9-4-story-editor.es.md", + "order": 4 + }, + { + "url": "/guia/el-compositor/video-y-audio/", + "title": "Video y audio", + "section": "compositor", + "group": "compose", + "other_url": "/docs/the-compositor/video-audio/", + "path": "docs/9-5-video-audio.es.md", + "order": 5 + } + ] + }, + { + "id": "exhibition", + "title": "La exhibición", + "items": [ + { + "url": "/guia/el-compositor/glosario/", + "title": "Crea y enlaza entradas del glosario", + "section": "compositor", + "group": "exhibition", + "other_url": "/docs/the-compositor/glossary/", + "path": "guides/compositor-glossary.es.md" + }, + { + "url": "/guia/el-compositor/paginas/", + "title": "Organiza el inicio y las páginas", + "section": "compositor", + "group": "exhibition", + "other_url": "/docs/the-compositor/pages/", + "path": "guides/compositor-pages.es.md" + }, + { + "url": "/guia/el-compositor/configuracion/", + "title": "Ajusta la apariencia y la configuración", + "section": "compositor", + "group": "exhibition", + "other_url": "/docs/the-compositor/settings/", + "path": "guides/compositor-settings.es.md" + } + ] + }, + { + "id": "team", + "title": "Equipo y cursos", + "items": [ + { + "url": "/guia/el-compositor/equipo/", + "title": "Trabaja en equipo", + "section": "compositor", + "group": "team", + "other_url": "/docs/the-compositor/team/", + "path": "guides/compositor-team.es.md" + }, + { + "url": "/guia/el-compositor/cursos/", + "title": "Organiza un curso con sitios de estudiantes", + "section": "compositor", + "group": "team", + "other_url": "/docs/the-compositor/courses/", + "path": "guides/compositor-courses.es.md" + } + ] + }, + { + "id": "publish", + "title": "Publicar y mantener", + "items": [ + { + "url": "/guia/el-compositor/publicacion/", + "title": "Publicación", + "section": "compositor", + "group": "publish", + "other_url": "/docs/the-compositor/publishing/", + "path": "docs/9-6-publishing.es.md", + "order": 6 + }, + { + "url": "/guia/el-compositor/sincronizacion-y-actualizaciones/", + "title": "Sincronización y actualizaciones", + "section": "compositor", + "group": "publish", + "other_url": "/docs/the-compositor/sync-updates/", + "path": "docs/9-7-sync-updates.es.md", + "order": 7 + }, + { + "url": "/guia/el-compositor/solucionar-problemas/", + "title": "Resuelve problemas y recupera historias", + "section": "compositor", + "group": "publish", + "other_url": "/docs/the-compositor/troubleshooting/", + "path": "guides/compositor-recovery.es.md" + } + ] + } + ] + }, + "sheets": { + "id": "sheets", + "title": "Manual de Google Sheets", + "url": "/guia/google-sheets/", + "items": [ + { + "url": "/guia/google-sheets/", + "title": "Manual de Google Sheets", + "section": "sheets", + "group": "main", + "other_url": "/docs/google-sheets/", + "path": "guides/sheets.es.html" + }, + { + "url": "/guia/primeros-pasos/google-sheets/", + "title": "Configura con Google Sheets", + "section": "sheets", + "group": "main", + "other_url": "/docs/getting-started/google-sheets/", + "path": "docs/1-2-google-sheets-option.es.md", + "order": 2 + }, + { + "url": "/guia/configuracion/configuracion-manual/", + "title": "Configuración manual", + "section": "sheets", + "group": "main", + "other_url": "/docs/setup/manual/", + "path": "docs/2-1-manual-setup.es.md", + "order": 1 + }, + { + "url": "/guia/tus-datos/google-sheets/", + "title": "Entiende la hoja de cálculo", + "section": "sheets", + "group": "main", + "other_url": "/docs/your-data/google-sheets/", + "path": "docs/5-1-google-sheets.es.md", + "order": 1 + }, + { + "url": "/guia/primeros-pasos/agrega-contenido/", + "title": "Agrega un objeto y una primera historia", + "section": "sheets", + "group": "main", + "other_url": "/docs/getting-started/add-content/", + "path": "docs/1-5-add-content.es.md", + "order": 5 + }, + { + "url": "/guia/primeros-pasos/revisa-y-perfecciona/", + "title": "Encuadra, revisa y publica desde Sheets", + "section": "sheets", + "group": "main", + "other_url": "/docs/getting-started/review-refine/", + "path": "docs/1-6-review-refine.es.md", + "order": 6 + } + ], + "groups": [ + { + "id": "main", + "title": "Contenido de la guía", + "items": [ + { + "url": "/guia/google-sheets/", + "title": "Manual de Google Sheets", + "section": "sheets", + "group": "main", + "other_url": "/docs/google-sheets/", + "path": "guides/sheets.es.html" + }, + { + "url": "/guia/primeros-pasos/google-sheets/", + "title": "Configura con Google Sheets", + "section": "sheets", + "group": "main", + "other_url": "/docs/getting-started/google-sheets/", + "path": "docs/1-2-google-sheets-option.es.md", + "order": 2 + }, + { + "url": "/guia/configuracion/configuracion-manual/", + "title": "Configuración manual", + "section": "sheets", + "group": "main", + "other_url": "/docs/setup/manual/", + "path": "docs/2-1-manual-setup.es.md", + "order": 1 + }, + { + "url": "/guia/tus-datos/google-sheets/", + "title": "Entiende la hoja de cálculo", + "section": "sheets", + "group": "main", + "other_url": "/docs/your-data/google-sheets/", + "path": "docs/5-1-google-sheets.es.md", + "order": 1 + }, + { + "url": "/guia/primeros-pasos/agrega-contenido/", + "title": "Agrega un objeto y una primera historia", + "section": "sheets", + "group": "main", + "other_url": "/docs/getting-started/add-content/", + "path": "docs/1-5-add-content.es.md", + "order": 5 + }, + { + "url": "/guia/primeros-pasos/revisa-y-perfecciona/", + "title": "Encuadra, revisa y publica desde Sheets", + "section": "sheets", + "group": "main", + "other_url": "/docs/getting-started/review-refine/", + "path": "docs/1-6-review-refine.es.md", + "order": 6 + } + ] + } + ] + }, + "local": { + "id": "local", + "title": "Autoría local", + "url": "/guia/autoria-local/", + "items": [ + { + "url": "/guia/autoria-local/", + "title": "Autoría local", + "section": "local", + "group": "main", + "other_url": "/docs/local-authoring/", + "path": "guides/local.es.html" + }, + { + "url": "/guia/primeros-pasos/desarrollo-local/", + "title": "Instala y ejecuta Telar localmente", + "section": "local", + "group": "main", + "other_url": "/docs/getting-started/local-dev/", + "path": "docs/1-3-local-dev.es.md", + "order": 3 + }, + { + "url": "/guia/autoria-local/contenido/", + "title": "Edita objetos, historias y textos", + "section": "local", + "group": "main", + "other_url": "/docs/local-authoring/content/", + "path": "guides/local-content.es.md" + }, + { + "url": "/guia/autoria-local/vista-previa/", + "title": "Genera y revisa el sitio local", + "section": "local", + "group": "main", + "other_url": "/docs/local-authoring/preview/", + "path": "guides/local-preview.es.md" + }, + { + "url": "/guia/autoria-local/publicar/", + "title": "Publica y mantén un proyecto local", + "section": "local", + "group": "main", + "other_url": "/docs/local-authoring/publish/", + "path": "guides/local-publish.es.md" + } + ], + "groups": [ + { + "id": "main", + "title": "Contenido", + "items": [ + { + "url": "/guia/autoria-local/", + "title": "Autoría local", + "section": "local", + "group": "main", + "other_url": "/docs/local-authoring/", + "path": "guides/local.es.html" + }, + { + "url": "/guia/primeros-pasos/desarrollo-local/", + "title": "Instala y ejecuta Telar localmente", + "section": "local", + "group": "main", + "other_url": "/docs/getting-started/local-dev/", + "path": "docs/1-3-local-dev.es.md", + "order": 3 + }, + { + "url": "/guia/autoria-local/contenido/", + "title": "Edita objetos, historias y textos", + "section": "local", + "group": "main", + "other_url": "/docs/local-authoring/content/", + "path": "guides/local-content.es.md" + }, + { + "url": "/guia/autoria-local/vista-previa/", + "title": "Genera y revisa el sitio local", + "section": "local", + "group": "main", + "other_url": "/docs/local-authoring/preview/", + "path": "guides/local-preview.es.md" + }, + { + "url": "/guia/autoria-local/publicar/", + "title": "Publica y mantén un proyecto local", + "section": "local", + "group": "main", + "other_url": "/docs/local-authoring/publish/", + "path": "guides/local-publish.es.md" + } + ] + } + ] + }, + "reference": { + "id": "reference", + "title": "Referencia", + "url": "/guia/referencia/", + "items": [ + { + "url": "/guia/configuracion/", + "title": "Configura tu sitio", + "section": "reference", + "group": "configuration", + "other_url": "/docs/setup/", + "path": "docs/2-0-setup.es.md", + "order": 2 + }, + { + "url": "/guia/configuracion/actualizacion/", + "title": "Actualizar Telar", + "section": "reference", + "group": "support", + "other_url": "/docs/setup/upgrading/", + "path": "docs/2-3-upgrading.es.md", + "order": 3 + }, + { + "url": "/guia/configurar/", + "title": "Configura tu proyecto", + "section": "reference", + "group": "configuration", + "other_url": "/docs/configure/", + "path": "docs/3-0-configure.es.md", + "order": 3 + }, + { + "url": "/guia/configurar/generador-de-configuracion/", + "title": "Generador y editor de configuración", + "section": "reference", + "group": "configuration", + "other_url": "/docs/configure/config-generator/", + "path": "docs/3-1-config-generator.es.md", + "order": 1 + }, + { + "url": "/guia/configurar/configuracion/", + "title": "Configuración", + "section": "reference", + "group": "configuration", + "other_url": "/docs/configure/configuration/", + "path": "docs/3-2-configuration.es.md", + "order": 2 + }, + { + "url": "/guia/configurar/validador-de-configuracion/", + "title": "Validador de Configuración", + "section": "reference", + "group": "configuration", + "other_url": "/docs/configure/config-validator/", + "path": "docs/3-3-config-validator.es.md", + "order": 3 + }, + { + "url": "/guia/tu-contenido/", + "title": "Tu contenido", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/", + "path": "docs/4-0-your-content.es.md", + "order": 4 + }, + { + "url": "/guia/tu-contenido/objetos/", + "title": "Objetos", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/objects/", + "path": "docs/4-1-objects.es.md", + "order": 1 + }, + { + "url": "/guia/tu-contenido/objetos-de-audio/", + "title": "Objetos de audio", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/audio-objects/", + "path": "docs/4-10-audio-objects.es.md", + "order": 10 + }, + { + "url": "/guia/tu-contenido/imagenes-autoalojadas/", + "title": "Imágenes autoalojadas", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/self-hosted-images/", + "path": "docs/4-2-self-hosted-images.es.md", + "order": 2 + }, + { + "url": "/guia/tu-contenido/iiif-externo/", + "title": "Imágenes IIIF externas", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/external-iiif/", + "path": "docs/4-3-external-iiif.es.md", + "order": 3 + }, + { + "url": "/guia/tu-contenido/historias-paneles/", + "title": "Historias y paneles", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/stories-panels/", + "path": "docs/4-4-stories-panels.es.md", + "order": 4 + }, + { + "url": "/guia/tu-contenido/contenido-enriquecido/", + "title": "Contenido enriquecido con Markdown", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/rich-content/", + "path": "docs/4-5-rich-content.es.md", + "order": 5 + }, + { + "url": "/guia/tu-contenido/sintaxis-markdown/", + "title": "Referencia de sintaxis de Markdown", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/markdown-syntax/", + "path": "docs/4-6-markdown-syntax.es.md", + "order": 6 + }, + { + "url": "/guia/tu-contenido/widgets/", + "title": "Widgets", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/widgets/", + "path": "docs/4-7-widgets.es.md", + "order": 7 + }, + { + "url": "/guia/tu-contenido/documentos-pdf/", + "title": "Documentos PDF", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/pdf-documents/", + "path": "docs/4-8-pdf-documents.es.md", + "order": 8 + }, + { + "url": "/guia/tu-contenido/objetos-de-video/", + "title": "Objetos de video", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/video-objects/", + "path": "docs/4-9-video-objects.es.md", + "order": 9 + }, + { + "url": "/guia/tus-datos/", + "title": "Tus datos", + "section": "reference", + "group": "data", + "other_url": "/docs/your-data/", + "path": "docs/5-0-your-data.es.md", + "order": 5 + }, + { + "url": "/guia/tus-datos/csv-proyecto/", + "title": "Columnas del proyecto", + "section": "reference", + "group": "data", + "other_url": "/docs/your-data/csv-project/", + "path": "docs/5-2-csv-project.es.md", + "order": 2 + }, + { + "url": "/guia/tus-datos/csv-objetos/", + "title": "Columnas de objetos", + "section": "reference", + "group": "data", + "other_url": "/docs/your-data/csv-objects/", + "path": "docs/5-3-csv-objects.es.md", + "order": 3 + }, + { + "url": "/guia/tus-datos/csv-historias/", + "title": "Columnas de historias", + "section": "reference", + "group": "data", + "other_url": "/docs/your-data/csv-stories/", + "path": "docs/5-4-csv-stories.es.md", + "order": 4 + }, + { + "url": "/guia/tus-datos/csv-glosario/", + "title": "Columnas del glosario", + "section": "reference", + "group": "data", + "other_url": "/docs/your-data/csv-glossary/", + "path": "docs/5-5-csv-glossary.es.md", + "order": 5 + }, + { + "url": "/guia/funciones/", + "title": "Funciones del sitio", + "section": "reference", + "group": "features", + "other_url": "/docs/site-features/", + "path": "docs/6-0-site-features.es.md", + "order": 6 + }, + { + "url": "/guia/funciones/galeria-objetos/", + "title": "Galería de objetos", + "section": "reference", + "group": "features", + "other_url": "/docs/site-features/objects-gallery/", + "path": "docs/6-1-objects-gallery.es.md", + "order": 1 + }, + { + "url": "/guia/funciones/glosario/", + "title": "Glosario", + "section": "reference", + "group": "features", + "other_url": "/docs/site-features/glossary/", + "path": "docs/6-2-glossary.es.md", + "order": 2 + }, + { + "url": "/guia/funciones/historias-privadas/", + "title": "Historias privadas", + "section": "reference", + "group": "features", + "other_url": "/docs/site-features/private-stories/", + "path": "docs/6-3-private-stories.es.md", + "order": 3 + }, + { + "url": "/guia/funciones/paginas-personalizadas/", + "title": "Páginas personalizadas", + "section": "reference", + "group": "features", + "other_url": "/docs/site-features/custom-pages/", + "path": "docs/6-4-custom-pages.es.md", + "order": 4 + }, + { + "url": "/guia/funciones/insercion/", + "title": "Insertar historias de Telar en LMS y sitios web", + "section": "reference", + "group": "features", + "other_url": "/docs/site-features/embedding/", + "path": "docs/6-5-embedding.es.md", + "order": 5 + }, + { + "url": "/guia/personalizacion/", + "title": "Personalización", + "section": "reference", + "group": "appearance", + "other_url": "/docs/customization/", + "path": "docs/7-0-customization.es.md", + "order": 7 + }, + { + "url": "/guia/personalizacion/temas/", + "title": "Temas", + "section": "reference", + "group": "appearance", + "other_url": "/docs/customization/themes/", + "path": "docs/7-1-themes.es.md", + "order": 1 + }, + { + "url": "/guia/personalizacion/pagina-de-inicio/", + "title": "Personalizar la página de inicio", + "section": "reference", + "group": "appearance", + "other_url": "/docs/customization/home-page/", + "path": "docs/7-2-home-page.es.md", + "order": 2 + }, + { + "url": "/guia/personalizacion/menu-navegacion/", + "title": "Configuración del menú de navegación", + "section": "reference", + "group": "appearance", + "other_url": "/docs/customization/navigation-menu/", + "path": "docs/7-3-navigation-menu.es.md", + "order": 3 + }, + { + "url": "/guia/personalizacion/contenido-demostracion/", + "title": "Contenido de demostración", + "section": "reference", + "group": "appearance", + "other_url": "/docs/customization/demo-content/", + "path": "docs/7-4-demo-content.es.md", + "order": 4 + }, + { + "url": "/guia/referencia/", + "title": "Referencia", + "section": "reference", + "group": "main", + "other_url": "/docs/reference/", + "path": "guides/reference.es.html" + } + ], + "groups": [ + { + "id": "configuration", + "title": "Configuración y alojamiento", + "items": [ + { + "url": "/guia/configuracion/", + "title": "Configura tu sitio", + "section": "reference", + "group": "configuration", + "other_url": "/docs/setup/", + "path": "docs/2-0-setup.es.md", + "order": 2 + }, + { + "url": "/guia/configurar/", + "title": "Configura tu proyecto", + "section": "reference", + "group": "configuration", + "other_url": "/docs/configure/", + "path": "docs/3-0-configure.es.md", + "order": 3 + }, + { + "url": "/guia/configurar/generador-de-configuracion/", + "title": "Generador y editor de configuración", + "section": "reference", + "group": "configuration", + "other_url": "/docs/configure/config-generator/", + "path": "docs/3-1-config-generator.es.md", + "order": 1 + }, + { + "url": "/guia/configurar/configuracion/", + "title": "Configuración", + "section": "reference", + "group": "configuration", + "other_url": "/docs/configure/configuration/", + "path": "docs/3-2-configuration.es.md", + "order": 2 + }, + { + "url": "/guia/configurar/validador-de-configuracion/", + "title": "Validador de Configuración", + "section": "reference", + "group": "configuration", + "other_url": "/docs/configure/config-validator/", + "path": "docs/3-3-config-validator.es.md", + "order": 3 + } + ] + }, + { + "id": "content", + "title": "Fuentes y contenido", + "items": [ + { + "url": "/guia/tu-contenido/", + "title": "Tu contenido", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/", + "path": "docs/4-0-your-content.es.md", + "order": 4 + }, + { + "url": "/guia/tu-contenido/objetos/", + "title": "Objetos", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/objects/", + "path": "docs/4-1-objects.es.md", + "order": 1 + }, + { + "url": "/guia/tu-contenido/objetos-de-audio/", + "title": "Objetos de audio", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/audio-objects/", + "path": "docs/4-10-audio-objects.es.md", + "order": 10 + }, + { + "url": "/guia/tu-contenido/imagenes-autoalojadas/", + "title": "Imágenes autoalojadas", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/self-hosted-images/", + "path": "docs/4-2-self-hosted-images.es.md", + "order": 2 + }, + { + "url": "/guia/tu-contenido/iiif-externo/", + "title": "Imágenes IIIF externas", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/external-iiif/", + "path": "docs/4-3-external-iiif.es.md", + "order": 3 + }, + { + "url": "/guia/tu-contenido/historias-paneles/", + "title": "Historias y paneles", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/stories-panels/", + "path": "docs/4-4-stories-panels.es.md", + "order": 4 + }, + { + "url": "/guia/tu-contenido/contenido-enriquecido/", + "title": "Contenido enriquecido con Markdown", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/rich-content/", + "path": "docs/4-5-rich-content.es.md", + "order": 5 + }, + { + "url": "/guia/tu-contenido/sintaxis-markdown/", + "title": "Referencia de sintaxis de Markdown", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/markdown-syntax/", + "path": "docs/4-6-markdown-syntax.es.md", + "order": 6 + }, + { + "url": "/guia/tu-contenido/widgets/", + "title": "Widgets", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/widgets/", + "path": "docs/4-7-widgets.es.md", + "order": 7 + }, + { + "url": "/guia/tu-contenido/documentos-pdf/", + "title": "Documentos PDF", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/pdf-documents/", + "path": "docs/4-8-pdf-documents.es.md", + "order": 8 + }, + { + "url": "/guia/tu-contenido/objetos-de-video/", + "title": "Objetos de video", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/video-objects/", + "path": "docs/4-9-video-objects.es.md", + "order": 9 + } + ] + }, + { + "id": "data", + "title": "Formatos de datos", + "items": [ + { + "url": "/guia/tus-datos/", + "title": "Tus datos", + "section": "reference", + "group": "data", + "other_url": "/docs/your-data/", + "path": "docs/5-0-your-data.es.md", + "order": 5 + }, + { + "url": "/guia/tus-datos/csv-proyecto/", + "title": "Columnas del proyecto", + "section": "reference", + "group": "data", + "other_url": "/docs/your-data/csv-project/", + "path": "docs/5-2-csv-project.es.md", + "order": 2 + }, + { + "url": "/guia/tus-datos/csv-objetos/", + "title": "Columnas de objetos", + "section": "reference", + "group": "data", + "other_url": "/docs/your-data/csv-objects/", + "path": "docs/5-3-csv-objects.es.md", + "order": 3 + }, + { + "url": "/guia/tus-datos/csv-historias/", + "title": "Columnas de historias", + "section": "reference", + "group": "data", + "other_url": "/docs/your-data/csv-stories/", + "path": "docs/5-4-csv-stories.es.md", + "order": 4 + }, + { + "url": "/guia/tus-datos/csv-glosario/", + "title": "Columnas del glosario", + "section": "reference", + "group": "data", + "other_url": "/docs/your-data/csv-glossary/", + "path": "docs/5-5-csv-glossary.es.md", + "order": 5 + } + ] + }, + { + "id": "features", + "title": "Funciones de lectura", + "items": [ + { + "url": "/guia/funciones/", + "title": "Funciones del sitio", + "section": "reference", + "group": "features", + "other_url": "/docs/site-features/", + "path": "docs/6-0-site-features.es.md", + "order": 6 + }, + { + "url": "/guia/funciones/galeria-objetos/", + "title": "Galería de objetos", + "section": "reference", + "group": "features", + "other_url": "/docs/site-features/objects-gallery/", + "path": "docs/6-1-objects-gallery.es.md", + "order": 1 + }, + { + "url": "/guia/funciones/glosario/", + "title": "Glosario", + "section": "reference", + "group": "features", + "other_url": "/docs/site-features/glossary/", + "path": "docs/6-2-glossary.es.md", + "order": 2 + }, + { + "url": "/guia/funciones/historias-privadas/", + "title": "Historias privadas", + "section": "reference", + "group": "features", + "other_url": "/docs/site-features/private-stories/", + "path": "docs/6-3-private-stories.es.md", + "order": 3 + }, + { + "url": "/guia/funciones/paginas-personalizadas/", + "title": "Páginas personalizadas", + "section": "reference", + "group": "features", + "other_url": "/docs/site-features/custom-pages/", + "path": "docs/6-4-custom-pages.es.md", + "order": 4 + }, + { + "url": "/guia/funciones/insercion/", + "title": "Insertar historias de Telar en LMS y sitios web", + "section": "reference", + "group": "features", + "other_url": "/docs/site-features/embedding/", + "path": "docs/6-5-embedding.es.md", + "order": 5 + } + ] + }, + { + "id": "appearance", + "title": "Apariencia y navegación", + "items": [ + { + "url": "/guia/personalizacion/", + "title": "Personalización", + "section": "reference", + "group": "appearance", + "other_url": "/docs/customization/", + "path": "docs/7-0-customization.es.md", + "order": 7 + }, + { + "url": "/guia/personalizacion/temas/", + "title": "Temas", + "section": "reference", + "group": "appearance", + "other_url": "/docs/customization/themes/", + "path": "docs/7-1-themes.es.md", + "order": 1 + }, + { + "url": "/guia/personalizacion/pagina-de-inicio/", + "title": "Personalizar la página de inicio", + "section": "reference", + "group": "appearance", + "other_url": "/docs/customization/home-page/", + "path": "docs/7-2-home-page.es.md", + "order": 2 + }, + { + "url": "/guia/personalizacion/menu-navegacion/", + "title": "Configuración del menú de navegación", + "section": "reference", + "group": "appearance", + "other_url": "/docs/customization/navigation-menu/", + "path": "docs/7-3-navigation-menu.es.md", + "order": 3 + }, + { + "url": "/guia/personalizacion/contenido-demostracion/", + "title": "Contenido de demostración", + "section": "reference", + "group": "appearance", + "other_url": "/docs/customization/demo-content/", + "path": "docs/7-4-demo-content.es.md", + "order": 4 + } + ] + }, + { + "id": "support", + "title": "Mantenimiento", + "items": [ + { + "url": "/guia/configuracion/actualizacion/", + "title": "Actualizar Telar", + "section": "reference", + "group": "support", + "other_url": "/docs/setup/upgrading/", + "path": "docs/2-3-upgrading.es.md", + "order": 3 + } + ] + }, + { + "id": "main", + "title": "Contenido de la guía", + "items": [ + { + "url": "/guia/referencia/", + "title": "Referencia", + "section": "reference", + "group": "main", + "other_url": "/docs/reference/", + "path": "guides/reference.es.html" + } + ] + } + ] + }, + "teaching": { + "id": "teaching", + "title": "Enseñar con Telar", + "url": "/guia/ensenar/", + "items": [ + { + "url": "/guia/ensenar/", + "title": "Enseñar con Telar", + "section": "teaching", + "group": "main", + "other_url": "/docs/teaching/", + "path": "guides/teaching.es.html" + }, + { + "url": "/guia/ensenar/solicitar-acceso/", + "title": "Solicita acceso al modo docente", + "section": "teaching", + "group": "main", + "other_url": "/docs/teaching/request-access/", + "path": "guides/teaching-request.es.html" + } + ], + "groups": [ + { + "id": "main", + "title": "Contenido de la guía", + "items": [ + { + "url": "/guia/ensenar/", + "title": "Enseñar con Telar", + "section": "teaching", + "group": "main", + "other_url": "/docs/teaching/", + "path": "guides/teaching.es.html" + }, + { + "url": "/guia/ensenar/solicitar-acceso/", + "title": "Solicita acceso al modo docente", + "section": "teaching", + "group": "main", + "other_url": "/docs/teaching/request-access/", + "path": "guides/teaching-request.es.html" + } + ] + } + ] + }, + "developers": { + "id": "developers", + "title": "Para desarrolladores", + "url": "/guia/desarrolladores/", + "items": [ + { + "url": "/guia/desarrolladores/", + "title": "Para desarrolladores", + "section": "developers", + "group": "main", + "other_url": "/docs/developers/", + "path": "docs/8-0-for-developers.es.md", + "order": 8 + }, + { + "url": "/guia/desarrolladores/desarrollo-local/", + "title": "Desarrollo local", + "section": "developers", + "group": "main", + "other_url": "/docs/developers/local-development/", + "path": "docs/8-1-local-development.es.md", + "order": 1 + }, + { + "url": "/guia/desarrolladores/github-actions/", + "title": "GitHub Actions", + "section": "developers", + "group": "main", + "other_url": "/docs/developers/github-actions/", + "path": "docs/8-2-github-actions.es.md", + "order": 2 + }, + { + "url": "/guia/desarrolladores/sistema-demos/", + "title": "Arquitectura del contenido de demostración", + "section": "developers", + "group": "main", + "other_url": "/docs/developers/demo-system/", + "path": "docs/8-3-demo-system-architecture.es.md", + "order": 3 + }, + { + "url": "/guia/desarrolladores/sistema-insercion/", + "title": "Referencia del sistema de inserción", + "section": "developers", + "group": "main", + "other_url": "/docs/developers/embedding-system/", + "path": "docs/8-4-embedding-system.es.md", + "order": 4 + }, + { + "url": "/guia/desarrolladores/estilos/", + "title": "Estilos avanzados", + "section": "developers", + "group": "main", + "other_url": "/docs/developers/styling/", + "path": "docs/8-5-styling.es.md", + "order": 5 + }, + { + "url": "/guia/desarrolladores/moviles/", + "title": "Diseños y pantallas pequeñas", + "section": "developers", + "group": "main", + "other_url": "/docs/developers/mobile/", + "path": "docs/8-6-mobile.es.md", + "order": 6 + }, + { + "url": "/guia/desarrolladores/motor-de-historias/", + "title": "Vocabulario del motor de historias", + "section": "developers", + "group": "main", + "other_url": "/docs/developers/story-engine/", + "path": "docs/8-7-story-engine.es.md", + "order": 7 + } + ], + "groups": [ + { + "id": "main", + "title": "Contenido de la guía", + "items": [ + { + "url": "/guia/desarrolladores/", + "title": "Para desarrolladores", + "section": "developers", + "group": "main", + "other_url": "/docs/developers/", + "path": "docs/8-0-for-developers.es.md", + "order": 8 + }, + { + "url": "/guia/desarrolladores/desarrollo-local/", + "title": "Desarrollo local", + "section": "developers", + "group": "main", + "other_url": "/docs/developers/local-development/", + "path": "docs/8-1-local-development.es.md", + "order": 1 + }, + { + "url": "/guia/desarrolladores/github-actions/", + "title": "GitHub Actions", + "section": "developers", + "group": "main", + "other_url": "/docs/developers/github-actions/", + "path": "docs/8-2-github-actions.es.md", + "order": 2 + }, + { + "url": "/guia/desarrolladores/sistema-demos/", + "title": "Arquitectura del contenido de demostración", + "section": "developers", + "group": "main", + "other_url": "/docs/developers/demo-system/", + "path": "docs/8-3-demo-system-architecture.es.md", + "order": 3 + }, + { + "url": "/guia/desarrolladores/sistema-insercion/", + "title": "Referencia del sistema de inserción", + "section": "developers", + "group": "main", + "other_url": "/docs/developers/embedding-system/", + "path": "docs/8-4-embedding-system.es.md", + "order": 4 + }, + { + "url": "/guia/desarrolladores/estilos/", + "title": "Estilos avanzados", + "section": "developers", + "group": "main", + "other_url": "/docs/developers/styling/", + "path": "docs/8-5-styling.es.md", + "order": 5 + }, + { + "url": "/guia/desarrolladores/moviles/", + "title": "Diseños y pantallas pequeñas", + "section": "developers", + "group": "main", + "other_url": "/docs/developers/mobile/", + "path": "docs/8-6-mobile.es.md", + "order": 6 + }, + { + "url": "/guia/desarrolladores/motor-de-historias/", + "title": "Vocabulario del motor de historias", + "section": "developers", + "group": "main", + "other_url": "/docs/developers/story-engine/", + "path": "docs/8-7-story-engine.es.md", + "order": 7 + } + ] + } + ] + }, + "guides": { + "id": "guides", + "title": "Guías", + "url": "/guia/", + "items": [], + "groups": [] + } + } + }, + "pages": { + "/guia/primeros-pasos/": { + "url": "/guia/primeros-pasos/", + "title": "Primeros pasos", + "section": "guides", + "group": "main", + "other_url": "/docs/getting-started/", + "path": "docs/1-0-getting-started.es.md" + }, + "/docs/getting-started/": { + "url": "/docs/getting-started/", + "title": "Get started", + "section": "guides", + "group": "main", + "other_url": "/guia/primeros-pasos/", + "path": "docs/1-0-getting-started.md" + }, + "/guia/primeros-pasos/compositor/": { + "url": "/guia/primeros-pasos/compositor/", + "title": "Usa el Compositor", + "section": "compositor", + "group": "begin", + "other_url": "/docs/getting-started/compositor/", + "path": "docs/1-1-compositor.es.md", + "order": 1 + }, + "/docs/getting-started/compositor/": { + "url": "/docs/getting-started/compositor/", + "title": "Use the Compositor", + "section": "compositor", + "group": "begin", + "other_url": "/guia/primeros-pasos/compositor/", + "path": "docs/1-1-compositor.md", + "order": 1 + }, + "/guia/primeros-pasos/google-sheets/": { + "url": "/guia/primeros-pasos/google-sheets/", + "title": "Configura con Google Sheets", + "section": "sheets", + "group": "main", + "other_url": "/docs/getting-started/google-sheets/", + "path": "docs/1-2-google-sheets-option.es.md", + "order": 2 + }, + "/docs/getting-started/google-sheets/": { + "url": "/docs/getting-started/google-sheets/", + "title": "Set Up with Google Sheets", + "section": "sheets", + "group": "main", + "other_url": "/guia/primeros-pasos/google-sheets/", + "path": "docs/1-2-google-sheets-option.md", + "order": 2 + }, + "/guia/primeros-pasos/desarrollo-local/": { + "url": "/guia/primeros-pasos/desarrollo-local/", + "title": "Instala y ejecuta Telar localmente", + "section": "local", + "group": "main", + "other_url": "/docs/getting-started/local-dev/", + "path": "docs/1-3-local-dev.es.md", + "order": 3 + }, + "/docs/getting-started/local-dev/": { + "url": "/docs/getting-started/local-dev/", + "title": "Install and run Telar locally", + "section": "local", + "group": "main", + "other_url": "/guia/primeros-pasos/desarrollo-local/", + "path": "docs/1-3-local-dev.md", + "order": 3 + }, + "/guia/primeros-pasos/estructura-narrativa/": { + "url": "/guia/primeros-pasos/estructura-narrativa/", + "title": "Planea el recorrido de la historia", + "section": "planning", + "group": "main", + "other_url": "/docs/getting-started/narrative-structure/", + "path": "docs/1-4-narrative-structure.es.md" + }, + "/docs/getting-started/narrative-structure/": { + "url": "/docs/getting-started/narrative-structure/", + "title": "Sketch the narrative arc", + "section": "planning", + "group": "main", + "other_url": "/guia/primeros-pasos/estructura-narrativa/", + "path": "docs/1-4-narrative-structure.md" + }, + "/guia/primeros-pasos/agrega-contenido/": { + "url": "/guia/primeros-pasos/agrega-contenido/", + "title": "Agrega un objeto y una primera historia", + "section": "sheets", + "group": "main", + "other_url": "/docs/getting-started/add-content/", + "path": "docs/1-5-add-content.es.md", + "order": 5 + }, + "/docs/getting-started/add-content/": { + "url": "/docs/getting-started/add-content/", + "title": "Add an object and a first story", + "section": "sheets", + "group": "main", + "other_url": "/guia/primeros-pasos/agrega-contenido/", + "path": "docs/1-5-add-content.md", + "order": 5 + }, + "/guia/primeros-pasos/revisa-y-perfecciona/": { + "url": "/guia/primeros-pasos/revisa-y-perfecciona/", + "title": "Encuadra, revisa y publica desde Sheets", + "section": "sheets", + "group": "main", + "other_url": "/docs/getting-started/review-refine/", + "path": "docs/1-6-review-refine.es.md", + "order": 6 + }, + "/docs/getting-started/review-refine/": { + "url": "/docs/getting-started/review-refine/", + "title": "Frame, review and publish from Sheets", + "section": "sheets", + "group": "main", + "other_url": "/guia/primeros-pasos/revisa-y-perfecciona/", + "path": "docs/1-6-review-refine.md", + "order": 6 + }, + "/guia/configuracion/": { + "url": "/guia/configuracion/", + "title": "Configura tu sitio", + "section": "reference", + "group": "configuration", + "other_url": "/docs/setup/", + "path": "docs/2-0-setup.es.md", + "order": 2 + }, + "/docs/setup/": { + "url": "/docs/setup/", + "title": "Set Up Your Site", + "section": "reference", + "group": "configuration", + "other_url": "/guia/configuracion/", + "path": "docs/2-0-setup.md", + "order": 2 + }, + "/guia/configuracion/configuracion-manual/": { + "url": "/guia/configuracion/configuracion-manual/", + "title": "Configuración manual", + "section": "sheets", + "group": "main", + "other_url": "/docs/setup/manual/", + "path": "docs/2-1-manual-setup.es.md", + "order": 1 + }, + "/docs/setup/manual/": { + "url": "/docs/setup/manual/", + "title": "Manual Setup", + "section": "sheets", + "group": "main", + "other_url": "/guia/configuracion/configuracion-manual/", + "path": "docs/2-1-manual-setup.md", + "order": 1 + }, + "/guia/configuracion/actualizacion/": { + "url": "/guia/configuracion/actualizacion/", + "title": "Actualizar Telar", + "section": "reference", + "group": "support", + "other_url": "/docs/setup/upgrading/", + "path": "docs/2-3-upgrading.es.md", + "order": 3 + }, + "/docs/setup/upgrading/": { + "url": "/docs/setup/upgrading/", + "title": "Upgrading Telar", + "section": "reference", + "group": "support", + "other_url": "/guia/configuracion/actualizacion/", + "path": "docs/2-3-upgrading.md", + "order": 3 + }, + "/guia/configurar/": { + "url": "/guia/configurar/", + "title": "Configura tu proyecto", + "section": "reference", + "group": "configuration", + "other_url": "/docs/configure/", + "path": "docs/3-0-configure.es.md", + "order": 3 + }, + "/docs/configure/": { + "url": "/docs/configure/", + "title": "Configure Your Site", + "section": "reference", + "group": "configuration", + "other_url": "/guia/configurar/", + "path": "docs/3-0-configure.md", + "order": 3 + }, + "/guia/configurar/generador-de-configuracion/": { + "url": "/guia/configurar/generador-de-configuracion/", + "title": "Generador y editor de configuración", + "section": "reference", + "group": "configuration", + "other_url": "/docs/configure/config-generator/", + "path": "docs/3-1-config-generator.es.md", + "order": 1 + }, + "/docs/configure/config-generator/": { + "url": "/docs/configure/config-generator/", + "title": "Config Generator and Editor", + "section": "reference", + "group": "configuration", + "other_url": "/guia/configurar/generador-de-configuracion/", + "path": "docs/3-1-config-generator.md", + "order": 1 + }, + "/guia/configurar/configuracion/": { + "url": "/guia/configurar/configuracion/", + "title": "Configuración", + "section": "reference", + "group": "configuration", + "other_url": "/docs/configure/configuration/", + "path": "docs/3-2-configuration.es.md", + "order": 2 + }, + "/docs/configure/configuration/": { + "url": "/docs/configure/configuration/", + "title": "Configuration", + "section": "reference", + "group": "configuration", + "other_url": "/guia/configurar/configuracion/", + "path": "docs/3-2-configuration.md", + "order": 2 + }, + "/guia/configurar/validador-de-configuracion/": { + "url": "/guia/configurar/validador-de-configuracion/", + "title": "Validador de Configuración", + "section": "reference", + "group": "configuration", + "other_url": "/docs/configure/config-validator/", + "path": "docs/3-3-config-validator.es.md", + "order": 3 + }, + "/docs/configure/config-validator/": { + "url": "/docs/configure/config-validator/", + "title": "Config Validator", + "section": "reference", + "group": "configuration", + "other_url": "/guia/configurar/validador-de-configuracion/", + "path": "docs/3-3-config-validator.md", + "order": 3 + }, + "/guia/tu-contenido/": { + "url": "/guia/tu-contenido/", + "title": "Tu contenido", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/", + "path": "docs/4-0-your-content.es.md", + "order": 4 + }, + "/docs/your-content/": { + "url": "/docs/your-content/", + "title": "Your Content", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/", + "path": "docs/4-0-your-content.md", + "order": 4 + }, + "/guia/tu-contenido/objetos/": { + "url": "/guia/tu-contenido/objetos/", + "title": "Objetos", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/objects/", + "path": "docs/4-1-objects.es.md", + "order": 1 + }, + "/docs/your-content/objects/": { + "url": "/docs/your-content/objects/", + "title": "Objects", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/objetos/", + "path": "docs/4-1-objects.md", + "order": 1 + }, + "/guia/tu-contenido/objetos-de-audio/": { + "url": "/guia/tu-contenido/objetos-de-audio/", + "title": "Objetos de audio", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/audio-objects/", + "path": "docs/4-10-audio-objects.es.md", + "order": 10 + }, + "/docs/your-content/audio-objects/": { + "url": "/docs/your-content/audio-objects/", + "title": "Audio Objects", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/objetos-de-audio/", + "path": "docs/4-10-audio-objects.md", + "order": 10 + }, + "/guia/tu-contenido/imagenes-autoalojadas/": { + "url": "/guia/tu-contenido/imagenes-autoalojadas/", + "title": "Imágenes autoalojadas", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/self-hosted-images/", + "path": "docs/4-2-self-hosted-images.es.md", + "order": 2 + }, + "/docs/your-content/self-hosted-images/": { + "url": "/docs/your-content/self-hosted-images/", + "title": "Self-Hosted Images", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/imagenes-autoalojadas/", + "path": "docs/4-2-self-hosted-images.md", + "order": 2 + }, + "/guia/tu-contenido/iiif-externo/": { + "url": "/guia/tu-contenido/iiif-externo/", + "title": "Imágenes IIIF externas", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/external-iiif/", + "path": "docs/4-3-external-iiif.es.md", + "order": 3 + }, + "/docs/your-content/external-iiif/": { + "url": "/docs/your-content/external-iiif/", + "title": "External IIIF Images", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/iiif-externo/", + "path": "docs/4-3-external-iiif.md", + "order": 3 + }, + "/guia/tu-contenido/historias-paneles/": { + "url": "/guia/tu-contenido/historias-paneles/", + "title": "Historias y paneles", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/stories-panels/", + "path": "docs/4-4-stories-panels.es.md", + "order": 4 + }, + "/docs/your-content/stories-panels/": { + "url": "/docs/your-content/stories-panels/", + "title": "Stories & Panels", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/historias-paneles/", + "path": "docs/4-4-stories-panels.md", + "order": 4 + }, + "/guia/tu-contenido/contenido-enriquecido/": { + "url": "/guia/tu-contenido/contenido-enriquecido/", + "title": "Contenido enriquecido con Markdown", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/rich-content/", + "path": "docs/4-5-rich-content.es.md", + "order": 5 + }, + "/docs/your-content/rich-content/": { + "url": "/docs/your-content/rich-content/", + "title": "Rich Content with Markdown", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/contenido-enriquecido/", + "path": "docs/4-5-rich-content.md", + "order": 5 + }, + "/guia/tu-contenido/sintaxis-markdown/": { + "url": "/guia/tu-contenido/sintaxis-markdown/", + "title": "Referencia de sintaxis de Markdown", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/markdown-syntax/", + "path": "docs/4-6-markdown-syntax.es.md", + "order": 6 + }, + "/docs/your-content/markdown-syntax/": { + "url": "/docs/your-content/markdown-syntax/", + "title": "Markdown Syntax Reference", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/sintaxis-markdown/", + "path": "docs/4-6-markdown-syntax.md", + "order": 6 + }, + "/guia/tu-contenido/widgets/": { + "url": "/guia/tu-contenido/widgets/", + "title": "Widgets", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/widgets/", + "path": "docs/4-7-widgets.es.md", + "order": 7 + }, + "/docs/your-content/widgets/": { + "url": "/docs/your-content/widgets/", + "title": "Widgets", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/widgets/", + "path": "docs/4-7-widgets.md", + "order": 7 + }, + "/guia/tu-contenido/documentos-pdf/": { + "url": "/guia/tu-contenido/documentos-pdf/", + "title": "Documentos PDF", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/pdf-documents/", + "path": "docs/4-8-pdf-documents.es.md", + "order": 8 + }, + "/docs/your-content/pdf-documents/": { + "url": "/docs/your-content/pdf-documents/", + "title": "PDF Documents", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/documentos-pdf/", + "path": "docs/4-8-pdf-documents.md", + "order": 8 + }, + "/guia/tu-contenido/objetos-de-video/": { + "url": "/guia/tu-contenido/objetos-de-video/", + "title": "Objetos de video", + "section": "reference", + "group": "content", + "other_url": "/docs/your-content/video-objects/", + "path": "docs/4-9-video-objects.es.md", + "order": 9 + }, + "/docs/your-content/video-objects/": { + "url": "/docs/your-content/video-objects/", + "title": "Video Objects", + "section": "reference", + "group": "content", + "other_url": "/guia/tu-contenido/objetos-de-video/", + "path": "docs/4-9-video-objects.md", + "order": 9 + }, + "/guia/tus-datos/": { + "url": "/guia/tus-datos/", + "title": "Tus datos", + "section": "reference", + "group": "data", + "other_url": "/docs/your-data/", + "path": "docs/5-0-your-data.es.md", + "order": 5 + }, + "/docs/your-data/": { + "url": "/docs/your-data/", + "title": "Your Data", + "section": "reference", + "group": "data", + "other_url": "/guia/tus-datos/", + "path": "docs/5-0-your-data.md", + "order": 5 + }, + "/guia/tus-datos/google-sheets/": { + "url": "/guia/tus-datos/google-sheets/", + "title": "Entiende la hoja de cálculo", + "section": "sheets", + "group": "main", + "other_url": "/docs/your-data/google-sheets/", + "path": "docs/5-1-google-sheets.es.md", + "order": 1 + }, + "/docs/your-data/google-sheets/": { + "url": "/docs/your-data/google-sheets/", + "title": "Understand the spreadsheet", + "section": "sheets", + "group": "main", + "other_url": "/guia/tus-datos/google-sheets/", + "path": "docs/5-1-google-sheets.md", + "order": 1 + }, + "/guia/tus-datos/csv-proyecto/": { + "url": "/guia/tus-datos/csv-proyecto/", + "title": "Columnas del proyecto", + "section": "reference", + "group": "data", + "other_url": "/docs/your-data/csv-project/", + "path": "docs/5-2-csv-project.es.md", + "order": 2 + }, + "/docs/your-data/csv-project/": { + "url": "/docs/your-data/csv-project/", + "title": "Project Columns", + "section": "reference", + "group": "data", + "other_url": "/guia/tus-datos/csv-proyecto/", + "path": "docs/5-2-csv-project.md", + "order": 2 + }, + "/guia/tus-datos/csv-objetos/": { + "url": "/guia/tus-datos/csv-objetos/", + "title": "Columnas de objetos", + "section": "reference", + "group": "data", + "other_url": "/docs/your-data/csv-objects/", + "path": "docs/5-3-csv-objects.es.md", + "order": 3 + }, + "/docs/your-data/csv-objects/": { + "url": "/docs/your-data/csv-objects/", + "title": "Object Columns", + "section": "reference", + "group": "data", + "other_url": "/guia/tus-datos/csv-objetos/", + "path": "docs/5-3-csv-objects.md", + "order": 3 + }, + "/guia/tus-datos/csv-historias/": { + "url": "/guia/tus-datos/csv-historias/", + "title": "Columnas de historias", + "section": "reference", + "group": "data", + "other_url": "/docs/your-data/csv-stories/", + "path": "docs/5-4-csv-stories.es.md", + "order": 4 + }, + "/docs/your-data/csv-stories/": { + "url": "/docs/your-data/csv-stories/", + "title": "Story Columns", + "section": "reference", + "group": "data", + "other_url": "/guia/tus-datos/csv-historias/", + "path": "docs/5-4-csv-stories.md", + "order": 4 + }, + "/guia/tus-datos/csv-glosario/": { + "url": "/guia/tus-datos/csv-glosario/", + "title": "Columnas del glosario", + "section": "reference", + "group": "data", + "other_url": "/docs/your-data/csv-glossary/", + "path": "docs/5-5-csv-glossary.es.md", + "order": 5 + }, + "/docs/your-data/csv-glossary/": { + "url": "/docs/your-data/csv-glossary/", + "title": "Glossary Columns", + "section": "reference", + "group": "data", + "other_url": "/guia/tus-datos/csv-glosario/", + "path": "docs/5-5-csv-glossary.md", + "order": 5 + }, + "/guia/funciones/": { + "url": "/guia/funciones/", + "title": "Funciones del sitio", + "section": "reference", + "group": "features", + "other_url": "/docs/site-features/", + "path": "docs/6-0-site-features.es.md", + "order": 6 + }, + "/docs/site-features/": { + "url": "/docs/site-features/", + "title": "Site Features", + "section": "reference", + "group": "features", + "other_url": "/guia/funciones/", + "path": "docs/6-0-site-features.md", + "order": 6 + }, + "/guia/funciones/galeria-objetos/": { + "url": "/guia/funciones/galeria-objetos/", + "title": "Galería de objetos", + "section": "reference", + "group": "features", + "other_url": "/docs/site-features/objects-gallery/", + "path": "docs/6-1-objects-gallery.es.md", + "order": 1 + }, + "/docs/site-features/objects-gallery/": { + "url": "/docs/site-features/objects-gallery/", + "title": "Objects Gallery", + "section": "reference", + "group": "features", + "other_url": "/guia/funciones/galeria-objetos/", + "path": "docs/6-1-objects-gallery.md", + "order": 1 + }, + "/guia/funciones/glosario/": { + "url": "/guia/funciones/glosario/", + "title": "Glosario", + "section": "reference", + "group": "features", + "other_url": "/docs/site-features/glossary/", + "path": "docs/6-2-glossary.es.md", + "order": 2 + }, + "/docs/site-features/glossary/": { + "url": "/docs/site-features/glossary/", + "title": "Glossary", + "section": "reference", + "group": "features", + "other_url": "/guia/funciones/glosario/", + "path": "docs/6-2-glossary.md", + "order": 2 + }, + "/guia/funciones/historias-privadas/": { + "url": "/guia/funciones/historias-privadas/", + "title": "Historias privadas", + "section": "reference", + "group": "features", + "other_url": "/docs/site-features/private-stories/", + "path": "docs/6-3-private-stories.es.md", + "order": 3 + }, + "/docs/site-features/private-stories/": { + "url": "/docs/site-features/private-stories/", + "title": "Private Stories", + "section": "reference", + "group": "features", + "other_url": "/guia/funciones/historias-privadas/", + "path": "docs/6-3-private-stories.md", + "order": 3 + }, + "/guia/funciones/paginas-personalizadas/": { + "url": "/guia/funciones/paginas-personalizadas/", + "title": "Páginas personalizadas", + "section": "reference", + "group": "features", + "other_url": "/docs/site-features/custom-pages/", + "path": "docs/6-4-custom-pages.es.md", + "order": 4 + }, + "/docs/site-features/custom-pages/": { + "url": "/docs/site-features/custom-pages/", + "title": "Custom Pages", + "section": "reference", + "group": "features", + "other_url": "/guia/funciones/paginas-personalizadas/", + "path": "docs/6-4-custom-pages.md", + "order": 4 + }, + "/guia/funciones/insercion/": { + "url": "/guia/funciones/insercion/", + "title": "Insertar historias de Telar en LMS y sitios web", + "section": "reference", + "group": "features", + "other_url": "/docs/site-features/embedding/", + "path": "docs/6-5-embedding.es.md", + "order": 5 + }, + "/docs/site-features/embedding/": { + "url": "/docs/site-features/embedding/", + "title": "Embedding Telar Stories in LMS & Websites", + "section": "reference", + "group": "features", + "other_url": "/guia/funciones/insercion/", + "path": "docs/6-5-embedding.md", + "order": 5 + }, + "/guia/personalizacion/": { + "url": "/guia/personalizacion/", + "title": "Personalización", + "section": "reference", + "group": "appearance", + "other_url": "/docs/customization/", + "path": "docs/7-0-customization.es.md", + "order": 7 + }, + "/docs/customization/": { + "url": "/docs/customization/", + "title": "Customization", + "section": "reference", + "group": "appearance", + "other_url": "/guia/personalizacion/", + "path": "docs/7-0-customization.md", + "order": 7 + }, + "/guia/personalizacion/temas/": { + "url": "/guia/personalizacion/temas/", + "title": "Temas", + "section": "reference", + "group": "appearance", + "other_url": "/docs/customization/themes/", + "path": "docs/7-1-themes.es.md", + "order": 1 + }, + "/docs/customization/themes/": { + "url": "/docs/customization/themes/", + "title": "Themes", + "section": "reference", + "group": "appearance", + "other_url": "/guia/personalizacion/temas/", + "path": "docs/7-1-themes.md", + "order": 1 + }, + "/guia/personalizacion/pagina-de-inicio/": { + "url": "/guia/personalizacion/pagina-de-inicio/", + "title": "Personalizar la página de inicio", + "section": "reference", + "group": "appearance", + "other_url": "/docs/customization/home-page/", + "path": "docs/7-2-home-page.es.md", + "order": 2 + }, + "/docs/customization/home-page/": { + "url": "/docs/customization/home-page/", + "title": "Customizing the Home Page", + "section": "reference", + "group": "appearance", + "other_url": "/guia/personalizacion/pagina-de-inicio/", + "path": "docs/7-2-home-page.md", + "order": 2 + }, + "/guia/personalizacion/menu-navegacion/": { + "url": "/guia/personalizacion/menu-navegacion/", + "title": "Configuración del menú de navegación", + "section": "reference", + "group": "appearance", + "other_url": "/docs/customization/navigation-menu/", + "path": "docs/7-3-navigation-menu.es.md", + "order": 3 + }, + "/docs/customization/navigation-menu/": { + "url": "/docs/customization/navigation-menu/", + "title": "Navigation Menu Configuration", + "section": "reference", + "group": "appearance", + "other_url": "/guia/personalizacion/menu-navegacion/", + "path": "docs/7-3-navigation-menu.md", + "order": 3 + }, + "/guia/personalizacion/contenido-demostracion/": { + "url": "/guia/personalizacion/contenido-demostracion/", + "title": "Contenido de demostración", + "section": "reference", + "group": "appearance", + "other_url": "/docs/customization/demo-content/", + "path": "docs/7-4-demo-content.es.md", + "order": 4 + }, + "/docs/customization/demo-content/": { + "url": "/docs/customization/demo-content/", + "title": "Demo Content", + "section": "reference", + "group": "appearance", + "other_url": "/guia/personalizacion/contenido-demostracion/", + "path": "docs/7-4-demo-content.md", + "order": 4 + }, + "/guia/desarrolladores/": { + "url": "/guia/desarrolladores/", + "title": "Para desarrolladores", + "section": "developers", + "group": "main", + "other_url": "/docs/developers/", + "path": "docs/8-0-for-developers.es.md", + "order": 8 + }, + "/docs/developers/": { + "url": "/docs/developers/", + "title": "For Developers", + "section": "developers", + "group": "main", + "other_url": "/guia/desarrolladores/", + "path": "docs/8-0-for-developers.md", + "order": 8 + }, + "/guia/desarrolladores/desarrollo-local/": { + "url": "/guia/desarrolladores/desarrollo-local/", + "title": "Desarrollo local", + "section": "developers", + "group": "main", + "other_url": "/docs/developers/local-development/", + "path": "docs/8-1-local-development.es.md", + "order": 1 + }, + "/docs/developers/local-development/": { + "url": "/docs/developers/local-development/", + "title": "Local Development", + "section": "developers", + "group": "main", + "other_url": "/guia/desarrolladores/desarrollo-local/", + "path": "docs/8-1-local-development.md", + "order": 1 + }, + "/guia/desarrolladores/github-actions/": { + "url": "/guia/desarrolladores/github-actions/", + "title": "GitHub Actions", + "section": "developers", + "group": "main", + "other_url": "/docs/developers/github-actions/", + "path": "docs/8-2-github-actions.es.md", + "order": 2 + }, + "/docs/developers/github-actions/": { + "url": "/docs/developers/github-actions/", + "title": "GitHub Actions Workflow", + "section": "developers", + "group": "main", + "other_url": "/guia/desarrolladores/github-actions/", + "path": "docs/8-2-github-actions.md", + "order": 2 + }, + "/guia/desarrolladores/sistema-demos/": { + "url": "/guia/desarrolladores/sistema-demos/", + "title": "Arquitectura del contenido de demostración", + "section": "developers", + "group": "main", + "other_url": "/docs/developers/demo-system/", + "path": "docs/8-3-demo-system-architecture.es.md", + "order": 3 + }, + "/docs/developers/demo-system/": { + "url": "/docs/developers/demo-system/", + "title": "Demo System Architecture", + "section": "developers", + "group": "main", + "other_url": "/guia/desarrolladores/sistema-demos/", + "path": "docs/8-3-demo-system-architecture.md", + "order": 3 + }, + "/guia/desarrolladores/sistema-insercion/": { + "url": "/guia/desarrolladores/sistema-insercion/", + "title": "Referencia del sistema de inserción", + "section": "developers", + "group": "main", + "other_url": "/docs/developers/embedding-system/", + "path": "docs/8-4-embedding-system.es.md", + "order": 4 + }, + "/docs/developers/embedding-system/": { + "url": "/docs/developers/embedding-system/", + "title": "Embedding System Reference", + "section": "developers", + "group": "main", + "other_url": "/guia/desarrolladores/sistema-insercion/", + "path": "docs/8-4-embedding-system.md", + "order": 4 + }, + "/guia/desarrolladores/estilos/": { + "url": "/guia/desarrolladores/estilos/", + "title": "Estilos avanzados", + "section": "developers", + "group": "main", + "other_url": "/docs/developers/styling/", + "path": "docs/8-5-styling.es.md", + "order": 5 + }, + "/docs/developers/styling/": { + "url": "/docs/developers/styling/", + "title": "Advanced Styling", + "section": "developers", + "group": "main", + "other_url": "/guia/desarrolladores/estilos/", + "path": "docs/8-5-styling.md", + "order": 5 + }, + "/guia/desarrolladores/moviles/": { + "url": "/guia/desarrolladores/moviles/", + "title": "Diseños y pantallas pequeñas", + "section": "developers", + "group": "main", + "other_url": "/docs/developers/mobile/", + "path": "docs/8-6-mobile.es.md", + "order": 6 + }, + "/docs/developers/mobile/": { + "url": "/docs/developers/mobile/", + "title": "Layouts and Small Screens", + "section": "developers", + "group": "main", + "other_url": "/guia/desarrolladores/moviles/", + "path": "docs/8-6-mobile.md", + "order": 6 + }, + "/guia/desarrolladores/motor-de-historias/": { + "url": "/guia/desarrolladores/motor-de-historias/", + "title": "Vocabulario del motor de historias", + "section": "developers", + "group": "main", + "other_url": "/docs/developers/story-engine/", + "path": "docs/8-7-story-engine.es.md", + "order": 7 + }, + "/docs/developers/story-engine/": { + "url": "/docs/developers/story-engine/", + "title": "Story Engine Vocabulary", + "section": "developers", + "group": "main", + "other_url": "/guia/desarrolladores/motor-de-historias/", + "path": "docs/8-7-story-engine.md", + "order": 7 + }, + "/guia/el-compositor/": { + "url": "/guia/el-compositor/", + "title": "Manual del Compositor", + "section": "compositor", + "group": "main", + "other_url": "/docs/the-compositor/", + "path": "docs/9-0-compositor.es.md", + "order": 9 + }, + "/docs/the-compositor/": { + "url": "/docs/the-compositor/", + "title": "Compositor manual", + "section": "compositor", + "group": "main", + "other_url": "/guia/el-compositor/", + "path": "docs/9-0-compositor.md", + "order": 9 + }, + "/guia/el-compositor/primeros-pasos/": { + "url": "/guia/el-compositor/primeros-pasos/", + "title": "Conectar un sitio existente", + "section": "compositor", + "group": "begin", + "other_url": "/docs/the-compositor/getting-started/", + "path": "docs/9-1-getting-started.es.md", + "order": 1 + }, + "/docs/the-compositor/getting-started/": { + "url": "/docs/the-compositor/getting-started/", + "title": "Connect an existing site", + "section": "compositor", + "group": "begin", + "other_url": "/guia/el-compositor/primeros-pasos/", + "path": "docs/9-1-getting-started.md", + "order": 1 + }, + "/guia/el-compositor/panel-de-control/": { + "url": "/guia/el-compositor/panel-de-control/", + "title": "Inicio y navegación", + "section": "compositor", + "group": "begin", + "other_url": "/docs/the-compositor/dashboard/", + "path": "docs/9-2-dashboard.es.md", + "order": 2 + }, + "/docs/the-compositor/dashboard/": { + "url": "/docs/the-compositor/dashboard/", + "title": "Start and navigation", + "section": "compositor", + "group": "begin", + "other_url": "/guia/el-compositor/panel-de-control/", + "path": "docs/9-2-dashboard.md", + "order": 2 + }, + "/guia/el-compositor/objetos/": { + "url": "/guia/el-compositor/objetos/", + "title": "Objetos", + "section": "compositor", + "group": "compose", + "other_url": "/docs/the-compositor/objects/", + "path": "docs/9-3-objects.es.md", + "order": 3 + }, + "/docs/the-compositor/objects/": { + "url": "/docs/the-compositor/objects/", + "title": "Objects", + "section": "compositor", + "group": "compose", + "other_url": "/guia/el-compositor/objetos/", + "path": "docs/9-3-objects.md", + "order": 3 + }, + "/guia/el-compositor/editor-historias/": { + "url": "/guia/el-compositor/editor-historias/", + "title": "Editor de historias", + "section": "compositor", + "group": "compose", + "other_url": "/docs/the-compositor/story-editor/", + "path": "docs/9-4-story-editor.es.md", + "order": 4 + }, + "/docs/the-compositor/story-editor/": { + "url": "/docs/the-compositor/story-editor/", + "title": "Story Editor", + "section": "compositor", + "group": "compose", + "other_url": "/guia/el-compositor/editor-historias/", + "path": "docs/9-4-story-editor.md", + "order": 4 + }, + "/guia/el-compositor/video-y-audio/": { + "url": "/guia/el-compositor/video-y-audio/", + "title": "Video y audio", + "section": "compositor", + "group": "compose", + "other_url": "/docs/the-compositor/video-audio/", + "path": "docs/9-5-video-audio.es.md", + "order": 5 + }, + "/docs/the-compositor/video-audio/": { + "url": "/docs/the-compositor/video-audio/", + "title": "Video and Audio", + "section": "compositor", + "group": "compose", + "other_url": "/guia/el-compositor/video-y-audio/", + "path": "docs/9-5-video-audio.md", + "order": 5 + }, + "/guia/el-compositor/publicacion/": { + "url": "/guia/el-compositor/publicacion/", + "title": "Publicación", + "section": "compositor", + "group": "publish", + "other_url": "/docs/the-compositor/publishing/", + "path": "docs/9-6-publishing.es.md", + "order": 6 + }, + "/docs/the-compositor/publishing/": { + "url": "/docs/the-compositor/publishing/", + "title": "Publishing", + "section": "compositor", + "group": "publish", + "other_url": "/guia/el-compositor/publicacion/", + "path": "docs/9-6-publishing.md", + "order": 6 + }, + "/guia/el-compositor/sincronizacion-y-actualizaciones/": { + "url": "/guia/el-compositor/sincronizacion-y-actualizaciones/", + "title": "Sincronización y actualizaciones", + "section": "compositor", + "group": "publish", + "other_url": "/docs/the-compositor/sync-updates/", + "path": "docs/9-7-sync-updates.es.md", + "order": 7 + }, + "/docs/the-compositor/sync-updates/": { + "url": "/docs/the-compositor/sync-updates/", + "title": "Sync and Updates", + "section": "compositor", + "group": "publish", + "other_url": "/guia/el-compositor/sincronizacion-y-actualizaciones/", + "path": "docs/9-7-sync-updates.md", + "order": 7 + }, + "/guia/": { + "url": "/guia/", + "title": "Guías", + "section": "guides", + "group": "main", + "other_url": "/docs/", + "path": "docs/index.es.md" + }, + "/docs/": { + "url": "/docs/", + "title": "Guides", + "section": "guides", + "group": "main", + "other_url": "/guia/", + "path": "docs/index.md" + }, + "/start/": { + "url": "/start/", + "title": "Workshop quick guide", + "section": "quick", + "group": "main", + "other_url": "/empezar/", + "path": "start.html" + }, + "/docs/plan/": { + "url": "/docs/plan/", + "title": "Plan an exhibition", + "section": "planning", + "group": "main", + "other_url": "/guia/planear/", + "path": "guides/planning.en.html" + }, + "/docs/the-compositor/iiif-to-story/": { + "url": "/docs/the-compositor/iiif-to-story/", + "title": "Use an IIIF object in a story", + "section": "compositor", + "group": "compose", + "other_url": "/guia/el-compositor/iiif-a-historia/", + "path": "guides/iiif.en.md" + }, + "/docs/google-sheets/": { + "url": "/docs/google-sheets/", + "title": "Google Sheets manual", + "section": "sheets", + "group": "main", + "other_url": "/guia/google-sheets/", + "path": "guides/sheets.en.html" + }, + "/docs/local-authoring/": { + "url": "/docs/local-authoring/", + "title": "Local authoring & builds", + "section": "local", + "group": "main", + "other_url": "/guia/autoria-local/", + "path": "guides/local.en.html" + }, + "/docs/reference/": { + "url": "/docs/reference/", + "title": "Reference", + "section": "reference", + "group": "main", + "other_url": "/guia/referencia/", + "path": "guides/reference.en.html" + }, + "/docs/teaching/": { + "url": "/docs/teaching/", + "title": "Teaching with Telar", + "section": "teaching", + "group": "main", + "other_url": "/guia/ensenar/", + "path": "guides/teaching.en.html" + }, + "/empezar/": { + "url": "/empezar/", + "title": "Guía rápida para talleres", + "section": "quick", + "group": "main", + "other_url": "/start/", + "path": "empezar.html" + }, + "/guia/planear/": { + "url": "/guia/planear/", + "title": "Planear una exhibición", + "section": "planning", + "group": "main", + "other_url": "/docs/plan/", + "path": "guides/planning.es.html" + }, + "/guia/el-compositor/iiif-a-historia/": { + "url": "/guia/el-compositor/iiif-a-historia/", + "title": "Usar un objeto IIIF en una historia", + "section": "compositor", + "group": "compose", + "other_url": "/docs/the-compositor/iiif-to-story/", + "path": "guides/iiif.es.md" + }, + "/guia/google-sheets/": { + "url": "/guia/google-sheets/", + "title": "Manual de Google Sheets", + "section": "sheets", + "group": "main", + "other_url": "/docs/google-sheets/", + "path": "guides/sheets.es.html" + }, + "/guia/autoria-local/": { + "url": "/guia/autoria-local/", + "title": "Autoría local", + "section": "local", + "group": "main", + "other_url": "/docs/local-authoring/", + "path": "guides/local.es.html" + }, + "/guia/referencia/": { + "url": "/guia/referencia/", + "title": "Referencia", + "section": "reference", + "group": "main", + "other_url": "/docs/reference/", + "path": "guides/reference.es.html" + }, + "/guia/ensenar/": { + "url": "/guia/ensenar/", + "title": "Enseñar con Telar", + "section": "teaching", + "group": "main", + "other_url": "/docs/teaching/", + "path": "guides/teaching.es.html" + }, + "/docs/plan/sources-and-framing/": { + "url": "/docs/plan/sources-and-framing/", + "title": "Choose sources and framing", + "section": "planning", + "group": "main", + "other_url": "/guia/planear/fuentes-y-encuadres/", + "path": "guides/planning-sources.en.md" + }, + "/guia/planear/fuentes-y-encuadres/": { + "url": "/guia/planear/fuentes-y-encuadres/", + "title": "Elige fuentes y encuadres", + "section": "planning", + "group": "main", + "other_url": "/docs/plan/sources-and-framing/", + "path": "guides/planning-sources.es.md" + }, + "/docs/plan/layers-and-glossary/": { + "url": "/docs/plan/layers-and-glossary/", + "title": "Plan panels and glossary links", + "section": "planning", + "group": "main", + "other_url": "/guia/planear/capas-y-glosario/", + "path": "guides/planning-layers.en.md" + }, + "/guia/planear/capas-y-glosario/": { + "url": "/guia/planear/capas-y-glosario/", + "title": "Planea los paneles y el glosario", + "section": "planning", + "group": "main", + "other_url": "/docs/plan/layers-and-glossary/", + "path": "guides/planning-layers.es.md" + }, + "/docs/plan/exhibition-layout/": { + "url": "/docs/plan/exhibition-layout/", + "title": "Arrange the whole exhibition", + "section": "planning", + "group": "main", + "other_url": "/guia/planear/organizar-la-exhibicion/", + "path": "guides/planning-layout.en.md" + }, + "/guia/planear/organizar-la-exhibicion/": { + "url": "/guia/planear/organizar-la-exhibicion/", + "title": "Organiza toda la exhibición", + "section": "planning", + "group": "main", + "other_url": "/docs/plan/exhibition-layout/", + "path": "guides/planning-layout.es.md" + }, + "/docs/plan/review/": { + "url": "/docs/plan/review/", + "title": "Test the exhibition with readers", + "section": "planning", + "group": "main", + "other_url": "/guia/planear/revision/", + "path": "guides/planning-review.en.md" + }, + "/guia/planear/revision/": { + "url": "/guia/planear/revision/", + "title": "Prueba la exhibición con lectores", + "section": "planning", + "group": "main", + "other_url": "/docs/plan/review/", + "path": "guides/planning-review.es.md" + }, + "/docs/the-compositor/glossary/": { + "url": "/docs/the-compositor/glossary/", + "title": "Create and link glossary entries", + "section": "compositor", + "group": "exhibition", + "other_url": "/guia/el-compositor/glosario/", + "path": "guides/compositor-glossary.en.md" + }, + "/guia/el-compositor/glosario/": { + "url": "/guia/el-compositor/glosario/", + "title": "Crea y enlaza entradas del glosario", + "section": "compositor", + "group": "exhibition", + "other_url": "/docs/the-compositor/glossary/", + "path": "guides/compositor-glossary.es.md" + }, + "/docs/the-compositor/pages/": { + "url": "/docs/the-compositor/pages/", + "title": "Arrange the homepage and pages", + "section": "compositor", + "group": "exhibition", + "other_url": "/guia/el-compositor/paginas/", + "path": "guides/compositor-pages.en.md" + }, + "/guia/el-compositor/paginas/": { + "url": "/guia/el-compositor/paginas/", + "title": "Organiza el inicio y las páginas", + "section": "compositor", + "group": "exhibition", + "other_url": "/docs/the-compositor/pages/", + "path": "guides/compositor-pages.es.md" + }, + "/docs/the-compositor/settings/": { + "url": "/docs/the-compositor/settings/", + "title": "Adjust appearance and site settings", + "section": "compositor", + "group": "exhibition", + "other_url": "/guia/el-compositor/configuracion/", + "path": "guides/compositor-settings.en.md" + }, + "/guia/el-compositor/configuracion/": { + "url": "/guia/el-compositor/configuracion/", + "title": "Ajusta la apariencia y la configuración", + "section": "compositor", + "group": "exhibition", + "other_url": "/docs/the-compositor/settings/", + "path": "guides/compositor-settings.es.md" + }, + "/docs/the-compositor/team/": { + "url": "/docs/the-compositor/team/", + "title": "Work with a team", + "section": "compositor", + "group": "team", + "other_url": "/guia/el-compositor/equipo/", + "path": "guides/compositor-team.en.md" + }, + "/guia/el-compositor/equipo/": { + "url": "/guia/el-compositor/equipo/", + "title": "Trabaja en equipo", + "section": "compositor", + "group": "team", + "other_url": "/docs/the-compositor/team/", + "path": "guides/compositor-team.es.md" + }, + "/docs/the-compositor/courses/": { + "url": "/docs/the-compositor/courses/", + "title": "Run a course with student sites", + "section": "compositor", + "group": "team", + "other_url": "/guia/el-compositor/cursos/", + "path": "guides/compositor-courses.en.md" + }, + "/guia/el-compositor/cursos/": { + "url": "/guia/el-compositor/cursos/", + "title": "Organiza un curso con sitios de estudiantes", + "section": "compositor", + "group": "team", + "other_url": "/docs/the-compositor/courses/", + "path": "guides/compositor-courses.es.md" + }, + "/docs/the-compositor/troubleshooting/": { + "url": "/docs/the-compositor/troubleshooting/", + "title": "Resolve problems and recover stories", + "section": "compositor", + "group": "publish", + "other_url": "/guia/el-compositor/solucionar-problemas/", + "path": "guides/compositor-recovery.en.md" + }, + "/guia/el-compositor/solucionar-problemas/": { + "url": "/guia/el-compositor/solucionar-problemas/", + "title": "Resuelve problemas y recupera historias", + "section": "compositor", + "group": "publish", + "other_url": "/docs/the-compositor/troubleshooting/", + "path": "guides/compositor-recovery.es.md" + }, + "/docs/local-authoring/content/": { + "url": "/docs/local-authoring/content/", + "title": "Edit objects, stories and text files", + "section": "local", + "group": "main", + "other_url": "/guia/autoria-local/contenido/", + "path": "guides/local-content.en.md" + }, + "/guia/autoria-local/contenido/": { + "url": "/guia/autoria-local/contenido/", + "title": "Edita objetos, historias y textos", + "section": "local", + "group": "main", + "other_url": "/docs/local-authoring/content/", + "path": "guides/local-content.es.md" + }, + "/docs/local-authoring/preview/": { + "url": "/docs/local-authoring/preview/", + "title": "Rebuild and inspect the local site", + "section": "local", + "group": "main", + "other_url": "/guia/autoria-local/vista-previa/", + "path": "guides/local-preview.en.md" + }, + "/guia/autoria-local/vista-previa/": { + "url": "/guia/autoria-local/vista-previa/", + "title": "Genera y revisa el sitio local", + "section": "local", + "group": "main", + "other_url": "/docs/local-authoring/preview/", + "path": "guides/local-preview.es.md" + }, + "/docs/local-authoring/publish/": { + "url": "/docs/local-authoring/publish/", + "title": "Publish and maintain a local project", + "section": "local", + "group": "main", + "other_url": "/guia/autoria-local/publicar/", + "path": "guides/local-publish.en.md" + }, + "/guia/autoria-local/publicar/": { + "url": "/guia/autoria-local/publicar/", + "title": "Publica y mantén un proyecto local", + "section": "local", + "group": "main", + "other_url": "/docs/local-authoring/publish/", + "path": "guides/local-publish.es.md" + }, + "/docs/teaching/request-access/": { + "url": "/docs/teaching/request-access/", + "title": "Request teaching-mode access", + "section": "teaching", + "group": "main", + "other_url": "/guia/ensenar/solicitar-acceso/", + "path": "guides/teaching-request.en.html" + }, + "/guia/ensenar/solicitar-acceso/": { + "url": "/guia/ensenar/solicitar-acceso/", + "title": "Solicita acceso al modo docente", + "section": "teaching", + "group": "main", + "other_url": "/docs/teaching/request-access/", + "path": "guides/teaching-request.es.html" + } + } +} diff --git a/_data/guides.json b/_data/guides.json new file mode 100644 index 0000000..46ac1c3 --- /dev/null +++ b/_data/guides.json @@ -0,0 +1,304 @@ +{ + "copy": { + "en": { + "guides": "Guides", + "explore": "Explore", + "teaching": "Teaching", + "about": "About", + "compositor": "Compositor", + "language": "Language", + "skip": "Skip to content", + "design": "Design sketch", + "brand_sub": "Visual storytelling", + "hero_tag": "Make an exhibition with Telar", + "hero_title": "From your sources to a visual story.", + "hero_intro": "Plan what you want to say, choose how to build it, and shape an exhibition your visitors can explore.", + "plan_tag": "Start with the story", + "plan_title": "Plan your exhibition", + "plan_text": "Read your sources closely. Sketch an opening and an ending. Connect your questions to details, then decide where readers can go deeper.", + "plan_link": "Start planning", + "beginning": "Beginning", + "question": "Questions & sources", + "layers": "Further layers", + "ending": "Ending", + "build_tag": "Choose your way of working", + "build_title": "Build your exhibition", + "build_intro": "There are three ways to author a Telar exhibition: use the Compositor's visual editor, organise your content in Google Sheets, or edit CSV and Markdown files on your computer. Each produces a Telar site; the difference is where you work on the content and how you preview and publish it.", + "reference_title": "Find a specific answer", + "reference_text": "Content formats, configuration, media, accessibility and troubleshooting. Shared reference for all three ways of building.", + "reference_link": "Browse the reference", + "teach_title": "Teach and learn with Telar", + "teach_text": "Workshop slides, a narrative planner and guides for developing visual stories in the classroom.", + "workshop": "Workshop slides", + "worksheet": "Download the planner", + "examples_title": "See the choices behind an exhibition", + "examples_text": "Explore finished projects to see how sources, image details and optional layers work together.", + "examples_link": "Explore projects", + "outline": "In this chapter", + "planning": "Plan an exhibition", + "chapter": "1. Purpose, audience and sources", + "guide_home": "All guides", + "back_build": "Choose how to build", + "footer": "Telar guides", + "purpose": "Purpose", + "audience": "Audience", + "source": "Sources", + "exercise": "Try it", + "next": "What comes next", + "nav_prefix": "Guide contents", + "book_link": "Compositor manual preview", + "preview_note": "Proposed structure · English and Spanish", + "site_home": "/", + "build_guidance": "Choose the approach that suits you and your collaborators. Each manual walks you through setup and a first story, then covers the tasks that follow. The planning guides and shared reference apply to all three." + }, + "es": { + "guides": "Guías", + "explore": "Explorar", + "teaching": "Enseñar", + "about": "Acerca de", + "compositor": "Compositor", + "language": "Idioma", + "skip": "Saltar al contenido", + "design": "Boceto de diseño", + "brand_sub": "Narrativas visuales", + "hero_tag": "Crea una exhibición con Telar", + "hero_title": "De tus fuentes a una narrativa visual.", + "hero_intro": "Planea lo que quieres contar, elige cómo construirlo y crea una exhibición que tus visitantes puedan explorar.", + "plan_tag": "Empieza por la historia", + "plan_title": "Planea tu exhibición", + "plan_text": "Observa tus fuentes con cuidado. Esboza un inicio y un cierre. Conecta tus preguntas con detalles y decide dónde se puede profundizar.", + "plan_link": "Empieza a planear", + "beginning": "Inicio", + "question": "Preguntas y fuentes", + "layers": "Capas adicionales", + "ending": "Cierre", + "build_tag": "Elige cómo trabajar", + "build_title": "Construye tu exhibición", + "build_intro": "Hay tres formas de crear una exhibición en Telar: usar el editor visual del Compositor, organizar el contenido en Google Sheets o editar archivos CSV y Markdown en tu computador. Las tres generan un sitio Telar; cambian el lugar donde trabajas en el contenido y la forma de previsualizarlo y publicarlo.", + "reference_title": "Encuentra una respuesta concreta", + "reference_text": "Formatos de contenido, configuración, medios, accesibilidad y solución de problemas. Una referencia común para las tres formas de construir.", + "reference_link": "Consulta la referencia", + "teach_title": "Enseña y aprende con Telar", + "teach_text": "Diapositivas del taller, un planeador narrativo y guías para desarrollar historias visuales en el aula.", + "workshop": "Diapositivas del taller", + "worksheet": "Descarga el planeador", + "examples_title": "Descubre las decisiones detrás de una exhibición", + "examples_text": "Explora proyectos terminados para ver cómo se relacionan las fuentes, los detalles de las imágenes y las capas opcionales.", + "examples_link": "Explora los proyectos", + "outline": "En este capítulo", + "planning": "Planear una exhibición", + "chapter": "1. Propósito, público y fuentes", + "guide_home": "Todas las guías", + "back_build": "Elige cómo construir", + "footer": "Guías de Telar", + "purpose": "Propósito", + "audience": "Público", + "source": "Fuentes", + "exercise": "Pruébalo", + "next": "Qué sigue", + "nav_prefix": "Contenido de la guía", + "book_link": "Borrador del manual del Compositor", + "preview_note": "Estructura propuesta · Inglés y español", + "site_home": "/?lang=es", + "build_guidance": "Elige la forma de trabajo que mejor se adapte a ti y a tu equipo. Cada manual te acompaña desde la configuración hasta una primera historia y luego desarrolla las tareas que siguen. Las guías de planeación y la referencia compartida sirven para las tres." + } + }, + "manuals": [ + { + "id": "compositor", + "en": { + "title": "Compositor", + "tag": "Visual authoring", + "text": "Work in your browser. Add objects, write stories, capture views, collaborate and publish.", + "link": "Read the manual", + "href": "/docs/the-compositor/" + }, + "es": { + "title": "Compositor", + "tag": "Autoría visual", + "text": "Trabaja en el navegador. Agrega objetos, escribe historias, captura encuadres, colabora y publica.", + "link": "Lee el manual", + "href": "/guia/el-compositor/" + } + }, + { + "id": "sheets", + "en": { + "title": "Google Sheets", + "tag": "Spreadsheet authoring", + "text": "Organise objects, steps and text in a spreadsheet, connect it to your site and preview the result.", + "link": "Read the manual", + "href": "/docs/google-sheets/" + }, + "es": { + "title": "Google Sheets", + "tag": "Autoría en hojas de cálculo", + "text": "Organiza objetos, pasos y textos en una hoja de cálculo, conéctala con tu sitio y revisa el resultado.", + "link": "Lee el manual", + "href": "/guia/google-sheets/" + } + }, + { + "id": "local", + "en": { + "title": "Local authoring & builds", + "tag": "Files and a local preview", + "text": "Write in CSV and Markdown, build on your own computer, customise the site and choose your hosting.", + "link": "Read the manual", + "href": "/docs/local-authoring/" + }, + "es": { + "title": "Autoría local", + "tag": "Archivos y vista previa local", + "text": "Escribe en CSV y Markdown, genera el sitio en tu computador, personalízalo y elige dónde alojarlo.", + "link": "Lee el manual", + "href": "/guia/autoria-local/" + } + } + ], + "quick": { + "en": { + "title": "Workshop quick guide", + "intro": "A short route from a source and a question to your first published story, using the Compositor.", + "tag": "Keep this open during the workshop", + "hub_title": "Here for a workshop?", + "hub_text": "Keep the short guide open while you work. Six steps, the essential controls and links when you need more help.", + "hub_link": "Open the quick guide", + "contents": "The six steps", + "saved": "Drafts and publication", + "saved_text": "Your edits are saved as you work. Use Publish to send them to the repository and rebuild the public site.", + "help": "If you get stuck", + "after": "After the workshop", + "after_text": "Return to the planning guide, explore the full Compositor manual, or choose Google Sheets or local authoring.", + "print": "Print this guide", + "shortlink": "Workshop link: telar.org/start", + "shortlink_note": "Keep this address to return to the six steps during or after a workshop.", + "labels": [ + "Plan", + "Connect", + "Add an object", + "Write the story", + "Frame and add context", + "Publish and check" + ] + }, + "es": { + "title": "Guía rápida para talleres", + "intro": "Un recorrido breve, con el Compositor, desde una fuente y una pregunta hasta tu primera historia publicada.", + "tag": "Ten esta guía abierta durante el taller", + "hub_title": "¿Vienes a un taller?", + "hub_text": "Ten la guía breve abierta mientras trabajas. Seis pasos, los controles esenciales y enlaces para cuando necesites más ayuda.", + "hub_link": "Abre la guía rápida", + "contents": "Los seis pasos", + "saved": "Borradores y publicación", + "saved_text": "Tus cambios se guardan mientras trabajas. Usa Publicar para enviarlos al repositorio y regenerar el sitio público.", + "help": "Si te atascas", + "after": "Después del taller", + "after_text": "Retoma la guía de planeación, explora el manual completo del Compositor o elige Google Sheets o autoría local.", + "print": "Imprime esta guía", + "shortlink": "Enlace para talleres: telar.org/empezar", + "shortlink_note": "Guarda esta dirección para volver a los seis pasos durante o después de un taller.", + "labels": [ + "Planear", + "Conectar", + "Agregar un objeto", + "Escribir la historia", + "Encuadrar y agregar contexto", + "Publicar y revisar" + ] + } + }, + "quick_steps": [ + { + "id": "plan", + "en": { + "title": "Start with a source and a question", + "text": "Choose one source you can share. Write an opening question, a possible ending and two or three questions to connect them.", + "link": "Use the narrative planner", + "href": "/assets/templates/telar-worksheet.pdf" + }, + "es": { + "title": "Empieza con una fuente y una pregunta", + "text": "Elige una fuente que puedas compartir. Escribe una pregunta inicial, un posible cierre y dos o tres preguntas para conectarlos.", + "link": "Usa el planeador narrativo", + "href": "/assets/templates/telar-worksheet.pdf" + } + }, + { + "id": "connect", + "en": { + "title": "Open the Compositor and create your site", + "text": "Open the Compositor and sign in with GitHub. Follow the setup instructions, choose Create a new Telar site and give it a name with lowercase letters and hyphens. If you already have a site, open or connect that one.", + "link": "Setup help", + "href": "/docs/the-compositor/getting-started/" + }, + "es": { + "title": "Abre el Compositor y crea tu sitio", + "text": "Abre el Compositor e inicia sesión con GitHub. Sigue las instrucciones, elige Crear un nuevo sitio Telar y usa un nombre con letras minúsculas y guiones. Si ya tienes un sitio, ábrelo o conéctalo.", + "link": "Ayuda para empezar", + "href": "/guia/el-compositor/primeros-pasos/" + } + }, + { + "id": "object", + "en": { + "title": "Add your source to Objects", + "text": "In Objects, choose + Add object. Upload an image with Upload file, or use IIIF manifest and Fetch manifest for an external collection. Review the title, source and credit.", + "link": "Try the khipu IIIF example", + "href": "/docs/the-compositor/iiif-to-story/" + }, + "es": { + "title": "Agrega tu fuente a Objetos", + "text": "En Objetos, pulsa + Agregar objeto. Sube una imagen con Subir archivo, o usa Manifiesto IIIF y Obtener manifiesto para una colección externa. Revisa el título, la fuente y el crédito.", + "link": "Prueba el ejemplo IIIF del khipu", + "href": "/guia/el-compositor/iiif-a-historia/" + } + }, + { + "id": "story", + "en": { + "title": "Create a short story", + "text": "Open Stories and choose + New Story. Give it a title, then use + Add step and Change object to select your source. Write a question and a brief answer. Repeat for your next questions.", + "link": "Read the story walkthrough", + "href": "/docs/the-compositor/iiif-to-story/#choose" + }, + "es": { + "title": "Crea una historia breve", + "text": "Abre Historias y elige + Nueva historia. Ponle un título; después, usa + Agregar paso y Cambiar objeto para seleccionar la fuente. Escribe una pregunta y una respuesta breve. Repite con las siguientes preguntas.", + "link": "Consulta el recorrido de historias", + "href": "/guia/el-compositor/iiif-a-historia/#elegir" + } + }, + { + "id": "frame", + "en": { + "title": "Frame the detail and offer context", + "text": "On each image step, pan and zoom to the detail you want to discuss, then choose Capture position. Use + Add panel when a step needs a longer explanation. Keep the main answer short.", + "link": "See the framing controls", + "href": "/docs/the-compositor/iiif-to-story/#frame" + }, + "es": { + "title": "Encuadra el detalle y ofrece contexto", + "text": "En cada paso con imagen, desplázala y ajusta el zoom hasta el detalle que quieras comentar; después, pulsa Capturar posición. Usa + Agregar panel cuando necesites una explicación más larga. Mantén breve la respuesta principal.", + "link": "Mira los controles de encuadre", + "href": "/guia/el-compositor/iiif-a-historia/#encuadrar" + } + }, + { + "id": "publish", + "en": { + "title": "Publish, then visit the result", + "text": "Open Publish, review your changes and resolve any blocking errors. Publish and wait for the build to finish. Visit the public story and check its images, framing, text and credits. If the story is marked Draft, it will not appear in the public exhibition.", + "link": "Publishing help", + "href": "/docs/the-compositor/publishing/" + }, + "es": { + "title": "Publica y visita el resultado", + "text": "Abre Publicar, revisa los cambios y resuelve los errores que impidan publicar. Publica y espera a que termine de generarse el sitio. Visita la historia pública y revisa imágenes, encuadres, textos y créditos. Si la historia está marcada como borrador, no aparecerá en la exhibición pública.", + "link": "Ayuda para publicar", + "href": "/guia/el-compositor/publicacion/" + } + } + ], + "diagram_end_direction": "up" +} diff --git a/_data/guides_sketch.json b/_data/guides_sketch.json new file mode 100644 index 0000000..7caa676 --- /dev/null +++ b/_data/guides_sketch.json @@ -0,0 +1,302 @@ +{ + "copy": { + "en": { + "guides": "Guides", + "explore": "Explore", + "teaching": "Teaching", + "about": "About", + "compositor": "Compositor", + "language": "Language", + "skip": "Skip to content", + "design": "Design sketch", + "brand_sub": "Visual storytelling", + "hero_tag": "Make an exhibition with Telar", + "hero_title": "From your sources to a visual story.", + "hero_intro": "Plan what you want to say, choose how to build it, and shape an exhibition your visitors can explore.", + "plan_tag": "Start with the story", + "plan_title": "Plan your exhibition", + "plan_text": "Read your sources closely. Sketch an opening and an ending. Connect your questions to details, then decide where readers can go deeper.", + "plan_link": "Start planning", + "beginning": "Beginning", + "question": "Questions & sources", + "layers": "Further layers", + "ending": "Ending", + "build_tag": "Choose your way of working", + "build_title": "Build your exhibition", + "build_intro": "Three manuals, each with a first-story walkthrough and focused guides for the work that follows.", + "reference_title": "Find a specific answer", + "reference_text": "Content formats, configuration, media, accessibility and troubleshooting. Shared reference for all three ways of building.", + "reference_link": "Browse current reference", + "teach_title": "Teach and learn with Telar", + "teach_text": "Use the workshop and narrative planner to develop a story together. A future teaching section can bring together assignments and classroom guides.", + "workshop": "Workshop slides", + "worksheet": "Download the planner", + "examples_title": "See the choices behind an exhibition", + "examples_text": "Explore finished projects. The proposed case studies would explain their sources, storyboards and use of layers, with links to the relevant guides.", + "examples_link": "Explore projects", + "outline": "In this chapter", + "planning": "Plan an exhibition", + "chapter": "1. Purpose, audience and sources", + "guide_home": "All guides", + "back_build": "Choose how to build", + "footer": "Preview for discussion. The planning chapter is a draft; Sheets, local-authoring and reference links open the current documentation.", + "purpose": "Purpose", + "audience": "Audience", + "source": "Sources", + "exercise": "Try it", + "next": "What comes next", + "nav_prefix": "Guide contents", + "book_link": "Compositor manual preview", + "preview_note": "Proposed structure · English and Spanish", + "site_home": "/" + }, + "es": { + "guides": "Guías", + "explore": "Explorar", + "teaching": "Enseñar", + "about": "Acerca de", + "compositor": "Compositor", + "language": "Idioma", + "skip": "Saltar al contenido", + "design": "Boceto de diseño", + "brand_sub": "Narrativas visuales", + "hero_tag": "Crea una exhibición con Telar", + "hero_title": "De tus fuentes a una narrativa visual.", + "hero_intro": "Planea lo que quieres contar, elige cómo construirlo y crea una exhibición que tus visitantes puedan explorar.", + "plan_tag": "Empieza por la historia", + "plan_title": "Planea tu exhibición", + "plan_text": "Observa tus fuentes con cuidado. Esboza un inicio y un cierre. Conecta tus preguntas con detalles y decide dónde se puede profundizar.", + "plan_link": "Empieza a planear", + "beginning": "Inicio", + "question": "Preguntas y fuentes", + "layers": "Capas adicionales", + "ending": "Cierre", + "build_tag": "Elige cómo trabajar", + "build_title": "Construye tu exhibición", + "build_intro": "Tres manuales, cada uno con un recorrido para crear tu primera historia y guías para las tareas que siguen.", + "reference_title": "Encuentra una respuesta concreta", + "reference_text": "Formatos de contenido, configuración, medios, accesibilidad y solución de problemas. Una referencia común para las tres formas de construir.", + "reference_link": "Consulta la referencia actual", + "teach_title": "Enseña y aprende con Telar", + "teach_text": "Usa el taller y el planeador narrativo para desarrollar una historia en grupo. La futura sección de enseñanza puede reunir actividades y guías para el aula.", + "workshop": "Diapositivas del taller", + "worksheet": "Descarga el planeador", + "examples_title": "Descubre las decisiones detrás de una exhibición", + "examples_text": "Explora proyectos terminados. Los casos comentados que proponemos explicarían sus fuentes, esquemas narrativos y capas, con enlaces a las guías correspondientes.", + "examples_link": "Explora los proyectos", + "outline": "En este capítulo", + "planning": "Planear una exhibición", + "chapter": "1. Propósito, público y fuentes", + "guide_home": "Todas las guías", + "back_build": "Elige cómo construir", + "footer": "Vista previa para conversar. El capítulo de planeación es un borrador; los enlaces de Sheets, autoría local y referencia abren la documentación actual.", + "purpose": "Propósito", + "audience": "Público", + "source": "Fuentes", + "exercise": "Pruébalo", + "next": "Qué sigue", + "nav_prefix": "Contenido de la guía", + "book_link": "Borrador del manual del Compositor", + "preview_note": "Estructura propuesta · Inglés y español", + "site_home": "/?lang=es" + } + }, + "manuals": [ + { + "id": "compositor", + "en": { + "title": "Compositor", + "tag": "Visual authoring", + "text": "Work in your browser. Add objects, write stories, capture views, collaborate and publish.", + "link": "Open the manual preview", + "href": "/manual/en/" + }, + "es": { + "title": "Compositor", + "tag": "Autoría visual", + "text": "Trabaja en el navegador. Agrega objetos, escribe historias, captura encuadres, colabora y publica.", + "link": "Abre el borrador del manual", + "href": "/manual/es/" + } + }, + { + "id": "sheets", + "en": { + "title": "Google Sheets", + "tag": "Spreadsheet authoring", + "text": "Organise objects, steps and text in a spreadsheet, connect it to your site and preview the result.", + "link": "Read the current guide", + "href": "/docs/getting-started/google-sheets/" + }, + "es": { + "title": "Google Sheets", + "tag": "Autoría en hojas de cálculo", + "text": "Organiza objetos, pasos y textos en una hoja de cálculo, conéctala con tu sitio y revisa el resultado.", + "link": "Lee la guía actual", + "href": "/guia/primeros-pasos/google-sheets/" + } + }, + { + "id": "local", + "en": { + "title": "Local authoring & builds", + "tag": "Files and a local preview", + "text": "Write in CSV and Markdown, build on your own computer, customise the site and choose your hosting.", + "link": "Read the current guide", + "href": "/docs/getting-started/local-dev/" + }, + "es": { + "title": "Autoría local", + "tag": "Archivos y vista previa local", + "text": "Escribe en CSV y Markdown, genera el sitio en tu computador, personalízalo y elige dónde alojarlo.", + "link": "Lee la guía actual", + "href": "/guia/primeros-pasos/desarrollo-local/" + } + } + ], + "quick": { + "en": { + "title": "Workshop quick guide", + "intro": "A short route from a source and a question to your first published story, using the Compositor.", + "tag": "Keep this open during the workshop", + "hub_title": "Here for a workshop?", + "hub_text": "Keep the short guide open while you work. Six steps, the essential controls and links when you need more help.", + "hub_link": "Open the quick guide", + "contents": "The six steps", + "saved": "Drafts and publication", + "saved_text": "Your edits are saved as you work. Use Publish to send them to the repository and rebuild the public site.", + "help": "If you get stuck", + "after": "After the workshop", + "after_text": "Return to the planning guide, explore the full Compositor manual, or choose Google Sheets or local authoring.", + "print": "Print this guide", + "shortlink": "Proposed workshop link: telar.org/start", + "shortlink_note": "The existing /start shortcut can point here once the guide is reviewed and published.", + "labels": [ + "Plan", + "Connect", + "Add an object", + "Write the story", + "Frame and add context", + "Publish and check" + ] + }, + "es": { + "title": "Guía rápida para talleres", + "intro": "Un recorrido breve, con el Compositor, desde una fuente y una pregunta hasta tu primera historia publicada.", + "tag": "Ten esta guía abierta durante el taller", + "hub_title": "¿Vienes a un taller?", + "hub_text": "Ten la guía breve abierta mientras trabajas. Seis pasos, los controles esenciales y enlaces para cuando necesites más ayuda.", + "hub_link": "Abre la guía rápida", + "contents": "Los seis pasos", + "saved": "Borradores y publicación", + "saved_text": "Tus cambios se guardan mientras trabajas. Usa Publicar para enviarlos al repositorio y regenerar el sitio público.", + "help": "Si te atascas", + "after": "Después del taller", + "after_text": "Retoma la guía de planeación, explora el manual completo del Compositor o elige Google Sheets o autoría local.", + "print": "Imprime esta guía", + "shortlink": "Enlace propuesto para talleres: telar.org/start", + "shortlink_note": "El acceso corto /start puede dirigir aquí cuando revisemos y publiquemos la guía.", + "labels": [ + "Planear", + "Conectar", + "Agregar un objeto", + "Escribir la historia", + "Encuadrar y agregar contexto", + "Publicar y revisar" + ] + } + }, + "quick_steps": [ + { + "id": "plan", + "en": { + "title": "Start with a source and a question", + "text": "Choose one source you can share. Write an opening question, a possible ending and two or three questions to connect them.", + "link": "Use the narrative planner", + "href": "/assets/templates/telar-worksheet.pdf" + }, + "es": { + "title": "Empieza con una fuente y una pregunta", + "text": "Elige una fuente que puedas compartir. Escribe una pregunta inicial, un posible cierre y dos o tres preguntas para conectarlos.", + "link": "Usa el planeador narrativo", + "href": "/assets/templates/telar-worksheet.pdf" + } + }, + { + "id": "connect", + "en": { + "title": "Open the Compositor and create your site", + "text": "Open the Compositor and sign in with GitHub. Follow the setup instructions, choose Create a new Telar site and give it a name with lowercase letters and hyphens. If you already have a site, open or connect that one.", + "link": "Setup help", + "href": "/docs/the-compositor/getting-started/" + }, + "es": { + "title": "Abre el Compositor y crea tu sitio", + "text": "Abre el Compositor e inicia sesión con GitHub. Sigue las instrucciones, elige Crear un nuevo sitio Telar y usa un nombre con letras minúsculas y guiones. Si ya tienes un sitio, ábrelo o conéctalo.", + "link": "Ayuda para empezar", + "href": "/guia/el-compositor/primeros-pasos/" + } + }, + { + "id": "object", + "en": { + "title": "Add your source to Objects", + "text": "In Objects, choose + Add object. Upload an image with Upload file, or use IIIF manifest and Fetch manifest for an external collection. Review the title, source and credit.", + "link": "Try the khipu IIIF example", + "href": "/manual/en/iiif-to-story/" + }, + "es": { + "title": "Agrega tu fuente a Objetos", + "text": "En Objetos, pulsa + Agregar objeto. Sube una imagen con Subir archivo, o usa Manifiesto IIIF y Obtener manifiesto para una colección externa. Revisa el título, la fuente y el crédito.", + "link": "Prueba el ejemplo IIIF del khipu", + "href": "/manual/es/iiif-a-historia/" + } + }, + { + "id": "story", + "en": { + "title": "Create a short story", + "text": "Open Stories and choose + New Story. Give it a title, then use + Add step and Change object to select your source. Write a question and a brief answer. Repeat for your next questions.", + "link": "Read the story walkthrough", + "href": "/manual/en/iiif-to-story/#choose" + }, + "es": { + "title": "Crea una historia breve", + "text": "Abre Historias y elige + Nueva historia. Ponle un título; después, usa + Agregar paso y Cambiar objeto para seleccionar la fuente. Escribe una pregunta y una respuesta breve. Repite con las siguientes preguntas.", + "link": "Consulta el recorrido de historias", + "href": "/manual/es/iiif-a-historia/#elegir" + } + }, + { + "id": "frame", + "en": { + "title": "Frame the detail and offer context", + "text": "On each image step, pan and zoom to the detail you want to discuss, then choose Capture position. Use + Add panel when a step needs a longer explanation. Keep the main answer short.", + "link": "See the framing controls", + "href": "/manual/en/iiif-to-story/#frame" + }, + "es": { + "title": "Encuadra el detalle y ofrece contexto", + "text": "En cada paso con imagen, desplázala y ajusta el zoom hasta el detalle que quieras comentar; después, pulsa Capturar posición. Usa + Agregar panel cuando necesites una explicación más larga. Mantén breve la respuesta principal.", + "link": "Mira los controles de encuadre", + "href": "/manual/es/iiif-a-historia/#encuadrar" + } + }, + { + "id": "publish", + "en": { + "title": "Publish, then visit the result", + "text": "Open Publish, review your changes and resolve any blocking errors. Publish and wait for the build to finish. Visit the public story and check its images, framing, text and credits. If the story is marked Draft, it will not appear in the public exhibition.", + "link": "Publishing help", + "href": "/docs/the-compositor/publishing/" + }, + "es": { + "title": "Publica y visita el resultado", + "text": "Abre Publicar, revisa los cambios y resuelve los errores que impidan publicar. Publica y espera a que termine de generarse el sitio. Visita la historia pública y revisa imágenes, encuadres, textos y créditos. Si la historia está marcada como borrador, no aparecerá en la exhibición pública.", + "link": "Ayuda para publicar", + "href": "/guia/el-compositor/publicacion/" + } + } + ], + "diagram_end_direction": "up" +} diff --git a/_data/homepage_demo.json b/_data/homepage_demo.json new file mode 100644 index 0000000..2dd2142 --- /dev/null +++ b/_data/homepage_demo.json @@ -0,0 +1,44 @@ +{ + "es": { + "vimeo": "https://player.vimeo.com/video/1241745045?h=9f98bd213d&badge=0&autopause=0&player_id=0&app_id=58479&autoplay=1&muted=1&loop=1", + "poster": "/assets/homepage-demo/posters/es.jpg", + "title": "Demostración de Telar", + "error": "No se pudo cargar el video.", + "watch": "Ver en Vimeo", + "summary": [ + "Objetos: Fuentes para explorar", + "Pasos: Preguntas, respuestas e invitaciones", + "Paneles: Fuentes e interpretación", + "Glosario: Definiciones compartidas entre historias", + "Construye tu exhibición con el Compositor de Telar.", + "Elige las fuentes y organiza los pasos de la historia.", + "Agrega imágenes IIIF externas y sus metadatos.", + "Edita los metadatos, organiza los pasos y escribe los paneles.", + "Encuadra la imagen y captura la posición de cada paso.", + "Colabora en tiempo real.", + "Publica tu propio sitio.", + "Código abierto. Computación mínima. Tu contenido, en tu propio repositorio." + ] + }, + "en": { + "vimeo": "https://player.vimeo.com/video/1241792049?h=68f09533de&badge=0&autopause=0&player_id=0&app_id=58479&autoplay=1&muted=1&loop=1", + "poster": "/assets/homepage-demo/posters/en.jpg", + "title": "Telar demonstration", + "error": "The video could not be loaded.", + "watch": "Watch on Vimeo", + "summary": [ + "Objects: Sources to explore", + "Steps: Questions, answers and invitations", + "Panels: Sources and interpretation", + "Glossary: Definitions shared across stories", + "Build your exhibition with Telar Compositor.", + "Choose your sources and arrange your story’s steps.", + "Add external IIIF images and their metadata.", + "Edit metadata, arrange steps and write panels.", + "Frame the image and save the view for each step.", + "Collaborate in real time.", + "Publish your own site.", + "Open source. Minimal computing. Your content, in your own repository." + ] + } +} diff --git a/_data/site_copy.json b/_data/site_copy.json new file mode 100644 index 0000000..b746a93 --- /dev/null +++ b/_data/site_copy.json @@ -0,0 +1,8 @@ +{ + "en": { + "description": "A minimal-computing framework that weaves together IIIF images, audio, video, and texts to create layered visual narratives for digital scholarship, public exhibitions, community storytelling, and classroom projects." + }, + "es": { + "description": "Un marco de computación mínima que entreteje imágenes IIIF, audio, video y textos en narrativas visuales por capas para humanidades digitales, exposiciones públicas, narrativa comunitaria y proyectos en el salón de clase." + } +} diff --git a/_data/teaching_contact.json b/_data/teaching_contact.json new file mode 100644 index 0000000..6f27103 --- /dev/null +++ b/_data/teaching_contact.json @@ -0,0 +1,58 @@ +{ + "en": { + "title": "Request teaching-mode access", + "name": "Your name", + "email": "Reply email", + "github": "GitHub username (optional)", + "github_help": "The account you use in the Compositor, if you already have one.", + "institution": "Institution or organisation (optional)", + "course": "How would you like to use Telar?", + "course_help": "A few sentences about your course, workshop or student project are enough.", + "privacy": "Your request is shared privately with the Telar team so we can reply.", + "send": "Send request", + "sending": "Sending…", + "success_title": "Your request has been received", + "success": "We’ll reply using the email you provided. Teaching access is enabled after the team reviews your request.", + "failure": "We couldn’t send your request. Your answers are still in the form; please try again.", + "validation": "Please check the highlighted fields.", + "verification": "Please complete the verification and try again.", + "field_error": "Check this field.", + "noscript": "Enable JavaScript to send this form.", + "back": "Back to Teaching with Telar", + "honeypot": "Leave this field empty", + "intro_paragraphs": [ + "Drawing on our own experience teaching with Telar, we have built a new teaching mode in the Compositor, which we are now testing. It is designed to help educators organise class projects and support students as they create their own visual narratives.", + "A Telar project asks students to look closely at sources and turn their research into a narrative for an audience. They select evidence, decide what to show, connect observations and provide the context a reader needs. A project might explore a work of art, trace changes in a landscape through maps and photographs, or bring archival materials and oral histories together in a community exhibition. These assignments offer opportunities to practise interpretation, writing, collaboration and digital publishing, and to produce something students can share and develop beyond the course.", + "Use the Compositor with your class: share a collection of objects, let student groups build their own exhibitions and review their sites from one course workspace.", + "We would love to share this tool with educators working in different disciplines, institutions and learning environments, and to learn from how you use it. If you would like access, please use the form below to tell us about your course, workshop or student project. We will do our best to reply as quickly as possible." + ] + }, + "es": { + "title": "Solicita acceso al modo docente", + "name": "Tu nombre", + "email": "Correo para responderte", + "github": "Usuario de GitHub (opcional)", + "github_help": "La cuenta con la que entras al Compositor, si ya tienes una.", + "institution": "Institución u organización (opcional)", + "course": "¿Cómo te gustaría usar Telar?", + "course_help": "Bastan unas frases sobre el curso, taller o proyecto estudiantil.", + "privacy": "Tu solicitud llega de forma privada al equipo de Telar, para que podamos responderte.", + "send": "Enviar solicitud", + "sending": "Enviando…", + "success_title": "Recibimos tu solicitud", + "success": "Te responderemos al correo que indicaste. Habilitamos el acceso al modo docente después de revisar tu solicitud.", + "failure": "No pudimos enviar tu solicitud. Lo que escribiste sigue en el formulario: intenta de nuevo.", + "validation": "Revisa los campos señalados.", + "verification": "Completa la verificación e intenta de nuevo.", + "field_error": "Revisa este campo.", + "noscript": "Activa JavaScript para enviar este formulario.", + "back": "Volver a Enseñar con Telar", + "honeypot": "Deja este campo vacío", + "intro_paragraphs": [ + "A partir de lo que hemos aprendido al enseñar con Telar, desarrollamos en el Compositor un nuevo modo docente, que todavía estamos probando. Está pensado para que docentes organicen proyectos de clase y acompañen a los estudiantes mientras crean sus propias narrativas visuales.", + "Un proyecto en Telar invita a los estudiantes a observar las fuentes con atención y a convertir su investigación en una narrativa para un público. Eligen la evidencia, deciden qué mostrar, relacionan sus observaciones y dan a quien lee el contexto que necesita. Un proyecto puede explorar una obra de arte, seguir en mapas y fotografías cómo cambia un paisaje o reunir materiales de archivo e historias orales en una exhibición comunitaria. En estas actividades, los estudiantes pueden practicar la interpretación, la escritura, el trabajo colaborativo y la publicación digital, y crear algo para compartir y seguir desarrollando después del curso.", + "Con el modo docente puedes usar el Compositor con tu clase: compartir una colección de objetos, dejar que cada grupo de estudiantes cree su propia exhibición y revisar los sitios de todos los grupos desde un mismo espacio de curso.", + "Nos encantaría compartir esta herramienta con docentes de distintas disciplinas, instituciones y contextos educativos, y aprender de los usos que le den. Si te interesa obtener acceso, cuéntanos en el formulario de abajo sobre tu curso, taller o proyecto estudiantil. Haremos lo posible por responderte cuanto antes." + ] + } +} diff --git a/_includes/docs/anchor-aliases.html b/_includes/docs/anchor-aliases.html new file mode 100644 index 0000000..6c6ecbc --- /dev/null +++ b/_includes/docs/anchor-aliases.html @@ -0,0 +1 @@ +{% assign anchors = site.data.docs_anchor_aliases[page.url][include.target] %}{% for anchor in anchors %}{% endfor %} diff --git a/_includes/docs/build-options.html b/_includes/docs/build-options.html new file mode 100644 index 0000000..3cd426c --- /dev/null +++ b/_includes/docs/build-options.html @@ -0,0 +1,4 @@ +{% assign lang = page.lang %}{% assign routes = site.data.docs_navigation.routes[lang] %}{% assign c = site.data.guides.copy[lang] %}{% assign q = site.data.guides.quick[lang] %} +
{% if lang == 'es' %}¿Vienes a un taller?{% else %}Here for a workshop?{% endif %}

{{ q.title }} →

+

{{ c.plan_title }} →

+
{% for manual in site.data.guides.manuals %}{% assign m = manual[lang] %}{% endfor %}
diff --git a/_includes/docs/guides-hub.html b/_includes/docs/guides-hub.html new file mode 100644 index 0000000..b29aa0f --- /dev/null +++ b/_includes/docs/guides-hub.html @@ -0,0 +1,11 @@ +{% assign c = site.data.guides.copy[page.lang] %}{% assign q = site.data.guides.quick[page.lang] %}{% assign es = false %}{% if page.lang == "es" %}{% assign es = true %}{% endif %} +{% include docs/anchor-aliases.html target="top" %}

{{ c.hero_tag }}

{{ c.hero_title }}

{{ c.hero_intro }}

+ +{% include docs/anchor-aliases.html target="planning" %}

{{ c.plan_tag }}

{{ c.plan_title }}

{{ c.plan_text }}

{{ c.plan_link }} →
+{% include docs/story-arc.html %}
+{% include docs/anchor-aliases.html target="build" %}

{{ c.build_tag }}

{{ c.build_title }}

{{ c.build_intro }}

{{ c.build_guidance }}

+{% for manual in site.data.guides.manuals %}{% assign m = manual[page.lang] %}{% endfor %} +
+{% include docs/anchor-aliases.html target="reference" %}

{% if es %}Referencia{% else %}Reference{% endif %}

{{ c.reference_title }}

{{ c.reference_text }}

{{ c.reference_link }} →
+

{{ c.teaching }}

{{ c.teach_title }}

{{ c.teach_text }}

+

{% if es %}Explora{% else %}Explore{% endif %}

{{ c.examples_title }}

{{ c.examples_text }}

{{ c.examples_link }} →
diff --git a/_includes/docs/media.html b/_includes/docs/media.html new file mode 100644 index 0000000..7c2d627 --- /dev/null +++ b/_includes/docs/media.html @@ -0,0 +1,4 @@ +{% assign media = site.data.docs_media.items[include.id][page.lang] %}{% assign media_labels = site.data.docs_media.labels[page.lang] %}{% assign media_uid = include.id | append: '-' | append: page.url | slugify %} +{% if media %}
+{{ media.alt | escape }} +

{{ media.caption }}

{% if media.animation %}{% endif %}{{ media_labels.open }} ↗{% if media.animation %}{{ media_labels.gif }}{% endif %}
{% endif %} diff --git a/_includes/docs/quick-guide.html b/_includes/docs/quick-guide.html new file mode 100644 index 0000000..dabc10a --- /dev/null +++ b/_includes/docs/quick-guide.html @@ -0,0 +1,8 @@ +{% assign q = site.data.guides.quick[page.lang] %}{% assign c = site.data.guides.copy[page.lang] %}{% assign es = false %}{% if page.lang == "es" %}{% assign es = true %}{% endif %} + +

{{ q.tag }}

{{ q.title }}

{{ q.intro }}

+ +
{{ q.saved }}

{{ q.saved_text }}

+
    {% for step in site.data.guides.quick_steps %}{% assign item = step[page.lang] %}
  1. {{ item.title }}

    {{ item.text }}

    {{ item.link }} →
  2. {% endfor %}
+ +

{{ q.after }}

{{ q.after_text }}

{{ c.guide_home }} → diff --git a/_includes/docs/section-overview.html b/_includes/docs/section-overview.html new file mode 100644 index 0000000..7e562a7 --- /dev/null +++ b/_includes/docs/section-overview.html @@ -0,0 +1,107 @@ +{% assign lang = page.lang %}{% assign es = false %}{% if lang == 'es' %}{% assign es = true %}{% endif %}{% assign nav = site.data.docs_navigation %}{% assign routes = nav.routes[lang] %}{% assign book = nav.sections[lang][page.docs_section] %} +

{{ book.title }}

+{% case page.docs_section %} +{% when 'sheets' %} +{% if es %} +

La autoría con Google Sheets te permite crear una exhibición en Telar desde una hoja de cálculo compartida. Registras tus fuentes, organizas los pasos de las historias y escribes los textos en filas y columnas; Telar lee ese contenido y genera el sitio web.

+

Esta forma de trabajo es útil si prefieres editar en una hoja de cálculo, revisar varios registros a la vez o escribir con un equipo. La hoja reúne el contenido narrativo y los metadatos. Las imágenes y los demás medios se cargan desde sus direcciones de origen o desde los archivos del sitio.

+

Cómo se organiza la hoja de cálculo

+ +

Cómo funciona

+
    +
  1. Prepara el sitio y la hoja. Crea un repositorio de Telar en GitHub, copia la plantilla de Google Sheets y conecta su dirección publicada con el sitio.
  2. +
  3. Escribe y organiza. Registra objetos, agrega historias y pasos, y desarrolla los textos. Usa el visor del sitio para elegir los encuadres.
  4. +
  5. Genera y revisa. Ejecuta el proceso de generación en GitHub para incorporar el contenido actualizado de la hoja. Abre el sitio y comprueba el resultado.
  6. +
+

Editar una celda no actualiza de inmediato el sitio público. Cada generación lee la versión publicada de la hoja y produce una nueva versión de la exhibición.

+

Antes de comenzar

+

Necesitas cuentas de Google y GitHub. La configuración guiada te acompaña desde la copia de las plantillas hasta la conexión del sitio y genera el archivo de configuración. Si todavía estás desarrollando la narrativa, empieza por Planear una exhibición.

+{% else %} +

The Google Sheets workflow lets you author a Telar exhibition in a shared spreadsheet. You catalogue your sources, arrange story steps and write narrative text in rows and columns; Telar reads that content and builds the website.

+

This approach suits people who prefer a spreadsheet, want to review several records at once or write with a team. The sheet brings together narrative content and metadata. Images and other media load from their source addresses or from files in your site.

+

How the spreadsheet fits together

+ +

How it works

+
    +
  1. Set up the site and sheet. Create a Telar repository on GitHub, copy the Google Sheets template and connect its published address to the site.
  2. +
  3. Write and arrange. Catalogue objects, add stories and steps, and develop the text. Use the site's viewer to choose image framings.
  4. +
  5. Build and review. Run the build on GitHub to bring in the updated sheet content. Open the website and check the result.
  6. +
+

Editing a cell does not immediately update the public site. Each build reads the published sheet and produces a new edition of the exhibition.

+

Before you begin

+

You need Google and GitHub accounts. The guided setup takes you from copying the templates to connecting the site and generates your configuration file. If you are still developing the narrative, begin with Plan an exhibition.

+{% endif %} +{% when 'local' %} +{% if es %} +

La autoría local consiste en editar los archivos de tu exhibición en tu computador y generar allí una vista previa. Trabajas con archivos CSV y Markdown en el editor que prefieras y usas las herramientas de Telar para convertirlos en un sitio web.

+

Elige esta forma de trabajo si quieres acceso directo a los archivos, personalizar el sitio o controlar el proceso de generación y el alojamiento. El resultado es un sitio estático que puedes publicar en GitHub Pages o en otro servidor web.

+

Los archivos con los que trabajas

+ +

Cómo funciona

+
    +
  1. Prepara una copia local. Obtén los archivos de Telar e instala las herramientas necesarias para generar el sitio.
  2. +
  3. Edita y previsualiza. Agrega las fuentes, escribe las historias y genera una vista previa en tu navegador. Repite este proceso para revisar los encuadres, los textos y los enlaces.
  4. +
  5. Publica. Envía los cambios al repositorio de GitHub para generar el sitio público o aloja los archivos generados en el servidor que elijas.
  6. +
+

La vista previa local te permite revisar el trabajo antes de publicarlo. Conserva los archivos de autoría: son la fuente para las revisiones y las futuras versiones del sitio.

+

Antes de comenzar

+

Debes poder trabajar con carpetas, editar archivos de texto y ejecutar comandos en una terminal. La guía de instalación explica las herramientas necesarias: Ruby, Python, Node.js y Git. Si todavía estás desarrollando la narrativa, empieza por Planear una exhibición.

+{% else %} +

Local authoring means editing your exhibition's source files on your computer and generating a preview there. You work with CSV and Markdown files in your preferred editor and use Telar's tools to turn them into a website.

+

Choose this approach if you want direct access to the files, want to customise the site or need control over building and hosting it. The result is a static site you can publish on GitHub Pages or another web server.

+

The files you work with

+ +

How it works

+
    +
  1. Set up a local copy. Get the Telar source files and install the tools needed to build the site.
  2. +
  3. Edit and preview. Add your sources, write stories and build a preview in your browser. Repeat as you check framings, text and links.
  4. +
  5. Publish. Send changes to your GitHub repository to build the public site, or host the generated files on your chosen server.
  6. +
+

The local preview lets you review the work before publishing. Keep your editable source files: they are the starting point for revisions and future editions of the site.

+

Before you begin

+

You should be comfortable working with folders, editing text files and running commands in a terminal. The installation guide covers the tools you need: Ruby, Python, Node.js and Git. If you are still developing the narrative, begin with Plan an exhibition.

+{% endif %} +{% when 'reference' %} +

{% if es %}Consulta formatos, contenido, configuración y funciones que comparten las tres formas de construir una exhibición.{% else %}Look up formats, content, configuration and features shared by the three ways of building an exhibition.{% endif %}

+

{% if es %}Para un recorrido paso a paso, elige uno de los manuales desde el menú. Aquí puedes ir directamente al tema que necesitas.{% else %}For a step-by-step walkthrough, choose one of the manuals from the section menu. Here you can go straight to the topic you need.{% endif %}

+{% when 'teaching' %} +

{% if es %}Planea un taller o un proyecto de clase que empiece por las fuentes y las preguntas que tus estudiantes quieren explorar.{% else %}Plan a workshop or a classroom project that begins with sources and the questions your students want to explore.{% endif %}

+
+

{% if es %}Usa el Compositor con tu clase{% else %}Use the Compositor with your class{% endif %}

+

{% if es %}El modo docente permite compartir una colección de objetos con la clase, trabajar en sitios de grupos de estudiantes y revisar sus exhibiciones desde un espacio de curso.{% else %}Teaching mode lets you share an object collection with a class, work with student-group sites and review their exhibitions from a course workspace.{% endif %}

+

{% if es %}El acceso se habilita por solicitud. Cuéntanos sobre tu curso o taller para que podamos ayudarte a comenzar.{% else %}Access is enabled on request. Tell us about your course or workshop so we can help you get started.{% endif %}

+ +
+
+

{% if es %}Durante el taller{% else %}During a workshop{% endif %}

{% if es %}Comparte el acceso corto y usa los seis pasos para acompañar la creación de una primera historia.{% else %}Share the short link and use the six steps to guide the creation of a first story.{% endif %}

{% if es %}Guía rápida · /empezar{% else %}Quick guide · /start{% endif %} →
+

{% if es %}Planeación narrativa{% else %}Narrative planning{% endif %}

{% if es %}Combina las diapositivas con el planeador para ordenar preguntas, fuentes y capas antes de editar.{% else %}Combine the slides and planner to arrange questions, sources and layers before editing.{% endif %}

+

{% if es %}Del ejercicio a la exhibición{% else %}From exercise to exhibition{% endif %}

+

{% if es %}La guía de planeación{% else %}The planning guide{% endif %} {% if es %}ayuda a definir el público, la pregunta central y las fuentes de un proyecto. Los proyectos hechos con Telar permiten conversar sobre decisiones narrativas concretas.{% else %}helps define a project's audience, guiding question and sources. Projects made with Telar offer examples for discussing narrative choices.{% endif %}

+

{% if es %}Compartir el trabajo{% else %}Sharing the work{% endif %}

+ +{% endcase %} +{% unless page.docs_section == 'teaching' %} +{% if page.docs_section == 'reference' %}
{% for group in book.groups %}{% unless group.id == 'main' %}

{{ group.title }}

{% endunless %}{% endfor %}
+{% else %}

{% if es %}En este manual{% else %}In this manual{% endif %}

    {% for item in book.items %}{% unless item.url == page.url %}
  1. {{ item.title }}
  2. {% endunless %}{% endfor %}
+

{% if es %}Referencia para tu trabajo{% else %}Reference for your work{% endif %}

{% endif %} +{% endunless %} diff --git a/_includes/docs/story-arc.html b/_includes/docs/story-arc.html new file mode 100644 index 0000000..b763945 --- /dev/null +++ b/_includes/docs/story-arc.html @@ -0,0 +1,24 @@ +{% assign arc_lang = page.lang | default: 'en' %}{% assign arc_copy = site.data.guides.copy[arc_lang] %} +{% comment %}Shared narrative symbols: title square, question circle, terminal triangle. Panel 2 branches from panel 1, as in StepLineBranch and the workshop's layered diagrams.{% endcomment %} + diff --git a/_includes/docs/teaching-request.html b/_includes/docs/teaching-request.html new file mode 100644 index 0000000..bf342e8 --- /dev/null +++ b/_includes/docs/teaching-request.html @@ -0,0 +1,25 @@ +{% assign t = site.data.teaching_contact[page.lang] %} +
+ +

{{ t.title }}

+
{% for paragraph in t.intro_paragraphs %}{{ paragraph }}

{% endfor %}
+ +
+
+
+

{{ t.github_help }}

+
+

{{ t.course_help }}

+ +

{{ t.privacy }}

+{% if site.showcase_turnstile_site_key and site.showcase_turnstile_site_key != "" %}
{% endif %} +
+
+ + +

{{ t.back }} →

+{% if site.showcase_turnstile_site_key and site.showcase_turnstile_site_key != "" %}{% endif %} + +
diff --git a/_includes/guides-sketch/hub.html b/_includes/guides-sketch/hub.html new file mode 100644 index 0000000..5012a1b --- /dev/null +++ b/_includes/guides-sketch/hub.html @@ -0,0 +1,11 @@ +{% assign c = site.data.guides_sketch.copy[page.lang] %}{% assign q = site.data.guides_sketch.quick[page.lang] %}{% assign es = false %}{% if page.lang == "es" %}{% assign es = true %}{% endif %} +

{{ c.hero_tag }}

{{ c.hero_title }}

{{ c.hero_intro }}

+ +

{{ c.plan_tag }}

{{ c.plan_title }}

{{ c.plan_text }}

{{ c.plan_link }} →
+{% include guides-sketch/story-arc.html %}
+

{{ c.build_tag }}

{{ c.build_title }}

{{ c.build_intro }}

+{% for manual in site.data.guides_sketch.manuals %}{% assign m = manual[page.lang] %}{% endfor %} +
+

{% if es %}Referencia{% else %}Reference{% endif %}

{{ c.reference_title }}

{{ c.reference_text }}

{{ c.reference_link }} →
+

{{ c.teaching }}

{{ c.teach_title }}

{{ c.teach_text }}

+

{% if es %}Explora{% else %}Explore{% endif %}

{{ c.examples_title }}

{{ c.examples_text }}

{{ c.examples_link }} →
diff --git a/_includes/guides-sketch/planning.en.html b/_includes/guides-sketch/planning.en.html new file mode 100644 index 0000000..c0d7341 --- /dev/null +++ b/_includes/guides-sketch/planning.en.html @@ -0,0 +1,26 @@ + +

Chapter 1 · Purpose, audience and sources

+

Begin with what you want people to notice.

+

An exhibition brings sources and interpretation together. Before choosing an editor, decide what you want visitors to explore and which materials can help them do it.

+
By the end of this chapter

You will have a short exhibition brief: a guiding question, an intended audience and a small set of sources to examine.

+

1. Turn a topic into a question

+

A topic gives your exhibition a subject. A question gives visitors a reason to look closely. Start with something that can be explored through your materials.

+

An example to think with

Topic

A painting of the Bogotá savanna.

Possible guiding question

What can this painting help us understand about people and land?

This is a possible starting question, not a finished interpretation. The details you examine will shape the argument.

+

Write the idea you want visitors to leave with, even if it is provisional. Then consider which questions could help them reach it. The opening should give them a way in; the ending should return to what the exhibition has helped them see.

+

2. Picture your visitors

+

Imagine someone arriving without the knowledge you bring to the material. What can they recognise? What will need an introduction? Which words or assumptions could get in the way?

+ +

Use those answers to choose your opening, your language and the amount of context you offer. A glossary can explain recurring terms; a panel can develop the context of a particular step.

+

3. Read your sources before arranging them

+

Choose a manageable starting set: an image, a document, an audio recording, a video, or a few related items. You can return to the same source in more than one step.

+

Look and listen closely. Note significant elements, how they relate to one another, the questions they raise and what remains uncertain. Connect each possible observation to a detail you can actually show.

+

What is there?

People, words, symbols, sounds, gestures, arrangements and absences.

What does it raise?

Questions about making, use, audience, time, place and interpretation.

+

Keep the source address, catalogue information and credit alongside your notes. Identify what can be shared and what needs further checking. Mark uncertain interpretations as questions to investigate.

+

4. Draft a brief you can build from

+

On paper or in a document, finish these four prompts:

+
  1. My exhibition asks…State one guiding question.
  2. I am making it for…Name your intended audience and the context they will need.
  3. I will work with…List a small starting set of sources and the details worth examining.
  4. By the end, visitors should…Describe an understanding or observation your exhibition can help develop.
+
Keep this provisional.

Planning is iterative. As you examine the sources and try the story with readers, revise the question, the sequence and the conclusion.

+

Next: sketch the narrative arc

+

The next chapter will turn your brief into an opening, a sequence of questions and an ending. Then you can connect each step to a source detail, add optional layers and arrange the exhibition as a whole.

+

The existing narrative planner gives you a beginning and ending to build between. The workshop slides demonstrate how to add questions, sources and layers.

+See the three ways to build → diff --git a/_includes/guides-sketch/planning.es.html b/_includes/guides-sketch/planning.es.html new file mode 100644 index 0000000..129b34c --- /dev/null +++ b/_includes/guides-sketch/planning.es.html @@ -0,0 +1,26 @@ + +

Capítulo 1 · Propósito, público y fuentes

+

Empieza por lo que quieres que las personas observen.

+

Una exhibición reúne fuentes e interpretación. Antes de elegir un editor, piensa qué quieres que tus visitantes exploren y con qué materiales podrán hacerlo.

+
Al terminar este capítulo

Tendrás un planteamiento breve de la exhibición: una pregunta central, un público y un pequeño conjunto de fuentes por examinar.

+

1. Convierte un tema en una pregunta

+

Un tema define de qué trata tu exhibición. Una pregunta invita a mirar con atención. Empieza por algo que puedas explorar a través de tus materiales.

+

Un ejemplo para pensar

Tema

Una pintura de la Sabana de Bogotá.

Posible pregunta central

¿Qué nos permite entender esta pintura sobre las personas y la tierra?

Es una posible pregunta de partida, no una interpretación terminada. Los detalles que examines darán forma al argumento.

+

Escribe la idea que quieres que tus visitantes se lleven, aunque sea provisional. Después, piensa qué preguntas podrían ayudarles a llegar a ella. El inicio debe darles una entrada; el cierre debe retomar lo que la exhibición les ha ayudado a ver.

+

2. Imagina a tus visitantes

+

Piensa en alguien que llega sin los conocimientos que tú tienes sobre el material. ¿Qué puede reconocer? ¿Qué necesita una introducción? ¿Qué palabras o supuestos podrían dificultar la lectura?

+ +

Usa esas respuestas para elegir el inicio, el lenguaje y la cantidad de contexto. El glosario puede explicar términos recurrentes; un panel puede desarrollar el contexto de un paso específico.

+

3. Examina las fuentes antes de ordenarlas

+

Elige un conjunto pequeño para empezar: una imagen, un documento, una grabación de audio, un video o varios materiales relacionados. Puedes volver a la misma fuente en más de un paso.

+

Observa y escucha con cuidado. Anota elementos importantes, las relaciones entre ellos, las preguntas que plantean y lo que sigue siendo incierto. Conecta cada posible observación con un detalle que puedas mostrar.

+

¿Qué hay allí?

Personas, palabras, símbolos, sonidos, gestos, distribuciones y ausencias.

¿Qué preguntas surgen?

Preguntas sobre su creación, uso, público, fecha, lugar e interpretación.

+

Guarda junto a tus notas la dirección de la fuente, los datos del catálogo y el crédito. Identifica qué puedes compartir y qué debes revisar. Señala las interpretaciones inciertas como preguntas por investigar.

+

4. Escribe un planteamiento que puedas desarrollar

+

En papel o en un documento, completa estas cuatro frases:

+
  1. Mi exhibición pregunta…Escribe una pregunta central.
  2. La estoy creando para…Define el público y el contexto que necesitará.
  3. Voy a trabajar con…Enumera un pequeño conjunto de fuentes y los detalles que vale la pena examinar.
  4. Al terminar, mis visitantes deberían…Describe una comprensión u observación que la exhibición pueda ayudar a desarrollar.
+
Mantén el planteamiento abierto.

La planeación es un proceso de revisión. A medida que examines las fuentes y pruebes la historia con lectores, ajusta la pregunta, la secuencia y la conclusión.

+

Después: esboza el arco narrativo

+

El próximo capítulo convertirá tu planteamiento en un inicio, una secuencia de preguntas y un cierre. Luego podrás conectar cada paso con un detalle de las fuentes, agregar capas opcionales y organizar el conjunto de la exhibición.

+

El planeador narrativo ofrece un inicio y un cierre entre los cuales trabajar. Las diapositivas del taller muestran cómo agregar preguntas, fuentes y capas.

+Conoce las tres formas de construir → diff --git a/_includes/guides-sketch/quick.html b/_includes/guides-sketch/quick.html new file mode 100644 index 0000000..f406e07 --- /dev/null +++ b/_includes/guides-sketch/quick.html @@ -0,0 +1,8 @@ +{% assign q = site.data.guides_sketch.quick[page.lang] %}{% assign c = site.data.guides_sketch.copy[page.lang] %}{% assign es = false %}{% if page.lang == "es" %}{% assign es = true %}{% endif %} + +

{{ q.tag }}

{{ q.title }}

{{ q.intro }}

+ +
{{ q.saved }}

{{ q.saved_text }}

+
    {% for step in site.data.guides_sketch.quick_steps %}{% assign item = step[page.lang] %}
  1. {{ item.title }}

    {{ item.text }}

    {{ item.link }} →
  2. {% endfor %}
+ +

{{ q.after }}

{{ q.after_text }}

{{ c.guide_home }} → diff --git a/_includes/guides-sketch/story-arc.html b/_includes/guides-sketch/story-arc.html new file mode 100644 index 0000000..5200d52 --- /dev/null +++ b/_includes/guides-sketch/story-arc.html @@ -0,0 +1 @@ +{% include docs/story-arc.html %} diff --git a/_includes/homepage-demo.html b/_includes/homepage-demo.html new file mode 100644 index 0000000..6a89ce6 --- /dev/null +++ b/_includes/homepage-demo.html @@ -0,0 +1,19 @@ +
+
+
+

What is Telar?¿Qué es Telar?

+

Telar (Spanish for "loom") weaves together images, video, audio, narrative text, and layered contextual information into interactive visual narrative exhibitions. It follows minimal computing principles: plain text authoring, static generation, and sustainable hosting.

+

Telar entreteje imágenes, video, audio, texto narrativo e información contextual en exhibiciones narrativas visuales e interactivas. Sigue los principios de computación mínima: autoría en texto plano, generación estática y alojamiento sostenible.

+
+
+
+ +
+
+ + +
+
+
+
+ diff --git a/_includes/manual-brand.svg b/_includes/manual-brand.svg new file mode 100644 index 0000000..3e2cbc4 --- /dev/null +++ b/_includes/manual-brand.svg @@ -0,0 +1,3 @@ + diff --git a/_includes/manual-overview.html b/_includes/manual-overview.html new file mode 100644 index 0000000..eeb7a73 --- /dev/null +++ b/_includes/manual-overview.html @@ -0,0 +1,14 @@ +{% assign es = false %}{% if page.lang == 'es' %}{% assign es = true %}{% endif %} +

{% if es %}Construye tu exhibición con el Compositor{% else %}Build your exhibition with the Compositor{% endif %}

+

{% if es %}Un manual para pasar de tus materiales a un sitio publicado: objetos, historias, paneles, glosario y trabajo en equipo.{% else %}A manual for taking your materials to a published site: objects, stories, panels, glossary and working together.{% endif %}

+
+

{% if es %}Primera guía para revisar{% else %}First guide for review{% endif %}

+

{% if es %}Importa un manifiesto IIIF, usa el objeto en un paso y captura el encuadre que verá el público.{% else %}Import an IIIF manifest, use the object in a step and capture the view your visitors will see.{% endif %}

+{% if es %}Usar un objeto IIIF en una historia{% else %}Use an IIIF object in a story{% endif %} → +
+

{% if es %}Este es el índice propuesto del manual. La primera guía muestra el formato de las instrucciones y las capturas; los demás capítulos se desarrollarán a partir del inventario de funciones.{% else %}This is the proposed manual outline. The first guide demonstrates the instructions and screenshots; the remaining chapters will be developed from the capability inventory.{% endif %}

+
+{% for chapter in site.data.compositor_manual.chapters %} +

{% if es %}{{ chapter.es }}{% else %}{{ chapter.en }}{% endif %}

{% if es %}{{ chapter.outcome_es }}{% else %}{{ chapter.outcome_en }}{% endif %}

{% if chapter.id == 'objects' or chapter.id == 'framing' %}{% if es %}Incluye la guía piloto{% else %}Includes the pilot guide{% endif %}{% else %}{% if es %}Capítulo en preparación{% else %}Chapter in preparation{% endif %}{% endif %}
+{% endfor %} +
diff --git a/_layouts/docs.html b/_layouts/docs.html index 78251d9..e5f23e6 100644 --- a/_layouts/docs.html +++ b/_layouts/docs.html @@ -1,849 +1,59 @@ --- --- -{%- comment -%} Find equivalent page in other language {%- endcomment -%} -{% if page.lang == "es" %} - {% assign current_lang = "es" %} - {% assign other_lang = "en" %} - {% assign equivalent_path = page.path | replace: ".es.md", ".md" %} - {% assign fallback_url = "/docs/" %} -{% else %} - {% assign current_lang = "en" %} - {% assign other_lang = "es" %} - {% assign equivalent_path = page.path | replace: ".md", ".es.md" %} - {% assign fallback_url = "/guia/" %} +{% assign lang = page.lang | default: 'en' %}{% assign es = false %}{% if lang == 'es' %}{% assign es = true %}{% endif %} +{% assign nav = site.data.docs_navigation %}{% assign labels = nav.labels[lang] %}{% assign routes = nav.routes[lang] %}{% assign c = site.data.guides.copy[lang] %}{% assign q = site.data.guides.quick[lang] %} +{% assign entry = nav.pages[page.url] %}{% assign section_id = page.docs_section | default: entry.section | default: 'reference' %}{% assign book = nav.sections[lang][section_id] %} +{% assign en_url = page.en_url %}{% assign es_url = page.es_url %}{% unless en_url %}{% if es %}{% assign en_url = entry.other_url | default: '/docs/' %}{% else %}{% assign en_url = page.url %}{% endif %}{% endunless %}{% unless es_url %}{% if es %}{% assign es_url = page.url %}{% else %}{% assign es_url = entry.other_url | default: '/guia/' %}{% endif %}{% endunless %} + + +{% if site.docs_preview %}{% endif %} +{{ entry.title | default: page.title | escape }} · Telar +{% seo title=false %} + + + +{% for css in page.extra_css %}{% endfor %} +{% if page.katex %}{% endif %} + + + +
+{% include manual-brand.svg %}Telar{{ c.brand_sub }} + + + + +
+{% unless page.docs_hub %}
{% endunless %} +
+{% if site.docs_preview %}
{{ labels.preview }}{% if page.docs_draft %} · {% if es %}Texto en revisión{% else %}Draft copy{% endif %}{% endif %}
{% endif %} +{% if page.docs_hub %}{{ content }}{% else %} +
+{% unless page.docs_quick %}{% endunless %} +{{ content }} +
+{% unless section_id == 'reference' or section_id == 'developers' or section_id == 'guides' or page.docs_quick %} +{% assign previous = nil %}{% assign following = nil %}{% for item in book.items %}{% if item.url == page.url %}{% if forloop.index0 > 0 %}{% assign previous_index = forloop.index0 | minus: 1 %}{% assign previous = book.items[previous_index] %}{% endif %}{% unless forloop.last %}{% assign following = book.items[forloop.index] %}{% endunless %}{% endif %}{% endfor %} +{% if previous or following %}{% endif %} +{% endunless %} {% endif %} -{% assign equivalent_page = site.html_pages | where: "path", equivalent_path | first %} -{% if equivalent_page %} - {% assign other_url = equivalent_page.url | relative_url %} -{% else %} - {% assign other_url = fallback_url | relative_url %} -{% endif %} - - - - - - {{ page.title }} | {{ site.title }} - - - - - - - - {% for css in page.extra_css %} - - {% endfor %} - {% seo %} - - {% if page.katex %} - - {% endif %} - - - - - -
- - -
-
- - -
-
- - -
- - - - - - - - -
-
- {% unless page.tutorial_hide_top %} - {% include docs/tutorial-nav.html %} - {% endunless %} - - {{ content }} - - {% include docs/tutorial-nav.html %} - -
-

{{ site.footer_content }}

-
-
-
- - - - - - - + +
{% unless page.docs_hub %}
{% endunless %} +

{{ labels.search }}

{{ labels.search_hint }}

+
{% if page.katex %} {% endif %} - - + + diff --git a/_layouts/guides-sketch.html b/_layouts/guides-sketch.html new file mode 100644 index 0000000..69ae3cc --- /dev/null +++ b/_layouts/guides-sketch.html @@ -0,0 +1,18 @@ +{% assign c = site.data.guides_sketch.copy[page.lang] %}{% assign q = site.data.guides_sketch.quick[page.lang] %}{% assign es = false %}{% if page.lang == 'es' %}{% assign es = true %}{% endif %} +{{ page.title }} · Telar + + + +
+{% include manual-brand.svg %}Telar{{ c.brand_sub }} + + +
+{% if page.sketch_type != 'hub' %}
{% endif %} +
+
{{ c.design }}{{ c.preview_note }}
+{{ content }} +
{{ c.footer }}
+{% if page.sketch_type != 'hub' %}
{% endif %} + + diff --git a/_layouts/landing.html b/_layouts/landing.html index ac8ab33..beae63a 100644 --- a/_layouts/landing.html +++ b/_layouts/landing.html @@ -6,10 +6,11 @@ {{ page.title | default: site.title }} - + {% seo title=false %} + - + + + + +
{{ content }} +
- -

Comparte tu proyecto

+

Comparte tu proyecto

-{% endif %} +{{ end }} -{% endif %} +{{ end }} {{ end }} + + diff --git a/layouts/_partials/url.html b/layouts/_partials/url.html new file mode 100644 index 0000000..b91c481 --- /dev/null +++ b/layouts/_partials/url.html @@ -0,0 +1 @@ +{{ .url }} \ No newline at end of file diff --git a/layouts/_shortcodes/build-options.html b/layouts/_shortcodes/build-options.html new file mode 100644 index 0000000..e1c94c1 --- /dev/null +++ b/layouts/_shortcodes/build-options.html @@ -0,0 +1 @@ +{{ partial "docs/build-options.html" .Page }} \ No newline at end of file diff --git a/layouts/_shortcodes/callout.html b/layouts/_shortcodes/callout.html new file mode 100644 index 0000000..73f052d --- /dev/null +++ b/layouts/_shortcodes/callout.html @@ -0,0 +1 @@ +
{{ .Inner | .Page.RenderString (dict "display" "block") }}
\ No newline at end of file diff --git a/layouts/_shortcodes/guides-hub.html b/layouts/_shortcodes/guides-hub.html new file mode 100644 index 0000000..629be17 --- /dev/null +++ b/layouts/_shortcodes/guides-hub.html @@ -0,0 +1 @@ +{{ partial "hub.html" .Page }} \ No newline at end of file diff --git a/layouts/_shortcodes/manual-contents.html b/layouts/_shortcodes/manual-contents.html new file mode 100644 index 0000000..3e3d110 --- /dev/null +++ b/layouts/_shortcodes/manual-contents.html @@ -0,0 +1 @@ +{{ $book := index (index hugo.Data.docs_navigation.sections .Page.Language.Lang) "compositor" }}{{ range $book.groups }}{{ if ne .id "main" }}

{{ .title }}

{{ end }}{{ end }} \ No newline at end of file diff --git a/layouts/_shortcodes/media.html b/layouts/_shortcodes/media.html new file mode 100644 index 0000000..660cadd --- /dev/null +++ b/layouts/_shortcodes/media.html @@ -0,0 +1 @@ +{{ $m := index (index hugo.Data.docs_media.items (.Get "id")) .Page.Language.Lang }}{{ $l := index hugo.Data.docs_media.labels .Page.Language.Lang }}{{ $uid := printf "%s-%s" (.Get "id") (.Page.RelPermalink | replaceRE "[^\\pL\\pN]+" "-" | replaceRE "^-|-$" "") }}{{ with $m }}
{{ .alt }}

{{ .caption }}

{{ if .animation }}{{ end }}{{ $l.open }} ↗{{ if .animation }}{{ $l.gif }}{{ end }}
{{ end }} \ No newline at end of file diff --git a/layouts/_shortcodes/quick-guide.html b/layouts/_shortcodes/quick-guide.html new file mode 100644 index 0000000..87e6b74 --- /dev/null +++ b/layouts/_shortcodes/quick-guide.html @@ -0,0 +1 @@ +{{ partial "docs/quick-guide.html" .Page }} \ No newline at end of file diff --git a/layouts/_shortcodes/section-body.html b/layouts/_shortcodes/section-body.html new file mode 100644 index 0000000..2cb1203 --- /dev/null +++ b/layouts/_shortcodes/section-body.html @@ -0,0 +1 @@ +{{ partial (printf "pages/%s.html" (.Get 0)) .Page | .Page.RenderString (dict "display" "block") }} \ No newline at end of file diff --git a/layouts/_shortcodes/section-overview.html b/layouts/_shortcodes/section-overview.html new file mode 100644 index 0000000..1cfe50d --- /dev/null +++ b/layouts/_shortcodes/section-overview.html @@ -0,0 +1 @@ +{{ partial "docs/section-overview.html" .Page }} \ No newline at end of file diff --git a/layouts/_shortcodes/site-value.html b/layouts/_shortcodes/site-value.html new file mode 100644 index 0000000..4274270 --- /dev/null +++ b/layouts/_shortcodes/site-value.html @@ -0,0 +1 @@ +{{- index site.Params (.Get 0) -}} \ No newline at end of file diff --git a/layouts/_shortcodes/story-arc.html b/layouts/_shortcodes/story-arc.html new file mode 100644 index 0000000..e957c90 --- /dev/null +++ b/layouts/_shortcodes/story-arc.html @@ -0,0 +1 @@ +{{ partial "arc.html" .Page }} \ No newline at end of file diff --git a/layouts/_shortcodes/teaching-request.html b/layouts/_shortcodes/teaching-request.html new file mode 100644 index 0000000..fce458e --- /dev/null +++ b/layouts/_shortcodes/teaching-request.html @@ -0,0 +1 @@ +{{ partial "teaching-form.html" .Page }} \ No newline at end of file diff --git a/layouts/_shortcodes/template.html b/layouts/_shortcodes/template.html new file mode 100644 index 0000000..222f398 --- /dev/null +++ b/layouts/_shortcodes/template.html @@ -0,0 +1 @@ +{{ partial (printf "pages/%s.html" (.Get 0)) .Page }} \ No newline at end of file diff --git a/layouts/guide/section.html b/layouts/guide/section.html new file mode 100644 index 0000000..78b0f64 --- /dev/null +++ b/layouts/guide/section.html @@ -0,0 +1 @@ +{{ partial "docs-shell.html" . }} diff --git a/layouts/index.html b/layouts/index.html new file mode 100644 index 0000000..7328ee0 --- /dev/null +++ b/layouts/index.html @@ -0,0 +1 @@ +{{ partial "home.html" . }} \ No newline at end of file diff --git a/layouts/landing/single.html b/layouts/landing/single.html new file mode 100644 index 0000000..7328ee0 --- /dev/null +++ b/layouts/landing/single.html @@ -0,0 +1 @@ +{{ partial "home.html" . }} \ No newline at end of file diff --git a/layouts/redirect/section.html b/layouts/redirect/section.html new file mode 100644 index 0000000..6eb7c1a --- /dev/null +++ b/layouts/redirect/section.html @@ -0,0 +1 @@ +Telar

Redirecting to {{ .Params.redirect_to }}

\ No newline at end of file diff --git a/layouts/redirect/single.html b/layouts/redirect/single.html new file mode 100644 index 0000000..6eb7c1a --- /dev/null +++ b/layouts/redirect/single.html @@ -0,0 +1 @@ +Telar

Redirecting to {{ .Params.redirect_to }}

\ No newline at end of file diff --git a/layouts/robots.txt b/layouts/robots.txt new file mode 100644 index 0000000..ed366ec --- /dev/null +++ b/layouts/robots.txt @@ -0,0 +1,5 @@ +User-agent: * +{{ if .Site.Params.docs_preview }}Disallow: / +{{ else }}Allow: / +Sitemap: {{ "sitemap.xml" | absURL }} +{{ end }} \ No newline at end of file diff --git a/layouts/section/section.html b/layouts/section/section.html new file mode 100644 index 0000000..7ca6f62 --- /dev/null +++ b/layouts/section/section.html @@ -0,0 +1 @@ +{{ partial "section-shell.html" . }} diff --git a/layouts/section/single.html b/layouts/section/single.html new file mode 100644 index 0000000..7ca6f62 --- /dev/null +++ b/layouts/section/single.html @@ -0,0 +1 @@ +{{ partial "section-shell.html" . }} diff --git a/layouts/sitemap.xml b/layouts/sitemap.xml new file mode 100644 index 0000000..41d5c70 --- /dev/null +++ b/layouts/sitemap.xml @@ -0,0 +1,2 @@ +{{ printf "" | safeHTML }} +{{ range .Data.Pages }}{{ if and (ne .Type "redirect") (not .Params.robots) }}{{ .Permalink }}{{ range .AllTranslations }}{{ end }}{{ end }}{{ end }} \ No newline at end of file diff --git a/manual/iiif.en.md b/manual/iiif.en.md deleted file mode 100644 index d70544f..0000000 --- a/manual/iiif.en.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /manual/en/iiif-to-story/ -redirect_to: /docs/the-compositor/iiif-to-story/ -lang: en -nav_exclude: true ---- diff --git a/manual/iiif.es.md b/manual/iiif.es.md deleted file mode 100644 index 43edc17..0000000 --- a/manual/iiif.es.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /manual/es/iiif-a-historia/ -redirect_to: /guia/el-compositor/iiif-a-historia/ -lang: es -nav_exclude: true ---- diff --git a/manual/index.en.html b/manual/index.en.html deleted file mode 100644 index 0a46024..0000000 --- a/manual/index.en.html +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /manual/en/ -redirect_to: /docs/the-compositor/ -lang: en -nav_exclude: true ---- diff --git a/manual/index.es.html b/manual/index.es.html deleted file mode 100644 index b09a15f..0000000 --- a/manual/index.es.html +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /manual/es/ -redirect_to: /guia/el-compositor/ -lang: es -nav_exclude: true ---- diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..83c363d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,235 @@ +{ + "name": "telar-docs", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "telar-docs", + "version": "1.0.0", + "devDependencies": { + "hugo-extended": "0.160.1", + "pagefind": "1.5.2" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@pagefind/darwin-arm64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.5.2.tgz", + "integrity": "sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/darwin-x64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-x64/-/darwin-x64-1.5.2.tgz", + "integrity": "sha512-IojxFWMEJe0RQ7PQ3KXQsPIImNsbpPYpoZ+QUDrL8fAl/O27IX+LVLs74/UzEZy5uA2LD8Nz1AiwKr72vrkZQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/freebsd-x64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/freebsd-x64/-/freebsd-x64-1.5.2.tgz", + "integrity": "sha512-7EVzo9+0w+2cbe671BtMj10UlNo83I+HrLVLfRxO731svHRJKUfJ/mo05gU14pe9PCfpKNQT8FS3Xc/oDN6pOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@pagefind/linux-arm64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/linux-arm64/-/linux-arm64-1.5.2.tgz", + "integrity": "sha512-Ovt9+K35sqzn8H3ZMXGwls4TD/wMJuvRtShHIsmUQREmaxjrDEX7gHckRCrwYJ4XE1H1p6HkLz3wukrAnsfXQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/linux-x64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/linux-x64/-/linux-x64-1.5.2.tgz", + "integrity": "sha512-V+tFqHKXhQKq/WqPBD67AFy7scn1/aZID00ws4fSDd+1daSi5UHR9VVlRrOUYKxn3VuFQYRD7lYXdZK1WED1YA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/windows-arm64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/windows-arm64/-/windows-arm64-1.5.2.tgz", + "integrity": "sha512-hN9Nh90fNW61nNRCW9ZyQrAj/mD0eRvmJ8NlTUzkbuW8kIzGJUi3cxjFkEcMZ5h/8FsKWD/VcouZl4yo1F7B6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@pagefind/windows-x64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/windows-x64/-/windows-x64-1.5.2.tgz", + "integrity": "sha512-Fa2Iyw7kaDRzGMfNYNUXNW2zbL5FQVDgSOcbDHdzBrDEdpqOqg8TcZ68F22ol6NJ9IGzvUdmeyZypLW5dyhqsg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/adm-zip": { + "version": "0.5.18", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.18.tgz", + "integrity": "sha512-ufJnssQGbxzLNS1Ho9bCtX4rQKCCvoVuDLHoJyc3F9dOGDB4BkWs2Ci0kv53lqocAEQ/Cbi+I2XCsNYGqVYqng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/hugo-extended": { + "version": "0.160.1", + "resolved": "https://registry.npmjs.org/hugo-extended/-/hugo-extended-0.160.1.tgz", + "integrity": "sha512-LPtcPyfR22CoUukwQQaTOMpV5svHynQHlfxG7w1Oi9moWQMBNHSAj2u1eN5K8nx4CSB1ZMGfbNL0fBX++bQ3dQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "adm-zip": "^0.5.16", + "tar": "^7.5.9" + }, + "bin": { + "hugo": "dist/cli.mjs", + "hugo-extended": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.17" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/pagefind": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.5.2.tgz", + "integrity": "sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q==", + "dev": true, + "license": "MIT", + "bin": { + "pagefind": "lib/runner/bin.cjs" + }, + "optionalDependencies": { + "@pagefind/darwin-arm64": "1.5.2", + "@pagefind/darwin-x64": "1.5.2", + "@pagefind/freebsd-x64": "1.5.2", + "@pagefind/linux-arm64": "1.5.2", + "@pagefind/linux-x64": "1.5.2", + "@pagefind/windows-arm64": "1.5.2", + "@pagefind/windows-x64": "1.5.2" + } + }, + "node_modules/tar": { + "version": "7.5.22", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz", + "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..656e4dd --- /dev/null +++ b/package.json @@ -0,0 +1,21 @@ +{ + "name": "telar-docs", + "version": "1.0.0", + "private": true, + "scripts": { + "build": "node scripts/build.mjs", + "preview": "node scripts/serve.mjs", + "dev": "hugo server --config hugo.json,hugo.preview.json --bind 127.0.0.1 --port 4004 --disableFastRender", + "build:preview": "node scripts/build.mjs --preview" + }, + "devDependencies": { + "hugo-extended": "0.160.1", + "pagefind": "1.5.2" + }, + "allowScripts": { + "hugo-extended@0.160.1": true + }, + "engines": { + "node": ">=22" + } +} diff --git a/redirects/en-content-structure.md b/redirects/en-content-structure.md deleted file mode 100644 index 2f6ebcb..0000000 --- a/redirects/en-content-structure.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /docs/content-structure/ -redirect_to: /docs/your-content/ -lang: en -sitemap: false ---- diff --git a/redirects/en-cs-custom-pages.md b/redirects/en-cs-custom-pages.md deleted file mode 100644 index f62d87d..0000000 --- a/redirects/en-cs-custom-pages.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /docs/content-structure/custom-pages/ -redirect_to: /docs/site-features/custom-pages/ -lang: en -sitemap: false ---- diff --git a/redirects/en-cs-glossary.md b/redirects/en-cs-glossary.md deleted file mode 100644 index 1743848..0000000 --- a/redirects/en-cs-glossary.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /docs/content-structure/glossary/ -redirect_to: /docs/site-features/glossary/ -lang: en -sitemap: false ---- diff --git a/redirects/en-cs-objects-gallery.md b/redirects/en-cs-objects-gallery.md deleted file mode 100644 index 3ba0523..0000000 --- a/redirects/en-cs-objects-gallery.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /docs/content-structure/objects-gallery/ -redirect_to: /docs/your-content/objects/ -lang: en -sitemap: false ---- diff --git a/redirects/en-cs-private-stories.md b/redirects/en-cs-private-stories.md deleted file mode 100644 index 69c3ad3..0000000 --- a/redirects/en-cs-private-stories.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /docs/content-structure/private-stories/ -redirect_to: /docs/site-features/private-stories/ -lang: en -sitemap: false ---- diff --git a/redirects/en-cs-stories-panels.md b/redirects/en-cs-stories-panels.md deleted file mode 100644 index 4f32633..0000000 --- a/redirects/en-cs-stories-panels.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /docs/content-structure/stories-panels/ -redirect_to: /docs/your-content/stories-panels/ -lang: en -sitemap: false ---- diff --git a/redirects/en-cs-widgets.md b/redirects/en-cs-widgets.md deleted file mode 100644 index e9ff544..0000000 --- a/redirects/en-cs-widgets.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /docs/content-structure/widgets/ -redirect_to: /docs/your-content/widgets/ -lang: en -sitemap: false ---- diff --git a/redirects/en-cust-mobile.md b/redirects/en-cust-mobile.md deleted file mode 100644 index c1c1210..0000000 --- a/redirects/en-cust-mobile.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /docs/customization/mobile/ -redirect_to: /docs/developers/mobile/ -lang: en -sitemap: false ---- diff --git a/redirects/en-cust-styling.md b/redirects/en-cust-styling.md deleted file mode 100644 index 0f35c49..0000000 --- a/redirects/en-cust-styling.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /docs/customization/styling/ -redirect_to: /docs/developers/styling/ -lang: en -sitemap: false ---- diff --git a/redirects/en-gs-how-telar-works.md b/redirects/en-gs-how-telar-works.md deleted file mode 100644 index 4c0e83d..0000000 --- a/redirects/en-gs-how-telar-works.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /docs/getting-started/how-telar-works/ -redirect_to: /docs/getting-started/narrative-structure/ -lang: en -sitemap: false ---- diff --git a/redirects/en-gs-quick-start.md b/redirects/en-gs-quick-start.md deleted file mode 100644 index 5ad58b0..0000000 --- a/redirects/en-gs-quick-start.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /docs/getting-started/quick-start/ -redirect_to: /docs/getting-started/google-sheets/ -lang: en -sitemap: false ---- diff --git a/redirects/en-iiif-demo-content.md b/redirects/en-iiif-demo-content.md deleted file mode 100644 index fe2001f..0000000 --- a/redirects/en-iiif-demo-content.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /docs/iiif/demo-content/ -redirect_to: /docs/customization/demo-content/ -lang: en -sitemap: false ---- diff --git a/redirects/en-iiif-integration.md b/redirects/en-iiif-integration.md deleted file mode 100644 index 67351e4..0000000 --- a/redirects/en-iiif-integration.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /docs/iiif-integration/ -redirect_to: /docs/your-content/self-hosted-images/ -lang: en -sitemap: false ---- diff --git a/redirects/en-ref-config-generator.md b/redirects/en-ref-config-generator.md deleted file mode 100644 index 7d8b580..0000000 --- a/redirects/en-ref-config-generator.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /docs/reference/config-generator/ -redirect_to: /docs/configure/config-generator/ -lang: en -sitemap: false ---- diff --git a/redirects/en-ref-config-validator.md b/redirects/en-ref-config-validator.md deleted file mode 100644 index cf559fe..0000000 --- a/redirects/en-ref-config-validator.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /docs/reference/config-validator/ -redirect_to: /docs/configure/config-validator/ -lang: en -sitemap: false ---- diff --git a/redirects/en-ref-configuration.md b/redirects/en-ref-configuration.md deleted file mode 100644 index 597c8e1..0000000 --- a/redirects/en-ref-configuration.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /docs/reference/configuration/ -redirect_to: /docs/configure/configuration/ -lang: en -sitemap: false ---- diff --git a/redirects/en-ref-csv-project-objects.md b/redirects/en-ref-csv-project-objects.md deleted file mode 100644 index 9ee0d48..0000000 --- a/redirects/en-ref-csv-project-objects.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /docs/reference/csv-project-objects/ -redirect_to: /docs/your-data/csv-project/ -lang: en -sitemap: false ---- diff --git a/redirects/en-ref-csv-stories-glossary.md b/redirects/en-ref-csv-stories-glossary.md deleted file mode 100644 index 39ed88f..0000000 --- a/redirects/en-ref-csv-stories-glossary.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /docs/reference/csv-stories-glossary/ -redirect_to: /docs/your-data/csv-stories/ -lang: en -sitemap: false ---- diff --git a/redirects/en-ref-markdown-syntax.md b/redirects/en-ref-markdown-syntax.md deleted file mode 100644 index aa8fac6..0000000 --- a/redirects/en-ref-markdown-syntax.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /docs/reference/markdown-syntax/ -redirect_to: /docs/your-content/markdown-syntax/ -lang: en -sitemap: false ---- diff --git a/redirects/en-setup-local-dev.md b/redirects/en-setup-local-dev.md deleted file mode 100644 index e74266e..0000000 --- a/redirects/en-setup-local-dev.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /docs/setup/local-dev/ -redirect_to: /docs/getting-started/local-dev/ -lang: en -sitemap: false ---- diff --git a/redirects/en-wf-embedding.md b/redirects/en-wf-embedding.md deleted file mode 100644 index 17b64bf..0000000 --- a/redirects/en-wf-embedding.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /docs/workflows/embedding/ -redirect_to: /docs/site-features/embedding/ -lang: en -sitemap: false ---- diff --git a/redirects/en-wf-github-web.md b/redirects/en-wf-github-web.md deleted file mode 100644 index 694ae57..0000000 --- a/redirects/en-wf-github-web.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /docs/workflows/github-web/ -redirect_to: /docs/setup/manual/ -lang: en -sitemap: false ---- diff --git a/redirects/en-wf-google-sheets.md b/redirects/en-wf-google-sheets.md deleted file mode 100644 index 332563b..0000000 --- a/redirects/en-wf-google-sheets.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /docs/workflows/google-sheets/ -redirect_to: /docs/your-data/google-sheets/ -lang: en -sitemap: false ---- diff --git a/redirects/en-wf-guided-quickstart.md b/redirects/en-wf-guided-quickstart.md deleted file mode 100644 index 3128416..0000000 --- a/redirects/en-wf-guided-quickstart.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /docs/workflows/guided-quickstart/ -redirect_to: /docs/getting-started/google-sheets/ -lang: en -sitemap: false ---- diff --git a/redirects/en-wf-hybrid.md b/redirects/en-wf-hybrid.md deleted file mode 100644 index b129050..0000000 --- a/redirects/en-wf-hybrid.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /docs/workflows/hybrid/ -redirect_to: /docs/your-content/rich-content/ -lang: en -sitemap: false ---- diff --git a/redirects/en-wf-local-dev.md b/redirects/en-wf-local-dev.md deleted file mode 100644 index 131db10..0000000 --- a/redirects/en-wf-local-dev.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /docs/workflows/local-dev/ -redirect_to: /docs/getting-started/local-dev/ -lang: en -sitemap: false ---- diff --git a/redirects/en-wf-upgrading.md b/redirects/en-wf-upgrading.md deleted file mode 100644 index 52e9678..0000000 --- a/redirects/en-wf-upgrading.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /docs/workflows/upgrading/ -redirect_to: /docs/setup/upgrading/ -lang: en -sitemap: false ---- diff --git a/redirects/en-wf-workflows.md b/redirects/en-wf-workflows.md deleted file mode 100644 index b2edea2..0000000 --- a/redirects/en-wf-workflows.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /docs/workflows/ -redirect_to: /docs/setup/ -lang: en -sitemap: false ---- diff --git a/redirects/en-worksheet.md b/redirects/en-worksheet.md deleted file mode 100644 index 4dc3373..0000000 --- a/redirects/en-worksheet.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /worksheet/ -redirect_to: /assets/templates/telar-worksheet.pdf -lang: en -sitemap: false ---- diff --git a/redirects/en-workshop.md b/redirects/en-workshop.md deleted file mode 100644 index 131f691..0000000 --- a/redirects/en-workshop.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /workshop/ -redirect_to: https://www.figma.com/deck/NTdWFGoR7rF46va7nLouOc/Intro-to-Telar-V2?node-id=2004-1507&t=uMGqZCQGu2AVmGfY-1 -lang: en -sitemap: false ---- diff --git a/redirects/es-conf-desarrollo-local.md b/redirects/es-conf-desarrollo-local.md deleted file mode 100644 index e6d70e3..0000000 --- a/redirects/es-conf-desarrollo-local.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /guia/configuracion/desarrollo-local/ -redirect_to: /guia/primeros-pasos/desarrollo-local/ -lang: es -sitemap: false ---- diff --git a/redirects/es-ec-glosario.md b/redirects/es-ec-glosario.md deleted file mode 100644 index 934e794..0000000 --- a/redirects/es-ec-glosario.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /guia/estructura-de-contenido/glosario/ -redirect_to: /guia/funciones/glosario/ -lang: es -sitemap: false ---- diff --git a/redirects/es-ec-historias-paneles.md b/redirects/es-ec-historias-paneles.md deleted file mode 100644 index 7df546c..0000000 --- a/redirects/es-ec-historias-paneles.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /guia/estructura-de-contenido/historias-paneles/ -redirect_to: /guia/tu-contenido/historias-paneles/ -lang: es -sitemap: false ---- diff --git a/redirects/es-ec-historias-privadas.md b/redirects/es-ec-historias-privadas.md deleted file mode 100644 index 7402347..0000000 --- a/redirects/es-ec-historias-privadas.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /guia/estructura-de-contenido/historias-privadas/ -redirect_to: /guia/funciones/historias-privadas/ -lang: es -sitemap: false ---- diff --git a/redirects/es-ec-objetos-galeria.md b/redirects/es-ec-objetos-galeria.md deleted file mode 100644 index eb1d452..0000000 --- a/redirects/es-ec-objetos-galeria.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /guia/estructura-de-contenido/objetos-galeria/ -redirect_to: /guia/tu-contenido/objetos/ -lang: es -sitemap: false ---- diff --git a/redirects/es-ec-paginas-personalizadas.md b/redirects/es-ec-paginas-personalizadas.md deleted file mode 100644 index b133a95..0000000 --- a/redirects/es-ec-paginas-personalizadas.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /guia/estructura-de-contenido/paginas-personalizadas/ -redirect_to: /guia/funciones/paginas-personalizadas/ -lang: es -sitemap: false ---- diff --git a/redirects/es-ec-widgets.md b/redirects/es-ec-widgets.md deleted file mode 100644 index 7ee6b5c..0000000 --- a/redirects/es-ec-widgets.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /guia/estructura-de-contenido/widgets/ -redirect_to: /guia/tu-contenido/widgets/ -lang: es -sitemap: false ---- diff --git a/redirects/es-estructura-contenido.md b/redirects/es-estructura-contenido.md deleted file mode 100644 index 7b16f1f..0000000 --- a/redirects/es-estructura-contenido.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /guia/estructura-de-contenido/ -redirect_to: /guia/tu-contenido/ -lang: es -sitemap: false ---- diff --git a/redirects/es-ft-actualizacion.md b/redirects/es-ft-actualizacion.md deleted file mode 100644 index 5f8cdc9..0000000 --- a/redirects/es-ft-actualizacion.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /guia/flujos-de-trabajo/actualizacion/ -redirect_to: /guia/configuracion/actualizacion/ -lang: es -sitemap: false ---- diff --git a/redirects/es-ft-desarrollo-local.md b/redirects/es-ft-desarrollo-local.md deleted file mode 100644 index b539566..0000000 --- a/redirects/es-ft-desarrollo-local.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /guia/flujos-de-trabajo/desarrollo-local/ -redirect_to: /guia/primeros-pasos/desarrollo-local/ -lang: es -sitemap: false ---- diff --git a/redirects/es-ft-flujos-de-trabajo.md b/redirects/es-ft-flujos-de-trabajo.md deleted file mode 100644 index bcaef1b..0000000 --- a/redirects/es-ft-flujos-de-trabajo.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /guia/flujos-de-trabajo/ -redirect_to: /guia/configuracion/ -lang: es -sitemap: false ---- diff --git a/redirects/es-ft-google-sheets.md b/redirects/es-ft-google-sheets.md deleted file mode 100644 index da566a9..0000000 --- a/redirects/es-ft-google-sheets.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /guia/flujos-de-trabajo/google-sheets/ -redirect_to: /guia/tus-datos/google-sheets/ -lang: es -sitemap: false ---- diff --git a/redirects/es-ft-hibrido.md b/redirects/es-ft-hibrido.md deleted file mode 100644 index 966d291..0000000 --- a/redirects/es-ft-hibrido.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /guia/flujos-de-trabajo/hibrido/ -redirect_to: /guia/tu-contenido/contenido-enriquecido/ -lang: es -sitemap: false ---- diff --git a/redirects/es-ft-inicio-rapido-guiado.md b/redirects/es-ft-inicio-rapido-guiado.md deleted file mode 100644 index 28bbd4a..0000000 --- a/redirects/es-ft-inicio-rapido-guiado.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /guia/flujos-de-trabajo/inicio-rapido-guiado/ -redirect_to: /guia/primeros-pasos/google-sheets/ -lang: es -sitemap: false ---- diff --git a/redirects/es-ft-insercion.md b/redirects/es-ft-insercion.md deleted file mode 100644 index dc0dbde..0000000 --- a/redirects/es-ft-insercion.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /guia/flujos-de-trabajo/insercion/ -redirect_to: /guia/funciones/insercion/ -lang: es -sitemap: false ---- diff --git a/redirects/es-ft-interfaz-web-github.md b/redirects/es-ft-interfaz-web-github.md deleted file mode 100644 index e272aa7..0000000 --- a/redirects/es-ft-interfaz-web-github.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /guia/flujos-de-trabajo/interfaz-web-github/ -redirect_to: /guia/configuracion/configuracion-manual/ -lang: es -sitemap: false ---- diff --git a/redirects/es-iiif-contenido-demo.md b/redirects/es-iiif-contenido-demo.md deleted file mode 100644 index 94a509d..0000000 --- a/redirects/es-iiif-contenido-demo.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /guia/iiif/contenido-demostracion/ -redirect_to: /guia/personalizacion/contenido-demostracion/ -lang: es -sitemap: false ---- diff --git a/redirects/es-integracion-iiif.md b/redirects/es-integracion-iiif.md deleted file mode 100644 index 22a0f78..0000000 --- a/redirects/es-integracion-iiif.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /guia/integracion-iiif/ -redirect_to: /guia/tu-contenido/imagenes-autoalojadas/ -lang: es -sitemap: false ---- diff --git a/redirects/es-pers-estilos.md b/redirects/es-pers-estilos.md deleted file mode 100644 index f090913..0000000 --- a/redirects/es-pers-estilos.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /guia/personalizacion/estilos/ -redirect_to: /guia/desarrolladores/estilos/ -lang: es -sitemap: false ---- diff --git a/redirects/es-pers-moviles.md b/redirects/es-pers-moviles.md deleted file mode 100644 index 43a1921..0000000 --- a/redirects/es-pers-moviles.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /guia/personalizacion/moviles/ -redirect_to: /guia/desarrolladores/moviles/ -lang: es -sitemap: false ---- diff --git a/redirects/es-pp-como-funciona-telar.md b/redirects/es-pp-como-funciona-telar.md deleted file mode 100644 index d2bc784..0000000 --- a/redirects/es-pp-como-funciona-telar.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /guia/primeros-pasos/como-funciona-telar/ -redirect_to: /guia/primeros-pasos/estructura-narrativa/ -lang: es -sitemap: false ---- diff --git a/redirects/es-pp-inicio-rapido.md b/redirects/es-pp-inicio-rapido.md deleted file mode 100644 index 31afd86..0000000 --- a/redirects/es-pp-inicio-rapido.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /guia/primeros-pasos/inicio-rapido/ -redirect_to: /guia/primeros-pasos/google-sheets/ -lang: es -sitemap: false ---- diff --git a/redirects/es-ref-configuracion.md b/redirects/es-ref-configuracion.md deleted file mode 100644 index f246c05..0000000 --- a/redirects/es-ref-configuracion.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /guia/referencia/configuracion/ -redirect_to: /guia/configurar/configuracion/ -lang: es -sitemap: false ---- diff --git a/redirects/es-ref-csv-historias-glosario.md b/redirects/es-ref-csv-historias-glosario.md deleted file mode 100644 index 6b9e4ad..0000000 --- a/redirects/es-ref-csv-historias-glosario.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /guia/referencia/csv-historias-glosario/ -redirect_to: /guia/tus-datos/csv-historias/ -lang: es -sitemap: false ---- diff --git a/redirects/es-ref-csv-proyecto-objetos.md b/redirects/es-ref-csv-proyecto-objetos.md deleted file mode 100644 index becfe49..0000000 --- a/redirects/es-ref-csv-proyecto-objetos.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /guia/referencia/csv-proyecto-objetos/ -redirect_to: /guia/tus-datos/csv-proyecto/ -lang: es -sitemap: false ---- diff --git a/redirects/es-ref-generador.md b/redirects/es-ref-generador.md deleted file mode 100644 index a4af5ac..0000000 --- a/redirects/es-ref-generador.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /guia/referencia/generador-de-configuracion/ -redirect_to: /guia/configurar/generador-de-configuracion/ -lang: es -sitemap: false ---- diff --git a/redirects/es-ref-sintaxis-markdown.md b/redirects/es-ref-sintaxis-markdown.md deleted file mode 100644 index d2784c5..0000000 --- a/redirects/es-ref-sintaxis-markdown.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /guia/referencia/sintaxis-markdown/ -redirect_to: /guia/tu-contenido/sintaxis-markdown/ -lang: es -sitemap: false ---- diff --git a/redirects/es-ref-validador.md b/redirects/es-ref-validador.md deleted file mode 100644 index 0e6b289..0000000 --- a/redirects/es-ref-validador.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: redirect -permalink: /guia/referencia/validador-de-configuracion/ -redirect_to: /guia/configurar/validador-de-configuracion/ -lang: es -sitemap: false ---- diff --git a/scripts/build.mjs b/scripts/build.mjs new file mode 100644 index 0000000..a5e5f7b --- /dev/null +++ b/scripts/build.mjs @@ -0,0 +1,13 @@ +import { spawnSync } from 'node:child_process'; +import { fileURLToPath } from 'node:url'; +import { dirname, resolve } from 'node:path'; +import { writeFileSync } from 'node:fs'; +const root=resolve(dirname(fileURLToPath(import.meta.url)),'..'); +const preview=process.argv.includes('--preview'); +const start=performance.now(); +for(const [name,args] of [['hugo',['--cleanDestinationDir',...(preview?['--config','hugo.json,hugo.preview.json']:[])]],['pagefind',['--site','public']]]){ + const cmd=resolve(root,'node_modules','.bin',name); + const run=spawnSync(cmd,args,{cwd:root,stdio:'inherit'}); + if(run.status!==0)process.exit(run.status||1); +} +writeFileSync(resolve(root,'.build-result.json'),JSON.stringify({preview,seconds:(performance.now()-start)/1000},null,2)+'\n'); diff --git a/scripts/serve.mjs b/scripts/serve.mjs new file mode 100644 index 0000000..e10e307 --- /dev/null +++ b/scripts/serve.mjs @@ -0,0 +1,10 @@ +import http from 'node:http'; +import { createReadStream,statSync } from 'node:fs'; +import { resolve,extname,sep } from 'node:path'; +const root=resolve('public');const port=Number(process.env.PORT||4004); +const types={'.html':'text/html; charset=utf-8','.css':'text/css','.js':'text/javascript','.json':'application/json','.svg':'image/svg+xml','.png':'image/png','.jpg':'image/jpeg','.webp':'image/webp','.gif':'image/gif','.pdf':'application/pdf','.wasm':'application/wasm','.xml':'application/xml','.txt':'text/plain'}; +http.createServer((req,res)=>{ + let path;try{path=decodeURIComponent(new URL(req.url,'http://localhost').pathname)}catch{res.writeHead(400).end();return} + let file=resolve(root,'.'+path);if(file!==root&&!file.startsWith(root+sep)){res.writeHead(403).end();return} + try{if(statSync(file).isDirectory()){if(!path.endsWith('/')){res.writeHead(301,{Location:path+'/'}).end();return}file=resolve(file,'index.html')}const stat=statSync(file);if(!stat.isFile())throw Error();res.writeHead(200,{'Content-Type':types[extname(file)]||'application/octet-stream','Cache-Control':'no-store'});createReadStream(file).pipe(res)}catch{res.writeHead(404).end('Not found')} +}).listen(port,'127.0.0.1',()=>console.log(`Telar Hugo preview: http://127.0.0.1:${port}/`)); diff --git a/start.html b/start.html deleted file mode 100644 index eec98cd..0000000 --- a/start.html +++ /dev/null @@ -1,11 +0,0 @@ ---- -layout: docs -title: Workshop quick guide -lang: en -permalink: /start/ -docs_section: quick -en_url: /start/ -es_url: /empezar/ -docs_quick: true ---- -{% include docs/quick-guide.html %} diff --git a/static/.nojekyll b/static/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/assets/css/compositor-manual.css b/static/assets/css/compositor-manual.css similarity index 100% rename from assets/css/compositor-manual.css rename to static/assets/css/compositor-manual.css diff --git a/assets/css/config-tools.css b/static/assets/css/config-tools.css similarity index 100% rename from assets/css/config-tools.css rename to static/assets/css/config-tools.css diff --git a/assets/css/guides-sketch.css b/static/assets/css/guides-sketch.css similarity index 100% rename from assets/css/guides-sketch.css rename to static/assets/css/guides-sketch.css diff --git a/assets/css/guides.css b/static/assets/css/guides.css similarity index 100% rename from assets/css/guides.css rename to static/assets/css/guides.css diff --git a/assets/css/showcase.css b/static/assets/css/showcase.css similarity index 100% rename from assets/css/showcase.css rename to static/assets/css/showcase.css diff --git a/static/assets/css/syntax-hugo.css b/static/assets/css/syntax-hugo.css new file mode 100644 index 0000000..8c43db6 --- /dev/null +++ b/static/assets/css/syntax-hugo.css @@ -0,0 +1,74 @@ +/* Generated using: hugo gen chromastyles --style github */ + +/* Background */ .bg { background-color:#f7f7f7; } +/* PreWrapper */ .chroma { background-color:#f7f7f7;-webkit-text-size-adjust:none; } +/* Error */ .chroma .err { color:#f6f8fa;background-color:#82071e } +/* LineLink */ .chroma .lnlinks { outline:none;text-decoration:none;color:inherit } +/* LineTableTD */ .chroma .lntd { vertical-align:top;padding:0;margin:0;border:0; } +/* LineTable */ .chroma .lntable { border-spacing:0;padding:0;margin:0;border:0; } +/* LineHighlight */ .chroma .hl { background-color:#dedede } +/* LineNumbersTable */ .chroma .lnt { white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f } +/* LineNumbers */ .chroma .ln { white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f } +/* Line */ .chroma .line { display:flex; } +/* Keyword */ .chroma .k { color:#cf222e } +/* KeywordConstant */ .chroma .kc { color:#cf222e } +/* KeywordDeclaration */ .chroma .kd { color:#cf222e } +/* KeywordNamespace */ .chroma .kn { color:#cf222e } +/* KeywordPseudo */ .chroma .kp { color:#cf222e } +/* KeywordReserved */ .chroma .kr { color:#cf222e } +/* KeywordType */ .chroma .kt { color:#cf222e } +/* NameAttribute */ .chroma .na { color:#1f2328 } +/* NameClass */ .chroma .nc { color:#1f2328 } +/* NameConstant */ .chroma .no { color:#0550ae } +/* NameDecorator */ .chroma .nd { color:#0550ae } +/* NameEntity */ .chroma .ni { color:#6639ba } +/* NameLabel */ .chroma .nl { color:#900;font-weight:bold } +/* NameNamespace */ .chroma .nn { color:#24292e } +/* NameOther */ .chroma .nx { color:#1f2328 } +/* NameTag */ .chroma .nt { color:#0550ae } +/* NameBuiltin */ .chroma .nb { color:#6639ba } +/* NameBuiltinPseudo */ .chroma .bp { color:#6a737d } +/* NameVariable */ .chroma .nv { color:#953800 } +/* NameVariableClass */ .chroma .vc { color:#953800 } +/* NameVariableGlobal */ .chroma .vg { color:#953800 } +/* NameVariableInstance */ .chroma .vi { color:#953800 } +/* NameVariableMagic */ .chroma .vm { color:#953800 } +/* NameFunction */ .chroma .nf { color:#6639ba } +/* NameFunctionMagic */ .chroma .fm { color:#6639ba } +/* LiteralString */ .chroma .s { color:#0a3069 } +/* LiteralStringAffix */ .chroma .sa { color:#0a3069 } +/* LiteralStringBacktick */ .chroma .sb { color:#0a3069 } +/* LiteralStringChar */ .chroma .sc { color:#0a3069 } +/* LiteralStringDelimiter */ .chroma .dl { color:#0a3069 } +/* LiteralStringDoc */ .chroma .sd { color:#0a3069 } +/* LiteralStringDouble */ .chroma .s2 { color:#0a3069 } +/* LiteralStringEscape */ .chroma .se { color:#0a3069 } +/* LiteralStringHeredoc */ .chroma .sh { color:#0a3069 } +/* LiteralStringInterpol */ .chroma .si { color:#0a3069 } +/* LiteralStringOther */ .chroma .sx { color:#0a3069 } +/* LiteralStringRegex */ .chroma .sr { color:#0a3069 } +/* LiteralStringSingle */ .chroma .s1 { color:#0a3069 } +/* LiteralStringSymbol */ .chroma .ss { color:#032f62 } +/* LiteralNumber */ .chroma .m { color:#0550ae } +/* LiteralNumberBin */ .chroma .mb { color:#0550ae } +/* LiteralNumberFloat */ .chroma .mf { color:#0550ae } +/* LiteralNumberHex */ .chroma .mh { color:#0550ae } +/* LiteralNumberInteger */ .chroma .mi { color:#0550ae } +/* LiteralNumberIntegerLong */ .chroma .il { color:#0550ae } +/* LiteralNumberOct */ .chroma .mo { color:#0550ae } +/* Operator */ .chroma .o { color:#0550ae } +/* OperatorWord */ .chroma .ow { color:#0550ae } +/* Punctuation */ .chroma .p { color:#1f2328 } +/* Comment */ .chroma .c { color:#57606a } +/* CommentHashbang */ .chroma .ch { color:#57606a } +/* CommentMultiline */ .chroma .cm { color:#57606a } +/* CommentSingle */ .chroma .c1 { color:#57606a } +/* CommentSpecial */ .chroma .cs { color:#57606a } +/* CommentPreproc */ .chroma .cp { color:#57606a } +/* CommentPreprocFile */ .chroma .cpf { color:#57606a } +/* GenericDeleted */ .chroma .gd { color:#82071e;background-color:#ffebe9 } +/* GenericEmph */ .chroma .ge { color:#1f2328 } +/* GenericInserted */ .chroma .gi { color:#116329;background-color:#dafbe1 } +/* GenericOutput */ .chroma .go { color:#1f2328 } +/* GenericUnderline */ .chroma .gl { text-decoration:underline } +/* TextWhitespace */ .chroma .w { color:#fff } diff --git a/assets/css/teaching-contact.css b/static/assets/css/teaching-contact.css similarity index 100% rename from assets/css/teaching-contact.css rename to static/assets/css/teaching-contact.css diff --git a/assets/css/tutorial-nav.css b/static/assets/css/tutorial-nav.css similarity index 100% rename from assets/css/tutorial-nav.css rename to static/assets/css/tutorial-nav.css diff --git a/assets/homepage-demo/LENIS-LICENSE.txt b/static/assets/homepage-demo/LENIS-LICENSE.txt similarity index 100% rename from assets/homepage-demo/LENIS-LICENSE.txt rename to static/assets/homepage-demo/LENIS-LICENSE.txt diff --git a/assets/homepage-demo/README.md b/static/assets/homepage-demo/README.md similarity index 100% rename from assets/homepage-demo/README.md rename to static/assets/homepage-demo/README.md diff --git a/assets/homepage-demo/homepage-demo.css b/static/assets/homepage-demo/homepage-demo.css similarity index 100% rename from assets/homepage-demo/homepage-demo.css rename to static/assets/homepage-demo/homepage-demo.css diff --git a/assets/homepage-demo/homepage-demo.js b/static/assets/homepage-demo/homepage-demo.js similarity index 100% rename from assets/homepage-demo/homepage-demo.js rename to static/assets/homepage-demo/homepage-demo.js diff --git a/assets/homepage-demo/lenis.css b/static/assets/homepage-demo/lenis.css similarity index 100% rename from assets/homepage-demo/lenis.css rename to static/assets/homepage-demo/lenis.css diff --git a/assets/homepage-demo/lenis.min.js b/static/assets/homepage-demo/lenis.min.js similarity index 100% rename from assets/homepage-demo/lenis.min.js rename to static/assets/homepage-demo/lenis.min.js diff --git a/assets/homepage-demo/posters/en.jpg b/static/assets/homepage-demo/posters/en.jpg similarity index 100% rename from assets/homepage-demo/posters/en.jpg rename to static/assets/homepage-demo/posters/en.jpg diff --git a/assets/homepage-demo/posters/es.jpg b/static/assets/homepage-demo/posters/es.jpg similarity index 100% rename from assets/homepage-demo/posters/es.jpg rename to static/assets/homepage-demo/posters/es.jpg diff --git a/assets/homepage-demo/scroll-motion.js b/static/assets/homepage-demo/scroll-motion.js similarity index 100% rename from assets/homepage-demo/scroll-motion.js rename to static/assets/homepage-demo/scroll-motion.js diff --git a/assets/js/docs.js b/static/assets/js/docs.js similarity index 100% rename from assets/js/docs.js rename to static/assets/js/docs.js diff --git a/assets/js/teaching-contact.js b/static/assets/js/teaching-contact.js similarity index 100% rename from assets/js/teaching-contact.js rename to static/assets/js/teaching-contact.js diff --git a/assets/manual/en-iiif-preview.jpg b/static/assets/manual/en-iiif-preview.jpg similarity index 100% rename from assets/manual/en-iiif-preview.jpg rename to static/assets/manual/en-iiif-preview.jpg diff --git a/assets/manual/en-iiif-url.jpg b/static/assets/manual/en-iiif-url.jpg similarity index 100% rename from assets/manual/en-iiif-url.jpg rename to static/assets/manual/en-iiif-url.jpg diff --git a/assets/manual/en-khipu-framing.jpg b/static/assets/manual/en-khipu-framing.jpg similarity index 100% rename from assets/manual/en-khipu-framing.jpg rename to static/assets/manual/en-khipu-framing.jpg diff --git a/assets/manual/es-iiif-preview.jpg b/static/assets/manual/es-iiif-preview.jpg similarity index 100% rename from assets/manual/es-iiif-preview.jpg rename to static/assets/manual/es-iiif-preview.jpg diff --git a/assets/manual/es-iiif-url.jpg b/static/assets/manual/es-iiif-url.jpg similarity index 100% rename from assets/manual/es-iiif-url.jpg rename to static/assets/manual/es-iiif-url.jpg diff --git a/assets/manual/es-khipu-framing.jpg b/static/assets/manual/es-khipu-framing.jpg similarity index 100% rename from assets/manual/es-khipu-framing.jpg rename to static/assets/manual/es-khipu-framing.jpg diff --git a/assets/manual/tutorials/en-coordinates-poster.jpg b/static/assets/manual/tutorials/en-coordinates-poster.jpg similarity index 100% rename from assets/manual/tutorials/en-coordinates-poster.jpg rename to static/assets/manual/tutorials/en-coordinates-poster.jpg diff --git a/assets/manual/tutorials/en-coordinates.gif b/static/assets/manual/tutorials/en-coordinates.gif similarity index 100% rename from assets/manual/tutorials/en-coordinates.gif rename to static/assets/manual/tutorials/en-coordinates.gif diff --git a/assets/manual/tutorials/en-create-site.jpg b/static/assets/manual/tutorials/en-create-site.jpg similarity index 100% rename from assets/manual/tutorials/en-create-site.jpg rename to static/assets/manual/tutorials/en-create-site.jpg diff --git a/assets/manual/tutorials/en-editor-overview.jpg b/static/assets/manual/tutorials/en-editor-overview.jpg similarity index 100% rename from assets/manual/tutorials/en-editor-overview.jpg rename to static/assets/manual/tutorials/en-editor-overview.jpg diff --git a/assets/manual/tutorials/en-external-media.jpg b/static/assets/manual/tutorials/en-external-media.jpg similarity index 100% rename from assets/manual/tutorials/en-external-media.jpg rename to static/assets/manual/tutorials/en-external-media.jpg diff --git a/assets/manual/tutorials/en-framing-poster.jpg b/static/assets/manual/tutorials/en-framing-poster.jpg similarity index 100% rename from assets/manual/tutorials/en-framing-poster.jpg rename to static/assets/manual/tutorials/en-framing-poster.jpg diff --git a/assets/manual/tutorials/en-framing.gif b/static/assets/manual/tutorials/en-framing.gif similarity index 100% rename from assets/manual/tutorials/en-framing.gif rename to static/assets/manual/tutorials/en-framing.gif diff --git a/assets/manual/tutorials/en-glossary.jpg b/static/assets/manual/tutorials/en-glossary.jpg similarity index 100% rename from assets/manual/tutorials/en-glossary.jpg rename to static/assets/manual/tutorials/en-glossary.jpg diff --git a/assets/manual/tutorials/en-homepage.jpg b/static/assets/manual/tutorials/en-homepage.jpg similarity index 100% rename from assets/manual/tutorials/en-homepage.jpg rename to static/assets/manual/tutorials/en-homepage.jpg diff --git a/assets/manual/tutorials/en-import-poster.jpg b/static/assets/manual/tutorials/en-import-poster.jpg similarity index 100% rename from assets/manual/tutorials/en-import-poster.jpg rename to static/assets/manual/tutorials/en-import-poster.jpg diff --git a/assets/manual/tutorials/en-import.gif b/static/assets/manual/tutorials/en-import.gif similarity index 100% rename from assets/manual/tutorials/en-import.gif rename to static/assets/manual/tutorials/en-import.gif diff --git a/assets/manual/tutorials/en-object-metadata.jpg b/static/assets/manual/tutorials/en-object-metadata.jpg similarity index 100% rename from assets/manual/tutorials/en-object-metadata.jpg rename to static/assets/manual/tutorials/en-object-metadata.jpg diff --git a/assets/manual/tutorials/en-objects.jpg b/static/assets/manual/tutorials/en-objects.jpg similarity index 100% rename from assets/manual/tutorials/en-objects.jpg rename to static/assets/manual/tutorials/en-objects.jpg diff --git a/assets/manual/tutorials/en-pages.jpg b/static/assets/manual/tutorials/en-pages.jpg similarity index 100% rename from assets/manual/tutorials/en-pages.jpg rename to static/assets/manual/tutorials/en-pages.jpg diff --git a/assets/manual/tutorials/en-panel-editor.jpg b/static/assets/manual/tutorials/en-panel-editor.jpg similarity index 100% rename from assets/manual/tutorials/en-panel-editor.jpg rename to static/assets/manual/tutorials/en-panel-editor.jpg diff --git a/assets/manual/tutorials/en-panels-poster.jpg b/static/assets/manual/tutorials/en-panels-poster.jpg similarity index 100% rename from assets/manual/tutorials/en-panels-poster.jpg rename to static/assets/manual/tutorials/en-panels-poster.jpg diff --git a/assets/manual/tutorials/en-panels.gif b/static/assets/manual/tutorials/en-panels.gif similarity index 100% rename from assets/manual/tutorials/en-panels.gif rename to static/assets/manual/tutorials/en-panels.gif diff --git a/assets/manual/tutorials/en-preferences.jpg b/static/assets/manual/tutorials/en-preferences.jpg similarity index 100% rename from assets/manual/tutorials/en-preferences.jpg rename to static/assets/manual/tutorials/en-preferences.jpg diff --git a/assets/manual/tutorials/en-public-home.jpg b/static/assets/manual/tutorials/en-public-home.jpg similarity index 100% rename from assets/manual/tutorials/en-public-home.jpg rename to static/assets/manual/tutorials/en-public-home.jpg diff --git a/assets/manual/tutorials/en-public-object.jpg b/static/assets/manual/tutorials/en-public-object.jpg similarity index 100% rename from assets/manual/tutorials/en-public-object.jpg rename to static/assets/manual/tutorials/en-public-object.jpg diff --git a/assets/manual/tutorials/en-stories.jpg b/static/assets/manual/tutorials/en-stories.jpg similarity index 100% rename from assets/manual/tutorials/en-stories.jpg rename to static/assets/manual/tutorials/en-stories.jpg diff --git a/assets/manual/tutorials/en-theme-language.jpg b/static/assets/manual/tutorials/en-theme-language.jpg similarity index 100% rename from assets/manual/tutorials/en-theme-language.jpg rename to static/assets/manual/tutorials/en-theme-language.jpg diff --git a/assets/manual/tutorials/en-upgrade.jpg b/static/assets/manual/tutorials/en-upgrade.jpg similarity index 100% rename from assets/manual/tutorials/en-upgrade.jpg rename to static/assets/manual/tutorials/en-upgrade.jpg diff --git a/assets/manual/tutorials/es-coordinates-poster.jpg b/static/assets/manual/tutorials/es-coordinates-poster.jpg similarity index 100% rename from assets/manual/tutorials/es-coordinates-poster.jpg rename to static/assets/manual/tutorials/es-coordinates-poster.jpg diff --git a/assets/manual/tutorials/es-coordinates.gif b/static/assets/manual/tutorials/es-coordinates.gif similarity index 100% rename from assets/manual/tutorials/es-coordinates.gif rename to static/assets/manual/tutorials/es-coordinates.gif diff --git a/assets/manual/tutorials/es-create-site.jpg b/static/assets/manual/tutorials/es-create-site.jpg similarity index 100% rename from assets/manual/tutorials/es-create-site.jpg rename to static/assets/manual/tutorials/es-create-site.jpg diff --git a/assets/manual/tutorials/es-editor-overview.jpg b/static/assets/manual/tutorials/es-editor-overview.jpg similarity index 100% rename from assets/manual/tutorials/es-editor-overview.jpg rename to static/assets/manual/tutorials/es-editor-overview.jpg diff --git a/assets/manual/tutorials/es-external-media.jpg b/static/assets/manual/tutorials/es-external-media.jpg similarity index 100% rename from assets/manual/tutorials/es-external-media.jpg rename to static/assets/manual/tutorials/es-external-media.jpg diff --git a/assets/manual/tutorials/es-framing-poster.jpg b/static/assets/manual/tutorials/es-framing-poster.jpg similarity index 100% rename from assets/manual/tutorials/es-framing-poster.jpg rename to static/assets/manual/tutorials/es-framing-poster.jpg diff --git a/assets/manual/tutorials/es-framing.gif b/static/assets/manual/tutorials/es-framing.gif similarity index 100% rename from assets/manual/tutorials/es-framing.gif rename to static/assets/manual/tutorials/es-framing.gif diff --git a/assets/manual/tutorials/es-glossary.jpg b/static/assets/manual/tutorials/es-glossary.jpg similarity index 100% rename from assets/manual/tutorials/es-glossary.jpg rename to static/assets/manual/tutorials/es-glossary.jpg diff --git a/assets/manual/tutorials/es-homepage.jpg b/static/assets/manual/tutorials/es-homepage.jpg similarity index 100% rename from assets/manual/tutorials/es-homepage.jpg rename to static/assets/manual/tutorials/es-homepage.jpg diff --git a/assets/manual/tutorials/es-import-poster.jpg b/static/assets/manual/tutorials/es-import-poster.jpg similarity index 100% rename from assets/manual/tutorials/es-import-poster.jpg rename to static/assets/manual/tutorials/es-import-poster.jpg diff --git a/assets/manual/tutorials/es-import.gif b/static/assets/manual/tutorials/es-import.gif similarity index 100% rename from assets/manual/tutorials/es-import.gif rename to static/assets/manual/tutorials/es-import.gif diff --git a/assets/manual/tutorials/es-object-metadata.jpg b/static/assets/manual/tutorials/es-object-metadata.jpg similarity index 100% rename from assets/manual/tutorials/es-object-metadata.jpg rename to static/assets/manual/tutorials/es-object-metadata.jpg diff --git a/assets/manual/tutorials/es-objects.jpg b/static/assets/manual/tutorials/es-objects.jpg similarity index 100% rename from assets/manual/tutorials/es-objects.jpg rename to static/assets/manual/tutorials/es-objects.jpg diff --git a/assets/manual/tutorials/es-pages.jpg b/static/assets/manual/tutorials/es-pages.jpg similarity index 100% rename from assets/manual/tutorials/es-pages.jpg rename to static/assets/manual/tutorials/es-pages.jpg diff --git a/assets/manual/tutorials/es-panel-editor.jpg b/static/assets/manual/tutorials/es-panel-editor.jpg similarity index 100% rename from assets/manual/tutorials/es-panel-editor.jpg rename to static/assets/manual/tutorials/es-panel-editor.jpg diff --git a/assets/manual/tutorials/es-panels-poster.jpg b/static/assets/manual/tutorials/es-panels-poster.jpg similarity index 100% rename from assets/manual/tutorials/es-panels-poster.jpg rename to static/assets/manual/tutorials/es-panels-poster.jpg diff --git a/assets/manual/tutorials/es-panels.gif b/static/assets/manual/tutorials/es-panels.gif similarity index 100% rename from assets/manual/tutorials/es-panels.gif rename to static/assets/manual/tutorials/es-panels.gif diff --git a/assets/manual/tutorials/es-preferences.jpg b/static/assets/manual/tutorials/es-preferences.jpg similarity index 100% rename from assets/manual/tutorials/es-preferences.jpg rename to static/assets/manual/tutorials/es-preferences.jpg diff --git a/assets/manual/tutorials/es-public-home.jpg b/static/assets/manual/tutorials/es-public-home.jpg similarity index 100% rename from assets/manual/tutorials/es-public-home.jpg rename to static/assets/manual/tutorials/es-public-home.jpg diff --git a/assets/manual/tutorials/es-public-object.jpg b/static/assets/manual/tutorials/es-public-object.jpg similarity index 100% rename from assets/manual/tutorials/es-public-object.jpg rename to static/assets/manual/tutorials/es-public-object.jpg diff --git a/assets/manual/tutorials/es-stories.jpg b/static/assets/manual/tutorials/es-stories.jpg similarity index 100% rename from assets/manual/tutorials/es-stories.jpg rename to static/assets/manual/tutorials/es-stories.jpg diff --git a/assets/manual/tutorials/es-theme-language.jpg b/static/assets/manual/tutorials/es-theme-language.jpg similarity index 100% rename from assets/manual/tutorials/es-theme-language.jpg rename to static/assets/manual/tutorials/es-theme-language.jpg diff --git a/assets/manual/tutorials/es-upgrade.jpg b/static/assets/manual/tutorials/es-upgrade.jpg similarity index 100% rename from assets/manual/tutorials/es-upgrade.jpg rename to static/assets/manual/tutorials/es-upgrade.jpg diff --git a/assets/templates/README.md b/static/assets/templates/README.md similarity index 100% rename from assets/templates/README.md rename to static/assets/templates/README.md diff --git a/assets/templates/telar-template.xlsx b/static/assets/templates/telar-template.xlsx similarity index 100% rename from assets/templates/telar-template.xlsx rename to static/assets/templates/telar-template.xlsx diff --git a/assets/templates/telar-worksheet.pdf b/static/assets/templates/telar-worksheet.pdf similarity index 100% rename from assets/templates/telar-worksheet.pdf rename to static/assets/templates/telar-worksheet.pdf diff --git a/images/add-files.png b/static/images/add-files.png similarity index 100% rename from images/add-files.png rename to static/images/add-files.png diff --git a/images/commit-files.png b/static/images/commit-files.png similarity index 100% rename from images/commit-files.png rename to static/images/commit-files.png diff --git a/images/config_drive.gif b/static/images/config_drive.gif similarity index 100% rename from images/config_drive.gif rename to static/images/config_drive.gif diff --git a/images/config_theme.gif b/static/images/config_theme.gif similarity index 100% rename from images/config_theme.gif rename to static/images/config_theme.gif diff --git a/images/config_title.gif b/static/images/config_title.gif similarity index 100% rename from images/config_title.gif rename to static/images/config_title.gif diff --git a/images/coordinate-picker.png b/static/images/coordinate-picker.png similarity index 100% rename from images/coordinate-picker.png rename to static/images/coordinate-picker.png diff --git a/images/create-new-layer.png b/static/images/create-new-layer.png similarity index 100% rename from images/create-new-layer.png rename to static/images/create-new-layer.png diff --git a/images/edit-layer.png b/static/images/edit-layer.png similarity index 100% rename from images/edit-layer.png rename to static/images/edit-layer.png diff --git a/images/embed-panel.png b/static/images/embed-panel.png similarity index 100% rename from images/embed-panel.png rename to static/images/embed-panel.png diff --git a/images/external-iiif-manifest.png b/static/images/external-iiif-manifest.png similarity index 100% rename from images/external-iiif-manifest.png rename to static/images/external-iiif-manifest.png diff --git a/images/gallery-browse.png b/static/images/gallery-browse.png similarity index 100% rename from images/gallery-browse.png rename to static/images/gallery-browse.png diff --git a/images/github-actions.gif b/static/images/github-actions.gif similarity index 100% rename from images/github-actions.gif rename to static/images/github-actions.gif diff --git a/images/glossary-page.png b/static/images/glossary-page.png similarity index 100% rename from images/glossary-page.png rename to static/images/glossary-page.png diff --git a/images/google-sheets-file-share-menu.png b/static/images/google-sheets-file-share-menu.png similarity index 100% rename from images/google-sheets-file-share-menu.png rename to static/images/google-sheets-file-share-menu.png diff --git a/images/google-sheets-make-a-copy.png b/static/images/google-sheets-make-a-copy.png similarity index 100% rename from images/google-sheets-make-a-copy.png rename to static/images/google-sheets-make-a-copy.png diff --git a/images/google-sheets-publish-dialog.png b/static/images/google-sheets-publish-dialog.png similarity index 100% rename from images/google-sheets-publish-dialog.png rename to static/images/google-sheets-publish-dialog.png diff --git a/images/google-sheets-share-dialog.png b/static/images/google-sheets-share-dialog.png similarity index 100% rename from images/google-sheets-share-dialog.png rename to static/images/google-sheets-share-dialog.png diff --git a/images/iframe-layer.png b/static/images/iframe-layer.png similarity index 100% rename from images/iframe-layer.png rename to static/images/iframe-layer.png diff --git a/images/navigation-menu.png b/static/images/navigation-menu.png similarity index 100% rename from images/navigation-menu.png rename to static/images/navigation-menu.png diff --git a/images/object-detail.png b/static/images/object-detail.png similarity index 100% rename from images/object-detail.png rename to static/images/object-detail.png diff --git a/images/object-sheet.png b/static/images/object-sheet.png similarity index 100% rename from images/object-sheet.png rename to static/images/object-sheet.png diff --git a/images/private-story-locked.png b/static/images/private-story-locked.png similarity index 100% rename from images/private-story-locked.png rename to static/images/private-story-locked.png diff --git a/images/sponsors/CDSC-logo.png b/static/images/sponsors/CDSC-logo.png similarity index 100% rename from images/sponsors/CDSC-logo.png rename to static/images/sponsors/CDSC-logo.png diff --git a/images/sponsors/clair-logo-white.svg b/static/images/sponsors/clair-logo-white.svg similarity index 100% rename from images/sponsors/clair-logo-white.svg rename to static/images/sponsors/clair-logo-white.svg diff --git a/images/sponsors/neogranadina-white.png b/static/images/sponsors/neogranadina-white.png similarity index 100% rename from images/sponsors/neogranadina-white.png rename to static/images/sponsors/neogranadina-white.png diff --git a/images/sponsors/ucsb-ampl-logo.png b/static/images/sponsors/ucsb-ampl-logo.png similarity index 100% rename from images/sponsors/ucsb-ampl-logo.png rename to static/images/sponsors/ucsb-ampl-logo.png diff --git a/images/sponsors/ucsb-burdick.png b/static/images/sponsors/ucsb-burdick.png similarity index 100% rename from images/sponsors/ucsb-burdick.png rename to static/images/sponsors/ucsb-burdick.png diff --git a/images/sponsors/ucsb-citral.png b/static/images/sponsors/ucsb-citral.png similarity index 100% rename from images/sponsors/ucsb-citral.png rename to static/images/sponsors/ucsb-citral.png diff --git a/images/sponsors/ucsb-library.png b/static/images/sponsors/ucsb-library.png similarity index 100% rename from images/sponsors/ucsb-library.png rename to static/images/sponsors/ucsb-library.png diff --git a/images/sponsors/ut-ampl-logo.png b/static/images/sponsors/ut-ampl-logo.png similarity index 100% rename from images/sponsors/ut-ampl-logo.png rename to static/images/sponsors/ut-ampl-logo.png diff --git a/images/sponsors/ut-history.svg b/static/images/sponsors/ut-history.svg similarity index 100% rename from images/sponsors/ut-history.svg rename to static/images/sponsors/ut-history.svg diff --git a/images/story-viewer.png b/static/images/story-viewer.png similarity index 100% rename from images/story-viewer.png rename to static/images/story-viewer.png diff --git a/images/telar-homepage.png b/static/images/telar-homepage.png similarity index 100% rename from images/telar-homepage.png rename to static/images/telar-homepage.png diff --git a/images/telar-icon.svg b/static/images/telar-icon.svg similarity index 100% rename from images/telar-icon.svg rename to static/images/telar-icon.svg diff --git a/images/telar.png b/static/images/telar.png similarity index 100% rename from images/telar.png rename to static/images/telar.png diff --git a/images/use-this-template.png b/static/images/use-this-template.png similarity index 100% rename from images/use-this-template.png rename to static/images/use-this-template.png From 27241b3aabbb6061be37d196b89a85037834158f Mon Sep 17 00:00:00 2001 From: Juan Cobo Betancourt Date: Sun, 1 Nov 2026 12:34:00 -0800 Subject: [PATCH 3/4] Fix configuration generation and theme validation Quote version and release-date values once in generated YAML. Recognize trama alongside the other bundled themes. --- content/en/docs/configure/config-generator.md | 4 ++-- content/en/docs/configure/config-validator.md | 2 +- content/es/guia/configurar/generador-de-configuracion.md | 4 ++-- content/es/guia/configurar/validador-de-configuracion.md | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/content/en/docs/configure/config-generator.md b/content/en/docs/configure/config-generator.md index eed3b2b..fab00c7 100644 --- a/content/en/docs/configure/config-generator.md +++ b/content/en/docs/configure/config-generator.md @@ -134,8 +134,8 @@ show_drafts: false # Telar Settings (version information) telar: - version: "__TELAR_VERSION__" - release_date: "__TELAR_RELEASE_DATE__" + version: __TELAR_VERSION__ + release_date: __TELAR_RELEASE_DATE__ # Plugins plugins: diff --git a/content/en/docs/configure/config-validator.md b/content/en/docs/configure/config-validator.md index 2e35734..91f7bb6 100644 --- a/content/en/docs/configure/config-validator.md +++ b/content/en/docs/configure/config-validator.md @@ -38,7 +38,7 @@ Your configuration is never sent to any server — everything runs in your brows inputEl.addEventListener('scroll', function() { linesEl.scrollTop = inputEl.scrollTop; }); updateLineNumbers(); - var KNOWN_THEMES = ['paisajes', 'neogranadina', 'santa-barbara', 'austin']; + var KNOWN_THEMES = ['trama', 'paisajes', 'neogranadina', 'santa-barbara', 'austin']; var WEAK_KEYS = ['test', 'password', '123', '1234', 'abc', 'key', 'secret', 'demo', 'admin']; function friendlyYamlError(reason) { diff --git a/content/es/guia/configurar/generador-de-configuracion.md b/content/es/guia/configurar/generador-de-configuracion.md index 1e8a3cc..872dce1 100644 --- a/content/es/guia/configurar/generador-de-configuracion.md +++ b/content/es/guia/configurar/generador-de-configuracion.md @@ -134,8 +134,8 @@ show_drafts: false # Telar Settings (version information) telar: - version: "__TELAR_VERSION__" - release_date: "__TELAR_RELEASE_DATE__" + version: __TELAR_VERSION__ + release_date: __TELAR_RELEASE_DATE__ # Plugins plugins: diff --git a/content/es/guia/configurar/validador-de-configuracion.md b/content/es/guia/configurar/validador-de-configuracion.md index 7da4d78..4c545d8 100644 --- a/content/es/guia/configurar/validador-de-configuracion.md +++ b/content/es/guia/configurar/validador-de-configuracion.md @@ -39,7 +39,7 @@ Tu configuración nunca se envía a ningún servidor — todo se ejecuta en tu n inputEl.addEventListener('scroll', function() { linesEl.scrollTop = inputEl.scrollTop; }); updateLineNumbers(); - var KNOWN_THEMES = ['paisajes', 'neogranadina', 'santa-barbara', 'austin']; + var KNOWN_THEMES = ['trama', 'paisajes', 'neogranadina', 'santa-barbara', 'austin']; var WEAK_KEYS = ['test', 'password', '123', '1234', 'abc', 'key', 'secret', 'demo', 'admin']; function friendlyYamlError(reason) { From 553658f7154ac6c8cff51c6bae7822985f1ae73f Mon Sep 17 00:00:00 2001 From: Juan Cobo Betancourt Date: Sun, 1 Nov 2026 12:37:06 -0800 Subject: [PATCH 4/4] Add migration checks and isolated local preview tooling Verify legacy routes, content, metadata and internal links. Require the checks before deployment. Add an isolated local Worker harness and document preview, migration validation and rollback procedures. --- .github/workflows/pages.yml | 4 + MIGRATION.md | 52 + README.md | 53 +- migration/content-contracts.json | 8656 ++++++++++++++++++++++++++++++ migration/fixtures/showcase.json | 1 + migration/inventory.json | 2102 ++++++++ migration/legacy-routes.json | 592 ++ migration/validation.json | 72 + package.json | 1 + scripts/preview-api.mjs | 31 + scripts/verify.mjs | 6 + scripts/verify.py | 89 + 12 files changed, 11650 insertions(+), 9 deletions(-) create mode 100644 MIGRATION.md create mode 100644 migration/content-contracts.json create mode 100644 migration/fixtures/showcase.json create mode 100644 migration/inventory.json create mode 100644 migration/legacy-routes.json create mode 100644 migration/validation.json create mode 100644 scripts/preview-api.mjs create mode 100644 scripts/verify.mjs create mode 100644 scripts/verify.py diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 653bb4f..b846abe 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -22,8 +22,12 @@ jobs: with: node-version: '22' cache: npm + - uses: actions/setup-python@v5 + with: + python-version: '3.12' - run: npm ci - run: npm run build + - run: npm test - uses: actions/upload-pages-artifact@v3 with: path: public diff --git a/MIGRATION.md b/MIGRATION.md new file mode 100644 index 0000000..a1f38a7 --- /dev/null +++ b/MIGRATION.md @@ -0,0 +1,52 @@ +# Jekyll → Hugo migration + +Pre-publication validation recorded 1 November 2026 on `site/hugo-migration`. This document records the migration scope, local checks and publication checklist. + +## Scope + +The migration starts from the approved redesigned Jekyll working tree, including its uncommitted changes, rebased onto main at `143fc62`, including its v1.8.3 release notes. Its original checkout and a separate source/rendered snapshot were preserved. + +All 234 existing HTML routes are retained. The native site contains 233 non-homepage pages plus English and Spanish homepages. These include all 160 canonical documentation pages, the 118-route legacy inventory, showcase pages/forms, the workshop and worksheet redirects, and the internal manual review page. The latter remains available but is excluded from search and marked noindex. + +The approved design, credits, screenshots, animations, video integration and copy are retained. The Spanish title is **Planea el recorrido de la historia**, with its former anchor preserved. The native Spanish homepage is `/es/`; old `?lang=` links forward while preserving the section fragment. + +## Native implementation + +Content is authored in Hugo's English and Spanish directories. Existing published URLs are explicit in front matter, and `translationKey` supplies native pairing. Shared data controls editorial navigation order, labels and media; the duplicate per-page title/translation registry is removed. + +The three shared page shells use native Go templates. Includes for diagrams, media, callouts and repeated guide content use shortcodes. Interactive configuration tools and showcase browser code are retained as source components. No Jekyll-generated page body is embedded in the site. The former Ruby/theme/Sass build has been removed from this worktree. + +Metadata, canonicals, language alternates, sitemaps and robots rules are generated by Hugo. Local builds use a separate preview configuration. Search indexes all 160 guide pages in two languages. The build uses pinned Hugo Extended 0.160.1 and Pagefind 1.5.2 dependencies installed by `npm ci`, without referencing another repository's tools. + +The production service addresses remain the existing showcase Worker. Local integration testing uses a separate Worker copy, database and test Turnstile keys, with no Slack destination. The documented preview harness was started successfully against the separate Worker checkout. + +## Validation + +- Clean `npm ci` succeeded. +- Production: **20,441 checks; zero failures**. +- Preview: **20,370 checks; zero failures**. +- Source-to-output comparison: all 233 non-homepage pages and 160 canonical docs; **zero outstanding differences** under the recorded comparison rules. +- Every existing served HTML route and all 118 legacy inventory entries remain available. Internal links, fragments, heading aliases, image targets and alt attributes pass. +- Browser testing covered language pairing, both searches, slash/Escape search navigation, the configuration tools, math rendering, the gallery and both forms. English and Spanish teaching requests and one showcase request were stored locally. The three local notification jobs had zero delivery attempts and no sent timestamp. +- Seven representative pages were measured at 390×844 and four at 768×1024. None had page-level horizontal overflow. The viewport capability affects the selected browser tab, which was explicitly verified before recording these results. +- `git diff --check` passed. The prepared GitHub workflow has not yet run on GitHub. + +Machine-readable inventory and evidence are in `migration/`. Fresh test results are written to the ignored `reports/` directory. Route/content contracts are snapshots for regression checking; they are not runtime dependencies or copied page bodies. + +## Rendering and tool corrections + +The port preserves Kramdown heading IDs explicitly, converts callout annotations, supplies Chroma styles for native highlighting, and renders the approved HTML in quick-guide data as HTML. Large interactive HTML forms use native source components so CommonMark does not reinterpret their indentation as code. + +Two existing configuration-tool bugs were corrected during browser testing: the generator quoted its version/date twice, producing invalid YAML; and the validator did not recognise the existing `trama` theme. The generator now emits valid quoted values and the validator accepts all five installed theme names. No surrounding instructional wording was rewritten. + +One precisely recorded prose comparison exception covers stray visible Markdown delimiters around the Spanish “View full site” troubleshooting label. Hugo formats the unchanged words correctly. This is a rendering correction, not a new translation. + +## Publication checklist + +1. Review the complete local site at port 4004. The remaining Spanish editorial batches remain separate from this technical migration. +2. Commit and push the migration branch when ready, then run the prepared pull-request build on GitHub. Remote CI and production deployment have not been exercised here. +3. After the review and checks, merge to switch the existing Pages build to Hugo. No DNS or hosting migration is needed for the proposed workflow. +4. Verify the live language homepages, old workshop links, search, gallery, Vimeo and both forms. Any live notification test should be deliberate; this migration's tests did not send notices. +5. For rollback, restore the pre-release source/workflow commit or redeploy the previous Pages artifact. The old Jekyll working tree remains available locally for comparison. + +Telar exhibition sites and the Compositor's application build are unchanged by this documentation-site migration. diff --git a/README.md b/README.md index 24cb1e1..34ea557 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,58 @@ # Telar project website -The bilingual Telar documentation and project site, built with Hugo Extended and Pagefind. Exhibition sites continue to use the separate Telar framework. +The bilingual documentation and project website for [Telar](https://telar.org), built with Hugo Extended and Pagefind. This repository publishes the manuals, exhibition-planning guides, teaching resources, showcase and landing pages. Telar exhibitions themselves still use the separate Telar framework and its Jekyll build. -## Build and preview +## Install and preview -Requires Node.js 22 or later. +Requires Node.js 22 or later. Regression checks additionally use Python 3, with no Python packages required. ```sh npm ci -npm run build +npm run build:preview +npm run preview ``` -For local work: +Open for English, for Spanish, or `/docs/` and `/guia/` for the guides. Existing `?lang=en` and `?lang=es` homepage links forward to the appropriate language's canonical homepage. + +For live content/layout rebuilding, run `npm run dev` after the initial preview build. Rebuild with `npm run build:preview` after content changes when checking search results: Pagefind indexes the generated HTML. + +### Previewing forms and the showcase + +The production site uses the separate `telar-showcase` Cloudflare Worker. The local preview points both forms and the gallery to port 8790 instead. To run the local integration harness, use a checkout of that Worker containing the teaching-request endpoint and its installed dependencies: ```sh -npm run build:preview -npm run preview +node scripts/preview-api.mjs --worker /path/to/telar-showcase ``` -The local site is at http://127.0.0.1:4004/. English and Spanish guides are at `/docs/` and `/guia/`; language homepages are `/` and `/es/`. Existing homepage query links continue to work. +The harness copies only Worker source and migrations into a temporary directory, creates a separate local database, loads a public showcase fixture and uses Cloudflare's test Turnstile keys. It does not copy credentials, notification destinations or existing records. Submitted test data remains in that temporary database; Slack delivery is disabled. Stop the API with Ctrl-C. The temporary path is printed at startup. + +The pages can be browsed without this API. Forms then show their existing connection error; the gallery shows its existing fallback. Production service configuration is in `hugo.json`, and local overrides are in `hugo.preview.json`. + +## Edit the site + +- `content/en/` and `content/es/` contain the content. Paths mirror the published routes. An `_index.md` is a page that also has child pages. +- Each page's `url` retains its published address. Keep its `translationKey` aligned with its counterpart; Hugo supplies the translation links. +- `data/guides.json` contains shared guide/quick-guide copy. `data/docs_navigation.json` controls the editorial grouping and order. Page titles and translation pairing live in front matter rather than a second page registry. +- `data/teaching_contact.json` contains the approved teaching form copy. `data/docs_media.json` supplies screenshot captions and optional animations. +- `layouts/_partials/docs-shell.html`, `section-shell.html` and `home.html` are the three shared page shells. Metadata lives in `meta.html`. +- `layouts/_shortcodes/` contains media, callout, diagram and shared-content components. Larger interactive tools use source templates in `layouts/_partials/pages/`. +- `static/` contains the existing styles, browser scripts and media. Hugo does not rewrite Telar framework examples in the documentation. + +Preserve explicit heading IDs and alias spans when changing headings. They keep existing links and workshop references working. The approved design and wording carry over; the remaining Spanish editorial review is a separate task. + +## Build and verify + +```sh +npm run build +npm test +``` + +The production build writes `public/` and indexes the guides in English and Spanish. The test command checks the migrated route inventory, legacy anchors, headings, code examples, tables, callouts, images, metadata, translation links and internal link targets. It also rejects prototype dependencies and local runtime URLs in production HTML. Results are written to the ignored `reports/` directory. + +After an approved change to a heading or code example, update that page's entry in `migration/content-contracts.json` as part of the same edit. Retain the old anchor IDs as aliases. Ordinary prose changes do not require changing the heading/code contracts. + +`migration/inventory.json` records the original source file and native Hugo destination for each migrated page. `migration/content-contracts.json` records the baseline rendering contracts. These are regression evidence, not generated page bodies. + +The Pages workflow builds and tests pull requests. Its deployment job runs only for `main`, after the checks pass. The deployment artifact is `public/`; source files, local fixtures and migration records are not published. -Content lives in `content/en/` and `content/es/`. Keep the published `url`, paired `translationKey`, heading IDs and alias spans when editing. Shared copy, editorial navigation and media descriptions live in `data/`. Native layouts and shortcodes live in `layouts/`, with public assets in `static/`. +See [MIGRATION.md](MIGRATION.md) for migration scope, validation and the remaining release steps. diff --git a/migration/content-contracts.json b/migration/content-contracts.json new file mode 100644 index 0000000..956dd8a --- /dev/null +++ b/migration/content-contracts.json @@ -0,0 +1,8656 @@ +{ + "/start/": { + "ids": [ + "connect", + "frame", + "object", + "plan", + "publish", + "story" + ], + "selectors": { + "h1": [ + "Workshop quick guide" + ], + "h2": [ + "Start with a source and a question", + "Open the Compositor and create your site", + "Add your source to Objects", + "Create a short story", + "Frame the detail and offer context", + "Publish, then visit the result", + "After the workshop" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Keep this open during the workshop Workshop quick guide A short route from a source and a question to your first published story, using the Compositor. Compositor ↗ Workshop slides ↗ Download the planner ↓ Print this guide Drafts and publication Your edits are saved as you work. Use Publish to send them to the repository and rebuild the public site. Start with a source and a question Choose one source you can share. Write an opening question, a possible ending and two or three questions to connect them. Use the narrative planner → Open the Compositor and create your site Open the Compositor and sign in with GitHub. Follow the setup instructions, choose Create a new Telar site and give it a name with lowercase letters and hyphens. If you already have a site, open or connect that one. Setup help → Add your source to Objects In Objects , choose + Add object . Upload an image with Upload file , or use IIIF manifest and Fetch manifest for an external collection. Review the title, source and credit. Try the khipu IIIF example → Create a short story Open Stories and choose + New Story . Give it a title, then use + Add step and Change object to select your source. Write a question and a brief answer. Repeat for your next questions. Read the story walkthrough → Frame the detail and offer context On each image step, pan and zoom to the detail you want to discuss, then choose Capture position . Use + Add panel when a step needs a longer explanation. Keep the main answer short. See the framing controls → Publish, then visit the result Open Publish , review your changes and resolve any blocking errors. Publish and wait for the build to finish. Visit the public story and check its images, framing, text and credits. If the story is marked Draft, it will not appear in the public exhibition. Publishing help → Workshop link: telar.org/start Keep this address to return to the six steps during or after a workshop. After the workshop Return to the planning guide, explore the full Compositor manual, or choose Google Sheets or local authoring. All guides →" + }, + "/empezar/": { + "ids": [ + "connect", + "frame", + "object", + "plan", + "publish", + "story" + ], + "selectors": { + "h1": [ + "Guía rápida para talleres" + ], + "h2": [ + "Empieza con una fuente y una pregunta", + "Abre el Compositor y crea tu sitio", + "Agrega tu fuente a Objetos", + "Crea una historia breve", + "Encuadra el detalle y ofrece contexto", + "Publica y visita el resultado", + "Después del taller" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Ten esta guía abierta durante el taller Guía rápida para talleres Un recorrido breve, con el Compositor, desde una fuente y una pregunta hasta tu primera historia publicada. Compositor ↗ Diapositivas del taller ↗ Descarga el planeador ↓ Imprime esta guía Borradores y publicación Tus cambios se guardan mientras trabajas. Usa Publicar para enviarlos al repositorio y regenerar el sitio público. Empieza con una fuente y una pregunta Elige una fuente que puedas compartir. Escribe una pregunta inicial, un posible cierre y dos o tres preguntas para conectarlos. Usa el planeador narrativo → Abre el Compositor y crea tu sitio Abre el Compositor e inicia sesión con GitHub. Sigue las instrucciones, elige Crear un nuevo sitio Telar y usa un nombre con letras minúsculas y guiones. Si ya tienes un sitio, ábrelo o conéctalo. Ayuda para empezar → Agrega tu fuente a Objetos En Objetos , pulsa + Agregar objeto . Sube una imagen con Subir archivo , o usa Manifiesto IIIF y Obtener manifiesto para una colección externa. Revisa el título, la fuente y el crédito. Prueba el ejemplo IIIF del khipu → Crea una historia breve Abre Historias y elige + Nueva historia . Ponle un título; después, usa + Agregar paso y Cambiar objeto para seleccionar la fuente. Escribe una pregunta y una respuesta breve. Repite con las siguientes preguntas. Consulta el recorrido de historias → Encuadra el detalle y ofrece contexto En cada paso con imagen, desplázala y ajusta el zoom hasta el detalle que quieras comentar; después, pulsa Capturar posición . Usa + Agregar panel cuando necesites una explicación más larga. Mantén breve la respuesta principal. Mira los controles de encuadre → Publica y visita el resultado Abre Publicar , revisa los cambios y resuelve los errores que impidan publicar. Publica y espera a que termine de generarse el sitio. Visita la historia pública y revisa imágenes, encuadres, textos y créditos. Si la historia está marcada como borrador, no aparecerá en la exhibición pública. Ayuda para publicar → Enlace para talleres: telar.org/empezar Guarda esta dirección para volver a los seis pasos durante o después de un taller. Después del taller Retoma la guía de planeación, explora el manual completo del Compositor o elige Google Sheets o autoría local. Todas las guías →" + }, + "/docs/your-content/objects/": { + "ids": [ + "coordinate-picker", + "defining-objects", + "media-type-detection", + "object-pages", + "objects", + "see-also" + ], + "selectors": { + "h1": [ + "Objects" + ], + "h2": [ + "Defining Objects", + "Object Pages", + "See Also" + ], + "h3": [ + "Media type detection", + "Coordinate Picker" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "object_id,title textile-001,Colonial Textile Fragment map-lima,Map of Lima" + ], + "table": [], + "blockquote": [ + "The Compositor provides a visual interface for managing objects — including IIIF manifest auto-fetch, image upload, and metadata editing.", + "The medium column (previously object_type) describes the genre or medium of the object — not the media type (Image, Video, Audio), which Telar detects automatically. The column name object_type still works for backward compatibility." + ], + "img": [ + [ + "/images/object-detail.png", + "Object detail page with IIIF viewer and metadata" + ], + [ + "/images/coordinate-picker.png", + "Coordinate picker showing X, Y, and Zoom values below the image viewer" + ] + ] + }, + "text": "Objects Objects are the materials at the center of your Telar site — images, videos, audio recordings, documents, and other materials that your stories explore. The Compositor provides a visual interface for managing objects — including IIIF manifest auto-fetch, image upload, and metadata editing. Defining Objects Every object in your site is defined as a row in your objects spreadsheet — either in the objects tab of your Google Sheet, or in objects.csv (or objetos.csv ) in telar-content/spreadsheets/ . At minimum, each object needs an object_id and a title : object_id,title textile-001,Colonial Textile Fragment map-lima,Map of Lima object_id — A unique identifier (lowercase, hyphens, underscores). This becomes the object's URL: /objects/textile-001/ title — The display name alt_text — Alternative text for accessibility (optional). Falls back to title if left empty. Media type detection Telar automatically determines whether an object is an image, video, or audio file based on its source — no additional configuration is needed: Image — A self-hosted file (JPG, PNG, etc.) in telar-content/objects/ , or an external IIIF manifest in source_url Video — A YouTube, Vimeo, or Google Drive URL in source_url Audio — A self-hosted audio file (MP3, OGG, M4A) in telar-content/objects/ For images, you have two options: Self-hosted : Place image files in telar-content/objects/ with filenames matching the object_id . Telar generates IIIF tiles automatically. External IIIF : Add a source_url column pointing to a IIIF image URL (info.json or manifest). For videos and audio, see Video Objects and Audio Objects . You can add richer metadata for each object — description, creator, period, year, medium (the genre or medium of the object, e.g. \"Photograph\", \"Oil painting\", \"Oral history\"), dimensions, source, credit, and more. See the Object Columns reference for the complete column list. The medium column (previously object_type ) describes the genre or medium of the object — not the media type (Image, Video, Audio), which Telar detects automatically. The column name object_type still works for backward compatibility. Object Pages Each object gets its own page at /objects/{object_id}/ . The page shows: A viewer — a IIIF deep-zoom viewer for images, an embedded player for videos, or an audio player for audio files A metadata table with all available fields (creator, period, medium, dimensions, source, credit) A coordinate picker (images) or clip time picker (videos and audio) for capturing values to use in story steps Related stories that reference the object A description section if you provided one in the spreadsheet Coordinate Picker The coordinate picker is a development tool on each object page. Click or zoom on the image, then read the normalized coordinates (0–1 range) displayed below the viewer. Use the Copy buttons to copy coordinates directly into your story CSV. See Also Objects Gallery — Browse, search, and filter your collection Object Columns — Complete column reference for objects.csv Self-Hosted Images — Upload and process your own images External IIIF Images — Use images from museums and libraries Video Objects — Adding videos from YouTube, Vimeo, and Google Drive Audio Objects — Adding self-hosted audio files Stories & Panels — How objects are used in stories" + }, + "/docs/your-content/rich-content/": { + "ids": [ + "basic-structure", + "editing-markdown-files-on-github", + "formatting-basics", + "how-it-works", + "next-steps", + "rich-content-with-markdown", + "step-1-create-your-markdown-file", + "step-2-link-the-file-from-your-spreadsheet", + "what-markdown-files-can-do-that-inline-text-cannot", + "when-to-add-markdown-files", + "writing-markdown-content" + ], + "selectors": { + "h1": [ + "Rich Content with Markdown" + ], + "h2": [ + "When to Add Markdown Files", + "How It Works", + "Step 1: Create Your Markdown File", + "Step 2: Link the File from Your Spreadsheet", + "Writing Markdown Content", + "Editing Markdown Files on GitHub", + "Next Steps" + ], + "h3": [ + "Basic Structure", + "Formatting Basics", + "What Markdown Files Can Do That Inline Text Cannot" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "telar-content/texts/stories/ story-1/ step1-techniques.md step2-materials.md step3-history.md story-2/ step1-overview.md", + "--- title: \"Weaving Techniques\" --- The interlocking warp pattern visible here indicates a complex weaving technique common in the colonial period. ## Technical Details These textiles were produced on backstrap looms, a technology that predates European contact by thousands of years." + ], + "table": [ + "step question layer1_content 1 What is this textile? story-1/step1-techniques.md 2 Where was it made? This textile was made in... 3 Why does it matter? story-1/step3-history.md", + "What you type What it does **bold text** bold text *italic text* italic text ## Heading A section heading - item A bulleted list item 1. item A numbered list item [text](url) A clickable link > quote A blockquote" + ], + "blockquote": [ + "This guide builds on the setup guides. Complete one of the Getting Started setup options first if you haven't already.", + "File Organization A common pattern is one folder per story, with files named by step and topic: telar-content/texts/stories/ story-1/ step1-techniques.md step2-materials.md step3-history.md story-2/ step1-overview.md But any organization works — Telar only cares about the path you put in the spreadsheet.", + "New to Markdown? Try the CommonMark Tutorial — it takes about 10 minutes and covers everything you need for Telar panels.", + "After editing files, remember to rebuild. Go to Actions → Build and Deploy → Run workflow to see your changes on the live site." + ], + "img": [ + [ + "/images/create-new-layer.png", + "Creating a new markdown file on GitHub" + ], + [ + "/images/edit-layer.png", + "Editing a markdown file on GitHub" + ] + ] + }, + "text": "Rich Content with Markdown Your site is running and your stories are in the spreadsheet. Now you want richer panels — this guide shows you how to add markdown files for story panels that need more than a few paragraphs of text. This guide builds on the setup guides. Complete one of the Getting Started setup options first if you haven't already. This page explains panel content in files and spreadsheets. In the Compositor, edit a panel's title in its title field and its content in the panel editor; the same formatting reference applies to its body. When to Add Markdown Files The spreadsheet handles most Telar exhibitions well. Consider adding markdown files when you need: Longer narratives — multi-section panels with headings and structure Interactive widgets — accordions, tabbed panels, or image carousels Rich media — embedded videos, sized images, or audio Reusable content — the same panel text referenced from multiple story steps Easier editing — a text editor is more comfortable than a spreadsheet cell for long-form writing If your panels are mostly 1-2 paragraphs, you probably do not need this workflow. Stay with Google Sheets and come back here if your needs grow. How It Works The hybrid approach is simple: your story structure stays in Google Sheets, but instead of writing panel text in a spreadsheet cell, you point to a markdown file in your repository. Telar auto-detects the difference. If the value in a layer1_content or layer2_content cell ends in .md , Telar loads the file. Otherwise, it treats the value as inline text. You can mix both approaches freely — some steps with inline text, others with file references. Step 1: Create Your Markdown File In your GitHub repository, navigate to telar-content/texts/stories/ If your story is story-1 , create a folder called story-1/ (or any name you like) Click Add file → Create new file Name your file with a .md extension (e.g., step1-techniques.md ) Use hyphens instead of spaces Choose a descriptive name — you will see it in your spreadsheet Write your content (see Writing Markdown Content below) Click Commit changes to save File Organization A common pattern is one folder per story, with files named by step and topic: telar-content/texts/stories/ story-1/ step1-techniques.md step2-materials.md step3-history.md story-2/ step1-overview.md But any organization works — Telar only cares about the path you put in the spreadsheet. Step 2: Link the File from Your Spreadsheet In your Google Sheet, put the file path in the layer1_content or layer2_content column. The path is relative to telar-content/texts/stories/ : step question layer1_content 1 What is this textile? story-1/step1-techniques.md 2 Where was it made? This textile was made in... 3 Why does it matter? story-1/step3-history.md Notice how step 2 uses inline text while steps 1 and 3 reference files. You can mix and match freely. Writing Markdown Content Basic Structure A markdown file for a story panel looks like this: --- title: \"Weaving Techniques\" --- The interlocking warp pattern visible here indicates a complex weaving technique common in the colonial period. ## Technical Details These textiles were produced on backstrap looms, a technology that predates European contact by thousands of years. The title in the frontmatter (the section between --- lines) becomes the panel heading. If you leave it out, Telar uses the button text instead. Formatting Basics Markdown uses simple characters for formatting: What you type What it does **bold text** bold text *italic text* italic text ## Heading A section heading - item A bulleted list item 1. item A numbered list item [text](url) A clickable link > quote A blockquote New to Markdown? Try the CommonMark Tutorial — it takes about 10 minutes and covers everything you need for Telar panels. What Markdown Files Can Do That Inline Text Cannot Markdown files support the full range of Telar's content features: Widgets — interactive elements like accordions, tabbed panels, and image carousels. See the Markdown Syntax Reference for the full list. Embedded media — videos, audio players, and sized images Glossary links — connect terms to your glossary using [[term-id]] syntax Complex structure — multiple headings, nested lists, and blockquotes These features work best in files because they use multi-line syntax that is hard to manage inside a spreadsheet cell. Editing Markdown Files on GitHub You do not need to install anything to edit markdown files. GitHub has a built-in editor: Navigate to the file in your repository Click the pencil icon (Edit this file) Make your changes Click Commit changes to save GitHub also shows a Preview tab so you can check your formatting before committing. After editing files, remember to rebuild. Go to Actions → Build and Deploy → Run workflow to see your changes on the live site. Next Steps Markdown Syntax Reference — full formatting guide with widgets and media Your Content — how Telar organizes files CSV Reference: Project — project CSV columns CSV Reference: Objects — objects CSV columns CSV Reference: Stories — story step CSV columns CSV Reference: Glossary — glossary CSV columns" + }, + "/guia/el-compositor/objetos/": { + "ids": [ + "agregar-iiif-externo", + "control-de-destacados", + "editar-metadatos", + "guardar-en-el-repositorio", + "indicadores-de-estado", + "lista-de-objetos", + "media-import-guia-el-compositor-objetos", + "media-object-metadata-guia-el-compositor-objetos", + "media-objects-guia-el-compositor-objetos", + "objetos", + "sincronización", + "subir-imágenes", + "véase-también" + ], + "selectors": { + "h1": [ + "Objetos" + ], + "h2": [ + "Lista de objetos", + "Editar metadatos", + "Agregar IIIF externo", + "Subir imágenes", + "Guardar en el repositorio", + "Sincronización", + "Véase también" + ], + "h3": [ + "Indicadores de estado", + "Control de destacados" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [ + "Campo Descripción Título El nombre del objeto como aparece en tu sitio Creador La persona u organización que creó el objeto Año Cuándo se creó o publicó el objeto Descripción Un resumen breve de lo que el objeto muestra o contiene Fuente De dónde proviene el objeto — una colección, archivo o URL Texto alternativo Una descripción para lectores de pantalla y accesibilidad Género / Medio El tipo de objeto — fotografía, pintura, mapa, manuscrito, etc." + ], + "blockquote": [ + "El texto alternativo es importante para la accesibilidad. Escribe una oración breve y descriptiva que transmita lo que muestra la imagen a quien no puede verla.", + "Después de subir, el estado del objeto puede mostrar Sin teselas hasta que publiques y el build de GitHub Actions genere las teselas IIIF. El objeto sigue siendo utilizable en el Compositor — las teselas estarán disponibles en tu sitio en línea después de que se complete el build." + ], + "img": [ + [ + "/assets/manual/tutorials/es-objects.jpg", + "La lista de Objetos con miniaturas, IDs, usos, estado y el control Agregar objeto." + ], + [ + "/assets/manual/tutorials/es-object-metadata.jpg", + "La imagen del khipu junto al título, la descripción y los campos de catálogo." + ], + [ + "/assets/manual/tutorials/es-import-poster.jpg", + "La ventana IIIF pasa de la URL vacía al manifiesto escrito y a la vista previa del khipu." + ] + ] + }, + "text": "Objetos La página de objetos en el Compositor te permite explorar, editar y agregar los elementos visuales que componen tu exhibición. Cada objeto que administras aquí — imágenes, manifiestos IIIF, videos, archivos de audio — se registra en el archivo objects.csv de tu repositorio. El Compositor se encarga de ese archivo por ti, así que nunca necesitas editarlo directamente. Lista de objetos La lista muestra los objetos con su miniatura, ID, usos y estado. Cada objeto muestra: Una miniatura de vista previa de la imagen o el medio El título del objeto Un indicador de estado que muestra su condición actual Indicadores de estado El estado informa sobre la disponibilidad; no significa que la ficha de catálogo ya esté completamente revisada. Listo — El objeto tiene título y supera la comprobación de imagen cuando corresponde. Sin metadatos — Falta el título. Revisa la ficha y completa el título y la información útil de catálogo. Sin teselas — La imagen aún no está disponible. En archivos alojados por el sitio, revisa el build y las teselas; en fuentes externas, revisa el manifiesto. No está en el repositorio — La ficha está marcada como ausente del repositorio. Revisa la comparación con GitHub antes de decidir qué conservar. Control de destacados Puedes marcar cualquier objeto como destacado. Los objetos destacados aparecen de manera prominente en la página de inicio de tu sitio y en la galería de objetos. Para cambiar el estado de destacado de un objeto, haz clic en el indicador de destacado en la fila del objeto. Cada fila relaciona un objeto con su miniatura, ID, usos y estado. Filtra la lista o abre el objeto para revisarlo. Ampliar captura ↗ Editar metadatos Selecciona un objeto para abrir su editor de metadatos. Aquí puedes completar o actualizar la información que describe al objeto en tu exhibición. Los campos de metadatos son: Campo Descripción Título El nombre del objeto como aparece en tu sitio Creador La persona u organización que creó el objeto Año Cuándo se creó o publicó el objeto Descripción Un resumen breve de lo que el objeto muestra o contiene Fuente De dónde proviene el objeto — una colección, archivo o URL Texto alternativo Una descripción para lectores de pantalla y accesibilidad Género / Medio El tipo de objeto — fotografía, pintura, mapa, manuscrito, etc. El texto alternativo es importante para la accesibilidad. Escribe una oración breve y descriptiva que transmita lo que muestra la imagen a quien no puede verla. La imagen y los metadatos describen el mismo khipu. Más abajo están la fuente, el crédito y el texto de accesibilidad. Ampliar captura ↗ Agregar IIIF externo Abre Objetos y pulsa + Agregar objeto . Selecciona Manifiesto IIIF . Pega la URL y pulsa Obtener manifiesto . Revisa la vista previa, el título, la fuente, el crédito y los demás metadatos disponibles. Pulsa Agregar objeto . Agregar el objeto lo deja disponible en la colección. Debes seleccionarlo por separado en un paso con Cambiar objeto . Sigue Usar un objeto IIIF en una historia para el ejemplo ilustrado completo del khipu. Consulta Imágenes IIIF externas para más contexto. Pega el manifiesto, obtén los datos y revisa el khipu y sus metadatos. Agregar el objeto es una acción posterior. Ver los pasos Ampliar captura ↗ Descargar GIF Subir imágenes Puedes subir tus propias imágenes directamente a través del Compositor. Las imágenes subidas se confirman en tu repositorio y las teselas IIIF se generan automáticamente durante el siguiente build . Haz clic en Agregar objeto y selecciona la opción de subida Arrastra archivos al área de subida, o haz clic para seleccionar archivos desde tu computador Completa los metadatos mientras se procesa la subida Guarda el objeto en tu proyecto Los formatos admitidos son JPG, PNG y TIFF, con un tamaño máximo de 25 MB por imagen. Después de subir, el estado del objeto puede mostrar Sin teselas hasta que publiques y el build de GitHub Actions genere las teselas IIIF. El objeto sigue siendo utilizable en el Compositor — las teselas estarán disponibles en tu sitio en línea después de que se complete el build . Guardar en el repositorio Cuando guardas cambios en los objetos — ya sea editando metadatos, agregando IIIF o subiendo imágenes — esos cambios se guardan en el borrador del Compositor. Para enviarlos a GitHub, necesitas publicar. Al publicar se confirma un archivo objects.csv actualizado en tu repositorio junto con cualquier imagen subida. Consulta Publicación para el flujo de trabajo completo. Sincronización Cuando los objetos cambian fuera del Compositor, usa la revisión de Cambios en GitHub del proyecto. Lee las diferencias y elige qué versión conservar antes de aplicarlas. Consulta Sincronización y actualizaciones . Editar un borrador y publicar son acciones distintas. Revisa las consecuencias para el objeto afectado en vez de volver a importar todo el proyecto. Véase también Inicio y navegación — Regresa a la vista general del proyecto Objetos — Cómo funcionan los objetos en Telar Imágenes IIIF externas — Información sobre manifiestos IIIF y fuentes Imágenes autoalojadas — Cómo las imágenes subidas se convierten en teselas IIIF" + }, + "/docs/site-features/embedding/": { + "ids": [ + "accessibility", + "canvas-lms", + "choose-appropriate-dimensions", + "custom-dimensions", + "dimension-presets", + "embed-mode-features", + "embedding-telar-stories-in-lms--websites", + "how-to-embed-a-story", + "moodle", + "multiple-stories-on-one-page", + "next-steps", + "other-platforms", + "platform-specific-instructions", + "prerequisites", + "security-considerations", + "step-1-open-the-share--embed-panel", + "step-2-switch-to-embed-code-tab", + "step-3-select-a-story-homepage-only", + "step-4-choose-dimensions", + "step-5-copy-the-embed-code", + "test-before-publishing", + "tips-for-successful-embedding", + "troubleshooting", + "updating-embedded-stories", + "what-is-embedding", + "what-users-will-see", + "when-to-use-embedding", + "wordpress" + ], + "selectors": { + "h1": [ + "Embedding Telar Stories in LMS & Websites" + ], + "h2": [ + "What is Embedding?", + "When to Use Embedding", + "Prerequisites", + "How to Embed a Story", + "Platform-Specific Instructions", + "What Users Will See", + "Tips for Successful Embedding", + "Updating Embedded Stories", + "Troubleshooting", + "Next Steps" + ], + "h3": [ + "Step 1: Open the Share & Embed Panel", + "Step 2: Switch to Embed Code Tab", + "Step 3: Select a Story (Homepage Only)", + "Step 4: Choose Dimensions", + "Step 5: Copy the Embed Code", + "Canvas LMS", + "WordPress", + "Moodle", + "Other Platforms", + "Embed Mode Features", + "Accessibility", + "Choose Appropriate Dimensions", + "Test Before Publishing", + "Multiple Stories on One Page", + "Security Considerations" + ], + "h4": [ + "Dimension Presets", + "Custom Dimensions" + ], + "h5": [], + "h6": [], + "pre": [ + "" + ], + "table": [ + "Preset Width Height Best For Canvas LMS 100% 800px Canvas course pages (default) Moodle/Blackboard 100% 700px Moodle course modules WordPress 100% 600px Blog posts and pages Squarespace 100% 600px Squarespace pages Wix 100% 550px Wix site pages Mobile 375px 500px Mobile-optimized display Fixed 800px 600px Fixed-size containers Custom Your choice Your choice Manual control" + ], + "blockquote": [ + "Tip: Start with the preset Use the preset for your platform, then adjust if needed. Most platforms work best with 100% width and 600-800px height.", + "Understanding Width and Height Width: 100% fills the available horizontal space (recommended for most uses) Height: Fixed pixels provides consistent display across devices The embed code will automatically add \"px\" to plain numbers", + "To start an embedded story at a specific step, append a deep link fragment to the embed URL — for example, ?embed=true#s3 opens at step 3. See Sharing and deep linking for the fragment format.", + "Canvas Embed Confirmation Canvas may show a blank box in the editor. This is normal—the story will display correctly when you view the published page.", + "Tip: Version Compatibility As long as you keep the embed URL format (?embed=true), embedded stories will work across Telar version updates." + ], + "img": [ + [ + "/images/embed-panel.png", + "Share and Embed panel with link and embed code options" + ] + ] + }, + "text": "Embedding Telar Stories in LMS & Websites Embed individual Telar stories into Canvas, Moodle, WordPress, or any website that supports iframes. What is Embedding? Embedding lets you display a Telar story inside another website or learning management system (LMS). Your story appears as part of the host page, allowing students or visitors to explore it without leaving the platform. Benefits of embedding: Keep users within your LMS or website Integrate visual narratives into course modules Maintain consistent navigation and branding No separate login or external links required When to Use Embedding Best for: Canvas LMS course modules Moodle course content WordPress blog posts and pages Educational course sites Portfolio websites Not needed for: Sharing direct links (use the share link feature instead) Full-site integration (link to your Telar homepage) Prerequisites Before embedding: Your Telar site must be deployed and publicly accessible (via GitHub Pages or custom domain) You need edit access to the destination platform (Canvas, WordPress, etc.) The platform must support HTML/iframe embedding How to Embed a Story Step 1: Open the Share & Embed Panel On a story page: Navigate to the story you want to embed Click the Share button (appears on the right side of the narrative panel) On your site homepage: Go to your Telar site homepage Click the Share button in the navigation bar (top right) Step 2: Switch to Embed Code Tab In the share panel, click the Embed Code tab Read the introductory text for platform-specific guidance Step 3: Select a Story (Homepage Only) If you opened the share panel from the homepage: Use the Select Story dropdown Choose the story you want to embed The embed code will update automatically Step 4: Choose Dimensions Select a preset that matches your platform, or enter custom dimensions. Dimension Presets Preset Width Height Best For Canvas LMS 100% 800px Canvas course pages (default) Moodle/Blackboard 100% 700px Moodle course modules WordPress 100% 600px Blog posts and pages Squarespace 100% 600px Squarespace pages Wix 100% 550px Wix site pages Mobile 375px 500px Mobile-optimized display Fixed 800px 600px Fixed-size containers Custom Your choice Your choice Manual control Tip: Start with the preset Use the preset for your platform, then adjust if needed. Most platforms work best with 100% width and 600-800px height. Custom Dimensions For the Custom preset or to modify a preset: Click the Width field and enter a value: Percentage: 100% (fills container width) Pixels: 800 or 800px (fixed width) Click the Height field and enter a value: Usually pixels: 600 or 600px Percentage works but may behave unexpectedly in iframes Understanding Width and Height Width: 100% fills the available horizontal space (recommended for most uses) Height: Fixed pixels provides consistent display across devices The embed code will automatically add \"px\" to plain numbers Step 5: Copy the Embed Code Review the generated code in the text box Click the Copy Embed Code button Look for the checkmark icon confirming the code was copied The embed code looks like this: To start an embedded story at a specific step, append a deep link fragment to the embed URL — for example, ?embed=true#s3 opens at step 3. See Sharing and deep linking for the fragment format. Platform-Specific Instructions Canvas LMS To embed in a Canvas course page: Navigate to your Canvas course Go to Pages or Modules Create a new page or edit an existing one Click the (HTML Editor) button in the toolbar Paste the embed code you copied Click again to return to the visual editor Click Save or Update View the page to see your embedded story Canvas Embed Confirmation Canvas may show a blank box in the editor. This is normal—the story will display correctly when you view the published page. Testing your embed: Click View on the page Verify the story loads Test navigation using the arrow buttons Ensure the IIIF image viewer works Check that the \"View full site\" banner appears (it's dismissible) WordPress To embed in a WordPress post or page: Edit or create a post/page Add a Custom HTML block Click + to add a block Search for \"Custom HTML\" Click to insert Paste the embed code into the HTML block Click Preview to test Click Publish or Update Block Editor (Gutenberg): The Custom HTML block is the recommended approach. Do not use the \"Embed\" block—it's designed for oEmbed providers, not custom iframe code. Classic Editor: Switch to the Text tab (not Visual), paste the code, then switch back to Visual to see a preview. Moodle To embed in a Moodle course: Turn editing on in your course Add an HTML block to a section Click the (HTML) button in the editor toolbar Paste the embed code Click again to return to the visual editor Save changes Alternatively, use the Page resource type and paste the embed code in HTML mode. Other Platforms Most website builders and CMS platforms support iframe embedding: Squarespace : Use a Code Block Wix : Use the HTML iframe element Webflow : Use an Embed element Ghost : Use an HTML card Consult your platform's documentation for instructions on adding custom HTML or iframes. What Users Will See Embed Mode Features When a story is embedded, users experience: Navigation: Button navigation (up/down) for moving between steps — embedded stories use buttons instead of scroll Buttons appear on all screen sizes (including desktop) Keyboard navigation (arrow keys, Page Up/Down, Space) Smooth transitions between steps Icons are inline Lucide SVGs Viewer: Full IIIF image viewer with zoom and pan Responsive scaling for different screen sizes Thumbnail navigation in viewer interface \"View Full Site\" Banner: Appears at top-left of embedded story Links to your full Telar site Dismissible with X button Reappears on page refresh Hidden Elements: Home button (not shown in embed mode) Share button (not shown in embed mode) Accessibility Embedded stories maintain full accessibility: Keyboard navigation supported ARIA labels preserved Screen reader compatible Text content remains accessible Tips for Successful Embedding Choose Appropriate Dimensions For LMS platforms (Canvas, Moodle): Use 100% width to fill the content area Use 700-800px height for comfortable viewing Test on both desktop and mobile For blog posts and articles: Consider 100% width or fixed 800px Use 600-700px height to balance with text content Ensure the story doesn't dominate the page For mobile-first sites: Use the Mobile preset (375px × 500px) Or use 100% width with 500-600px height Test on actual mobile devices Test Before Publishing Preview the embedded story before making it public Test navigation (buttons, keyboard, scroll) Verify the IIIF viewer loads and zooms correctly Check on mobile devices and tablets Ensure the embedded story doesn't break page layout Multiple Stories on One Page You can embed multiple stories on a single page: Each story gets its own iframe Use consistent dimensions for visual coherence Add text or headings between embedded stories Consider page length and loading time Security Considerations Embed URLs are public: Anyone with the embed code can view your story Embedded stories bypass any access restrictions on the host site Use the same permissions as your main Telar site Canvas/LMS security: Course-level permissions don't apply to embedded content Students can view the story even outside the course by accessing the URL directly Consider this when embedding sensitive content Updating Embedded Stories Changes to your Telar site automatically appear in embeds: Edit content in your Telar repository (Google Sheets or markdown) Push changes and let GitHub Actions build the site Embedded stories update automatically—no need to re-embed Changing embed dimensions: If you need to change the width or height: Generate new embed code with updated dimensions Replace the old code in your platform Save/publish the update Tip: Version Compatibility As long as you keep the embed URL format ( ?embed=true ), embedded stories will work across Telar version updates. Troubleshooting iframe not displaying: Check that ?embed=true parameter is included in URL Verify parent site allows iframes Check browser console for errors Navigation not working: Ensure you're not blocking JavaScript Verify iframe has sufficient height Check for conflicting CSS on parent page Content cut off: Increase iframe height (recommended: 800px minimum) Set width: 100% for responsive behavior Next Steps Share Links : Use the Share Link tab for direct links instead of embedding Customization : Learn about customizing your Telar site Technical Details : See Embedding System Architecture for developer documentation" + }, + "/guia/funciones/": { + "ids": [ + "funciones-del-sitio" + ], + "selectors": { + "h1": [ + "Funciones del sitio" + ], + "h2": [], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Funciones del sitio Telar incluye varias funciones integradas que enriquecen tu exhibición más allá de la experiencia básica de las historias. Galería de objetos — Una página de galería navegable y con búsqueda para toda tu colección, con filtrado por tipo, creador, periodo y temas Glosario — Define términos que el público puede consultar desde las historias sin salir de la narrativa Historias privadas — Encripta historias para que solo quienes tengan la clave correcta puedan acceder a ellas Páginas personalizadas — Crea páginas independientes para contenido fuera de la estructura de historias — créditos, metodología, bibliografías Insertar en Canvas — Inserta tu sitio Telar o historias individuales en sistemas de gestión de aprendizaje" + }, + "/guia/configuracion/configuracion-manual/": { + "ids": [ + "configura-tu-sitio", + "configuración-manual", + "crea-tu-repositorio", + "duplica-la-plantilla-de-google-sheets", + "habilita-github-pages", + "parte-1-configura-la-parte-técnica", + "próximos-pasos", + "publica-tu-hoja", + "verifica-tu-configuración" + ], + "selectors": { + "h1": [ + "Configuración manual" + ], + "h2": [ + "Parte 1: Configura la parte técnica", + "Próximos pasos" + ], + "h3": [ + "Crea tu repositorio", + "Habilita GitHub Pages", + "Duplica la plantilla de Google Sheets", + "Publica tu hoja", + "Configura tu sitio", + "Verifica tu configuración" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "title: \"Mi exposición\" description: \"Una narrativa visual sobre...\" author: Tu Nombre", + "url: \"https://tuusuariogithub.github.io\" baseurl: \"/nombre-de-tu-repositorio\"", + "google_sheets: enabled: true published_url: \"https://docs.google.com/...\"", + "telar_theme: \"paisajes\" # Opciones: paisajes, neogranadina, santa-barbara, austin" + ], + "table": [], + "blockquote": [ + "Simplificado en v0.9.0. Las versiones anteriores requerían tanto una URL compartida como una URL publicada. Desde v0.9.0, solo se necesita la URL publicada. Si tu _config.yml todavía tiene una línea shared_url, se ignora sin problemas.", + "Es muy importante que tu baseurl coincida exactamente con el nombre de tu repositorio. Baseurl debe estar completamente en minúsculas, así que si le pusiste mayúsculas al nombre de tu repositorio, ve y cámbialo ahora.", + "Si el build falla o tu sitio no se ve bien, revisa tu _config.yml con cuidado. Errores comunes: Comillas sin cerrar — cada \" necesita su par Falta espacio después de los dos puntos — escribe title: \"Mi sitio\", no title:\"Mi sitio\" Indentación incorrecta — las opciones anidadas como published_url deben indentarse con espacios, no tabulaciones baseurl no coincide — debe coincidir exactamente con el nombre de tu repositorio, todo en minúsculas URL de Google Sheets incorrecta — asegúrate de usar la URL publicada de Archivo → Compartir → Publicar en la Web Consulta la Referencia de configuración para la lista completa de opciones. También puedes pegar tu _config.yml en el Validador de Configuración de Telar para buscar errores, o usar el Generador y editor de configuración para crear uno desde cero." + ], + "img": [ + [ + "/images/use-this-template.png", + "Captura de pantalla de GitHub: botón Use this template" + ], + [ + "/images/github-actions.gif", + "Configuración de GitHub Pages con GitHub Actions" + ], + [ + "/images/config_title.gif", + "Editando config: título y URL" + ], + [ + "/images/config_theme.gif", + "Editando config: tema" + ], + [ + "/images/telar-homepage.png", + "Página de inicio de Telar con título y menú de navegación" + ] + ] + }, + "text": "Configuración manual Construye una exposición completa de Telar desde tu navegador usando GitHub y Google Sheets. No necesitas instalar nada. Vas a necesitar: Una cuenta de GitHub (gratis) Una cuenta de Google para Google Sheets (gratis) Parte 1: Configura la parte técnica Esta parte puede parecer intimidante, pero solo tienes que hacerla una vez. Una vez que todo esté configurado, no tendrás que volver aquí — todo lo demás es trabajo creativo en tu hoja de cálculo. Crea tu repositorio Un repositorio es el espacio de tu proyecto en GitHub — almacena tus imágenes y archivos de configuración. Visita la plantilla de Telar Haz clic en el botón verde Use this template Selecciona Create a new repository Escoge un nombre para tu repositorio — usa solo letras minúsculas y evita espacios (los guiones están bien) — será parte de la dirección web de tu sitio Haz clic en Create repository Habilita GitHub Pages GitHub Pages convierte tu repositorio en un sitio web en vivo de forma gratuita. En tu repositorio, ve a Settings → Pages En Source , selecciona GitHub Actions Haz clic en Save Duplica la plantilla de Google Sheets Tu hoja de cálculo de Google Sheets es donde administras todo el contenido — objetos, historias y textos. Ve a https://bit.ly/telar-template Haz clic en File → Make a copy Guárdala en tu Google Drive con un nombre descriptivo (ej., \"Mi exposición Telar\") Publica tu hoja Tu hoja de cálculo necesita estar publicada para que Telar pueda leerla durante el build . Ve a File → Share → Publish to web Haz clic en Publish Copia la URL publicada Simplificado en v0.9.0. Las versiones anteriores requerían tanto una URL compartida como una URL publicada. Desde v0.9.0, solo se necesita la URL publicada. Si tu _config.yml todavía tiene una línea shared_url , se ignora sin problemas. Configura tu sitio Edita el archivo _config.yml en tu repositorio para conectar todo: Navega a _config.yml y haz clic en el ícono de lápiz para editar Configuración del sitio — completa el nombre y la descripción de tu sitio: title: \"Mi exposición\" description: \"Una narrativa visual sobre...\" author: Tu Nombre Dirección web — establece la URL de tu sitio: url: \"https://tuusuariogithub.github.io\" baseurl: \"/nombre-de-tu-repositorio\" Tu sitio estará disponible en https://tuusuariogithub.github.io/nombre-de-tu-repositorio . Es muy importante que tu baseurl coincida exactamente con el nombre de tu repositorio. Baseurl debe estar completamente en minúsculas, así que si le pusiste mayúsculas al nombre de tu repositorio, ve y cámbialo ahora. Google Sheets — pega la URL publicada que copiaste: google_sheets: enabled: true published_url: \"https://docs.google.com/...\" Tema (opcional) — escoge un tema visual: telar_theme: \"paisajes\" # Opciones: paisajes, neogranadina, santa-barbara, austin Haz clic en Commit changes para guardar Verifica tu configuración Después de hacer commit , GitHub Actions construirá y publicará tu sitio automáticamente. Esto toma de 2 a 5 minutos. Haz clic en la pestaña Actions para ver el progreso del build Cuando termine, visita tu sitio en la URL que configuraste Deberías ver un sitio vacío de Telar con tu título y tema Si el build falla o tu sitio no se ve bien, revisa tu _config.yml con cuidado. Errores comunes: Comillas sin cerrar — cada \" necesita su par Falta espacio después de los dos puntos — escribe title: \"Mi sitio\" , no title:\"Mi sitio\" Indentación incorrecta — las opciones anidadas como published_url deben indentarse con espacios, no tabulaciones baseurl no coincide — debe coincidir exactamente con el nombre de tu repositorio, todo en minúsculas URL de Google Sheets incorrecta — asegúrate de usar la URL publicada de Archivo → Compartir → Publicar en la Web Consulta la Referencia de configuración para la lista completa de opciones. También puedes pegar tu _config.yml en el Validador de Configuración de Telar para buscar errores, o usar el Generador y editor de configuración para crear uno desde cero. Próximos pasos Tu sitio está configurado y funcionando. Continúa con el tutorial de Primeros pasos: Agrega tu contenido — Sube imágenes, llena tu hoja de cálculo y crea tu primera historia Revisa y perfecciona — Ajusta coordenadas de imagen, revisa tu sitio y dale los toques finales Planea tu narrativa — Conoce cómo se articulan historias, pasos y paneles" + }, + "/docs/your-content/external-iiif/": { + "ids": [ + "adding-an-external-image", + "automatic-metadata-extraction", + "build-time-processing", + "external-iiif-images", + "finding-iiif-images", + "finding-multi-page-manifests", + "how-to-use-it", + "image-not-loading", + "language-detection", + "limitations", + "manifest-url-formats", + "metadata-not-appearing", + "mixing-self-hosted-and-external-images", + "multi-page-documents", + "object-pages", + "see-also", + "slow-loading", + "smart-credit-detection", + "stories", + "troubleshooting", + "validation", + "what-telar-looks-for", + "when-to-override", + "your-data-always-takes-priority" + ], + "selectors": { + "h1": [ + "External IIIF Images" + ], + "h2": [ + "Finding IIIF images", + "Adding an external image", + "Mixing self-hosted and external images", + "Multi-page documents", + "Automatic metadata extraction", + "Troubleshooting", + "See also" + ], + "h3": [ + "Manifest URL formats", + "Object pages", + "Stories", + "Finding multi-page manifests", + "How to use it", + "Your data always takes priority", + "Language detection", + "Smart credit detection", + "What Telar looks for", + "When to override", + "Build-time processing", + "Validation", + "Limitations", + "Image not loading", + "Metadata not appearing", + "Slow loading" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "https://example.org/iiif/image/abc123/info.json", + "object_id,title,...,source_url my-textile,My Textile,,, museum-map,Museum Map,...,https://example.org/iiif/manifest.json my-ceramic,My Ceramic,,,", + "object_id,title,source_url new-laws,Recopilación de leyes,https://example.org/iiif/presentation/3/new-laws/manifest.json", + "step,object,x,y,zoom,page,question,answer 1,new-laws,0.5,0.5,1,1,What is this document?,A key legal code of the colonial period. 2,new-laws,0.4,0.15,2.5,10,A key provision,This page details the legal framework governing colonial administration.", + "object_id,title,description,source_url,creator,period,location,credit map-001,,,https://example.org/iiif/manifest.json,,,,", + "object_id,title,description,source_url,creator,period,location,credit map-001,My Custom Title,,https://example.org/manifest.json,,,," + ], + "table": [ + "Field Looks for title Title, Label, Name description Description, Summary, Note creator Creator, Artist, Maker, Author period Date, Period, Creation Date, Date Created location Repository, Holding Institution, Current Location credit Attribution, Rights Holder, Credit Line, Provider" + ], + "blockquote": [ + "Finding coordinates for a specific page. Navigate to the object page for your multi-page document. Use the page navigation controls to go to the page you want. Then use the coordinate picker — it automatically includes the current page number in the copied values." + ], + "img": [] + }, + "text": "External IIIF Images Many museums, libraries, and archives make their collections available through a technology called IIIF (International Image Interoperability Framework). This means you can build Telar stories around high-resolution images from institutions worldwide — without downloading or hosting the images yourself. Finding IIIF images Look for IIIF resources at: IIIF Guide to Finding Resources Major museums (British Museum, Getty, Smithsonian, Rijksmuseum) Digital libraries (Internet Archive, Europeana, Gallica) University collections and special archives When an institution supports IIIF, you'll typically find a manifest URL — a link that describes the image and its metadata. It usually ends in info.json or manifest.json . Adding an external image In your objects spreadsheet (Google Sheet or objects.csv ): Create a row with a unique object_id (e.g., museum-textile-001 ) Add the IIIF manifest URL in the source_url column: https://example.org/iiif/image/abc123/info.json That's it. Telar will fetch the image directly from the institution's server when viewers visit your site. Manifest URL formats IIIF URLs typically look like: Image API : https://example.org/iiif/2/abc123/info.json Presentation API : https://example.org/iiif/2/abc123/manifest.json Telar supports both formats, and both IIIF versions (2.0 and 3.0). Mixing self-hosted and external images You can use both your own images and external IIIF images in the same project. Leave source_url blank for objects that use self-hosted images: object_id,title,...,source_url my-textile,My Textile,,, museum-map,Museum Map,...,https://example.org/iiif/manifest.json my-ceramic,My Ceramic,,, Multi-page documents Some IIIF manifests describe multi-page documents — digitized books, manuscripts, legal records, or maps with multiple sheets. These manifests contain multiple canvases, one per page. Telar handles multi-page manifests the same way as single-image manifests. Add the manifest URL to the source_url column in your objects spreadsheet: object_id,title,source_url new-laws,Recopilación de leyes,https://example.org/iiif/presentation/3/new-laws/manifest.json Object pages On object pages, the viewer shows the full document with page navigation controls — forward/back arrows and a page selector — so visitors can browse through all pages. Stories In stories, each step can reference a specific page using the page column: step,object,x,y,zoom,page,question,answer 1,new-laws,0.5,0.5,1,1,What is this document?,A key legal code of the colonial period. 2,new-laws,0.4,0.15,2.5,10,A key provision,This page details the legal framework governing colonial administration. The page column specifies which canvas (page) of the manifest to display. Page numbers start at 1. Finding coordinates for a specific page. Navigate to the object page for your multi-page document. Use the page navigation controls to go to the page you want. Then use the coordinate picker — it automatically includes the current page number in the copied values. Finding multi-page manifests Multi-page IIIF manifests are common at institutions that have digitized books and manuscripts: National libraries — Bibliothèque nationale de France (Gallica), British Library, Library of Congress University libraries — Many special collections departments publish IIIF manifests for their digitized holdings Digital repositories — Internet Archive provides IIIF manifests for its digitized books Archival platforms — Neogranadina's Zasqua platform hosts thousands of digitized historical documents from Latin American archives, all available through IIIF Look for a \"IIIF manifest\" link on the item's page, or check the institution's IIIF documentation. Automatic metadata extraction When you provide a source_url , Telar can automatically fill in metadata from the IIIF manifest — title, description, creator, period, location, and credit. This saves you from typing information that the institution has already recorded. How to use it Add the IIIF manifest URL to your spreadsheet and leave the metadata fields blank: object_id,title,description,source_url,creator,period,location,credit map-001,,,https://example.org/iiif/manifest.json,,,, When your site builds, Telar will: Fetch the IIIF manifest Extract available metadata Fill in any fields you left blank Keep any values you entered yourself Your data always takes priority You have full control over what gets extracted: Leave fields blank and Telar fills them from the manifest Fill in some fields and Telar only fills the rest Fill in everything and the manifest metadata is ignored Example — partial override: object_id,title,description,source_url,creator,period,location,credit map-001,My Custom Title,,https://example.org/manifest.json,,,, Telar will use \"My Custom Title\" (your value) and extract the description, creator, period, location, and credit from the manifest. Language detection Metadata extraction respects your site's language setting ( telar_language in _config.yml ): English sites ( en ) — Prioritizes English metadata, falls back to other languages Spanish sites ( es ) — Prioritizes Spanish metadata, then English, then others Smart credit detection For the credit field, Telar filters out legal boilerplate (Creative Commons URLs, generic rights statements) and looks for meaningful attribution lines — the institution name, the rights holder, or the credit line. What Telar looks for Different institutions label their metadata differently. Telar searches for common variations: Field Looks for title Title, Label, Name description Description, Summary, Note creator Creator, Artist, Maker, Author period Date, Period, Creation Date, Date Created location Repository, Holding Institution, Current Location credit Attribution, Rights Holder, Credit Line, Provider When to override You might want to enter your own values when: The manifest is in a language your audience won't understand The institution uses abbreviations or codes The description is too technical for your audience You want a shorter or simpler version of a field Build-time processing Metadata extraction happens automatically during the site build: GitHub Pages : Runs during deployment — no action needed Local development : Run python3 scripts/csv_to_json.py when you add or update manifest URLs Validation During the build, Telar checks each manifest: Valid manifest — Metadata extracted successfully Manifest unavailable — The URL didn't respond; will retry on the next build No metadata found — The manifest is valid but doesn't contain extractable fields Check your build logs for extraction status. Limitations Only works with external IIIF manifests (self-hosted images don't have manifests to extract from) Manifests must be publicly accessible (no login required) HTML tags are removed from extracted text Some manifests may not include metadata fields Troubleshooting Image not loading Verify the manifest URL is correct — try opening it directly in your browser Make sure the resource is publicly accessible (no authentication required) Check that you pasted the full URL including info.json or manifest.json Metadata not appearing Check your build logs for extraction warnings The manifest may not include the fields you expect Try entering the values manually in your spreadsheet Slow loading External images load from the institution's server — speed depends on their infrastructure Some institutions may throttle requests from unfamiliar sites See also Self-Hosted Images — Upload your own images instead of using external sources PDF Documents — Self-hosting multi-page PDF documents Objects — How to define objects in your spreadsheet Object Columns — Complete column reference for the objects spreadsheet" + }, + "/docs/the-compositor/video-audio/": { + "ids": [ + "audio", + "audio-objects", + "checking-a-clip", + "clip-range", + "genre-and-medium", + "loop-toggle", + "media-external-media-docs-the-compositor-video-audio", + "media-type-detection", + "see-also", + "supported-video-sources", + "video", + "video-and-audio" + ], + "selectors": { + "h1": [ + "Video and Audio" + ], + "h2": [ + "Media type detection", + "Supported video sources", + "Audio objects", + "Clip range", + "Loop toggle", + "Genre and medium", + "See also" + ], + "h3": [ + "Video", + "Audio", + "Checking a clip" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [ + "Google Drive videos cannot be clipped. In place of the clip times, the viewer shows Google Drive does not support clipping.", + "The Compositor sets the same clip_start and clip_end values described in Video Objects and Audio Objects. The two are interchangeable, so you can set a clip here and edit it later in your spreadsheet, or the other way round." + ], + "img": [ + [ + "/assets/manual/tutorials/en-external-media.jpg", + "The External media form recognising a Vimeo address and showing a title and object ID." + ] + ] + }, + "text": "Video and Audio The Compositor supports video and audio objects alongside images. When a story step references a video or audio object, the viewer column shows the appropriate media player — an embedded video player or a waveform audio player — and provides tools for setting clip times and loop behavior. For background on how video and audio objects work in Telar, see Video Objects and Audio Objects . Media type detection The Compositor detects the media type of each object automatically based on its source URL. You do not need to configure the type manually — the Compositor reads the URL and determines whether the object is an image, a video, or an audio file. Each step in the sidebar displays a media type badge to help you identify what kind of object it references: Video — A film icon for video objects Audio — A music icon for audio objects Text — A text icon for steps with no media object Supported video sources The Compositor recognizes video URLs from three platforms: YouTube — youtube.com/watch?v=... and youtu.be/... short links Vimeo — vimeo.com/123456789 Google Drive — drive.google.com/file/d/.../view (the video must be shared publicly or with \"Anyone with the link\") When a step references a video object, an inline video player appears in the viewer column with standard playback controls. External media recognises the host from its address. Add a useful title and check the object ID before adding it. Open full-size screenshot ↗ Audio objects Audio objects use self-hosted files stored in your repository at telar-content/objects/ . The Compositor supports MP3, OGG, and M4A formats. When a step references an audio object, the viewer column displays a WaveSurfer waveform player. The waveform provides a visual representation of the audio and includes play and pause controls. Clip range A clip is the segment of a video or audio file that plays during one step. You set it visually in the viewer rather than typing timestamps into a spreadsheet. Video A clip timeline sits in the bar below the video. It spans the whole file, showing the clip as a highlighted region, with a thin marker that follows playback. Select the step you want to configure Drag the start or end handle to move one edge of the clip, or drag the highlighted region itself to move the whole clip without changing its length Release the handle to save The times at either end of the bar are where the clip begins and ends, and between them the bar gives the clip's length as 0:07 clip . A brief Clip saved confirmation takes its place each time you change the range. Audio Audio has no separate timeline. The waveform carries the clip region directly — drag its handles to set the start and end. Checking a clip Below the player, the current clip reads as clip 0:05 → 0:12 , or No clip set when the step plays the whole file. Preview clip plays the clip on its own, so you can check exactly what a visitor will get without sitting through the rest of the file. Google Drive videos cannot be clipped. In place of the clip times, the viewer shows Google Drive does not support clipping . The Compositor sets the same clip_start and clip_end values described in Video Objects and Audio Objects . The two are interchangeable, so you can set a clip here and edit it later in your spreadsheet, or the other way round. Loop toggle Each step has a Loop switch that controls whether the clip repeats continuously when the audience reaches that step. When it is on, the clip plays in a loop until the audience advances to the next step. The loop setting persists when you save and applies to both video and audio steps. Genre and medium Objects have a type field that maps to the medium_genre column in objects.csv . The Compositor manages this field through the Objects metadata editor — you can set it when adding or editing an object. The genre or medium value helps the objects gallery organize items by type and provides additional context for your audience when browsing the exhibition. See also Story Editor — Building stories with the visual editor Publishing — Review and publish your changes Video Objects — How video objects work in Telar Audio Objects — How audio objects work in Telar Story Columns — Complete column reference including clip columns" + }, + "/guia/desarrolladores/": { + "ids": [ + "81-desarrollo-local", + "82-github-actions", + "83-arquitectura-del-contenido-de-demostración", + "84-arquitectura-del-sistema-de-inserción", + "85-estilos-avanzados", + "86-diseños-y-pantallas-pequeñas", + "87-vocabulario-del-motor-de-historias", + "contribuir-a-telar", + "enlaces-rápidos", + "obtener-ayuda", + "para-desarrolladores", + "para-quién-es-esta-sección", + "qué-hay-en-esta-sección" + ], + "selectors": { + "h1": [ + "Para desarrolladores" + ], + "h2": [ + "Para quién es esta sección", + "Qué hay en esta sección", + "Contribuir a Telar", + "Obtener ayuda", + "Enlaces rápidos" + ], + "h3": [ + "8.1 Desarrollo local", + "8.2 GitHub Actions", + "8.3 Arquitectura del contenido de demostración", + "8.4 Arquitectura del sistema de inserción", + "8.5 Estilos avanzados", + "8.6 Diseños y pantallas pequeñas", + "8.7 Vocabulario del motor de historias" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Para desarrolladores Documentación técnica para desarrolladores, colaboradores y quienes mantienen versiones fork de Telar. Para quién es esta sección Esta sección está diseñada para: Desarrolladores que construyen funcionalidades o arreglan errores en Telar Mantenedores de versiones fork de Telar para instituciones específicas Colaboradores que quieren entender la arquitectura de Telar Usuarios avanzados que resuelven problemas del build o personalizan Telar Si estás creando el contenido de un sitio de Telar, lo que probablemente necesitas son las secciones principales de la documentación. Qué hay en esta sección 8.1 Desarrollo local Configura tu entorno de desarrollo, construye el sitio en tu computador y prueba los cambios antes de publicarlos. 8.2 GitHub Actions Entiende cómo el flujo de trabajo Build and Deploy construye y publica el sitio, y cómo personalizarlo. 8.3 Arquitectura del contenido de demostración Aprende cómo funciona el sistema de obtención de contenido de demostración, desde el emparejamiento de versiones hasta la integración de paquetes. 8.4 Arquitectura del sistema de inserción Detalles técnicos del sistema de inserción iframe de Telar y cómo maneja diferentes contextos. 8.5 Estilos avanzados Personaliza los estilos de Telar con CSS propio, variables de CSS y capas de cascada. 8.6 Diseños y pantallas pequeñas Cómo escoge la página de una historia entre sus dos diseños y cómo se adapta el sitio a las ventanas pequeñas o bajas. 8.7 Vocabulario del motor de historias Los términos con que el código del motor de historias y esta documentación nombran las partes de una historia, sus movimientos y sus diseños. Contribuir a Telar Telar es código abierto y recibe contribuciones con gusto. Antes de contribuir: Configura desarrollo local (8.1) para probar tus cambios Entiende cómo se construye el sitio (8.2, 8.3) para ver de qué manera se procesa el contenido Sigue los patrones existentes en el código base Prueba exhaustivamente antes de enviar pull requests Repositorio : UCSB-AMPLab/telar Obtener ayuda Issues : Reporta errores o solicita funcionalidades en GitHub Issues Discussions : Haz preguntas en GitHub Discussions Email : Contacta a los mantenedores para problemas sensibles o alianzas institucionales Enlaces rápidos Documentación principal - Documentación para quienes crean contenido Referencia de configuración - Todas las opciones de _config.yml Referencia CSV: Proyecto - Documentación de columnas CSV" + }, + "/guia/tu-contenido/objetos/": { + "ids": [ + "definir-objetos", + "detección-del-tipo-de-medio", + "objetos", + "páginas-de-objetos", + "selector-de-coordenadas", + "véase-también" + ], + "selectors": { + "h1": [ + "Objetos" + ], + "h2": [ + "Definir objetos", + "Páginas de objetos", + "Véase también" + ], + "h3": [ + "Detección del tipo de medio", + "Selector de coordenadas" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "object_id,title textile-001,Fragmento de Textil Colonial map-lima,Mapa de Lima" + ], + "table": [], + "blockquote": [ + "El Compositor ofrece una interfaz visual para gestionar objetos — incluyendo obtención automática de manifiestos IIIF, carga de imágenes y edición de metadatos.", + "La columna medium (antes object_type) describe el género o medio del objeto — no el tipo de medio (Imagen, Video, Audio), que Telar detecta automáticamente. El nombre de columna object_type sigue funcionando por compatibilidad. En español, también se acepta medio_genero." + ], + "img": [ + [ + "/images/object-detail.png", + "Página de detalle de objeto con visor IIIF y metadatos" + ], + [ + "/images/coordinate-picker.png", + "Selector de coordenadas mostrando valores X, Y y Zoom debajo del visor de imágenes" + ] + ] + }, + "text": "Objetos Los objetos son los materiales en el centro de tu sitio Telar — imágenes, videos, grabaciones de audio, documentos y otros materiales que tus historias exploran. El Compositor ofrece una interfaz visual para gestionar objetos — incluyendo obtención automática de manifiestos IIIF, carga de imágenes y edición de metadatos. Definir objetos Cada objeto de tu sitio se define como una fila en tu hoja de cálculo de objetos — ya sea en la pestaña de objetos de tu Google Sheet, o en objects.csv (u objetos.csv ) en telar-content/spreadsheets/ . Como mínimo, cada objeto necesita un object_id y un title : object_id,title textile-001,Fragmento de Textil Colonial map-lima,Mapa de Lima object_id — Un identificador único (minúsculas, guiones, guiones bajos). Se convierte en la URL del objeto: /objects/textile-001/ title — El nombre visible alt_text — Texto alternativo para accesibilidad (opcional). Si se deja vacío, se usa el title del objeto. Detección del tipo de medio Telar determina automáticamente si un objeto es una imagen, un video o un archivo de audio según su fuente — no se necesita configuración adicional: Imagen — Un archivo autoalojado (JPG, PNG, etc.) en telar-content/objects/ , o un manifiesto IIIF externo en source_url Video — Una URL de YouTube, Vimeo o Google Drive en source_url Audio — Un archivo de audio autoalojado (MP3, OGG, M4A) en telar-content/objects/ Para las imágenes, tienes dos opciones: Autoalojadas : Pon los archivos de imagen en telar-content/objects/ con nombres que coincidan con el object_id . Telar genera las teselas ( tiles ) IIIF automáticamente. IIIF externas : Agrega una columna source_url con la URL de la imagen IIIF (info.json o manifiesto). Para videos y audio, consulta Objetos de video y Objetos de audio . Puedes agregar metadatos más detallados para cada objeto — descripción, creador, periodo, año, medium (el género o medio del objeto, p. ej. \"Fotografía\", \"Óleo\", \"Historia oral\"), dimensiones, fuente, crédito y más. Consulta la referencia de Columnas de objetos para la lista completa de columnas. La columna medium (antes object_type ) describe el género o medio del objeto — no el tipo de medio (Imagen, Video, Audio), que Telar detecta automáticamente. El nombre de columna object_type sigue funcionando por compatibilidad. En español, también se acepta medio_genero . Páginas de objetos Cada objeto tiene su propia página en /objects/{object_id}/ . La página muestra: Un visor — un visor IIIF con zoom profundo para imágenes, un reproductor integrado para videos o un reproductor de audio para archivos de audio Una tabla de metadatos con todos los campos disponibles (creador, periodo, medio, dimensiones, fuente, crédito) Un selector de coordenadas (imágenes) o selector de tiempo de clip (videos y audio) para capturar valores que se usan en los pasos de las historias Las historias relacionadas que hacen referencia al objeto Una sección de descripción , si proporcionaste una en la hoja de cálculo Selector de coordenadas El selector de coordenadas es una herramienta de desarrollo en cada página de objeto. Haz clic o aplica zoom en la imagen y luego lee las coordenadas normalizadas (rango de 0 a 1) que aparecen debajo del visor. Usa los botones Copy para copiar las coordenadas directamente en el CSV de tu historia. Véase también Galería de objetos — Explora, busca y filtra tu colección Columnas de objetos — Referencia completa de columnas para objects.csv Imágenes autoalojadas — Sube y procesa tus propias imágenes Imágenes IIIF externas — Usa imágenes de museos y bibliotecas Objetos de video — Agregar videos de YouTube, Vimeo y Google Drive Objetos de audio — Agregar archivos de audio autoalojados Historias y paneles — Cómo se usan los objetos en las historias" + }, + "/docs/configure/config-validator/": { + "ids": [ + "config-validator", + "cv-input", + "cv-lines", + "cv-results", + "cv-validate", + "see-also", + "what-this-checks" + ], + "selectors": { + "h1": [ + "Config Validator" + ], + "h2": [ + "What this checks", + "See also" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Config Validator Paste your Telar _config.yml below to check for common configuration errors. The validator checks YAML syntax, required fields, and Telar-specific settings. Your configuration is never sent to any server — everything runs in your browser. 1 Validate What this checks YAML syntax — Catches parse errors, tab characters, and unclosed quotes, with line numbers Required fields — Ensures title , url , and baseurl are present and properly formatted Telar settings — Validates theme names, language codes, Google Sheets URLs, and baseurl formatting Helpful warnings — Notes about default settings, common GitHub Pages pitfalls, and the read-only section See also Configuration Reference — Full list of all _config.yml settings Config Generator and Editor — Generate or edit a _config.yml file Getting Started — Choose your setup method" + }, + "/guia/el-compositor/video-y-audio/": { + "ids": [ + "audio", + "comprobar-el-clip", + "control-de-bucle", + "detección-del-tipo-de-medio", + "fuentes-de-video-compatibles", + "género-y-medio", + "media-external-media-guia-el-compositor-video-y-audio", + "objetos-de-audio", + "recortar-el-clip", + "video", + "video-y-audio", + "véase-también" + ], + "selectors": { + "h1": [ + "Video y audio" + ], + "h2": [ + "Detección del tipo de medio", + "Fuentes de video compatibles", + "Objetos de audio", + "Recortar el clip", + "Control de bucle", + "Género y medio", + "Véase también" + ], + "h3": [ + "Video", + "Audio", + "Comprobar el clip" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [ + "Los videos de Google Drive no se pueden recortar. En lugar de los tiempos del clip, el visor muestra Google Drive no admite recorte de clips.", + "El Compositor fija los mismos valores clip_start y clip_end que describen Objetos de video y Objetos de audio. Son intercambiables: puedes definir el clip aquí y editarlo después en la hoja de cálculo, o al revés." + ], + "img": [ + [ + "/assets/manual/tutorials/es-external-media.jpg", + "El formulario Medio externo reconoce una dirección de Vimeo y muestra título e ID." + ] + ] + }, + "text": "Video y audio El Compositor admite objetos de video y audio junto con imágenes. Cuando un paso de la historia hace referencia a un objeto de video o audio, la columna del visor muestra el reproductor de medios correspondiente — un reproductor de video insertado o un reproductor de audio con forma de onda — y ofrece herramientas para fijar los tiempos del clip y el comportamiento de bucle. Para más información sobre cómo funcionan los objetos de video y audio en Telar, consulta Objetos de video y Objetos de audio . Detección del tipo de medio El Compositor detecta el tipo de medio de cada objeto automáticamente a partir de su URL de origen. No necesitas configurar el tipo manualmente — el Compositor lee la URL y determina si el objeto es una imagen, un video o un archivo de audio. Cada paso en la barra lateral muestra una insignia de tipo de medio para ayudarte a identificar qué clase de objeto referencia: Video — Un ícono de película para objetos de video Audio — Un ícono de música para objetos de audio Texto — Un ícono de texto para pasos sin objeto de medio Fuentes de video compatibles El Compositor reconoce URLs de video de tres plataformas: YouTube — youtube.com/watch?v=... y enlaces cortos youtu.be/... Vimeo — vimeo.com/123456789 Google Drive — drive.google.com/file/d/.../view (el video debe estar compartido públicamente o con \"Cualquier persona con el enlace\") Cuando un paso hace referencia a un objeto de video, un reproductor de video en línea aparece en la columna del visor con controles de reproducción estándar. Medio externo reconoce el proveedor por la dirección. Agrega un título útil y revisa el ID antes de incorporarlo. Ampliar captura ↗ Objetos de audio Los objetos de audio utilizan archivos autoalojados almacenados en tu repositorio en telar-content/objects/ . El Compositor admite formatos MP3, OGG y M4A. Cuando un paso hace referencia a un objeto de audio, la columna del visor muestra un reproductor de forma de onda WaveSurfer. La forma de onda ofrece una representación visual del audio e incluye controles de reproducción y pausa. Recortar el clip Un clip es el segmento de un archivo de video o de audio que se reproduce durante un paso. Lo defines arrastrando en el visor, en vez de escribir marcas de tiempo en una hoja de cálculo. Video Debajo del video hay una línea de tiempo que abarca el archivo completo: el clip aparece como una franja resaltada y una marca fina indica por dónde va la reproducción. Selecciona el paso que quieres configurar Arrastra el extremo inicial o el final de la franja para mover ese borde del clip, o arrastra la franja entera para desplazar el clip sin cambiarle la duración Suelta para guardar Los tiempos de los dos extremos de la barra son el comienzo y el final del clip, y en el medio se lee su duración: Clip de 0:07 . Cada vez que cambias el rango, esa duración da paso por un momento a la confirmación Clip guardado . Audio El audio no tiene una línea de tiempo aparte: la región del clip va sobre la onda misma. Arrastra sus extremos para fijar el comienzo y el final. Comprobar el clip Debajo del reproductor, el clip vigente se lee Clip 0:05 → 0:12 . Si el paso reproduce el archivo completo, ahí dice Sin clip definido . Previsualizar fragmento reproduce el clip solo, para que veas exactamente lo que le va a llegar al público sin tener que aguantar el resto del archivo. Los videos de Google Drive no se pueden recortar. En lugar de los tiempos del clip, el visor muestra Google Drive no admite recorte de clips . El Compositor fija los mismos valores clip_start y clip_end que describen Objetos de video y Objetos de audio . Son intercambiables: puedes definir el clip aquí y editarlo después en la hoja de cálculo, o al revés. Control de bucle Cada paso tiene un interruptor Repetir que determina si el clip se repite continuamente cuando el público llega a ese paso. Cuando está activado, el clip se reproduce en bucle hasta que el público avanza al siguiente paso. La configuración de bucle se conserva al guardar y se aplica tanto a pasos de video como de audio. Género y medio Los objetos tienen un campo de tipo que se corresponde con la columna medium_genre en objects.csv . El Compositor gestiona este campo a través del editor de metadatos de Objetos — puedes configurarlo al agregar o editar un objeto. El valor de género o medio ayuda a la galería de objetos a organizar los elementos por tipo y proporciona contexto adicional para el público al explorar la exhibición. Véase también Editor de historias — Construir historias con el editor visual Publicación — Revisar y publicar cambios Objetos de video — Cómo funcionan los objetos de video en Telar Objetos de audio — Cómo funcionan los objetos de audio en Telar Columnas de historias — Referencia completa de columnas incluyendo columnas de clip" + }, + "/docs/your-content/pdf-documents/": { + "ids": [ + "adding-a-pdf", + "build-errors", + "how-it-works", + "linking-to-a-page", + "object-pages-vs-stories", + "pdf-documents", + "pdf-not-loading", + "see-also", + "size-considerations", + "supported-pdf-types", + "the-page-column", + "troubleshooting", + "using-pdfs-in-stories", + "wrong-page-displayed-in-story" + ], + "selectors": { + "h1": [ + "PDF Documents" + ], + "h2": [ + "Adding a PDF", + "How it works", + "Object pages vs. stories", + "Linking to a page", + "Using PDFs in stories", + "Supported PDF types", + "Size considerations", + "Troubleshooting", + "See also" + ], + "h3": [ + "The page column", + "PDF not loading", + "Wrong page displayed in story", + "Build errors" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "python3 scripts/generate_iiif.py --base-url http://localhost:4001", + "/objects/new-laws/?page=3", + "step,object,x,y,zoom,page,question,answer 1,new-laws,0.5,0.5,1,1,What is this document?,The Recopilación de leyes de los reynos de las Indias codified Spanish colonial law. 2,new-laws,0.4,0.15,2.5,10,A key provision,This page details the legal framework governing colonial administration. 3,textile-001,0.5,0.3,0.8,,What is this textile?,A colonial fragment showing complex weaving patterns." + ], + "table": [], + "blockquote": [ + "Telar renders every page of the PDF as a high-resolution image during the build process. A 40-page PDF will produce 40 separate page images, each with its own set of zoom tiles. Build times increase with page count.", + "Finding coordinates for a specific page. Navigate to the object page for your PDF (/objects/new-laws/). Use the page navigation controls to go to the page you want. Then use the coordinate picker — it automatically includes the current page number in the copied values.", + "PDF rendering quality depends on the source document. Scanned pages at 300 DPI or higher produce the best deep-zoom results. Low-resolution scans may appear blurry when zoomed in.", + "If your site is hosted on GitHub Pages (the default for most Telar sites), keep in mind that GitHub does not allow individual files larger than 100 MB, and recommends keeping the total repository size under 1 GB. A large PDF plus all the zoom tiles it generates can add up quickly.", + "For very large documents (100+ pages), check whether a library or archive already hosts a digitized version with a IIIF manifest. If so, you can use the manifest URL in your source_url column instead of self-hosting the PDF. See External IIIF Images for how to find and use these manifests." + ], + "img": [] + }, + "text": "PDF Documents Telar can display multi-page PDF documents — books, legal records, manuscripts, maps — as zoomable, high-resolution objects. Each page of a PDF becomes a deep-zoom image, just like a photograph or scan. This means you can build stories that zoom into specific pages and regions of a document, guiding your audience through details that might otherwise go unnoticed. Adding a PDF Adding a PDF works the same way as adding an image. Place the file in telar-content/objects/ with a filename matching the object_id in your spreadsheet. For example, if your spreadsheet has an object with object_id = new-laws , name your file new-laws.pdf . From the GitHub web interface: Navigate to telar-content/objects/ in your repository Click Add file > Upload files Upload your PDF file Make sure the filename (without .pdf ) matches your object_id Commit changes For local development: Place your PDF in telar-content/objects/ Generate the IIIF tiles: python3 scripts/generate_iiif.py --base-url http://localhost:4001 Telar renders every page of the PDF as a high-resolution image during the build process. A 40-page PDF will produce 40 separate page images, each with its own set of zoom tiles. Build times increase with page count. How it works When you add a PDF and build your site: Telar renders each page as a high-resolution JPEG image using PyMuPDF Each page image is tiled at multiple zoom levels (just like a photograph) A IIIF manifest is generated for each individual page, plus a multi-page manifest for the full document On object pages, the viewer shows the full document with page navigation In stories, each step can reference a specific page Object pages vs. stories PDFs behave differently depending on the context: Object pages ( /objects/new-laws/ ) show the full document. The viewer includes page navigation controls — forward/back arrows and a page selector — so visitors can browse through all pages. Stories show one page at a time. Each story step specifies which page to display using the page column in your spreadsheet. The viewer zooms to the coordinates you set for that page, just like it does for a photograph. Linking to a page To send someone straight to a particular page of a document, open the object page, go to that page with the page navigation controls, and copy the address from your browser's address bar. It ends in ?page= and the page number: /objects/new-laws/?page=3 That address opens the object page at that page. Page numbers start at 1, as in the page column. As a visitor turns pages, the address in the browser changes to show the page on screen, so they can copy it and share it too. If the number is larger than the number of pages, the last page opens. If the value isn't a whole number, page 1 opens. This works the same way for any multi-page object, including one from a multi-page IIIF manifest. You can use this address in any link on your site, for example in a glossary entry or a panel. Using PDFs in stories To reference a specific page of a PDF in a story step, add a page column to your story spreadsheet. The value is the page number (starting from 1). step,object,x,y,zoom,page,question,answer 1,new-laws,0.5,0.5,1,1,What is this document?,The Recopilación de leyes de los reynos de las Indias codified Spanish colonial law. 2,new-laws,0.4,0.15,2.5,10,A key provision,This page details the legal framework governing colonial administration. 3,textile-001,0.5,0.3,0.8,,What is this textile?,A colonial fragment showing complex weaving patterns. Steps 1 and 2 reference pages 1 and 10 of the new-laws PDF Step 3 references a regular image ( textile-001 ) with no page value — the column is left empty for single-image objects Finding coordinates for a specific page. Navigate to the object page for your PDF ( /objects/new-laws/ ). Use the page navigation controls to go to the page you want. Then use the coordinate picker — it automatically includes the current page number in the copied values. The page column Page numbers start at 1 (page 1 is the first page of the PDF) Must be a positive integer — decimal or negative values produce a warning Leave empty for single-image objects — Telar ignores empty page values Bilingual column names : page (English) or pagina / página (Spanish) Supported PDF types Telar renders PDFs using PyMuPDF, which handles most standard PDF files: Scanned documents — Photographed or scanned pages (the most common type in historical research) Native PDFs — Documents with embedded text and vector graphics Mixed PDFs — Documents combining scanned images and native text PDF rendering quality depends on the source document. Scanned pages at 300 DPI or higher produce the best deep-zoom results. Low-resolution scans may appear blurry when zoomed in. Size considerations PDFs produce more data than single images because every page generates its own tile pyramid: A 10-page PDF produces roughly 10x the tiles of a single image A 100-page document can add significant build time and repository size Consider using only the pages you need rather than including the entire document If your site is hosted on GitHub Pages (the default for most Telar sites), keep in mind that GitHub does not allow individual files larger than 100 MB, and recommends keeping the total repository size under 1 GB. A large PDF plus all the zoom tiles it generates can add up quickly. For very large documents (100+ pages), check whether a library or archive already hosts a digitized version with a IIIF manifest. If so, you can use the manifest URL in your source_url column instead of self-hosting the PDF. See External IIIF Images for how to find and use these manifests. Troubleshooting PDF not loading Check that the file exists in telar-content/objects/ Make sure the filename (without .pdf ) matches the object_id in your spreadsheet Verify the object has a blank source_url column Make sure IIIF tiles have been generated (check that iiif/objects/{object-id}/ exists) Wrong page displayed in story Check the page value in your story spreadsheet — it should be a positive integer Page numbers start at 1, not 0 Use the coordinate picker on the object page to verify the correct page number Build errors Make sure PyMuPDF is installed ( pip install pymupdf ) If PyMuPDF is not available, Telar skips PDF files with an info message — other objects still process normally See also Self-Hosted Images — Adding photographs and scans Objects — Defining objects in your spreadsheet Stories & Panels — Building story steps Story Columns — Complete column reference including the page column External IIIF Images — Using IIIF manifests from libraries and archives" + }, + "/docs/setup/upgrading/": { + "ids": [ + "after-upgrading", + "automated-upgrades-v034", + "how-it-works", + "issue-not-created", + "manual-setup-for-earlier-versions", + "merge-conflicts", + "method-a-github-web-interface-recommended", + "method-a-github-web-interface-recommended-1", + "method-b-desktoplocal-development", + "method-b-desktoplocal-development-1", + "need-help", + "overview", + "running-an-automated-upgrade", + "step-1-add-the-upgrade-workflow-file", + "step-2-replace-the-build-workflow-file", + "step-3-run-your-first-automated-upgrade", + "troubleshooting", + "upgrade-fails-with-error", + "upgrade-workflow-not-appearing", + "upgrading-telar", + "v070-upgrade-notes", + "v100-beta-upgrade-notes", + "v110-upgrade-notes", + "v120-upgrade-notes", + "v121-upgrade-notes", + "v130-upgrade-notes", + "v140-upgrade-notes", + "v150-upgrade-notes", + "v160-upgrade-notes", + "v170-upgrade-notes", + "v180-upgrade-notes", + "v181-upgrade-notes", + "v182-upgrade-notes", + "v183-upgrade-notes", + "version-history" + ], + "selectors": { + "h1": [ + "Upgrading Telar" + ], + "h2": [ + "Overview", + "Automated Upgrades (v0.3.4+)", + "Manual Setup for Earlier Versions", + "Troubleshooting", + "Version History", + "Need Help?" + ], + "h3": [ + "How It Works", + "Running an Automated Upgrade", + "After Upgrading", + "v1.8.3 Upgrade Notes", + "v1.8.2 Upgrade Notes", + "v1.8.1 Upgrade Notes", + "v1.8.0 Upgrade Notes", + "v1.7.0 Upgrade Notes", + "v1.6.0 Upgrade Notes", + "v1.5.0 Upgrade Notes", + "v1.4.0 Upgrade Notes", + "v1.3.0 Upgrade Notes", + "v1.2.1 Upgrade Notes", + "v1.2.0 Upgrade Notes", + "v1.1.0 Upgrade Notes", + "v1.0.0-beta Upgrade Notes", + "v0.7.0 Upgrade Notes", + "Step 1: Add the Upgrade Workflow File", + "Step 2: Replace the Build Workflow File", + "Step 3: Run Your First Automated Upgrade", + "Upgrade Workflow Not Appearing", + "Upgrade Fails with Error", + "Issue Not Created", + "Merge Conflicts" + ], + "h4": [ + "Method A: GitHub Web Interface (Recommended)", + "Method B: Desktop/Local Development", + "Method A: GitHub Web Interface (Recommended)", + "Method B: Desktop/Local Development" + ], + "h5": [], + "h6": [], + "pre": [ + "curl -o .github/workflows/upgrade.yml https://raw.githubusercontent.com/UCSB-AMPLab/telar/main/.github/workflows/upgrade.yml", + "git add .github/workflows/upgrade.yml git commit -m \"Add automated upgrade workflow\" git push", + "curl -o .github/workflows/build.yml https://raw.githubusercontent.com/UCSB-AMPLab/telar/main/.github/workflows/build.yml", + "git add .github/workflows/build.yml git commit -m \"Update build workflow to v0.3.4\" git push" + ], + "table": [], + "blockquote": [ + "Using the Telar Compositor? If you manage your site through the Telar Compositor, you can upgrade with one click from its Upgrade screen — the manual steps below aren't needed. If it asks you to approve updated GitHub permissions first, accept them and retry. The instructions below are for upgrading directly on GitHub instead.", + "Forked repositories only: If you forked your site from another repository, you'll need to enable issues in your repository settings (Settings → General → check Issues). Sites created using the \"Use this template\" button already have issues enabled.", + "Safe and Reversible The upgrade creates an issue and branch, giving you full control. Review the changes via the compare link, create a PR when ready, and merge only after verification.", + "If you skip this step and mark a story private: yes, your build will fail at the \"Convert CSVs to JSON\" step with an error telling you the workflow doesn't run the encryption script. This is intentional — without the new step, your site would otherwise publish the \"private\" story as plaintext. If your site has no private stories, nothing breaks if you skip this step — but you won't be able to add one later without applying this update first.", + "If you update build.yml, also add package-lock.json. The new build.yml installs Node dependencies with npm ci, which requires a committed package-lock.json. Copy it from the Telar repository (open package-lock.json, click Copy raw contents) into your repository's root, or the build will fail. New sites created from the template already include it.", + "That's it! The workflow automatically downloads the latest upgrade scripts from the Telar repository each time it runs, so you don't need to copy any Python files manually.", + "Optional Step: If you skip this step now, the upgrade summary will include instructions to update build.yml manually after your first upgrade. However, doing it now ensures a smoother upgrade experience." + ], + "img": [] + }, + "text": "Upgrading Telar Keep your Telar site up to date with the latest features, bug fixes, and improvements. Using the Telar Compositor? If you manage your site through the Telar Compositor , you can upgrade with one click from its Upgrade screen — the manual steps below aren't needed. If it asks you to approve updated GitHub permissions first, accept them and retry. The instructions below are for upgrading directly on GitHub instead. Overview Telar v0.3.4 introduced an automated upgrade system that makes updating your site simple and safe. The upgrade process depends on which version you're currently running: v0.3.4 or later : Use the automated upgrade workflow (one-click upgrades) v0.2.0 to v0.3.3 : Manual setup required first (one-time only) Automated Upgrades (v0.3.4+) If your site is already running Telar v0.3.4 or later, upgrading is fully automated. How It Works The upgrade system: Detects your current Telar version from _config.yml Applies all necessary migrations incrementally (e.g., v0.3.4 → v0.3.5 → v0.3.6) Updates framework files and configurations Creates an upgrade branch and issue with detailed summary Highlights any manual steps you need to complete Running an Automated Upgrade Forked repositories only : If you forked your site from another repository, you'll need to enable issues in your repository settings ( Settings → General → check Issues ). Sites created using the \"Use this template\" button already have issues enabled. Go to your repository on GitHub Click the Actions tab Select the \"Upgrade Telar\" workflow from the left sidebar Click Run workflow (green button on the right) Click the green Run workflow button in the dropdown Wait for the workflow to complete (usually 1-2 minutes) Review the automatically created upgrade issue Click the link in the issue to create a pull request Review changes and merge the pull request to complete the upgrade Safe and Reversible The upgrade creates an issue and branch, giving you full control. Review the changes via the compare link, create a PR when ready, and merge only after verification. After Upgrading Visit your site to verify it's working correctly Check the upgrade issue for any manual steps (visible in the \"After Merging\" section) If you have custom themes or modifications, test them thoroughly Close the upgrade issue once everything is working - this marks the upgrade as complete If you encounter issues, check the GitHub Issues or report a bug v1.8.3 Upgrade Notes Upgrade with the \"Upgrade Telar\" workflow or through the Telar Compositor. It takes a site from v1.8.2 to v1.8.3, and chains through from earlier versions. No manual steps: only the Telar files that changed are installed, and your site's content and settings are left as they are. The upgrade installs a Gemfile.lock that includes the x86_64-linux platform. If your site's build has been failing on GitHub's Ubuntu 26.04 runners while installing google-protobuf , the first build after the upgrade installs prebuilt gems and succeeds. v1.8.2 Upgrade Notes Upgrade with the \"Upgrade Telar\" workflow or through the Telar Compositor. It takes a site from v1.8.1 to v1.8.2, and chains through from earlier versions. The upgrade corrects two parts of your glossary spreadsheet, unless you have changed them: the instruction rows at the top now name /telar-content/texts/glossary/ , and the \"Telar\" entry keeps only your site's language. If your site reads its content from Google Sheets, the upgrade asks you to make the same change to the \"Telar\" entry in your sheet, since the next build reads the sheet again. On sites that upgrade with scripts/upgrade.py , the upgrade also deletes the old copies of the upgrade scripts ( scripts/telar_upgrade.py and three helper files), unless you have changed them. If you upgrade with the workflow or from your own computer, you can delete .github/workflows/telar-tests.yml . It runs Telar's own tests, which are always skipped on your site. An upgrade through the Compositor deletes it for you. v1.8.1 Upgrade Notes Upgrade with the \"Upgrade Telar\" workflow or through the Telar Compositor. It takes a site from v1.8.0 to v1.8.1, and chains through from earlier versions. No manual steps: only the Telar files that changed are installed, and your site's content and settings are left as they are. The upgrade does not add the new hide_warnings setting to _config.yml , so your site keeps showing warnings as before. To hide them, add hide_warnings: true to the development-features block. v1.8.0 Upgrade Notes Upgrade with the \"Upgrade Telar\" workflow. It takes a site from v1.7.0 to v1.8.0, and chains through from earlier versions. Before your first build, the upgrade repairs a sheet whose duplicate columns would now stop the build (one column holds the values, the others are empty) and lists the answers the build will shorten. If you keep your stories in a spreadsheet, check the column that marks a story private. If it used privado or protegido , treat those stories as having been public until now: the next build encrypts them, but it cannot undo what was already published. Recopy .github/workflows/build.yml by hand from the template, unless you upgrade through the Telar Compositor, which updates it for you. GitHub does not let the upgrade workflow change workflow files, and without the new one the image and audio fixes in v1.8.0 do not reach your site, and its builds stay on the old Python and dependencies. Recopying upgrade.yml is optional, and telar-tests.yml , which runs Telar's own tests, can be recopied or deleted together with tests/ , pytest.ini and vitest.config.js . If your site reads a Google Sheet , delete from the sheet any column the upgrade summary names: the upgrade fixed your local copy, but the build reads the sheet again. v1.7.0 Upgrade Notes Upgrading on GitHub is unchanged. If you use the Upgrade Telar workflow, run it as usual — there is nothing new to do. If you upgrade from your own computer, this release changes how that works. Until now, scripts/upgrade.py in your site did the upgrading itself. That copy only knows the releases that existed when that copy was installed, so a site set up at v1.4.0 asks its own tooling, is told v1.4.0 is current, and quietly stays three releases behind. From v1.7.0, scripts/upgrade.py asks GitHub which release is newest, downloads that release's upgrade tooling, checks that its checksum matches the one published with it, and runs that. Your site then keeps itself current from then on. It needs an internet connection. Upgrading has always needed one to fetch framework files. Now the connection is needed before anything starts, to fetch the tooling itself. Without one the upgrade stops and says so, rather than finishing as though everything had worked. Local-only sites need one manual step, once. If your site has never run the Upgrade Telar workflow on GitHub, its scripts/upgrade.py is still the older kind and will tell you the site is already up to date. It cannot see v1.7.0, because it only knows the releases that existed when that copy was installed. Do either of these once: Run the Upgrade Telar workflow on GitHub ( Actions → Upgrade Telar → Run workflow ). This upgrades the site and installs the new launcher. Or do it by hand : from the v1.7.0 release page download telar-scripts-v1.7.0.tar.gz , extract it, and from your site's folder run python3 /path/where/you/extracted/scripts/telar_upgrade.py . After either, your site's scripts/upgrade.py is the new launcher and no manual step is needed again. v1.6.0 Upgrade Notes v1.6.0 changes how private stories are built. Existing stories, objects, and general configuration continue to work unchanged — but if your site has any story marked private: yes (or protected: yes ), you must update your build workflow by hand, or your build will fail. What's included: private stories now render through the same templates as open stories during the Jekyll build — markdown, glossary links, LaTeX, audio clips, and alt text all work once a viewer unlocks a private story, the same as on an open one. Encryption itself now happens as a separate step after the build finishes, rather than during it. The build refuses to publish a private story as plaintext: it fails early if a private story exists without a story_key , and it fails again after the build if anything is misconfigured so that the workflow doesn't run the new encryption step. Required manual step — update your GitHub Actions build workflow: For security, GitHub does not allow the automated upgrade to modify workflow files. If your site has (or might ever have) a private story, you must add the new encryption step to .github/workflows/build.yml yourself: Open build.yml on GitHub Click Copy raw contents In your repository, navigate to .github/workflows/build.yml and click Edit Select all and replace with the copied contents Commit the change If you skip this step and mark a story private: yes , your build will fail at the \"Convert CSVs to JSON\" step with an error telling you the workflow doesn't run the encryption script. This is intentional — without the new step, your site would otherwise publish the \"private\" story as plaintext. If your site has no private stories, nothing breaks if you skip this step — but you won't be able to add one later without applying this update first. Testing locally: neither bundle exec jekyll serve nor scripts/build_local_site.py 's default serve mode encrypts anything — private stories preview as plaintext under both. To test the locked behavior, run python3 scripts/build_local_site.py --build-only and serve the resulting _site/ with a static file server. See Private Stories: Testing Locally . If you only use GitHub's web interface: The automated upgrade handles all other framework file replacements. If you have (or plan to add) any private story, you must still copy the updated build.yml as described above — this one is not optional. v1.5.0 Upgrade Notes v1.5.0 is a robustness and security release. It is runtime and tooling only — existing stories, objects, and configuration continue to work unchanged, with no CSV edits and no config changes. The automated upgrade handles all framework file replacements; two optional manual steps are described below. What's included: author content is now escaped at every render point; TLS certificate verification is enforced on all Google Sheets and IIIF fetches; protected stories are hardened (the build stops rather than ship unencrypted, stronger key derivation, and no byline, description, or SEO leak); the upgrade workflow runs checksum-verified tooling in isolation; and all remote reads are capped with path-traversal guards. WaveSurfer is vendored so audio works offline, framework files install atomically, and several viewer, video, audio, and story-ordering bugs are fixed. None of this needs any action from you — see the CHANGELOG for the full list. Recommended — update your GitHub Actions workflow files: For security, GitHub does not allow the automated upgrade to modify workflow files, so two v1.5.0 hardening improvements are not applied for you: .github/workflows/upgrade.yml — the upgrade process now downloads its tooling as a checksum-verified release asset and runs it in isolation. .github/workflows/build.yml — the ruby/setup-ruby action is pinned to a specific commit for supply-chain safety, and the build now installs Node dependencies with npm ci . To apply them, use the copy-from-Raw steps in the \"Manual Setup for Earlier Versions\" section below, once for each file. If you skip this, your site keeps building and deploying normally — these changes only harden your workflows. If you update build.yml , also add package-lock.json . The new build.yml installs Node dependencies with npm ci , which requires a committed package-lock.json . Copy it from the Telar repository (open package-lock.json , click Copy raw contents ) into your repository's root, or the build will fail. New sites created from the template already include it. Language pack — new protected-story sharing keys: This release adds keys to the built-in language files ( en.yml and es.yml ) for the protected-story sharing warnings — the messages shown when a share link or embed code includes the access key. If you have a customized language file, re-apply your changes after upgrading by copying the new keys from the updated _data/languages/en.yml (or es.yml ) in the Telar repository. If you only use GitHub's web interface: The automated upgrade handles all framework file replacements. The workflow updates above are optional hardening; if you apply the build.yml update, remember the package-lock.json note. v1.4.0 Upgrade Notes v1.4.0 is a runtime-only upgrade. Existing stories, objects, and configuration continue to work unchanged — no CSV edits, no config changes, and no workflow updates are required. Viewer change — Tify replaced by OpenSeadragon: The IIIF image viewer has changed from Tify (loaded from a CDN) to a custom OpenSeadragon wrapper (vendored locally). For most sites this is invisible: IIIF images continue to display and zoom. If your site has a customized _sass/_viewer.scss that overrode Tify styles, those overrides are now inert and can be removed, but they will not break the build. Language pack — six new object.viewer.* keys: Six new keys are added to the built-in language files ( en.yml and es.yml ): object.viewer.prev_page , object.viewer.next_page , object.viewer.page_input_label , object.viewer.page_input_aria , object.viewer.image_unavailable_title , and object.viewer.image_unavailable_detail . These drive the multi-page pagination chrome and the error fallback UI in the new viewer. If you have a customized language file (a copy of en.yml or es.yml with your own translations), you will need to add these six keys manually after upgrading, or the viewer pagination and error messages will fall back to the built-in English strings. On versions before v1.8.0 the four pagination labels fell back to nothing at all and the controls were left unlabelled, so on those versions adding the keys is the only way to label them. Copy the values from the updated _data/languages/en.yml (or es.yml ) in the Telar repository and translate as needed. If you only use GitHub's web interface: No manual steps are required. The upgrade handles all file replacements automatically. v1.3.0 Upgrade Notes v1.3.0 fixes i18n coverage across the site and introduces a sister-file convention for localizing user pages. No CSV changes are required. Automated content migration — hash-gated page rewrites: The upgrade migration rewrites four user-content files ( index.md , pages/glossary.md , pages/objects.md , telar-content/texts/pages/about.md ) to use the new lang-key templates — but only if each file is byte-for-byte identical to the v1.2.1 default. Any customized content is preserved untouched. For Spanish-language sites whose about.md is unchanged from the v1.2.1 default, the migration also creates telar-content/texts/pages/acerca.md automatically. New language keys — lang.index_page.welcome and lang.pages.glossary_intro : Two new keys are added to the built-in language files. If you have a customized language file, you do not need to add them immediately: from v1.8.0, a page whose key is missing falls back to the English text included by default. Before v1.8.0 the text was simply absent, so on those versions add the keys. Adding them gives you the homepage welcome text and the glossary intro sentence in the site's active language. If you only use GitHub's web interface: No manual steps are required beyond reviewing the automatically created upgrade issue for any files flagged as not matching the default (meaning your customizations were detected and preserved). v1.2.1 Upgrade Notes v1.2.1 is a patch release. No manual steps are required. The upgrade fixes a silent failure in the demo content fetch script that affected sites whose _config.yml carried a v-prefixed version string (e.g. version: \"v1.2.0\" ). If your site showed no demo content after a previous upgrade, this patch resolves it. No config edits are needed; the fix is in the build script. v1.2.0 Upgrade Notes v1.2.0 adds a section table of contents, a Back to Start button, and in-story navigation. No manual steps are required. All new features activate automatically. The section TOC is opt-in per story: add show_sections: yes to a story's row in project.csv (or mostrar_secciones: si for Spanish-language sites) to display it. Sites without this column continue to work without any CSV changes. If you only use GitHub's web interface: No action required. v1.1.0 Upgrade Notes v1.1.0 adds deep linking, title cards, collection mode, bibliography styling, and a share panel position tab. No manual steps are required. Deep linking and the updated share panel activate automatically. Collection mode is opt-in: set collection_mode: true in _config.yml to switch the homepage layout. The default is false , so existing sites are unaffected. Title cards use existing CSV rows with an empty object field — no new columns required. Bibliography styling is a new markdown widget ( :::bibliography ) available in panel content. If you only use GitHub's web interface: No action required. v1.0.0-beta Upgrade Notes v1.0.0-beta adds multimedia support (video and audio objects), an updated build pipeline, and renames the object_type CSV column to medium . Manual step — update the build workflow: The build.yml workflow has new steps for audio processing, Node.js setup, and JavaScript bundling. Copy the latest version from the Telar repository: Open build.yml on GitHub Click Copy raw contents In your repository, navigate to .github/workflows/build.yml and click Edit Select all and replace with the copied contents Commit the change Manual step — install Node.js dependencies (local development only): If you develop locally, run npm install in your repository after upgrading. This installs the JavaScript dependencies required by the new build pipeline (lenis, @vimeo/player, esbuild, vitest). Optional — audio support: If your site includes audio objects, install ffmpeg and audiowaveform for clip extraction and waveform peak data: macOS: brew install ffmpeg audiowaveform Ubuntu: sudo apt install ffmpeg audiowaveform Sites without audio objects do not need these tools. GitHub Actions installs them automatically when audio files are detected. Column rename — object_type to medium : The object_type column in objects.csv has been renamed to medium . This change is backward compatible — the old column name is still accepted. If you only use GitHub's web interface: Copy the updated build.yml as described above. No other manual steps are required. v0.7.0 Upgrade Notes v0.7.0 adds Node.js as a requirement for local development builds: New requirement for local development: Node.js 18+ is now required to run bundle exec jekyll build or bundle exec jekyll serve This enables JavaScript module bundling via esbuild during the build process GitHub-based workflows are not affected — GitHub Actions already includes Node.js If you develop locally: Install Node.js 18+ ( nodejs.org ) Run npm install in your repository to install JavaScript dependencies Then proceed with normal Jekyll commands If you only use GitHub's web interface: No action required — your site will continue to build automatically Manual Setup for Earlier Versions If your site is running v0.2.0 through v0.3.3 , you'll need to add the upgrade workflow files to your repository first. This is a one-time setup —after this, all future upgrades will be automated. Step 1: Add the Upgrade Workflow File You need to add two files to enable automated upgrades: the upgrade workflow and the updated build workflow. The upgrade workflow will automatically fetch all necessary scripts when it runs. Method A: GitHub Web Interface (Recommended) Work entirely in the browser without installing anything: Open the upgrade workflow in Telar : Go to https://github.com/UCSB-AMPLab/telar/blob/main/.github/workflows/upgrade.yml Click the Copy raw contents button (📋 icon in the top-right corner) Create the file in your repository : Go to your repository on GitHub Click Add file → Create new file Enter the file path: .github/workflows/upgrade.yml Paste the copied contents Scroll down and click Commit changes Add commit message: \"Add automated upgrade workflow\" Click Commit changes Method B: Desktop/Local Development If you have your repository cloned locally: Download the workflow file from Telar : curl -o .github/workflows/upgrade.yml https://raw.githubusercontent.com/UCSB-AMPLab/telar/main/.github/workflows/upgrade.yml Commit and push : git add .github/workflows/upgrade.yml git commit -m \"Add automated upgrade workflow\" git push That's it! The workflow automatically downloads the latest upgrade scripts from the Telar repository each time it runs, so you don't need to copy any Python files manually. Step 2: Replace the Build Workflow File If you're upgrading from v0.2.0 through v0.3.3 , you also need to replace your .github/workflows/build.yml file with the latest version. This removes deprecated features (cron schedule and git push step) that are no longer needed in v0.3.4+. Method A: GitHub Web Interface (Recommended) Work entirely in the browser: Open the build workflow in Telar : Go to https://github.com/UCSB-AMPLab/telar/blob/main/.github/workflows/build.yml Click the Copy raw contents button (📋 icon in the top-right corner) Replace the file in your repository : Go to your repository on GitHub Navigate to .github/workflows/build.yml Click the Edit button (pencil icon) Select all content (Ctrl+A or Cmd+A) and delete Paste the copied contents Scroll down and click Commit changes Add commit message: \"Update build workflow to v0.3.4\" Click Commit changes Method B: Desktop/Local Development If you have your repository cloned locally: Download the workflow file from Telar : curl -o .github/workflows/build.yml https://raw.githubusercontent.com/UCSB-AMPLab/telar/main/.github/workflows/build.yml Commit and push : git add .github/workflows/build.yml git commit -m \"Update build workflow to v0.3.4\" git push Optional Step : If you skip this step now, the upgrade summary will include instructions to update build.yml manually after your first upgrade. However, doing it now ensures a smoother upgrade experience. Step 3: Run Your First Automated Upgrade That's all the setup needed! Now follow the Automated Upgrades instructions above to upgrade to the latest version. The workflow will automatically: Download the latest upgrade scripts from the Telar repository Detect your current version Apply all necessary migrations Create a pull request with the upgraded files Troubleshooting Upgrade Workflow Not Appearing Problem : The \"Upgrade Telar\" workflow doesn't appear in the Actions tab. Solution : Make sure you've committed the .github/workflows/upgrade.yml file Refresh the Actions tab in your browser Check that the YAML file is valid (no syntax errors) Upgrade Fails with Error Problem : The upgrade workflow fails with an error message. Solution : Check the workflow logs in the Actions tab for details Verify your _config.yml has a telar.version field The workflow downloads scripts automatically, so network issues could cause failures If the error persists, report an issue with the error message Issue Not Created Problem : The upgrade completes but no issue is created. Solution : Check if an issue already exists with title \"Upgrade Telar to [version]\" Verify GitHub Actions has issues: write permission in your repository Check that issues are enabled in your repository settings Try running the workflow again Merge Conflicts Problem : The upgrade PR has merge conflicts. Solution : Review which files have conflicts If conflicts are in files you've customized (CSS, layouts), manually resolve them If conflicts are in framework files, the upgrade version should usually be preferred If unsure, ask for help Version History For a complete list of changes in each version, see the Changelog in the Telar repository. Need Help? Documentation : telar.org/docs Example Site : telar.org/demo Report Issues : GitHub Issues" + }, + "/guia/tus-datos/csv-objetos/": { + "ids": [ + "alias-del-csv-de-objetos", + "alt_text--texto_alt", + "buenas-prácticas", + "columnas", + "columnas-de-metadatos-personalizados", + "columnas-de-objetos", + "columnas-nuevas-opcionales", + "columnas-renombradas", + "consejos-para-los-metadatos-de-la-galería", + "credit--credito", + "csv-de-objetos-objectscsv--objetoscsv", + "description--descripcion", + "ejemplo", + "elegir-nombres-de-columnas", + "featured--destacado", + "medium--medio_genero", + "migración-de-v07x-a-v080", + "notas-de-los-campos", + "nueva-columna-en-projectcsv", + "object_id--id_objeto", + "object_type--tipo_objeto", + "organización-de-archivos", + "source--fuente", + "source_url--url_fuente", + "subjects--temas", + "thumbnail--miniatura", + "validación", + "véase-también", + "year--año" + ], + "selectors": { + "h1": [ + "Columnas de objetos" + ], + "h2": [ + "CSV de objetos (objects.csv / objetos.csv)", + "Buenas prácticas", + "Migración de v0.7.x a v0.8.0", + "Validación", + "Véase también" + ], + "h3": [ + "Columnas", + "Columnas de metadatos personalizados", + "Ejemplo", + "Notas de los campos", + "Alias del CSV de objetos", + "Elegir nombres de columnas", + "Organización de archivos", + "Consejos para los metadatos de la galería", + "Columnas nuevas (opcionales)", + "Columnas renombradas", + "Nueva columna en project.csv" + ], + "h4": [ + "object_id / id_objeto", + "description / descripcion", + "source_url / url_fuente", + "year / año", + "source / fuente", + "medium / medio_genero", + "alt_text / texto_alt", + "object_type / tipo_objeto", + "subjects / temas", + "featured / destacado", + "credit / credito", + "thumbnail / miniatura" + ], + "h5": [], + "h6": [], + "pre": [ + "object_id,title,material,technique textile-001,Textil Colonial,Mezcla de algodón y lana,Tejido en telar de cintura", + "object_id,title,description,creator,year,object_type,subjects,source,credit,featured,source_url textile-001,Colonial Textile,A woven fragment showing complex patterns...,Unknown,1650,textile,\"weaving, colonial\",National Museum,Public Domain,yes, map-lima,Map of Lima,Early colonial map showing city layout,Juan de Cuellar,1685,map,\"cartography, Lima\",British Library,,no,https://example.org/iiif/map/info.json", + "id_objeto,titulo,descripcion,creador,año,tipo_objeto,temas,fuente,credito,destacado,url_fuente textil-001,Textil Colonial,Un fragmento tejido con patrones complejos...,Desconocido,1650,textil,\"tejido, colonial\",Museo Nacional,Dominio Público,si, mapa-lima,Mapa de Lima,Mapa colonial temprano...,Juan de Cuellar,1685,mapa,\"cartografía, Lima\",Biblioteca Británica,,no,https://ejemplo.org/iiif/mapa/info.json", + "# Sitio en inglés order,story_id,title,subtitle,byline # Sitio en español orden,id_historia,titulo,subtitulo,firma", + "order,story_id,title,subtitle,byline orden,id_historia,titulo,subtitulo,firma", + "telar-content/spreadsheets/ ├── project.csv # Metadatos de las historias ├── objects.csv # Catálogo de objetos ├── textiles-coloniales.csv # Pasos de la historia (usando story_id) ├── rutas-comerciales.csv # Otra historia └── glossary.csv # Términos de glosario (opcional)" + ], + "table": [ + "Inglés Español Requerido Descripción object_id id_objeto Sí Identificador único (minúsculas, guiones, guiones bajos) title titulo Sí Título del objeto description descripcion No Descripción extensa (admite Markdown) source_url url_fuente No URL de la imagen IIIF info.json o manifiesto creator creador No Nombre del creador o artista period periodo No Periodo histórico year año No Año de creación o datación (se usa para ordenar en la galería) medium medio_genero No Género o medio del objeto (ej., \"Fotografía\", \"Óleo sobre lienzo\") dimensions dimensiones No Dimensiones físicas source fuente No Ubicación o repositorio (renombrado desde location en v0.8.0) credit credito No Línea de atribución o crédito thumbnail miniatura No Ruta a la imagen en miniatura alt_text texto_alt No Texto alternativo para accesibilidad (usa title si se deja vacío) object_type tipo_objeto No Clasificación del objeto (se usa para el filtro de la galería) subjects temas No Temas, separados por comas (se usa para el filtro de la galería) featured destacado No Pon yes para destacar en la página principal", + "Normalizado Acepta object_id object_id, id_objeto, objeto, object, id title title, titulo description description, descripcion creator creator, creador period period, periodo year year, año, ano medium medium, medio, medio_genero, medium_genre, object_type, tipo_objeto dimensions dimensions, dimensiones source source, fuente, location, ubicacion credit credit, credito thumbnail thumbnail, miniatura alt_text alt_text, texto_alt subjects subjects, temas, materias, materia featured featured, destacado source_url source_url, url_fuente iiif_manifest iiif_manifest, manifiesto_iiif (heredado)", + "Columna Propósito year Habilita ordenar por año en la galería object_type Habilita el filtro de tipo en la barra lateral subjects Habilita el filtro de temas en la barra lateral featured Controla la muestra de objetos en la página principal", + "Anterior (v0.7.x) Nuevo (v0.8.0) Notas location source El nombre anterior sigue funcionando", + "Columna Propósito protected Marca historias para encriptación (requiere story_key en la configuración)" + ], + "blockquote": [ + "Si usas el Compositor, este gestiona objects.csv visualmente — no es necesario editar el archivo directamente." + ], + "img": [] + }, + "text": "Columnas de objetos Referencia completa de las columnas de objects.csv con soporte bilingüe de nombres de columnas. Para la normalización de columnas y soporte de encabezados dobles, consulta Columnas del proyecto . CSV de objetos (objects.csv / objetos.csv) Cataloga todos los objetos usados en las historias y mostrados en la galería. Ubicación : telar-content/spreadsheets/objects.csv o telar-content/spreadsheets/objetos.csv Si usas el Compositor , este gestiona objects.csv visualmente — no es necesario editar el archivo directamente. Columnas Inglés Español Requerido Descripción object_id id_objeto Sí Identificador único (minúsculas, guiones, guiones bajos) title titulo Sí Título del objeto description descripcion No Descripción extensa (admite Markdown) source_url url_fuente No URL de la imagen IIIF info.json o manifiesto creator creador No Nombre del creador o artista period periodo No Periodo histórico year año No Año de creación o datación (se usa para ordenar en la galería) medium medio_genero No Género o medio del objeto (ej., \"Fotografía\", \"Óleo sobre lienzo\") dimensions dimensiones No Dimensiones físicas source fuente No Ubicación o repositorio (renombrado desde location en v0.8.0) credit credito No Línea de atribución o crédito thumbnail miniatura No Ruta a la imagen en miniatura alt_text texto_alt No Texto alternativo para accesibilidad (usa title si se deja vacío) object_type tipo_objeto No Clasificación del objeto (se usa para el filtro de la galería) subjects temas No Temas, separados por comas (se usa para el filtro de la galería) featured destacado No Pon yes para destacar en la página principal Columnas de metadatos personalizados Cualquier columna que agregues más allá de las 16 columnas estándar listadas arriba se muestra automáticamente en las páginas de objetos como campos de metadatos adicionales. El nombre de la columna se convierte en la etiqueta y el valor de la celda en el texto mostrado. Por ejemplo, si agregas columnas material y technique a tu hoja de cálculo: object_id,title,material,technique textile-001,Textil Colonial,Mezcla de algodón y lana,Tejido en telar de cintura Los valores \"Mezcla de algodón y lana\" y \"Tejido en telar de cintura\" aparecen como metadatos adicionales en la página del objeto, con las etiquetas \"material\" y \"technique\" respectivamente. Ejemplo Inglés: object_id,title,description,creator,year,object_type,subjects,source,credit,featured,source_url textile-001,Colonial Textile,A woven fragment showing complex patterns...,Unknown,1650,textile,\"weaving, colonial\",National Museum,Public Domain,yes, map-lima,Map of Lima,Early colonial map showing city layout,Juan de Cuellar,1685,map,\"cartography, Lima\",British Library,,no,https://example.org/iiif/map/info.json Español: id_objeto,titulo,descripcion,creador,año,tipo_objeto,temas,fuente,credito,destacado,url_fuente textil-001,Textil Colonial,Un fragmento tejido con patrones complejos...,Desconocido,1650,textil,\"tejido, colonial\",Museo Nacional,Dominio Público,si, mapa-lima,Mapa de Lima,Mapa colonial temprano...,Juan de Cuellar,1685,mapa,\"cartografía, Lima\",Biblioteca Británica,,no,https://ejemplo.org/iiif/mapa/info.json Notas de los campos object_id / id_objeto Único entre todos los objetos Referenciado en los CSV de historias Se usa en las URLs: /objects/{object_id}/ Formato: minúsculas, guiones, guiones bajos description / descripcion Admite Markdown Se muestra en las páginas de objetos Puede incluir encabezados, listas, enlaces, énfasis source_url / url_fuente URL a la Image API IIIF info.json o la Presentation API IIIF manifiesto Úsalo para objetos de servidores IIIF externos Déjalo vacío para imágenes autoalojadas (las teselas se generan automáticamente) v0.5.0+ : Preferido sobre la columna heredada iiif_manifest (que aún funciona) year / año Nuevo en v0.8.0 Se usa para ordenar objetos en la galería (ordenar por año) Formato flexible: 1650 , 1685 , 1750 Acepta año o ano (sin tilde) como alias en español source / fuente Renombrado en v0.8.0 desde location Ubicación actual o repositorio que lo alberga El nombre antiguo location (y los alias en español ubicacion , locacion ) sigue funcionando por compatibilidad medium / medio_genero Renombrado en v1.0.0 desde object_type / tipo_objeto Describe el género o medio del objeto — no el tipo de medio (imagen, video, audio), que ahora se detecta automáticamente desde la fuente del objeto Ejemplos: Fotografía , Óleo sobre lienzo , Textil , Mapa Se usa como faceta en la barra lateral de filtros de la galería cuando browse_and_search: true El nombre antiguo object_type (y el alias en español tipo_objeto ) sigue funcionando por compatibilidad También acepta medium_genre como alias en inglés alt_text / texto_alt Nuevo en v1.0.0 Texto alternativo para la imagen del objeto, usado para accesibilidad Usa el title del objeto si se deja vacío Se muestra en el atributo alt de las imágenes del objeto en todo el sitio object_type / tipo_objeto Obsoleto en v1.0.0 — usa medium / medio_genero en su lugar Sigue funcionando como alias de medium por compatibilidad Clasificación del objeto usada como faceta en la barra lateral de filtros de la galería Ejemplos: mapa , textil , fotografía , pintura Aparece como categoría de filtro cuando browse_and_search: true subjects / temas Nuevo en v0.8.0 Temas separados por comas usados como facetas en la barra lateral de filtros de la galería Ejemplos: \"tejido, colonial, textiles\" , \"cartografía, Lima, urbanismo\" También acepta alias en español: materias , materia featured / destacado Nuevo en v0.8.0 Pon yes para destacar este objeto en la página principal Los objetos destacados se priorizan cuando show_sample_on_homepage: true en la configuración La cantidad mostrada se controla con featured_count (predeterminado: 4) credit / credito Se muestra como etiqueta en la esquina superior derecha de las imágenes (si show_object_credits: true ) También se muestra en la tabla de metadatos Úsalo para atribución: Dominio Público , CC BY 4.0 , Cortesía del Archivo Nacional thumbnail / miniatura Ruta a un archivo de imagen en miniatura Relativa a la raíz del repositorio Si se omite, Telar genera miniaturas desde la fuente IIIF Alias del CSV de objetos Normalizado Acepta object_id object_id , id_objeto , objeto , object , id title title , titulo description description , descripcion creator creator , creador period period , periodo year year , año , ano medium medium , medio , medio_genero , medium_genre , object_type , tipo_objeto dimensions dimensions , dimensiones source source , fuente , location , ubicacion credit credit , credito thumbnail thumbnail , miniatura alt_text alt_text , texto_alt subjects subjects , temas , materias , materia featured featured , destacado source_url source_url , url_fuente iiif_manifest iiif_manifest , manifiesto_iiif (heredado) Buenas prácticas Elegir nombres de columnas Sitios monolingües : Usa tu idioma preferido de forma consistente # Sitio en inglés order,story_id,title,subtitle,byline # Sitio en español orden,id_historia,titulo,subtitulo,firma Equipos bilingües : Usa encabezados dobles order,story_id,title,subtitle,byline orden,id_historia,titulo,subtitulo,firma Organización de archivos telar-content/spreadsheets/ ├── project.csv # Metadatos de las historias ├── objects.csv # Catálogo de objetos ├── textiles-coloniales.csv # Pasos de la historia (usando story_id) ├── rutas-comerciales.csv # Otra historia └── glossary.csv # Términos de glosario (opcional) Consejos para los metadatos de la galería Para la mejor experiencia de galería con exploración, búsqueda y filtrado: Completa medium para cada objeto — alimenta el filtro de tipo Agrega subjects con 2-4 términos separados por comas — alimenta el filtro de temas Incluye year para ordenación cronológica Marca 4-6 objetos como featured: yes para la muestra de la página principal Escribe campos description significativos — la búsqueda los indexa para texto completo Migración de v0.7.x a v0.8.0 Columnas nuevas (opcionales) Agrega estas a tu objects.csv si deseas filtrado y ordenación en la galería: Columna Propósito year Habilita ordenar por año en la galería object_type Habilita el filtro de tipo en la barra lateral subjects Habilita el filtro de temas en la barra lateral featured Controla la muestra de objetos en la página principal Columnas renombradas Anterior (v0.7.x) Nuevo (v0.8.0) Notas location source El nombre anterior sigue funcionando Nueva columna en project.csv Columna Propósito protected Marca historias para encriptación (requiere story_key en la configuración) Sin cambios que rompan compatibilidad. Todos los CSV de v0.7.x funcionan sin modificación. Validación Telar revisa los datos del CSV de objetos durante el build y escribe mensajes en la salida del build . Lo que revisa el build : Las filas con object_id vacío se descartan sin aviso. Cada objeto debe tener un source_url que apunte a un manifiesto IIIF válido, o una imagen local que coincida en telar-content/objects/ . Si la fuente falta o no responde, se genera una advertencia y el objeto se escribe de todos modos. Los valores de miniatura que no son rutas de imagen (por ejemplo, \"n/a\" o \"none\") se borran y se genera una advertencia. Los object_id que contienen espacios generan una advertencia, ya que los espacios pueden causar problemas con las rutas de archivo. Lo que el build no exige : Que el object_id no falte ni se repita. Un object_id ausente o duplicado no detiene el build : las filas sin object_id se descartan sin mensaje y los identificadores duplicados no se detectan, así que, al generar los archivos de colección, prevalece la última fila. Que haya title . Un title vacío o ausente no detiene el build ; el objeto se publica con el título en blanco. Todas las advertencias aparecen en la salida del build . Revisa la salida en busca de mensajes marcados con [WARN] para detectar problemas en los datos antes de publicar. Véase también Columnas del proyecto — Columnas de project.csv Columnas de historias — Columnas de los CSV de historia Objetos — Información sobre objetos Galería de objetos — Exploración, búsqueda y filtrado de la galería Referencia de configuración — Opciones de la interfaz de colección" + }, + "/guia/el-compositor/publicacion/": { + "ids": [ + "después-de-publicar", + "editor-de-configuración", + "media-upgrade-guia-el-compositor-publicacion", + "publicación", + "publicar", + "resumen-de-cambios", + "seguimiento-del-build", + "validación-previa-a-la-publicación", + "véase-también" + ], + "selectors": { + "h1": [ + "Publicación" + ], + "h2": [ + "Resumen de cambios", + "Validación previa a la publicación", + "Publicar", + "Seguimiento del build", + "Después de publicar", + "Editor de configuración", + "Véase también" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [ + "El editor de configuración cubre los ajustes de uso más común. Para opciones de configuración avanzadas, puedes seguir editando _config.yml directamente en tu repositorio. Consulta Configuración para la referencia completa." + ], + "img": [ + [ + "/assets/manual/tutorials/es-upgrade.jpg", + "Un aviso de actualización que compara, como ejemplo, Telar 1.8.2 y 1.8.3." + ] + ] + }, + "text": "Publicación La publicación envía tus cambios del Compositor a tu repositorio de GitHub. Hasta que publiques, todas las ediciones — de objetos, historias y configuraciones — se guardan en el servidor. Al publicar se crea un solo commit en tu repositorio, se activa un build de GitHub Pages y tus cambios se hacen visibles en tu sitio. Resumen de cambios Antes de publicar, el Compositor muestra un resumen de todo lo que ha cambiado desde tu última publicación. Esto te permite revisar tu trabajo antes de confirmar. El resumen de cambios lista adiciones, modificaciones y eliminaciones en tu proyecto — objetos nuevos, pasos de historias editados, metadatos actualizados y cualquier otro cambio que hayas hecho. Revisa este resumen con cuidado para asegurarte de que refleja lo que deseas publicar. Validación previa a la publicación El Compositor valida tu proyecto antes de permitirte publicar. La validación detecta problemas que podrían causar inconvenientes en tu sitio en línea. Hay dos niveles de validación: Errores — Problemas críticos que bloquean la publicación. Por ejemplo, un campo obligatorio podría faltar o una historia podría hacer referencia a un objeto que no existe. Debes corregir los errores antes de publicar. Advertencias — Problemas no críticos que no bloquean la publicación pero vale la pena revisar. Por ejemplo, un objeto podría no tener texto alternativo o una historia podría tener un solo paso. Puedes publicar con advertencias, pero resolverlas mejora tu exhibición. Un ejemplo del aviso previo a publicar. Compara las versiones y revisa los archivos propuestos; los números cambian según tu sitio. Ampliar captura ↗ Publicar Cuando estés listo, usa el control de publicación. El Compositor envía los cambios revisados al repositorio mediante su App de GitHub instalada. El cuerpo del commit registra Published by @tu-usuario-de-github . Publicar y terminar la generación del sitio son etapas distintas. Sigue el estado de la generación antes de revisar el sitio público. Seguimiento del build Después de publicar, el Compositor hace seguimiento del progreso del build de GitHub Pages en tiempo real. Un indicador de progreso muestra el estado actual: Queued — El build está en espera para iniciar Building — GitHub Actions está construyendo tu sitio Complete — El build finalizó correctamente y tus cambios están en línea Failed — El build encontró un error Si un build falla, el Compositor muestra la información del error para que puedas diagnosticar el problema. Las causas comunes incluyen YAML inválido en archivos de configuración o archivos requeridos faltantes. Puedes corregir el problema y publicar de nuevo. Después de publicar Una vez que el build se completa correctamente, el Compositor proporciona un enlace directo a tu sitio en línea. Haz clic en él para ver tus cambios publicados de inmediato. Editor de configuración El Compositor incluye un editor de configuración para los ajustes esenciales del sitio. En lugar de editar el archivo _config.yml directamente a través de GitHub, puedes actualizar campos clave a través de un formulario en el Compositor. El editor de configuración te permite cambiar ajustes como el título del sitio, opciones de tema y otros valores de configuración que afectan la apariencia de tu exhibición. Los cambios de configuración se incluyen en tu próxima publicación junto con cualquier cambio de contenido. Si el archivo _config.yml de tu sitio está escrito de una forma que no le permite al Compositor guardar en él los ajustes de Configuración del sitio , la página Publicar te avisa y te ofrece reescribir el archivo. Haz clic en Revisar la reescritura para ver qué va a pasar. El Compositor rehace _config.yml a partir de la plantilla de la versión de Telar que usa tu sitio y conserva tal cual los ajustes propios de tu archivo. La revisión te muestra qué ajustes van a quedar con el valor de Configuración del sitio o de la plantilla, y qué líneas no puede leer el Compositor y por eso se van a quitar. Los comentarios entre ajustes no se conservan. Cuando haces clic en Aceptar la reescritura , el Compositor escribe el archivo nuevo la próxima vez que publiques; el anterior queda en el historial de tu sitio en GitHub. Cualquier persona con permiso para editar Configuración del sitio puede aceptar la reescritura. El editor de configuración cubre los ajustes de uso más común. Para opciones de configuración avanzadas, puedes seguir editando _config.yml directamente en tu repositorio. Consulta Configuración para la referencia completa. Véase también Editor de historias — Construir y editar historias Objetos — Gestionar objetos en el Compositor Sincronización y actualizaciones — Mantener tu proyecto sincronizado con el repositorio Inicio y navegación — Regresa a la vista general del proyecto" + }, + "/docs/site-features/private-stories/": { + "ids": [ + "1-set-the-story-key", + "2-mark-stories-as-private", + "build-failures", + "configuration-reference", + "how-it-works", + "key-entry-form", + "link-with-key-parameter", + "private-stories", + "security-considerations", + "see-also", + "session-caching", + "setup", + "sharing-protected-stories", + "testing-locally" + ], + "selectors": { + "h1": [ + "Private Stories" + ], + "h2": [ + "How It Works", + "Setup", + "Testing Locally", + "Sharing Protected Stories", + "Security Considerations", + "Build Failures", + "Configuration Reference", + "See Also" + ], + "h3": [ + "1. Set the Story Key", + "2. Mark Stories as Private", + "Key Entry Form", + "Link with Key Parameter", + "Session Caching" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "story_key: \"your-secret-key\"", + "order,story_id,title,subtitle,private 1,colonial-textiles,Colonial Textiles,Weaving traditions, 2,draft-analysis,Analysis Draft,Work in progress,yes", + "python3 scripts/build_local_site.py --build-only", + "https://your-site.com/stories/draft-analysis/?key=your-secret-key" + ], + "table": [ + "Setting Location Purpose story_key _config.yml The encryption/decryption key private project.csv column Marks individual stories for encryption (protected also accepted)" + ], + "blockquote": [ + "protected (and the Spanish protegida) also work as column names — Telar treats them the same as private/privada. New sites and the examples in this documentation use private/privada.", + "The key is visible in the URL when shared this way. Anyone who sees the link (in browser history, chat logs, or email) will have access to the story." + ], + "img": [ + [ + "/images/private-story-locked.png", + "Protected story showing lock screen with key entry field" + ] + ] + }, + "text": "Private Stories Private stories are encrypted so that only viewers with the correct key can read them. Use this feature to share work-in-progress stories with collaborators, restrict access to classroom materials, or keep sensitive content from public view. New in v0.8.0. How It Works Telar builds every story — private or not — through the same templates. A private story renders exactly like an open one during the Jekyll build. Only after the build finishes does a separate step encrypt it: During the Jekyll build , a private story's steps render through the normal story templates — the same markdown processing, glossary links, LaTeX, audio clips, and alt text as any open story. After the build , a post-build step encrypts the rendered story content (AES-256-GCM) and replaces it with a locked placeholder. The story's title and subtitle stay visible in the project listing; only the step-by-step content is encrypted. On the published site , the story page loads with a locked overlay in place of its content. Viewers enter the key (or use a link that includes it), and the story decrypts in their browser. Once unlocked , the story behaves exactly like an open story, because it was rendered through the same templates as any other story during the build. The story's title and subtitle remain visible in the project listing. Only the step-by-step content is encrypted. Setup Two things are needed: a key in your config and a flag on each story you want to protect. 1. Set the Story Key Add story_key to your _config.yml : story_key: \"your-secret-key\" This key is used to encrypt all private stories. Choose something memorable but not easily guessed. 2. Mark Stories as Private In your project.csv , set the private column to yes for each story you want to encrypt: order,story_id,title,subtitle,private 1,colonial-textiles,Colonial Textiles,Weaving traditions, 2,draft-analysis,Analysis Draft,Work in progress,yes Stories without private: yes remain public. protected (and the Spanish protegida ) also work as column names — Telar treats them the same as private / privada . New sites and the examples in this documentation use private / privada . Testing Locally Plain bundle exec jekyll serve , and scripts/build_local_site.py in its default (serve) mode, never encrypt anything — Jekyll regenerates _site continuously while serving, and encryption is a one-time step that runs after a build finishes. Private stories appear as plain, readable content when you preview them this way. This is expected, not a bug: the same command a real deploy uses to build has not run yet. To see a private story the way a visitor would (locked, requiring the key): python3 scripts/build_local_site.py --build-only Then serve the resulting _site/ directory with a static file server (for example, python3 -m http.server run from inside _site/ ). This runs the same encryption step the GitHub Actions build runs, so it can also fail the way a real build would — see Build Failures below. Sharing Protected Stories There are two ways viewers can unlock a protected story: Key Entry Form When a viewer opens a protected story, they see an overlay with a key entry field. They type the key and press Enter . If the key is correct, the overlay fades away and the story appears. If the key is wrong, the form displays an error message and lets them try again. Link with Key Parameter You can share a direct link that includes the key as a URL parameter: https://your-site.com/stories/draft-analysis/?key=your-secret-key Viewers who open this link skip the entry form — the story decrypts automatically. The key is visible in the URL when shared this way. Anyone who sees the link (in browser history, chat logs, or email) will have access to the story. Session Caching Once a viewer unlocks a story, it stays unlocked for the rest of their browser session. Navigating away and returning to the story does not require re-entering the key. Closing the browser clears the cache. Security Considerations Story protection is a weak privacy guard , not a security measure. It deters casual access — visitors cannot simply open browser DevTools and read the story content. It does not protect content from a determined person. What it provides: Story step data is encrypted in the page source — not readable at a glance in DevTools A key entry gate that stops casual viewers who do not have the key No server-side infrastructure needed What it does not provide — important limitations: Confidentiality on a public site. Every CSV in telar-content/spreadsheets/ , including the story's own step data and project.csv itself (which carries the private flag), is copied verbatim into the published site and is publicly accessible at a predictable URL under /telar-content/spreadsheets/ on any public GitHub Pages deployment. A determined person can read the full story content from those files without a key. Resistance to offline attack. The salt, IV, and ciphertext are all embedded in the page HTML. Anyone who views source has everything needed to run an offline brute-force or dictionary attack against the key. Per-user access control. Everyone who has the key has the same access; there is no way to revoke access for one person without changing the key for everyone. Hidden story metadata. Titles and subtitles remain visible in the project listing regardless of protection status. For real confidentiality , use a private GitHub repository. On a private repository, neither the site nor its files are publicly reachable, so only people you have granted repository access can view anything at all. Story protection alone is not a substitute for a private repository when the content genuinely must not be read by unauthorized people. Build Failures Telar refuses to publish a private story as plaintext. The build can fail in two places rather than deploy unprotected content: A story is marked private: yes but story_key is missing from _config.yml . Add the key, or remove the private flag from the story. The build workflow doesn't run the encryption step. Sites upgraded from before v1.6.0 need this step added to .github/workflows/build.yml by hand — GitHub does not allow the automated upgrade to edit workflow files for you. See Upgrading Telar: v1.6.0 Upgrade Notes . Either failure prints a message identifying which one happened, in English and Spanish. Configuration Reference Setting Location Purpose story_key _config.yml The encryption/decryption key private project.csv column Marks individual stories for encryption ( protected also accepted) See Configuration for details on the story_key setting. See Also Stories & Panels — How to build stories CSV Reference: Project — The private column in project.csv Configuration — Story key and interface settings Upgrading Telar — Required manual step for sites upgrading from before v1.6.0" + }, + "/docs/the-compositor/objects/": { + "ids": [ + "add-external-iiif", + "edit-metadata", + "featured-toggle", + "media-import-docs-the-compositor-objects", + "media-object-metadata-docs-the-compositor-objects", + "media-objects-docs-the-compositor-objects", + "object-list", + "objects", + "save-to-repository", + "see-also", + "status-indicators", + "sync", + "upload-images" + ], + "selectors": { + "h1": [ + "Objects" + ], + "h2": [ + "Object list", + "Edit metadata", + "Add external IIIF", + "Upload images", + "Save to repository", + "Sync", + "See also" + ], + "h3": [ + "Status indicators", + "Featured toggle" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [ + "Field Description Title The name of the object as it appears on your site Creator The person or organization that created the object Year When the object was created or published Description A short summary of what the object depicts or contains Source Where the object comes from — a collection, archive, or URL Alt text A description for screen readers and accessibility Genre / Medium The type of object — photograph, painting, map, manuscript, etc." + ], + "blockquote": [ + "Alt text is important for accessibility. Write a brief, descriptive sentence that conveys what the image shows to someone who cannot see it.", + "After uploading, the object's status may show Needs tiles until you publish and the GitHub Actions build generates the IIIF tiles. The object is still usable in the Compositor — tiles will be available on your live site after the build completes." + ], + "img": [ + [ + "/assets/manual/tutorials/en-objects.jpg", + "The Objects list with thumbnails, IDs, usage counts, status and the Add object control." + ], + [ + "/assets/manual/tutorials/en-object-metadata.jpg", + "The khipu image beside its title, description and catalogue fields." + ], + [ + "/assets/manual/tutorials/en-import-poster.jpg", + "The IIIF dialog moves from an empty URL to the pasted manifest and the fetched khipu preview." + ] + ] + }, + "text": "Objects The Objects page in the Compositor lets you browse, edit, and add the visual items that make up your exhibition. Every object you manage here — images, IIIF manifests, videos, audio files — is tracked in your repository's objects.csv file. The Compositor handles that file for you, so you never need to edit it directly. Object list The object list shows all objects in your exhibition as a list with thumbnails. Each object displays: A thumbnail preview of the image or media The object's title A status indicator showing its current state Status indicators The status reports availability; it does not mean the catalogue description has been fully reviewed. Ready — The object has a title and passes the image-availability check where that check applies. No metadata — The title is missing. Review the record and add its title and other useful catalogue information. Needs tiles — The image is not yet available. For a hosted file, check its build and generated tiles; for an external source, check the manifest. Missing from repo — The record has been flagged as absent from the repository. Review the repository comparison before deciding what to keep. Featured toggle You can mark any object as featured. Featured objects appear prominently on your site's home page and in the objects gallery. To toggle an object's featured status, click the featured indicator on the object row. Each row connects an object to its thumbnail, ID, usage and status. Filter the list or open an object to inspect it. Open full-size screenshot ↗ Edit metadata Select an object to open its metadata editor. Here you can fill in or update the information that describes the object in your exhibition. The metadata fields are: Field Description Title The name of the object as it appears on your site Creator The person or organization that created the object Year When the object was created or published Description A short summary of what the object depicts or contains Source Where the object comes from — a collection, archive, or URL Alt text A description for screen readers and accessibility Genre / Medium The type of object — photograph, painting, map, manuscript, etc. Alt text is important for accessibility. Write a brief, descriptive sentence that conveys what the image shows to someone who cannot see it. The image and metadata describe the same khipu. Continue down the form for source, credit and accessibility text. Open full-size screenshot ↗ Add external IIIF Open Objects and choose + Add object . Select IIIF manifest . Paste the manifest URL and choose Fetch manifest . Review the preview, title, source, credit and any other supplied metadata. Choose Add object . Adding the object makes it available in the collection. Select it separately in a story step using Change object . Follow Use an IIIF object in a story for the complete illustrated khipu example. See External IIIF Images for background. Paste the manifest, fetch it, then check the returned khipu and metadata. Adding the object is a separate action. Play steps Open full-size screenshot ↗ Download GIF Upload images You can upload your own images directly through the Compositor. Uploaded images are committed to your repository and IIIF tiles are generated automatically during the next build. Click Add object and select the upload option Drag files into the upload area, or click to select files from your computer Fill in metadata while the upload processes Save the object to your project Supported formats are JPG, PNG, and TIFF, with a maximum file size of 25 MB per image. After uploading, the object's status may show Needs tiles until you publish and the GitHub Actions build generates the IIIF tiles. The object is still usable in the Compositor — tiles will be available on your live site after the build completes. Save to repository When you save changes to objects — whether editing metadata, adding IIIF, or uploading images — those changes are saved in the Compositor draft. To send them to GitHub, you need to publish. Publishing commits an updated objects.csv to your repository along with any uploaded image files. See Publishing for the full workflow. Sync When objects change outside the Compositor, use the project's Changes on GitHub review. Read the differences and choose which version to keep before applying them. See Sync and Updates . Unpublished editing and publishing are separate. Review the consequences shown for the affected object rather than re-importing the entire project. See also Start and navigation — Return to the project overview Objects — How objects work in Telar External IIIF Images — Background on IIIF manifests and sources Self-Hosted Images — How uploaded images become IIIF tiles" + }, + "/docs/getting-started/compositor/": { + "ids": [ + "connect-an-existing-repository", + "create-a-new-site", + "get-started", + "media-create-site-docs-getting-started-compositor", + "media-editor-overview-docs-getting-started-compositor", + "next-steps", + "use-the-compositor", + "what-the-compositor-can-do", + "what-youll-need" + ], + "selectors": { + "h1": [ + "Use the Compositor" + ], + "h2": [ + "What you'll need", + "Get started", + "What the Compositor can do", + "Next steps" + ], + "h3": [ + "Create a new site", + "Connect an existing repository" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [ + "Your repository will be public. GitHub Pages requires a public repository unless you have a paid GitHub plan." + ], + "img": [ + [ + "/assets/manual/tutorials/en-create-site.jpg", + "The new-site form with repository name, visible title, language and theme." + ], + [ + "/images/use-this-template.png", + "GitHub screenshot: Use this template button" + ], + [ + "/images/github-actions.gif", + "Setting up GitHub Pages with GitHub Actions" + ], + [ + "/assets/manual/tutorials/en-editor-overview.jpg", + "The story outline, step card and khipu viewer in the Compositor." + ] + ] + }, + "text": "Use the Compositor The Telar Compositor is a visual tool for building exhibitions. You can add objects, write stories, arrange steps, and preview your site — all in your browser, with no coding required. When you're ready, the Compositor publishes a complete Telar site to GitHub Pages. What you'll need A GitHub account (free) Images, videos, or audio files for your exhibition Get started Go to compositor.telar.org and sign in with your GitHub account. The Compositor will ask you to install the Telar Compositor GitHub App — this gives it permission to create and manage repositories on your behalf. Once signed in, you have two options: Create a new site Open the project menu and choose Add or create a repo , then A Telar site . Enter a repository name, a visible title, a language and a theme. Use a short repository name with lowercase letters and hyphens, such as my-exhibition . Choose Create site when those details are ready. The Compositor creates the repository from the Telar template and prepares the site for editing. Your repository will be public. GitHub Pages requires a public repository unless you have a paid GitHub plan. Choose the repository name, title, language and theme before creating the site. Open full-size screenshot ↗ Connect an existing repository If you already created a repository from the Telar template or have an existing Telar site, select it from the list and the Compositor will import your content. Manual setup: create a repository on GitHub first If you prefer to create your repository yourself before connecting it: Visit the Telar template Click the green Use this template button Choose Create a new repository Give your repository a name — use lowercase letters and hyphens (e.g., my-exhibition ) Make sure Public is selected Click Create repository Then enable GitHub Pages: In your repository, go to Settings → Pages Under Source , select GitHub Actions Click Save Once that's done, return to compositor.telar.org and connect the repository. What the Compositor can do Edit stories visually — add steps, write text, set image coordinates, and preview your narrative in real time Upload images — drag and drop images directly; IIIF tiles are generated automatically Add video and audio — embed YouTube, Vimeo, or Google Drive videos and self-hosted audio files with clip controls Publish in one click — review your changes, commit to GitHub, and track the build without leaving the editor For the full guide, see The Compositor . The outline is on the left, the step text in the centre and the object on the right. Capture position records the view for the selected step. Open full-size screenshot ↗ Next steps Continue with the visual authoring workflow: Objects — Add sources and review their metadata. Use an IIIF object in a story — Follow the illustrated khipu example. Story Editor — Write steps, capture views and develop panels. Publishing — Review changes and check the built site." + }, + "/guia/tu-contenido/widgets/": { + "ids": [ + "acordeón", + "bibliografía", + "campos", + "carrusel", + "citas-académicas", + "comparación-de-imágenes", + "dónde-funcionan-los-widgets", + "ejemplos", + "estructura", + "estructura-1", + "estructura-2", + "fuentes-comparativas", + "imágenes-en-widgets", + "imágenes-externas", + "imágenes-externas-1", + "imágenes-locales", + "línea-de-tiempo-histórica", + "pestañas", + "sintaxis", + "sintaxis-1", + "sintaxis-2", + "sintaxis-3", + "sintaxis-de-widgets", + "validación", + "véase-también", + "widgets", + "widgets-disponibles" + ], + "selectors": { + "h1": [ + "Widgets" + ], + "h2": [ + "Widgets disponibles", + "Sintaxis de widgets", + "Carrusel", + "Pestañas", + "Acordeón", + "Bibliografía", + "Dónde funcionan los widgets", + "Imágenes en widgets", + "Validación", + "Ejemplos", + "Véase también" + ], + "h3": [ + "Sintaxis", + "Campos", + "Imágenes externas", + "Sintaxis", + "Estructura", + "Sintaxis", + "Estructura", + "Sintaxis", + "Estructura", + "Imágenes locales", + "Imágenes externas", + "Línea de tiempo histórica", + "Fuentes comparativas", + "Comparación de imágenes", + "Citas académicas" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + ":::widget_type contenido del widget aquí :::", + ":::carousel image: story1/map.jpg alt: Mapa histórico de la región caption: Mapa de 1650 que muestra los límites coloniales credit: National Archives --- image: story1/document.jpg alt: Documento colonial caption: Decreto real que establece el asentamiento credit: Archivo General de Indias :::", + "image: https://example.org/images/photo.jpg", + ":::tabs ## Relato español Las autoridades reales reportaron que el levantamiento comenzó el... Los registros históricos muestran testimonios contradictorios... ## Perspectiva indígena Las lideresas y los líderes comunitarios organizaron la resistencia... Las tradiciones orales describen una respuesta coordinada... ## Análisis contemporáneo Hoy las personas historiadoras reconocen este evento como... :::", + ":::accordion ## 1600-1650: Primer periodo colonial La corona española estableció estructuras administrativas en todo el territorio. Las poblaciones indígenas se reorganizaron en asentamientos... ## 1650-1700: Consolidación Los sistemas de hacienda se afianzaron a medida que maduraba la economía colonial. ## 1700-1750: Era de reformas Las reformas borbónicas retaron las estructuras de poder existentes... :::", + ":::bibliography Cobo Betancourt, J. F. (2024). *The Coming of the Kingdom: The Muisca, Catholic Reform, and Spanish Colonialism in the New Kingdom of Granada*. Cambridge University Press. Cobo, N. (2021). Creating authority and promoting normative behaviour. En T. Duve, J. L. Egío y C. Birr (Eds.), *The School of Salamanca: A Case of Global Knowledge Production* (pp. 210–244). Brill. Muñoz-Arbeláez, S. (2025). *The New Kingdom of Granada: The Making and Unmaking of Spain's Atlantic Empire*. Duke University Press. :::", + "telar-content/objects/ ├── map.jpg ├── document.jpg └── artifact.jpg", + "image: map.jpg image: document.jpg", + "image: story1/map.jpg", + "image: https://digital-collections.library.edu/iiif/image123.jpg image: https://archive.org/download/item/photo.jpg", + ":::accordion ## 1520-1550: Conquista Las fuerzas españolas establecieron control sobre el territorio por medio de varias campañas militares... ## 1550-1600: Asentamiento Se fundaron pueblos coloniales como centros administrativos... ## 1600-1680: Consolidación Se consolidó la economía colonial basada en minería y agricultura... :::", + ":::tabs ## Fuente primaria \"El día 15 de agosto, el virrey decretó...\" (Archivo Colonial, Doc. 234) ## Análisis secundario Las personas historiadoras contemporáneas interpretan este decreto como evidencia de... ## Evidencia arqueológica Las excavaciones en el sitio revelaron... :::", + ":::carousel image: before.jpg alt: Fotografía del sitio en 1920 caption: La *Plaza Mayor* antes de la restauración credit: Archivo Municipal --- image: after.jpg alt: Fotografía del sitio en 2020 caption: La *Plaza Mayor* después de la restauración arqueológica credit: Instituto Nacional de Antropología :::", + ":::bibliography Cobo Betancourt, J. F. (2024). *The Coming of the Kingdom*. Cambridge University Press. Muñoz-Arbeláez, S. (2025). *The New Kingdom of Granada*. Duke University Press. :::" + ], + "table": [ + "Widget Propósito Carrusel Presentación de imágenes con leyendas y créditos Pestañas Paneles conmutables para múltiples perspectivas Acordeón Secciones plegables para contenido secuencial o jerárquico Bibliografía Citas académicas con sangría francesa" + ], + "blockquote": [ + "Los widgets usan automáticamente colores de panel contrastantes para distinción visual. Los widgets de la capa 1 aparecen con los colores de la capa 2 y viceversa." + ], + "img": [] + }, + "text": "Widgets Telar incluye un sistema de widgets interactivos para contenido enriquecido en paneles de historias y páginas personalizadas. Los widgets te permiten insertar carruseles de imágenes, contenido con pestañas y secciones plegables directamente en tu Markdown. Disponible desde v0.4.0. Widgets disponibles Widget Propósito Carrusel Presentación de imágenes con leyendas y créditos Pestañas Paneles conmutables para múltiples perspectivas Acordeón Secciones plegables para contenido secuencial o jerárquico Bibliografía Citas académicas con sangría francesa Sintaxis de widgets Los widgets usan la sintaxis de contenedor estilo CommonMark con triple dos puntos: :::widget_type contenido del widget aquí ::: Carrusel Muestra varias imágenes con controles de navegación, leyendas y créditos. Sintaxis :::carousel image: story1/map.jpg alt: Mapa histórico de la región caption: Mapa de 1650 que muestra los límites coloniales credit: National Archives --- image: story1/document.jpg alt: Documento colonial caption: Decreto real que establece el asentamiento credit: Archivo General de Indias ::: Campos image (obligatorio) — Ruta relativa a telar-content/objects/ , o una URL completa para imágenes externas alt (recomendado) — Descripción para accesibilidad caption (opcional) — Texto que se muestra debajo de la imagen; admite Markdown (ej., *cursivas* ) credit (opcional) — Línea de atribución; admite Markdown width (ancho) y height (alto), opcionales — Las dimensiones de la imagen en píxeles. Si indicas las dos, Telar define el tamaño del carrusel con esos valores y no necesita abrir la imagen. De lo contrario, cada imagen se abre al generar el sitio para medirla, y si está alojada en otro servidor, se descarga completa cada vez. Separa los elementos del carrusel con --- . Imágenes externas Puedes usar URLs completas para imágenes alojadas en otros servidores: image: https://example.org/images/photo.jpg Si las imágenes están alojadas en otros servidores, indica width (ancho) y height (alto) para que no haya que descargar cada una solo para medirla al generar el sitio. Pestañas Organiza contenido en paneles conmutables — útil para presentar diferentes perspectivas, fuentes o categorías. Sintaxis :::tabs ## Relato español Las autoridades reales reportaron que el levantamiento comenzó el... Los registros históricos muestran testimonios contradictorios... ## Perspectiva indígena Las lideresas y los líderes comunitarios organizaron la resistencia... Las tradiciones orales describen una respuesta coordinada... ## Análisis contemporáneo Hoy las personas historiadoras reconocen este evento como... ::: Estructura Cada ## Encabezado crea una pestaña nueva El contenido entre encabezados se convierte en el cuerpo de la pestaña Se admite la sintaxis estándar de Markdown dentro de las pestañas Mínimo 2 pestañas, máximo 4 pestañas Acordeón Crea paneles plegables para secuencias cronológicas, información jerárquica o detalles opcionales que las personas pueden expandir según su interés. Sintaxis :::accordion ## 1600-1650: Primer periodo colonial La corona española estableció estructuras administrativas en todo el territorio. Las poblaciones indígenas se reorganizaron en asentamientos... ## 1650-1700: Consolidación Los sistemas de hacienda se afianzaron a medida que maduraba la economía colonial. ## 1700-1750: Era de reformas Las reformas borbónicas retaron las estructuras de poder existentes... ::: Estructura Cada ## Encabezado crea un panel plegable Todos los paneles empiezan colapsados Se admite la sintaxis estándar de Markdown dentro de los paneles Mínimo 2 paneles, máximo 6 paneles Bibliografía Presenta citas académicas con sangría francesa estándar. Cada cita se separa con una línea en blanco. Disponible desde v1.1.0. Sintaxis :::bibliography Cobo Betancourt, J. F. (2024). *The Coming of the Kingdom: The Muisca, Catholic Reform, and Spanish Colonialism in the New Kingdom of Granada*. Cambridge University Press. Cobo, N. (2021). Creating authority and promoting normative behaviour. En T. Duve, J. L. Egío y C. Birr (Eds.), *The School of Salamanca: A Case of Global Knowledge Production* (pp. 210–244). Brill. Muñoz-Arbeláez, S. (2025). *The New Kingdom of Granada: The Making and Unmaking of Spain's Atlantic Empire*. Duke University Press. ::: Estructura Cada cita se separa con una línea en blanco (doble salto de línea) La sintaxis estándar de Markdown funciona dentro de las entradas ( *cursivas* para títulos, **negrita** , enlaces) Se muestra con sangría francesa — la primera línea queda al margen izquierdo, las líneas siguientes se indentan Un bloque de bibliografía vacío produce una advertencia durante el build Dónde funcionan los widgets Los widgets se pueden usar en: Archivos Markdown de paneles de historias — Contenido de las capas 1, 2 y 3 Páginas personalizadas — Cualquier archivo Markdown en telar-content/texts/pages/ Para los paneles de las historias, se recomienda guardar el contenido con widgets en un archivo Markdown (Método 3: indicar un archivo) en lugar de ingresarlo directamente en una celda de la hoja de cálculo, ya que la sintaxis de triple dos puntos es difícil de manejar en línea. Los widgets usan automáticamente colores de panel contrastantes para distinción visual. Los widgets de la capa 1 aparecen con los colores de la capa 2 y viceversa. Imágenes en widgets Imágenes locales Pon las imágenes en telar-content/objects/ y haz referencia a ellas por nombre de archivo: telar-content/objects/ ├── map.jpg ├── document.jpg └── artifact.jpg image: map.jpg image: document.jpg Si las imágenes están en subcarpetas, incluye la ruta relativa a telar-content/objects/ : image: story1/map.jpg Imágenes externas Usa URLs completas para imágenes alojadas en otros servidores: image: https://digital-collections.library.edu/iiif/image123.jpg image: https://archive.org/download/item/photo.jpg Validación Telar valida los widgets durante el build : Errores (el build falla): Falta el campo image obligatorio en el carrusel Muy pocas o demasiadas pestañas/paneles de acordeón Secciones de contenido vacías Advertencias (el build continúa): Falta texto alt en imágenes del carrusel (impacta accesibilidad) No se encuentran archivos de imagen en las rutas especificadas Revisa la salida del build para ver mensajes de validación de widgets. Ejemplos Línea de tiempo histórica :::accordion ## 1520-1550: Conquista Las fuerzas españolas establecieron control sobre el territorio por medio de varias campañas militares... ## 1550-1600: Asentamiento Se fundaron pueblos coloniales como centros administrativos... ## 1600-1680: Consolidación Se consolidó la economía colonial basada en minería y agricultura... ::: Fuentes comparativas :::tabs ## Fuente primaria \"El día 15 de agosto, el virrey decretó...\" (Archivo Colonial, Doc. 234) ## Análisis secundario Las personas historiadoras contemporáneas interpretan este decreto como evidencia de... ## Evidencia arqueológica Las excavaciones en el sitio revelaron... ::: Comparación de imágenes :::carousel image: before.jpg alt: Fotografía del sitio en 1920 caption: La *Plaza Mayor* antes de la restauración credit: Archivo Municipal --- image: after.jpg alt: Fotografía del sitio en 2020 caption: La *Plaza Mayor* después de la restauración arqueológica credit: Instituto Nacional de Antropología ::: Citas académicas :::bibliography Cobo Betancourt, J. F. (2024). *The Coming of the Kingdom*. Cambridge University Press. Muñoz-Arbeláez, S. (2025). *The New Kingdom of Granada*. Duke University Press. ::: Véase también Historias y Paneles — Usar widgets en paneles de historias Páginas Personalizadas — Usar widgets en páginas independientes Guía de Sintaxis Markdown — Todas las opciones de formato" + }, + "/guia/personalizacion/menu-navegacion/": { + "ids": [ + "actualizar-el-menú", + "agregar-una-nueva-página", + "campos-opcionales", + "campos-requeridos", + "configuración-del-menú-de-navegación", + "crear-tu-archivo-de-navegación", + "cuando-falta-una-etiqueta-de-idioma", + "cuando-no-hay-archivo-de-navegación", + "cómo-funciona", + "cómo-funciona-la-selección-de-idioma", + "ejemplo-completo", + "el-enlace-externo-no-se-abre-en-nueva-pestaña", + "el-menú-no-se-actualiza", + "eliminar-una-página", + "enlaces-externos", + "etiquetas-bilingües", + "etiquetas-claras-y-descriptivas", + "limita-la-longitud-del-menú", + "mejores-prácticas", + "orden-del-menú", + "ordenamiento-consistente", + "paso-1-crea-el-archivo", + "paso-2-define-la-estructura-de-tu-menú", + "página-de-inicio-de-historias", + "páginas-internas", + "qué-es-el-menú-de-navegación", + "reordenar-elementos", + "se-muestra-el-idioma-incorrecto", + "solución-de-problemas", + "tipos-de-elementos-de-menú", + "véase-también", + "índice-de-objetos" + ], + "selectors": { + "h1": [ + "Configuración del menú de navegación" + ], + "h2": [ + "¿Qué es el menú de navegación?", + "Cómo funciona", + "Crear tu archivo de navegación", + "Tipos de elementos de menú", + "Ejemplo completo", + "Etiquetas bilingües", + "Orden del menú", + "Actualizar el menú", + "Cuando no hay archivo de navegación", + "Solución de problemas", + "Mejores prácticas", + "Véase también" + ], + "h3": [ + "Paso 1: crea el archivo", + "Paso 2: define la estructura de tu menú", + "Campos requeridos", + "Campos opcionales", + "Páginas internas", + "Enlaces externos", + "Página de inicio de historias", + "Índice de objetos", + "Cómo funciona la selección de idioma", + "Cuando falta una etiqueta de idioma", + "Agregar una nueva página", + "Eliminar una página", + "Reordenar elementos", + "El menú no se actualiza", + "Se muestra el idioma incorrecto", + "El enlace externo no se abre en nueva pestaña", + "Etiquetas claras y descriptivas", + "Ordenamiento consistente", + "Limita la longitud del menú" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "_data/ ├── navigation.yml # Tu configuración de navegación personalizada ├── objects.json # Datos de objetos generados └── project.json # Datos de proyecto generados", + "menu: - title_en: \"Stories\" titulo_es: \"Historias\" url: \"/\" - title_en: \"Objects\" titulo_es: \"Objetos\" url: \"/objects/\" - title_en: \"About\" titulo_es: \"Acerca de\" url: \"/about/\" - title_en: \"Credits\" titulo_es: \"Créditos\" url: \"/credits/\"", + "- title_en: \"Methodology\" titulo_es: \"Metodología\" url: \"/methodology/\"", + "- title_en: \"Project Archive\" titulo_es: \"Archivo del Proyecto\" url: \"https://archive.example.org\" external: true", + "- title_en: \"Stories\" titulo_es: \"Historias\" url: \"/\"", + "- title_en: \"Objects\" titulo_es: \"Objetos\" url: \"/objects/\"", + "menu: # Página de inicio de historias - title_en: \"Stories\" titulo_es: \"Historias\" url: \"/\" # Catálogo de objetos - title_en: \"Objects\" titulo_es: \"Objetos\" url: \"/objects/\" # Páginas personalizadas - title_en: \"About\" titulo_es: \"Acerca de\" url: \"/about/\" - title_en: \"Methodology\" titulo_es: \"Metodología\" url: \"/methodology/\" - title_en: \"Team\" titulo_es: \"Equipo\" url: \"/team/\" - title_en: \"Credits\" titulo_es: \"Créditos\" url: \"/credits/\" # Enlace externo - title_en: \"Full Archive\" titulo_es: \"Archivo Completo\" url: \"https://archive.example.org\" external: true", + "menu: - title_en: \"Stories\" # Aparece primero ... - title_en: \"Objects\" # Aparece segundo ... - title_en: \"About\" # Aparece tercero ...", + "- title_en: \"Contact\" titulo_es: \"Contacto\" url: \"/contact/\"", + "# - title_en: \"Old Page\" # titulo_es: \"Página Antigua\" # url: \"/old-page/\"", + "menu: # Mueve \"About\" al principio - title_en: \"About\" titulo_es: \"Acerca de\" url: \"/about/\" - title_en: \"Stories\" titulo_es: \"Historias\" url: \"/\" # Resto del menú...", + "- title_en: \"External Resource\" titulo_es: \"Recurso Externo\" url: \"https://example.com\" external: true # Requerido para nueva pestaña", + "- title_en: \"Research Methodology\" titulo_es: \"Metodología de Investigación\"", + "- title_en: \"Info\" titulo_es: \"Info\"", + "# Páginas del proyecto - title_en: \"About\" - title_en: \"Team\" - title_en: \"Methodology\" # Páginas de contenido - title_en: \"Stories\" - title_en: \"Objects\" # Recursos externos - title_en: \"Archive\"" + ], + "table": [ + "Campo Propósito Ejemplo title_en Etiqueta en inglés \"About\" titulo_es Etiqueta en español \"Acerca de\" url URL de la página \"/about/\"", + "Campo Propósito Ejemplo external Abre en nueva pestaña true" + ], + "blockquote": [], + "img": [ + [ + "/images/navigation-menu.png", + "Menú de navegación en el encabezado del sitio" + ] + ] + }, + "text": "Configuración del menú de navegación Personaliza el menú de navegación de tu sitio para incluir páginas personalizadas, enlaces externos y etiquetas bilingües. En el Compositor, organiza la navegación en Inicio y páginas . Esta página documenta el archivo de navegación. ¿Qué es el menú de navegación? El menú de navegación aparece en el encabezado de tu sitio y proporciona enlaces a: Tus historias (generados automáticamente) Páginas personalizadas (Acerca de, Créditos, etc.) Índice de objetos (incluido automáticamente) Recursos externos (opcional) Cómo funciona La navegación se configura a través de _data/navigation.yml . Este enfoque basado en datos te da control completo sobre la estructura y etiquetas del menú. Cuando existe navigation.yml , Telar lo usa para construir el menú. Si el archivo falta, aparece un menú básico incluido en el código, con enlaces a Historias, Objetos y Acerca de. Crear tu archivo de navegación Paso 1: crea el archivo Agrega navigation.yml al directorio _data/ : _data/ ├── navigation.yml # Tu configuración de navegación personalizada ├── objects.json # Datos de objetos generados └── project.json # Datos de proyecto generados Paso 2: define la estructura de tu menú Aquí hay una configuración básica: menu: - title_en: \"Stories\" titulo_es: \"Historias\" url: \"/\" - title_en: \"Objects\" titulo_es: \"Objetos\" url: \"/objects/\" - title_en: \"About\" titulo_es: \"Acerca de\" url: \"/about/\" - title_en: \"Credits\" titulo_es: \"Créditos\" url: \"/credits/\" Campos requeridos Cada elemento del menú necesita: Campo Propósito Ejemplo title_en Etiqueta en inglés \"About\" titulo_es Etiqueta en español \"Acerca de\" url URL de la página \"/about/\" Campos opcionales Campo Propósito Ejemplo external Abre en nueva pestaña true Tipos de elementos de menú Páginas internas Enlaza a páginas dentro de tu sitio: - title_en: \"Methodology\" titulo_es: \"Metodología\" url: \"/methodology/\" La URL debe coincidir con el nombre de archivo de tu página ( methodology.md → /methodology/ ). Enlaces externos Enlaza a recursos externos: - title_en: \"Project Archive\" titulo_es: \"Archivo del Proyecto\" url: \"https://archive.example.org\" external: true Cuando external: true , el enlace se abre en una nueva pestaña con target=\"_blank\" . Página de inicio de historias Enlaza a la lista de historias: - title_en: \"Stories\" titulo_es: \"Historias\" url: \"/\" Índice de objetos Enlaza al catálogo de objetos: - title_en: \"Objects\" titulo_es: \"Objetos\" url: \"/objects/\" Ejemplo completo Aquí hay una configuración de navegación completa para un proyecto de investigación: menu: # Página de inicio de historias - title_en: \"Stories\" titulo_es: \"Historias\" url: \"/\" # Catálogo de objetos - title_en: \"Objects\" titulo_es: \"Objetos\" url: \"/objects/\" # Páginas personalizadas - title_en: \"About\" titulo_es: \"Acerca de\" url: \"/about/\" - title_en: \"Methodology\" titulo_es: \"Metodología\" url: \"/methodology/\" - title_en: \"Team\" titulo_es: \"Equipo\" url: \"/team/\" - title_en: \"Credits\" titulo_es: \"Créditos\" url: \"/credits/\" # Enlace externo - title_en: \"Full Archive\" titulo_es: \"Archivo Completo\" url: \"https://archive.example.org\" external: true Etiquetas bilingües Cómo funciona la selección de idioma Telar muestra las etiquetas del menú según la configuración de idioma de tu sitio ( telar_language en _config.yml ): Si telar_language: en → Muestra etiquetas title_en Si telar_language: es → Muestra etiquetas titulo_es Cuando falta una etiqueta de idioma Si a un elemento del menú le falta la etiqueta del idioma del sitio, Telar sigue este orden: Usa la etiqueta del idioma activo ( title_en o titulo_es ) Si falta, usa la del otro idioma Si faltan las dos, muestra la URL como etiqueta Orden del menú Los elementos del menú aparecen en el orden en que los listas en navigation.yml : menu: - title_en: \"Stories\" # Aparece primero ... - title_en: \"Objects\" # Aparece segundo ... - title_en: \"About\" # Aparece tercero ... Actualizar el menú Agregar una nueva página Cuando creas una nueva página personalizada: Crea el archivo Markdown ( telar-content/texts/pages/contact.md ) Agrégalo a navigation.yml : - title_en: \"Contact\" titulo_es: \"Contacto\" url: \"/contact/\" Reconstruye tu sitio El menú se actualiza automáticamente. Eliminar una página Para eliminar una página del menú: Elimina o comenta la entrada en navigation.yml : # - title_en: \"Old Page\" # titulo_es: \"Página Antigua\" # url: \"/old-page/\" Reconstruye tu sitio El archivo de la página puede permanecer en telar-content/texts/pages/ pero no aparecerá en la navegación. Reordenar elementos Cambia el orden en navigation.yml : menu: # Mueve \"About\" al principio - title_en: \"About\" titulo_es: \"Acerca de\" url: \"/about/\" - title_en: \"Stories\" titulo_es: \"Historias\" url: \"/\" # Resto del menú... Cuando no hay archivo de navegación Si _data/navigation.yml no existe, Telar muestra un menú básico incluido en el código: Stories (página de inicio) Objects (catálogo) About (si existe about.md ) Así tu sitio siempre tiene una navegación básica, incluso sin configuración. Solución de problemas El menú no se actualiza Si tus cambios de menú no aparecen: Verifica sintaxis YAML : Usa un validador YAML para verificar que navigation.yml sea válido Reconstruye el sitio : Ejecuta bundle exec jekyll build para regenerar Limpia caché del navegador : Usa Ctrl+Shift+R (Cmd+Shift+R en Mac) para actualizar forzadamente Verifica ubicación del archivo : El archivo debe estar en _data/navigation.yml (no data/ o _data/nav.yml ) Se muestra el idioma incorrecto Si las etiquetas del menú aparecen en el idioma incorrecto: Verifica telar_language en _config.yml Verifica que estés usando nombres de campo correctos ( title_en y titulo_es , no title o label ) Asegúrate de que ambas etiquetas de idioma estén presentes El enlace externo no se abre en nueva pestaña Agrega el campo external: true : - title_en: \"External Resource\" titulo_es: \"Recurso Externo\" url: \"https://example.com\" external: true # Requerido para nueva pestaña Mejores prácticas Etiquetas claras y descriptivas Usa etiquetas que describan claramente el destino: ✓ Bien: - title_en: \"Research Methodology\" titulo_es: \"Metodología de Investigación\" ✗ Evita: - title_en: \"Info\" titulo_es: \"Info\" Ordenamiento consistente Mantén elementos relacionados juntos: # Páginas del proyecto - title_en: \"About\" - title_en: \"Team\" - title_en: \"Methodology\" # Páginas de contenido - title_en: \"Stories\" - title_en: \"Objects\" # Recursos externos - title_en: \"Archive\" Limita la longitud del menú Mantén menús enfocados (5-7 elementos es ideal). Para sitios más grandes, considera agrupar contenido de manera diferente o usar enlaces de pie de página para páginas secundarias. Véase también Páginas Personalizadas - Crear páginas para enlazar en la navegación Referencia de Configuración - Opciones completas de _config.yml incluyendo telar_language Resumen de Personalización - Otras opciones de personalización Nuevo en v0.6.0 : Navegación personalizable con etiquetas bilingües y soporte para enlaces externos." + }, + "/docs/getting-started/review-refine/": { + "ids": [ + "check-the-main-story-and-optional-routes", + "complete-the-exhibition", + "frame-review-and-publish-from-sheets", + "handle-private-or-unfinished-work", + "keep-building", + "make-stories-private-optional", + "media-coordinates-docs-getting-started-review-refine", + "next-steps", + "publish-a-sheet-revision", + "review-and-refine", + "set-each-images-framing", + "set-your-image-coordinates" + ], + "selectors": { + "h1": [ + "Frame, review and publish from Sheets" + ], + "h2": [ + "Set each image's framing", + "Check the main story and optional routes", + "Publish a sheet revision", + "Handle private or unfinished work", + "Complete the exhibition" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [ + [ + "/assets/manual/tutorials/en-coordinates-poster.jpg", + "The khipu is framed on its object page, then the coordinate panel copies X, Y and Zoom for Sheets." + ] + ] + }, + "text": "Frame, review and publish from Sheets Use the first build to choose precise views and test the narrative. Keep the sheet as your source while you revise. Set each image's framing Open the intended object's page on the built site. Choose Identify coordinates . Select the document page if it has more than one. Pan and zoom to the detail for your step. Copy the X, Y and Zoom values into that step's row. Rebuild and revisit the step. For the khipu example, frame the khipu image itself. Do not substitute a view from another object just because its coordinate tool is already open. Frame the khipu, scroll to the coordinate panel and copy the values for Sheets or CSV. This is a local example built with Telar. Play steps Open full-size screenshot ↗ Download GIF Check the main story and optional routes Read the questions and short answers in sequence. Verify that the source and view support each observation. Open every first and second panel, follow glossary links and return to the story. Check the ending, the homepage story order and the menu. Test a narrow window and keyboard navigation. Use the reader-testing guide for a structured review with another person. Publish a sheet revision A sheet edit does not trigger the repository workflow by itself. Run Build and Deploy from Actions when you want to publish the latest sheet content. Open the run's log if it fails. Confirm the published spreadsheet address and that the required tabs remain published. If the site loads but a source does not, check the object ID and source URL rather than changing unrelated configuration. Handle private or unfinished work A private story uses the private project column and a story_key in the configuration. Read private stories before using it. A key does not make externally hosted images private. Keep unfinished work out of the published story list until it is ready. The Compositor's draft flag is an editor workflow; do not assume that marking a row private removes it from publication. Complete the exhibition Edit the homepage introduction and supporting pages, review credits and disable demo content when the examples no longer belong. Rebuild and inspect the public result once more. Keep the spreadsheet, repository and public-site addresses together. Record which one is the editing source so collaborators know where to make the next change." + }, + "/guia/configurar/configuracion/": { + "ids": [ + "ajustes-avanzados", + "ajustes-de-la-interfaz-de-colección", + "ajustes-de-la-interfaz-de-historias", + "ajustes-del-build", + "ajustes-del-sitio", + "baseurl-vs-url", + "browse_and_search", + "christmas_tree_mode", + "colecciones", + "collection_mode", + "configuración", + "defaults", + "detección-de-idioma-en-metadatos-iiif", + "ejemplo-completo", + "featured_count", + "funciones-de-desarrollo", + "hide_warnings", + "include_demo_content", + "integración-con-google-sheets", + "interfaz-multilingüe", + "logo-del-sitio", + "pasos-de-configuración", + "plugins", + "protección-de-historias", + "qué-permanece-en-tu-idioma", + "qué-se-traduce", + "selección-de-tema", + "show_link_on_homepage", + "show_object_credits", + "show_on_homepage", + "show_sample_on_homepage", + "show_story_steps", + "skip_collections", + "skip_stories", + "temas-disponibles", + "versión-de-telar", + "viewer_preloading", + "véase-también" + ], + "selectors": { + "h1": [ + "Configuración" + ], + "h2": [ + "Ajustes del sitio", + "Selección de tema", + "Interfaz multilingüe", + "Integración con Google Sheets", + "Ajustes de la interfaz de historias", + "Ajustes de la interfaz de colección", + "Protección de historias", + "Ajustes avanzados", + "Ejemplo completo", + "Véase también" + ], + "h3": [ + "collection_mode", + "baseurl vs. url", + "Logo del sitio", + "Temas disponibles", + "Qué se traduce", + "Qué permanece en tu idioma", + "Detección de idioma en metadatos IIIF", + "Pasos de configuración", + "show_on_homepage", + "show_story_steps", + "include_demo_content", + "show_object_credits", + "browse_and_search", + "show_link_on_homepage", + "show_sample_on_homepage", + "featured_count", + "Colecciones", + "Defaults", + "Ajustes del build", + "Plugins", + "Versión de Telar", + "Funciones de desarrollo" + ], + "h4": [ + "christmas_tree_mode", + "hide_warnings", + "viewer_preloading", + "skip_stories", + "skip_collections" + ], + "h5": [], + "h6": [], + "pre": [ + "# Site Settings title: Título de tu Narrativa description: Una breve descripción de tu exhibición narrativa baseurl: \"/nombre-repositorio\" # Para un subdirectorio en GitHub Pages url: \"https://usuario.github.io\" author: Tu Nombre email: tu-email@ejemplo.com telar_theme: \"paisajes\" # Opciones: paisajes, neogranadina, santa-barbara, austin, o custom logo: \"\" # Ruta a imagen de logo (opcional) telar_language: \"en\" # Opciones: \"en\" (English), \"es\" (Español) collection_mode: false # Ponlo en true para una página principal centrada en objetos", + "# Subdirectorio en GitHub Pages url: \"https://usuario.github.io\" baseurl: \"/sitio-telar\" # Resultado: https://usuario.github.io/sitio-telar # Dominio personalizado en la raíz url: \"https://misitio.org\" baseurl: \"\" # Resultado: https://misitio.org", + "logo: \"/telar-content/objects/mi-logo.png\"", + "telar_theme: \"paisajes\" # Opciones: paisajes, neogranadina, santa-barbara, austin, o custom", + "telar_language: \"en\" # Opciones: \"en\" (English), \"es\" (Español)", + "google_sheets: enabled: true published_url: \"https://docs.google.com/spreadsheets/d/e/TU_ID_PUBLICADO/pubhtml\"", + "story_interface: show_on_homepage: true # Ponlo en false para ocultar la sección de historias de la página principal show_story_steps: true # Ponlo en false para ocultar la superposición \"Step X\" show_object_credits: true # Ponlo en false para ocultar la etiqueta de créditos en objetos include_demo_content: false # Ponlo en true para habilitar historias de demostración", + "collection_interface: browse_and_search: true # Ponlo en false para desactivar la barra lateral de filtros y la búsqueda show_link_on_homepage: true # Ponlo en false para ocultar el enlace \"View the objects\" show_sample_on_homepage: true # Ponlo en true para mostrar objetos de muestra en la página principal featured_count: 4 # Cantidad de objetos a mostrar en la página principal", + "story_key: \"tu-clave-secreta\"", + "collections: stories: output: true permalink: /stories/:name/ objects: output: true permalink: /objects/:name/ glossary: output: true permalink: /glossary/:name/ pages: output: true permalink: /:name/ # Collections Directory collections_dir: _jekyll-files", + "defaults: - scope: path: \"\" type: \"stories\" values: layout: \"story\" - scope: path: \"\" type: \"objects\" values: layout: \"object\" - scope: path: \"\" type: \"glossary\" values: layout: \"glossary\" - scope: path: \"\" type: \"pages\" values: layout: \"user-page\"", + "markdown: kramdown permalink: pretty exclude: - Gemfile - Gemfile.lock - node_modules - vendor - .github - README.md - docs/ - scripts/ # Indica a Jekyll que no espere fechas para las colecciones future: true show_drafts: false", + "plugins: - jekyll-seo-tag", + "telar: version: \"1.8.3\" release_date: \"2026-10-31\"", + "development-features: christmas_tree_mode: false hide_warnings: false viewer_preloading: max_viewer_cards: 8 preload_steps: 6 loading_threshold: 5 min_ready_viewers: 3 skip_stories: false skip_collections: false", + "# Site Settings title: Textiles Coloniales description: Una exhibición de textiles de la era colonial de las Américas baseurl: \"/textiles-coloniales\" url: \"https://usuario.github.io\" author: Jane Smith email: jane@ejemplo.com telar_theme: \"paisajes\" logo: \"\" telar_language: \"es\" collection_mode: false # Story Interface Settings story_interface: show_on_homepage: true show_story_steps: true show_object_credits: true include_demo_content: false # Collection Interface Settings collection_interface: browse_and_search: true show_link_on_homepage: true show_sample_on_homepage: true featured_count: 4 # Story Protection (opcional) # story_key: \"tu-clave-secreta\" # Google Sheets Integration (opcional) google_sheets: enabled: true published_url: \"https://docs.google.com/spreadsheets/d/e/XYZ789/pubhtml\" # # PLEASE DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING # # Collections collections: stories: output: true permalink: /stories/:name/ objects: output: true permalink: /objects/:name/ glossary: output: true permalink: /glossary/:name/ pages: output: true permalink: /:name/ collections_dir: _jekyll-files # Build Settings markdown: kramdown permalink: pretty exclude: - Gemfile - Gemfile.lock - node_modules - vendor - .github - README.md - docs/ - scripts/ # Defaults defaults: - scope: path: \"\" type: \"stories\" values: layout: \"story\" - scope: path: \"\" type: \"objects\" values: layout: \"object\" - scope: path: \"\" type: \"glossary\" values: layout: \"glossary\" - scope: path: \"\" type: \"pages\" values: layout: \"user-page\" future: true show_drafts: false # Telar Settings telar: version: \"1.8.3\" release_date: \"2026-10-31\" # Plugins plugins: - jekyll-seo-tag # WEBrick server configuration for development (enables CORS for IIIF) webrick: headers: Access-Control-Allow-Origin: \"*\" Access-Control-Allow-Methods: \"GET, POST, OPTIONS\" Access-Control-Allow-Headers: \"Content-Type\" # Development & Testing development-features: christmas_tree_mode: false hide_warnings: false viewer_preloading: max_viewer_cards: 8 preload_steps: 6 loading_threshold: 5 min_ready_viewers: 3 skip_stories: false skip_collections: false" + ], + "table": [], + "blockquote": [ + "Si necesitas un sitio completamente bilingüe con contenido en múltiples idiomas, deberás crear sitios Telar separados para cada idioma.", + "Solo se necesita la URL publicada. Si tu configuración todavía tiene una línea shared_url de una versión anterior, se ignora sin problemas.", + "La protección de historias usa encriptación del lado del cliente. Previene el acceso casual pero no es adecuada para contenido altamente sensible. Para mayor seguridad, usa un repositorio privado de GitHub.", + "No editar El _config.yml de Telar incluye una línea: \"PLEASE DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING\". Las secciones debajo de esta línea están configuradas automáticamente y rara vez necesitan cambios.", + "Normalmente no necesitas modificar la configuración de colecciones, a menos que estés haciendo una personalización avanzada.", + "Renombrado desde hide_stories en v0.8.0. El nombre anterior sigue funcionando por compatibilidad.", + "Cuando skip_collections está habilitado, skip_stories se activa automáticamente. Renombrado desde hide_collections en v0.8.0 — el nombre anterior sigue funcionando por compatibilidad." + ], + "img": [] + }, + "text": "Configuración Configura tu sitio Telar usando el archivo _config.yml en la raíz de tu repositorio. Ajustes del sitio Información básica y apariencia del sitio: # Site Settings title: Título de tu Narrativa description: Una breve descripción de tu exhibición narrativa baseurl: \"/nombre-repositorio\" # Para un subdirectorio en GitHub Pages url: \"https://usuario.github.io\" author: Tu Nombre email: tu-email@ejemplo.com telar_theme: \"paisajes\" # Opciones: paisajes, neogranadina, santa-barbara, austin, o custom logo: \"\" # Ruta a imagen de logo (opcional) telar_language: \"en\" # Opciones: \"en\" (English), \"es\" (Español) collection_mode: false # Ponlo en true para una página principal centrada en objetos collection_mode Cambia el diseño de la página principal de historias primero (predeterminado) a objetos primero: false (predeterminado) : Las historias aparecen primero en la página principal, con una muestra de objetos debajo true : Los objetos aparecen primero en una cuadrícula grande (hasta 8), con las historias en una cuadrícula más pequeña debajo Este es un ajuste de nivel superior — no está anidado dentro de collection_interface: . Consulta Personalizar la página de inicio para detalles del diseño. Nuevo en v1.1.0. baseurl vs. url url : Dominio base de tu sitio baseurl : Ruta después del dominio (usa \"\" para el dominio raíz, o /nombre-repo para GitHub Pages) Ejemplos: # Subdirectorio en GitHub Pages url: \"https://usuario.github.io\" baseurl: \"/sitio-telar\" # Resultado: https://usuario.github.io/sitio-telar # Dominio personalizado en la raíz url: \"https://misitio.org\" baseurl: \"\" # Resultado: https://misitio.org Logo del sitio Agrega un logo para reemplazar el título del sitio en la barra de navegación: logo: \"/telar-content/objects/mi-logo.png\" Pon la imagen de tu logo en telar-content/objects/ Déjalo vacío ( logo: \"\" ) para mostrar el título del sitio como texto Dimensiones recomendadas: máximo 80px de alto, 200-300px de ancho Admite formatos PNG, JPG, SVG Selección de tema Telar incluye 4 temas predefinidos: telar_theme: \"paisajes\" # Opciones: paisajes, neogranadina, santa-barbara, austin, o custom Temas disponibles paisajes (predeterminado): Tonos tierra con terracota y oliva neogranadina : Burdeos colonial y dorado santa-barbara : Turquesa y coral modernos austin : Naranja quemado y azul pizarra Consulta Personalización: Temas para ver detalles y cómo crear temas personalizados. Interfaz multilingüe Telar v0.4.0+ admite interfaces en inglés y español: telar_language: \"en\" # Opciones: \"en\" (English), \"es\" (Español) Esta opción controla el idioma de los elementos de la interfaz, incluyendo navegación, botones, etiquetas, mensajes de error e instrucciones. Qué se traduce El ajuste telar_language cambia el idioma de: Menú de navegación : Home , Objects , Stories , Glossary , About Botones : Copy , Back , Learn More , Go Deeper , etc. Campos de metadatos : Creator , Period , Medium , Location , Credit , etc. Mensajes de error : Todas las advertencias IIIF, errores de validación y problemas de configuración Interfaz de historias : Indicadores de paso, encabezados de panel, herramienta de coordenadas Páginas de objetos : Etiquetas de manifiestos IIIF, instrucciones de coordenadas Glosario : Encabezados de panel y elementos de navegación Qué permanece en tu idioma El ajuste telar_language no traduce tu contenido: Narrativas y texto de panel (archivos Markdown que escribes) Descripciones de objetos y metadatos (datos de tu CSV) Definiciones del glosario Contenido de la página About Título y descripción del sitio Si necesitas un sitio completamente bilingüe con contenido en múltiples idiomas, deberás crear sitios Telar separados para cada idioma. Detección de idioma en metadatos IIIF Cuando Telar extrae metadatos de manifiestos IIIF, respeta tu ajuste telar_language : Para sitios en inglés ( en ): Prioriza metadatos en inglés y recurre a otros idiomas si no existen Para sitios en español ( es ): Prioriza metadatos en español, luego en inglés, y finalmente en otros idiomas Así, los metadatos se muestran en el idioma más adecuado disponible desde la institución fuente. Integración con Google Sheets Gestiona contenido mediante Google Sheets en lugar de editar archivos CSV directamente: google_sheets: enabled: true published_url: \"https://docs.google.com/spreadsheets/d/e/TU_ID_PUBLICADO/pubhtml\" Pasos de configuración Obtén la plantilla : Duplica la plantilla en bit.ly/telar-template Publica tu hoja : File → Share → Publish to web Pega la URL publicada en _config.yml Pon enabled: true Confirma los cambios Descarga automatizada: GitHub Pages : GitHub Actions descubre automáticamente los GIDs de pestañas y obtiene los CSV Desarrollo local : Ejecuta python3 scripts/fetch_google_sheets.py antes de construir el sitio Solo se necesita la URL publicada. Si tu configuración todavía tiene una línea shared_url de una versión anterior, se ignora sin problemas. Consulta Referencia de Google Sheets para instrucciones completas de configuración. Ajustes de la interfaz de historias Controla cómo se muestran y se comportan las historias: story_interface: show_on_homepage: true # Ponlo en false para ocultar la sección de historias de la página principal show_story_steps: true # Ponlo en false para ocultar la superposición \"Step X\" show_object_credits: true # Ponlo en false para ocultar la etiqueta de créditos en objetos include_demo_content: false # Ponlo en true para habilitar historias de demostración show_on_homepage Controla si la sección de historias aparece en la página principal: true (predeterminado) : Las historias aparecen en la página principal como tarjetas false : Oculta la sección de historias de la página principal (las historias siguen accesibles por URL directa) Úsalo cuando quieras tener objetos en la página principal pero prefieras que las historias se accedan a través de la navegación o enlaces directos en lugar de las tarjetas de la página principal. show_story_steps Controla si el indicador Step X aparece en la esquina superior izquierda de la página de la historia. true (predeterminado) : Muestra Step 1 , Step 2 , etc. en la página de la historia false : Oculta los indicadores para una experiencia más limpia e inmersiva Es solo un cambio visual; las personas siguen pudiendo navegar por los pasos normalmente. include_demo_content Habilita historias de demostración pre-construidas que muestran las funcionalidades de Telar: false (predeterminado) : El sitio contiene solo tu contenido true : Agrega historias de tutorial y ejemplos a tu sitio Las historias de demostración aparecen junto con tu propio contenido con una etiqueta de \"Contenido de demostración\". Se obtienen automáticamente durante el build y se ajustan al idioma de tu sitio. Cuándo habilitar: Aprendiendo cómo estructurar historias Probando funcionalidades de Telar sin crear contenido Mostrando a partes interesadas lo que Telar puede hacer Cuándo deshabilitar: Publicando tu sitio de producción final Probando solo tu propio contenido Consulta Contenido de Demostración para detalles completos sobre las demos disponibles. show_object_credits Controla la etiqueta de atribución de créditos en páginas de objetos: true (predeterminado) : Muestra etiqueta de créditos en todos los objetos con información de crédito false : Oculta la etiqueta de créditos (la información de crédito sigue accesible mediante la tabla de metadatos) La etiqueta de créditos se muestra en la esquina superior derecha de las imágenes de objetos, mostrando la atribución del campo credit en tu objects.csv . Ajustes de la interfaz de colección Controla cómo se muestra y se comporta la galería de objetos: collection_interface: browse_and_search: true # Ponlo en false para desactivar la barra lateral de filtros y la búsqueda show_link_on_homepage: true # Ponlo en false para ocultar el enlace \"View the objects\" show_sample_on_homepage: true # Ponlo en true para mostrar objetos de muestra en la página principal featured_count: 4 # Cantidad de objetos a mostrar en la página principal browse_and_search Controla la barra lateral de filtrado y la búsqueda de texto completo de la galería: true (predeterminado) : La página de objetos muestra una barra lateral de filtros con facetas (tipo, creador, periodo, temas) y una barra de búsqueda con Lunr.js false : La página de objetos muestra una cuadrícula simple sin filtrado ni búsqueda show_link_on_homepage Controla el enlace \"View the objects\" en la página principal: true (predeterminado) : Muestra un enlace a la galería de objetos en la página principal false : Oculta el enlace (la página de objetos sigue accesible a través de la navegación) show_sample_on_homepage Controla si los objetos de muestra aparecen en la página principal: true (predeterminado) : Muestra una muestra de objetos en la página principal, tomados de los marcados como featured en objects.csv (o aleatorios si ninguno está destacado) false : No se muestran objetos en la página principal featured_count Cantidad de objetos a mostrar en la página principal cuando show_sample_on_homepage es true: Predeterminado : 4 Prioriza objetos marcados featured: yes en objects.csv Si hay menos objetos destacados que featured_count , llena los espacios restantes aleatoriamente Protección de historias Encripta historias para que solo las personas con la clave correcta puedan acceder a ellas: story_key: \"tu-clave-secreta\" Las historias con private: yes en project.csv se encriptan cuando el build termina (también se acepta protected como nombre de columna) Las personas acceden a historias privadas mediante un parámetro de URL: ?key=tu-clave-secreta Deja story_key vacío u omítelo para desactivar la protección de historias Si alguna historia está marcada private: yes , el build falla en lugar de publicarla en texto plano — ya sea porque falta story_key , o porque el flujo de trabajo Build and Deploy no ejecuta el paso de encriptación (los sitios actualizados desde antes de v1.6.0 necesitan agregarlo a mano) Consulta Historias privadas para la configuración, las pruebas locales y los detalles de los fallos del build La protección de historias usa encriptación del lado del cliente. Previene el acceso casual pero no es adecuada para contenido altamente sensible. Para mayor seguridad, usa un repositorio privado de GitHub. Ajustes avanzados Los siguientes ajustes están pre-configurados y normalmente no necesitan modificación a menos que estés haciendo una personalización avanzada. No editar El _config.yml de Telar incluye una línea: \"PLEASE DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING\". Las secciones debajo de esta línea están configuradas automáticamente y rara vez necesitan cambios. Colecciones Las colecciones Jekyll definen tipos de contenido: collections: stories: output: true permalink: /stories/:name/ objects: output: true permalink: /objects/:name/ glossary: output: true permalink: /glossary/:name/ pages: output: true permalink: /:name/ # Collections Directory collections_dir: _jekyll-files Normalmente no necesitas modificar la configuración de colecciones, a menos que estés haciendo una personalización avanzada. El ajuste collections_dir indica a Jekyll dónde encontrar los archivos de trabajo autogenerados. Defaults Valores predeterminados de plantilla para cada colección: defaults: - scope: path: \"\" type: \"stories\" values: layout: \"story\" - scope: path: \"\" type: \"objects\" values: layout: \"object\" - scope: path: \"\" type: \"glossary\" values: layout: \"glossary\" - scope: path: \"\" type: \"pages\" values: layout: \"user-page\" Ajustes del build Configuración estándar del build de Jekyll: markdown: kramdown permalink: pretty exclude: - Gemfile - Gemfile.lock - node_modules - vendor - .github - README.md - docs/ - scripts/ # Indica a Jekyll que no espere fechas para las colecciones future: true show_drafts: false Plugins Plugin necesario: plugins: - jekyll-seo-tag Se instala automáticamente cuando ejecutas bundle install . Versión de Telar Información de versión (actualizada automáticamente durante lanzamientos): telar: version: \"1.8.3\" release_date: \"2026-10-31\" Funciones de desarrollo Opciones para desarrollo, pruebas y situaciones especiales (por favor no edites estos ajustes a menos que sepas lo que estás haciendo): development-features: christmas_tree_mode: false hide_warnings: false viewer_preloading: max_viewer_cards: 8 preload_steps: 6 loading_threshold: 5 min_ready_viewers: 3 skip_stories: false skip_collections: false christmas_tree_mode Muestra todos los mensajes de advertencia para probar el soporte multilingüe: false (predeterminado) : Operación normal true : Muestra objetos de prueba con errores falsos para verificar que los mensajes de advertencia se muestren correctamente Usa esto solo al probar traducciones o el estilo de mensajes de advertencia. hide_warnings Oculta en el sitio publicado las advertencias que genera el build : false (predeterminado) : Las advertencias sobre tu contenido (imágenes que faltan, problemas con IIIF, entradas del glosario que no existen, errores de configuración) aparecen en las páginas a las que se refieren, para que puedas verlas y corregirlas true : Los visitantes no ven las advertencias, pero el registro del build las sigue mostrando Usa esto solo cuando hayas revisado una advertencia y sepas que no afecta tu sitio. Mientras esté activado, tampoco verás en el sitio las advertencias de problemas nuevos. viewer_preloading Controla cómo se precargan los visores de historias para una navegación más fluida: max_viewer_cards (predeterminado: 8, máximo: 15): La cantidad máxima de escenas cuyo visor se mantiene cargado; al superarla, se descarga el de la escena más alejada del paso actual preload_steps (predeterminado: 6): Pasos a precargar por delante de la posición actual loading_threshold (predeterminado: 5): Mostrar el efecto de carga en la introducción si la historia tiene este número o más de visores min_ready_viewers (predeterminado: 3): Ocultar el efecto de carga cuando esté lista esta cantidad de visores Valores más altos = navegación más fluida pero mayor uso de memoria. Los valores predeterminados funcionan bien para la mayoría de los sitios. skip_stories Construye un sitio sin historias, manteniendo solo los objetos visibles: false (predeterminado) : Las historias se generan y muestran normalmente true : Omite la generación de historias y oculta la sección de historias de la página de inicio Usa esto cuando quieras mostrar objetos sin historias narrativas, o al construir un sitio estilo catálogo. Renombrado desde hide_stories en v0.8.0. El nombre anterior sigue funcionando por compatibilidad. skip_collections Construye un sitio con solo páginas personalizadas (sin objetos ni historias): false (predeterminado) : Los objetos e historias se generan normalmente true : Omite la generación de objetos e historias, oculta la sección de historias y la muestra de objetos de la página de inicio, elimina /objects/ de la navegación Usa esto al construir un sitio con solo páginas personalizadas (como una página \"Acerca de\" o de inicio) sin ninguna colección. Cuando skip_collections está habilitado, skip_stories se activa automáticamente. Renombrado desde hide_collections en v0.8.0 — el nombre anterior sigue funcionando por compatibilidad. Ejemplo completo Aquí hay un ejemplo completo de _config.yml : # Site Settings title: Textiles Coloniales description: Una exhibición de textiles de la era colonial de las Américas baseurl: \"/textiles-coloniales\" url: \"https://usuario.github.io\" author: Jane Smith email: jane@ejemplo.com telar_theme: \"paisajes\" logo: \"\" telar_language: \"es\" collection_mode: false # Story Interface Settings story_interface: show_on_homepage: true show_story_steps: true show_object_credits: true include_demo_content: false # Collection Interface Settings collection_interface: browse_and_search: true show_link_on_homepage: true show_sample_on_homepage: true featured_count: 4 # Story Protection (opcional) # story_key: \"tu-clave-secreta\" # Google Sheets Integration (opcional) google_sheets: enabled: true published_url: \"https://docs.google.com/spreadsheets/d/e/XYZ789/pubhtml\" # # PLEASE DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING # # Collections collections: stories: output: true permalink: /stories/:name/ objects: output: true permalink: /objects/:name/ glossary: output: true permalink: /glossary/:name/ pages: output: true permalink: /:name/ collections_dir: _jekyll-files # Build Settings markdown: kramdown permalink: pretty exclude: - Gemfile - Gemfile.lock - node_modules - vendor - .github - README.md - docs/ - scripts/ # Defaults defaults: - scope: path: \"\" type: \"stories\" values: layout: \"story\" - scope: path: \"\" type: \"objects\" values: layout: \"object\" - scope: path: \"\" type: \"glossary\" values: layout: \"glossary\" - scope: path: \"\" type: \"pages\" values: layout: \"user-page\" future: true show_drafts: false # Telar Settings telar: version: \"1.8.3\" release_date: \"2026-10-31\" # Plugins plugins: - jekyll-seo-tag # WEBrick server configuration for development (enables CORS for IIIF) webrick: headers: Access-Control-Allow-Origin: \"*\" Access-Control-Allow-Methods: \"GET, POST, OPTIONS\" Access-Control-Allow-Headers: \"Content-Type\" # Development & Testing development-features: christmas_tree_mode: false hide_warnings: false viewer_preloading: max_viewer_cards: 8 preload_steps: 6 loading_threshold: 5 min_ready_viewers: 3 skip_stories: false skip_collections: false Véase también Validador de Configuración — Revisa tu _config.yml en busca de errores comunes Generador y editor de configuración — Genera o edita un archivo _config.yml Personaliza tu Tema Personaliza tu Página de Inicio Configura el Menú de Navegación Contenido de Demostración Historias Privadas Referencia CSV: Proyecto y Objetos GitHub Actions" + }, + "/docs/getting-started/google-sheets/": { + "ids": [ + "create-your-repository", + "duplicate-the-google-sheets-template", + "enable-github-pages", + "generate-your-configuration", + "gqs-author", + "gqs-copied", + "gqs-copy", + "gqs-description", + "gqs-download", + "gqs-generate", + "gqs-include-demo-content", + "gqs-lines", + "gqs-output", + "gqs-output-actions", + "gqs-output-wrapper", + "gqs-published-url", + "gqs-published-url-error", + "gqs-published-url-warn", + "gqs-repo", + "gqs-repo-error", + "gqs-repo-group", + "gqs-repo-warn", + "gqs-sheets-group", + "gqs-site-group", + "gqs-template", + "gqs-theme", + "gqs-title", + "gqs-title-warn", + "gqs-url-preview", + "gqs-username", + "gqs-username-error", + "next-steps", + "publish-your-sheet", + "set-up-with-google-sheets", + "verify-your-setup" + ], + "selectors": { + "h1": [ + "Set Up with Google Sheets" + ], + "h2": [ + "Create Your Repository", + "Enable GitHub Pages", + "Duplicate the Google Sheets Template", + "Publish Your Sheet", + "Generate Your Configuration", + "Verify Your Setup", + "Next Steps" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [ + "Already familiar with GitHub Pages and YAML? You can configure everything manually with the Manual Setup guide.", + "Keep your repository public. Private repositories will not work with GitHub Pages unless you have a paid GitHub plan.", + "Build problems? Check that your Google Sheets published URL is correct — it should come from File → Share → Publish to web. If your site does not appear at all, check the Actions tab for error details. You can also paste your _config.yml into the Telar Config Validator to check for errors." + ], + "img": [ + [ + "/images/use-this-template.png", + "GitHub screenshot: Use this template button" + ], + [ + "/images/github-actions.gif", + "Setting up GitHub Pages with GitHub Actions" + ], + [ + "/images/telar-homepage.png", + "Telar homepage with title and navigation menu" + ] + ] + }, + "text": "Set Up with Google Sheets This guide walks you through setting up a Telar exhibition using Google Sheets to manage your content. Interactive tools on this page generate your configuration file automatically. You'll set up three things: a GitHub repository for your site, a Google Sheets spreadsheet for your content, and a configuration file to connect them. You'll enter a few details as you go — your GitHub username, your spreadsheet link, a title for your site. At the end of this page, you'll download a ready-to-use configuration file. You will need: A GitHub account (free) A Google account for Google Sheets (free) Already familiar with GitHub Pages and YAML? You can configure everything manually with the Manual Setup guide . The setup might feel like a lot of steps, but you only have to do it once. After that, everything happens in your Google Sheets spreadsheet. Create Your Repository A repository is your project's home on GitHub — it holds your configuration and image files. Visit the Telar template Click the green Use this template button Choose Create a new repository Give your repository a name — use lowercase letters and hyphens (e.g., my-exhibition ) — this will be part of your site's web address Make sure Public is selected Click Create repository Keep your repository public. Private repositories will not work with GitHub Pages unless you have a paid GitHub plan. Enter your GitHub details below. These are used to build your site's web address and to generate your configuration file at the end. Your GitHub Details GitHub username Repository name Your site will be at: https:// username .github.io/ my-exhibition Enable GitHub Pages GitHub Pages turns your repository into a live website for free. In your repository, go to Settings → Pages Under Source , select GitHub Actions Click Save Duplicate the Google Sheets Template Your Google Sheets spreadsheet is where you manage all your content — objects, stories, and text. Go to https://bit.ly/telar-template Click File → Make a copy Save to your Google Drive with a name you will remember (e.g., \"My Telar Exhibition\") Publish Your Sheet Your spreadsheet needs to be published so Telar can read your content during builds. Go to File → Share → Publish to web Click Publish Copy the published URL and paste it below Your Google Sheets URL Published URL From File → Share → Publish to web Generate Your Configuration Fill in the remaining details and this page will create your configuration file. Site Details Title Your site's display name, shown in the browser tab and header Description (optional) Used for search engine metadata and social sharing previews Author (optional) Theme trama paisajes neogranadina santa-barbara austin Controls your site's color scheme and visual style Include demo content Fetches tutorial stories from the Telar content server. These show a \"Demo\" badge and help new users explore the interface. Turn off for production sites. Generate _config.yml Your _config.yml 1 Copy Download Copied! Once generated: In your GitHub repository, navigate to _config.yml and click the pencil icon to edit Select all the existing content and replace it with what you copied or downloaded Click Commit changes to save Verify Your Setup After committing, GitHub Actions will automatically build and publish your site. This takes 2–5 minutes. Click the Actions tab to watch the build progress When it finishes, visit your site at the URL shown in the preview above You should see a Telar site with your title and the default demo content Build problems? Check that your Google Sheets published URL is correct — it should come from File → Share → Publish to web. If your site does not appear at all, check the Actions tab for error details. You can also paste your _config.yml into the Telar Config Validator to check for errors. Next Steps The connection is ready. Continue with the spreadsheet model , then add an object and your first story. Use the planning guide if you have not yet drafted the narrative. Plan Your Narrative — Understand how stories, steps, and panels fit together Add Your Content — Upload images, fill in your spreadsheet, and create your first story Review and Refine — Set image coordinates, review your site, and polish" + }, + "/guia/primeros-pasos/google-sheets/": { + "ids": [ + "activa-github-pages", + "configura-con-google-sheets", + "configura-tu-sitio", + "crea-tu-repositorio", + "duplica-la-plantilla-de-google-sheets", + "genera-tu-configuración", + "gqs-author", + "gqs-copied", + "gqs-copy", + "gqs-description", + "gqs-download", + "gqs-generate", + "gqs-include-demo-content", + "gqs-lines", + "gqs-output", + "gqs-output-actions", + "gqs-output-wrapper", + "gqs-published-url", + "gqs-published-url-error", + "gqs-published-url-warn", + "gqs-repo", + "gqs-repo-error", + "gqs-repo-group", + "gqs-repo-warn", + "gqs-sheets-group", + "gqs-site-group", + "gqs-template", + "gqs-theme", + "gqs-title", + "gqs-title-warn", + "gqs-url-preview", + "gqs-username", + "gqs-username-error", + "próximos-pasos", + "publica-tu-hoja-de-cálculo", + "verifica-tu-configuración" + ], + "selectors": { + "h1": [ + "Configura con Google Sheets" + ], + "h2": [ + "Configura tu sitio", + "Crea tu repositorio", + "Activa GitHub Pages", + "Duplica la plantilla de Google Sheets", + "Publica tu hoja de cálculo", + "Genera tu configuración", + "Verifica tu configuración", + "Próximos pasos" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [ + "¿Ya conoces GitHub Pages y YAML? Puedes configurar todo manualmente con la guía de configuración manual.", + "Mantén tu repositorio público. Los repositorios privados no funcionan con GitHub Pages a menos que tengas un plan de pago en GitHub.", + "¿Problemas con el build? Verifica que la URL publicada de Google Sheets sea correcta — debe venir de Archivo → Compartir → Publicar en la Web. Si tu sitio no aparece, revisa la pestaña Actions para ver los detalles del error. También puedes pegar tu _config.yml en el Validador de configuración de Telar para verificar errores." + ], + "img": [ + [ + "/images/use-this-template.png", + "Captura de GitHub: botón Use this template" + ], + [ + "/images/github-actions.gif", + "Configuración de GitHub Pages con GitHub Actions" + ], + [ + "/images/telar-homepage.png", + "Página de inicio de Telar con título y menú de navegación" + ] + ] + }, + "text": "Configura con Google Sheets Esta guía te lleva paso a paso por la configuración de una exposición en Telar usando Google Sheets para gestionar tu contenido. Las herramientas interactivas en esta página generan tu archivo de configuración automáticamente. Vas a configurar tres cosas: un repositorio en GitHub para tu sitio, una hoja de cálculo de Google Sheets para tu contenido y un archivo de configuración para conectarlos. Irás ingresando algunos datos a medida que avanzas — tu nombre de usuario de GitHub, el enlace de tu hoja de cálculo, un título para tu sitio. Al final de esta página, descargarás un archivo de configuración listo para usar. Configura tu sitio Vas a necesitar: Una cuenta de GitHub (gratis) Una cuenta de Google para Google Sheets (gratis) ¿Ya conoces GitHub Pages y YAML? Puedes configurar todo manualmente con la guía de configuración manual . La configuración puede parecer muchos pasos, pero solo tienes que hacerla una vez. Después de eso, todo se maneja desde tu hoja de cálculo de Google Sheets. Crea tu repositorio Un repositorio es el espacio de tu proyecto en GitHub — allí se guardan tu archivo de configuración y tus imágenes. Visita la plantilla de Telar Haz clic en el botón verde Use this template Elige Create a new repository Dale un nombre a tu repositorio — usa solo letras minúsculas y guiones (ej., mi-exhibicion ) — este nombre será parte de la dirección web de tu sitio Asegúrate de que Public esté seleccionado Haz clic en Create repository Mantén tu repositorio público. Los repositorios privados no funcionan con GitHub Pages a menos que tengas un plan de pago en GitHub. Ingresa tus datos de GitHub a continuación. Se usan para construir la dirección web de tu sitio y para generar tu archivo de configuración al final. Tus datos de GitHub Usuario de GitHub Nombre del repositorio Tu sitio estará en: https:// usuario .github.io/ mi-exhibicion Activa GitHub Pages GitHub Pages convierte tu repositorio en un sitio web en vivo, de forma gratuita. En tu repositorio, ve a Settings → Pages En Source , selecciona GitHub Actions Haz clic en Save Duplica la plantilla de Google Sheets Tu hoja de cálculo de Google Sheets es donde manejas todo tu contenido — objetos, historias y textos. Abre https://bit.ly/telar-template Haz clic en Archivo → Hacer una copia Guárdala en tu Google Drive con un nombre que recuerdes (ej., \"Mi exhibición Telar\") Publica tu hoja de cálculo Tu hoja de cálculo necesita estar publicada para que Telar pueda leer tu contenido al construir el sitio. Ve a Archivo → Compartir → Publicar en la Web Haz clic en Publicar Copia la URL publicada y pégala a continuación Tu URL de Google Sheets URL publicada Desde Archivo → Compartir → Publicar en la Web Genera tu configuración Completa los datos restantes y esta página creará tu archivo de configuración. Datos del sitio Título El nombre de tu sitio, visible en la pestaña del navegador y en el encabezado Descripción (opcional) Se usa para metadatos de motores de búsqueda y vistas previas en redes sociales Autor (opcional) Tema trama paisajes neogranadina santa-barbara austin Controla la paleta de colores y el estilo visual de tu sitio Incluir contenido de demostración Obtiene historias de demostración del servidor de contenido de Telar. Muestran un distintivo \"Demo\" y ayudan a explorar la interfaz. Desactívalo en sitios en producción. Generar _config.yml Tu _config.yml 1 Copiar Descargar ¡Copiado! Una vez generado: En tu repositorio de GitHub, navega a _config.yml y haz clic en el ícono de lápiz para editar Selecciona todo el contenido existente y reemplázalo con lo que copiaste o descargaste Haz clic en Commit changes para guardar Verifica tu configuración Después de guardar, GitHub Actions construirá y publicará tu sitio automáticamente. Esto toma entre 2 y 5 minutos. Haz clic en la pestaña Actions para ver el progreso del build Cuando termine, visita tu sitio en la URL que aparece en la vista previa arriba Deberías ver un sitio Telar con tu título y el contenido de demostración predeterminado ¿Problemas con el build ? Verifica que la URL publicada de Google Sheets sea correcta — debe venir de Archivo → Compartir → Publicar en la Web. Si tu sitio no aparece, revisa la pestaña Actions para ver los detalles del error. También puedes pegar tu _config.yml en el Validador de configuración de Telar para verificar errores. Próximos pasos La conexión está lista. Sigue con el modelo de la hoja y después agrega un objeto y tu primera historia. Usa la guía de planeación si aún no has preparado la narrativa. Planea tu narrativa — Conoce cómo se articulan historias, pasos y paneles Agrega tu contenido — Sube imágenes, llena tu hoja de cálculo y crea tu primera historia Revisa y perfecciona — Ajusta coordenadas de imagen, revisa tu sitio y dale los toques finales" + }, + "/docs/your-content/stories-panels/": { + "ids": [ + "alt-text", + "back-to-start-button", + "building-story-steps", + "choosing-the-right-method", + "clip-control", + "controlling-story-display", + "coordinates", + "hiding-step-indicators", + "hiding-stories-from-the-homepage", + "how-the-scroll-experience-works", + "keyboard-navigation", + "layer-panels", + "method-1-enter-text-directly", + "method-2-paste-markdown-text", + "method-3-reference-a-markdown-file", + "multimedia-steps", + "panel-title", + "registering-stories", + "required-fields", + "section-table-of-contents", + "see-also", + "sharing-and-deep-linking", + "stories--panels", + "story-markdown-files", + "title-cards", + "what-you-can-use-in-panels", + "writing-panel-content" + ], + "selectors": { + "h1": [ + "Stories & Panels" + ], + "h2": [ + "How the scroll experience works", + "Registering stories", + "Building story steps", + "Title cards", + "Layer panels", + "Writing panel content", + "Story markdown files", + "Multimedia steps", + "Clip control", + "Alt text", + "Keyboard navigation", + "Sharing and deep linking", + "Controlling story display", + "See also" + ], + "h3": [ + "Required fields", + "Coordinates", + "Section table of contents", + "Back to Start button", + "Method 1: Enter text directly", + "Method 2: Paste markdown text", + "Method 3: Reference a markdown file", + "Choosing the right method", + "Panel title", + "What you can use in panels", + "Hiding stories from the homepage", + "Hiding step indicators" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "order,story_id,title,subtitle,byline 1,colonial-textiles,Colonial Textiles,Weaving traditions of the Americas,by Dr. Jane Smith", + "step,object,x,y,zoom,question,answer,layer1_content 1,textile-001,0.5,0.3,0.8,What is this textile?,A colonial fragment showing complex weaving patterns,This fragment dates to the mid-17th century... 2,textile-001,0.2,0.7,0.4,What does this pattern mean?,An interlocking warp design used in ceremonial cloths,The pattern has been identified as... 3,map-lima,0.5,0.5,1.0,Where were these textiles found?,In the historic center of Lima,Archaeological excavations in the 1990s...", + "step,object,x,y,zoom,question,answer 1,textile-001,0.5,0.3,0.8,What is this textile?,A colonial fragment showing complex weaving patterns. 2,,,,,Chapter 2: Trade Routes,The movement of textiles across the Americas. 3,map-lima,0.5,0.5,1.0,Where were these found?,In the historic center of Lima.", + "layer1_content \"This fragment shows **advanced weaving techniques** from the colonial period.\"", + "layer1_content colonial-textiles/step1-layer1.md", + "telar-content/texts/stories/ ├── colonial-textiles/ │ ├── step1-layer1.md │ ├── step1-layer2.md │ ├── step2-layer1.md │ └── step2-layer2.md └── trade-routes/ ├── step1-layer1.md └── step1-layer2.md", + "--- title: \"Weaving Techniques\" --- The interlocking warp pattern visible here indicates a complex weaving technique that was common in the colonial period.", + "step,object,clip_start,clip_end,loop,question,answer 1,interview-01,45,78,false,What does she describe?,The weaving technique used in her community. 2,field-recording,0,30,true,What sounds surround the workshop?,The rhythmic clatter of the loom fills the space.", + "step,object,x,y,zoom,alt_text,question,answer 1,textile-001,0.5,0.3,0.8,Close-up of interlocking warp threads in red and gold,What is this textile?,A colonial fragment showing complex weaving patterns.", + "story_interface: show_on_homepage: false", + "story_interface: show_story_steps: false" + ], + "table": [ + "Layer Default button text Purpose Layer 1 \"Learn more\" Primary detail panel Layer 2 \"Go deeper\" Secondary detail panel, stacked on top of Layer 1", + "Scenario Recommended method Short explanation (1–2 paragraphs) Method 1: Enter directly Panel with custom title or widgets Method 2: Paste, or Method 3: File reference Content with widgets (accordion, tabs, carousel) Method 3: File reference Same content used in multiple places Method 3: File reference Quick edits without leaving the spreadsheet Method 1 or 2", + "Column (English) Column (Spanish) Description clip_start inicio_clip Start time in seconds (e.g. 12.5) clip_end fin_clip End time in seconds loop bucle Loop the clip (true, yes, or sí)", + "Fragment Meaning #s3 Step 3 #s3l1 Step 3 with the first detail panel open" + ], + "blockquote": [ + "The Compositor's story editor provides a visual alternative to editing story spreadsheets directly. You can build and reorder steps, set coordinates, and preview your story without leaving your browser.", + "If your first chapter starts immediately after the intro, create a title card for it too. The TOC only lists title cards that exist in your story CSV — if chapter 1 has no title card, it won't appear in the table of contents.", + "The three methods that follow describe authoring in a spreadsheet. In the Compositor, the panel title has its own field, and anything pasted into the Content field — a --- block included — is published as part of the panel's text, not read as a title.", + "If you copy and paste from Microsoft Word, Google Docs, or similar applications, formatting will not be preserved. Write in markdown syntax instead — see the Markdown Syntax Guide.", + "This applies to panels written in a spreadsheet or a markdown file. In the Compositor, the panel title has its own field, and a --- block pasted into the Content field is published as part of the panel's text, not read as a title.", + "You can also set clip times visually in the Compositor. See Video and Audio in the Compositor for details.", + "Alt text for each step can also be set in the Compositor's step editor.", + "The browser back button returns to the previous page — not the previous step. Deep links are designed for sharing positions, not for navigating within a story." + ], + "img": [ + [ + "/images/story-viewer.png", + "Story page with a text card over the IIIF viewer" + ], + [ + "/images/coordinate-picker.png", + "Coordinate picker showing X, Y, and Zoom values below the image viewer" + ] + ] + }, + "text": "Stories & Panels Stories are scrollable narratives built around your objects. Each story guides your audience through a sequence of steps — focusing on specific regions of images, moments in videos, or segments of audio recordings — with question-and-answer pairs and expandable detail panels. The Compositor's story editor provides a visual alternative to editing story spreadsheets directly. You can build and reorder steps, set coordinates, and preview your story without leaving your browser. How the scroll experience works A story fills the viewport. The object, whether an image in the IIIF viewer, a video player or an audio player, fills the entire background, and as you scroll the text cards pass over it one after another, rather than stacking. The scroll is continuous with magnetic waypoints . Rather than jumping discretely from step to step, viewers scroll naturally through the story. The view snaps magnetically to each step, ensuring the text card and object position stay in sync. On phones and tablets held upright, the text card is anchored to the bottom of the screen, over the lower part of the object. Each step: Focuses on a specific part of an object (using x, y, and zoom coordinates for images, or clip times for video and audio) Displays a question and a brief answer in the text card Optionally offers up to two layers of additional detail via expandable buttons Registering stories Before building a story's steps, register it in project.csv : order,story_id,title,subtitle,byline 1,colonial-textiles,Colonial Textiles,Weaving traditions of the Americas,by Dr. Jane Smith The story_id determines the filename for the story CSV and its URL. With story_id: colonial-textiles , Telar looks for telar-content/spreadsheets/colonial-textiles.csv and serves the story at /stories/colonial-textiles/ . If you omit story_id , Telar uses story-{order} (e.g., story-1.csv for order 1). See the CSV Reference: Project for all project.csv columns. Building story steps Each story has its own CSV file in telar-content/spreadsheets/ . The file defines steps in sequence: step,object,x,y,zoom,question,answer,layer1_content 1,textile-001,0.5,0.3,0.8,What is this textile?,A colonial fragment showing complex weaving patterns,This fragment dates to the mid-17th century... 2,textile-001,0.2,0.7,0.4,What does this pattern mean?,An interlocking warp design used in ceremonial cloths,The pattern has been identified as... 3,map-lima,0.5,0.5,1.0,Where were these textiles found?,In the historic center of Lima,Archaeological excavations in the 1990s... Required fields Every step needs: step — Sequential number (1, 2, 3...) with no gaps object — An object_id from your objects spreadsheet. Leave empty to create a title card x , y , zoom — The step's framing (see below). Ignored for title cards question — The heading displayed in the text card answer — A brief answer shown below the question Coordinates Coordinates tell the viewer where to focus for each step. x and y run from 0 to 1: x — Horizontal position. 0 = left edge, 0.5 = center, 1 = right edge y — Vertical position. 0 = top edge, 0.5 = center, 1 = bottom edge zoom — Zoom level. 1 shows the whole object. Higher values move closer to the point at x and y : 2 shows about half as much of the object. That point is in the middle of the view, except near an edge, because the view does not go past the edge of the object. Below 1, down to 0.1, the whole object is shown smaller and centered. To find coordinates, use the coordinate picker on any object page: zoom and pan to the region you want, then click the Copy buttons to copy the x, y, and zoom values directly into your spreadsheet. Title cards Title cards are text-only steps with no associated object. They work well as chapter headings, section breaks, or thematic transitions within a story. To create a title card, leave the object column empty. The x , y , and zoom columns are ignored. The question field becomes the card heading and answer becomes the subtitle. step,object,x,y,zoom,question,answer 1,textile-001,0.5,0.3,0.8,What is this textile?,A colonial fragment showing complex weaving patterns. 2,,,,,Chapter 2: Trade Routes,The movement of textiles across the Americas. 3,map-lima,0.5,0.5,1.0,Where were these found?,In the historic center of Lima. Title cards participate fully in navigation — scroll, keyboard, and deep linking all work as expected. Layer panels are not available on title cards — the layer columns are ignored, like x , y , and zoom . Section table of contents If your story uses title cards as chapter headings, you can display a navigable table of contents on the intro card. Enable it by adding show_sections: yes (or mostrar_secciones: si ) to the story's row in project.csv . When enabled, the intro card scans the story for title cards and lists each one as a clickable link. Clicking a link jumps directly to that section. The intro card also switches to a darker background (the layer 2 panel color) to visually distinguish it. If your first chapter starts immediately after the intro, create a title card for it too. The TOC only lists title cards that exist in your story CSV — if chapter 1 has no title card, it won't appear in the table of contents. See Project Columns for the show_sections column reference. Back to Start button When a reader scrolls past the intro card, the \"Back to Home\" button in the top-left corner switches to \"Back to Start\". Clicking it returns to the intro card. On the intro card, the button reverts to \"Back to Home\" and links to the homepage. This is automatic — no configuration needed. Layer panels Each step can carry up to two layers of additional detail, following the QAI pattern (question, answer, invitation). The question and answer appear in the text card itself. The invitation is the set of panel trigger buttons that let readers open expandable panels for deeper content: Layer Default button text Purpose Layer 1 \"Learn more\" Primary detail panel Layer 2 \"Go deeper\" Secondary detail panel, stacked on top of Layer 1 For each layer, add two columns to your story spreadsheet: Button text ( layer1_button , layer2_button ) — Leave empty for the default, or provide custom text such as \"See the technique\" or \"Read the source\" Content ( layer1_content , layer2_content ) — The panel content itself If a layer has no content, its button is hidden automatically. Layer 2 is accessed from inside Layer 1 — its trigger button is rendered at the bottom of the Layer 1 panel, not on the main text card. Writing panel content You can provide panel content in three ways. Choose based on complexity: The three methods that follow describe authoring in a spreadsheet. In the Compositor, the panel title has its own field, and anything pasted into the Content field — a --- block included — is published as part of the panel's text, not read as a title. Method 1: Enter text directly Type your text directly in the spreadsheet cell. Best for short panels (1–2 paragraphs). layer1_content \"This fragment shows **advanced weaving techniques** from the colonial period.\" You can use basic formatting: **bold** , *italic* , [link text](url) , and glossary links ( [[term-id]] ). For line breaks within a cell: Google Sheets : Press Ctrl+Enter (Windows/Linux) or Option+Enter (macOS) CSV files : Use actual newlines inside quoted text Alternative : Use HTML
tags Method 2: Paste markdown text Paste text written in a plain text editor. This supports the full range of markdown features including headings, widgets (accordion, carousel, tabs), images with size controls, and a custom panel title using YAML frontmatter. If you copy and paste from Microsoft Word, Google Docs, or similar applications, formatting will not be preserved. Write in markdown syntax instead — see the Markdown Syntax Guide . Method 3: Reference a markdown file Point to a markdown file in your repository. Best for complex panels — especially those with widgets or content you want to reuse across steps. layer1_content colonial-textiles/step1-layer1.md Save markdown files in telar-content/texts/stories/ . In your spreadsheet, enter just the filename — or if you've organized files into subfolders, include the subfolder name. How Telar decides : If what you enter ends in .md and the file exists, it loads the file. Otherwise, it treats the value as content. Choosing the right method Scenario Recommended method Short explanation (1–2 paragraphs) Method 1: Enter directly Panel with custom title or widgets Method 2: Paste, or Method 3: File reference Content with widgets (accordion, tabs, carousel) Method 3: File reference Same content used in multiple places Method 3: File reference Quick edits without leaving the spreadsheet Method 1 or 2 Story markdown files When using Method 3 (file references), your story markdown files live in telar-content/texts/stories/ : telar-content/texts/stories/ ├── colonial-textiles/ │ ├── step1-layer1.md │ ├── step1-layer2.md │ ├── step2-layer1.md │ └── step2-layer2.md └── trade-routes/ ├── step1-layer1.md └── step1-layer2.md Organizing files into subfolders by story keeps things manageable as your site grows. Panel title Add a custom panel title using YAML frontmatter: --- title: \"Weaving Techniques\" --- The interlocking warp pattern visible here indicates a complex weaving technique that was common in the colonial period. If you omit the frontmatter, the panel has no title — the content starts immediately. This applies to panels written in a spreadsheet or a markdown file. In the Compositor, the panel title has its own field, and a --- block pasted into the Content field is published as part of the panel's text, not read as a title. What you can use in panels Story panels support: Standard markdown (headings, bold, italic, links, lists, images) Widgets (carousel, tabs, accordion) Glossary auto-links ( [[term-id]] ) Images with size controls (see Markdown Syntax Guide ) Multimedia steps Story steps can reference any object type — not just images. When a step references a video or audio object, the image viewer gives way to the appropriate player. Video objects — The video player fills the window behind the text cards with standard playback controls. See Video Objects for supported platforms and setup. Audio objects — The audio player fills the window behind the text cards with waveform visualization. See Audio Objects for supported formats and setup. No additional configuration is needed. Telar detects the object type from your objects spreadsheet and loads the correct player. Clip control For video and audio steps, you can specify a start time, end time, and loop setting. Add these columns to your story spreadsheet: Column (English) Column (Spanish) Description clip_start inicio_clip Start time in seconds (e.g. 12.5 ) clip_end fin_clip End time in seconds loop bucle Loop the clip ( true , yes , or sí ) All three columns are optional. If omitted, the media plays from the beginning without looping. step,object,clip_start,clip_end,loop,question,answer 1,interview-01,45,78,false,What does she describe?,The weaving technique used in her community. 2,field-recording,0,30,true,What sounds surround the workshop?,The rhythmic clatter of the loom fills the space. You can also set clip times visually in the Compositor. See Video and Audio in the Compositor for details. See the CSV Reference: Stories for the full column reference including clip columns. Alt text Each step can include an alt_text column with a description of what is visible or audible at that point in the story. This text is used by screen readers and other assistive technologies. step,object,x,y,zoom,alt_text,question,answer 1,textile-001,0.5,0.3,0.8,Close-up of interlocking warp threads in red and gold,What is this textile?,A colonial fragment showing complex weaving patterns. Alt text for each step can also be set in the Compositor's step editor . Keyboard navigation Stories support keyboard navigation. Arrow keys, Space, and Page Up/Down scroll through the story, and the magnetic waypoints ensure each keypress lands on the next or previous step. When a panel is open, keyboard behavior changes: Arrow Up/Down and Page Up/Down scroll the panel content instead of navigating between steps. Space scrolls the panel forward, and Shift+Space scrolls it backward. Sharing and deep linking Telar automatically updates the URL in the browser address bar as readers move through a story. The URL encodes the current step and any open panel layer, so you can copy it and share a link that opens directly to a specific point in the story. The URL fragment uses a compact format: Fragment Meaning #s3 Step 3 #s3l1 Step 3 with the first detail panel open When someone opens a deep link, the story jumps directly to the encoded step and opens the panel if one is specified. This works with both scroll navigation and button navigation. The browser back button returns to the previous page — not the previous step. Deep links are designed for sharing positions, not for navigating within a story. Controlling story display Hiding stories from the homepage If you want objects on the homepage but prefer stories to be accessed through navigation or direct links: story_interface: show_on_homepage: false Stories remain accessible at their URLs — only the homepage cards are hidden. Hiding step indicators The \"Step 1\", \"Step 2\" indicators in the top-left corner of the story page can be hidden for a cleaner experience: story_interface: show_story_steps: false Readers can still navigate through steps normally. See also CSV Reference: Stories — Complete column reference for story spreadsheets Objects — Defining the objects used in stories Video Objects — Adding video objects from YouTube, Vimeo, and Google Drive Audio Objects — Adding self-hosted audio files Widgets — Carousel, tabs, and accordion in story panels Private Stories — Restricting access to stories Configuration — Story interface settings" + }, + "/guia/tu-contenido/": { + "ids": [ + "tu-contenido" + ], + "selectors": { + "h1": [ + "Tu contenido" + ], + "h2": [], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Tu contenido Los objetos, las historias, los paneles y las páginas de apoyo forman la exhibición. Esta referencia explica sus archivos fuente y formatos. Usa el manual del Compositor para edición visual, el de Sheets para hojas de cálculo o el de autoría local para CSV y Markdown. Los tres métodos generan un sitio estático. Objetos — Los elementos visuales que tus historias exploran — imágenes, mapas, documentos, fotografías Imágenes autoalojadas — Sube tus propias imágenes y Telar genera teselas ampliables automáticamente Imágenes IIIF externas — Usa imágenes de museos, bibliotecas y otros proveedores IIIF Historias y paneles — Narrativas paso a paso construidas alrededor de tus objetos, con paneles de detalle expandibles Contenido enriquecido con Markdown — Enriquece los paneles de historias con narrativas extensas, medios incrustados y contenido reutilizable Sintaxis de Markdown — Referencia de formato para archivos Markdown usados en paneles y páginas Widgets — Elementos interactivos para paneles de historias y páginas personalizadas — carruseles, pestañas, acordeones" + }, + "/guia/tu-contenido/contenido-enriquecido/": { + "ids": [ + "contenido-enriquecido-con-markdown", + "cuándo-agregar-archivos-markdown", + "cómo-funciona", + "editar-archivos-markdown-en-github", + "escribir-contenido-en-markdown", + "estructura-básica", + "formato-básico", + "paso-1-crea-tu-archivo-markdown", + "paso-2-vincula-el-archivo-desde-tu-hoja-de-cálculo", + "próximos-pasos", + "qué-pueden-hacer-los-archivos-markdown-que-el-texto-directo-no-puede" + ], + "selectors": { + "h1": [ + "Contenido enriquecido con Markdown" + ], + "h2": [ + "Cuándo agregar archivos Markdown", + "Cómo funciona", + "Paso 1: crea tu archivo Markdown", + "Paso 2: vincula el archivo desde tu hoja de cálculo", + "Escribir contenido en Markdown", + "Editar archivos Markdown en GitHub", + "Próximos pasos" + ], + "h3": [ + "Estructura básica", + "Formato básico", + "Qué pueden hacer los archivos Markdown que el texto directo no puede" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "telar-content/texts/stories/ story-1/ paso1-tecnicas.md paso2-materiales.md paso3-historia.md story-2/ paso1-panorama.md", + "--- title: \"Técnicas de tejido\" --- El patrón de urdimbre entrelazada visible aquí indica una técnica de tejido compleja, común en la época colonial. ## Detalles técnicos Estos textiles se producían en telares de cintura, una tecnología que antecede al contacto europeo por miles de años." + ], + "table": [ + "step question layer1_content 1 ¿Qué es este textil? story-1/paso1-tecnicas.md 2 ¿Dónde se hizo? Este textil fue hecho en... 3 ¿Por qué es importante? story-1/paso3-historia.md", + "Lo que escribes Lo que hace **texto en negrita** texto en negrita *texto en cursiva* texto en cursiva ## Encabezado Un encabezado de sección - elemento Un elemento de lista con viñeta 1. elemento Un elemento de lista numerada [texto](url) Un enlace > cita Una cita en bloque" + ], + "blockquote": [ + "Esta guía se construye sobre las guías de configuración. Completa una de las opciones de Primeros pasos primero si aún no lo has hecho.", + "Organización de archivos Un patrón común es una carpeta por historia, con archivos nombrados por paso y tema: telar-content/texts/stories/ story-1/ paso1-tecnicas.md paso2-materiales.md paso3-historia.md story-2/ paso1-panorama.md Cualquier organización funciona — a Telar solo le importa la ruta que pongas en la hoja de cálculo.", + "¿Nuevo en Markdown? Prueba el tutorial de CommonMark — toma unos 10 minutos y cubre todo lo que necesitas para los paneles de Telar.", + "Después de editar archivos, recuerda reconstruir. Ve a Actions → Build and Deploy → Run workflow para ver tus cambios en el sitio en vivo." + ], + "img": [ + [ + "/images/create-new-layer.png", + "Crear un nuevo archivo Markdown en GitHub" + ], + [ + "/images/edit-layer.png", + "Editar un archivo Markdown en GitHub" + ] + ] + }, + "text": "Contenido enriquecido con Markdown Tu sitio está funcionando y tus historias están en la hoja de cálculo. Ahora quieres paneles más ricos — esta guía te muestra cómo agregar archivos Markdown para paneles de historias que necesiten más que unos pocos párrafos de texto. Esta guía se construye sobre las guías de configuración. Completa una de las opciones de Primeros pasos primero si aún no lo has hecho. Esta página explica el contenido de paneles en archivos y hojas de cálculo. En el Compositor, edita el título en su campo y el contenido en el editor del panel; la misma referencia de formato se aplica al cuerpo. Cuándo agregar archivos Markdown La hoja de cálculo maneja bien la mayoría de las exposiciones en Telar. Considera agregar archivos Markdown cuando necesites: Narrativas más extensas — paneles con varias secciones, encabezados y estructura Widgets interactivos — acordeones, paneles con pestañas o carruseles de imágenes Medios enriquecidos — videos incrustados, imágenes con tamaño personalizado o audio Contenido reutilizable — el mismo texto de panel referenciado desde varios pasos de historia Edición más cómoda — un editor de texto es más práctico que una celda de hoja de cálculo para textos largos Si tus paneles son en su mayoría de 1-2 párrafos, probablemente no necesitas este flujo de trabajo. Quédate con Google Sheets y regresa aquí si tus necesidades crecen. Cómo funciona El enfoque híbrido es sencillo: la estructura de tu historia se mantiene en Google Sheets, pero en lugar de escribir el texto del panel en una celda de la hoja de cálculo, apuntas a un archivo Markdown en tu repositorio. Telar detecta la diferencia automáticamente. Si el valor en una celda de layer1_content o layer2_content termina en .md , Telar carga el archivo. De lo contrario, trata el valor como texto directo. Puedes mezclar ambos enfoques libremente — algunos pasos con texto directo, otros con referencias a archivos. Paso 1: crea tu archivo Markdown En tu repositorio de GitHub, navega a telar-content/texts/stories/ Si tu historia es story-1 , crea una carpeta llamada story-1/ (o el nombre que prefieras) Haz clic en Add file → Create new file Nombra tu archivo con extensión .md (ej., paso1-tecnicas.md ) Usa guiones en lugar de espacios Escoge un nombre descriptivo — lo verás en tu hoja de cálculo Escribe tu contenido (consulta Escribir contenido en Markdown más abajo) Haz clic en Commit changes para guardar Organización de archivos Un patrón común es una carpeta por historia, con archivos nombrados por paso y tema: telar-content/texts/stories/ story-1/ paso1-tecnicas.md paso2-materiales.md paso3-historia.md story-2/ paso1-panorama.md Cualquier organización funciona — a Telar solo le importa la ruta que pongas en la hoja de cálculo. Paso 2: vincula el archivo desde tu hoja de cálculo En tu Google Sheet, pon la ruta del archivo en la columna layer1_content o layer2_content . La ruta es relativa a telar-content/texts/stories/ : step question layer1_content 1 ¿Qué es este textil? story-1/paso1-tecnicas.md 2 ¿Dónde se hizo? Este textil fue hecho en... 3 ¿Por qué es importante? story-1/paso3-historia.md Observa cómo el paso 2 usa texto directo mientras que los pasos 1 y 3 referencian archivos. Puedes mezclar ambos métodos libremente. Escribir contenido en Markdown Estructura básica Un archivo Markdown para un panel de historia se ve así: --- title: \"Técnicas de tejido\" --- El patrón de urdimbre entrelazada visible aquí indica una técnica de tejido compleja, común en la época colonial. ## Detalles técnicos Estos textiles se producían en telares de cintura, una tecnología que antecede al contacto europeo por miles de años. El title en el frontmatter (la sección entre las líneas --- ) se convierte en el encabezado del panel. Si lo omites, Telar usa el texto del botón. Formato básico Markdown usa caracteres sencillos para dar formato: Lo que escribes Lo que hace **texto en negrita** texto en negrita *texto en cursiva* texto en cursiva ## Encabezado Un encabezado de sección - elemento Un elemento de lista con viñeta 1. elemento Un elemento de lista numerada [texto](url) Un enlace > cita Una cita en bloque ¿Nuevo en Markdown? Prueba el tutorial de CommonMark — toma unos 10 minutos y cubre todo lo que necesitas para los paneles de Telar. Qué pueden hacer los archivos Markdown que el texto directo no puede Los archivos Markdown admiten todas las funciones de contenido de Telar: Widgets — elementos interactivos como acordeones, paneles con pestañas y carruseles de imágenes. Consulta la Referencia de sintaxis Markdown para la lista completa. Medios incrustados — videos, reproductores de audio e imágenes con tamaño personalizado Enlaces de glosario — conecta términos a tu glosario usando la sintaxis [[id-del-termino]] Estructura compleja — múltiples encabezados, listas anidadas y citas en bloque Estas funciones se manejan mejor en archivos porque usan sintaxis de varias líneas que es difícil de administrar dentro de una celda de hoja de cálculo. Editar archivos Markdown en GitHub No necesitas instalar nada para editar archivos Markdown. GitHub tiene un editor integrado: Navega al archivo en tu repositorio Haz clic en el ícono de lápiz (Edit this file) Haz tus cambios Haz clic en Commit changes para guardar GitHub también muestra una pestaña Preview para que puedas verificar el formato antes de hacer commit . Después de editar archivos, recuerda reconstruir. Ve a Actions → Build and Deploy → Run workflow para ver tus cambios en el sitio en vivo. Próximos pasos Referencia de sintaxis Markdown — guía completa de formato con widgets y medios Tu contenido — cómo Telar organiza los archivos Referencia CSV: Proyecto — columnas de CSV de proyecto y objetos Referencia CSV: Historias — columnas de CSV de historias y glosario" + }, + "/docs/the-compositor/publishing/": { + "ids": [ + "build-tracking", + "change-summary", + "config-editor", + "media-upgrade-docs-the-compositor-publishing", + "post-publish", + "pre-publish-validation", + "publish", + "publishing", + "see-also" + ], + "selectors": { + "h1": [ + "Publishing" + ], + "h2": [ + "Change summary", + "Pre-publish validation", + "Publish", + "Build tracking", + "Post-publish", + "Config editor", + "See also" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [ + "The config editor covers the most commonly used settings. For advanced configuration options, you can still edit _config.yml directly in your repository. See Configuration for the full reference." + ], + "img": [ + [ + "/assets/manual/tutorials/en-upgrade.jpg", + "An example upgrade notice comparing Telar 1.8.2 with 1.8.3." + ] + ] + }, + "text": "Publishing Publishing sends your changes from the Compositor to your GitHub repository. Until you publish, all edits — to objects, stories, and settings — are saved on the server. Publishing creates a single commit in your repository, triggers a GitHub Pages build, and makes your changes live on your site. Change summary Before publishing, the Compositor shows a summary of everything that has changed since your last publish. This lets you review your work before committing. The change summary lists additions, modifications, and deletions across your project — new objects, edited story steps, updated metadata, and any other changes you have made. Review this summary carefully to make sure it reflects what you intend to publish. Pre-publish validation The Compositor validates your project before allowing you to publish. Validation catches issues that could cause problems on your live site. There are two levels of validation: Errors — Critical issues that block publishing. For example, a required field might be missing or a story might reference an object that does not exist. You must fix errors before you can publish. Warnings — Non-critical issues that do not block publishing but are worth reviewing. For example, an object might be missing alt text or a story might have only one step. You can publish with warnings, but addressing them improves your exhibition. An example version notice before publication. Compare the versions and review the proposed file changes; the versions shown will vary. Open full-size screenshot ↗ Publish When you are ready, use the publish control. The Compositor sends the reviewed changes to your repository through its installed GitHub App. The commit body records Published by @your-github-login . Publishing and completing the site build are separate stages. Follow the build status before checking the public site. Build tracking After publishing, the Compositor tracks the progress of your GitHub Pages build in real time. A progress indicator shows the current status: Queued — The build is waiting to start Building — GitHub Actions is building your site Complete — The build finished successfully and your changes are live Failed — The build encountered an error If a build fails, the Compositor displays the error information so you can diagnose the issue. Common causes include invalid YAML in configuration files or missing required files. You can fix the issue and publish again. Post-publish Once the build completes successfully, the Compositor provides a direct link to your live site. Click it to see your published changes immediately. Config editor The Compositor includes a configuration editor for essential site settings. Instead of editing your _config.yml file directly through GitHub, you can update key fields through a form in the Compositor. The config editor lets you change settings like your site title, theme options, and other configuration values that affect how your exhibition appears. Changes to configuration are included in your next publish alongside any content changes. If your site's _config.yml is written in a way that doesn't let the Compositor save your Site settings in it, the Publish page tells you and offers to rewrite the file. Click Review the rewrite to see what will happen. The Compositor rebuilds _config.yml from the template for the version of Telar your site uses and keeps the settings from your file as they are. The review lists the settings that will take their value from Site settings or from the template, and any lines the Compositor can't read, which will be removed. Comments between settings aren't kept. When you click Accept the rewrite , the Compositor writes the new file the next time you publish; the old one stays in your site's history on GitHub. Anyone who can edit Site settings can accept the rewrite. The config editor covers the most commonly used settings. For advanced configuration options, you can still edit _config.yml directly in your repository. See Configuration for the full reference. See also Story Editor — Building and editing your stories Objects — Managing objects in the Compositor Sync and Updates — Keeping your project in sync with your repository Start and navigation — Return to the project overview" + }, + "/docs/developers/local-development/": { + "ids": [ + "automated-tests", + "best-practices", + "browser-testing", + "build-commands", + "command-options", + "common-issues", + "configuration", + "core-commands-manual", + "daily-workflow", + "dependency-issues", + "development-workflow", + "directory-structure", + "embedding-issues", + "getting-help", + "initial-setup", + "installation-guides", + "local-development", + "local-testing-checklist", + "manual-publishing", + "next-steps", + "optional-audio-objects-only", + "optional-recommended", + "performance-issues", + "prepare-for-publishing", + "prerequisites", + "project-setup", + "publishing", + "quick-start-build-script-recommended", + "required-software", + "testing", + "troubleshooting", + "validation", + "working-with-google-sheets-locally" + ], + "selectors": { + "h1": [ + "Local Development" + ], + "h2": [ + "Prerequisites", + "Project Setup", + "Build Commands", + "Development Workflow", + "Directory Structure", + "Troubleshooting", + "Testing", + "Publishing", + "Best Practices", + "Getting Help", + "Next Steps" + ], + "h3": [ + "Required Software", + "Installation Guides", + "Optional (Recommended)", + "Optional (Audio Objects Only)", + "Initial Setup", + "Configuration", + "Quick Start: Build Script (Recommended)", + "Core Commands (Manual)", + "Command Options", + "Daily Workflow", + "Working with Google Sheets Locally", + "Common Issues", + "Dependency Issues", + "Performance Issues", + "Embedding Issues", + "Local Testing Checklist", + "Browser Testing", + "Validation", + "Automated Tests", + "Prepare for Publishing", + "Manual Publishing" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "brew install ruby python node git gem install bundler", + "sudo apt-get install ruby-full python3 python3-pip nodejs npm git build-essential gem install bundler", + "brew install vips", + "sudo apt-get install libvips-dev", + "brew install audiowaveform", + "sudo apt install audiowaveform", + "# Clone repository git clone https://github.com/username/your-telar-site.git cd your-telar-site # Install Ruby dependencies bundle install # Install Python dependencies pip install -r requirements.txt # Install Node.js dependencies npm install", + "baseurl: \"\" # Empty for local development url: \"http://localhost:4001\"", + "# Build and serve on port 4001 (default) python3 scripts/build_local_site.py # Build only, don't start server python3 scripts/build_local_site.py --build-only # Use a different port python3 scripts/build_local_site.py --port 4000 # Skip IIIF tile generation (faster rebuilds when images haven't changed) python3 scripts/build_local_site.py --skip-iiif # Skip Google Sheets fetch (use existing CSV files) python3 scripts/build_local_site.py --skip-fetch # Skip audio processing (faster rebuilds when audio hasn't changed) python3 scripts/build_local_site.py --skip-audio", + "# 1. Fetch data from Google Sheets (if enabled) python3 scripts/fetch_google_sheets.py # 2. Convert CSVs to JSON python3 scripts/csv_to_json.py # 3. Generate Jekyll collection files python3 scripts/generate_collections.py # 4. Process audio files (if any — requires audiowaveform) # Note: basic audio detection works without this step (csv_to_json.py # generates the audio manifest automatically). This script is only # needed for precomputed waveform peak data. python3 scripts/process_audio.py # 5. Generate IIIF tiles python3 scripts/generate_iiif.py --base-url http://localhost:4001 # 6. Build JavaScript bundle npm run build:js # Or: npx esbuild assets/js/telar-story/main.js --bundle --outfile=assets/js/telar-story.js --sourcemap --format=iife # 7. Serve with live reload bundle exec jekyll serve --livereload --port 4001 # Build only (output to _site/) bundle exec jekyll build # Clean build artifacts bundle exec jekyll clean", + "# Serve on custom port bundle exec jekyll serve --port 4001 # Serve on local network bundle exec jekyll serve --host 0.0.0.0 # Incremental build (faster) bundle exec jekyll serve --incremental # Disable live reload bundle exec jekyll serve", + "# Specify different source directory python3 scripts/generate_iiif.py --source-dir path/to/images # Specify custom base URL python3 scripts/generate_iiif.py --base-url https://mysite.org # Process specific image only python3 scripts/generate_iiif.py --image textile-001.jpg", + "# First time or after CSV/image changes: full build python3 scripts/build_local_site.py # Quick rebuild (no IIIF regeneration) python3 scripts/build_local_site.py --skip-iiif --skip-fetch # The script handles everything and starts the server # Make changes to content, then Ctrl+C and rerun to rebuild", + "# 1. Start Jekyll server bundle exec jekyll serve --livereload # 2. Make changes to content # - Edit CSVs in telar-content/spreadsheets/ # - Edit markdown in telar-content/texts/ # - Add images to telar-content/objects/ # 3. Rebuild data (when CSVs change) python3 scripts/csv_to_json.py python3 scripts/generate_collections.py # 4. Regenerate tiles (when images change) python3 scripts/generate_iiif.py # 5. Jekyll auto-reloads browser # Site updates automatically", + "google_sheets: enabled: true published_url: \"YOUR_PUBLISHED_URL\"", + "python3 scripts/build_local_site.py", + "python3 scripts/fetch_google_sheets.py python3 scripts/csv_to_json.py python3 scripts/generate_collections.py bundle exec jekyll serve", + "your-telar-site/ ├── _config.yml # Site configuration ├── _data/ # Generated JSON data │ ├── objects.json │ ├── project.json │ └── stories/ ├── _jekyll-files/ # Auto-generated collections │ ├── _stories/ │ ├── _objects/ │ └── _glossary/ ├── _layouts/ # Page templates │ ├── default.html │ ├── story.html │ └── object.html ├── _includes/ # Reusable components │ ├── header.html │ └── footer.html ├── assets/ # Static assets │ ├── css/ │ ├── js/ │ └── images/ ├── telar-content/ # SOURCE CONTENT (edit here!) │ ├── structures/ # CSV files │ ├── images/ # Source images │ └── texts/ # Markdown files ├── iiif/ # Generated IIIF tiles ├── scripts/ # Build scripts │ ├── build_local_site.py # All-in-one local build │ ├── fetch_google_sheets.py │ ├── csv_to_json.py │ ├── generate_collections.py │ ├── process_audio.py # Audio waveform peak data │ └── generate_iiif.py └── _site/ # Built site (don't edit!)", + "# Update dependencies bundle update # Clean and retry bundle exec jekyll clean bundle exec jekyll serve", + "# Restart Jekyll (Ctrl+C, then restart) bundle exec jekyll serve --livereload # Hard refresh browser (Cmd+Shift+R or Ctrl+Shift+R)", + "# Check Python dependencies pip install -r requirements.txt # Verify image files exist ls -la telar-content/objects/ # Check for error messages python3 scripts/generate_iiif.py", + "# Check CSV syntax cat telar-content/spreadsheets/story-1.csv # Verify markdown files exist ls -la telar-content/texts/stories/ # Run with verbose output python3 scripts/csv_to_json.py --verbose", + "# Update RubyGems gem update --system # Clear bundle cache bundle clean --force bundle install", + "# Upgrade pip pip install --upgrade pip # Use virtualenv python3 -m venv venv source venv/bin/activate # On Windows: venv\\Scripts\\activate pip install -r requirements.txt", + "# Use incremental builds bundle exec jekyll serve --incremental # Disable IIIF regeneration if images haven't changed # (Just don't run generate_iiif.py) # Reduce file watching echo \"_site\" >> .gitignore", + "# Clean build artifacts bundle exec jekyll clean rm -rf _site/ # Restart Jekyll server", + "document.body.classList.contains('embed-mode')", + "# Test IIIF manifest URL curl https://yoursite.com/iiif/objects/object-1/info.json", + "console.log(window.telarLang.embedBanner)", + "document.querySelector('.embed-banner')", + "// In browser console typeof OpenSeadragon", + "// Should be set when page loads console.log(window.location.href)", + "# Check HTML validity bundle exec htmlproofer ./_site --disable-external # Check for broken links bundle exec jekyll doctor", + "# Run all Python unit tests python3 -m pytest tests/unit/ -v # Run with coverage report python3 -m pytest tests/unit/ --cov=scripts/telar", + "# Run JavaScript tests npm run test:js # Run in watch mode (re-runs on file changes) npm run test:js:watch", + "# Install Playwright browsers (one-time setup) playwright install chromium # Start Jekyll server in one terminal bundle exec jekyll serve --port 4001 # Run E2E tests in another terminal python3 -m pytest tests/e2e/ -v", + "# 1. Test locally bundle exec jekyll serve # 2. Update _config.yml for production baseurl: \"/your-repo-name\" url: \"https://username.github.io\" # 3. Commit changes git add . git commit -m \"Update content\" # 4. Push to GitHub git push origin main # 5. GitHub Actions builds automatically", + "# Build for production JEKYLL_ENV=production bundle exec jekyll build # Publish _site/ directory to your host" + ], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Local Development Complete reference for local development, build commands, and troubleshooting. Prerequisites Required Software Ruby 3.2+ : Jekyll runtime Bundler : Ruby dependency management Python 3.12 : IIIF generation and CSV processing Node.js 22 : JavaScript bundling (esbuild) Git : Version control Telar needs Ruby 3.2 or newer, and continuous integration builds with 3.2.11. The Telar template carries a .ruby-version file naming that version, so version managers such as rbenv, chruby and asdf pick it up on their own. On an older Ruby, bundle install stops and says which version it expected, rather than continuing with a different set of gems. Installation Guides macOS (Homebrew): brew install ruby python node git gem install bundler Ubuntu/Debian: sudo apt-get install ruby-full python3 python3-pip nodejs npm git build-essential gem install bundler Windows: Install RubyInstaller Install Python Install Node.js (LTS version recommended) Install Git for Windows Optional (Recommended) libvips : Fast image processing for IIIF tile generation. Telar falls back to pure Python if not installed, but libvips is roughly 28x faster. macOS: brew install vips Ubuntu/Debian: sudo apt-get install libvips-dev Optional (Audio Objects Only) If your site includes audio objects, audiowaveform prepares waveform peak data; clip boundaries are applied in the browser. Sites without audio objects do not need these tools. audiowaveform : Waveform peak data for the WaveSurfer player macOS: brew install audiowaveform Ubuntu/Debian: sudo apt install audiowaveform Project Setup Initial Setup # Clone repository git clone https://github.com/username/your-telar-site.git cd your-telar-site # Install Ruby dependencies bundle install # Install Python dependencies pip install -r requirements.txt # Install Node.js dependencies npm install Configuration Edit _config.yml for local development: baseurl: \"\" # Empty for local development url: \"http://localhost:4001\" Build Commands Quick Start: Build Script (Recommended) The easiest way to build and serve your Telar site locally is with the all-in-one build script: # Build and serve on port 4001 (default) python3 scripts/build_local_site.py # Build only, don't start server python3 scripts/build_local_site.py --build-only # Use a different port python3 scripts/build_local_site.py --port 4000 # Skip IIIF tile generation (faster rebuilds when images haven't changed) python3 scripts/build_local_site.py --skip-iiif # Skip Google Sheets fetch (use existing CSV files) python3 scripts/build_local_site.py --skip-fetch # Skip audio processing (faster rebuilds when audio hasn't changed) python3 scripts/build_local_site.py --skip-audio This script runs all necessary build steps in sequence, mimicking what GitHub Actions does during deployment. It automatically kills any running Jekyll instances before starting. Core Commands (Manual) If you prefer to run individual scripts: # 1. Fetch data from Google Sheets (if enabled) python3 scripts/fetch_google_sheets.py # 2. Convert CSVs to JSON python3 scripts/csv_to_json.py # 3. Generate Jekyll collection files python3 scripts/generate_collections.py # 4. Process audio files (if any — requires audiowaveform) # Note: basic audio detection works without this step (csv_to_json.py # generates the audio manifest automatically). This script is only # needed for precomputed waveform peak data. python3 scripts/process_audio.py # 5. Generate IIIF tiles python3 scripts/generate_iiif.py --base-url http://localhost:4001 # 6. Build JavaScript bundle npm run build:js # Or: npx esbuild assets/js/telar-story/main.js --bundle --outfile=assets/js/telar-story.js --sourcemap --format=iife # 7. Serve with live reload bundle exec jekyll serve --livereload --port 4001 # Build only (output to _site/) bundle exec jekyll build # Clean build artifacts bundle exec jekyll clean Command Options Jekyll Serve Options: # Serve on custom port bundle exec jekyll serve --port 4001 # Serve on local network bundle exec jekyll serve --host 0.0.0.0 # Incremental build (faster) bundle exec jekyll serve --incremental # Disable live reload bundle exec jekyll serve IIIF Generation Options: # Specify different source directory python3 scripts/generate_iiif.py --source-dir path/to/images # Specify custom base URL python3 scripts/generate_iiif.py --base-url https://mysite.org # Process specific image only python3 scripts/generate_iiif.py --image textile-001.jpg Development Workflow Daily Workflow Using the build script (recommended): # First time or after CSV/image changes: full build python3 scripts/build_local_site.py # Quick rebuild (no IIIF regeneration) python3 scripts/build_local_site.py --skip-iiif --skip-fetch # The script handles everything and starts the server # Make changes to content, then Ctrl+C and rerun to rebuild Manual workflow: # 1. Start Jekyll server bundle exec jekyll serve --livereload # 2. Make changes to content # - Edit CSVs in telar-content/spreadsheets/ # - Edit markdown in telar-content/texts/ # - Add images to telar-content/objects/ # 3. Rebuild data (when CSVs change) python3 scripts/csv_to_json.py python3 scripts/generate_collections.py # 4. Regenerate tiles (when images change) python3 scripts/generate_iiif.py # 5. Jekyll auto-reloads browser # Site updates automatically Working with Google Sheets Locally For local development with Google Sheets: Configure in _config.yml : google_sheets: enabled: true published_url: \"YOUR_PUBLISHED_URL\" Use the build script (fetches automatically if enabled): python3 scripts/build_local_site.py Or fetch manually: python3 scripts/fetch_google_sheets.py python3 scripts/csv_to_json.py python3 scripts/generate_collections.py bundle exec jekyll serve See docs/google_sheets_integration/README.md in the main Telar repository for details. Directory Structure your-telar-site/ ├── _config.yml # Site configuration ├── _data/ # Generated JSON data │ ├── objects.json │ ├── project.json │ └── stories/ ├── _jekyll-files/ # Auto-generated collections │ ├── _stories/ │ ├── _objects/ │ └── _glossary/ ├── _layouts/ # Page templates │ ├── default.html │ ├── story.html │ └── object.html ├── _includes/ # Reusable components │ ├── header.html │ └── footer.html ├── assets/ # Static assets │ ├── css/ │ ├── js/ │ └── images/ ├── telar-content/ # SOURCE CONTENT (edit here!) │ ├── structures/ # CSV files │ ├── images/ # Source images │ └── texts/ # Markdown files ├── iiif/ # Generated IIIF tiles ├── scripts/ # Build scripts │ ├── build_local_site.py # All-in-one local build │ ├── fetch_google_sheets.py │ ├── csv_to_json.py │ ├── generate_collections.py │ ├── process_audio.py # Audio waveform peak data │ └── generate_iiif.py └── _site/ # Built site (don't edit!) Troubleshooting Common Issues Jekyll won't start: # Update dependencies bundle update # Clean and retry bundle exec jekyll clean bundle exec jekyll serve Changes not appearing: # Restart Jekyll (Ctrl+C, then restart) bundle exec jekyll serve --livereload # Hard refresh browser (Cmd+Shift+R or Ctrl+Shift+R) IIIF tiles not generating: # Check Python dependencies pip install -r requirements.txt # Verify image files exist ls -la telar-content/objects/ # Check for error messages python3 scripts/generate_iiif.py CSV to JSON conversion fails: # Check CSV syntax cat telar-content/spreadsheets/story-1.csv # Verify markdown files exist ls -la telar-content/texts/stories/ # Run with verbose output python3 scripts/csv_to_json.py --verbose Dependency Issues Bundle install fails: # Update RubyGems gem update --system # Clear bundle cache bundle clean --force bundle install Pip install fails: # Upgrade pip pip install --upgrade pip # Use virtualenv python3 -m venv venv source venv/bin/activate # On Windows: venv\\Scripts\\activate pip install -r requirements.txt Performance Issues Slow build times: # Use incremental builds bundle exec jekyll serve --incremental # Disable IIIF regeneration if images haven't changed # (Just don't run generate_iiif.py) # Reduce file watching echo \"_site\" >> .gitignore High memory usage: # Clean build artifacts bundle exec jekyll clean rm -rf _site/ # Restart Jekyll server Embedding Issues Navigation buttons not working in iframe: Check if embed mode is properly detected: Open browser DevTools in the iframe (right-click iframe content) Check console for JavaScript errors Verify ?embed=true parameter in URL Confirm body.embed-mode class is applied: document.body.classList.contains('embed-mode') If embed mode is not detected, verify the URL parameter is correct. Images not loading in embedded view: IIIF tiles fail to load in iframe: Check browser console for CORS errors Verify your site is deployed and publicly accessible: # Test IIIF manifest URL curl https://yoursite.com/iiif/objects/object-1/info.json Ensure GitHub Pages deployment completed successfully For external IIIF manifests, verify the source institution allows CORS \"View full site\" banner not appearing: The embed banner should appear automatically: Verify ?embed=true parameter in URL Check browser console for JavaScript errors in embed.js Confirm window.telarLang.embedBanner is defined: console.log(window.telarLang.embedBanner) Check if banner exists in DOM but is hidden by CSS: document.querySelector('.embed-banner') If banner is missing, verify assets/js/embed.js is loading. Scroll issues in LMS: Telar uses button navigation in embed mode, not scrolling: Verify navigation buttons are visible Check if buttons are clickable (not behind other elements) Test keyboard navigation (arrow keys, Page Up/Down) Ensure iframe height is adequate (minimum 600px recommended) If buttons are not visible, check that body.embed-mode class is applied. IIIF viewer not displaying: The image viewer fails to load in the iframe: Check if OpenSeadragon loaded: // In browser console typeof OpenSeadragon Verify IIIF manifest URL is accessible Check for Content Security Policy (CSP) restrictions in host site Test the story URL directly (not in iframe) to isolate the issue Share panel not opening: Share button should be hidden in embed mode: Verify this is expected behavior (share button intentionally hidden) If you need sharing in embed mode, users can dismiss the embed banner and click \"View full site\" For custom behavior, modify body.embed-mode .share-button CSS Embed code not generating: In the share panel, embed code textarea is empty: On homepage: Select a story from the dropdown first Verify story data JSON is present in page source Check browser console for JavaScript errors in share-panel.js On story page: Refresh the page to reset the share panel Check console for errors Verify currentStoryUrl is set: // Should be set when page loads console.log(window.location.href) Dimensions not updating: When changing width/height inputs: Click the input field and type the value Press Enter or click outside the field to trigger update Check if preset dropdown is interfering (select \"Custom\" preset) Verify JavaScript is running without errors Testing Local Testing Checklist Before deploying: All pages load without errors Stories scroll smoothly IIIF viewer zooms correctly Object thumbnails display Navigation works Links are correct Mobile responsive Cross-browser compatible Browser Testing Test in: Chrome/Edge (latest) Firefox (latest) Safari (latest) Mobile browsers (iOS Safari, Chrome Mobile) Validation # Check HTML validity bundle exec htmlproofer ./_site --disable-external # Check for broken links bundle exec jekyll doctor Automated Tests Telar includes automated tests for Python scripts and JavaScript modules. Running tests is optional for storytellers but recommended for developers contributing to the framework. Python Unit Tests: # Run all Python unit tests python3 -m pytest tests/unit/ -v # Run with coverage report python3 -m pytest tests/unit/ --cov=scripts/telar JavaScript Unit Tests: # Run JavaScript tests npm run test:js # Run in watch mode (re-runs on file changes) npm run test:js:watch End-to-End Tests (Playwright): E2E tests require a running Jekyll server and Playwright browsers: # Install Playwright browsers (one-time setup) playwright install chromium # Start Jekyll server in one terminal bundle exec jekyll serve --port 4001 # Run E2E tests in another terminal python3 -m pytest tests/e2e/ -v Tests run automatically on GitHub via the telar-tests.yml workflow whenever you push to main or open a pull request. Publishing Prepare for Publishing # 1. Test locally bundle exec jekyll serve # 2. Update _config.yml for production baseurl: \"/your-repo-name\" url: \"https://username.github.io\" # 3. Commit changes git add . git commit -m \"Update content\" # 4. Push to GitHub git push origin main # 5. GitHub Actions builds automatically Manual Publishing If not using GitHub Actions: # Build for production JEKYLL_ENV=production bundle exec jekyll build # Publish _site/ directory to your host Best Practices Commit frequently : Small, focused commits Test locally first : Always preview before pushing Use branches : Feature branches for major changes Document changes : Clear commit messages Backup content : Keep copies of important files Version control : Track all content in git Clean builds : Periodic jekyll clean helps Getting Help GitHub Issues Jekyll Documentation IIIF Documentation Next Steps GitHub Actions Reference Customization Guide Configuration Reference" + }, + "/docs/developers/demo-system/": { + "ids": [ + "build-sequence", + "bundle-format", + "check-the-merge", + "check-the-published-files", + "demo-system-architecture", + "download-and-checks", + "fetching-the-bundle", + "files-on-disk", + "glossary", + "layout", + "marking-demo-content", + "merging-into-_data", + "objects-in-objectsjson", + "overview", + "related-documentation", + "run-the-fetch-on-its-own", + "settings", + "stories-in-projectjson", + "story-files", + "the-demo-content-repository", + "the-generator", + "troubleshooting", + "version-matching", + "writing-the-pages" + ], + "selectors": { + "h1": [ + "Demo System Architecture" + ], + "h2": [ + "Overview", + "Build Sequence", + "Fetching the Bundle", + "Bundle Format", + "Merging into _data/", + "Writing the Pages", + "Marking Demo Content", + "Files on Disk", + "The Demo Content Repository", + "Troubleshooting", + "Related Documentation" + ], + "h3": [ + "Settings", + "Version Matching", + "Download and Checks", + "Stories in project.json", + "Objects in objects.json", + "Story Files", + "Glossary", + "Layout", + "The Generator", + "Run the Fetch on Its Own", + "Check the Merge", + "Check the Published Files" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "{ \"versions\": [ \"0.6.0\", \"0.8.1\", \"0.9.0\", \"1.8.0\" ] }", + "https://content.telar.org/demos/v{version}/{language}/telar-demo-bundle.json", + "{ \"order\": 2, \"story_id\": \"colonial-landscapes\", \"title\": \"Colonial Landscapes\", \"subtitle\": \"A 1614 legal painting of the Bogotá savanna — a story with complex content\", \"byline\": \"By Santiago Muñoz, Adelaida Ávila, and María Alejandra Orduz Avella\", \"show_sections\": true }", + "\"demo-leviathan\": { \"title\": \"Leviathan Frontispiece\", \"description\": \"Frontispiece from Thomas Hobbes' Leviathan (1651), showing the sovereign as a giant body composed of individual citizens\", \"creator\": \"Abraham Bosse (after design by Thomas Hobbes)\", \"period\": \"17th century\", \"credit\": \"British Library\", \"year\": \"1651\", \"subjects\": \"political philosophy, sovereignty\", \"featured\": \"TRUE\", \"source\": \"British Library\", \"source_url\": \"https://content.telar.org/iiif/objects/demo-leviathan/manifest.json\", \"thumbnail\": \"https://content.telar.org/iiif/objects/demo-leviathan/full/231,313/0/default.jpg\" }", + "{ \"step\": 2, \"object\": \"\", \"x\": 0.5, \"y\": 0.5, \"zoom\": 1.0, \"question\": \"A Painting of the Savanna\", \"answer\": \"This document, which can be read both as a map and a painting, was part of a legal proceeding that consolidated one of the most important haciendas and family lineages of the New Kingdom of Granada.\" }", + "python generator/build-demos.py --version 1.8.0 --bundle-only", + "python3 scripts/fetch_demo_content.py", + "curl https://content.telar.org/demos/versions.json curl -I https://content.telar.org/demos/v1.8.0/en/telar-demo-bundle.json" + ], + "table": [ + "Part Role scripts/fetch_demo_content.py Reads the site's settings, picks a bundle version, downloads and checks the bundle, and saves it scripts/telar/demo.py Runs the fetch script (fetch_demo_content_if_enabled), loads the saved bundle (load_demo_bundle), and merges it into _data/ (merge_demo_content) scripts/telar/core.py Calls those functions from main(), which scripts/csv_to_json.py runs scripts/generate_collections.py and scripts/telar/glossary_pages.py Write the story, object and glossary pages, including the demo ones _demo_content/telar-demo-bundle.json The downloaded bundle; gitignored _data/demo-glossary.json The bundle's glossary entries, for the glossary page generator; gitignored", + "Setting Used for When it is missing or invalid story_interface.include_demo_content Whether to fetch Treated as false telar.version Choosing the bundle version A value that does not parse prints a warning, and the script exits without fetching telar_language Choosing the bundle language Any value other than en or es prints a warning and is treated as en", + "Site version Bundle 1.8.0 and later 1.8.0 0.9.0 to 1.7.x 0.9.0 0.8.1 to 0.8.x 0.8.1 0.6.0 to 0.8.0 0.6.0", + "Limit Value Timeout for versions.json 10 seconds Timeout for the bundle 30 seconds Size of versions.json 64 KB Size of the bundle 10 MB", + "Key Contents _meta bundle_format, telar_version, language, generated, generator, source, description, license iiif_base_url The base URL of the bundle's hosted IIIF objects project A list of story entries, one per story objects An object keyed by object ID stories An object keyed by story ID, each holding a steps list glossary An object keyed by glossary entry ID", + "Record field Taken from number order, as a string story_id story_id title, subtitle, byline The same fields show_sections show_sections, only when it is true _demo Always true", + "Field Value step, object, question, answer From the bundle step x, y, zoom From the bundle step, as strings; 0.5, 0.5 and 1 when absent alt_text, page, clip_start, clip_end, loop Copied as strings, only when they have a value layer1_button, layer2_button The layer's button layer1_title, layer2_title The layer's title, or its button when it has none layer1_text, layer2_text The layer's content, rendered layer1_demo, layer2_demo true for every layer present _demo Always true", + "File What it shows _layouts/index.html A demo-badge with lang.demo.badge on demo story cards _layouts/story.html An intro-demo-label with lang.story.demo_label on a demo story's intro card assets/js/telar-story/panels.js A demo-badge-inline with lang.demo.panel_badge next to the title of a panel whose layer1_demo or layer2_demo is set _layouts/objects-index.html Lists the site's objects first and demo objects after them _includes/object-grid-item.html A demo-badge with lang.demo.badge on demo object cards _layouts/object.html An object-demo-label with lang.story.demo_label on a demo object's page _layouts/glossary-index.html A demo-badge-inline with lang.demo.badge next to demo entries _layouts/glossary.html A demo-badge-inline with lang.demo.panel_badge on a demo entry's page", + "Key English Spanish demo.badge DEMO DEMO demo.panel_badge Demo content Contenido de demostración story.demo_label Demo content Contenido de demostración", + "Path Written by Removed _demo_content/telar-demo-bundle.json save_bundle() By cleanup_demo_content() at the start of every run of the fetch script _data/{story_id}.json for each demo story _write_demo_stories() By _cleanup_stale_data_files() when the loaded bundle no longer has the story _data/demo-glossary.json _write_demo_glossary() By _cleanup_stale_data_files() when no bundle is loaded or the loaded bundle has no glossary Demo records in _data/project.json and _data/objects.json _merge_demo_projects(), _merge_demo_objects() Rewritten from the site's spreadsheets on every build", + "Path Contents demos/versions.json The version index the fetch script reads demos/v{version}/{language}/ One bundle's sources and its telar-demo-bundle.json iiif/all-demo-objects.csv The images the generator tiles, with English and Spanish metadata for their manifests iiif/sources/ Source images for those tiles iiif/objects/{object_id}/ Hosted IIIF objects: manifest.json, info.json and tiles assets/images/ Images that panels use, such as carousel images generator/build-demos.py The bundle and tile generator", + "File Contents demo-project.csv One row per story demo-objects.csv The objects {story_id}.csv One file per story, named by the story's story_id glossary.csv or glosario.csv The glossary entries texts/stories/ Markdown files that panel cells point to", + "Source Columns Project order, story_id, title, subtitle, byline, show_sections Objects title, description, source_url, creator, period, credit, thumbnail, year, object_type, subjects, featured, medium, alt_text, source Story step, object, x, y, zoom, question, answer, alt_text, page, layer1_button, layer1_content, layer2_button, layer2_content Glossary term_id, title, definition, kind, related_terms", + "Option Effect --version, -v The bundle version to build, matching a demos/v{version}/ directory; required unless --iiif-only is given --bundle-only Build the bundles only --iiif-only Generate IIIF tiles only --force Regenerate tiles that already exist --base-url The base URL written into IIIF manifests and into the URLs the bundle carries; defaults to https://content.telar.org --skip-validation Skip IIIF manifest validation" + ], + "blockquote": [], + "img": [] + }, + "text": "Demo System Architecture This page describes how a Telar site fetches its demo content, merges it into the site's data, and marks it on the page, and how the demo bundles are produced. For what demo content looks like to a site's author, see Demo Content . Overview Demo content is published as one JSON file per Telar release and language, the demo bundle, at content.telar.org . The site is served by GitHub Pages from the demo content repository . A site downloads the bundle during its build, merges it into the JSON files in _data/ , and the collection generator writes demo stories, objects and glossary entries as pages flagged demo: true . The parts involved are: Part Role scripts/fetch_demo_content.py Reads the site's settings, picks a bundle version, downloads and checks the bundle, and saves it scripts/telar/demo.py Runs the fetch script ( fetch_demo_content_if_enabled ), loads the saved bundle ( load_demo_bundle ), and merges it into _data/ ( merge_demo_content ) scripts/telar/core.py Calls those functions from main() , which scripts/csv_to_json.py runs scripts/generate_collections.py and scripts/telar/glossary_pages.py Write the story, object and glossary pages, including the demo ones _demo_content/telar-demo-bundle.json The downloaded bundle; gitignored _data/demo-glossary.json The bundle's glossary entries, for the glossary page generator; gitignored Build Sequence The build workflow has no separate step for demo content. The fetch runs inside the Convert CSV to JSON step, which runs python scripts/csv_to_json.py . When csv_to_json.py runs: fetch_demo_content_if_enabled() runs python3 scripts/fetch_demo_content.py as a subprocess, before any spreadsheet is converted. It allows the subprocess 60 seconds and prints its standard output. The subprocess's exit status is not checked, and a timeout or an error starting it prints a warning and lets the build continue. The site's project, objects and story spreadsheets are converted to JSON in _data/ . load_demo_bundle() reads _demo_content/telar-demo-bundle.json if it exists, and merge_demo_content() merges it into _data/ . _cleanup_stale_data_files() removes any _data/*.json story file that matches neither a spreadsheet in telar-content/spreadsheets/ nor a story in the loaded bundle. This removes the demo story files after demo content is turned off, or after a change of language or bundle version. It also removes _data/demo-glossary.json when no bundle is loaded or the loaded bundle has no glossary, so the demo glossary entries go with the stories. The next workflow step, Generate Jekyll collections , runs generate_collections.py , which writes the pages. Fetching the Bundle Settings load_config() in fetch_demo_content.py reads three settings from _config.yml : Setting Used for When it is missing or invalid story_interface.include_demo_content Whether to fetch Treated as false telar.version Choosing the bundle version A value that does not parse prints a warning, and the script exits without fetching telar_language Choosing the bundle language Any value other than en or es prints a warning and is treated as en The version may carry a v or V prefix and a -beta suffix (for example v1.8.0 or 1.0.0-beta ). The script uses only the three-part release number. If include_demo_content is false , cleanup_demo_content() deletes _demo_content/ and the script exits. If it is true , the script deletes _demo_content/ first and then fetches, so a failed fetch leaves no bundle from an earlier build behind. Version Matching fetch_versions_index() downloads https://content.telar.org/demos/versions.json , which lists the published bundle versions: { \"versions\": [ \"0.6.0\", \"0.8.1\", \"0.9.0\", \"1.8.0\" ] } find_best_version(site_version, available_versions) returns the highest listed version that is less than or equal to the site's version. With the versions above, sites get these bundles: Site version Bundle 1.8.0 and later 1.8.0 0.9.0 to 1.7.x 0.9.0 0.8.1 to 0.8.x 0.8.1 0.6.0 to 0.8.0 0.6.0 If no listed version is less than or equal to the site's version, the script prints the available versions and exits without fetching. If versions.json cannot be read, the script tries a bundle for the site's own version. Download and Checks fetch_bundle(version, language) downloads: https://content.telar.org/demos/v{version}/{language}/telar-demo-bundle.json and prints the bundle's _meta.telar_version , _meta.language and _meta.generated . On a 404, another HTTP error, a network error or invalid JSON, it prints the error and returns None , and the script exits with \"Your site will build without demos\". The fetch script applies these limits: Limit Value Timeout for versions.json 10 seconds Timeout for the bundle 30 seconds Size of versions.json 64 KB Size of the bundle 10 MB The size limits are MAX_VERSIONS_BYTES and MAX_BUNDLE_BYTES in scripts/pipeline_utils.py . Before saving, save_bundle() checks that the bundle has the keys _meta , objects , stories and project ; that objects , stories and project are each a list or an object; and that objects and stories have no more than 10,000 entries each. A bundle that fails any check is not saved. A bundle that passes is written to _demo_content/telar-demo-bundle.json . Bundle Format A bundle has these top-level keys: Key Contents _meta bundle_format , telar_version , language , generated , generator , source , description , license iiif_base_url The base URL of the bundle's hosted IIIF objects project A list of story entries, one per story objects An object keyed by object ID stories An object keyed by story ID, each holding a steps list glossary An object keyed by glossary entry ID The site's build does not read iiif_base_url or _meta.bundle_format . A project entry from the English v1.8.0 bundle: { \"order\": 2, \"story_id\": \"colonial-landscapes\", \"title\": \"Colonial Landscapes\", \"subtitle\": \"A 1614 legal painting of the Bogotá savanna — a story with complex content\", \"byline\": \"By Santiago Muñoz, Adelaida Ávila, and María Alejandra Orduz Avella\", \"show_sections\": true } An entry in objects : \"demo-leviathan\": { \"title\": \"Leviathan Frontispiece\", \"description\": \"Frontispiece from Thomas Hobbes' Leviathan (1651), showing the sovereign as a giant body composed of individual citizens\", \"creator\": \"Abraham Bosse (after design by Thomas Hobbes)\", \"period\": \"17th century\", \"credit\": \"British Library\", \"year\": \"1651\", \"subjects\": \"political philosophy, sovereignty\", \"featured\": \"TRUE\", \"source\": \"British Library\", \"source_url\": \"https://content.telar.org/iiif/objects/demo-leviathan/manifest.json\", \"thumbnail\": \"https://content.telar.org/iiif/objects/demo-leviathan/full/231,313/0/default.jpg\" } Each step in a story's steps list has step , object , x , y and zoom , and may have question , answer , alt_text , page and layers . A step whose object is empty is a title card. This is step 2 of colonial-landscapes : { \"step\": 2, \"object\": \"\", \"x\": 0.5, \"y\": 0.5, \"zoom\": 1.0, \"question\": \"A Painting of the Savanna\", \"answer\": \"This document, which can be read both as a map and a painting, was part of a legal proceeding that consolidated one of the most important haciendas and family lineages of the New Kingdom of Granada.\" } layers holds layer1 and layer2 , each with button , content and, when the panel's markdown file has a title in its front matter, title . Layer content is raw markdown; the site's build renders it. A glossary entry has term (its title) and content (markdown), and may have kind and related_terms . The kind value is written as in the source spreadsheet, for example source in the English bundle and fuente in the Spanish one; the site's build resolves both to the same kind. Merging into _data/ merge_demo_content(bundle) runs four functions in order. Each catches its own errors and prints a [WARN] line, so a failure in one does not stop the others. Stories in project.json _merge_demo_projects() turns each project entry into a story record and puts the demo stories before the site's own in stories of the first entry in _data/project.json . It runs only when _data/project.json exists and the bundle's project list is not empty. Record field Taken from number order , as a string story_id story_id title , subtitle , byline The same fields show_sections show_sections , only when it is true _demo Always true No other field is carried. In the v1.8.0 bundles, colonial-landscapes and paisajes set show_sections to true , so their intro cards list their sections. Objects in objects.json _merge_demo_objects() appends the bundle's objects to _data/objects.json . An object whose ID is already in the site's objects is skipped, and the site's object is kept. Each demo object gets object_id , title , description , source_url , iiif_manifest , creator , period , year , object_type , subjects , featured , source , credit , thumbnail , medium and _demo: true , with these rules: iiif_manifest is a copy of source_url source falls back to location , the field name in the v0.6.0 bundles medium falls back to object_type alt_text is added only when the bundle object has a value for it media_type is computed from source_url by detect_media_type() , as for the site's own objects; a media_type in the bundle is not read Story Files _write_demo_stories() writes one _data/{story_id}.json per bundle story. Each step becomes: Field Value step , object , question , answer From the bundle step x , y , zoom From the bundle step, as strings; 0.5 , 0.5 and 1 when absent alt_text , page , clip_start , clip_end , loop Copied as strings, only when they have a value layer1_button , layer2_button The layer's button layer1_title , layer2_title The layer's title , or its button when it has none layer1_text , layer2_text The layer's content , rendered layer1_demo , layer2_demo true for every layer present _demo Always true Layer content goes through the same steps as a site's own panels: process_widgets() , then process_images() , then render_markdown() , which adds glossary links to the rendered HTML. Answers are rendered with render_answer() , as a site's answers are. If a story contains LaTeX, a {\"_metadata\": true, \"has_latex\": true} entry is put first in the file. Glossary links in a demo story resolve against a link map built by _demo_link_terms() from the bundle's glossary and the site's own glossary pages together. Glossary _write_demo_glossary() writes the bundle's glossary to _data/demo-glossary.json as a list. Each entry has term_id , title (from term ), content and _demo: true , plus kind and related_terms when the bundle entry has them. A related_terms value written as a string is split on | into a list. Writing the Pages generate_collections.py reads the merged data and writes the Jekyll collection files: Stories ( generate_stories() ): a story record with _demo gets demo: true in its front matter. Demo stories get sort_order values from 0 and the site's stories from 1000, so the home page lists demo stories first. Objects : a demo object gets demo: true in its front matter. Glossary ( generate_glossary() in scripts/telar/glossary_pages.py ): demo entries are written after the site's own, from _data/demo-glossary.json . Each gets glossary_kind (resolved by resolve_kind() ) and demo: true . Two glossary entries whose IDs produce the same page address cannot both be published. place_demo_terms() decides which demo entries are written: a demo entry whose address already belongs to a site entry, or to an earlier demo entry, is skipped with a warning, and links to its ID go to the page that holds the address. The same function decides the glossary links in demo stories, so the links and the pages agree. All demo entry IDs begin with demo- . Marking Demo Content The layouts read the demo front matter flag, and the story engine reads the layer flags: File What it shows _layouts/index.html A demo-badge with lang.demo.badge on demo story cards _layouts/story.html An intro-demo-label with lang.story.demo_label on a demo story's intro card assets/js/telar-story/panels.js A demo-badge-inline with lang.demo.panel_badge next to the title of a panel whose layer1_demo or layer2_demo is set _layouts/objects-index.html Lists the site's objects first and demo objects after them _includes/object-grid-item.html A demo-badge with lang.demo.badge on demo object cards _layouts/object.html An object-demo-label with lang.story.demo_label on a demo object's page _layouts/glossary-index.html A demo-badge-inline with lang.demo.badge next to demo entries _layouts/glossary.html A demo-badge-inline with lang.demo.panel_badge on a demo entry's page panels.js reads the panel badge text from window.telarLang.demoPanelBadge , which _layouts/story.html sets from lang.demo.panel_badge . The strings are in _data/languages/en.yml and es.yml : Key English Spanish demo.badge DEMO DEMO demo.panel_badge Demo content Contenido de demostración story.demo_label Demo content Contenido de demostración Files on Disk Path Written by Removed _demo_content/telar-demo-bundle.json save_bundle() By cleanup_demo_content() at the start of every run of the fetch script _data/{story_id}.json for each demo story _write_demo_stories() By _cleanup_stale_data_files() when the loaded bundle no longer has the story _data/demo-glossary.json _write_demo_glossary() By _cleanup_stale_data_files() when no bundle is loaded or the loaded bundle has no glossary Demo records in _data/project.json and _data/objects.json _merge_demo_projects() , _merge_demo_objects() Rewritten from the site's spreadsheets on every build .gitignore lists _demo_content/ and _data/demo-glossary.json . The Demo Content Repository The bundles are built in the demo content repository , which content.telar.org serves. Layout The repository holds: Path Contents demos/versions.json The version index the fetch script reads demos/v{version}/{language}/ One bundle's sources and its telar-demo-bundle.json iiif/all-demo-objects.csv The images the generator tiles, with English and Spanish metadata for their manifests iiif/sources/ Source images for those tiles iiif/objects/{object_id}/ Hosted IIIF objects: manifest.json , info.json and tiles assets/images/ Images that panels use, such as carousel images generator/build-demos.py The bundle and tile generator A language directory holds these sources: File Contents demo-project.csv One row per story demo-objects.csv The objects {story_id}.csv One file per story, named by the story's story_id glossary.csv or glosario.csv The glossary entries texts/stories/ Markdown files that panel cells point to The v1.8.0 bundles hold two stories: allegorical-woman (10 steps) and colonial-landscapes (22 steps) in English, and mujer-alegorica and paisajes in Spanish. Each language has 12 objects and 24 glossary entries. The Generator The generator builds a bundle from a language directory's sources and writes it next to them. It reads the following columns: Source Columns Project order , story_id , title , subtitle , byline , show_sections Objects title , description , source_url , creator , period , credit , thumbnail , year , object_type , subjects , featured , medium , alt_text , source Story step , object , x , y , zoom , question , answer , alt_text , page , layer1_button , layer1_content , layer2_button , layer2_content Glossary term_id , title , definition , kind , related_terms Spanish column names are accepted and mapped to these names, as in a site's own spreadsheets. A row is skipped when its key column ( order , object_id , step or term_id ) is empty or begins with # , and a project or story row whose order or step is not a number is skipped too. show_sections is written as true when the cell holds yes , true , sí or si . A layer cell that ends in .md is read as a path under texts/stories/ ; its front matter is removed, and its title , if any, becomes the layer's title . Any other value is used as the panel's markdown. Carousel items whose images are in the repository's assets/images/ get width and height written into them, so a site's build does not have to download the images to size the carousel. For objects listed in iiif/all-demo-objects.csv , the generator fills in an empty source_url with the object's manifest URL on content.telar.org, and an empty thumbnail from the object's info.json . Other objects keep the source_url written in demo-objects.csv . After a bundle is built, the generator rewrites demos/versions.json from the version directories that contain a telar-demo-bundle.json . The generator's options are: Option Effect --version , -v The bundle version to build, matching a demos/v{version}/ directory; required unless --iiif-only is given --bundle-only Build the bundles only --iiif-only Generate IIIF tiles only --force Regenerate tiles that already exist --base-url The base URL written into IIIF manifests and into the URLs the bundle carries; defaults to https://content.telar.org --skip-validation Skip IIIF manifest validation To rebuild the v1.8.0 bundles without regenerating tiles: python generator/build-demos.py --version 1.8.0 --bundle-only Troubleshooting Run the Fetch on Its Own From the root of a site, run: python3 scripts/fetch_demo_content.py The script prints the site version and language it read, the bundle version it chose, the bundle's URL and _meta fields, and a count of the projects, objects, stories and glossary entries it saved. Check the Merge After python3 scripts/csv_to_json.py , the merge prints a line for each part: Merged 2 demo project(s) into project.json , a Merged ... demo object(s) line, a Created demo story: line for each story, and Created _data/demo-glossary.json (24 demo terms) for the v1.8.0 bundles. A failure in a part prints a [WARN] line instead. Each demo record in _data/project.json and _data/objects.json has \"_demo\": true . Check the Published Files To see which versions are published, and to check that a bundle is reachable: curl https://content.telar.org/demos/versions.json curl -I https://content.telar.org/demos/v1.8.0/en/telar-demo-bundle.json Related Documentation Demo Content : demo content for site authors GitHub Actions : the build workflow" + }, + "/guia/desarrolladores/sistema-demos/": { + "ids": [ + "archivos-de-historia", + "archivos-en-disco", + "arquitectura-del-contenido-de-demostración", + "configuración", + "cómo-se-marca-el-contenido-de-demostración", + "descarga-del-paquete", + "descarga-y-verificaciones", + "ejecutar-la-descarga-por-separado", + "el-generador", + "el-repositorio-de-contenido-de-demostración", + "escritura-de-las-páginas", + "estructura", + "formato-del-paquete", + "glosario", + "historias-en-projectjson", + "incorporación-a-_data", + "objetos-en-objectsjson", + "resumen", + "revisar-la-incorporación", + "revisar-los-archivos-publicados", + "secuencia-del-build", + "selección-de-versión", + "solución-de-problemas", + "véase-también" + ], + "selectors": { + "h1": [ + "Arquitectura del contenido de demostración" + ], + "h2": [ + "Resumen", + "Secuencia del build", + "Descarga del paquete", + "Formato del paquete", + "Incorporación a _data/", + "Escritura de las páginas", + "Cómo se marca el contenido de demostración", + "Archivos en disco", + "El repositorio de contenido de demostración", + "Solución de problemas", + "Véase también" + ], + "h3": [ + "Configuración", + "Selección de versión", + "Descarga y verificaciones", + "Historias en project.json", + "Objetos en objects.json", + "Archivos de historia", + "Glosario", + "Estructura", + "El generador", + "Ejecutar la descarga por separado", + "Revisar la incorporación", + "Revisar los archivos publicados" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "{ \"versions\": [ \"0.6.0\", \"0.8.1\", \"0.9.0\", \"1.8.0\" ] }", + "https://content.telar.org/demos/v{version}/{language}/telar-demo-bundle.json", + "{ \"order\": 2, \"story_id\": \"paisajes\", \"title\": \"Paisajes coloniales\", \"subtitle\": \"Una pintura legal de 1614 de la Sabana de Bogotá — una historia con contenidos complejos\", \"byline\": \"Por Santiago Muñoz, Adelaida Ávila y María Alejandra Orduz Avella\", \"show_sections\": true }", + "\"demo-leviathan\": { \"title\": \"Frontispicio del Leviatán\", \"description\": \"Frontispicio del Leviatán de Thomas Hobbes (1651), en el que el soberano aparece como un cuerpo gigante compuesto por ciudadanos individuales.\", \"creator\": \"Abraham Bosse (según diseño de Thomas Hobbes)\", \"period\": \"siglo XVII\", \"credit\": \"British Library\", \"year\": \"1651\", \"subjects\": \"filosofía política, soberanía\", \"featured\": \"TRUE\", \"medium\": \"Grabado\", \"source\": \"British Library\", \"source_url\": \"https://content.telar.org/iiif/objects/demo-leviathan/manifest.json\", \"thumbnail\": \"https://content.telar.org/iiif/objects/demo-leviathan/full/231,313/0/default.jpg\" }", + "{ \"step\": 2, \"object\": \"\", \"x\": 0.5, \"y\": 0.5, \"zoom\": 1.0, \"question\": \"Una pintura de la Sabana\", \"answer\": \"Este documento, que oscila entre mapa y pintura, formó parte de un proceso legal en el que se consolidaron una de las haciendas y uno de los linajes más importantes del Nuevo Reino de Granada.\" }", + "python generator/build-demos.py --version 1.8.0 --bundle-only", + "python3 scripts/fetch_demo_content.py", + "curl https://content.telar.org/demos/versions.json curl -I https://content.telar.org/demos/v1.8.0/en/telar-demo-bundle.json" + ], + "table": [ + "Pieza Función scripts/fetch_demo_content.py Lee la configuración del sitio, elige una versión del paquete, lo descarga, lo verifica y lo guarda scripts/telar/demo.py Ejecuta el script de descarga (fetch_demo_content_if_enabled), carga el paquete guardado (load_demo_bundle) y lo incorpora a _data/ (merge_demo_content) scripts/telar/core.py Llama a esas funciones desde main(), que es lo que ejecuta scripts/csv_to_json.py scripts/generate_collections.py y scripts/telar/glossary_pages.py Escriben las páginas de historias, objetos y glosario, incluidas las de demostración _demo_content/telar-demo-bundle.json El paquete descargado; excluido de git _data/demo-glossary.json Las entradas del glosario del paquete, para el generador de páginas del glosario; excluido de git", + "Ajuste Para qué sirve Si falta o no es válido story_interface.include_demo_content Decidir si se descarga Se toma como false telar.version Elegir la versión del paquete Si no se puede interpretar, el script muestra una advertencia y termina sin descargar telar_language Elegir el idioma del paquete Cualquier valor distinto de en o es produce una advertencia y se toma como en", + "Versión del sitio Paquete 1.8.0 o posterior 1.8.0 De 0.9.0 a 1.7.x 0.9.0 De 0.8.1 a 0.8.x 0.8.1 De 0.6.0 a 0.8.0 0.6.0", + "Límite Valor Tiempo de espera para versions.json 10 segundos Tiempo de espera para el paquete 30 segundos Tamaño de versions.json 64 KB Tamaño del paquete 10 MB", + "Clave Contenido _meta bundle_format, telar_version, language, generated, generator, source, description, license iiif_base_url La URL base de los objetos IIIF alojados que usa el paquete project Una lista de entradas de historia, una por historia objects Un objeto con los objetos del paquete, indexados por identificador de objeto stories Un objeto con las historias, indexadas por identificador de historia; cada una tiene una lista steps glossary Un objeto con las entradas del glosario, indexadas por su identificador", + "Campo del registro Se toma de number order, como cadena de texto story_id story_id title, subtitle, byline Los mismos campos show_sections show_sections, solo cuando es true _demo Siempre true", + "Campo Valor step, object, question, answer Del paso del paquete x, y, zoom Del paso del paquete, como cadenas de texto; 0.5, 0.5 y 1 si faltan alt_text, page, clip_start, clip_end, loop Se copian como cadenas de texto, solo cuando tienen un valor layer1_button, layer2_button El button de la capa layer1_title, layer2_title El title de la capa, o su button si no tiene título layer1_text, layer2_text El content de la capa, ya convertido layer1_demo, layer2_demo true para cada capa presente _demo Siempre true", + "Archivo Qué muestra _layouts/index.html Un demo-badge con lang.demo.badge en las tarjetas de las historias de demostración _layouts/story.html Un intro-demo-label con lang.story.demo_label en la tarjeta de inicio de una historia de demostración assets/js/telar-story/panels.js Un demo-badge-inline con lang.demo.panel_badge junto al título de un panel que tenga layer1_demo o layer2_demo _layouts/objects-index.html Muestra primero los objetos del sitio y después los de demostración _includes/object-grid-item.html Un demo-badge con lang.demo.badge en las tarjetas de los objetos de demostración _layouts/object.html Un object-demo-label con lang.story.demo_label en la página de un objeto de demostración _layouts/glossary-index.html Un demo-badge-inline con lang.demo.badge junto a las entradas de demostración _layouts/glossary.html Un demo-badge-inline con lang.demo.panel_badge en la página de una entrada de demostración", + "Clave Inglés Español demo.badge DEMO DEMO demo.panel_badge Demo content Contenido de demostración story.demo_label Demo content Contenido de demostración", + "Ruta Lo escribe Cuándo se borra _demo_content/telar-demo-bundle.json save_bundle() Lo borra cleanup_demo_content() al comienzo de cada ejecución del script de descarga _data/{story_id}.json de cada historia de demostración _write_demo_stories() Lo borra _cleanup_stale_data_files() cuando el paquete cargado ya no tiene esa historia _data/demo-glossary.json _write_demo_glossary() Lo borra _cleanup_stale_data_files() cuando no hay un paquete cargado o cuando el paquete no trae glosario Registros de demostración en _data/project.json y _data/objects.json _merge_demo_projects(), _merge_demo_objects() Se reescriben a partir de las hojas de cálculo del sitio en cada build", + "Ruta Contenido demos/versions.json El índice de versiones que lee el script de descarga demos/v{version}/{language}/ Las fuentes de un paquete y su telar-demo-bundle.json iiif/all-demo-objects.csv Las imágenes que el generador convierte en teselas (tiles), con los metadatos en inglés y en español para sus manifiestos iiif/sources/ Las imágenes de origen de esas teselas iiif/objects/{object_id}/ Los objetos IIIF alojados: manifest.json, info.json y las teselas assets/images/ Imágenes que usan los paneles, como las de los carruseles generator/build-demos.py El generador de paquetes y teselas", + "Archivo Contenido demo-project.csv Una fila por historia demo-objects.csv Los objetos {story_id}.csv Un archivo por historia, que lleva el nombre de su story_id glossary.csv o glosario.csv Las entradas del glosario texts/stories/ Los archivos Markdown a los que remiten las celdas de los paneles", + "Hoja de cálculo Columnas Proyecto order, story_id, title, subtitle, byline, show_sections Objetos title, description, source_url, creator, period, credit, thumbnail, year, object_type, subjects, featured, medium, alt_text, source Historia step, object, x, y, zoom, question, answer, alt_text, page, layer1_button, layer1_content, layer2_button, layer2_content Glosario term_id, title, definition, kind, related_terms", + "Opción Efecto --version, -v La versión del paquete que se va a construir, que corresponde a un directorio demos/v{version}/; es obligatoria, salvo con --iiif-only --bundle-only Construye solo los paquetes --iiif-only Genera solo las teselas IIIF --force Vuelve a generar las teselas que ya existen --base-url La URL base que se escribe en los manifiestos IIIF y en las URL que lleva el paquete; por defecto, https://content.telar.org --skip-validation Omite la validación de los manifiestos IIIF" + ], + "blockquote": [], + "img": [] + }, + "text": "Arquitectura del contenido de demostración Esta página explica cómo un sitio de Telar descarga el contenido de demostración, lo incorpora a sus datos y lo marca en las páginas, y también cómo se producen los paquetes de demostración. La página Contenido de demostración lo explica desde el punto de vista de quien hace un sitio. Resumen El contenido de demostración se publica en content.telar.org como un solo archivo JSON por versión de Telar y por idioma: el paquete de demostración. GitHub Pages sirve ese sitio desde el repositorio de contenido de demostración . Durante el build , el sitio descarga el paquete y lo incorpora a los archivos JSON de _data/ ; luego, el generador de colecciones escribe las historias, los objetos y las entradas del glosario de demostración como páginas marcadas con demo: true . Estas son las piezas que intervienen: Pieza Función scripts/fetch_demo_content.py Lee la configuración del sitio, elige una versión del paquete, lo descarga, lo verifica y lo guarda scripts/telar/demo.py Ejecuta el script de descarga ( fetch_demo_content_if_enabled ), carga el paquete guardado ( load_demo_bundle ) y lo incorpora a _data/ ( merge_demo_content ) scripts/telar/core.py Llama a esas funciones desde main() , que es lo que ejecuta scripts/csv_to_json.py scripts/generate_collections.py y scripts/telar/glossary_pages.py Escriben las páginas de historias, objetos y glosario, incluidas las de demostración _demo_content/telar-demo-bundle.json El paquete descargado; excluido de git _data/demo-glossary.json Las entradas del glosario del paquete, para el generador de páginas del glosario; excluido de git Secuencia del build El flujo de trabajo Build and Deploy no tiene un paso propio para el contenido de demostración. La descarga ocurre dentro del paso Convert CSV to JSON , que ejecuta python scripts/csv_to_json.py . Cuando se ejecuta csv_to_json.py : Antes de convertir las hojas de cálculo, fetch_demo_content_if_enabled() ejecuta python3 scripts/fetch_demo_content.py como subproceso, con un plazo de 60 segundos, y muestra su salida estándar. No revisa el código de salida del subproceso; si se agota el plazo o el subproceso no logra arrancar, muestra una advertencia y el build continúa. Las hojas de cálculo del proyecto, de los objetos y de las historias del sitio se convierten a JSON en _data/ . load_demo_bundle() lee _demo_content/telar-demo-bundle.json , si existe, y merge_demo_content() lo incorpora a _data/ . _cleanup_stale_data_files() borra cualquier archivo de historia _data/*.json que no corresponda ni a una hoja de cálculo de telar-content/spreadsheets/ ni a una historia del paquete cargado. Así desaparecen los archivos de las historias de demostración cuando se desactiva el contenido de demostración o cuando cambian el idioma o la versión del paquete. También borra _data/demo-glossary.json cuando no hay un paquete cargado o cuando el paquete no trae glosario; así, las entradas del glosario de demostración desaparecen junto con las historias. El paso siguiente del flujo de trabajo, Generate Jekyll collections , ejecuta generate_collections.py , que escribe las páginas. Descarga del paquete Configuración load_config() , en fetch_demo_content.py , lee tres valores de _config.yml : Ajuste Para qué sirve Si falta o no es válido story_interface.include_demo_content Decidir si se descarga Se toma como false telar.version Elegir la versión del paquete Si no se puede interpretar, el script muestra una advertencia y termina sin descargar telar_language Elegir el idioma del paquete Cualquier valor distinto de en o es produce una advertencia y se toma como en La versión puede llevar el prefijo v o V y el sufijo -beta (por ejemplo, v1.8.0 o 1.0.0-beta ). El script solo usa el número de versión de tres partes. Si include_demo_content es false , cleanup_demo_content() borra _demo_content/ y el script termina. Si es true , el script borra primero _demo_content/ y después descarga; así, si la descarga falla, no queda ningún paquete de un build anterior. Selección de versión fetch_versions_index() descarga https://content.telar.org/demos/versions.json , que enumera las versiones publicadas del paquete: { \"versions\": [ \"0.6.0\", \"0.8.1\", \"0.9.0\", \"1.8.0\" ] } find_best_version(site_version, available_versions) devuelve la versión más alta de la lista que sea menor o igual a la del sitio. Con las versiones de arriba, cada sitio recibe estos paquetes: Versión del sitio Paquete 1.8.0 o posterior 1.8.0 De 0.9.0 a 1.7.x 0.9.0 De 0.8.1 a 0.8.x 0.8.1 De 0.6.0 a 0.8.0 0.6.0 Si ninguna versión de la lista es menor o igual a la del sitio, el script muestra las versiones disponibles y termina sin descargar. Si no puede leer versions.json , intenta descargar el paquete de la misma versión que el sitio. Descarga y verificaciones fetch_bundle(version, language) descarga: https://content.telar.org/demos/v{version}/{language}/telar-demo-bundle.json y muestra los campos _meta.telar_version , _meta.language y _meta.generated del paquete. Ante un 404, otro error HTTP, un error de red o un JSON no válido, muestra el error y devuelve None , y el script termina con \"Your site will build without demos\". El script de descarga aplica estos límites: Límite Valor Tiempo de espera para versions.json 10 segundos Tiempo de espera para el paquete 30 segundos Tamaño de versions.json 64 KB Tamaño del paquete 10 MB Los límites de tamaño son MAX_VERSIONS_BYTES y MAX_BUNDLE_BYTES , en scripts/pipeline_utils.py . Antes de guardar, save_bundle() verifica que el paquete tenga las claves _meta , objects , stories y project ; que objects , stories y project sean cada uno una lista o un objeto, y que objects y stories no tengan más de 10.000 entradas cada uno. Si el paquete no pasa alguna de estas verificaciones, no se guarda; si las pasa todas, se escribe en _demo_content/telar-demo-bundle.json . Formato del paquete Un paquete tiene estas claves de primer nivel: Clave Contenido _meta bundle_format , telar_version , language , generated , generator , source , description , license iiif_base_url La URL base de los objetos IIIF alojados que usa el paquete project Una lista de entradas de historia, una por historia objects Un objeto con los objetos del paquete, indexados por identificador de objeto stories Un objeto con las historias, indexadas por identificador de historia; cada una tiene una lista steps glossary Un objeto con las entradas del glosario, indexadas por su identificador El build del sitio no lee iiif_base_url ni _meta.bundle_format . Una entrada de project del paquete en español de la v1.8.0: { \"order\": 2, \"story_id\": \"paisajes\", \"title\": \"Paisajes coloniales\", \"subtitle\": \"Una pintura legal de 1614 de la Sabana de Bogotá — una historia con contenidos complejos\", \"byline\": \"Por Santiago Muñoz, Adelaida Ávila y María Alejandra Orduz Avella\", \"show_sections\": true } Una entrada de objects : \"demo-leviathan\": { \"title\": \"Frontispicio del Leviatán\", \"description\": \"Frontispicio del Leviatán de Thomas Hobbes (1651), en el que el soberano aparece como un cuerpo gigante compuesto por ciudadanos individuales.\", \"creator\": \"Abraham Bosse (según diseño de Thomas Hobbes)\", \"period\": \"siglo XVII\", \"credit\": \"British Library\", \"year\": \"1651\", \"subjects\": \"filosofía política, soberanía\", \"featured\": \"TRUE\", \"medium\": \"Grabado\", \"source\": \"British Library\", \"source_url\": \"https://content.telar.org/iiif/objects/demo-leviathan/manifest.json\", \"thumbnail\": \"https://content.telar.org/iiif/objects/demo-leviathan/full/231,313/0/default.jpg\" } Cada paso de la lista steps de una historia tiene step , object , x , y y zoom , y puede tener además question , answer , alt_text , page y layers . Un paso con object vacío es una tarjeta de título. Este es el paso 2 de paisajes : { \"step\": 2, \"object\": \"\", \"x\": 0.5, \"y\": 0.5, \"zoom\": 1.0, \"question\": \"Una pintura de la Sabana\", \"answer\": \"Este documento, que oscila entre mapa y pintura, formó parte de un proceso legal en el que se consolidaron una de las haciendas y uno de los linajes más importantes del Nuevo Reino de Granada.\" } layers contiene layer1 y layer2 , cada una con button , content y, cuando el archivo Markdown del panel trae un título en su frontmatter, title . El contenido de las capas es Markdown sin procesar; lo convierte el build del sitio. Una entrada del glosario tiene term (su título) y content (Markdown), y puede tener kind y related_terms . El valor de kind va tal como está escrito en la hoja de cálculo de origen, por ejemplo fuente en el paquete en español y source en el paquete en inglés; el build del sitio interpreta ambos como el mismo tipo. Incorporación a _data/ merge_demo_content(bundle) ejecuta cuatro funciones, en este orden. Cada una captura sus propios errores y muestra una línea [WARN] , así que, si una falla, las demás se ejecutan igual. Historias en project.json _merge_demo_projects() convierte cada entrada de project en un registro de historia y pone las historias de demostración antes de las del sitio, en la lista stories de la primera entrada de _data/project.json . Solo se ejecuta si _data/project.json existe y la lista project del paquete no está vacía. Campo del registro Se toma de number order , como cadena de texto story_id story_id title , subtitle , byline Los mismos campos show_sections show_sections , solo cuando es true _demo Siempre true No se copia ningún otro campo. En los paquetes de la v1.8.0, colonial-landscapes y paisajes tienen show_sections en true , así que la tarjeta de inicio de cada una muestra la tabla de contenidos de secciones. Objetos en objects.json _merge_demo_objects() agrega los objetos del paquete al final de _data/objects.json . Si el identificador de un objeto ya está entre los objetos del sitio, ese objeto se omite y se conserva el del sitio. Cada objeto de demostración recibe object_id , title , description , source_url , iiif_manifest , creator , period , year , object_type , subjects , featured , source , credit , thumbnail , medium y _demo: true , con estas reglas: iiif_manifest es una copia de source_url si falta source , se usa location , el nombre que tenía ese campo en los paquetes de la v0.6.0 si falta medium , se usa object_type alt_text solo se agrega cuando el objeto del paquete tiene un valor para ese campo media_type se calcula a partir de source_url con detect_media_type() , igual que para los objetos del propio sitio; no se lee ningún media_type que traiga el paquete Archivos de historia _write_demo_stories() escribe un _data/{story_id}.json por cada historia del paquete. Cada paso queda así: Campo Valor step , object , question , answer Del paso del paquete x , y , zoom Del paso del paquete, como cadenas de texto; 0.5 , 0.5 y 1 si faltan alt_text , page , clip_start , clip_end , loop Se copian como cadenas de texto, solo cuando tienen un valor layer1_button , layer2_button El button de la capa layer1_title , layer2_title El title de la capa, o su button si no tiene título layer1_text , layer2_text El content de la capa, ya convertido layer1_demo , layer2_demo true para cada capa presente _demo Siempre true El contenido de las capas recibe el mismo procesamiento que los paneles del propio sitio: process_widgets() , luego process_images() y por último render_markdown() , que agrega los enlaces de glosario al HTML resultante. Las respuestas se convierten con render_answer() , igual que las del sitio. Si una historia contiene LaTeX, se agrega una entrada {\"_metadata\": true, \"has_latex\": true} al comienzo del archivo. Los enlaces de glosario de una historia de demostración se resuelven con un mapa de enlaces que _demo_link_terms() arma a partir del glosario del paquete y de las páginas de glosario del propio sitio. Glosario _write_demo_glossary() escribe el glosario del paquete en _data/demo-glossary.json , como una lista. Cada entrada tiene term_id , title (tomado de term ), content y _demo: true , y además kind y related_terms cuando la entrada del paquete los trae. Si related_terms viene como cadena de texto, se divide en una lista por el carácter | . Escritura de las páginas generate_collections.py lee los datos ya incorporados y escribe los archivos de las colecciones de Jekyll: Historias ( generate_stories() ): un registro de historia con _demo recibe demo: true en su frontmatter. Las historias de demostración reciben valores de sort_order a partir de 0, y las del sitio a partir de 1000, de modo que la página de inicio muestra primero las de demostración. Objetos : un objeto de demostración recibe demo: true en su frontmatter. Glosario ( generate_glossary() , en scripts/telar/glossary_pages.py ): las entradas de demostración se escriben después de las del sitio, a partir de _data/demo-glossary.json . Cada una recibe glossary_kind (que resuelve resolve_kind() ) y demo: true . No se pueden publicar dos entradas del glosario cuyos identificadores produzcan la misma URL. place_demo_terms() decide qué entradas de demostración se escriben: si la URL de una entrada de demostración ya pertenece a una entrada del sitio, o a una entrada de demostración anterior, esa entrada se omite con una advertencia, y los enlaces a su identificador llevan a la página que ocupa esa URL. La misma función decide los enlaces de glosario de las historias de demostración, así que los enlaces y las páginas coinciden. Todos los identificadores de las entradas de demostración empiezan con demo- . Cómo se marca el contenido de demostración Las plantillas leen la marca demo del frontmatter, y el motor de historias lee las marcas de las capas: Archivo Qué muestra _layouts/index.html Un demo-badge con lang.demo.badge en las tarjetas de las historias de demostración _layouts/story.html Un intro-demo-label con lang.story.demo_label en la tarjeta de inicio de una historia de demostración assets/js/telar-story/panels.js Un demo-badge-inline con lang.demo.panel_badge junto al título de un panel que tenga layer1_demo o layer2_demo _layouts/objects-index.html Muestra primero los objetos del sitio y después los de demostración _includes/object-grid-item.html Un demo-badge con lang.demo.badge en las tarjetas de los objetos de demostración _layouts/object.html Un object-demo-label con lang.story.demo_label en la página de un objeto de demostración _layouts/glossary-index.html Un demo-badge-inline con lang.demo.badge junto a las entradas de demostración _layouts/glossary.html Un demo-badge-inline con lang.demo.panel_badge en la página de una entrada de demostración panels.js toma el texto de la insignia del panel de window.telarLang.demoPanelBadge , que _layouts/story.html define a partir de lang.demo.panel_badge . Los textos están en _data/languages/en.yml y es.yml : Clave Inglés Español demo.badge DEMO DEMO demo.panel_badge Demo content Contenido de demostración story.demo_label Demo content Contenido de demostración Archivos en disco Ruta Lo escribe Cuándo se borra _demo_content/telar-demo-bundle.json save_bundle() Lo borra cleanup_demo_content() al comienzo de cada ejecución del script de descarga _data/{story_id}.json de cada historia de demostración _write_demo_stories() Lo borra _cleanup_stale_data_files() cuando el paquete cargado ya no tiene esa historia _data/demo-glossary.json _write_demo_glossary() Lo borra _cleanup_stale_data_files() cuando no hay un paquete cargado o cuando el paquete no trae glosario Registros de demostración en _data/project.json y _data/objects.json _merge_demo_projects() , _merge_demo_objects() Se reescriben a partir de las hojas de cálculo del sitio en cada build .gitignore incluye _demo_content/ y _data/demo-glossary.json . El repositorio de contenido de demostración Los paquetes se construyen en el repositorio de contenido de demostración , desde el cual se sirve content.telar.org. Estructura El repositorio contiene: Ruta Contenido demos/versions.json El índice de versiones que lee el script de descarga demos/v{version}/{language}/ Las fuentes de un paquete y su telar-demo-bundle.json iiif/all-demo-objects.csv Las imágenes que el generador convierte en teselas ( tiles ), con los metadatos en inglés y en español para sus manifiestos iiif/sources/ Las imágenes de origen de esas teselas iiif/objects/{object_id}/ Los objetos IIIF alojados: manifest.json , info.json y las teselas assets/images/ Imágenes que usan los paneles, como las de los carruseles generator/build-demos.py El generador de paquetes y teselas Un directorio de idioma contiene estos archivos de origen: Archivo Contenido demo-project.csv Una fila por historia demo-objects.csv Los objetos {story_id}.csv Un archivo por historia, que lleva el nombre de su story_id glossary.csv o glosario.csv Las entradas del glosario texts/stories/ Los archivos Markdown a los que remiten las celdas de los paneles Los paquetes de la v1.8.0 tienen dos historias: mujer-alegorica (10 pasos) y paisajes (22 pasos) en español, y allegorical-woman y colonial-landscapes en inglés. Cada idioma tiene 12 objetos y 24 entradas del glosario. El generador El generador arma un paquete a partir de los archivos de origen de un directorio de idioma y lo guarda en ese mismo directorio. Lee las siguientes columnas: Hoja de cálculo Columnas Proyecto order , story_id , title , subtitle , byline , show_sections Objetos title , description , source_url , creator , period , credit , thumbnail , year , object_type , subjects , featured , medium , alt_text , source Historia step , object , x , y , zoom , question , answer , alt_text , page , layer1_button , layer1_content , layer2_button , layer2_content Glosario term_id , title , definition , kind , related_terms Acepta también los nombres de columna en español y los convierte a estos, como ocurre con las hojas de cálculo de cualquier sitio. Se omite una fila cuando su columna clave ( order , object_id , step o term_id ) está vacía o empieza con # , y también una fila de proyecto o de historia cuyo order o step no sea un número. show_sections se escribe como true cuando la celda dice yes , true , sí o si . Una celda de capa que termina en .md se lee como una ruta dentro de texts/stories/ : el generador le quita el frontmatter a ese archivo y, si este tiene title , lo usa como el title de la capa. Cualquier otro valor se usa como el Markdown del panel. Los elementos de un carrusel cuyas imágenes están en assets/images/ del repositorio reciben width y height , para que el build del sitio no tenga que descargar las imágenes para darle tamaño al carrusel. Para los objetos que aparecen en iiif/all-demo-objects.csv , el generador llena un source_url vacío con la URL del manifiesto del objeto en content.telar.org, y un thumbnail vacío a partir del info.json del objeto. Los demás objetos conservan el source_url que tienen en demo-objects.csv . Después de construir un paquete, el generador reescribe demos/versions.json a partir de los directorios de versión que contienen un telar-demo-bundle.json . Las opciones del generador son: Opción Efecto --version , -v La versión del paquete que se va a construir, que corresponde a un directorio demos/v{version}/ ; es obligatoria, salvo con --iiif-only --bundle-only Construye solo los paquetes --iiif-only Genera solo las teselas IIIF --force Vuelve a generar las teselas que ya existen --base-url La URL base que se escribe en los manifiestos IIIF y en las URL que lleva el paquete; por defecto, https://content.telar.org --skip-validation Omite la validación de los manifiestos IIIF Para reconstruir los paquetes de la v1.8.0 sin volver a generar las teselas: python generator/build-demos.py --version 1.8.0 --bundle-only Solución de problemas Ejecutar la descarga por separado Desde la raíz de un sitio, ejecuta: python3 scripts/fetch_demo_content.py El script muestra la versión y el idioma del sitio que leyó, la versión del paquete que eligió, la URL del paquete y sus campos _meta , y cuántos proyectos, objetos, historias y entradas del glosario guardó. Revisar la incorporación Al ejecutar python3 scripts/csv_to_json.py , la incorporación muestra una línea por cada parte: Merged 2 demo project(s) into project.json , una línea Merged ... demo object(s) , una línea Created demo story: por cada historia y, con los paquetes de la v1.8.0, Created _data/demo-glossary.json (24 demo terms) . Si una parte falla, muestra en su lugar una línea [WARN] . Cada registro de demostración en _data/project.json y _data/objects.json tiene \"_demo\": true . Revisar los archivos publicados Para ver qué versiones están publicadas y comprobar que se puede acceder a un paquete: curl https://content.telar.org/demos/versions.json curl -I https://content.telar.org/demos/v1.8.0/en/telar-demo-bundle.json Véase también Contenido de demostración — el contenido de demostración para quienes hacen un sitio GitHub Actions — el flujo de trabajo Build and Deploy" + }, + "/guia/configurar/generador-de-configuracion/": { + "ids": [ + "cg-author", + "cg-browse-and-search", + "cg-collection-mode", + "cg-copied", + "cg-copy", + "cg-custom-domain", + "cg-custom-domain-fields", + "cg-description", + "cg-domain-url", + "cg-domain-url-error", + "cg-domain-url-warn", + "cg-email", + "cg-featured-count", + "cg-generate", + "cg-gh-repo", + "cg-gh-repo-error", + "cg-gh-repo-warn", + "cg-gh-username", + "cg-gh-username-error", + "cg-ghpages", + "cg-ghpages-fields", + "cg-gsheets-fields", + "cg-gsheets-published", + "cg-gsheets-published-error", + "cg-gsheets-published-warn", + "cg-gsheets-toggle", + "cg-include-demo-content", + "cg-language", + "cg-lines", + "cg-load-btn", + "cg-load-feedback", + "cg-load-input", + "cg-load-lines", + "cg-load-results", + "cg-logo-fields", + "cg-logo-path", + "cg-logo-toggle", + "cg-manual-baseurl", + "cg-manual-fields", + "cg-manual-url", + "cg-manual-url-error", + "cg-mode-create", + "cg-mode-edit", + "cg-output", + "cg-output-wrapper", + "cg-paste-area", + "cg-protection-fields", + "cg-protection-toggle", + "cg-root-domain", + "cg-secret-key", + "cg-secret-key-error", + "cg-secret-key-warn", + "cg-show-link-on-homepage", + "cg-show-object-credits", + "cg-show-on-homepage", + "cg-show-sample-on-homepage", + "cg-show-story-steps", + "cg-template", + "cg-theme", + "cg-title", + "cg-title-warn", + "generador-y-editor-de-configuración" + ], + "selectors": { + "h1": [ + "Generador y editor de configuración" + ], + "h2": [], + "h3": [ + "Configuración del sitio", + "Alojamiento", + "Integración con Google Sheets", + "Interfaz de historias", + "Interfaz de la colección", + "Historias privadas" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Generador y editor de configuración Ingresa los datos de tu sitio para generar un archivo _config.yml listo para usar en tu sitio Telar. Tu configuración nunca se envía a ningún servidor — todo se ejecuta en tu navegador. Crear nueva Editar existente Pega tu _config.yml existente a continuación y haz clic en Cargar para llenar el formulario. 1 Cargar Configuración del sitio Información básica y apariencia del sitio. Estos son los ajustes más importantes para tu sitio. Título El nombre de tu sitio, visible en la pestaña del navegador y en el encabezado de navegación Descripción (opcional) Se usa para los metadatos de motores de búsqueda y vistas previas en redes sociales Autor (opcional) Correo electrónico (opcional) Tema trama paisajes neogranadina santa-barbara austin Controla el esquema de colores y el estilo visual de tu sitio Usar una imagen como logo Cuando está desactivado, el título del sitio se muestra como texto en el encabezado de navegación Ruta del logo Pon tu logo en telar-content/objects/ . Recomendado: máx. 80px de alto, 200–300px de ancho, PNG/JPG/SVG Idioma English (en) Español (es) Controla todos los elementos de la interfaz: navegación, botones, etiquetas, mensajes de error. Tu contenido permanece en el idioma en que lo escribas. Modo colección Cuando se activa, la página principal muestra los objetos primero en una cuadrícula grande, con las historias debajo. Cuando está desactivado (predeterminado), las historias aparecen primero. Alojamiento Telar está diseñado para funcionar con GitHub Pages — la mayoría de los usuarios solo necesitan su nombre de usuario y el nombre del repositorio. Alojar en GitHub Pages Si no usas GitHub Pages, desactiva esta opción para ingresar tu URL manualmente. Usuario de GitHub Nombre del repositorio Dominio personalizado ¿Tienes un dominio personalizado configurado con GitHub Pages? Aprende cómo configurarlo URL del dominio Servir desde el dominio raíz Cuando está activado, tu sitio se sirve desde la raíz del dominio. Cuando está desactivado, se sirve en dominio.com/nombre-repo. URL El dominio base de tu sitio Baseurl Ruta después del dominio. Déjalo vacío para servir desde la raíz. Integración con Google Sheets Administra tu contenido a través de Google Sheets en vez de editar archivos CSV directamente. Telar obtiene tus datos automáticamente en cada build . Activar Google Sheets Cuando está desactivado, Telar usa los archivos CSV de tu repositorio — asegúrate de tenerlos en telar-content/spreadsheets/ URL publicada Desde Archivo → Compartir → Publicar en la web Interfaz de historias Controla cómo se muestran y se comportan las historias en tu sitio. Estos ajustes afectan al visor de historias y la presentación en la página de inicio. Mostrar historias en la página de inicio Cuando está activado, las tarjetas de historia aparecen en la página de inicio. Las historias siguen siendo accesibles por navegación cuando está desactivado. Mostrar indicadores de paso en las historias Muestra \"Paso 1\", \"Paso 2\", etc. al desplazarte por una historia. Es puramente visual. Mostrar créditos de objetos Muestra un distintivo de créditos desplegable en la esquina inferior izquierda del visor de historias. La información de créditos siempre aparece en la tabla de metadatos. Incluir contenido de demostración Obtiene historias de demostración del servidor de contenido de Telar. Muestran un distintivo \"Demo\" y ayudan a los nuevos usuarios a explorar la interfaz. Desactívalo en sitios en producción. Interfaz de la colección Controla cómo se muestra y se comporta la galería de objetos, incluyendo filtrado, búsqueda y presentación en la página de inicio. Mostrar la interfaz completa de exploración y búsqueda Activa la barra lateral de filtros con facetas en la página de objetos Mostrar enlace a objetos en la página de inicio Muestra un enlace \"Ver los objetos\" en la página de inicio Mostrar una muestra de objetos en la página de inicio Muestra en la página de inicio los objetos marcados como destacados en tu objects.csv Cantidad de destacados Número de objetos a mostrar en la muestra de la página de inicio Historias privadas Encripta las historias para que solo los espectadores con la clave correcta puedan acceder a ellas. Las historias con private: yes en tu project.csv (o en la pestaña Proyecto de Google Sheets) se encriptarán durante el build . Activar historias privadas Usa encriptación del lado del cliente. Previene el acceso casual, pero no es adecuado para contenido altamente sensible. Clave secreta Los espectadores acceden a las historias protegidas mediante ?key=tu-clave-secreta Generar Copiar ¡Copiado! Archivo _config.yml generado 1" + }, + "/guia/tus-datos/": { + "ids": [ + "archivos-de-datos", + "google-sheets", + "soporte-bilingüe-de-columnas", + "tus-datos" + ], + "selectors": { + "h1": [ + "Tus datos" + ], + "h2": [ + "Archivos de datos", + "Soporte bilingüe de columnas", + "Google Sheets" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "order,story_id,title,subtitle,byline orden,id_historia,titulo,subtitulo,firma 1,textiles-coloniales,Textiles Coloniales,Tradiciones de tejido,por Dra. María García" + ], + "table": [ + "Archivo Qué define Referencia project.csv Historias, orden de visualización, títulos Columnas del proyecto objects.csv Catálogo de objetos y metadatos Columnas de objetos {story-id}.csv Pasos, coordenadas, contenido de paneles Columnas de historias glossary.csv Términos de glosario y definiciones Columnas del glosario" + ], + "blockquote": [], + "img": [] + }, + "text": "Tus datos Telar usa archivos de hoja de cálculo para definir la estructura de tu exhibición — qué historias existen, qué objetos contienen, dónde hacer zoom en cada imagen y qué términos de glosario incluir. Estos archivos son el formato de publicación. Elige cómo editar su contenido: Compositor — edita visualmente; el editor escribe los archivos al publicar Google Sheets — edita una hoja de cálculo en tu navegador y Telar la obtiene y convierte a archivos CSV automáticamente durante cada build Archivos CSV — edita los archivos directamente en telar-content/spreadsheets/ Elige una fuente para la autoría. Si Google Sheets está activo, el build lo descarga y reemplaza sus copias CSV locales. Los tres manuales explican cada proceso. Archivos de datos Archivo Qué define Referencia project.csv Historias, orden de visualización, títulos Columnas del proyecto objects.csv Catálogo de objetos y metadatos Columnas de objetos {story-id}.csv Pasos, coordenadas, contenido de paneles Columnas de historias glossary.csv Términos de glosario y definiciones Columnas del glosario Soporte bilingüe de columnas Todos los archivos de hoja de cálculo admiten nombres de columnas en inglés y en español. Puedes usar cualquiera de los dos idiomas, mezclarlos o incluir encabezados dobles para equipos bilingües: order,story_id,title,subtitle,byline orden,id_historia,titulo,subtitulo,firma 1,textiles-coloniales,Textiles Coloniales,Tradiciones de tejido,por Dra. María García Telar detecta automáticamente y omite la segunda fila de encabezado. También se admiten nombres de archivos en español ( proyecto.csv , objetos.csv ). Consulta Columnas del proyecto para detalles completos sobre la normalización de columnas. Google Sheets Consulta Google Sheets para la configuración y el flujo de trabajo." + }, + "/guia/funciones/historias-privadas/": { + "ids": [ + "1-establece-la-clave-de-historia", + "2-marca-las-historias-como-privadas", + "caché-de-sesión", + "compartir-historias-protegidas", + "configuración", + "consideraciones-de-seguridad", + "cómo-funciona", + "enlace-con-parámetro-de-clave", + "fallos-del-build", + "formulario-de-ingreso-de-clave", + "historias-privadas", + "probar-localmente", + "referencia-de-configuración", + "véase-también" + ], + "selectors": { + "h1": [ + "Historias privadas" + ], + "h2": [ + "Cómo funciona", + "Configuración", + "Probar localmente", + "Compartir historias protegidas", + "Consideraciones de seguridad", + "Fallos del build", + "Referencia de configuración", + "Véase también" + ], + "h3": [ + "1. Establece la clave de historia", + "2. Marca las historias como privadas", + "Formulario de ingreso de clave", + "Enlace con parámetro de clave", + "Caché de sesión" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "story_key: \"tu-clave-secreta\"", + "order,story_id,title,subtitle,privada 1,textiles-coloniales,Textiles Coloniales,Tradiciones de tejido, 2,borrador-analisis,Borrador de Análisis,Trabajo en progreso,yes", + "python3 scripts/build_local_site.py --build-only", + "https://tu-sitio.com/stories/borrador-analisis/?key=tu-clave-secreta" + ], + "table": [ + "Opción Ubicación Propósito story_key _config.yml La clave de encriptación/desencriptación private Columna de project.csv Marca historias individuales para encriptación (también se acepta protected)" + ], + "blockquote": [ + "protected y protegida también funcionan como nombres de columna — Telar los trata igual que private/privada. Los sitios nuevos y los ejemplos de esta documentación usan private/privada.", + "La clave es visible en la URL al compartirla de esta manera. Cualquier persona que vea el enlace (en el historial del navegador, registros de chat o correo electrónico) tendrá acceso a la historia." + ], + "img": [ + [ + "/images/private-story-locked.png", + "Historia protegida mostrando pantalla de bloqueo con campo para ingresar la clave" + ] + ] + }, + "text": "Historias privadas Las historias privadas se encriptan para que solo las personas con la clave correcta puedan leerlas. Usa esta función para compartir historias en desarrollo con colaboradores, restringir el acceso a materiales de clase o mantener contenido sensible fuera de la vista pública. Nuevo en v0.8.0. Cómo funciona Telar construye todas las historias — privadas o no — con las mismas plantillas. Durante el build de Jekyll, una historia privada se genera exactamente igual que una abierta. Solo cuando el build termina, un paso aparte la encripta: Durante el build de Jekyll , los pasos de una historia privada se generan con las plantillas normales de historias: el mismo procesamiento de Markdown, los mismos enlaces de glosario, LaTeX, clips de audio y texto alternativo que cualquier historia abierta. Cuando el build termina , un paso posterior encripta el contenido ya generado de la historia (AES-256-GCM) y lo reemplaza con un marcador bloqueado. El título y el subtítulo siguen visibles en el listado del proyecto; solo se encripta el contenido paso a paso. En el sitio publicado , la página de la historia se carga con una capa de bloqueo en lugar de su contenido. Las personas ingresan la clave (o usan un enlace que la incluye), y la historia se desencripta en su navegador. Una vez desbloqueada , la historia se comporta exactamente igual que una abierta, porque durante el build se generó con las mismas plantillas que las demás. El título y subtítulo de la historia permanecen visibles en el listado del proyecto. Solo el contenido paso a paso se encripta. Configuración Se necesitan dos cosas: una clave en tu configuración y una marca en cada historia que desees proteger. 1. Establece la clave de historia Agrega story_key a tu _config.yml : story_key: \"tu-clave-secreta\" Esta clave se usa para encriptar todas las historias protegidas. Elige algo fácil de recordar pero difícil de adivinar. 2. Marca las historias como privadas En tu project.csv , establece la columna privada en yes para cada historia que quieras encriptar: order,story_id,title,subtitle,privada 1,textiles-coloniales,Textiles Coloniales,Tradiciones de tejido, 2,borrador-analisis,Borrador de Análisis,Trabajo en progreso,yes Las historias sin privada: yes permanecen públicas. protected y protegida también funcionan como nombres de columna — Telar los trata igual que private / privada . Los sitios nuevos y los ejemplos de esta documentación usan private / privada . Probar localmente Ni bundle exec jekyll serve ni el modo por defecto de scripts/build_local_site.py (servir) encriptan nada: Jekyll regenera _site continuamente mientras sirve el sitio, y la encriptación es un paso único que corre cuando un build termina. Al previsualizar así, las historias privadas se ven como contenido legible, en texto plano. Es el comportamiento esperado, no un error: el comando con el que se construye el sitio al publicarlo todavía no ha corrido. Para ver una historia privada como la vería alguien que visita el sitio (bloqueada, pidiendo la clave): python3 scripts/build_local_site.py --build-only Luego sirve el directorio _site/ resultante con un servidor de archivos estáticos (por ejemplo, python3 -m http.server desde dentro de _site/ ). Esto ejecuta el mismo paso de encriptación que el build de GitHub Actions, así que también puede fallar como fallaría un build real — mira Fallos del build más abajo. Compartir historias protegidas Hay dos formas en que las personas pueden desbloquear una historia protegida: Formulario de ingreso de clave Cuando alguien abre una historia protegida, ve una capa con un campo para ingresar la clave. Escribe la clave y presiona Enter . Si la clave es correcta, la capa desaparece y la historia aparece. Si la clave es incorrecta, el formulario muestra un mensaje de error y permite intentar de nuevo. Enlace con parámetro de clave Puedes compartir un enlace directo que incluya la clave como parámetro de URL: https://tu-sitio.com/stories/borrador-analisis/?key=tu-clave-secreta Las personas que abran este enlace se saltan el formulario de ingreso — la historia se desencripta automáticamente. La clave es visible en la URL al compartirla de esta manera. Cualquier persona que vea el enlace (en el historial del navegador, registros de chat o correo electrónico) tendrá acceso a la historia. Caché de sesión Una vez que alguien desbloquea una historia, permanece desbloqueada durante el resto de su sesión de navegador. Navegar a otra página y regresar a la historia no requiere reingresar la clave. Cerrar el navegador borra el caché. Consideraciones de seguridad La protección de historias es apenas una barrera de privacidad superficial, no una medida de seguridad. Disuade el acceso casual: quienes visitan el sitio no pueden abrir las herramientas de desarrollo del navegador y leer el contenido sin más. No protege el contenido frente a alguien decidido a obtenerlo. Lo que ofrece: Los datos de la historia quedan encriptados en el código fuente de la página: no se leen de un vistazo en las herramientas de desarrollo Una pantalla de ingreso de clave que detiene a quienes no la tienen No requiere infraestructura del lado del servidor Lo que no ofrece (limitaciones importantes): Confidencialidad en un sitio público. Todos los CSV de telar-content/spreadsheets/ — incluidos los datos de pasos de la historia y el propio project.csv (que lleva la marca private ) — se copian tal cual al sitio publicado y quedan accesibles públicamente en una URL predecible bajo /telar-content/spreadsheets/ en cualquier despliegue público de GitHub Pages. Alguien decidido a hacerlo puede leer todo el contenido de la historia desde esos archivos, sin clave. Resistencia a ataques sin conexión. La sal, el IV y el texto cifrado van todos incrustados en el HTML de la página. Quien vea el código fuente tiene todo lo necesario para ejecutar, sin conexión, un ataque de fuerza bruta o de diccionario contra la clave. Control de acceso por persona. Todas las personas que tienen la clave tienen el mismo acceso; no hay forma de revocarle el acceso a una sola persona sin cambiarle la clave a todas. Metadatos ocultos. Los títulos y subtítulos siguen visibles en el listado del proyecto, sin importar si la historia está protegida. Para una confidencialidad real , usa un repositorio privado de GitHub. En un repositorio privado ni el sitio ni sus archivos quedan al alcance del público, así que solo pueden ver algo las personas a quienes les diste acceso al repositorio. La protección de historias, por sí sola, no sustituye a un repositorio privado cuando el contenido de verdad no debe ser leído por personas no autorizadas. Fallos del build Telar se niega a publicar una historia privada en texto plano. En lugar de publicar contenido sin proteger, el build puede fallar en dos puntos: Una historia está marcada private: yes pero falta story_key en _config.yml . Agrega la clave o quítale la marca private a la historia. El flujo de trabajo Build and Deploy no ejecuta el paso de encriptación. Los sitios actualizados desde una versión anterior a v1.6.0 necesitan agregar este paso a .github/workflows/build.yml a mano — GitHub no permite que la actualización automática edite archivos de flujos de trabajo. Consulta Actualizar Telar: notas de v1.6.0 . Cualquiera de los dos fallos imprime un mensaje que identifica cuál ocurrió, en inglés y en español. Referencia de configuración Opción Ubicación Propósito story_key _config.yml La clave de encriptación/desencriptación private Columna de project.csv Marca historias individuales para encriptación (también se acepta protected ) Consulta Configuración para detalles sobre la opción story_key . Véase también Historias y Paneles — Cómo construir historias Referencia CSV: Proyecto — La columna private en project.csv Configuración — Clave de historia y opciones de interfaz Actualizar Telar — Paso manual obligatorio para sitios que se actualizan desde antes de v1.6.0" + }, + "/guia/tus-datos/csv-glosario/": { + "ids": [ + "alias-del-csv-de-glosario", + "columnas", + "columnas-del-glosario", + "csv-de-glosario-glossarycsv", + "csv-vs-glosario-en-markdown", + "definition--definicion", + "ejemplo", + "notas-de-los-campos", + "related_terms--terminos_relacionados", + "sintaxis-de-enlace-en-línea", + "term_id--id_termino", + "title--titulo", + "validación", + "véase-también" + ], + "selectors": { + "h1": [ + "Columnas del glosario" + ], + "h2": [ + "CSV de glosario (glossary.csv)", + "Validación", + "Véase también" + ], + "h3": [ + "Columnas", + "Ejemplo", + "Notas de los campos", + "Sintaxis de enlace en línea", + "Alias del CSV de glosario", + "CSV vs. glosario en Markdown" + ], + "h4": [ + "term_id / id_termino", + "title / titulo", + "definition / definicion", + "related_terms / terminos_relacionados" + ], + "h5": [], + "h6": [], + "pre": [ + "term_id,title,definition,related_terms loom,Loom,A device used to weave cloth and tapestry.,warp warp,Warp,\"The set of lengthwise yarns on a loom, through which the weft is woven.\",loom encomienda,Encomienda,\"A system of labor in colonial Spanish America, granting colonists authority over indigenous workers.\",", + "id_termino,titulo,definicion,terminos_relacionados telar,Telar,Un dispositivo utilizado para tejer tela y tapices.,urdimbre urdimbre,Urdimbre,\"El conjunto de hilos longitudinales en un telar, a través de los cuales se teje la trama.\",telar encomienda,Encomienda,\"Un sistema de trabajo en la América colonial española, que otorgaba a los colonos autoridad sobre los trabajadores indígenas.\",", + "El [[loom]] era central para la producción textil.", + "El [[loom|dispositivo de tejido]] era central para la producción textil." + ], + "table": [ + "Inglés Español Requerido Descripción term_id id_termino Sí Identificador único del término (se usa en la sintaxis de enlaces) title titulo Sí Título visible del término definition definicion No Texto de la definición del término related_terms terminos_relacionados No IDs de términos relacionados, separados por una barra vertical", + "Normalizado Acepta term_id term_id, id_termino, id_término title title, titulo, título definition definition, definicion, definición related_terms related_terms, terminos_relacionados, términos_relacionados", + "Aspecto CSV (preferido) Markdown (heredado) Ubicación telar-content/spreadsheets/glossary.csv telar-content/texts/glossary/*.md Formato Filas con columnas Archivos individuales con frontmatter YAML Encabezados bilingües Sí (mediante alias de columnas) No Google Sheets Sí (se obtiene como los demás CSV) No" + ], + "blockquote": [], + "img": [] + }, + "text": "Columnas del glosario Referencia completa de las columnas de glossary.csv con soporte bilingüe de nombres de columnas. Para la normalización de columnas y soporte de encabezados dobles, consulta Columnas del proyecto . CSV de glosario (glossary.csv) Define términos de glosario que se pueden enlazar desde los paneles de las historias usando la sintaxis [[term_id]] . Ubicación : telar-content/spreadsheets/glossary.csv Nuevo en v0.8.0. El formato CSV es el método preferido para los términos de glosario. Los archivos Markdown heredados en telar-content/texts/glossary/ siguen siendo compatibles, pero el CSV tiene precedencia si ambos existen. Columnas Inglés Español Requerido Descripción term_id id_termino Sí Identificador único del término (se usa en la sintaxis de enlaces) title titulo Sí Título visible del término definition definicion No Texto de la definición del término related_terms terminos_relacionados No IDs de términos relacionados, separados por una barra vertical Ejemplo Inglés: term_id,title,definition,related_terms loom,Loom,A device used to weave cloth and tapestry.,warp warp,Warp,\"The set of lengthwise yarns on a loom, through which the weft is woven.\",loom encomienda,Encomienda,\"A system of labor in colonial Spanish America, granting colonists authority over indigenous workers.\", Español: id_termino,titulo,definicion,terminos_relacionados telar,Telar,Un dispositivo utilizado para tejer tela y tapices.,urdimbre urdimbre,Urdimbre,\"El conjunto de hilos longitudinales en un telar, a través de los cuales se teje la trama.\",telar encomienda,Encomienda,\"Un sistema de trabajo en la América colonial española, que otorgaba a los colonos autoridad sobre los trabajadores indígenas.\", Notas de los campos term_id / id_termino Único entre todos los términos del glosario Se usa en la sintaxis de enlace en línea: [[term_id]] o [[term_id|texto visible]] Formato: minúsculas, se recomiendan guiones Los términos con prefijo demo- se marcan como contenido de demostración title / titulo El nombre visible que se muestra en el panel del glosario y como texto del enlace Al usar la forma abreviada [[term_id]] , el título se usa automáticamente como texto del enlace definition / definicion El texto de la definición mostrado en la entrada del glosario Admite formato Markdown básico related_terms / terminos_relacionados Otros valores term_id , separados por | (por ejemplo, urdimbre|telar ) Se usa para referencias cruzadas entre entradas del glosario Sintaxis de enlace en línea Enlaza a términos del glosario desde los paneles de las historias usando sintaxis de doble corchete: Forma abreviada — usa el título del término como texto del enlace: El [[loom]] era central para la producción textil. Con texto visible personalizado — usa un separador de barra vertical: El [[loom|dispositivo de tejido]] era central para la producción textil. Si el term_id no se encuentra en el glosario, un ícono de advertencia y un mensaje de error aparecen en la salida del build y en el panel de la historia. Alias del CSV de glosario Normalizado Acepta term_id term_id , id_termino , id_término title title , titulo , título definition definition , definicion , definición related_terms related_terms , terminos_relacionados , términos_relacionados CSV vs. glosario en Markdown Aspecto CSV (preferido) Markdown (heredado) Ubicación telar-content/spreadsheets/glossary.csv telar-content/texts/glossary/*.md Formato Filas con columnas Archivos individuales con frontmatter YAML Encabezados bilingües Sí (mediante alias de columnas) No Google Sheets Sí (se obtiene como los demás CSV) No Si existen tanto un CSV como un glosario en Markdown, se usa el CSV y se ignoran los archivos Markdown (con una advertencia en el build ). Validación Advertencias de glosario : term_id o title faltantes (se omite la fila) Enlace de glosario [[term_id]] hace referencia a un término inexistente Véase también Columnas del proyecto — Columnas de project.csv Columnas de objetos — Columnas de objects.csv Columnas de historias — Columnas de los CSV de historia Glosario — Configuración del glosario y autoenlaces" + }, + "/guia/primeros-pasos/desarrollo-local/": { + "ids": [ + "clona-y-configura", + "comandos-principales", + "configura-ajustes-del-sitio", + "configura-el-sitio", + "desarrollo-local", + "descripción-general", + "flujo-de-trabajo-de-desarrollo-diario", + "flujo-de-trabajo-paso-a-paso", + "genera-la-primera-vista-previa", + "instala-las-dependencias", + "instala-ruby-y-bundler", + "instala-y-ejecuta-telar-localmente", + "instalación", + "obtén-tu-propia-copia", + "paso-1-reúne-tus-imágenes", + "paso-2-escribe-tu-texto-narrativo", + "paso-3-cataloga-tus-objetos", + "paso-4-previsualiza-tus-objetos", + "paso-5-encuentra-coordenadas-para-momentos-de-historia", + "paso-6-construye-tu-historia", + "paso-7-agrega-términos-del-glosario-opcional", + "próximos-pasos", + "publicación-en-github-pages", + "requisitos", + "requisitos-previos" + ], + "selectors": { + "h1": [ + "Instala y ejecuta Telar localmente" + ], + "h2": [ + "Requisitos", + "Obtén tu propia copia", + "Instala las dependencias", + "Configura el sitio", + "Genera la primera vista previa" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "ruby -v bundle -v python3 --version node --version npm --version git --version", + "git clone https://github.com/TU-CUENTA/TU-REPOSITORIO.git cd TU-REPOSITORIO", + "python3 -m venv .venv source .venv/bin/activate python3 -m pip install -r requirements.txt bundle install npm ci", + "google_sheets: enabled: false", + "python3 scripts/build_local_site.py" + ], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Instala y ejecuta Telar localmente Construye una exhibición con archivos CSV y Markdown en tu computador. Este método permite controlar los archivos fuente, el proceso de generación y el alojamiento. También puedes previsualizar un sitio cuyo contenido viene de Google Sheets. Requisitos El build actual de Telar usa Ruby 3.2, Python 3.12 y Node.js 22. Usa Ruby 3.2 o superior dentro de la serie 3.x y Bundler. Los archivos de dependencias de tu versión son la referencia para construirla. Comprueba los programas en la terminal: ruby -v bundle -v python3 --version node --version npm --version git --version Instala lo que falte con el gestor de paquetes o versiones de tu sistema. En macOS, Ruby puede ser demasiado antiguo; revisa la versión en lugar de asumir que la instalación del sistema sirve. Obtén tu propia copia Crea un repositorio a partir de la plantilla de Telar y clónalo. Reemplaza la dirección del ejemplo: git clone https://github.com/TU-CUENTA/TU-REPOSITORIO.git cd TU-REPOSITORIO También puedes descargar los archivos si no vas a usar Git. Conserva un respaldo separado de los archivos editables. Instala las dependencias Usa un entorno virtual de Python para separar los paquetes de este proyecto: python3 -m venv .venv source .venv/bin/activate python3 -m pip install -r requirements.txt bundle install npm ci En Windows, activa con .venv\\Scripts\\Activate.ps1 en PowerShell. Vuelve a activar el mismo entorno al retomar el proyecto. Si falla la instalación, revisa las versiones antes de cambiar los archivos de dependencias. Para objetos de audio, instala la herramienta del sistema audiowaveform para preparar la forma de onda. Los límites del fragmento se aplican en el navegador; el script no extrae archivos separados por fragmento. Configura el sitio Edita la sección de autoría de _config.yml : título, descripción, autoría, idioma y tema. Si vas a editar archivos CSV directamente, configura: google_sheets: enabled: false Conserva los ajustes de generación de la plantilla que aparecen más abajo. Si el sitio ocupa la raíz del dominio, baseurl queda vacío; en un sitio de proyecto contiene la ruta del repositorio. Genera la primera vista previa Desde la raíz del repositorio, con el entorno activo: python3 scripts/build_local_site.py El script procesa contenido, audio y teselas IIIF, genera JavaScript e inicia Jekyll en el puerto 4001. Abre la dirección con la ruta configurada, por ejemplo http://127.0.0.1:4001/mi-exhibicion/ . Detén el servidor con Ctrl+C. Usa --port 4003 si otro sitio ocupa el puerto 4001. Comprueba el resultado: deben cargar el inicio y un objeto de ejemplo. Sigue con los archivos de contenido ." + }, + "/guia/tu-contenido/documentos-pdf/": { + "ids": [ + "agregar-un-pdf", + "consideraciones-de-tamaño", + "cómo-funciona", + "documentos-pdf", + "el-pdf-no-carga", + "enlazar-a-una-página-del-documento", + "errores-de-build", + "la-columna-pagina", + "páginas-de-objetos-vs-historias", + "se-muestra-la-página-incorrecta-en-la-historia", + "solución-de-problemas", + "tipos-de-pdf-compatibles", + "usar-pdf-en-historias", + "ver-también" + ], + "selectors": { + "h1": [ + "Documentos PDF" + ], + "h2": [ + "Agregar un PDF", + "Cómo funciona", + "Páginas de objetos vs. historias", + "Enlazar a una página del documento", + "Usar PDF en historias", + "Tipos de PDF compatibles", + "Consideraciones de tamaño", + "Solución de problemas", + "Ver también" + ], + "h3": [ + "La columna pagina", + "El PDF no carga", + "Se muestra la página incorrecta en la historia", + "Errores de build" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "python3 scripts/generate_iiif.py --base-url http://localhost:4001", + "/objects/leyes-nuevas/?page=3", + "paso,objeto,x,y,zoom,pagina,pregunta,respuesta 1,leyes-nuevas,0.5,0.5,1,1,¿Qué es este documento?,La Recopilación de leyes de los reynos de las Indias codificó el derecho colonial español. 2,leyes-nuevas,0.4,0.15,2.5,10,Una disposición clave,Esta página detalla el marco legal que gobernaba la administración colonial. 3,textil-001,0.5,0.3,0.8,,¿Qué es este textil?,Un fragmento colonial que muestra técnicas complejas de tejido." + ], + "table": [], + "blockquote": [ + "Telar renderiza cada página del PDF como una imagen de alta resolución durante el proceso de build. Un PDF de 40 páginas producirá 40 imágenes de página separadas, cada una con su propio conjunto de teselas de zoom. El tiempo de build aumenta con el número de páginas.", + "Encontrar coordenadas para una página específica. Navega a la página de objeto de tu PDF (/objects/leyes-nuevas/). Usa los controles de navegación para ir a la página que deseas. Luego usa el selector de coordenadas — incluye automáticamente el número de página actual en los valores copiados.", + "La calidad del renderizado depende del documento fuente. Las páginas escaneadas a 300 DPI o más producen los mejores resultados de zoom profundo. Los escaneos de baja resolución pueden verse borrosos al ampliar.", + "Si tu sitio está alojado en GitHub Pages (el caso por defecto en la mayoría de sitios Telar), ten en cuenta que GitHub no permite archivos individuales de más de 100 MB, y recomienda mantener el tamaño total del repositorio por debajo de 1 GB. Un PDF grande más todas las teselas de zoom que genera puede sumar rápidamente.", + "Para documentos muy grandes (más de 100 páginas), verifica si una biblioteca o archivo ya aloja una versión digitalizada con un manifiesto IIIF. Si es así, puedes usar la URL del manifiesto en la columna source_url en lugar de autoalojar el PDF. Consulta IIIF externo para saber cómo encontrar y usar estos manifiestos." + ], + "img": [] + }, + "text": "Documentos PDF Telar puede mostrar documentos PDF de múltiples páginas — libros, registros legales, manuscritos, mapas — como objetos ampliables de alta resolución. Cada página de un PDF se convierte en una imagen con zoom profundo, igual que una fotografía o un escaneo. Esto permite construir historias que amplían páginas y regiones específicas de un documento, guiando al público a través de detalles que de otra manera podrían pasar desapercibidos. Agregar un PDF Agregar un PDF funciona de la misma manera que agregar una imagen. Coloca el archivo en telar-content/objects/ con un nombre que coincida con el object_id en tu hoja de cálculo. Por ejemplo, si tu hoja de cálculo tiene un objeto con object_id = leyes-nuevas , nombra tu archivo leyes-nuevas.pdf . Desde la interfaz web de GitHub: Navega a telar-content/objects/ en tu repositorio Haz clic en Add file > Upload files Sube tu archivo PDF Asegúrate de que el nombre del archivo (sin .pdf ) coincida con tu object_id Confirma los cambios Para desarrollo local: Coloca tu PDF en telar-content/objects/ Genera las teselas ( tiles ) IIIF: python3 scripts/generate_iiif.py --base-url http://localhost:4001 Telar renderiza cada página del PDF como una imagen de alta resolución durante el proceso de build . Un PDF de 40 páginas producirá 40 imágenes de página separadas, cada una con su propio conjunto de teselas de zoom. El tiempo de build aumenta con el número de páginas. Cómo funciona Cuando agregas un PDF y construyes tu sitio: Telar renderiza cada página como una imagen JPEG de alta resolución usando PyMuPDF Cada imagen de página se divide en teselas a múltiples niveles de zoom (igual que una fotografía) Se genera un manifiesto IIIF para cada página individual, más un manifiesto de múltiples páginas para el documento completo En las páginas de objetos, el visor muestra el documento completo con controles de navegación por páginas En las historias, cada paso puede hacer referencia a una página específica Páginas de objetos vs. historias Los PDF se comportan de manera diferente según el contexto: Páginas de objetos ( /objects/leyes-nuevas/ ) muestran el documento completo. El visor incluye controles de navegación — flechas de avance y retroceso y un selector de página — para que quienes visitan puedan recorrer todas las páginas. Historias muestran una página a la vez. Cada paso de la historia especifica qué página mostrar usando la columna pagina en tu hoja de cálculo. El visor amplía las coordenadas que configuraste para esa página, igual que lo hace con una fotografía. Enlazar a una página del documento Para llevar a alguien directo a una página concreta de un documento, abre la página del objeto, ve a esa página con los controles de navegación y copia la URL de la barra de direcciones. La URL termina en ?page= y el número de página: /objects/leyes-nuevas/?page=3 Esa URL abre la página del objeto en la página indicada. Los números de página empiezan en 1, igual que en la columna pagina . Mientras quien visita pasa las páginas, la URL del navegador cambia para indicar la página que tiene en pantalla, así que también puede copiarla y compartirla. Si el número es mayor que el total de páginas, se abre la última. Si el valor no es un número entero, se abre la página 1. Funciona igual con cualquier objeto de varias páginas, incluidos los que vienen de un manifiesto IIIF de varias páginas. Puedes usar esta URL en cualquier enlace del sitio, por ejemplo en una entrada del glosario o en un panel. Usar PDF en historias Para hacer referencia a una página específica de un PDF en un paso de la historia, agrega una columna pagina a tu hoja de cálculo. El valor es el número de página (comenzando desde 1). paso,objeto,x,y,zoom,pagina,pregunta,respuesta 1,leyes-nuevas,0.5,0.5,1,1,¿Qué es este documento?,La Recopilación de leyes de los reynos de las Indias codificó el derecho colonial español. 2,leyes-nuevas,0.4,0.15,2.5,10,Una disposición clave,Esta página detalla el marco legal que gobernaba la administración colonial. 3,textil-001,0.5,0.3,0.8,,¿Qué es este textil?,Un fragmento colonial que muestra técnicas complejas de tejido. Los pasos 1 y 2 hacen referencia a las páginas 1 y 10 del PDF leyes-nuevas El paso 3 hace referencia a una imagen regular ( textil-001 ) sin valor de pagina — la columna se deja vacía para objetos de una sola imagen Encontrar coordenadas para una página específica. Navega a la página de objeto de tu PDF ( /objects/leyes-nuevas/ ). Usa los controles de navegación para ir a la página que deseas. Luego usa el selector de coordenadas — incluye automáticamente el número de página actual en los valores copiados. La columna pagina Los números de página comienzan en 1 (la página 1 es la primera página del PDF) Debe ser un número entero positivo — valores decimales o negativos producen una advertencia Dejar vacío para objetos de una sola imagen — Telar ignora los valores vacíos de pagina Nombres de columna bilingües : page (inglés) o pagina / página (español) Tipos de PDF compatibles Telar renderiza PDF usando PyMuPDF, que maneja la mayoría de los archivos PDF estándar: Documentos escaneados — Páginas fotografiadas o escaneadas (el tipo más común en la investigación histórica) PDF nativos — Documentos con texto incrustado y gráficos vectoriales PDF mixtos — Documentos que combinan imágenes escaneadas y texto nativo La calidad del renderizado depende del documento fuente. Las páginas escaneadas a 300 DPI o más producen los mejores resultados de zoom profundo. Los escaneos de baja resolución pueden verse borrosos al ampliar. Consideraciones de tamaño Los PDF producen más datos que las imágenes individuales porque cada página genera su propia pirámide de teselas: Un PDF de 10 páginas produce aproximadamente 10 veces las teselas de una sola imagen Un documento de 100 páginas puede aumentar significativamente el tiempo de build y el tamaño del repositorio Considera usar solo las páginas que necesitas en lugar de incluir el documento completo Si tu sitio está alojado en GitHub Pages (el caso por defecto en la mayoría de sitios Telar), ten en cuenta que GitHub no permite archivos individuales de más de 100 MB, y recomienda mantener el tamaño total del repositorio por debajo de 1 GB. Un PDF grande más todas las teselas de zoom que genera puede sumar rápidamente. Para documentos muy grandes (más de 100 páginas), verifica si una biblioteca o archivo ya aloja una versión digitalizada con un manifiesto IIIF. Si es así, puedes usar la URL del manifiesto en la columna source_url en lugar de autoalojar el PDF. Consulta IIIF externo para saber cómo encontrar y usar estos manifiestos. Solución de problemas El PDF no carga Verifica que el archivo exista en telar-content/objects/ Asegúrate de que el nombre del archivo (sin .pdf ) coincida con el object_id en tu hoja de cálculo Verifica que el objeto tenga la columna source_url vacía Asegúrate de que las teselas IIIF se hayan generado (verifica que exista iiif/objects/{object-id}/ ) Se muestra la página incorrecta en la historia Verifica el valor de pagina en tu hoja de cálculo — debe ser un número entero positivo Los números de página comienzan en 1, no en 0 Usa el selector de coordenadas en la página del objeto para verificar el número de página correcto Errores de build Asegúrate de que PyMuPDF esté instalado ( pip install pymupdf ) Si PyMuPDF no está disponible, Telar omite los archivos PDF con un mensaje informativo — los demás objetos se procesan normalmente Ver también Imágenes autoalojadas — Agregar fotografías y escaneos Objetos — Definir objetos en tu hoja de cálculo Historias y paneles — Construir pasos de historias Columnas de historias — Referencia completa de columnas incluyendo la columna pagina IIIF externo — Usar manifiestos IIIF de bibliotecas y archivos" + }, + "/guia/configuracion/actualizacion/": { + "ids": [ + "actualizaciones-automatizadas-v034", + "actualización-manual-del-archivo-de-flujo-de-trabajo-solo-v020-v033", + "actualizar-telar", + "configuración-manual-para-versiones-anteriores", + "conflictos-de-merge", + "cómo-funciona", + "descripción-general", + "después-de-actualizar", + "ejecutar-una-actualización-automatizada", + "el-flujo-de-trabajo-de-actualización-no-aparece", + "historial-de-versiones", + "la-actualización-falla-con-error", + "método-a-interfaz-web-de-github-recomendado", + "método-a-interfaz-web-de-github-recomendado-1", + "método-b-desarrollo-local-computador", + "método-b-desarrollo-local-computador-1", + "necesitas-ayuda", + "no-se-creó-el-issue", + "notas-de-actualización-a-v070", + "notas-de-actualización-a-v100-beta", + "notas-de-actualización-a-v110", + "notas-de-actualización-a-v120", + "notas-de-actualización-a-v121", + "notas-de-actualización-a-v130", + "notas-de-actualización-a-v140", + "notas-de-actualización-a-v150", + "notas-de-actualización-a-v160", + "notas-de-actualización-a-v170", + "notas-de-actualización-a-v180", + "notas-de-actualización-a-v181", + "notas-de-actualización-a-v182", + "notas-de-actualización-a-v183", + "paso-1-agregar-el-archivo-del-flujo-de-trabajo-de-actualización", + "paso-2-reemplazar-el-archivo-del-flujo-de-trabajo-de-build", + "paso-3-ejecuta-tu-primera-actualización-automatizada", + "solución-de-problemas" + ], + "selectors": { + "h1": [ + "Actualizar Telar" + ], + "h2": [ + "Descripción general", + "Actualizaciones automatizadas (v0.3.4+)", + "Configuración manual para versiones anteriores", + "Solución de problemas", + "Historial de versiones", + "¿Necesitas ayuda?" + ], + "h3": [ + "Cómo funciona", + "Ejecutar una actualización automatizada", + "Después de actualizar", + "Notas de actualización a v1.8.3", + "Notas de actualización a v1.8.2", + "Notas de actualización a v1.8.1", + "Notas de actualización a v1.8.0", + "Notas de actualización a v1.7.0", + "Notas de actualización a v1.6.0", + "Notas de actualización a v1.5.0", + "Notas de actualización a v1.4.0", + "Notas de actualización a v1.3.0", + "Notas de actualización a v1.2.1", + "Notas de actualización a v1.2.0", + "Notas de actualización a v1.1.0", + "Notas de actualización a v1.0.0-beta", + "Notas de actualización a v0.7.0", + "Paso 1: Agregar el archivo del flujo de trabajo de actualización", + "Paso 2: Reemplazar el archivo del flujo de trabajo de build", + "Paso 3: Ejecuta tu primera actualización automatizada", + "El flujo de trabajo de actualización no aparece", + "La actualización falla con error", + "No se creó el issue", + "Conflictos de merge" + ], + "h4": [ + "Actualización manual del archivo de flujo de trabajo (solo v0.2.0-v0.3.3)", + "Método A: Interfaz web de GitHub (Recomendado)", + "Método B: Desarrollo local (computador)", + "Método A: Interfaz web de GitHub (Recomendado)", + "Método B: Desarrollo local (computador)" + ], + "h5": [], + "h6": [], + "pre": [ + "curl -o .github/workflows/upgrade.yml https://raw.githubusercontent.com/UCSB-AMPLab/telar/main/.github/workflows/upgrade.yml", + "git add .github/workflows/upgrade.yml git commit -m \"Add automated upgrade workflow\" git push", + "curl -o .github/workflows/build.yml https://raw.githubusercontent.com/UCSB-AMPLab/telar/main/.github/workflows/build.yml", + "git add .github/workflows/build.yml git commit -m \"Update build workflow to v0.3.4\" git push" + ], + "table": [], + "blockquote": [ + "¿Usas el Compositor de Telar? Si administras tu sitio desde el Compositor de Telar, puedes actualizarlo con un clic desde su pantalla de actualización y no necesitas seguir los pasos manuales de abajo. Si primero te pide que apruebes los permisos actualizados en GitHub, acéptalos y vuelve a intentarlo. Los pasos de abajo son para actualizar directamente en GitHub.", + "Solo para repositorios con fork: Si creaste tu sitio haciendo fork de otro repositorio, necesitarás habilitar los issues en la configuración de tu repositorio (Settings → General → marca Issues). Los sitios creados usando el botón \"Use this template\" ya tienen los issues habilitados.", + "Seguro y reversible La actualización crea un issue y una rama, dándote control total. Revisa los cambios usando el enlace de comparación, crea un pull request cuando estés listo y haz merge solo después de verificar.", + "Si te saltas este paso y marcas una historia con private: yes, el build fallará en el paso \"Convert CSVs to JSON\" con un error que dice que el flujo de trabajo no ejecuta el script de cifrado. Es intencional: sin el paso nuevo, tu sitio publicaría la historia \"privada\" en texto plano. Si tu sitio no tiene historias privadas, no se rompe nada si te saltas este paso — pero no podrás agregar una más adelante sin aplicar antes esta actualización.", + "Si actualizas build.yml, agrega también package-lock.json. El nuevo build.yml instala las dependencias de Node con npm ci, que necesita un package-lock.json incluido en el repositorio. Cópialo desde el repositorio de Telar (abre package-lock.json y haz clic en Copy raw contents) en la raíz de tu repositorio, o el build fallará. Los sitios nuevos creados a partir de la plantilla ya lo incluyen.", + "¡Eso es todo! El flujo de trabajo descarga automáticamente los scripts de actualización más recientes del repositorio de Telar cada vez que se ejecuta, así que no necesitas copiar ningún archivo de Python manualmente.", + "Paso opcional: Si omites este paso ahora, el resumen de actualización incluirá instrucciones para actualizar build.yml manualmente después de tu primera actualización. Sin embargo, hacerlo ahora asegura una experiencia de actualización más fluida." + ], + "img": [] + }, + "text": "Actualizar Telar Mantén tu sitio Telar al día con las últimas funciones, correcciones de errores y mejoras. ¿Usas el Compositor de Telar? Si administras tu sitio desde el Compositor de Telar , puedes actualizarlo con un clic desde su pantalla de actualización y no necesitas seguir los pasos manuales de abajo. Si primero te pide que apruebes los permisos actualizados en GitHub, acéptalos y vuelve a intentarlo. Los pasos de abajo son para actualizar directamente en GitHub. Descripción general Telar v0.3.4 introdujo un sistema automatizado de actualización que facilita mantener tu sitio al día de forma sencilla y segura. El proceso de actualización depende de la versión que estés usando en este momento: v0.3.4 o posterior : Utiliza el flujo de trabajo automatizado de actualización (actualizaciones con un clic) v0.2.0 a v0.3.3 : Requiere una configuración manual inicial (solo una vez) Actualizaciones automatizadas (v0.3.4+) Si tu sitio ya está en Telar v0.3.4 o posterior, el proceso de actualización es completamente automatizado. Cómo funciona El sistema de actualización: Detecta tu versión actual de Telar desde _config.yml Aplica todas las migraciones necesarias de manera incremental (ej., v0.3.4 → v0.3.5 → v0.3.6) Actualiza los archivos del marco y la configuración Crea una rama de actualización y un issue con resumen detallado Destaca cualquier paso manual que necesites completar Ejecutar una actualización automatizada Solo para repositorios con fork : Si creaste tu sitio haciendo fork de otro repositorio, necesitarás habilitar los issues en la configuración de tu repositorio ( Settings → General → marca Issues ). Los sitios creados usando el botón \"Use this template\" ya tienen los issues habilitados. Ve a tu repositorio en GitHub Haz clic en la pestaña Actions Selecciona el flujo de trabajo \"Upgrade Telar\" en la barra lateral izquierda Haz clic en Run workflow (botón verde a la derecha) Haz clic en el botón verde Run workflow en el menú desplegable Espera a que el flujo de trabajo se complete (generalmente 1-2 minutos) Revisa el issue de actualización creado automáticamente Haz clic en el enlace del issue para crear un pull request Revisa los cambios y haz merge del pull request para completar la actualización Seguro y reversible La actualización crea un issue y una rama, dándote control total. Revisa los cambios usando el enlace de comparación, crea un pull request cuando estés listo y haz merge solo después de verificar. Después de actualizar Visita tu sitio para verificar que esté funcionando correctamente Revisa el issue de actualización para ver si hay pasos manuales (visibles en la sección \"After Merging\") Importante: Si estás actualizando desde v0.2.0-v0.3.3, necesitarás actualizar manualmente tu archivo .github/workflows/build.yml . Ver detalles abajo. Si tienes temas personalizados o modificaciones, pruébalos a fondo Cierra el issue de actualización una vez que todo esté funcionando - esto marca la actualización como completa Si encuentras problemas, consulta los GitHub Issues o reporta un problema Actualización manual del archivo de flujo de trabajo (solo v0.2.0-v0.3.3) Si estás actualizando desde v0.2.0 hasta v0.3.3 , el resumen de actualización incluirá un paso manual para actualizar tu archivo de flujo de trabajo de GitHub Actions. Esto es necesario porque las restricciones de seguridad de GitHub impiden que los flujos de trabajo modifiquen otros archivos de flujo de trabajo. Para actualizar el archivo de flujo de trabajo: Abre https://github.com/UCSB-AMPLab/telar/blob/main/.github/workflows/build.yml Haz clic en el botón Copy raw contents (icono 📋 en la esquina superior derecha) En tu repositorio, edita .github/workflows/build.yml Reemplaza todo el contenido con la versión copiada Confirma el cambio Esta actualización elimina funciones obsoletas (la programación con cron y el paso de git push ) que ya no son necesarias en v0.3.4+. Notas de actualización a v1.8.3 Actualiza con el workflow «Upgrade Telar» o con el Compositor de Telar. La actualización lleva un sitio de la v1.8.2 a la v1.8.3; desde versiones anteriores, pasa en orden por cada versión intermedia. No hay pasos manuales: solo se instalan los archivos de Telar que cambiaron, y el contenido y la configuración del sitio quedan como estaban. La actualización instala un Gemfile.lock que incluye la plataforma x86_64-linux . Si el build de tu sitio venía fallando en los servidores de GitHub con Ubuntu 26.04 al instalar la gema google-protobuf , el primer build después de la actualización instala gemas ya compiladas y termina sin errores. Notas de actualización a v1.8.2 Actualiza con el workflow «Upgrade Telar» o con el Compositor de Telar. La actualización lleva un sitio de la v1.8.1 a la v1.8.2; desde versiones anteriores, pasa en orden por cada versión intermedia. La actualización corrige dos partes de la hoja de cálculo del glosario, salvo que las hayas modificado: las filas de instrucciones del comienzo ahora indican la carpeta /telar-content/texts/glossary/ , y la entrada «Telar» queda solo en el idioma del sitio. Si tu sitio lee el contenido de Google Sheets, la actualización te pide que hagas el mismo cambio en la entrada «Telar» de la hoja, porque el siguiente build vuelve a leerla. En los sitios que se actualizan con scripts/upgrade.py , la actualización también borra las copias viejas de los scripts de actualización ( scripts/telar_upgrade.py y tres archivos auxiliares), salvo que las hayas modificado. Si actualizas con el workflow o desde tu computador, puedes borrar .github/workflows/telar-tests.yml . Ese workflow ejecuta las pruebas del propio Telar, que en tu sitio siempre se omiten. Si actualizas con el Compositor, este lo borra por ti. Notas de actualización a v1.8.1 Actualiza con el workflow «Upgrade Telar» o con el Compositor de Telar. La actualización lleva un sitio de la v1.8.0 a la v1.8.1; desde versiones anteriores, pasa en orden por cada versión intermedia. No hay pasos manuales: solo se instalan los archivos de Telar que cambiaron, y el contenido y la configuración del sitio quedan como estaban. La actualización no agrega a _config.yml la opción nueva hide_warnings , así que el sitio sigue mostrando las advertencias como hasta ahora. Para ocultarlas, pon hide_warnings: true en el bloque development-features . Notas de actualización a v1.8.0 Actualiza con el workflow «Upgrade Telar». Lleva un sitio de v1.7.0 a v1.8.0, y en cadena desde versiones anteriores. Antes del primer build , la actualización corrige las hojas con columnas duplicadas que ahora detendrían el build (una columna conserva los valores y las otras quedan vacías) y lista las respuestas que el build va a recortar. Si tienes tus historias en una hoja de cálculo, revisa la columna que marca una historia como privada. Si la columna se llamaba privado o protegido , ten en cuenta que esas historias estuvieron públicas hasta ahora: el próximo build las cifra, pero no puede deshacer lo que ya se publicó. Copia de nuevo .github/workflows/build.yml a mano desde la plantilla, salvo que actualices con el Compositor de Telar, que lo actualiza por ti. GitHub no permite que el workflow de actualización modifique archivos de workflow, y sin el archivo nuevo, las correcciones de imágenes y de audio de la v1.8.0 no le llegan a tu sitio, que se sigue construyendo con la versión anterior de Python y de las dependencias. Copiar de nuevo upgrade.yml es opcional, y telar-tests.yml , que ejecuta las pruebas de Telar, se puede copiar de nuevo o borrar junto con tests/ , pytest.ini y vitest.config.js . Si tu sitio lee una hoja de Google Sheets , borra de la hoja las columnas que nombre el resumen de la actualización: la actualización corrigió la copia de la hoja que está en el repositorio, pero cada build vuelve a leer la hoja de Google. Notas de actualización a v1.7.0 Actualizar en GitHub no cambia. Si usas el flujo de trabajo \"Upgrade Telar\" , ejecútalo como siempre: no hay nada nuevo que hacer. Si actualizas desde tu computador, esta versión cambia la manera de hacerlo. Hasta ahora, el archivo scripts/upgrade.py de tu sitio hacía la actualización él mismo. Esa copia solo conoce las versiones que existían cuando se instaló, así que un sitio creado en la v1.4.0 le pregunta a su propia herramienta, que le responde que la v1.4.0 es la más reciente, y se queda tres versiones atrás sin avisar. Desde la v1.7.0, scripts/upgrade.py le pregunta a GitHub cuál es la versión más reciente, descarga las herramientas de actualización de esa versión, revisa que su suma de comprobación coincida con la publicada, y las ejecuta. De ahí en adelante tu sitio se mantiene al día por su cuenta. Se necesita conexión a internet. Actualizar siempre la ha necesitado para descargar los archivos del marco. Ahora hace falta desde el comienzo, para descargar las herramientas. Sin conexión, la actualización se detiene y te lo dice, en vez de terminar como si todo hubiera salido bien. Los sitios que solo se actualizan localmente necesitan un paso manual, una sola vez. Si tu sitio nunca ha ejecutado el flujo de trabajo \"Upgrade Telar\" en GitHub, su scripts/upgrade.py sigue siendo el antiguo y te dirá que el sitio ya está al día. No alcanza a ver la v1.7.0, porque solo conoce las versiones que existían cuando se instaló. Haz una de estas dos cosas, una sola vez: Ejecuta el flujo de trabajo \"Upgrade Telar\" en GitHub ( Actions → Upgrade Telar → Run workflow ). Eso actualiza el sitio e instala el nuevo lanzador. O hazlo a mano : en la página de la versión v1.7.0 descarga telar-scripts-v1.7.0.tar.gz , descomprímelo y, desde la carpeta de tu sitio, ejecuta python3 /ruta/donde/lo/descomprimiste/scripts/telar_upgrade.py . Después de cualquiera de las dos, el scripts/upgrade.py de tu sitio es el nuevo lanzador y no vuelve a hacer falta ningún paso manual. Notas de actualización a v1.6.0 v1.6.0 cambia la forma en que se construyen las historias privadas. Las historias, los objetos y la configuración que ya tienes siguen funcionando sin cambios — pero si tu sitio tiene alguna historia marcada private: yes (o protected: yes ), tienes que actualizar tu flujo de trabajo Build and Deploy a mano, o el build fallará. Qué incluye: las historias privadas ahora se generan con las mismas plantillas que las historias abiertas durante el build con Jekyll — el Markdown, los enlaces de glosario, el LaTeX, los clips de audio y el texto alternativo funcionan al desbloquear una historia privada, igual que en una abierta. El cifrado ahora ocurre como un paso aparte cuando el build termina, y no durante él. El build se niega a publicar una historia privada sin cifrar: se detiene temprano si existe una historia privada sin story_key , y se detiene de nuevo al final si algo está mal configurado y el flujo de trabajo no ejecuta el nuevo paso de cifrado. Paso manual obligatorio — actualiza tu flujo de trabajo Build and Deploy: Por seguridad, GitHub no permite que la actualización automática modifique los archivos de flujo de trabajo. Si tu sitio tiene (o podría tener algún día) una historia privada, tienes que agregar el nuevo paso de cifrado a .github/workflows/build.yml tú mismo: Abre build.yml en GitHub Haz clic en Copy raw contents En tu repositorio, ve a .github/workflows/build.yml y haz clic en Edit Selecciona todo y reemplázalo con el contenido copiado Confirma el cambio Si te saltas este paso y marcas una historia con private: yes , el build fallará en el paso \"Convert CSVs to JSON\" con un error que dice que el flujo de trabajo no ejecuta el script de cifrado. Es intencional: sin el paso nuevo, tu sitio publicaría la historia \"privada\" en texto plano. Si tu sitio no tiene historias privadas, no se rompe nada si te saltas este paso — pero no podrás agregar una más adelante sin aplicar antes esta actualización. Pruebas locales: ni bundle exec jekyll serve ni el modo de servir por defecto de scripts/build_local_site.py cifran nada — con ambos, las historias privadas se previsualizan en texto plano. Para probar el comportamiento bloqueado, ejecuta python3 scripts/build_local_site.py --build-only y sirve el directorio _site/ resultante con un servidor de archivos estáticos. Consulta Historias privadas: Probar localmente . Si solo usas la interfaz web de GitHub: La actualización automática se encarga de reemplazar todos los demás archivos del marco. Si tienes (o planeas agregar) alguna historia privada, igual tienes que copiar el build.yml actualizado como se describe arriba — este paso no es opcional. Notas de actualización a v1.5.0 v1.5.0 es una versión centrada en la robustez y la seguridad. Solo afecta el motor y las herramientas: las historias, los objetos y la configuración que ya tienes siguen funcionando sin cambios, sin editar los CSV ni cambiar la configuración. La actualización automática reemplaza todos los archivos del marco; los dos pasos manuales opcionales se describen abajo. Qué incluye: el contenido que escribes en tu sitio ahora se escapa en cada punto de salida; se verifica el certificado TLS en todas las descargas de Google Sheets e IIIF; las historias protegidas quedan más seguras (el build se detiene en vez de publicarlas sin cifrar, el cifrado es más fuerte y ya no se filtran autoría, descripción ni metadatos de SEO); el flujo de actualización descarga sus herramientas verificadas con su suma de control y las ejecuta de forma aislada; y todas las lecturas remotas tienen límites y barreras contra el path traversal . WaveSurfer va incluido en el sitio para que el audio funcione sin conexión, los archivos del marco se instalan de forma atómica y se corrigieron varios errores del visor, los videos, el audio y el orden de los pasos. No tienes que hacer nada para recibir estos cambios; consulta el CHANGELOG para ver la lista completa. Recomendado: actualiza tus archivos de flujo de trabajo de GitHub Actions: Por seguridad, GitHub no permite que la actualización automática modifique los archivos de flujo de trabajo, así que dos mejoras de seguridad de v1.5.0 no se aplican solas: .github/workflows/upgrade.yml : el proceso de actualización ahora descarga sus herramientas como un recurso verificado con su suma de control y las ejecuta de forma aislada. .github/workflows/build.yml : la acción ruby/setup-ruby queda fijada a un commit específico para mayor seguridad en la cadena de suministro, y el build ahora instala las dependencias de Node con npm ci . Para aplicarlos, usa los pasos de copiar desde «Raw» de la sección \"Configuración manual para versiones anteriores\" más abajo, una vez por cada archivo. Si te saltas este paso, tu sitio se sigue construyendo y publicando con normalidad; estos cambios solo refuerzan tus flujos de trabajo. Si actualizas build.yml , agrega también package-lock.json . El nuevo build.yml instala las dependencias de Node con npm ci , que necesita un package-lock.json incluido en el repositorio. Cópialo desde el repositorio de Telar (abre package-lock.json y haz clic en Copy raw contents ) en la raíz de tu repositorio, o el build fallará. Los sitios nuevos creados a partir de la plantilla ya lo incluyen. Paquetes de idioma: nuevas claves para compartir historias protegidas: Esta versión agrega claves a los archivos de idioma incluidos ( en.yml y es.yml ) para los avisos al compartir historias protegidas: los mensajes que aparecen cuando un enlace o un código de inserción lleva la clave de acceso. Si tienes un archivo de idioma personalizado, vuelve a aplicar tus cambios después de actualizar, copiando las claves nuevas desde el archivo actualizado _data/languages/en.yml (o es.yml ) del repositorio de Telar. Si solo usas la interfaz web de GitHub: La actualización automática reemplaza todos los archivos del marco. Las actualizaciones de los flujos de trabajo de arriba son refuerzos opcionales; si aplicas la actualización de build.yml , recuerda la nota sobre package-lock.json . Notas de actualización a v1.4.0 v1.4.0 es una actualización que solo afecta el código de ejecución del sitio. Las historias, los objetos y la configuración que ya tienes siguen funcionando sin cambios: no hace falta editar los CSV, ni cambiar la configuración, ni actualizar los flujos de trabajo. Cambio de visor: OpenSeadragon reemplaza a Tify. El visor de imágenes IIIF pasó de Tify (que se cargaba desde un CDN) a un visor propio basado en OpenSeadragon, alojado localmente. Para la mayoría de los sitios esto es imperceptible: las imágenes IIIF se siguen mostrando y ampliando. Si tu sitio tiene un _sass/_viewer.scss personalizado que sobrescribía los estilos de Tify, esas reglas quedan sin efecto y puedes eliminarlas, aunque no romperán el build si las dejas. Archivo de idioma: seis claves nuevas object.viewer.* . Se agregan seis claves nuevas a los archivos de idioma incluidos ( en.yml y es.yml ): object.viewer.prev_page , object.viewer.next_page , object.viewer.page_input_label , object.viewer.page_input_aria , object.viewer.image_unavailable_title y object.viewer.image_unavailable_detail . Estas claves se usan en los controles de paginación para objetos de varias páginas y en la interfaz de error del nuevo visor. Si tienes un archivo de idioma personalizado (una copia de en.yml o es.yml con tus propias traducciones), tendrás que agregar estas seis claves a mano después de actualizar; de lo contrario, la paginación y los mensajes de error del visor recurrirán a los textos en inglés incluidos por defecto. En las versiones anteriores a la v1.8.0, cuando faltaban las cuatro claves de paginación, no aparecía nada en su lugar y los controles quedaban sin etiqueta. En esas versiones, la única manera de etiquetarlos es agregar las claves. Copia los valores del _data/languages/en.yml (o es.yml ) actualizado en el repositorio de Telar y tradúcelos según lo necesites. Si solo usas la interfaz web de GitHub: No tienes que hacer nada a mano. La actualización se encarga de reemplazar todos los archivos automáticamente. Notas de actualización a v1.3.0 v1.3.0 mejora la cobertura de internacionalización (i18n) en todo el sitio e introduce una convención de archivos hermanos para traducir las páginas de contenido. No requiere cambios en los CSV. Migración de contenido automática (reescritura de páginas con verificación previa). La migración reescribe cuatro archivos de contenido ( index.md , pages/glossary.md , pages/objects.md y telar-content/texts/pages/about.md ) para que usen las nuevas plantillas basadas en claves de idioma, pero solo si el archivo es exactamente igual, byte por byte, al predeterminado de la v1.2.1. Cualquier contenido que hayas personalizado se conserva intacto. En los sitios en español cuyo about.md no se ha modificado respecto al predeterminado de la v1.2.1, la migración también crea telar-content/texts/pages/acerca.md automáticamente. Claves de idioma nuevas: lang.index_page.welcome y lang.pages.glossary_intro . Se agregan dos claves nuevas a los archivos de idioma incluidos. Si tienes un archivo de idioma personalizado, no necesitas agregarlas de inmediato: desde la v1.8.0, cuando falta una clave, la página muestra el texto en inglés incluido por defecto. Antes de la v1.8.0, el texto no aparecía, así que en esas versiones sí toca agregarlas. Al agregarlas, el texto de bienvenida de la página de inicio y la frase de introducción del glosario quedan en el idioma activo del sitio. Si solo usas la interfaz web de GitHub: No tienes que hacer nada a mano, más allá de revisar el issue de actualización que se crea automáticamente, por si marca algún archivo como distinto del predeterminado (lo que significa que se detectaron y conservaron tus personalizaciones). Notas de actualización a v1.2.1 v1.2.1 es una versión de corrección. No requiere pasos manuales. La actualización corrige una falla silenciosa en el script que descarga el contenido de demostración, que afectaba a los sitios cuyo _config.yml tenía una versión con la \"v\" delante (por ejemplo, version: \"v1.2.0\" ). Si tu sitio quedó sin contenido de demostración después de una actualización anterior, este parche lo soluciona. No hay que editar la configuración; la corrección está en el propio script. Notas de actualización a v1.2.0 v1.2.0 agrega una tabla de contenidos por secciones, un botón de \"Volver al inicio\" y navegación dentro de la historia. No requiere pasos manuales. Todas las funciones nuevas se activan automáticamente. La tabla de contenidos por secciones es opcional en cada historia: agrega show_sections: yes a la fila de la historia en project.csv (o mostrar_secciones: si en los sitios en español) para mostrarla. Los sitios que no tengan esa columna siguen funcionando sin necesidad de cambiar los CSV. Si solo usas la interfaz web de GitHub: No tienes que hacer nada. Notas de actualización a v1.1.0 v1.1.0 agrega enlaces profundos ( deep linking ), tarjetas de título, modo colección, estilo para bibliografías y una pestaña de posición para el panel de compartir. No requiere pasos manuales. Los enlaces profundos y el panel de compartir actualizado se activan automáticamente. El modo colección es opcional: pon collection_mode: true en _config.yml para cambiar la disposición de la página de inicio. El valor predeterminado es false , así que los sitios existentes no se ven afectados. Las tarjetas de título usan filas de CSV ya existentes con el campo de objeto vacío: no requieren columnas nuevas. El estilo para bibliografías es un nuevo widget de Markdown ( :::bibliography ) disponible en el contenido de los paneles. Si solo usas la interfaz web de GitHub: No tienes que hacer nada. Notas de actualización a v1.0.0-beta v1.0.0-beta agrega soporte multimedia (objetos de video y audio), un build actualizado y renombra la columna CSV object_type a medium . Paso manual — actualizar el flujo de trabajo de build : El archivo build.yml tiene nuevos pasos para el procesamiento de audio, la configuración de Node.js y el empaquetado de JavaScript. Copia la versión más reciente desde el repositorio de Telar: Abre build.yml en GitHub Haz clic en Copy raw contents En tu repositorio, navega a .github/workflows/build.yml y haz clic en Edit Selecciona todo y reemplaza con el contenido copiado Confirma el cambio Paso manual — instalar dependencias de Node.js (solo desarrollo local): Si desarrollas localmente, ejecuta npm install en el repositorio después de actualizar. Esto instala las dependencias de JavaScript requeridas por el nuevo build (lenis, @vimeo/player, esbuild, vitest). Opcional — soporte de audio: Si el sitio incluye objetos de audio, instala ffmpeg y audiowaveform para la extracción de clips y los datos de picos de forma de onda: macOS: brew install ffmpeg audiowaveform Ubuntu: sudo apt install ffmpeg audiowaveform Los sitios sin objetos de audio no necesitan estas herramientas. GitHub Actions las instala automáticamente cuando se detectan archivos de audio. Cambio de columna — object_type a medium : La columna object_type en objects.csv se renombró a medium . Este cambio es retrocompatible — el nombre anterior se sigue aceptando. Si solo usas la interfaz web de GitHub: Copia el build.yml actualizado como se describe arriba. No se requieren otros pasos manuales. Notas de actualización a v0.7.0 v0.7.0 agrega Node.js como requisito para construir el sitio localmente: Nuevo requisito para desarrollo local: Node.js 18+ ahora es necesario para ejecutar bundle exec jekyll build o bundle exec jekyll serve Esto permite el empaquetado de módulos JavaScript mediante esbuild durante el build Los flujos de trabajo en GitHub no se ven afectados — GitHub Actions ya incluye Node.js Si desarrollas localmente: Instala Node.js 18+ ( nodejs.org ) Ejecuta npm install en tu repositorio para instalar las dependencias de JavaScript Luego procede con los comandos normales de Jekyll Si solo usas la interfaz web de GitHub: No se requiere ninguna acción — tu sitio se seguirá construyendo automáticamente Configuración manual para versiones anteriores Si tu sitio está en la versión v0.2.0 hasta v0.3.3 , primero necesitas agregar el archivo del flujo de trabajo de actualización a tu repositorio. Esta configuración se hace una sola vez ; después de eso, todas las actualizaciones futuras serán automatizadas. Paso 1: Agregar el archivo del flujo de trabajo de actualización Necesitas agregar dos archivos para habilitar las actualizaciones automatizadas: el flujo de trabajo de actualización y el flujo de trabajo de build actualizado. El flujo de trabajo de actualización descargará automáticamente todos los scripts necesarios cuando se ejecute. Método A: Interfaz web de GitHub (Recomendado) Trabaja completamente en el navegador sin instalar nada: Abre el flujo de trabajo de actualización en Telar : Ve a https://github.com/UCSB-AMPLab/telar/blob/main/.github/workflows/upgrade.yml Haz clic en el botón Copy raw contents (icono 📋 en la esquina superior derecha) Crea el archivo en tu repositorio : Ve a tu repositorio en GitHub Haz clic en Add file → Create new file Ingresa la ruta del archivo: .github/workflows/upgrade.yml Pega el contenido copiado Desplázate hacia abajo y haz clic en Commit changes Agrega el mensaje de commit: \"Add automated upgrade workflow\" Haz clic en Commit changes Método B: Desarrollo local (computador) Si tienes tu repositorio clonado localmente: Descarga el archivo del flujo de trabajo desde Telar : curl -o .github/workflows/upgrade.yml https://raw.githubusercontent.com/UCSB-AMPLab/telar/main/.github/workflows/upgrade.yml Confirma y haz push de los cambios : git add .github/workflows/upgrade.yml git commit -m \"Add automated upgrade workflow\" git push ¡Eso es todo! El flujo de trabajo descarga automáticamente los scripts de actualización más recientes del repositorio de Telar cada vez que se ejecuta, así que no necesitas copiar ningún archivo de Python manualmente. Paso 2: Reemplazar el archivo del flujo de trabajo de build Si estás actualizando desde la v0.2.0 hasta v0.3.3 , también necesitas reemplazar tu archivo .github/workflows/build.yml con la versión más reciente. Esto elimina funciones obsoletas (la programación con cron y el paso de git push ) que ya no son necesarias en v0.3.4+. Método A: Interfaz web de GitHub (Recomendado) Trabaja completamente en el navegador: Abre el flujo de trabajo de build en Telar : Ve a https://github.com/UCSB-AMPLab/telar/blob/main/.github/workflows/build.yml Haz clic en el botón Copy raw contents (icono 📋 en la esquina superior derecha) Reemplaza el archivo en tu repositorio : Ve a tu repositorio en GitHub Navega a .github/workflows/build.yml Haz clic en el botón Edit (icono de lápiz) Selecciona todo el contenido (Ctrl+A o Cmd+A) y bórralo Pega el contenido copiado Desplázate hacia abajo y haz clic en Commit changes Agrega el mensaje de commit: \"Update build workflow to v0.3.4\" Haz clic en Commit changes Método B: Desarrollo local (computador) Si tienes tu repositorio clonado localmente: Descarga el archivo del flujo de trabajo desde Telar : curl -o .github/workflows/build.yml https://raw.githubusercontent.com/UCSB-AMPLab/telar/main/.github/workflows/build.yml Confirma y haz push de los cambios : git add .github/workflows/build.yml git commit -m \"Update build workflow to v0.3.4\" git push Paso opcional : Si omites este paso ahora, el resumen de actualización incluirá instrucciones para actualizar build.yml manualmente después de tu primera actualización. Sin embargo, hacerlo ahora asegura una experiencia de actualización más fluida. Paso 3: Ejecuta tu primera actualización automatizada Con eso queda lista la configuración. Ahora sigue las instrucciones de Actualizaciones automatizadas para actualizar a la versión más reciente. El flujo de trabajo hará lo siguiente de forma automática: Descargará los scripts de actualización más recientes del repositorio de Telar Detectará tu versión actual Aplicará todas las migraciones necesarias Creará un pull request con los archivos actualizados Solución de problemas El flujo de trabajo de actualización no aparece Problema : El flujo de trabajo \"Upgrade Telar\" no aparece en la pestaña Actions. Solución : Asegúrate de haber hecho commit del archivo .github/workflows/upgrade.yml Actualiza la pestaña Actions en tu navegador Verifica que el archivo YAML sea válido (sin errores de sintaxis) La actualización falla con error Problema : El flujo de trabajo de actualización falla con un mensaje de error. Solución : Revisa los logs del flujo de trabajo en la pestaña Actions para detalles Verifica que tu _config.yml tenga un campo telar.version El flujo de trabajo descarga scripts automáticamente, así que un problema de red podría causar fallas Si el error persiste, reporta un problema con el mensaje de error No se creó el issue Problema : La actualización se completa pero no se crea ningún issue . Solución : Verifica si ya existe un issue con título \"Upgrade Telar to [versión]\" Verifica que GitHub Actions tenga permiso issues: write en tu repositorio Verifica que los issues estén habilitados en la configuración de tu repositorio Vuelve a ejecutar el workflow Conflictos de merge Problema : El PR de actualización tiene conflictos de merge . Solución : Revisa qué archivos tienen conflictos Si los conflictos están en archivos que has personalizado (CSS, layouts), resuélvelos manualmente Si los conflictos están en archivos del marco, suele convenir conservar la versión de la actualización Si no estás seguro, pide ayuda Historial de versiones Para ver la lista completa de cambios en cada versión, consulta el Changelog en el repositorio de Telar. ¿Necesitas ayuda? Documentación: telar.org/guia Sitio de ejemplo: telar.org/demo Reportar un problema: GitHub Issues" + }, + "/guia/personalizacion/pagina-de-inicio/": { + "ids": [ + "agregar-contenido-personalizado", + "aviso-del-sitio-de-demostración", + "con-texto-introductorio", + "ejemplo-bienvenida-personalizada", + "ejemplo-cuadro-de-alerta", + "ejemplos", + "estructura-básica", + "guide-title", + "modo-colección", + "notas-técnicas", + "objects_heading", + "objects_intro", + "opciones-de-front-matter", + "para-eliminar", + "para-personalizar", + "personalizar-la-página-de-inicio", + "próximos-pasos", + "página-de-inicio-minimalista", + "recomendaciones", + "stories_heading", + "stories_intro", + "ubicación-del-archivo" + ], + "selectors": { + "h1": [ + "Personalizar la página de inicio" + ], + "h2": [ + "Personalizar la página de inicio", + "Ubicación del archivo", + "Estructura básica", + "Modo colección", + "Opciones de front matter", + "Agregar contenido personalizado", + "Aviso del sitio de demostración", + "Ejemplos", + "Recomendaciones", + "Notas técnicas", + "Próximos pasos" + ], + "h3": [ + "stories_heading", + "stories_intro", + "objects_heading", + "objects_intro", + "Ejemplo: bienvenida personalizada", + "Ejemplo: cuadro de alerta", + "Para personalizar", + "Para eliminar", + "Página de inicio minimalista", + "Con texto introductorio" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "--- layout: index title: Home stories_heading: \"Explore the stories\" stories_intro: \"\" objects_heading: \"See the objects behind the stories\" objects_intro: \"Browse {count} objects featured in the stories.\" --- Tu contenido personalizado va aquí...", + "collection_mode: true", + "--- layout: index title: Home stories_heading: \"Explore the stories\" stories_intro: \"\" objects_heading: \"See the objects behind the stories\" objects_intro: \"Browse {count} objects featured in the stories.\" --- ## Bienvenido al Proyecto de Textiles Coloniales Esta exhibición digital explora las historias ocultas tejidas en los textiles coloniales de la región andina. Navega a través de las historias a continuación para descubrir las técnicas y significados culturales de estos artefactos.", + "--- layout: index title: Home stories_heading: \"Explore the stories\" stories_intro: \"\" objects_heading: \"See the objects behind the stories\" objects_intro: \"Browse {count} objects featured in the stories.\" --- {: .alert .alert-warning} > **🚧 Exposición en desarrollo** > > Esta exhibición se está desarrollando activamente. Estamos agregando nuevas historias > y objetos regularmente. ¡Vuelve pronto para ver cómo nos queda!", + "--- layout: index title: Home stories_heading: \"Explore the stories\" stories_intro: \"\" objects_heading: \"See the objects behind the stories\" objects_intro: \"Browse {count} objects featured in the stories.\" ---", + "--- layout: index title: Home stories_heading: \"Explore the stories\" stories_intro: \"Cada historia revela una perspectiva única sobre nuestro patrimonio cultural compartido.\" objects_heading: \"See the objects behind the stories\" objects_intro: \"Browse {count} objects featured in the stories.\" --- ## Acerca de esta exhibición {: .lead} El **Proyecto Textiles Coloniales** utiliza ..." + ], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Personalizar la página de inicio En el Compositor, usa Inicio y páginas . El formato siguiente describe la misma página de inicio publicada. Personalizar la página de inicio La página principal de tu sitio Telar está controlada por un archivo Markdown sencillo ( index.md ) en el directorio raíz del repositorio. Ahí puedes editar o quitar el mensaje de bienvenida y cambiar los encabezados de cada sección. Ubicación del archivo index.md debe estar en el directorio raíz de tu repositorio (no en un subdirectorio). Jekyll busca este archivo ahí para convertirlo en tu página de inicio. Estructura básica Aquí está la estructura predeterminada de index.md : --- layout: index title: Home stories_heading: \"Explore the stories\" stories_intro: \"\" objects_heading: \"See the objects behind the stories\" objects_intro: \"Browse {count} objects featured in the stories.\" --- Tu contenido personalizado va aquí... Modo colección De manera predeterminada, la página principal muestra las historias primero con una muestra de objetos debajo. El modo colección invierte este orden — los objetos aparecen primero en una cuadrícula grande, con las historias en una cuadrícula más pequeña debajo. Se activa en _config.yml : collection_mode: true Cuando el modo colección está activo: Cuadrícula de objetos : Hasta 8 objetos en una cuadrícula de 4 columnas (2 columnas en tableta, 1 en dispositivos móviles). Los objetos provienen de los marcados como featured en objects.csv . Si no hay objetos destacados, se usan los primeros 8 Los objetos de video y audio muestran íconos como marcadores de posición; los objetos de imagen muestran miniaturas IIIF Un botón View all objects enlaza a la galería completa Cuadrícula de historias : Todas las historias aparecen debajo en una cuadrícula más pequeña. El ajuste show_on_homepage en story_interface se ignora en modo colección — se muestran todas las historias El encabezado de la sección — \"Explora la colección\" — proviene de los archivos de idioma del sitio, no del frontmatter de index.md El modo colección funciona bien para sitios con una gran cantidad de objetos y pocas historias, o para exhibiciones centradas en colecciones donde explorar objetos es el punto de entrada principal. Nuevo en v1.1.0. Consulta la Referencia de configuración para los detalles del ajuste. Opciones de front matter stories_heading El encabezado que se muestra sobre la cuadrícula de historias. Predeterminado: \"Explore the stories\" stories_intro Texto introductorio opcional que se muestra entre el encabezado y la cuadrícula de historias. Déjalo en blanco ( \"\" ) si no quieres texto introductorio. objects_heading El encabezado que se muestra sobre la sección de objetos. Predeterminado: \"See the objects behind the stories\" objects_intro Texto introductorio para la sección de objetos. Usa {count} como marcador de posición para el número de objetos. Predeterminado: \"Browse {count} objects featured in the stories.\" El marcador de posición {count} se reemplaza automáticamente con el número real de objetos. Agregar contenido personalizado Cualquier contenido Markdown que agregues debajo del front matter aparecerá sobre la sección de historias. Esto es ideal para: Mensajes de bienvenida Descripciones generales de la exhibición Avisos importantes Llamados a la acción personalizados Ejemplo: bienvenida personalizada --- layout: index title: Home stories_heading: \"Explore the stories\" stories_intro: \"\" objects_heading: \"See the objects behind the stories\" objects_intro: \"Browse {count} objects featured in the stories.\" --- ## Bienvenido al Proyecto de Textiles Coloniales Esta exhibición digital explora las historias ocultas tejidas en los textiles coloniales de la región andina. Navega a través de las historias a continuación para descubrir las técnicas y significados culturales de estos artefactos. Ejemplo: cuadro de alerta Puedes usar etiquetas de alerta para mostrar advertencias: --- layout: index title: Home stories_heading: \"Explore the stories\" stories_intro: \"\" objects_heading: \"See the objects behind the stories\" objects_intro: \"Browse {count} objects featured in the stories.\" --- {: .alert .alert-warning} > **🚧 Exposición en desarrollo** > > Esta exhibición se está desarrollando activamente. Estamos agregando nuevas historias > y objetos regularmente. ¡Vuelve pronto para ver cómo nos queda! Aviso del sitio de demostración La plantilla incluye de manera predeterminada un aviso que dice que el sitio es de demostración, con enlaces al repositorio de GitHub y la documentación. Para personalizar Edita el contenido Markdown para que coincida con tu proyecto. Para eliminar Simplemente elimina el bloque de aviso de demostración de index.md . Ejemplos Página de inicio minimalista --- layout: index title: Home stories_heading: \"Explore the stories\" stories_intro: \"\" objects_heading: \"See the objects behind the stories\" objects_intro: \"Browse {count} objects featured in the stories.\" --- Sin contenido personalizado: solo muestra historias y objetos. Las tarjetas de historias muestran miniaturas según el tipo de medio: las historias de video y audio muestran un ícono como marcador de posición cuando no hay un objeto de imagen disponible. Con texto introductorio --- layout: index title: Home stories_heading: \"Explore the stories\" stories_intro: \"Cada historia revela una perspectiva única sobre nuestro patrimonio cultural compartido.\" objects_heading: \"See the objects behind the stories\" objects_intro: \"Browse {count} objects featured in the stories.\" --- ## Acerca de esta exhibición {: .lead} El **Proyecto Textiles Coloniales** utiliza ... Recomendaciones Mantén el contenido de la página de inicio conciso para que los visitantes entren a tus historias. Usa ## (segundo nivel) o ### (tercer nivel) para crear encabezados. Prueba tu página de inicio en distintos tamaños de pantalla para cerciorarte de que se vea bien. Actualiza los avisos y textos introductorios a medida que tu exhibición evolucione. Notas técnicas La configuración layout: index es obligatoria y no debe cambiarse. La configuración title controla la etiqueta de la página. Todas las funciones de Markdown son compatibles (consulta la Guía de sintaxis de Markdown ). Próximos pasos Aprende sobre temas para dar estilo a tu página de inicio. Explora estilos avanzados para CSS personalizado. Consulta la referencia de Markdown para opciones de formato." + }, + "/guia/funciones/insercion/": { + "ids": [ + "accesibilidad", + "actualizar-historias-insertadas", + "canvas-lms", + "características-del-modo-embed", + "consejos-para-una-inserción-exitosa", + "consideraciones-de-seguridad", + "cuándo-usar-la-inserción", + "cómo-insertar-una-historia", + "dimensiones-personalizadas", + "elige-dimensiones-apropiadas", + "insertar-historias-de-telar-en-lms-y-sitios-web", + "instrucciones-específicas-de-plataforma", + "lo-que-verán-las-personas", + "moodle", + "múltiples-historias-en-una-página", + "otras-plataformas", + "paso-1-abre-el-panel-de-compartir-e-insertar", + "paso-2-cambia-a-la-pestaña-de-código-de-inserción", + "paso-3-selecciona-una-historia-solo-desde-la-página-de-inicio", + "paso-4-elige-las-dimensiones", + "paso-5-copia-el-código-de-inserción", + "prueba-antes-de-publicar", + "próximos-pasos", + "qué-es-insertar-embed", + "requisitos-previos", + "solución-de-problemas", + "tamaños-predefinidos", + "wordpress" + ], + "selectors": { + "h1": [ + "Insertar historias de Telar en LMS y sitios web" + ], + "h2": [ + "¿Qué es insertar (embed)?", + "Cuándo usar la inserción", + "Requisitos previos", + "Cómo insertar una historia", + "Instrucciones específicas de plataforma", + "Lo que verán las personas", + "Consejos para una inserción exitosa", + "Actualizar historias insertadas", + "Solución de problemas", + "Próximos pasos" + ], + "h3": [ + "Paso 1: abre el panel de compartir e insertar", + "Paso 2: cambia a la pestaña de código de inserción", + "Paso 3: selecciona una historia (solo desde la página de inicio)", + "Paso 4: elige las dimensiones", + "Paso 5: Copia el código de inserción", + "Canvas LMS", + "WordPress", + "Moodle", + "Otras plataformas", + "Características del modo embed", + "Accesibilidad", + "Elige dimensiones apropiadas", + "Prueba antes de publicar", + "Múltiples historias en una página", + "Consideraciones de seguridad" + ], + "h4": [ + "Tamaños predefinidos", + "Dimensiones personalizadas" + ], + "h5": [], + "h6": [], + "pre": [ + "<iframe src=\"https://tusitio.com/stories/story-1/?embed=true\" width=\"100%\" height=\"800px\" title=\"Título de tu historia\" frameborder=\"0\"> </iframe>" + ], + "table": [ + "Tamaño predefinido Ancho Alto Ideal para Canvas LMS 100% 800px Páginas de curso Canvas (predeterminado) Moodle/Blackboard 100% 700px Módulos de curso Moodle WordPress 100% 600px Publicaciones y páginas de blogs Squarespace 100% 600px Páginas de Squarespace Wix 100% 550px Páginas de sitios Wix Mobile 375px 500px Visualización optimizada para móviles Fixed 800px 600px Contenedores de tamaño fijo Custom Tu elección Tu elección Control manual" + ], + "blockquote": [ + "Sugerencia: Comienza con el tamaño predefinido Usa el tamaño predefinido para tu plataforma y luego ajusta si es necesario. La mayoría de las plataformas funcionan mejor con ancho del 100% y altura de 600-800px.", + "Entendiendo ancho y alto Ancho: 100% llena el espacio horizontal disponible (recomendado para la mayoría de los usos) Alto: Píxeles fijos proporciona visualización consistente en todos los dispositivos El código de inserción agregará automáticamente \"px\" a números simples", + "Para iniciar una historia incrustada en un paso específico, agrega un fragmento de enlace profundo a la URL de inserción — por ejemplo, ?embed=true#s3 abre en el paso 3. Consulta Compartir y enlaces profundos para el formato del fragmento.", + "Confirmación de inserción en Canvas Canvas puede mostrar un cuadro en blanco en el editor. Esto es normal—la historia se mostrará correctamente cuando veas la página publicada.", + "Sugerencia: Compatibilidad de versiones Mientras mantengas el formato de URL de inserción (?embed=true), las historias insertadas funcionarán a través de actualizaciones de versión de Telar." + ], + "img": [ + [ + "/images/embed-panel.png", + "Panel de compartir e insertar con opciones de enlace y código de inserción" + ] + ] + }, + "text": "Insertar historias de Telar en LMS y sitios web Inserta historias individuales de Telar en Canvas, Moodle, WordPress o cualquier sitio web que admita iframes. ¿Qué es insertar ( embed )? Insertar te permite mostrar una historia de Telar dentro de otro sitio web o sistema de gestión del aprendizaje (LMS, por sus siglas en inglés). Tu historia aparece como parte de la página anfitriona, permitiendo que estudiantes o visitantes la exploren sin salir de la plataforma. Beneficios de insertar: Mantener a las personas dentro de tu LMS o sitio web Integrar narrativas visuales en módulos de curso Mantener navegación y marca consistentes Sin inicio de sesión adicional ni enlaces externos Cuándo usar la inserción Ideal para: Módulos de curso en Canvas LMS Contenido de curso en Moodle Publicaciones y páginas de blogs en WordPress Sitios web de cursos educativos Sitios web de portafolio No es necesario para: Compartir enlaces directos (usa la función de compartir enlace) Integración de sitio completo (enlaza a tu página de inicio de Telar) Requisitos previos Antes de insertar: Tu sitio de Telar debe estar desplegado y accesible públicamente (vía GitHub Pages o dominio personalizado) Necesitas acceso de edición a la plataforma de destino (Canvas, WordPress, etc.) La plataforma debe admitir inserción de HTML/iframe Cómo insertar una historia Paso 1: abre el panel de compartir e insertar En una página de historia: Navega a la historia que deseas insertar Haz clic en el botón Share (aparece en el lado derecho del panel narrativo) En la página de inicio de tu sitio: Ve a la página de inicio de tu sitio Telar Haz clic en el botón Share en la barra de navegación (arriba a la derecha) Paso 2: cambia a la pestaña de código de inserción En el panel de compartir, haz clic en la pestaña Embed Code Lee el texto introductorio para obtener orientación específica de la plataforma Paso 3: selecciona una historia (solo desde la página de inicio) Si abriste el panel de compartir desde la página de inicio: Usa el menú desplegable Select Story Elige la historia que deseas insertar El código de inserción se actualizará automáticamente Paso 4: elige las dimensiones Selecciona un tamaño predefinido que coincida con tu plataforma, o indica dimensiones personalizadas. Tamaños predefinidos Tamaño predefinido Ancho Alto Ideal para Canvas LMS 100% 800px Páginas de curso Canvas (predeterminado) Moodle/Blackboard 100% 700px Módulos de curso Moodle WordPress 100% 600px Publicaciones y páginas de blogs Squarespace 100% 600px Páginas de Squarespace Wix 100% 550px Páginas de sitios Wix Mobile 375px 500px Visualización optimizada para móviles Fixed 800px 600px Contenedores de tamaño fijo Custom Tu elección Tu elección Control manual Sugerencia: Comienza con el tamaño predefinido Usa el tamaño predefinido para tu plataforma y luego ajusta si es necesario. La mayoría de las plataformas funcionan mejor con ancho del 100% y altura de 600-800px. Dimensiones personalizadas Para el tamaño predefinido Custom o para modificar un tamaño predefinido: Haz clic en el campo Width e indica un valor: Porcentaje: 100% (llena el ancho del contenedor) Píxeles: 800 o 800px (ancho fijo) Haz clic en el campo Height e indica un valor: Usualmente píxeles: 600 o 600px El porcentaje funciona pero puede comportarse de manera inesperada en iframes Entendiendo ancho y alto Ancho: 100% llena el espacio horizontal disponible (recomendado para la mayoría de los usos) Alto: Píxeles fijos proporciona visualización consistente en todos los dispositivos El código de inserción agregará automáticamente \"px\" a números simples Paso 5: Copia el código de inserción Revisa el código generado en el cuadro de texto Haz clic en el botón Copy Embed Code Busca el ícono de marca de verificación confirmando que el código fue copiado El código de inserción se ve así: <iframe src=\"https://tusitio.com/stories/story-1/?embed=true\" width=\"100%\" height=\"800px\" title=\"Título de tu historia\" frameborder=\"0\"> </iframe> Para iniciar una historia incrustada en un paso específico, agrega un fragmento de enlace profundo a la URL de inserción — por ejemplo, ?embed=true#s3 abre en el paso 3. Consulta Compartir y enlaces profundos para el formato del fragmento. Instrucciones específicas de plataforma Canvas LMS Para insertar en una página de curso de Canvas: Navega a tu curso de Canvas Ve a Pages o Modules Crea una nueva página o edita una existente Haz clic en el botón </> (Editor HTML) en la barra de herramientas Pega el código de inserción que copiaste Haz clic en </> nuevamente para regresar al editor visual Haz clic en Save o Update Visualiza la página para ver tu historia insertada Confirmación de inserción en Canvas Canvas puede mostrar un cuadro en blanco en el editor. Esto es normal—la historia se mostrará correctamente cuando veas la página publicada. Probando tu inserción: Haz clic en View en la página Verifica que la historia se cargue Prueba la navegación usando los botones de flecha Asegúrate de que el visor de imágenes IIIF funcione Verifica que el banner \"View full site\" aparezca (es descartable) WordPress Para insertar en una publicación o página de WordPress: Edita o crea una publicación/página Agrega un bloque de Custom HTML Haz clic en + para agregar un bloque Busca \"Custom HTML\" Haz clic para insertar Pega el código de inserción en el bloque HTML Haz clic en Preview para probar Haz clic en Publish o Update Editor de bloques (Gutenberg): El bloque Custom HTML es el enfoque recomendado. No uses el bloque \"Embed\"—está diseñado para proveedores oEmbed, no para código iframe personalizado. Editor clásico: Cambia a la pestaña Text (no Visual), pega el código, luego regresa a Visual para ver una vista previa. Moodle Para insertar en un curso de Moodle: Activa la edición en tu curso Agrega un bloque HTML a una sección Haz clic en el botón </> (HTML) en la barra de herramientas del editor Pega el código de inserción Haz clic en </> nuevamente para regresar al editor visual Guarda los cambios Alternativamente, usa el tipo de recurso Page y pega el código de inserción en modo HTML. Otras plataformas La mayoría de los constructores de sitios web y plataformas CMS admiten inserción de iframe: Squarespace : Usa un bloque Code Wix : Usa el elemento HTML iframe Webflow : Usa un elemento Embed Ghost : Usa una tarjeta HTML Consulta la documentación de tu plataforma para instrucciones sobre cómo agregar HTML personalizado o iframes. Lo que verán las personas Características del modo embed Cuando una historia está insertada, las personas experimentan: Navegación: Navegación por botones (arriba/abajo) para moverse entre pasos — las historias insertadas usan botones en lugar de desplazamiento Los botones aparecen en todos los tamaños de pantalla (incluyendo escritorio) Navegación por teclado (teclas de flecha, Re Pág/Av Pág, Espacio) Transiciones suaves entre pasos Los íconos son SVG de Lucide integrados en línea Visor: Visor de imágenes IIIF completo con zoom y paneo Escalado responsivo para diferentes tamaños de pantalla Navegación por miniaturas en la interfaz del visor Banner \"View Full Site\": Aparece en la parte superior izquierda de la historia insertada Enlaza a tu sitio Telar completo Descartable con el botón X Reaparece al actualizar la página Elementos ocultos: Botón de inicio (no se muestra en modo embed ) Botón de compartir (no se muestra en modo embed ) Accesibilidad Las historias insertadas mantienen accesibilidad completa: Navegación por teclado admitida Etiquetas ARIA preservadas Compatible con lectores de pantalla Contenido de texto permanece accesible Consejos para una inserción exitosa Elige dimensiones apropiadas Para plataformas LMS (Canvas, Moodle): Usa ancho del 100% para llenar el área de contenido Usa altura de 700-800px para visualización cómoda Prueba en escritorio y móvil Para publicaciones de blog y artículos: Considera ancho del 100% o 800px fijo Usa altura de 600-700px para equilibrar con contenido de texto Asegúrate de que la historia no domine la página Para sitios móviles primero: Usa el tamaño predefinido Mobile (375px × 500px) O usa ancho del 100% con altura de 500-600px Prueba en dispositivos móviles reales Prueba antes de publicar Previsualiza la historia insertada antes de hacerla pública Prueba la navegación (botones, teclado, desplazamiento) Verifica que el visor IIIF cargue y haga zoom correctamente Verifica en dispositivos móviles y tabletas Asegúrate de que la historia insertada no rompa el diseño de la página Múltiples historias en una página Puedes insertar múltiples historias en una sola página: Cada historia obtiene su propio iframe Usa dimensiones consistentes para coherencia visual Agrega texto o encabezados entre las historias insertadas Considera la longitud de la página y el tiempo de carga Consideraciones de seguridad Las URLs de inserción son públicas: Cualquier persona con el código de inserción puede ver tu historia Las historias insertadas evitan cualquier restricción de acceso en el sitio anfitrión Usa los mismos permisos que tu sitio Telar principal Seguridad de Canvas/LMS: Los permisos a nivel de curso no se aplican al contenido insertado Los estudiantes pueden ver la historia incluso fuera del curso accediendo a la URL directamente Considera esto al insertar contenido sensible Actualizar historias insertadas Los cambios a tu sitio Telar aparecen automáticamente en las inserciones: Edita el contenido en tu repositorio Telar (Google Sheets o Markdown) Haz push de los cambios y deja que GitHub Actions construya el sitio Las historias insertadas se actualizan automáticamente—no es necesario volver a insertar Cambiar dimensiones de inserción: Si necesitas cambiar el ancho o alto: Genera nuevo código de inserción con dimensiones actualizadas Reemplaza el código antiguo en tu plataforma Guarda/publica la actualización Sugerencia: Compatibilidad de versiones Mientras mantengas el formato de URL de inserción ( ?embed=true ), las historias insertadas funcionarán a través de actualizaciones de versión de Telar. Solución de problemas iframe no se muestra: Verifica que el parámetro ?embed=true esté incluido en la URL Verifica que el sitio padre permita iframes Revisa la consola del navegador en busca de errores La navegación no funciona: Asegúrate de no estar bloqueando JavaScript Verifica que el iframe tenga altura suficiente Busca CSS conflictivo en la página padre Contenido cortado: Aumenta la altura del iframe (recomendado: 800px mínimo) Pon width: 100% para comportamiento responsivo Próximos pasos Enlaces para compartir : Usa la pestaña Share Link para enlaces directos en lugar de insertar Personalización : Aprende sobre personalizar tu sitio Telar Detalles técnicos : Consulta Arquitectura del sistema de inserción para documentación de desarrolladores" + }, + "/docs/getting-started/add-content/": { + "ids": [ + "add-an-object-and-a-first-story", + "add-detail-panels", + "add-optional-depth", + "add-the-first-step", + "add-the-source", + "add-your-content", + "add-your-media", + "build-the-first-edition", + "build-your-site", + "register-the-story", + "register-your-objects", + "register-your-stories", + "structure-your-story" + ], + "selectors": { + "h1": [ + "Add an object and a first story" + ], + "h2": [ + "Add the source", + "Register the story", + "Add the first step", + "Add optional depth", + "Build the first edition" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "https://juancobo.com/138la/iiif/khipu/p7/manifest.json" + ], + "table": [ + "order story_id title 1 khipu-story Examining a khipu", + "Column Example step 1 object khipu x, y, zoom 0.5, 0.5, 1 question Which activity does this image document? answer Sampling a khipu for radiocarbon dating in spring 2025. alt_text Gloved hands working with knotted cords on a white surface." + ], + "blockquote": [], + "img": [] + }, + "text": "Add an object and a first story Start with one object and a short sequence. Once the full route works, extend it with more sources and optional layers. Add the source In the objects tab, add an ID, title, source address and useful metadata. For an external IIIF source, put the manifest URL in source_url . Use this example if you need a source for practice: https://juancobo.com/138la/iiif/khipu/p7/manifest.json Choose the ID khipu and a title such as \"Haptic khipu\". Add a description of the visible activity and retain the source's catalogue information and credit. For a file you host yourself, upload it to telar-content/objects/ in your repository, use its filename as the object ID and leave source_url blank. Read self-hosted images for supported formats and processing. Register the story In project , add a story row with an order, stable story ID and title. For example: order story_id title 1 khipu-story Examining a khipu Create or rename the story tab to khipu-story . The ID and tab name must match. Keep the template's column headers. Add the first step Fill one row: Column Example step 1 object khipu x , y , zoom 0.5 , 0.5 , 1 question Which activity does this image document? answer Sampling a khipu for radiocarbon dating in spring 2025. alt_text Gloved hands working with knotted cords on a white surface. Add another numbered row for the next observation. You can use the same object with a different framing. For multi-page objects, the optional page column chooses the page first. For recordings, use clip_start and clip_end in seconds and loop where needed. Read video and audio before using a provider with different playback behaviour. Add optional depth Write additional context in layer1_content . Give the opening button a useful name in layer1_button . A second panel uses layer2_content and opens from the first. For longer texts, use a Markdown file reference. Add glossary terms in the glossary tab and insert [[term-id]] links in supported text fields. Build the first edition Save the sheet changes. In your repository, open Actions , select Build and Deploy , then Run workflow . The build fetches the published sheet. Wait for that run to complete, then open the site. Next, capture the framing and review the result ." + }, + "/guia/configuracion/": { + "ids": [ + "configura-tu-sitio", + "configuración-manual", + "mantenimiento" + ], + "selectors": { + "h1": [ + "Configura tu sitio" + ], + "h2": [ + "Mantenimiento" + ], + "h3": [ + "Configuración manual" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Configura tu sitio ¿Buscas instrucciones de configuración? Ve a Primeros pasos para elegir entre el Compositor, Google Sheets o desarrollo local. Esta sección cubre la configuración manual y el mantenimiento de sitios existentes. Configuración manual El enfoque manual paso a paso para personas que ya se sienten cómodas con GitHub y YAML. Construye una exposición completa desde tu navegador, sin instalar nada. Configuración manual Mantenimiento Actualizar Telar — Mantén tu sitio al día con las últimas funciones" + }, + "/guia/desarrolladores/moviles/": { + "ids": [ + "accesibilidad", + "carga", + "contenido-para-pantallas-pequeñas", + "cómo-probar-el-sitio-en-pantallas-pequeñas", + "diseños-y-pantallas-pequeñas", + "dispositivos-reales", + "el-contenido-se-desborda", + "el-sitio-va-lento", + "galería-de-objetos", + "herramientas-de-desarrollo-del-navegador", + "imágenes", + "la-navegación-no-funciona", + "la-tarjeta-de-texto", + "lista-de-verificación", + "los-dos-diseños", + "navegación", + "paneles", + "rendimiento", + "safari-de-ios-y-muescas", + "solución-de-problemas", + "tamaño-de-letra-compacto", + "tamaños-de-pantalla-comunes", + "texto", + "widgets", + "índice-del-glosario" + ], + "selectors": { + "h1": [ + "Diseños y pantallas pequeñas" + ], + "h2": [ + "Los dos diseños", + "Tamaño de letra compacto", + "Safari de iOS y muescas", + "Paneles", + "Galería de objetos", + "Índice del glosario", + "Cómo probar el sitio en pantallas pequeñas", + "Contenido para pantallas pequeñas", + "Rendimiento", + "Accesibilidad", + "Solución de problemas", + "Lista de verificación" + ], + "h3": [ + "La tarjeta de texto", + "Navegación", + "Carga", + "Herramientas de desarrollo del navegador", + "Dispositivos reales", + "Tamaños de pantalla comunes", + "Imágenes", + "Texto", + "Widgets", + "El contenido se desborda", + "La navegación no funciona", + "El sitio va lento" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Diseños y pantallas pequeñas La página de una historia tiene dos diseños, horizontal y vertical, y escoge entre ellos según el tamaño y la forma de la ventana, no según el tipo de dispositivo. Esta página explica qué hace cada diseño y cómo se adapta el resto del sitio a las ventanas pequeñas o bajas. Los términos que usa están definidos en 8.7 Vocabulario del motor de historias . Los dos diseños En el diseño horizontal, la tarjeta de texto va al lado del objeto, como tarjeta lateral, y quien lee avanza por la historia desplazándose. En el diseño vertical, la tarjeta de texto va debajo del objeto, como tarjeta inferior, y quien lee avanza con los botones de anterior y siguiente. La página usa el diseño vertical cuando la ventana cumple alguna de estas condiciones: Mide 1024 px de ancho o menos. Su relación de aspecto es de 3:4 o más angosta, como la de una tableta en orientación vertical, sea cual sea su ancho. Mide 480 px de alto o menos. Mide entre 481 px y 632 px de alto y es demasiado angosta para la tarjeta lateral que esa altura requiere. En cualquier otro caso usa el diseño horizontal. Si la ventana cambia de tamaño, la página vuelve a escoger el diseño. La tarjeta de texto En el diseño horizontal, la tarjeta lateral es blanca, va encima del objeto y ocupa entre el 37 % y el 52 % del ancho de la ventana, según la altura de esta. En el diseño vertical, la tarjeta inferior va anclada al borde inferior de la ventana, es blanca y ocupa hasta el 40 % de la altura de la ventana (el 35 % si el objeto es un video o un audio). En una ventana de 480 px de alto o menos, como la de un teléfono en orientación horizontal, la tarjeta vuelve a ponerse al lado del objeto, aunque la página siga en el diseño vertical. Es la tarjeta lateral de poca altura: ocupa el 37 % del ancho de la ventana y, si el texto no cabe en la ventana, se desplaza dentro de la propia tarjeta. El texto también se ajusta al ancho de la tarjeta: cuando esta mide 480 px o menos, y otra vez a los 360 px, se reducen el relleno y la letra. Si una respuesta pasa de 15 líneas, la letra baja al 90 % del tamaño que la tarjeta usa para las respuestas, para que una de 18 líneas, el máximo, quepa en la tarjeta lateral sin que haya que desplazarse. Navegación La navegación se escoge una sola vez, al cargar la historia: Navegación por desplazamiento (rueda del mouse, panel táctil, pantalla táctil y teclado) en el diseño horizontal. Navegación por botones en el diseño vertical, en las historias insertadas y, en iPhone y iPad, en los dos diseños, porque allí el desplazamiento con inercia no es confiable. Los botones de anterior y siguiente son círculos de 66 px fijos en el borde derecho de la ventana, centrados en vertical. Como la elección se hace al cargar, una ventana que se abre ancha y luego se angosta conserva la navegación por desplazamiento, y una que se abre angosta y luego se ensancha conserva los botones. El teclado funciona en los dos casos: las flechas, Re Pág y Av Pág, la barra espaciadora, Inicio y Fin. En el diseño vertical, el botón para volver se convierte en un ícono redondo de 44 px, el contador de pasos pasa al centro del borde superior y la insignia de créditos se reduce a una sola línea. Carga Los dos diseños cargan los objetos de la misma manera: cargan los visores de los pasos siguientes (tantos como indique preload_steps , 6 por defecto) y de los 2 anteriores, sin pasar de max_viewer_cards . Consulta 3.2 Configuración . Cuando una historia tiene al menos tantos objetos distintos como indica loading_threshold (5 por defecto), aparece un brillo de carga mientras cargan los primeros visores; en la navegación por botones también aparece cuando quien lee llega a un objeto que todavía no ha cargado. Tamaño de letra compacto En cualquier ventana de 600 px de alto o menos, sea cual sea su ancho, Telar aplica el tamaño de letra compacto: letra más pequeña y espaciado más ajustado en el contenido de las páginas, la galería de objetos, la barra de navegación, los paneles y sus títulos, y los botones de navegación de la historia, que pasan a medir 45 px. Safari de iOS y muescas Alturas estables: las alturas del diseño usan unidades dinámicas de viewport ( dvh ), y vh en los navegadores que no las admiten, para que el diseño no salte cuando aparece o desaparece la barra de direcciones de Safari. Áreas seguras de la muesca: la insignia de créditos, los botones de navegación, la tarjeta inferior y los paneles quedan libres de la muesca y del indicador de inicio del dispositivo. Estados al pasar el cursor: solo se aplican en dispositivos con un puntero preciso ( @media (hover: hover) and (pointer: fine) ), para que no queden activos después de tocar una pantalla táctil. Movimiento reducido: cuando el sistema operativo pide reducir el movimiento, Telar desactiva el desplazamiento suave y las transiciones de las tarjetas y de los paneles, y la cámara pasa de inmediato a cada encuadre. Paneles Los paneles entran desde la derecha en los dos diseños. En el diseño horizontal, el de la capa 1 ocupa el 65 % de la ventana (800 px como máximo), el de la capa 2 el 55 % (750 px como máximo) y el del glosario el 50 % (700 px como máximo); en ventanas de entre 1025 px y 1200 px de ancho ocupan el 80 %, el 75 % y el 70 %. En el diseño vertical ocupan casi todo el ancho (98 %, 96 % y 94 %) y el 76 % de la altura, muestran solo el botón para cerrar y tienen menos relleno. La letra de los paneles se reduce solo con el tamaño de letra compacto: los títulos pasan de 2 rem a 1,4 rem, el texto de 1,05 rem a 0,9 rem y el interlineado de 1,8 a 1,35. Galería de objetos La galería llena el ancho con columnas de por lo menos 250 px. En el diseño vertical muestra dos columnas, y en ventanas de 441 px de ancho o menos, una. Índice del glosario En el diseño vertical, el índice del glosario ajusta el espaciado: los encabezados de cada letra se hacen más pequeños y sus márgenes se reducen en un tercio, y el espacio entre términos se reduce a la mitad. Cómo probar el sitio en pantallas pequeñas Herramientas de desarrollo del navegador Con las herramientas de desarrollo del navegador puedes probar distintos tamaños de ventana: Chrome: Abre DevTools (F12) Haz clic en el ícono de la barra de dispositivos Escoge un dispositivo predefinido o escribe medidas propias Prueba las dos orientaciones Firefox: Abre DevTools (F12) Haz clic en Responsive Design Mode Prueba distintos dispositivos Prueba tamaños de ventana a uno y otro lado de los umbrales: 1024 px de ancho, una relación de aspecto de 3:4, y 480 px y 600 px de alto. Recarga la página después de cambiar el tamaño para ver la navegación que tendría quien lea con esa ventana. Dispositivos reales Cuando puedas, prueba en dispositivos reales: iOS : Safari en iPhone y iPad Android : Chrome en un teléfono y en una tableta Tamaños de pantalla comunes iPhone SE : 375 × 667 px iPhone 12/13/14 : 390 × 844 px iPhone 12/13/14 Pro Max : 428 × 926 px iPad : 768 × 1024 px Samsung Galaxy S : 360 × 740 px Samsung Galaxy Note : 412 × 915 px Contenido para pantallas pequeñas Imágenes Asegúrate de que las imágenes IIIF tengan suficiente detalle al hacer zoom. Revisa que los detalles que señala cada paso se vean en una pantalla pequeña. Comprueba cómo se ven los encuadres en los dos diseños. Texto Escribe respuestas con párrafos cortos (de 3 a 5 oraciones). Usa listas para dividir los pasajes largos. Pon la información esencial en la capa 1 y los detalles complementarios en la capa 2, porque es posible que quien lee en un teléfono no abra todas las capas. Widgets Carruseles: de 3 a 5 imágenes, con leyendas cortas. Pestañas: 2 o 3 pestañas con etiquetas cortas; en pantallas angostas la fila de pestañas se desplaza hacia los lados. Acordeones: funcionan bien en pantallas pequeñas; usa títulos claros. Rendimiento Quien lee en un teléfono suele tener una conexión lenta o con datos limitados: Comprime las imágenes antes de subirlas (idealmente menos de 2 MB cada una) y deja que las teselas ( tiles ) IIIF se encarguen de la carga progresiva. Escoge fuentes IIIF externas con servidores rápidos y prueba qué tan rápido cargan sus manifiestos. En los paneles, usa solo las imágenes que el texto necesita. Accesibilidad La mayoría de los controles miden por lo menos 44 × 44 px, el mínimo de WCAG 2.1 para un objetivo táctil; los botones de navegación de la historia miden 66 px, o 45 px con el tamaño de letra compacto. Los botones de navegación y otros controles tienen etiquetas ARIA. Solución de problemas El contenido se desborda Revisa si el CSS personalizado tiene elementos de ancho fijo. Asegúrate de que las imágenes tengan max-width: 100% . Prueba la página en el modo de diseño adaptable del navegador. La navegación no funciona Borra la caché del navegador o prueba en una ventana privada. Revisa la consola de JavaScript en busca de errores. Comprueba que ningún código personalizado bloquee los eventos táctiles o de la rueda. El sitio va lento Reduce el tamaño de los archivos de imagen. Revisa qué tan rápido responden los manifiestos IIIF. Simula una conexión lenta en DevTools . Lista de verificación La página de inicio carga y se ve bien La galería de objetos muestra dos columnas en el diseño vertical, y una en un teléfono angosto La historia usa el diseño y la navegación esperados en cada tamaño de ventana Los botones de navegación son fáciles de tocar Los paneles se abren y se cierran El texto se lee sin hacer zoom Las imágenes cargan Los widgets funcionan Los enlaces del glosario funcionan El sitio funciona con el teléfono en orientación vertical y horizontal El rendimiento es aceptable con una conexión lenta" + }, + "/guia/personalizacion/contenido-demostracion/": { + "ids": [ + "activar-o-desactivar-el-contenido-de-demostración", + "contenido-de-demostración", + "dónde-aparece-el-contenido-de-demostración", + "el-contenido-de-demostración-está-en-otro-idioma", + "el-contenido-de-demostración-y-tu-propio-contenido", + "idioma", + "la-mujer-alegórica", + "las-historias-de-demostración", + "no-aparecen-las-historias-de-demostración", + "no-se-pudo-descargar-el-contenido-de-demostración", + "paisajes-coloniales", + "qué-es-el-contenido-de-demostración", + "solución-de-problemas", + "usar-las-demostraciones-como-modelo" + ], + "selectors": { + "h1": [ + "Contenido de demostración" + ], + "h2": [ + "¿Qué es el contenido de demostración?", + "Las historias de demostración", + "Activar o desactivar el contenido de demostración", + "Dónde aparece el contenido de demostración", + "Idioma", + "El contenido de demostración y tu propio contenido", + "Usar las demostraciones como modelo", + "Solución de problemas" + ], + "h3": [ + "La mujer alegórica", + "Paisajes coloniales", + "No aparecen las historias de demostración", + "No se pudo descargar el contenido de demostración", + "El contenido de demostración está en otro idioma" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "story_interface: include_demo_content: true" + ], + "table": [ + "Título en inglés Título en español Pasos Qué muestra The Allegorical Woman La mujer alegórica 10 Una historia sencilla, centrada en una sola imagen Colonial Landscapes Paisajes coloniales 22 Una historia más larga, con capítulos, paneles y fuentes primarias", + "Dónde Qué ves Página de inicio Las historias de demostración, antes de las tuyas, con una insignia DEMO Tarjeta de inicio de la historia Una etiqueta Contenido de demostración encima del título de la historia Paneles de capa Una insignia Contenido de demostración junto al título del panel Página de objetos Los objetos de demostración, después de los tuyos, con una insignia DEMO Página de un objeto Una etiqueta Contenido de demostración encima del título del objeto Página del glosario Una insignia DEMO junto a cada entrada de demostración Página de una entrada del glosario Una insignia Contenido de demostración junto al título de la entrada", + "Tu configuración Contenido de demostración que recibes telar_language: \"en\" Historias, objetos y glosario en inglés telar_language: \"es\" Historias, objetos y glosario en español", + "Tu contenido Contenido de demostración Dónde está En tu repositorio Se descarga en cada build; no se guarda en tu repositorio ¿Se puede editar? Sí No Marca Ninguna Insignia DEMO o etiqueta Contenido de demostración Mismo identificador de objeto que uno tuyo — Se conserva tu objeto y se omite el de demostración Mismo identificador de entrada del glosario que uno tuyo — Se conserva tu entrada y se omite la de demostración" + ], + "blockquote": [ + "Conserva las demostraciones mientras aprendes Mientras escribes tu primera historia, vale la pena tener a mano las historias de demostración, al lado de la tuya. Desactívalas antes de compartir el sitio." + ], + "img": [] + }, + "text": "Contenido de demostración El contenido de demostración agrega a tu sitio dos historias de ejemplo terminadas. Con ellas puedes ver, antes de escribir la tuya, cómo se arma una historia en Telar y cómo funciona. ¿Qué es el contenido de demostración? Es un conjunto de historias de ejemplo, junto con los objetos y las entradas del glosario que usan. Cada vez que se construye el sitio, Telar lo descarga de content.telar.org y lo suma a tu propio contenido. Nunca se guarda en tu repositorio, así que, cuando lo desactivas, el siguiente build ya no lo incluye. El contenido de demostración lleva una marca en todos los lugares donde aparece, de modo que siempre puedes distinguirlo de tu propio trabajo. Las historias de demostración El sitio recibe dos historias, en su mismo idioma: Título en inglés Título en español Pasos Qué muestra The Allegorical Woman La mujer alegórica 10 Una historia sencilla, centrada en una sola imagen Colonial Landscapes Paisajes coloniales 22 Una historia más larga, con capítulos, paneles y fuentes primarias La mujer alegórica Esta historia, de Natalie Cobo, recorre los detalles de Aspecto Symbólico del Mundo Hispánico , un grabado de 1761 de Laureano Atlas que se conserva en la Princeton University Library. En ella se ven: pasos que recorren una sola imagen y amplían un detalle a la vez una imagen IIIF (se pronuncia \"triple i efe\") que viene directamente de la institución que la conserva, la Princeton University Library, y no de content.telar.org un paso que cambia a una segunda imagen, el frontispicio del Leviatán de Hobbes paneles de capa, con un paso que tiene también una segunda capa enlaces a entradas del glosario desde el texto de la historia El primer paso enlaza a la hoja de cálculo de la historia en Google Sheets, para que puedas comparar cada fila con el paso que produce. Paisajes coloniales Esta historia es una selección de Paisajes Coloniales , un proyecto de Santiago Muñoz, Adelaida Ávila y María Alejandra Orduz Avella. Gira en torno a una pintura de 1614 de la Sabana de Bogotá, hecha para un pleito y conservada en el Archivo General de Indias, en Sevilla. La historia tiene: un primer paso que presenta el proyecto original y enlaza a él, y un último paso que repite ese enlace cuatro capítulos, cada uno con una tarjeta de título al comienzo: \"Una pintura de la Sabana\", \"Pueblos para los indios\", \"De terrazas a pastizales\" y \"Un paisaje dividido\" un panel de capa en casi todos los demás pasos, con el texto más extenso, los carruseles de imágenes y los recuadros que remiten a las fuentes primarias Cada fuente primaria es una entrada del glosario: al hacer clic en su recuadro, la entrada se abre en un panel. Muchas de esas entradas terminan con un enlace Ver documento completo , que lleva a la página del objeto correspondiente; dos paneles enlazan a documentos de la misma manera. La pintura y los nueve documentos vienen de content.telar.org como imágenes IIIF. Cinco de los documentos tienen varias páginas, y en la página de objeto de cada uno se puede pasar de una a otra. El glosario incluye además varias palabras clave y una persona, así que la página del glosario agrupa sus entradas en Palabras clave , Fuentes primarias y Personas y entidades . Activar o desactivar el contenido de demostración Un solo ajuste de _config.yml controla el contenido de demostración. En un sitio de Telar nuevo viene activado. Para cambiarlo: Abre _config.yml Busca la sección story_interface Pon include_demo_content en true para mostrar las historias de demostración, o en false para ocultarlas: story_interface: include_demo_content: true Haz commit del cambio GitHub Actions vuelve a construir el sitio, y el cambio se ve en cuanto termina. Si construyes el sitio en tu computador, ejecuta python3 scripts/csv_to_json.py y python3 scripts/generate_collections.py (o python3 scripts/build_local_site.py , que ejecuta ambos) y después Jekyll. Consulta Desarrollo local . Conserva las demostraciones mientras aprendes Mientras escribes tu primera historia, vale la pena tener a mano las historias de demostración, al lado de la tuya. Desactívalas antes de compartir el sitio. Dónde aparece el contenido de demostración El contenido de demostración aparece en los mismos lugares que tu propio contenido, con una marca: Dónde Qué ves Página de inicio Las historias de demostración, antes de las tuyas, con una insignia DEMO Tarjeta de inicio de la historia Una etiqueta Contenido de demostración encima del título de la historia Paneles de capa Una insignia Contenido de demostración junto al título del panel Página de objetos Los objetos de demostración, después de los tuyos, con una insignia DEMO Página de un objeto Una etiqueta Contenido de demostración encima del título del objeto Página del glosario Una insignia DEMO junto a cada entrada de demostración Página de una entrada del glosario Una insignia Contenido de demostración junto al título de la entrada En un sitio en inglés, las marcas dicen DEMO y Demo content . Idioma El contenido de demostración sigue el idioma del sitio, que se define con telar_language en _config.yml : Tu configuración Contenido de demostración que recibes telar_language: \"en\" Historias, objetos y glosario en inglés telar_language: \"es\" Historias, objetos y glosario en español Con cualquier otro valor se recibe el contenido de demostración en inglés. Si cambias el idioma del sitio, el siguiente build descarga el contenido de demostración en el idioma nuevo. El contenido de demostración y tu propio contenido El contenido de demostración se suma al tuyo durante el build y nunca reemplaza nada de lo que tienes: Tu contenido Contenido de demostración Dónde está En tu repositorio Se descarga en cada build ; no se guarda en tu repositorio ¿Se puede editar? Sí No Marca Ninguna Insignia DEMO o etiqueta Contenido de demostración Mismo identificador de objeto que uno tuyo — Se conserva tu objeto y se omite el de demostración Mismo identificador de entrada del glosario que uno tuyo — Se conserva tu entrada y se omite la de demostración Todos los identificadores de los objetos y de las entradas del glosario de demostración empiezan con demo- , así que normalmente no coinciden con los tuyos. Usar las demostraciones como modelo Las historias de demostración están escritas en el mismo formato de hoja de cálculo que tus historias. Los archivos de origen están publicados en el repositorio de contenido de demostración en GitHub, en demos/v1.8.0/es/ y demos/v1.8.0/en/ : demo-project.csv : las filas de las dos historias en la hoja del proyecto demo-objects.csv : los objetos mujer-alegorica.csv y paisajes.csv ( allegorical-woman.csv y colonial-landscapes.csv en inglés): los pasos de las historias glosario.csv ( glossary.csv en inglés): las entradas del glosario, con la columna tipo ( kind en inglés), que indica cuáles entradas son fuentes y cuáles son personas texts/stories/ : los archivos Markdown de los paneles de Paisajes coloniales Para ver cómo se refleja en la página la estructura de una historia, compara las filas de paisajes.csv con la historia en tu sitio: las filas con la columna objeto vacía son las tarjetas de título de los capítulos. Solución de problemas No aparecen las historias de demostración Si activaste el contenido de demostración y las historias no aparecen: Verifica que include_demo_content: true esté dentro de la sección story_interface de _config.yml Comprueba en la pestaña Actions de tu repositorio que el build haya terminado Abre el registro del build , despliega el paso Convert CSV to JSON y busca las líneas que empiezan con Telar Demo Content Fetcher Haz una recarga forzada de la página (Ctrl+Shift+R en Windows o Linux, Cmd+Shift+R en Mac) No se pudo descargar el contenido de demostración Si content.telar.org no responde o la descarga falla, el registro del build avisa que el sitio se construirá sin las demostraciones, y el build continúa. Tu contenido se publica como siempre, sin las historias de demostración. El siguiente build vuelve a intentarlo. El contenido de demostración está en otro idioma Revisa telar_language en _config.yml . Debe ser \"en\" o \"es\" ; con cualquier otro valor se recibe el contenido de demostración en inglés." + }, + "/guia/funciones/glosario/": { + "ids": [ + "consejos", + "crear-un-glosario", + "dónde-funcionan-los-enlaces", + "enlazar-a-términos-del-glosario", + "experiencia-de-visualización", + "forma-abreviada", + "formato-csv-recomendado", + "formato-markdown-legado", + "glosario", + "texto-personalizado", + "véase-también" + ], + "selectors": { + "h1": [ + "Glosario" + ], + "h2": [ + "Crear un glosario", + "Enlazar a términos del glosario", + "Experiencia de visualización", + "Consejos", + "Véase también" + ], + "h3": [ + "Formato CSV (recomendado)", + "Formato Markdown (legado)", + "Forma abreviada", + "Texto personalizado", + "Dónde funcionan los enlaces" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "term_id,title,definition,related_terms loom,Telar,Un dispositivo usado para tejer telas y tapices.,warp warp,Urdimbre,\"El conjunto de hilos longitudinales en un telar, a través de los cuales se teje la trama.\",loom encomienda,Encomienda,\"Un sistema de trabajo en la América colonial española, que otorgaba a los colonizadores autoridad sobre trabajadores indígenas.\",", + "--- term_id: periodo-colonial title: \"Periodo Colonial\" related_terms: - encomienda - virreinato --- El Periodo Colonial en las Américas comenzó con la llegada de los colonizadores europeos a finales del siglo XV...", + "El [[loom]] era central para la producción textil.", + "El [[loom|dispositivo de tejido]] era central para la producción textil." + ], + "table": [], + "blockquote": [ + "Si existen tanto un glosario CSV como archivos Markdown de glosario, Telar usa el CSV e ignora los archivos Markdown (con una advertencia en el build).", + "Los términos se reconocen sin distinción de mayúsculas. [[loom]], [[Loom]] y [[LOOM]] resuelven a la misma entrada, así que puedes escribir un término como mejor se lea —por ejemplo, una sigla como [[IIIF]]." + ], + "img": [ + [ + "/images/glossary-page.png", + "Página del glosario mostrando listado alfabético de términos" + ] + ] + }, + "text": "Glosario El glosario te permite definir términos que las personas pueden consultar sin abandonar una historia. Cuando alguien hace clic en un enlace de glosario, la definición aparece en un panel lateral deslizante. Para autoría visual, consulta cómo crear y enlazar entradas . Crear un glosario Hay dos formas de definir términos de glosario. El formato CSV (nuevo en v0.8.0) es el recomendado para la mayoría de los proyectos. Formato CSV (recomendado) Agrega un archivo glossary.csv a telar-content/spreadsheets/ : term_id,title,definition,related_terms loom,Telar,Un dispositivo usado para tejer telas y tapices.,warp warp,Urdimbre,\"El conjunto de hilos longitudinales en un telar, a través de los cuales se teje la trama.\",loom encomienda,Encomienda,\"Un sistema de trabajo en la América colonial española, que otorgaba a los colonizadores autoridad sobre trabajadores indígenas.\", Cada fila define un término: term_id — Identificador único usado en los enlaces (minúsculas, se recomiendan guiones) title — Nombre visible en el panel del glosario definition — El texto de la definición (admite Markdown básico) related_terms — Otros valores term_id , separados por | , para referencias cruzadas El formato CSV funciona con Google Sheets — la pestaña de glosario se obtiene automáticamente como los demás CSV. Los nombres de columnas pueden estar en inglés o español (consulta Referencia CSV: Glosario para los alias). Formato Markdown (legado) Archivos Markdown individuales en telar-content/texts/glossary/ : --- term_id: periodo-colonial title: \"Periodo Colonial\" related_terms: - encomienda - virreinato --- El Periodo Colonial en las Américas comenzó con la llegada de los colonizadores europeos a finales del siglo XV... Cada archivo define un término. El cuerpo del archivo es la definición. En estos archivos, related_terms se escribe como una lista YAML, no con el | que separa los valores en el CSV: Telar no reinterpreta el frontmatter de un archivo Markdown. Si existen tanto un glosario CSV como archivos Markdown de glosario, Telar usa el CSV e ignora los archivos Markdown (con una advertencia en el build ). Enlazar a términos del glosario Enlaza a términos del glosario desde el texto y los paneles de tus historias usando sintaxis de doble corchete: Forma abreviada Usa el title del término como texto del enlace: El [[loom]] era central para la producción textil. Se renderiza como: El Telar era central para la producción textil. Texto personalizado Usa un separador de barra vertical para especificar un texto de enlace diferente: El [[loom|dispositivo de tejido]] era central para la producción textil. Se renderiza como: El dispositivo de tejido era central para la producción textil. Dónde funcionan los enlaces Los autoenlaces de glosario funcionan en: Texto del paso — la respuesta de un paso (el texto principal que se desplaza) Contenido de paneles de historias (los tres métodos: texto directo, Markdown pegado, archivos) Páginas personalizadas La pregunta del paso es un encabezado, así que los enlaces de glosario ahí se dejan como texto plano a propósito. Si un term_id no se encuentra en el glosario, un ícono de advertencia y un mensaje de error aparecen en la salida del build y en el panel de la historia. Los términos se reconocen sin distinción de mayúsculas. [[loom]] , [[Loom]] y [[LOOM]] resuelven a la misma entrada, así que puedes escribir un término como mejor se lea —por ejemplo, una sigla como [[IIIF]] . Experiencia de visualización Cuando alguien hace clic en un enlace de glosario: Un panel deslizante aparece desde el lado de la pantalla El panel muestra el título y la definición del término Los términos relacionados aparecen como enlaces adicionales en la parte inferior La persona puede navegar entre términos relacionados sin cerrar el panel Al hacer clic fuera del panel o presionar el botón de cierre, el panel se descarta La persona permanece en el paso actual de la historia durante todo el proceso — las consultas al glosario no interrumpen el flujo narrativo. Consejos Mantén las definiciones concisas — Las personas las leen en medio de una historia. Una o dos oraciones es lo ideal; guarda las explicaciones extensas para los paneles de las historias. Usa términos relacionados para construir una red de referencias cruzadas. Esto ayuda a las personas a explorar conceptos conectados. Prefija los términos de demostración con demo- (ej., demo-loom ) para etiquetarlos como contenido de demostración. Prueba tus enlaces construyendo el sitio y revisando las advertencias de glosario en la salida del build . Véase también Referencia CSV: Glosario — Referencia completa de columnas del CSV de glosario y alias Historias y Paneles — Dónde se usan los enlaces de glosario Guía de Sintaxis Markdown — Formato para definiciones" + }, + "/guia/personalizacion/": { + "ids": [ + "cambio-rápido-de-tema", + "estilos-avanzados", + "guide-title", + "personalización", + "temas" + ], + "selectors": { + "h1": [ + "Personalización" + ], + "h2": [ + "Personalización", + "Temas", + "Estilos avanzados", + "Cambio rápido de tema" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "telar_theme: \"santa-barbara\" # Opciones: paisajes, neogranadina, santa-barbara, austin" + ], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Personalización Personalización Haz Telar tuyo con temas, estilos personalizados y modificaciones de diseño. Temas Telar incluye 4 temas predeterminados que puedes cambiar con una sola línea en _config.yml : Paisajes Coloniales (predeterminado): Tonos tierra con terracota y oliva Neogranadina : Burdeos colonial y dorado Santa Barbara : Turquesa y coral modernos Austin : Naranja quemado y azul pizarra Conoce sobre temas Estilos avanzados Para una personalización más profunda, además de los temas, puedes modificar variables CSS, diseños y estilos de componentes. Guía de estilos avanzados Cambio rápido de tema Cambia tu tema en _config.yml : telar_theme: \"santa-barbara\" # Opciones: paisajes, neogranadina, santa-barbara, austin Confirma el cambio y tu sitio se reconstruirá automáticamente con el nuevo tema." + }, + "/docs/your-data/csv-stories/": { + "ids": [ + "alt_text--texto_alt", + "answer--respuesta", + "answers-are-plain-prose", + "choosing-the-right-method", + "clip_start-clip_end--inicio_clip-fin_clip", + "column-aliases", + "columns", + "data-entry-tips", + "example", + "field-notes", + "layer-buttons", + "layer-content", + "loop--bucle", + "object--objeto", + "page--pagina", + "question--pregunta", + "see-also", + "step--paso", + "story-columns", + "story-csv-story-idcsv", + "the-answer-limit", + "validation", + "x-y-zoom" + ], + "selectors": { + "h1": [ + "Story Columns" + ], + "h2": [ + "Story CSV (story-{id}.csv)", + "Answers Are Plain Prose", + "Data Entry Tips", + "Validation", + "See Also" + ], + "h3": [ + "Columns", + "Example", + "Field Notes", + "Choosing the Right Method", + "Column Aliases", + "The Answer Limit" + ], + "h4": [ + "step / paso", + "object / objeto", + "x, y, zoom", + "page / pagina", + "question / pregunta", + "answer / respuesta", + "Layer buttons", + "Layer content", + "clip_start, clip_end / inicio_clip, fin_clip", + "loop / bucle", + "alt_text / texto_alt" + ], + "h5": [], + "h6": [], + "pre": [ + "step,object,x,y,zoom,question,answer,layer1_button,layer1_content,layer2_button,layer2_content 1,textile-001,0.5,0.5,1.0,What is this?,A colonial textile fragment,\"\",This fragment shows **advanced weaving techniques** from the colonial period.,\"Learn More\",colonial-textiles/step1-layer2.md 2,textile-001,0.3,0.7,0.5,What is this pattern?,An interlocking warp design,\"\",colonial-textiles/step2-layer1.md,\"\",colonial-textiles/step2-layer2.md", + "paso,objeto,x,y,zoom,pregunta,respuesta,boton_capa1,contenido_capa1,boton_capa2,contenido_capa2 1,textil-001,0.5,0.5,1.0,¿Qué es esto?,Un fragmento de textil colonial,\"\",Este fragmento muestra **técnicas avanzadas de tejido** del período colonial.,\"Saber más\",textiles-coloniales/paso1-capa2.md 2,textil-001,0.3,0.7,0.5,¿Qué es este patrón?,Un diseño de urdimbre entrelazada,\"\",textiles-coloniales/paso2-capa1.md,\"\",textiles-coloniales/paso2-capa2.md" + ], + "table": [ + "English Spanish Required Description step paso Yes Step number (1, 2, 3...) object objeto Yes Object ID from objects.csv x x Yes Horizontal coordinate (0-1 normalized) y y Yes Vertical coordinate (0-1 normalized) zoom zoom Yes Zoom level: 1 shows the whole object; higher values move closer page pagina No Which page of a multi-page object this step shows (the first page is 1) question pregunta Yes Heading displayed in story panel answer respuesta Yes Brief answer text layer1_button boton_capa1 No Custom button text (empty = \"Learn more\") layer1_content contenido_capa1 No Panel content: inline text or path to .md file layer2_button boton_capa2 No Custom button text (empty = \"Go deeper\") layer2_content contenido_capa2 No Panel content: inline text or path to .md file layer3_button boton_capa3 No Custom button text (empty = default) layer3_content contenido_capa3 No Panel content: inline text or path to .md file clip_start inicio_clip No Clip start time in seconds (e.g., 12.5) clip_end fin_clip No Clip end time in seconds loop bucle No Loop playback (true, false, yes, no). Defaults to false alt_text texto_alt No Per-step alt text for accessibility", + "layer1_content This textile shows advanced weaving techniques from the colonial period.", + "Environment How to create line breaks Google Sheets Press Ctrl+Enter (Windows/Linux) or Option+Enter (macOS) CSV files Use actual newlines inside quoted text Alternative Use HTML: <br> for line breaks, <p>...</p> for paragraphs", + "layer1_content colonial-textiles/step1-layer1.md", + "Scenario Recommended method Short explanation (1-2 paragraphs) Method 1: Enter directly Panel with custom title or widgets Method 2: Paste, or Method 3: File reference Content with widgets (accordion, tabs, carousel) Method 3: File reference Same content used in multiple places Method 3: File reference Quick edits without leaving the spreadsheet Method 1 or 2", + "Normalized Accepts step step, paso object object, objeto, object_id x x y y zoom zoom page page, pagina, página question question, pregunta answer answer, respuesta layer1_button layer1_button, boton_capa1 layer1_content layer1_content, contenido_capa1, layer1_file, archivo_capa1 layer2_button layer2_button, boton_capa2 layer2_content layer2_content, contenido_capa2, layer2_file, archivo_capa2 layer3_button layer3_button, boton_capa3 layer3_content layer3_content, contenido_capa3, layer3_file, archivo_capa3 clip_start clip_start, inicio_clip clip_end clip_end, fin_clip loop loop, bucle alt_text alt_text, texto_alt" + ], + "blockquote": [ + "If you copy and paste from Microsoft Word, Google Docs, or similar applications, formatting will not be preserved. Write in markdown syntax instead — see the Markdown Syntax Guide.", + "The layer_file / archivo_capa column names are backward-compatible aliases from before v0.6.3. The preferred names are layer_content / contenido_capa." + ], + "img": [] + }, + "text": "Story Columns Complete reference for story CSV columns with bilingual column name support. For column normalization and dual header support, see Project Columns . Story CSV (story-{id}.csv) Defines step-by-step navigation and panel content for each story. Location : telar-content/spreadsheets/{story_id}.csv Naming : If story_id specified in project.csv: use that name (e.g., colonial-textiles.csv ) If story_id omitted: use story-{order}.csv (e.g., story-1.csv , story-2.csv ) Columns English Spanish Required Description step paso Yes Step number (1, 2, 3...) object objeto Yes Object ID from objects.csv x x Yes Horizontal coordinate (0-1 normalized) y y Yes Vertical coordinate (0-1 normalized) zoom zoom Yes Zoom level: 1 shows the whole object; higher values move closer page pagina No Which page of a multi-page object this step shows (the first page is 1) question pregunta Yes Heading displayed in story panel answer respuesta Yes Brief answer text layer1_button boton_capa1 No Custom button text (empty = \"Learn more\") layer1_content contenido_capa1 No Panel content: inline text or path to .md file layer2_button boton_capa2 No Custom button text (empty = \"Go deeper\") layer2_content contenido_capa2 No Panel content: inline text or path to .md file layer3_button boton_capa3 No Custom button text (empty = default) layer3_content contenido_capa3 No Panel content: inline text or path to .md file clip_start inicio_clip No Clip start time in seconds (e.g., 12.5 ) clip_end fin_clip No Clip end time in seconds loop bucle No Loop playback ( true , false , yes , no ). Defaults to false alt_text texto_alt No Per-step alt text for accessibility Example English (with inline content): step,object,x,y,zoom,question,answer,layer1_button,layer1_content,layer2_button,layer2_content 1,textile-001,0.5,0.5,1.0,What is this?,A colonial textile fragment,\"\",This fragment shows **advanced weaving techniques** from the colonial period.,\"Learn More\",colonial-textiles/step1-layer2.md 2,textile-001,0.3,0.7,0.5,What is this pattern?,An interlocking warp design,\"\",colonial-textiles/step2-layer1.md,\"\",colonial-textiles/step2-layer2.md Spanish (with inline content): paso,objeto,x,y,zoom,pregunta,respuesta,boton_capa1,contenido_capa1,boton_capa2,contenido_capa2 1,textil-001,0.5,0.5,1.0,¿Qué es esto?,Un fragmento de textil colonial,\"\",Este fragmento muestra **técnicas avanzadas de tejido** del período colonial.,\"Saber más\",textiles-coloniales/paso1-capa2.md 2,textil-001,0.3,0.7,0.5,¿Qué es este patrón?,Un diseño de urdimbre entrelazada,\"\",textiles-coloniales/paso2-capa1.md,\"\",textiles-coloniales/paso2-capa2.md Step 1 uses inline content for layer 1, while step 2 uses a file reference. Both approaches work and can be mixed freely. Field Notes step / paso Must be sequential integers starting at 1 No gaps allowed (1, 2, 3... not 1, 3, 5) Determines navigation order object / objeto Must match an object_id from objects.csv Leave empty to create a title card — a text-only step with no associated object. See Stories & Panels . Updated in v1.1.0 Multiple steps can reference the same object x, y, zoom x and y run from 0 to 1 x : 0 = left edge, 1 = right edge, 0.5 = center y : 0 = top edge, 1 = bottom edge, 0.5 = center zoom : 1 shows the whole object beside the text card. Higher values move closer, with the point at x and y in the middle of the view: 2 shows about half as much of the object, 4 about a quarter. Below 1, down to 0.1, the whole object is shown smaller, with space around it. At 1 or below, the object is centered and x and y do not move it. If the point is near an edge of the object, the view does not go past that edge, so the point may not be in the middle. Use the coordinate picker on object pages to find values page / pagina Only for objects with more than one page: a PDF hosted on your site, or an external IIIF manifest with several images Pages are numbered from 1 x , y and zoom frame the page this column selects, not the document as a whole Leave it empty for single-image objects A value that is not a whole number of 1 or more is ignored, and the build says which step it came from See PDF Documents and External IIIF Images question / pregunta Displayed as the heading of the text card No markdown processing (plain text only) Brief question or statement Recommended: 3-8 words answer / respuesta Brief answer shown in the text card, below the question Plain prose only (see Answers Are Plain Prose ) Cut above 18 lines (see The Answer Limit ) Recommended: 1-2 sentences Layer buttons Empty string = default button text Custom text: any string (e.g., \"See details\", \"Ver detalles\") If content exists but button empty: shows default text If content empty: button hidden Layer content Panel content can be provided in three ways: Method 1: Enter text directly Type your panel text directly in the spreadsheet cell. This is the simplest approach for short panels. layer1_content This textile shows advanced weaving techniques from the colonial period. To create paragraph breaks within a cell: Environment How to create line breaks Google Sheets Press Ctrl+Enter (Windows/Linux) or Option+Enter (macOS) CSV files Use actual newlines inside quoted text Alternative Use HTML: <br> for line breaks, <p>...</p> for paragraphs You can use basic formatting: **bold** , *italic* , [link text](url) , and glossary links ( [[term-id]] ). Method 2: Paste markdown text Paste text written in a plain text editor. This supports the full range of formatting features including headings, widgets (accordion, carousel, tabs), images with size controls, and a custom panel title using YAML frontmatter. If you copy and paste from Microsoft Word, Google Docs, or similar applications, formatting will not be preserved. Write in markdown syntax instead — see the Markdown Syntax Guide . Method 3: Reference a markdown file Point to a markdown file in your repository. This is recommended for complex panels, especially those with widgets or content you want to reuse. layer1_content colonial-textiles/step1-layer1.md Save markdown files in telar-content/texts/stories/ . In your spreadsheet, enter just the filename — or if you've organized files into subfolders, include the subfolder name. How Telar decides : If what you enter ends in .md and the file exists, it loads the file. Otherwise, it treats the value as content. clip_start, clip_end / inicio_clip, fin_clip New in v1.0.0 Start and end times in seconds for video and audio objects (e.g., 12.5 , 65 ) Ignored for image objects Leave both empty to play the full media file You can set clip values visually in the Compositor loop / bucle New in v1.0.0 Controls whether video or audio playback loops Accepts true , false , yes , no , sí Defaults to false if left empty Ignored for image objects alt_text / texto_alt New in v1.0.0 Per-step alt text for accessibility Falls back to the object's alt text (from objects.csv ), then to the object's title Use this to provide context specific to what the step is showing — e.g., a zoomed-in detail that differs from the object's general description Choosing the Right Method Scenario Recommended method Short explanation (1-2 paragraphs) Method 1: Enter directly Panel with custom title or widgets Method 2: Paste, or Method 3: File reference Content with widgets (accordion, tabs, carousel) Method 3: File reference Same content used in multiple places Method 3: File reference Quick edits without leaving the spreadsheet Method 1 or 2 Column Aliases Normalized Accepts step step , paso object object , objeto , object_id x x y y zoom zoom page page , pagina , página question question , pregunta answer answer , respuesta layer1_button layer1_button , boton_capa1 layer1_content layer1_content , contenido_capa1 , layer1_file , archivo_capa1 layer2_button layer2_button , boton_capa2 layer2_content layer2_content , contenido_capa2 , layer2_file , archivo_capa2 layer3_button layer3_button , boton_capa3 layer3_content layer3_content , contenido_capa3 , layer3_file , archivo_capa3 clip_start clip_start , inicio_clip clip_end clip_end , fin_clip loop loop , bucle alt_text alt_text , texto_alt The layer_file / archivo_capa column names are backward-compatible aliases from before v0.6.3. The preferred names are layer_content / contenido_capa . Answers Are Plain Prose The answer field appears in the text card beside your object, under the question. On desktop that card is a fixed size and does not scroll, so anything past its edge never reaches your readers. To keep answers readable, Telar reduces every answer to plain prose during the build, and reports each change it makes in the build log. These work in an answer and appear as you wrote them: Paragraph breaks Bold and italics Inline links Glossary links , written [[term]] Inline LaTeX Code spans Telar keeps the words of these but drops the formatting: Lists , both bulleted and numbered Headings Blockquotes Telar removes these completely, along with any text inside them: Images and embeds , both markdown image syntax and the img , iframe , video , audio , embed and object elements Footnotes , the reference and the note alike Tables Code blocks Horizontal rules The Answer Limit An answer has to fit on its card without scrolling. Telar therefore measures it in lines rather than words, counting 53 characters to a line and two lines for each paragraph after the first. An answer can have up to 18 lines and five paragraphs: roughly 150 words in a single paragraph, fewer when you split it into paragraphs. An answer longer than 15 lines is set in slightly smaller type. Telar cuts any answer over the limit and reports the cut in the build log. The cut falls on a word boundary, never inside a link, a glossary term, a code span or a LaTeX expression, so your markup never breaks. Text past the cut does not appear on your site. Aim for 1-2 sentences. When you need more room, move the detail into a layer panel: panels take the full markdown of the Markdown Syntax Reference , footnotes, tables, images and widgets included. Data Entry Tips Coordinates : Use the coordinate picker on object pages to find x, y, zoom values and copy them directly into your CSV. Markdown in fields : layer_content : Full markdown supported question : No markdown processing (plain text only) answer : plain prose, inline formatting only, cut above 18 lines Panel content : Use file references (Method 3) for complex content with widgets. Use inline text (Method 1) for short panels. Validation Telar validates story CSV data during build: Errors (build fails) : Missing required columns Invalid step sequence (gaps, duplicates) Missing layer markdown files Invalid coordinate values (outside 0-1 range) Warnings (build succeeds) : Unrecognized column names (ignored) Object ID not found in objects.csv Formatting removed from a step's answer, or an answer cut at 18 lines Check build output for validation messages. See Also Project Columns — Project CSV column reference Object Columns — Objects CSV column reference Glossary Columns — Glossary CSV columns Stories & Panels — How to structure stories Markdown Syntax — Formatting for panel content" + }, + "/docs/getting-started/local-dev/": { + "ids": [ + "build-the-first-preview", + "clone-and-setup", + "configure-site-settings", + "configure-the-site", + "core-commands", + "daily-development-workflow", + "deploying-to-github-pages", + "get-your-own-source-copy", + "install-and-run-telar-locally", + "install-dependencies", + "install-ruby-and-bundler", + "installation", + "local-development", + "next-steps", + "overview", + "prerequisites", + "step-1-gather-your-images", + "step-2-write-your-narrative-text", + "step-3-catalog-your-objects", + "step-4-preview-your-objects", + "step-5-find-coordinates-for-story-moments", + "step-6-build-your-story", + "step-7-add-glossary-terms-optional", + "step-by-step-workflow" + ], + "selectors": { + "h1": [ + "Install and run Telar locally" + ], + "h2": [ + "Prerequisites", + "Get your own source copy", + "Install dependencies", + "Configure the site", + "Build the first preview" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "ruby -v bundle -v python3 --version node --version npm --version git --version", + "git clone https://github.com/YOUR-ACCOUNT/YOUR-REPOSITORY.git cd YOUR-REPOSITORY", + "python3 -m venv .venv source .venv/bin/activate python3 -m pip install -r requirements.txt bundle install npm ci", + "google_sheets: enabled: false", + "python3 scripts/build_local_site.py" + ], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Install and run Telar locally Build an exhibition from CSV and Markdown files on your computer. This route gives you control of the source files, build process and hosting. You can also preview a site whose content comes from Google Sheets. Prerequisites The current Telar build uses Ruby 3.2, Python 3.12 and Node.js 22. Use Ruby 3.2 or newer within the 3.x series and Bundler. The template's dependency files are the authority for the version you are building. Check the programs in the terminal: ruby -v bundle -v python3 --version node --version npm --version git --version Install missing programs with the package manager or version manager you use on your operating system. On macOS, the system Ruby may be too old; check the version rather than assuming the preinstalled program is suitable. Get your own source copy Create a repository from the Telar template , then clone your repository. Replace the example address with your own: git clone https://github.com/YOUR-ACCOUNT/YOUR-REPOSITORY.git cd YOUR-REPOSITORY You can also download a source archive if you do not plan to use Git. Keep a separate backup of your editable files. Install dependencies Use a Python virtual environment so the project's packages remain separate from other Python work: python3 -m venv .venv source .venv/bin/activate python3 -m pip install -r requirements.txt bundle install npm ci On Windows, activate with .venv\\Scripts\\Activate.ps1 in PowerShell. Reopen and activate the same environment when returning to the project. If dependency installation fails, check the program versions before changing the lockfiles. For audio objects, install the system tool audiowaveform to prepare waveform data. Clip boundaries are applied in the browser; the audio-processing script does not extract separate clip files. Configure the site Edit the author-facing section of _config.yml : title, description, author, language and theme. If editing CSV files directly, set: google_sheets: enabled: false Keep the template's build settings below the author-facing section. For a site served at a domain root, baseurl is empty; for a project site it is the repository path. Build the first preview From the repository root, with the environment active: python3 scripts/build_local_site.py The helper processes content, audio and IIIF tiles, bundles JavaScript and starts Jekyll on port 4001. Open the address with the configured base path, for example http://127.0.0.1:4001/my-exhibition/ . Stop the server with Ctrl+C. Use --port 4003 if another site already uses 4001. Check your work: the homepage and a sample object should load. Next, edit the content files ." + }, + "/docs/developers/styling/": { + "ids": [ + "add-custom-interactions", + "advanced-styling", + "animation", + "best-practices", + "body-text", + "cascade-layers", + "component-styling", + "css-variables", + "custom-css", + "heading-styles", + "javascript-customization", + "layered-panels", + "layout-customization", + "method-1-add-to-telarscss", + "method-2-create-custom-stylesheet", + "modify-includes", + "modify-layouts", + "modify-story-behavior", + "next-steps", + "object-cards", + "performance-optimization", + "responsive-design", + "story-steps", + "typography-customization" + ], + "selectors": { + "h1": [ + "Advanced Styling" + ], + "h2": [ + "Custom CSS", + "CSS Variables", + "Layout Customization", + "Component Styling", + "Responsive Design", + "Cascade Layers", + "JavaScript Customization", + "Typography Customization", + "Animation", + "Best Practices", + "Performance Optimization", + "Next Steps" + ], + "h3": [ + "Method 1: Add to telar.scss", + "Method 2: Create Custom Stylesheet", + "Modify Layouts", + "Modify Includes", + "Story Steps", + "Layered Panels", + "Object Cards", + "Modify Story Behavior", + "Add Custom Interactions", + "Heading Styles", + "Body Text" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "// Your custom styles .story-step { padding: 2rem; border-left: 3px solid var(--primary-color); } .object-card { box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); transition: transform 0.2s; &:hover { transform: translateY(-5px); } }", + "/* Custom overrides */ .site-header { background: linear-gradient(to right, #667eea 0%, #764ba2 100%); } .story-answer { font-style: italic; color: #666; }", + "<link rel=\"stylesheet\" href=\"/assets/css/custom.css\">", + ":root { // Colors --primary-color: #c7522a; --secondary-color: #5f7351; --accent-color: #8b7355; --text-color: #333; --heading-color: #1a1a1a; // Typography --font-headings: 'Playfair Display', Georgia, serif; --font-body: 'Source Sans Pro', sans-serif; // Spacing --spacing-unit: 1rem; --story-step-padding: 3rem; // Borders --border-radius: 4px; --border-color: #e0e0e0; }", + ".story-step { padding: var(--story-step-padding); margin-bottom: 2rem; .story-question { font-size: 2rem; margin-bottom: 1rem; } .story-answer { font-size: 1.125rem; line-height: 1.6; } }", + ".layer-panel { background: white; padding: 2rem; box-shadow: 0 10px 40px rgba(0, 0, 0, 0.1); .layer-title { border-bottom: 2px solid var(--primary-color); padding-bottom: 0.5rem; margin-bottom: 1.5rem; } }", + ".object-card { border: 1px solid var(--border-color); border-radius: var(--border-radius); overflow: hidden; .object-thumbnail { aspect-ratio: 4 / 3; object-fit: cover; } .object-info { padding: 1rem; } }", + "// Vertical layout: narrow width OR portrait-ish aspect ratio. // Note: the story layout itself fills the viewport rather than // splitting into columns; these overrides target your own containers. @media (max-width: 1024px), (max-aspect-ratio: 3 / 4) { .my-block { flex-direction: column; } } // Wide (desktop) layout @media (min-width: 1025px) { .my-block { max-width: 600px; } }", + "reset, third-party, telar-base, telar-bootstrap-overrides, telar-components, telar-overrides", + "npm run build:js", + "document.addEventListener('DOMContentLoaded', function() { // Add smooth scroll to all internal links document.querySelectorAll('a[href^=\"#\"]').forEach(anchor => { anchor.addEventListener('click', function (e) { e.preventDefault(); const target = document.querySelector(this.getAttribute('href')); target.scrollIntoView({ behavior: 'smooth' }); }); }); // Add animation to object cards on scroll const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { entry.target.classList.add('fade-in'); } }); }); document.querySelectorAll('.object-card').forEach(card => { observer.observe(card); }); });", + "h1, h2, h3, h4, h5, h6 { font-family: var(--font-headings); color: var(--heading-color); font-weight: 400; line-height: 1.2; } // Custom heading sizes h1 { font-size: 2.5rem; } h2 { font-size: 2rem; } h3 { font-size: 1.75rem; }", + "body { font-family: var(--font-body); font-size: 1rem; line-height: 1.6; color: var(--text-color); } p { margin-bottom: 1rem; }", + "// Fade in animation @keyframes fadeIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .fade-in { animation: fadeIn 0.6s ease-out; } // Object card hover .object-card { transition: all 0.3s ease; &:hover { transform: translateY(-5px); box-shadow: 0 10px 30px rgba(0, 0, 0, 0.15); } }", + "// Use will-change for animations .animated-element { will-change: transform; } // Optimize images .object-thumbnail { image-rendering: -webkit-optimize-contrast; } // Hardware acceleration .smooth-scroll { transform: translateZ(0); }" + ], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Advanced Styling Go beyond themes with custom CSS, layout modifications, and component styling. Custom CSS Method 1: Add to telar.scss Edit assets/css/telar.scss to add custom styles: // Your custom styles .story-step { padding: 2rem; border-left: 3px solid var(--primary-color); } .object-card { box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); transition: transform 0.2s; &:hover { transform: translateY(-5px); } } Method 2: Create Custom Stylesheet Create assets/css/custom.css : /* Custom overrides */ .site-header { background: linear-gradient(to right, #667eea 0%, #764ba2 100%); } .story-answer { font-style: italic; color: #666; } Then include it in your _layouts/default.html : <link rel=\"stylesheet\" href=\"/assets/css/custom.css\"> CSS Variables Telar uses CSS custom properties that you can override: :root { // Colors --primary-color: #c7522a; --secondary-color: #5f7351; --accent-color: #8b7355; --text-color: #333; --heading-color: #1a1a1a; // Typography --font-headings: 'Playfair Display', Georgia, serif; --font-body: 'Source Sans Pro', sans-serif; // Spacing --spacing-unit: 1rem; --story-step-padding: 3rem; // Borders --border-radius: 4px; --border-color: #e0e0e0; } Override these in your custom CSS to make global changes. Layout Customization Modify Layouts Edit files in _layouts/ directory: default.html : Base template (header, footer, nav) story.html : Scrollytelling page object.html : Object detail page glossary.html : Glossary term page home.html : Homepage layout Modify Includes Edit reusable components in _includes/ : header.html : Site header and navigation footer.html : Site footer story-step.html : Individual story step object-card.html : Object grid card Component Styling Story Steps .story-step { padding: var(--story-step-padding); margin-bottom: 2rem; .story-question { font-size: 2rem; margin-bottom: 1rem; } .story-answer { font-size: 1.125rem; line-height: 1.6; } } Layered Panels .layer-panel { background: white; padding: 2rem; box-shadow: 0 10px 40px rgba(0, 0, 0, 0.1); .layer-title { border-bottom: 2px solid var(--primary-color); padding-bottom: 0.5rem; margin-bottom: 1.5rem; } } Object Cards .object-card { border: 1px solid var(--border-color); border-radius: var(--border-radius); overflow: hidden; .object-thumbnail { aspect-ratio: 4 / 3; object-fit: cover; } .object-info { padding: 1rem; } } Responsive Design Telar's story layout switches to its vertical layout when the viewport is narrower than 1024px or has an aspect ratio narrower than 3:4 (see Mobile Optimization for details). When you add responsive rules to your own components, match those breakpoints so your styles change in step with the layout: // Vertical layout: narrow width OR portrait-ish aspect ratio. // Note: the story layout itself fills the viewport rather than // splitting into columns; these overrides target your own containers. @media (max-width: 1024px), (max-aspect-ratio: 3 / 4) { .my-block { flex-direction: column; } } // Wide (desktop) layout @media (min-width: 1025px) { .my-block { max-width: 600px; } } Cascade Layers As of v1.4.0, Telar's styles are organized into CSS cascade layers, declared in this order: reset, third-party, telar-base, telar-bootstrap-overrides, telar-components, telar-overrides Bootstrap loads into the third-party layer and Telar's own styles load into the later layers, so Telar reliably overrides Bootstrap without needing !important . This also helps your own customizations: unlayered CSS always wins over layered CSS , regardless of selector specificity. Any plain CSS rule you add outside of these layers takes precedence over Telar's styles, so you can usually override appearance without reaching for !important . If a custom rule unexpectedly fails to apply, check that it isn't being pulled into one of Telar's layers. JavaScript Customization Modify Story Behavior The story engine's source lives in assets/js/telar-story/ (one module per concern — scroll engine, navigation, card pool, panels) and is bundled into assets/js/telar-story.js , which is the file pages actually load. To change story behavior, edit the modules and rebuild the bundle: npm run build:js Never edit assets/js/telar-story.js directly — it is generated, and the next rebuild overwrites it. The directory map in assets/js/README.md describes what each module does and where to make which kind of change. Add Custom Interactions Create assets/js/custom.js : document.addEventListener('DOMContentLoaded', function() { // Add smooth scroll to all internal links document.querySelectorAll('a[href^=\"#\"]').forEach(anchor => { anchor.addEventListener('click', function (e) { e.preventDefault(); const target = document.querySelector(this.getAttribute('href')); target.scrollIntoView({ behavior: 'smooth' }); }); }); // Add animation to object cards on scroll const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { entry.target.classList.add('fade-in'); } }); }); document.querySelectorAll('.object-card').forEach(card => { observer.observe(card); }); }); Typography Customization Heading Styles h1, h2, h3, h4, h5, h6 { font-family: var(--font-headings); color: var(--heading-color); font-weight: 400; line-height: 1.2; } // Custom heading sizes h1 { font-size: 2.5rem; } h2 { font-size: 2rem; } h3 { font-size: 1.75rem; } Body Text body { font-family: var(--font-body); font-size: 1rem; line-height: 1.6; color: var(--text-color); } p { margin-bottom: 1rem; } Animation Add subtle animations: // Fade in animation @keyframes fadeIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .fade-in { animation: fadeIn 0.6s ease-out; } // Object card hover .object-card { transition: all 0.3s ease; &:hover { transform: translateY(-5px); box-shadow: 0 10px 30px rgba(0, 0, 0, 0.15); } } Best Practices Use CSS variables for values that repeat Test responsive on multiple screen sizes Maintain accessibility (contrast, keyboard navigation) Keep it performant (avoid heavy animations, large images) Comment your code for future reference Test in multiple browsers (Chrome, Firefox, Safari) Performance Optimization // Use will-change for animations .animated-element { will-change: transform; } // Optimize images .object-thumbnail { image-rendering: -webkit-optimize-contrast; } // Hardware acceleration .smooth-scroll { transform: translateZ(0); } Next Steps Learn about Themes View Example Sites Explore Jekyll Layouts" + }, + "/docs/the-compositor/story-editor/": { + "ids": [ + "embed-preservation", + "formatting-toolbar", + "iiif-viewer", + "image-insertion", + "keyboard-shortcuts", + "layer-editing", + "media-editor-overview-docs-the-compositor-story-editor", + "media-framing-docs-the-compositor-story-editor", + "media-panel-editor-docs-the-compositor-story-editor", + "media-panels-docs-the-compositor-story-editor", + "object-picker", + "rich-paste", + "see-also", + "step-management", + "story-editor", + "title-card" + ], + "selectors": { + "h1": [ + "Story Editor" + ], + "h2": [ + "Title card", + "IIIF viewer", + "Step management", + "Layer editing", + "See also" + ], + "h3": [ + "Formatting toolbar", + "Keyboard shortcuts", + "Image insertion", + "Rich paste", + "Embed preservation" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [ + "Panning and zooming explore the object. Capture position records the framing for the selected step. Capture again if you change the view you want to preserve." + ], + "img": [ + [ + "/assets/manual/tutorials/en-editor-overview.jpg", + "The story outline, step card and khipu viewer in the Compositor." + ], + [ + "/assets/manual/tutorials/en-framing-poster.jpg", + "The khipu view changes, then Capture position confirms that it has been captured." + ], + [ + "/assets/manual/tutorials/en-panels-poster.jpg", + "A story step opens its contextual panel alongside the main card." + ], + [ + "/assets/manual/tutorials/en-panel-editor.jpg", + "A contextual panel with its text editor and formatting toolbar open." + ] + ] + }, + "text": "Story Editor Open a story from Stories to write its questions, brief answers and optional panels. The editor combines the story outline, editable text and the view visitors will see. The sidebar uses a square for the title card, circles for steps and an upward triangle for the final step. A step's first panel branches from it; a second panel branches from the first. The outline is on the left, the step text in the centre and the object on the right. Capture position records the view for the selected step. Open full-size screenshot ↗ Title card Select the title card at the top of the outline. Click its title, subtitle or byline, or the corresponding editing icon, to change the field. Your edits are saved as you work. IIIF viewer Select an image step and choose Change object to pick its source. Pan and zoom to the detail you want visitors to see. To save the view: Select the step. Pan and zoom to the intended framing. Choose Capture position . Check the Captured confirmation. Move to the title card or another step, then return and check the saved view. Panning and zooming explore the object. Capture position records the framing for the selected step. Capture again if you change the view you want to preserve. Adjust the view, choose Capture position and look for Captured. The same khipu is shown throughout. Play steps Open full-size screenshot ↗ Download GIF The guides indicate the frame and the centre of the view. The text-limit guide helps you see how much of the brief answer fits in the public card. Step management + Add step creates a step. If you are offered the previous object, you can keep it or choose another. Change object selects a different source for the current step. Drag a step by its handle to change its position. Use the step's delete control and read the confirmation before removing it. Add section title inserts a heading that groups parts of the story. Write a question and a brief answer on each step card. Click the text or its editing icon. The answer field accepts Markdown; click outside it to review the rendered text. Video and audio steps have media controls in place of the image viewer. See Video and Audio . Layer editing Choose + Add panel on a step card, or open an existing panel using its button. Edit the panel's title and content in place using the text or editing icons. The first panel can offer a button to a second panel. Keep the main answer concise. Use panels for the context, evidence and nuance a reader may choose to explore. Open the step's panel to develop its context. This example uses the existing map-and-painting story. Play steps Open full-size screenshot ↗ Download GIF Formatting toolbar When editing panel content, use the formatting controls or write Markdown directly. Review the rendered panel after editing. See Markdown Syntax and Rich Content for supported content. Click the panel text to enter editing mode. The toolbar offers formatting, links, images and other content controls. Open full-size screenshot ↗ Keyboard shortcuts Standard editing shortcuts depend on the focused field. Keep the text editor focused when applying a formatting command. Use the toolbar when you are unsure which command is available. Image insertion Use the panel editor's image controls to add an image, and supply the information the dialog requests. A panel image is part of the explanation; the step's main source is selected separately through Change object . Rich paste When bringing text from another application, check the resulting formatting, links and spacing in the rendered panel before publishing. Embed preservation For embedded media and interactive content inside panels, follow Rich Content and Widgets . Check the actual published result as well as the editor preview. See also Use an IIIF object in a story Start and navigation Video and Audio Publishing" + }, + "/guia/configurar/validador-de-configuracion/": { + "ids": [ + "cv-input", + "cv-lines", + "cv-results", + "cv-validate", + "qué-se-verifica", + "validador-de-configuración", + "véase-también" + ], + "selectors": { + "h1": [ + "Validador de Configuración" + ], + "h2": [ + "Qué se verifica", + "Véase también" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Validador de Configuración Pega tu _config.yml de Telar a continuación para verificar errores comunes de configuración. El validador revisa la sintaxis YAML, los campos obligatorios y los ajustes específicos de Telar. Tu configuración nunca se envía a ningún servidor — todo se ejecuta en tu navegador. 1 Validar Qué se verifica Sintaxis YAML — Detecta errores de análisis, tabulaciones y comillas sin cerrar, con números de línea Campos obligatorios — Verifica que title , url y baseurl estén presentes y con el formato correcto Ajustes de Telar — Valida nombres de tema, códigos de idioma, URLs de Google Sheets y formato de baseurl Advertencias útiles — Notas sobre ajustes predeterminados, errores comunes en GitHub Pages y la sección de solo lectura Véase también Referencia de Configuración — Lista completa de todos los ajustes de _config.yml Generador y editor de configuración — Genera o edita un archivo _config.yml Primeros pasos — Elige tu método de configuración" + }, + "/docs/developers/embedding-system/": { + "ids": [ + "architecture-overview", + "banner-creation", + "banner-styling", + "browser-compatibility", + "button-creation", + "content-security-policy", + "cross-origin-resource-sharing-cors", + "css-modifications", + "custom-embed-styles", + "customizing-embed-behavior", + "deep-links-and-embed-state", + "detecting-embed-mode-in-custom-code", + "dimension-normalization", + "dimension-presets", + "embed-code-generation", + "embed-mode-detection", + "embed-mode-navigation", + "embed-mode-styles", + "embedding-system-reference", + "future-enhancements", + "iframe-considerations", + "iframe-sandbox-attribute", + "javascript-implementation", + "known-limitations", + "language-files", + "language-string-injection", + "local-testing", + "modifying-banner-appearance", + "multilingual-support", + "navigation-modes", + "navigation-system", + "production-testing", + "related-documentation", + "security-considerations", + "share--embed-panel", + "supported-browsers", + "testing-embed-mode", + "url-cleaning", + "url-parameter", + "view-full-site-banner" + ], + "selectors": { + "h1": [ + "Embedding System Reference" + ], + "h2": [ + "Architecture Overview", + "Embed Mode Detection", + "CSS Modifications", + "Navigation System", + "\"View Full Site\" Banner", + "Share & Embed Panel", + "Multilingual Support", + "Browser Compatibility", + "Testing Embed Mode", + "Security Considerations", + "Customizing Embed Behavior", + "Known Limitations", + "Deep links and embed state", + "Related Documentation" + ], + "h3": [ + "URL Parameter", + "JavaScript Implementation", + "Embed Mode Styles", + "Embed Mode Navigation", + "Navigation Modes", + "Button Creation", + "Banner Creation", + "Banner Styling", + "Embed Code Generation", + "URL Cleaning", + "Dimension Presets", + "Dimension Normalization", + "Language String Injection", + "Language Files", + "Supported Browsers", + "Iframe Considerations", + "Local Testing", + "Production Testing", + "Content Security Policy", + "Cross-Origin Resource Sharing (CORS)", + "iframe Sandbox Attribute", + "Custom Embed Styles", + "Detecting Embed Mode in Custom Code", + "Modifying Banner Appearance" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "https://yoursite.com/stories/story-1/?embed=true", + "(function() { 'use strict'; // Parse URL parameters const params = new URLSearchParams(window.location.search); const embedParam = params.get('embed'); // Initialize embed state window.telarEmbed = { enabled: embedParam === 'true' }; // Wait for DOM ready if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } function init() { if (!window.telarEmbed.enabled) return; // Apply embed mode body class document.body.classList.add('embed-mode'); // Create \"View full site\" banner createEmbedBanner(); } })();", + "body.embed-mode { // Hide navigation chrome .home-button { display: none !important; } .share-button { display: none !important; } // Hide loading text in step counter .viewer-overlay { display: none; } }", + "body.embed-mode { // Navigation buttons render at every width in embed mode, // centred over the narrative column with intrinsic width .mobile-nav { position: fixed; left: 20%; right: auto; bottom: max(8%, 1.5rem); transform: translateX(-50%); } }", + "// Same boundary as the site-wide vertical layout // (_responsive.scss $telar-vertical-min-width, 1024px) @media (max-width: $telar-vertical-min-width) { body.embed-mode .mobile-nav { // Right-edge vertical stack right: 1rem; left: auto; bottom: 50%; transform: translateY(50%); flex-direction: column; } }", + "function createEmbedBanner() { // Get language strings from Jekyll const lang = window.telarLang?.embedBanner || { text: 'This story is part of {site_name}...', link: 'View the complete site' }; const siteName = getSiteName(); const siteUrl = getFullSiteUrl(); const banner = document.createElement('div'); banner.className = 'embed-banner'; banner.innerHTML = ` <span class=\"embed-banner-text\"> ${lang.text.replace('{site_name}', siteName)} </span> <a href=\"${siteUrl}\" target=\"_blank\" class=\"embed-banner-link\"> ${lang.link} </a> <button class=\"embed-banner-close\" aria-label=\"Close banner\">×</button> `; document.body.appendChild(banner); // Handle dismissal banner.querySelector('.embed-banner-close').addEventListener('click', () => { banner.remove(); }); }", + ".embed-banner { position: fixed; top: 1rem; left: 1rem; z-index: 1000; background: rgba(255, 255, 255, 0.5); backdrop-filter: blur(8px); padding: 0.75rem 1rem; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); max-width: 380px; display: flex; align-items: center; gap: 0.75rem; }", + "function generateEmbedCode() { if (!currentStoryUrl) return ''; const width = embedWidthInput.value.trim() || '100%'; const height = embedHeightInput.value.trim() || '800'; // Normalize dimensions const widthAttr = normalizeDimension(width); const heightAttr = normalizeDimension(height); // Build embed URL const embedUrl = addEmbedParameter(currentStoryUrl); // Get story title const storyTitle = getStoryTitle(); // Generate iframe code const iframeCode = `<iframe src=\"${embedUrl}\" width=\"${widthAttr}\" height=\"${heightAttr}\" title=\"${storyTitle}\" frameborder=\"0\"> </iframe>`; return iframeCode; }", + "function addEmbedParameter(url) { try { const urlObj = new URL(url); // Clear existing query params and hash urlObj.search = ''; urlObj.hash = ''; // Add clean embed parameter urlObj.searchParams.set('embed', 'true'); return urlObj.toString(); } catch (e) { // Fallback if URL parsing fails const cleanUrl = url.split(/[?#]/)[0]; return cleanUrl + '?embed=true'; } }", + "const presets = { canvas: { width: '100%', height: '800' }, moodle: { width: '100%', height: '700' }, wordpress: { width: '100%', height: '600' }, squarespace: { width: '100%', height: '600' }, wix: { width: '100%', height: '550' }, mobile: { width: '375', height: '500' }, fixed: { width: '800', height: '600' } };", + "function normalizeDimension(value) { // If just a number, add 'px' if (/^\\d+$/.test(value)) { return value + 'px'; } return value; }", + "<script> window.telarLang = window.telarLang || {}; window.telarLang.embedBanner = { text: null, link: null }; </script>", + "embed_banner: text: \"This story is part of {site_name}, a digital storytelling site built with <a href='https://github.com/UCSB-AMPLab/telar' target='_blank'>Telar</a>.\" link: \"View the complete site\"", + "embed_banner: text: \"Esta historia forma parte de {site_name}, un sitio web creado con <a href='https://github.com/UCSB-AMPLab/telar' target='_blank'>Telar</a> para contar historias.\" link: \"Ver el sitio completo\"", + "<!DOCTYPE html> <html> <head> <title>Embed Test

Canvas LMS (100% × 800px)

", + "Content-Security-Policy: frame-ancestors 'self' https://canvas.instructure.com https://*.wordpress.com", + " ", + "body.embed-mode { // Your custom embed styles .custom-element { // Hide in embed mode display: none; } }", + "if (window.telarEmbed?.enabled) { // Custom behavior for embed mode console.log('Running in embed mode'); }", + ".embed-banner { // Custom position top: 2rem; left: 2rem; // Custom colors background: rgba(0, 0, 0, 0.8); color: white; }" + ], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Embedding System Reference Technical reference for Telar's iframe embedding system. Architecture Overview Telar's embedding system allows stories to be displayed inside iframes on external websites and LMS platforms. The system is designed around these principles: Fixed-height containers: Desktop: 100vh fixed layout with side-by-side columns Mobile/Embed: Fixed heights (60vh viewer, 40vh narrative panel) Content scrolls inside fixed containers No dynamic resizing: Unlike systems that use postMessage to resize iframes Users choose appropriate fixed height via dimension presets Telar's design philosophy relies on internal scrolling, not variable heights Universal compatibility: Works in any iframe-supporting platform No special integration required No LMS-specific APIs or dependencies Embed Mode Detection URL Parameter Embed mode activates via the ?embed=true URL parameter: https://yoursite.com/stories/story-1/?embed=true Parameter handling: Detected in assets/js/embed.js Stored in window.telarEmbed.enabled Available to all JavaScript modules JavaScript Implementation File: assets/js/embed.js (function() { 'use strict'; // Parse URL parameters const params = new URLSearchParams(window.location.search); const embedParam = params.get('embed'); // Initialize embed state window.telarEmbed = { enabled: embedParam === 'true' }; // Wait for DOM ready if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } function init() { if (!window.telarEmbed.enabled) return; // Apply embed mode body class document.body.classList.add('embed-mode'); // Create \"View full site\" banner createEmbedBanner(); } })(); Timing: Runs before other scripts Uses DOMContentLoaded to ensure body element exists Body class applied before navigation initialization CSS Modifications Embed Mode Styles File: assets/css/telar.scss The body.embed-mode selector applies embed-specific styles: Hidden elements: body.embed-mode { // Hide navigation chrome .home-button { display: none !important; } .share-button { display: none !important; } // Hide loading text in step counter .viewer-overlay { display: none; } } Button visibility and placement: body.embed-mode { // Navigation buttons render at every width in embed mode, // centred over the narrative column with intrinsic width .mobile-nav { position: fixed; left: 20%; right: auto; bottom: max(8%, 1.5rem); transform: translateX(-50%); } } Narrow embeds (at or below the vertical-layout boundary): // Same boundary as the site-wide vertical layout // (_responsive.scss $telar-vertical-min-width, 1024px) @media (max-width: $telar-vertical-min-width) { body.embed-mode .mobile-nav { // Right-edge vertical stack right: 1rem; left: auto; bottom: 50%; transform: translateY(50%); flex-direction: column; } } Navigation System Embed Mode Navigation File: assets/js/telar-story/main.js Embedded stories always use button navigation, at every width — iframe scroll events do not propagate reliably, so the scroll engine is never engaged inside an embed. Outside embeds, navigation mode follows the layout mode: horizontal layout uses the Lenis-driven scroll engine, and vertical layout (viewports at or below 1024px wide, or narrower than 3:4) uses the same prev/next buttons. The boundary is declared once in _sass/_responsive.scss ( $telar-vertical-min-width ) and read at runtime by layout-mode.js . Navigation Modes Embeds (all widths): button navigation; wide embeds center the buttons over the narrative column, narrow embeds stack them on the right edge Non-embed, horizontal layout: Lenis-driven scroll engine Non-embed, vertical layout: the same button navigation Keyboard navigation works in every mode Button Creation File: assets/js/telar-story/navigation.js initializeButtonNavigation() builds the .mobile-nav container with its .mobile-prev and .mobile-next buttons and wires them to step navigation; it returns early if the container already exists. \"View Full Site\" Banner Banner Creation File: assets/js/embed.js function createEmbedBanner() { // Get language strings from Jekyll const lang = window.telarLang?.embedBanner || { text: 'This story is part of {site_name}...', link: 'View the complete site' }; const siteName = getSiteName(); const siteUrl = getFullSiteUrl(); const banner = document.createElement('div'); banner.className = 'embed-banner'; banner.innerHTML = ` ${lang.text.replace('{site_name}', siteName)} ${lang.link} `; document.body.appendChild(banner); // Handle dismissal banner.querySelector('.embed-banner-close').addEventListener('click', () => { banner.remove(); }); } Banner Styling .embed-banner { position: fixed; top: 1rem; left: 1rem; z-index: 1000; background: rgba(255, 255, 255, 0.5); backdrop-filter: blur(8px); padding: 0.75rem 1rem; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); max-width: 380px; display: flex; align-items: center; gap: 0.75rem; } Behavior: Appears on every page load in embed mode Dismissible via X button No sessionStorage persistence Links to site homepage (not story page) Share & Embed Panel Embed Code Generation File: assets/js/share-panel.js function generateEmbedCode() { if (!currentStoryUrl) return ''; const width = embedWidthInput.value.trim() || '100%'; const height = embedHeightInput.value.trim() || '800'; // Normalize dimensions const widthAttr = normalizeDimension(width); const heightAttr = normalizeDimension(height); // Build embed URL const embedUrl = addEmbedParameter(currentStoryUrl); // Get story title const storyTitle = getStoryTitle(); // Generate iframe code const iframeCode = ``; return iframeCode; } URL Cleaning function addEmbedParameter(url) { try { const urlObj = new URL(url); // Clear existing query params and hash urlObj.search = ''; urlObj.hash = ''; // Add clean embed parameter urlObj.searchParams.set('embed', 'true'); return urlObj.toString(); } catch (e) { // Fallback if URL parsing fails const cleanUrl = url.split(/[?#]/)[0]; return cleanUrl + '?embed=true'; } } Purpose: Removes viewer state (hash coordinates) Removes any existing query parameters Adds clean ?embed=true parameter Ensures embed always starts at step 1 Dimension Presets File: assets/js/share-panel.js const presets = { canvas: { width: '100%', height: '800' }, moodle: { width: '100%', height: '700' }, wordpress: { width: '100%', height: '600' }, squarespace: { width: '100%', height: '600' }, wix: { width: '100%', height: '550' }, mobile: { width: '375', height: '500' }, fixed: { width: '800', height: '600' } }; Dimension Normalization function normalizeDimension(value) { // If just a number, add 'px' if (/^\\d+$/.test(value)) { return value + 'px'; } return value; } Accepted formats: 100% → 100% 800px → 800px 800 → 800px (auto-adds px) Multilingual Support Language String Injection File: _layouts/story.html Process: Jekyll processes liquid tags during build Language strings injected into window.telarLang JavaScript reads from window.telarLang.embedBanner Fallback to English if language data missing Language Files English: _data/languages/en.yml embed_banner: text: \"This story is part of {site_name}, a digital storytelling site built with Telar.\" link: \"View the complete site\" Spanish: _data/languages/es.yml embed_banner: text: \"Esta historia forma parte de {site_name}, un sitio web creado con Telar para contar historias.\" link: \"Ver el sitio completo\" Browser Compatibility Supported Browsers Telar embed mode works in all modern browsers: Chrome/Edge 90+ Firefox 88+ Safari 14+ Mobile browsers (iOS Safari, Chrome Android) Iframe Considerations Same-origin vs cross-origin: Telar embeds are cross-origin (different domain than host) No localStorage/sessionStorage access across origins No parent frame access (intentional security) The IIIF viewer renders correctly inside the embed Embed structure: Telar story (iframe 1) OpenSeadragon viewer (rendered inline, not a nested iframe) IIIF tiles (image sources) Performance: Modern browsers handle nested iframes efficiently IIIF tile loading not affected by iframe context Bootstrap modals (glossary, share panel) work correctly Testing Embed Mode Local Testing Test file structure: Embed Test

Canvas LMS (100% × 800px)

Test checklist: Embed banner appears and is dismissible Navigation buttons work (click and keyboard) IIIF viewer loads and zooms correctly Share panel opens and functions Glossary links work Bootstrap modals display properly Home and share buttons are hidden Responsive behavior at different widths Production Testing Deploy site to production (GitHub Pages or custom domain) Test embed code in actual Canvas LMS course Verify on multiple browsers (Chrome, Firefox, Safari) Test on mobile devices (iOS, Android) Check console for JavaScript errors Security Considerations Content Security Policy If your site uses CSP headers, ensure iframes are allowed: Content-Security-Policy: frame-ancestors 'self' https://canvas.instructure.com https://*.wordpress.com GitHub Pages: No custom headers by default Embeddable on any site Consider this when hosting sensitive content Cross-Origin Resource Sharing (CORS) IIIF tiles: Served from same origin as story No CORS issues External IIIF manifests: Require CORS headers from source institution Most IIIF providers include proper CORS headers Test external manifests before embedding iframe Sandbox Attribute Not recommended for Telar: Why: Breaks JavaScript functionality Prevents IIIF viewer from working Disables navigation and modals Use standard iframe without sandbox attribute Customizing Embed Behavior Custom Embed Styles Add custom CSS for embed mode in assets/css/telar.scss : body.embed-mode { // Your custom embed styles .custom-element { // Hide in embed mode display: none; } } Detecting Embed Mode in Custom Code if (window.telarEmbed?.enabled) { // Custom behavior for embed mode console.log('Running in embed mode'); } Modifying Banner Appearance Override banner styles in telar.scss : .embed-banner { // Custom position top: 2rem; left: 2rem; // Custom colors background: rgba(0, 0, 0, 0.8); color: white; } Known Limitations No dynamic height resizing: Fixed heights only No Canvas lti.frameResize postMessage Intentional: Telar uses internal scrolling Deep links and embed state The Share panel's generated embed code removes the current query and fragment and adds the embed parameter, so that code opens the story from its introduction. It does not preserve a reader's temporary pan and zoom. The story engine also supports step and panel fragments: #s3 opens the third content step, #s3l1 opens its first panel, and #s3l1g1 targets its first glossary link. These are distinct from the unsupported ?section= parameter. Test a manually constructed embedded link in the host environment before sharing it. Related Documentation Educator Guide : Embedding in LMS & Websites Development Setup : Local Development GitHub Actions : Automated Build Workflow" + }, + "/guia/desarrolladores/motor-de-historias/": { + "ids": [ + "apilamiento", + "cómo-se-avanza-entre-pasos", + "diseños", + "las-partes-de-una-historia", + "lo-que-se-mantiene-cargado", + "vocabulario-del-motor-de-historias" + ], + "selectors": { + "h1": [ + "Vocabulario del motor de historias" + ], + "h2": [ + "Las partes de una historia", + "Cómo se avanza entre pasos", + "Diseños", + "Lo que se mantiene cargado", + "Apilamiento" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Vocabulario del motor de historias El motor de historias es el código que hace funcionar la página de una historia: ubica las tarjetas y el objeto, mueve la historia entre pasos y decide qué se mantiene cargado. Está en assets/js/telar-story/ y se empaqueta en assets/js/telar-story.js . Esta página define los términos que usan el código, sus comentarios y esta documentación para las partes de una historia y para sus movimientos, de modo que cada término nombre una sola cosa. Las clases de CSS, los atributos data-* y el ajuste max_viewer_cards conservan sus nombres anteriores, porque los sitios y el Compositor los leen. Cuando un nombre anterior no coincide con un término de esta página, la entrada lo indica. Las partes de una historia Una historia se arma con estas partes: Paso : una fila de la hoja de cálculo de una historia, con una pregunta, una respuesta y un encuadre. Escena : los pasos consecutivos sobre un mismo objeto. En pantalla, una escena es una lámina con su pila de tarjetas encima, y sube sobre la escena anterior como una sola pieza. Si la historia vuelve más adelante a un objeto, empieza una escena nueva. Lámina : la parte de la escena que ocupa toda la ventana y muestra el objeto. Una lámina de imagen tiene un visor; una de video o de audio tiene un reproductor. Pila de tarjetas : las tarjetas de texto de una escena, que pasan una tras otra a medida que la historia avanza de un paso a otro, en lugar de quedar apiladas. El nombre viene de un diseño anterior, en el que las tarjetas se apilaban. Cada tarjeta pertenece a su escena y se mueve con la lámina de esa escena. El módulo que la construye es card-pool.js . Tarjeta de texto : la tarjeta con la pregunta y la respuesta de un paso. Tarjeta de título : un paso sin objeto, que puede ser el título de la historia o el encabezado de una sección. Visor : el visor de imágenes (OpenSeadragon) de una lámina de imagen. Reproductor : el reproductor de video o de audio de una lámina de medios. Cómo se avanza entre pasos Estos términos describen lo que pasa cuando quien lee avanza de un paso al siguiente: Encuadre : los valores x , y y zoom que se fijaron para un paso al escribir la historia, en cualquier tipo de lámina. Cámara : lo que muestra el visor de una lámina de imagen en un momento dado. Solo las imágenes tienen cámara. Movimiento : una transición entre dos pasos. El desplazamiento, la cámara, las tarjetas y las láminas comparten una misma duración, que crece con el recorrido de la cámara: max(1.2, min(3, 1.33 × S)) segundos, donde S es la longitud del recorrido de zoom y panorámica de la cámara entre los dos encuadres ( camera-travel.js ). Un movimiento sin recorrido de cámara dura los 1,2 segundos de base, igual que los saltos desde la tabla de contenidos o desde un enlace. El desplazamiento de quien lee : lo que hace quien lee con la rueda del mouse, el panel táctil o el dedo. Arrastre : el estado en el que el desplazamiento de quien lee mueve la historia. La página lleva la clase is-scrubbing . Anclaje : el motor termina un gesto que se detuvo entre dos pasos y lleva la historia al más cercano. Permanencia : la pausa al final de un movimiento, cuando la historia ya llegó al paso. Acomodarse : dicho de las tarjetas, tomar su lugar para un paso. Reposo : el estado de la cámara o del desplazamiento cuando no se mueven. Para hacer pruebas, la duración de los movimientos se puede ajustar con el parámetro de URL ?nav=base,perUnit,maxSeconds . Con ?nav=1.2,0 , todos los movimientos duran los 1,2 segundos de base, sin importar el recorrido de la cámara. Diseños La página de una historia usa uno de estos dos diseños: Diseño horizontal : la tarjeta de texto va al lado de la lámina, como tarjeta lateral, y quien lee avanza con la navegación por desplazamiento. Diseño vertical : quien lee avanza con la navegación por botones, y la tarjeta de texto va debajo de la lámina, como tarjeta inferior, o a su lado, como tarjeta lateral de poca altura. La página usa el diseño vertical cuando la ventana cumple alguna de estas condiciones: Mide 1024 px de ancho o menos. Su relación de aspecto es de 3:4 o más angosta, como la de una tableta en orientación vertical. Mide 480 px de alto o menos. Mide entre 481 px y 632 px de alto y es demasiado angosta para la tarjeta lateral que esa altura requiere. Estas ventanas se generan en tramos de 8 px y se publican en --telar-vertical-short-windows . Los términos para las tarjetas y el espacio que las rodea: Tarjeta lateral : la tarjeta de texto al lado de la lámina en el diseño horizontal. Su ancho depende de la altura de la ventana y se mantiene entre el 37 % y el 52 % del ancho de la ventana: min(0.52W, max(0.37W, min(718, 1544 − 1.6H))) , redondeado al píxel. Tarjeta inferior : la tarjeta debajo de la lámina en el diseño vertical. Tarjeta lateral de poca altura : en el diseño vertical, en una ventana de 480 px de alto o menos (un teléfono en orientación horizontal o una ventana de escritorio así de baja), la tarjeta va al lado de la lámina y el navegador la desplaza. El código la detecta con isPhoneHeightSideCard() , en layout-mode.js . El umbral es --telar-card-landscape-max-height , que conserva su nombre anterior. Tamaño de letra compacto : letra más pequeña y espaciado más ajustado en cualquier ventana de 600 px de alto o menos, sea cual sea su ancho. Franja superior : la franja bajo los controles superiores; las tarjetas se ubican por debajo de ella. Tope de altura : la altura máxima que puede tener una tarjeta lateral. Navegación por botones : los botones de anterior y siguiente mueven la historia un paso a la vez. Funciona en el diseño vertical, en las historias insertadas y, en iOS, en los dos diseños. Sus botones conservan la clase .mobile-nav . Navegación por desplazamiento : el desplazamiento de quien lee mueve la historia. Funciona en el diseño horizontal en todos los sistemas menos iOS. Lo que se mantiene cargado El motor mantiene cargada una cantidad limitada de objetos, para que una historia larga no tenga en memoria todas sus imágenes y reproductores: Grupo de visores : los visores cargados. El tope es max_viewer_cards en _config.yml (8 por defecto, 15 como máximo); al superarlo, se descarga el visor de la lámina más alejada del paso actual. El ajuste indica la cantidad máxima de escenas cuyo visor se mantiene cargado. Grupo de reproductores : los reproductores de medios cargados, con un tope de tres de video y tres de audio, que se descargan de la misma manera. En el motor, \"grupo\" solo se usa en estos dos sentidos. Apilamiento Las tarjetas y la lámina de cada escena usan su propio bloque de valores de z-index , su rango de z-index , para que una escena posterior cubra a una anterior como una sola pieza." + }, + "/guia/tu-contenido/imagenes-autoalojadas/": { + "ids": [ + "agregar-imágenes", + "carga-lenta", + "cómo-encontrar-coordenadas", + "cómo-funciona", + "formatos-compatibles", + "imágenes-autoalojadas", + "la-imagen-no-carga", + "sistema-de-coordenadas", + "solución-de-problemas", + "visualización-de-baja-calidad", + "véase-también" + ], + "selectors": { + "h1": [ + "Imágenes autoalojadas" + ], + "h2": [ + "Agregar imágenes", + "Formatos compatibles", + "Cómo funciona", + "Sistema de coordenadas", + "Solución de problemas", + "Véase también" + ], + "h3": [ + "Cómo encontrar coordenadas", + "La imagen no carga", + "Visualización de baja calidad", + "Carga lenta" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "python3 scripts/generate_iiif.py --base-url http://localhost:4001" + ], + "table": [], + "blockquote": [ + "Telar solo genera teselas para objetos que estén en tu hoja de cálculo y que no tengan una fuente IIIF externa. Esto es automático — solo agrega tus imágenes y se procesarán durante el siguiente build.", + "Las fotos de iPhone funcionan directamente. Las fotos HEIC de iPhone se procesan sin conversión previa. Telar las convierte automáticamente a JPEG durante la generación de teselas, conservando tus archivos originales.", + "Los dibujos SVG se convierten en imagen. Al construir el sitio, Telar convierte cada SVG en una imagen de 4000 píxeles en el lado más largo y genera las teselas a partir de ella. Tu archivo original se conserva, pero el zoom no pasa de esa resolución: un dibujo con detalles muy finos puede verse borroso al ampliarlo al máximo. Si necesitas más detalle, exporta el dibujo a PNG o TIFF en un tamaño mayor y sube ese archivo.", + "Nombres de archivo. Usa IDs simples y descriptivos, sin espacios ni caracteres especiales: textile-001.jpg, ceramic-bowl-blue.jpg", + "Generación rápida de teselas con libvips. Cuando libvips está disponible, Telar lo usa para generar las teselas IIIF: la generación resulta unas 28 veces más rápida que con la biblioteca iiif de Python, a la que recurre automáticamente si libvips no está instalado. Consulta Desarrollo local para instrucciones de instalación.", + "El selector de coordenadas tiene un botón Copy entire row que copia una fila completa con las coordenadas ya incluidas — lista para pegar en tu hoja de cálculo." + ], + "img": [] + }, + "text": "Imágenes autoalojadas Si tienes tus propias imágenes — fotografías, escaneos de documentos, mapas — puedes subirlas directamente a tu sitio Telar. Telar las convierte automáticamente en teselas ampliables de alta resolución para que el público pueda explorar cada detalle. También puedes alojar archivos de audio (MP3, OGG, M4A) en el mismo directorio. Telar detecta automáticamente el tipo de archivo y muestra el reproductor adecuado. Este proceso usa una tecnología llamada IIIF (Marco Internacional de Interoperabilidad de Imágenes) para las imágenes, pero no necesitas entender IIIF para usar archivos autoalojados. Solo sube tus archivos y Telar se encarga del resto. Agregar imágenes Cada imagen debe corresponder a un objeto definido en tu hoja de cálculo. El nombre del archivo (sin la extensión) debe coincidir con el object_id del objeto. Por ejemplo, si tu hoja de cálculo tiene un objeto con object_id = textile-001 , nombra tu archivo de imagen textile-001.jpg . Desde la interfaz web de GitHub: Navega a telar-content/objects/ en tu repositorio Haz clic en Add file > Upload files Arrastra tus imágenes al área de carga Asegúrate de que los nombres coincidan con tus object IDs Confirma los cambios En desarrollo local: Coloca tus imágenes en telar-content/objects/ Genera las teselas IIIF: python3 scripts/generate_iiif.py --base-url http://localhost:4001 Telar solo genera teselas para objetos que estén en tu hoja de cálculo y que no tengan una fuente IIIF externa. Esto es automático — solo agrega tus imágenes y se procesarán durante el siguiente build . Formatos compatibles JPG, PNG, HEIC, WebP, TIFF, GIF, BMP — todos los formatos de imagen comunes funcionan SVG — dibujos vectoriales, mapas y diagramas. Telar los convierte en imágenes al construir el sitio (véase más abajo) PDF — cada página del documento se convierte en una imagen ampliable. Consulta Documentos PDF MP3, OGG, M4A — los archivos de audio también se ponen en telar-content/objects/ No importan mayúsculas o minúsculas: .JPG , .png , .Tiff funcionan Resolución : Mientras más alta, mejor — se recomienda al menos 2000px en el lado más largo para buena calidad de zoom Límites de tamaño : Imágenes individuales hasta 100 MB; mantén el repositorio total bajo 1 GB en GitHub Las fotos de iPhone funcionan directamente. Las fotos HEIC de iPhone se procesan sin conversión previa. Telar las convierte automáticamente a JPEG durante la generación de teselas, conservando tus archivos originales. Los dibujos SVG se convierten en imagen. Al construir el sitio, Telar convierte cada SVG en una imagen de 4000 píxeles en el lado más largo y genera las teselas a partir de ella. Tu archivo original se conserva, pero el zoom no pasa de esa resolución: un dibujo con detalles muy finos puede verse borroso al ampliarlo al máximo. Si necesitas más detalle, exporta el dibujo a PNG o TIFF en un tamaño mayor y sube ese archivo. Nombres de archivo. Usa IDs simples y descriptivos, sin espacios ni caracteres especiales: textile-001.jpg , ceramic-bowl-blue.jpg Cómo funciona Cuando agregas una imagen y construyes tu sitio: Telar crea versiones en teselas a múltiples niveles de zoom Las teselas se guardan en iiif/objects/{object-id}/ Un archivo de manifiesto describe la estructura de la imagen El visor carga teselas progresivamente — solo el área visible al nivel de zoom actual, no la imagen completa Esto permite un zoom fluido incluso en imágenes muy grandes. Generación rápida de teselas con libvips. Cuando libvips está disponible, Telar lo usa para generar las teselas IIIF: la generación resulta unas 28 veces más rápida que con la biblioteca iiif de Python, a la que recurre automáticamente si libvips no está instalado. Consulta Desarrollo local para instrucciones de instalación. Sistema de coordenadas Telar usa coordenadas normalizadas (valores de 0 a 1) para describir posiciones dentro de una imagen: x : Posición horizontal (0 = borde izquierdo, 1 = borde derecho) y : Posición vertical (0 = borde superior, 1 = borde inferior) zoom : Nivel de zoom (1.0 = imagen completa, 2.0 = zoom 2x, etc.) Usas estas coordenadas en los pasos de tu historia para indicarle a Telar dónde hacer zoom en cada imagen. Cómo encontrar coordenadas Cada página de objeto incluye un selector de coordenadas integrado: Navega a cualquier página de objeto en tu sitio Haz clic en el botón Identify coordinates Desplaza y amplía hasta la vista que quieras Copia los valores X, Y y Zoom Pégalos en tu hoja de cálculo de historias o archivo CSV El selector de coordenadas tiene un botón Copy entire row que copia una fila completa con las coordenadas ya incluidas — lista para pegar en tu hoja de cálculo. Solución de problemas La imagen no carga Verifica que el archivo exista en telar-content/objects/ Asegúrate de que el nombre del archivo (sin extensión) coincida con el object_id en tu hoja de cálculo Verifica que la columna source_url del objeto esté vacía (de lo contrario Telar espera una imagen externa) Confirma que se hayan generado las teselas IIIF (revisa que exista iiif/objects/{object-id}/ ) Visualización de baja calidad Usa imágenes de mayor resolución (al menos 2000px en el lado más largo) Las imágenes muy pequeñas no se verán bien al aplicar zoom Carga lenta Optimiza el tamaño de los archivos antes de subirlos (los TIFF grandes se pueden convertir a JPEG de alta calidad) GitHub Pages tiene límites de ancho de banda — para sitios de alto tráfico, considera otro servicio de alojamiento Véase también Imágenes IIIF externas — Usa imágenes de museos y bibliotecas en lugar de subir las tuyas Objetos — Cómo definir objetos en tu hoja de cálculo Columnas de objetos — Referencia completa de columnas de la hoja de cálculo de objetos" + }, + "/docs/customization/": { + "ids": [ + "advanced-styling", + "customization", + "quick-theme-switch", + "themes" + ], + "selectors": { + "h1": [ + "Customization" + ], + "h2": [ + "Themes", + "Advanced Styling", + "Quick Theme Switch" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "telar_theme: \"santa-barbara\" # Options: paisajes, neogranadina, santa-barbara, austin" + ], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Customization Make Telar your own with themes, custom styling, and layout modifications. Themes Telar includes 4 preset themes that you can switch with a single line in _config.yml : Paisajes Coloniales (default): Terracotta and olive Neogranadina : Burgundy and gold Santa Barbara : Teal and coral Austin : Burnt orange and slate blue Learn about Themes Advanced Styling For customization beyond the standard themes, you can modify CSS variables, layouts, and component styles. Advanced Styling Guide Quick Theme Switch Change your theme in _config.yml : telar_theme: \"santa-barbara\" # Options: paisajes, neogranadina, santa-barbara, austin Commit the change and your site will rebuild automatically with the new theme." + }, + "/docs/your-data/": { + "ids": [ + "bilingual-column-support", + "data-files", + "google-sheets", + "your-data" + ], + "selectors": { + "h1": [ + "Your Data" + ], + "h2": [ + "Data files", + "Bilingual column support", + "Google Sheets" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "order,story_id,title,subtitle,byline orden,id_historia,titulo,subtitulo,firma 1,colonial-textiles,Colonial Textiles,Weaving traditions,by Dr. Jane Smith" + ], + "table": [ + "File What it defines Reference project.csv Stories, display order, titles Project Columns objects.csv Object catalog and metadata Object Columns {story-id}.csv Steps, coordinates, panel content Story Columns glossary.csv Glossary terms and definitions Glossary Columns" + ], + "blockquote": [], + "img": [] + }, + "text": "Your Data Telar uses spreadsheet files to define the structure of your exhibition — what stories exist, what objects they contain, where to zoom in each image, and what glossary terms to include. These files are the publication format. Choose how you edit their content: Compositor — edit visually; the editor writes the publication files when you publish Google Sheets — edit a spreadsheet in your browser, and Telar fetches and converts it to CSV files automatically during each build CSV files — edit the files directly in telar-content/spreadsheets/ Choose one source for ongoing authoring. If Google Sheets is enabled, the build fetches it and replaces its local CSV copies. The three manuals explain each workflow. Data files File What it defines Reference project.csv Stories, display order, titles Project Columns objects.csv Object catalog and metadata Object Columns {story-id}.csv Steps, coordinates, panel content Story Columns glossary.csv Glossary terms and definitions Glossary Columns Bilingual column support All spreadsheet files support column names in both English and Spanish. You can use either language, mix them, or include dual headers for bilingual teams: order,story_id,title,subtitle,byline orden,id_historia,titulo,subtitulo,firma 1,colonial-textiles,Colonial Textiles,Weaving traditions,by Dr. Jane Smith Telar automatically detects and skips the second header row. Spanish filenames ( proyecto.csv , objetos.csv ) are also supported. See Project Columns for full details on column normalization. Google Sheets See Google Sheets for setup and workflow." + }, + "/guia/primeros-pasos/revisa-y-perfecciona/": { + "ids": [ + "ajusta-el-encuadre-de-cada-imagen", + "ajusta-las-coordenadas-de-imagen", + "completa-la-exhibición", + "encuadra-revisa-y-publica-desde-sheets", + "haz-historias-privadas-opcional", + "maneja-lo-privado-y-lo-incompleto", + "media-coordinates-guia-primeros-pasos-revisa-y-perfecciona", + "próximos-pasos", + "publica-una-revisión-de-la-hoja", + "revisa-la-historia-y-las-rutas-opcionales", + "revisa-y-perfecciona", + "sigue-construyendo" + ], + "selectors": { + "h1": [ + "Encuadra, revisa y publica desde Sheets" + ], + "h2": [ + "Ajusta el encuadre de cada imagen", + "Revisa la historia y las rutas opcionales", + "Publica una revisión de la hoja", + "Maneja lo privado y lo incompleto", + "Completa la exhibición" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [ + [ + "/assets/manual/tutorials/es-coordinates-poster.jpg", + "Se encuadra el khipu en su página y después se copian X, Y y Zoom desde el panel de coordenadas." + ] + ] + }, + "text": "Encuadra, revisa y publica desde Sheets Usa el primer build para elegir vistas precisas y probar la narrativa. Conserva la hoja como fuente mientras revisas. Ajusta el encuadre de cada imagen Abre la página del objeto correspondiente en el sitio generado. Elige Identificar coordenadas . Selecciona la página si el documento tiene varias. Desplaza y acerca la imagen hasta el detalle del paso. Copia X, Y y Zoom a la fila del paso. Vuelve a generar y visita de nuevo ese paso. En el ejemplo del khipu, encuadra el propio khipu. No uses otra imagen porque ya tengas abierta su herramienta de coordenadas. Encuadra el khipu, baja al panel y copia los valores para Sheets o CSV. Es un ejemplo local construido con Telar. Ver los pasos Ampliar captura ↗ Descargar GIF Revisa la historia y las rutas opcionales Lee las preguntas y respuestas breves en secuencia. Comprueba que la fuente y el encuadre respalden cada observación. Abre todos los paneles, sigue los enlaces del glosario y vuelve a la historia. Revisa cierre, orden de historias y menú. Prueba una ventana estrecha y la navegación con teclado. Usa la guía de pruebas con lectores para revisar con otra persona. Publica una revisión de la hoja Editar la hoja no ejecuta por sí solo el flujo del repositorio. Inicia Build and Deploy desde Actions cuando quieras publicar su versión más reciente. Si falla, abre el registro de ejecución. Confirma la dirección publicada de la hoja y que sigan publicadas las pestañas necesarias. Si carga el sitio, pero no una fuente, revisa el ID y la URL del objeto antes de cambiar otros ajustes. Maneja lo privado y lo incompleto Una historia privada usa la columna private de project y una story_key en la configuración. Lee historias privadas antes de usarla. Una clave no vuelve privadas las imágenes alojadas externamente. Mantén el trabajo incompleto fuera de la lista pública hasta que esté listo. El borrador del Compositor es un proceso del editor; no supongas que marcar una fila como privada la excluye de la publicación. Completa la exhibición Edita la presentación del inicio y las páginas de apoyo, revisa créditos y desactiva el contenido de demostración cuando ya no corresponda. Vuelve a generar y comprueba el resultado público. Guarda juntas las direcciones de la hoja, el repositorio y el sitio. Anota cuál es la fuente de edición para que los colaboradores sepan dónde hacer el próximo cambio." + }, + "/docs/configure/": { + "ids": [ + "configure-your-site", + "in-this-section" + ], + "selectors": { + "h1": [ + "Configure Your Site" + ], + "h2": [ + "In This Section" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Configure Your Site Telar's behavior is controlled through _config.yml , a YAML file in the root of your repository. It sets your site's title, theme, language, Google Sheets connection, and feature toggles. If you used the Google Sheets setup , you already have a working _config.yml . This section helps you understand what's in it and how to change it. In This Section Config Generator and Editor — Build a new _config.yml from scratch or load an existing one to edit Configuration Reference — Complete list of every setting and what it does Config Validator — Paste your _config.yml to check for errors before committing" + }, + "/docs/your-content/widgets/": { + "ids": [ + "accordion", + "available-widgets", + "bibliography", + "carousel", + "comparative-sources", + "examples", + "external-images", + "external-images-1", + "fields", + "historical-timeline", + "image-comparison", + "images-in-widgets", + "local-images", + "scholarly-citations", + "see-also", + "structure", + "structure-1", + "structure-2", + "syntax", + "syntax-1", + "syntax-2", + "syntax-3", + "tabs", + "validation", + "where-widgets-work", + "widget-syntax", + "widgets" + ], + "selectors": { + "h1": [ + "Widgets" + ], + "h2": [ + "Available Widgets", + "Widget Syntax", + "Carousel", + "Tabs", + "Accordion", + "Bibliography", + "Where Widgets Work", + "Images in Widgets", + "Validation", + "Examples", + "See Also" + ], + "h3": [ + "Syntax", + "Fields", + "External Images", + "Syntax", + "Structure", + "Syntax", + "Structure", + "Syntax", + "Structure", + "Local Images", + "External Images", + "Historical Timeline", + "Comparative Sources", + "Image Comparison", + "Scholarly Citations" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + ":::widget_type widget content here :::", + ":::carousel image: story1/map.jpg alt: Historical map of the region caption: Map from 1650 showing colonial boundaries credit: National Archives --- image: story1/document.jpg alt: Colonial document caption: Royal decree establishing the settlement credit: Archivo General de Indias :::", + "image: https://example.org/images/photo.jpg", + ":::tabs ## Spanish Account The royal authorities reported that the revolt began on... Historical records show contradictory accounts... ## Indigenous Perspective Community leaders organized resistance to... Oral traditions describe a coordinated response... ## Modern Analysis Historians now recognize this event as... :::", + ":::accordion ## 1600-1650: Early Colonial Period The Spanish crown established administrative structures across the territory. Indigenous populations were reorganized into settlements... ## 1650-1700: Consolidation Estate systems became entrenched as the colonial economy matured. ## 1700-1750: Reform Era Bourbon reforms challenged existing power structures... :::", + ":::bibliography Cobo Betancourt, J. F. (2024). *The Coming of the Kingdom: The Muisca, Catholic Reform, and Spanish Colonialism in the New Kingdom of Granada*. Cambridge University Press. Cobo, N. (2021). Creating authority and promoting normative behaviour. In T. Duve, J. L. Egío, & C. Birr (Eds.), *The School of Salamanca: A Case of Global Knowledge Production* (pp. 210–244). Brill. Muñoz-Arbeláez, S. (2025). *The New Kingdom of Granada: The Making and Unmaking of Spain's Atlantic Empire*. Duke University Press. :::", + "telar-content/objects/ ├── map.jpg ├── document.jpg └── artifact.jpg", + "image: map.jpg image: document.jpg", + "image: story1/map.jpg", + "image: https://digital-collections.library.edu/iiif/image123.jpg image: https://archive.org/download/item/photo.jpg", + ":::accordion ## 1520-1550: Conquest Spanish forces established control over the territory through a series of military campaigns... ## 1550-1600: Settlement Colonial towns were founded as administrative centers... ## 1600-1680: Consolidation The colonial economy based on mining and agriculture became established... :::", + ":::tabs ## Primary Source \"On the 15th day of August, the viceroy decreed...\" (Colonial Archive, Doc. 234) ## Secondary Analysis Modern historians interpret this decree as evidence of... ## Archaeological Evidence Excavations at the site revealed... :::", + ":::carousel image: before.jpg alt: Site photograph from 1920 caption: The *Plaza Mayor* before restoration credit: Municipal Archive --- image: after.jpg alt: Site photograph from 2020 caption: The *Plaza Mayor* after archaeological restoration credit: National Institute of Anthropology :::", + ":::bibliography Cobo Betancourt, J. F. (2024). *The Coming of the Kingdom*. Cambridge University Press. Muñoz-Arbeláez, S. (2025). *The New Kingdom of Granada*. Duke University Press. :::" + ], + "table": [ + "Widget Purpose Carousel Image slideshow with captions and credits Tabs Switchable content panels for multiple perspectives Accordion Collapsible sections for sequential or hierarchical content Bibliography Scholarly citations with hanging-indent formatting" + ], + "blockquote": [ + "Widgets automatically use contrasting panel colors for visual distinction. Layer 1 widgets appear with Layer 2 styling, and vice versa." + ], + "img": [] + }, + "text": "Widgets Telar includes an interactive widget system for rich content in story panels and custom pages. Widgets let you embed image carousels, tabbed content, and collapsible sections directly in your markdown. Available since v0.4.0. Available Widgets Widget Purpose Carousel Image slideshow with captions and credits Tabs Switchable content panels for multiple perspectives Accordion Collapsible sections for sequential or hierarchical content Bibliography Scholarly citations with hanging-indent formatting Widget Syntax Widgets use CommonMark-style container syntax with triple colons: :::widget_type widget content here ::: Carousel Display multiple images with navigation controls, captions, and credits. Syntax :::carousel image: story1/map.jpg alt: Historical map of the region caption: Map from 1650 showing colonial boundaries credit: National Archives --- image: story1/document.jpg alt: Colonial document caption: Royal decree establishing the settlement credit: Archivo General de Indias ::: Fields image (required) — Path relative to telar-content/objects/ , or a full URL for external images alt (recommended) — Accessibility description caption (optional) — Text displayed below the image; supports markdown (e.g., *italics* ) credit (optional) — Attribution line; supports markdown width and height (optional) — The image's dimensions in pixels. Declare both and Telar sizes the carousel from them without opening the image. Without them, each image is opened during the build to measure it, and an image hosted elsewhere is downloaded every time. Separate carousel items with --- . External Images You can use full URLs for images hosted elsewhere: image: https://example.org/images/photo.jpg When images are hosted elsewhere, declare width and height so the build does not download each one just to measure it. Tabs Organize content into switchable panels — useful for presenting different perspectives, sources, or categories. Syntax :::tabs ## Spanish Account The royal authorities reported that the revolt began on... Historical records show contradictory accounts... ## Indigenous Perspective Community leaders organized resistance to... Oral traditions describe a coordinated response... ## Modern Analysis Historians now recognize this event as... ::: Structure Each ## Header creates a new tab Content between headers becomes the tab body Standard markdown formatting supported within tabs Minimum 2 tabs, maximum 4 tabs Accordion Create collapsible panels for chronological sequences, hierarchical information, or optional details that readers can expand on demand. Syntax :::accordion ## 1600-1650: Early Colonial Period The Spanish crown established administrative structures across the territory. Indigenous populations were reorganized into settlements... ## 1650-1700: Consolidation Estate systems became entrenched as the colonial economy matured. ## 1700-1750: Reform Era Bourbon reforms challenged existing power structures... ::: Structure Each ## Header creates a collapsible panel All panels start collapsed Standard markdown formatting supported within panels Minimum 2 panels, maximum 6 panels Bibliography Format scholarly citations with standard hanging-indent styling. Each citation is separated by a blank line. Available since v1.1.0. Syntax :::bibliography Cobo Betancourt, J. F. (2024). *The Coming of the Kingdom: The Muisca, Catholic Reform, and Spanish Colonialism in the New Kingdom of Granada*. Cambridge University Press. Cobo, N. (2021). Creating authority and promoting normative behaviour. In T. Duve, J. L. Egío, & C. Birr (Eds.), *The School of Salamanca: A Case of Global Knowledge Production* (pp. 210–244). Brill. Muñoz-Arbeláez, S. (2025). *The New Kingdom of Granada: The Making and Unmaking of Spain's Atlantic Empire*. Duke University Press. ::: Structure Each citation is separated by a blank line (double newline) Standard markdown formatting works within entries ( *italics* for titles, **bold** , links) Renders with hanging-indent styling — the first line is flush left, continuation lines are indented An empty bibliography block produces a build warning Where Widgets Work Widgets can be used in: Story panel markdown files — Layer 1, 2, and 3 content Custom pages — Any markdown file in telar-content/texts/pages/ For story panels, the recommended approach is to save widget content in a markdown file (Method 3: file reference) rather than entering it directly in a spreadsheet cell, since the triple-colon syntax is difficult to manage inline. Widgets automatically use contrasting panel colors for visual distinction. Layer 1 widgets appear with Layer 2 styling, and vice versa. Images in Widgets Local Images Place images in telar-content/objects/ and reference them by filename: telar-content/objects/ ├── map.jpg ├── document.jpg └── artifact.jpg image: map.jpg image: document.jpg If your images are in subfolders, include the path relative to telar-content/objects/ : image: story1/map.jpg External Images Use complete URLs for images hosted elsewhere: image: https://digital-collections.library.edu/iiif/image123.jpg image: https://archive.org/download/item/photo.jpg Validation Telar validates widgets during the build process: Errors (build fails): Missing required image field in carousel Too few or too many tabs/accordion panels Empty content sections Warnings (build succeeds): Missing alt text on carousel images (accessibility concern) Image files not found at specified paths Check your build output for widget validation messages. Examples Historical Timeline :::accordion ## 1520-1550: Conquest Spanish forces established control over the territory through a series of military campaigns... ## 1550-1600: Settlement Colonial towns were founded as administrative centers... ## 1600-1680: Consolidation The colonial economy based on mining and agriculture became established... ::: Comparative Sources :::tabs ## Primary Source \"On the 15th day of August, the viceroy decreed...\" (Colonial Archive, Doc. 234) ## Secondary Analysis Modern historians interpret this decree as evidence of... ## Archaeological Evidence Excavations at the site revealed... ::: Image Comparison :::carousel image: before.jpg alt: Site photograph from 1920 caption: The *Plaza Mayor* before restoration credit: Municipal Archive --- image: after.jpg alt: Site photograph from 2020 caption: The *Plaza Mayor* after archaeological restoration credit: National Institute of Anthropology ::: Scholarly Citations :::bibliography Cobo Betancourt, J. F. (2024). *The Coming of the Kingdom*. Cambridge University Press. Muñoz-Arbeláez, S. (2025). *The New Kingdom of Granada*. Duke University Press. ::: See Also Stories & Panels — Using widgets in story panels Custom Pages — Using widgets in standalone pages Markdown Syntax Guide — All formatting options" + }, + "/docs/setup/manual/": { + "ids": [ + "configure-your-site", + "create-your-repository", + "duplicate-the-google-sheets-template", + "enable-github-pages", + "manual-setup", + "next-steps", + "part-1-set-up-all-the-technical-bits", + "publish-your-sheet", + "verify-your-setup" + ], + "selectors": { + "h1": [ + "Manual Setup" + ], + "h2": [ + "Part 1: Set Up All the Technical Bits", + "Next Steps" + ], + "h3": [ + "Create Your Repository", + "Enable GitHub Pages", + "Duplicate the Google Sheets Template", + "Publish Your Sheet", + "Configure Your Site", + "Verify Your Setup" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "title: \"My Exhibition\" description: \"A visual narrative about...\" author: Your Name", + "url: \"https://yourgithubusername.github.io\" baseurl: \"/your-repository-name\"", + "google_sheets: enabled: true published_url: \"https://docs.google.com/...\"", + "telar_theme: \"paisajes\" # Options: paisajes, neogranadina, santa-barbara, austin" + ], + "table": [], + "blockquote": [ + "Simplified in v0.9.0. Previous versions required both a shared URL and a published URL. From v0.9.0, only the published URL is needed. If your _config.yml still has a shared_url line, it is safely ignored.", + "It is very important that your baseurl matches the name of your repository exactly. Baseurl must be in all lowercase, so if you gave your repository a name with capitals please go and change it now.", + "If the build fails or your site doesn't look right, double-check your _config.yml carefully. Common mistakes: Unclosed quotes — every \" needs a matching \" Missing space after colon — write title: \"My Site\", not title:\"My Site\" Wrong indentation — nested settings like published_url must be indented with spaces, not tabs Mismatched baseurl — must match your repository name exactly, in all lowercase Wrong Google Sheets URL — make sure you use the published URL from File → Share → Publish to web See the Configuration Reference for the full list of settings. You can also paste your _config.yml into the Telar Config Validator to check for errors, or use the Config Generator and Editor to build one from scratch." + ], + "img": [ + [ + "/images/use-this-template.png", + "GitHub screenshot: Use this template button" + ], + [ + "/images/github-actions.gif", + "Setting up GitHub Pages with GitHub Actions" + ], + [ + "/images/config_title.gif", + "Editing config: title and URL" + ], + [ + "/images/config_theme.gif", + "Editing config: theme" + ], + [ + "/images/telar-homepage.png", + "Telar homepage with title and navigation menu" + ] + ] + }, + "text": "Manual Setup Build a complete Telar exhibition in your browser using GitHub and Google Sheets. No software to install. You will need: A GitHub account (free) A Google account for Google Sheets (free) Part 1: Set Up All the Technical Bits This part might feel daunting, but you only have to do it once. Once everything is set up, you won't need to come back here — everything else is creative work in your spreadsheet. Create Your Repository A repository is your project's home on GitHub — it holds your images and configuration files. Visit the Telar template Click the green Use this template button Choose Create a new repository Give your repository a name — use all lowercase letters and avoid spaces (hyphens are fine) — this will be part of your site's web address Click Create repository Enable GitHub Pages GitHub Pages turns your repository into a live website for free. In your repository, go to Settings → Pages Under Source , select GitHub Actions Click Save Duplicate the Google Sheets Template Your Google Sheets spreadsheet is where you manage all your content — objects, stories, and text. Go to https://bit.ly/telar-template Click File → Make a copy Save to your Google Drive with a descriptive name (e.g., \"My Telar Exhibition\") Publish Your Sheet Your spreadsheet needs to be published so Telar can read it during builds. Go to File → Share → Publish to web Click Publish Copy the published URL Simplified in v0.9.0. Previous versions required both a shared URL and a published URL. From v0.9.0, only the published URL is needed. If your _config.yml still has a shared_url line, it is safely ignored. Configure Your Site Edit the _config.yml file in your repository to connect everything: Navigate to _config.yml and click the pencil icon to edit Site settings — fill in your site's name and description: title: \"My Exhibition\" description: \"A visual narrative about...\" author: Your Name Web address — set your site's URL: url: \"https://yourgithubusername.github.io\" baseurl: \"/your-repository-name\" Your site will be available at https://yourgithubusername.github.io/your-repository-name . It is very important that your baseurl matches the name of your repository exactly. Baseurl must be in all lowercase, so if you gave your repository a name with capitals please go and change it now. Google Sheets — paste in the published URL you copied: google_sheets: enabled: true published_url: \"https://docs.google.com/...\" Theme (optional) — choose a visual theme: telar_theme: \"paisajes\" # Options: paisajes, neogranadina, santa-barbara, austin Click Commit changes to save Verify Your Setup After committing, GitHub Actions will automatically build and publish your site. This takes 2–5 minutes. Click the Actions tab to watch the build progress When it finishes, visit your site at the URL you configured You should see an empty Telar site with your title and theme If the build fails or your site doesn't look right, double-check your _config.yml carefully. Common mistakes: Unclosed quotes — every \" needs a matching \" Missing space after colon — write title: \"My Site\" , not title:\"My Site\" Wrong indentation — nested settings like published_url must be indented with spaces, not tabs Mismatched baseurl — must match your repository name exactly, in all lowercase Wrong Google Sheets URL — make sure you use the published URL from File → Share → Publish to web See the Configuration Reference for the full list of settings. You can also paste your _config.yml into the Telar Config Validator to check for errors, or use the Config Generator and Editor to build one from scratch. Next Steps Your site is configured and running. Continue with the Getting Started tutorial: Add Your Content — Upload images, fill in your spreadsheet, and create your first story Review and Refine — Set image coordinates, review your site, and polish Plan Your Narrative — Understand how stories, steps, and panels fit together" + }, + "/guia/tu-contenido/objetos-de-audio/": { + "ids": [ + "agregar-un-objeto-de-audio", + "control-de-clips", + "cómo-se-muestra-el-audio", + "dependencias-opcionales", + "en-historias", + "en-la-galería", + "en-páginas-de-objetos", + "formatos-compatibles", + "objetos-de-audio", + "procesamiento-de-audio-en-el-build", + "véase-también" + ], + "selectors": { + "h1": [ + "Objetos de audio" + ], + "h2": [ + "Agregar un objeto de audio", + "Cómo se muestra el audio", + "Control de clips", + "Procesamiento de audio en el build", + "Véase también" + ], + "h3": [ + "Formatos compatibles", + "En historias", + "En páginas de objetos", + "En la galería", + "Dependencias opcionales" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "brew install ffmpeg audiowaveform", + "sudo apt install ffmpeg audiowaveform" + ], + "table": [ + "Columna (inglés) Columna (español) Descripción clip_start inicio_clip Tiempo de inicio en segundos (ej., 12.5) clip_end fin_clip Tiempo de fin en segundos loop bucle Repetir el clip (true, yes o sí)" + ], + "blockquote": [ + "También puedes fijar los tiempos del clip de forma visual en el Compositor. Consulta Video y audio en el Compositor para más detalles.", + "GitHub Actions se encarga de esto automáticamente. El flujo de trabajo build.yml detecta archivos de audio en el repositorio e instala estas herramientas durante el build. No se necesita configuración manual para sitios desplegados." + ], + "img": [] + }, + "text": "Objetos de audio Telar puede mostrar archivos de audio autoalojados como objetos en tu exhibición. El audio funciona igual que las imágenes y los videos — se pueden construir historias alrededor de grabaciones, enfocar momentos específicos con el control de clips y combinarlos con los demás objetos. A diferencia de los objetos de video (que se insertan desde plataformas externas), los archivos de audio se alojan directamente en tu repositorio. Pon tus archivos MP3, OGG o M4A en telar-content/objects/ y Telar se encarga del resto. Agregar un objeto de audio Para agregar un archivo de audio, ponlo en telar-content/objects/ con un nombre que coincida con el object_id en tu hoja de cálculo de objetos. Por ejemplo, si tu hoja de cálculo tiene un objeto con object_id = grabacion-campo-01 , nombra tu archivo grabacion-campo-01.mp3 . Formatos compatibles Telar reconoce tres formatos de audio: MP3 — el formato más ampliamente compatible OGG — formato abierto con buena compresión M4A — formato común de dispositivos Apple y grabadoras profesionales Cómo se muestra el audio En historias Cuando un paso de la historia hace referencia a un objeto de audio, una visualización de forma de onda WaveSurfer llena el área del visor con controles de reproducción y pausa. Si se configuran valores de inicio_clip y fin_clip en la hoja de cálculo, el reproductor reproduce solo el segmento especificado. Esto es útil para dirigir la atención a un momento particular en una grabación larga. En páginas de objetos Cada objeto de audio tiene su propia página ( /objects/{object-id}/ ) con un reproductor de forma de onda completo. Debajo de la forma de onda, un selector de clips permite elegir los tiempos de inicio y fin arrastrando los bordes de la región sobre la forma de onda — útil al construir pasos de historias. Los valores se copian directamente a la hoja de cálculo. En la galería Los objetos de audio aparecen en la galería de objetos con un ícono de forma de onda sobre un fondo gris. El filtro Type de la galería permite a quienes visitan explorar por tipo de medio (Image, Video o Audio). Control de clips Los pasos de las historias pueden especificar un tiempo de inicio, un tiempo de fin y una configuración de bucle para los objetos de audio. Las columnas funcionan exactamente igual que para los videos — consulta Objetos de video: Control de clips para la referencia completa de columnas y ejemplos. Columna (inglés) Columna (español) Descripción clip_start inicio_clip Tiempo de inicio en segundos (ej., 12.5 ) clip_end fin_clip Tiempo de fin en segundos loop bucle Repetir el clip ( true , yes o sí ) También puedes fijar los tiempos del clip de forma visual en el Compositor. Consulta Video y audio en el Compositor para más detalles. Procesamiento de audio en el build Telar procesa los archivos de audio durante el build para extraer clips y generar datos de picos para la visualización de la forma de onda. Esto se gestiona mediante process_audio.py , que se ejecuta automáticamente como parte del build . Dependencias opcionales El procesamiento de audio requiere dos herramientas externas. Solo se necesitan si el sitio incluye objetos de audio — los sitios sin audio no las requieren. ffmpeg — extrae clips de audio según los valores de inicio_clip y fin_clip audiowaveform — genera datos de picos para la visualización de la forma de onda Para instalarlas localmente: macOS: brew install ffmpeg audiowaveform Ubuntu/Debian: sudo apt install ffmpeg audiowaveform GitHub Actions se encarga de esto automáticamente. El flujo de trabajo build.yml detecta archivos de audio en el repositorio e instala estas herramientas durante el build . No se necesita configuración manual para sitios desplegados. Véase también Objetos de video — Insertar video desde plataformas externas Objetos — Definir objetos en tu hoja de cálculo Historias y paneles — Construir pasos de historias Columnas de historias — Referencia completa de columnas incluyendo columnas de clips Galería de objetos — Cómo aparecen los objetos de audio en la galería" + }, + "/guia/el-compositor/primeros-pasos/": { + "ids": [ + "conectar-un-repositorio", + "conectar-un-sitio-existente", + "después-de-importar", + "importar-desde-google-sheets", + "iniciar-sesión", + "instalar-la-aplicación-de-github", + "primeros-pasos-con-el-compositor", + "requisitos-previos", + "véase-también" + ], + "selectors": { + "h1": [ + "Conectar un sitio existente" + ], + "h2": [ + "Requisitos previos", + "Iniciar sesión", + "Instalar la aplicación de GitHub", + "Conectar un repositorio", + "Importar desde Google Sheets", + "Después de importar", + "Véase también" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [ + "Si solo quieres que el Compositor acceda a un repositorio, selecciona Only select repositories y elige el repositorio de la lista. Puedes cambiar esto después en la configuración de GitHub, en Applications." + ], + "img": [] + }, + "text": "Conectar un sitio existente Usa esta guía cuando tu repositorio Telar ya exista. Para empezar un proyecto nuevo, sigue Crear tu primer sitio . Requisitos previos Antes de comenzar, asegúrate de tener: Una cuenta de GitHub — regístrate gratis si no tienes una Un repositorio de Telar — crea uno a partir de la plantilla de Telar (consulta Usar el Compositor para instrucciones paso a paso) GitHub Pages habilitado — en la configuración del repositorio, pon la fuente de Pages en GitHub Actions Iniciar sesión El Compositor usa tu cuenta de GitHub para la autenticación y la publicación. No se necesita una cuenta separada. Ve a compositor.telar.org Haz clic en Iniciar sesión con GitHub Autoriza el Compositor de Telar cuando GitHub te lo solicite Instalar la aplicación de GitHub En tu primer inicio de sesión, el Compositor te pide instalar la aplicación de GitHub de Telar. Esta aplicación le da al Compositor permiso para leer y escribir en tus repositorios. Cuando se te solicite, haz clic en Install Elige si deseas conceder acceso a todos los repositorios o solo a algunos específicos Confirma la instalación Si solo quieres que el Compositor acceda a un repositorio, selecciona Only select repositories y elige el repositorio de la lista. Puedes cambiar esto después en la configuración de GitHub, en Applications . Conectar un repositorio Después de iniciar sesión, selecciona con qué repositorio quieres trabajar. El Compositor muestra una lista de los repositorios de GitHub que tienen la aplicación de Telar instalada Selecciona el repositorio que deseas editar El Compositor escanea el repositorio para detectar archivos de contenido de Telar Si el repositorio se creó a partir de la plantilla de Telar y tiene contenido en telar-content/ , el Compositor lo importa automáticamente. Importar desde Google Sheets Si el sitio usa Google Sheets, sigue la importación y las comprobaciones de configuración que muestre el Compositor. Revisa el contenido importado y cualquier solicitud de desactivar la conexión con Sheets antes de continuar con la autoría visual. La importación no elimina la hoja de cálculo. Decide qué método de autoría administrará los cambios futuros; no supongas que editar en el Compositor actualiza automáticamente la hoja original. Después de importar Después de la importación y las comprobaciones de configuración, usa la navegación principal para: Ver y administrar tus historias Explorar y editar tus objetos Comenzar a crear contenido nuevo El contenido importado se guarda en el servidor. Los cambios que hagas no se envían a GitHub hasta que publiques — así que puedes explorar y experimentar libremente. Véase también Inicio y navegación — Navega tu proyecto y administra historias Objetos — Explora, edita y agrega objetos Usar el Compositor — Crear un repositorio y habilitar GitHub Pages" + }, + "/guia/funciones/galeria-objetos/": { + "ids": [ + "completar-los-metadatos-de-la-galería", + "configuración", + "enlace-a-objetos-en-la-página-principal", + "galería-de-objetos", + "modo-de-cuadrícula-simple", + "modo-de-exploración-y-búsqueda", + "objetos-destacados-en-la-página-principal", + "página-de-la-galería", + "véase-también" + ], + "selectors": { + "h1": [ + "Galería de objetos" + ], + "h2": [ + "Página de la galería", + "Objetos destacados en la página principal", + "Configuración", + "Véase también" + ], + "h3": [ + "Modo de exploración y búsqueda", + "Modo de cuadrícula simple", + "Completar los metadatos de la galería", + "Enlace a objetos en la página principal" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "collection_interface: show_sample_on_homepage: true featured_count: 4", + "collection_interface: show_link_on_homepage: true # Mostrar u ocultar el enlace a /objects/", + "collection_interface: browse_and_search: true # Barra lateral de filtros y barra de búsqueda show_link_on_homepage: true # Enlace \"View the objects\" en la página principal show_sample_on_homepage: true # Cuadrícula de objetos destacados en la página principal featured_count: 4 # Cantidad de objetos en la página principal" + ], + "table": [ + "Valor Descripción Image Imágenes autoalojadas o IIIF Video Videos de YouTube, Vimeo o Google Drive Audio Archivos de audio autoalojados (MP3, OGG, M4A)", + "Faceta Columna CSV Valores de ejemplo Creador creator Desconocido, Juan de Cuéllar Periodo period Colonial, siglo XVIII Temas subjects tejido, cartografía, Lima" + ], + "blockquote": [ + "Los objetos agregados o subidos a través del Compositor aparecen en la galería después de publicar." + ], + "img": [ + [ + "/images/gallery-browse.png", + "Galería de objetos con barra de búsqueda, opciones de orden y barra lateral de filtros" + ] + ] + }, + "text": "Galería de objetos La galería de objetos ofrece una interfaz navegable y con búsqueda para tu colección en /objects/ . Página de la galería Hay dos modos, controlados por la opción browse_and_search en tu _config.yml : Modo de exploración y búsqueda Cuando browse_and_search es true (el valor predeterminado), la galería incluye una barra lateral de filtros y una barra de búsqueda para explorar tu colección. La búsqueda usa indexación de texto completo con Lunr.js. Busca en título, creador, descripción, periodo, temas y medio — con mayor peso para las coincidencias en el título. Escribe unos pocos caracteres y los resultados se actualizan al instante. Los filtros permiten acotar la galería con cinco facetas organizadas en dos secciones: Tipo filtra por el tipo de medio detectado automáticamente para cada objeto: Valor Descripción Image Imágenes autoalojadas o IIIF Video Videos de YouTube, Vimeo o Google Drive Audio Archivos de audio autoalojados (MP3, OGG, M4A) Medium/Genre filtra por la columna medium del objects.csv (antes llamada object_type ). Los valores los define cada proyecto — por ejemplo, mapa, textil, fotografía o pintura. Las facetas restantes funcionan como antes: Faceta Columna CSV Valores de ejemplo Creador creator Desconocido, Juan de Cuéllar Periodo period Colonial, siglo XVIII Temas subjects tejido, cartografía, Lima Cada faceta muestra la cantidad de objetos coincidentes entre paréntesis. Selecciona varios valores dentro de una faceta para ampliar los resultados (lógica OR), o combina facetas para acotarlos (lógica AND). Los objetos de video y audio muestran miniaturas con iconos de marcador de posición en la cuadrícula de la galería en lugar de espacios en blanco. Cada elemento de la galería también incluye los atributos data-media-type y data-medium para personalización con estilos o scripts. La ordenación ofrece dos opciones: Título — Alfabético (A–Z o Z–A) Año — Cronológico, usando la columna year del CSV Los filtros y términos de búsqueda activos aparecen como etiquetas removibles sobre la cuadrícula. Haz clic en Clear all para reiniciar. Modo de cuadrícula simple Cuando browse_and_search es false , la galería muestra una cuadrícula sencilla de tarjetas de objetos sin filtros ni búsqueda. Completar los metadatos de la galería Para la mejor experiencia en la galería, completa estas columnas en tu objects.csv : medium para cada objeto — alimenta el filtro de Medium/Genre (la columna antes se llamaba object_type ; ambos nombres se aceptan) subjects con 2–4 términos separados por comas — alimenta el filtro de Temas year — habilita la ordenación cronológica description — se indexa para la búsqueda de texto completo creator y period — alimentan sus filtros respectivos Sin estas columnas, la galería sigue funcionando, pero las opciones de filtrado y ordenación son limitadas. Los objetos agregados o subidos a través del Compositor aparecen en la galería después de publicar. Objetos destacados en la página principal Puedes mostrar una selección de objetos en tu página principal marcándolos como destacados: En objects.csv , establece featured en yes para los objetos que quieras resaltar En _config.yml , establece show_sample_on_homepage: true bajo collection_interface collection_interface: show_sample_on_homepage: true featured_count: 4 La página principal muestra hasta featured_count objetos (predeterminado: 4). Si marcas menos objetos como destacados de lo que permite el conteo, los espacios restantes se llenan aleatoriamente de tu colección. Enlace a objetos en la página principal El enlace \"View the objects\" en la página principal se controla por separado: collection_interface: show_link_on_homepage: true # Mostrar u ocultar el enlace a /objects/ Aunque el enlace esté oculto, la página de la galería sigue accesible a través del menú de navegación. Configuración Todas las opciones de la galería están bajo collection_interface en _config.yml : collection_interface: browse_and_search: true # Barra lateral de filtros y barra de búsqueda show_link_on_homepage: true # Enlace \"View the objects\" en la página principal show_sample_on_homepage: true # Cuadrícula de objetos destacados en la página principal featured_count: 4 # Cantidad de objetos en la página principal Consulta la Referencia de configuración para detalles completos de cada opción. Véase también Objetos — Definir objetos y páginas de objetos Columnas de objetos — Referencia completa de columnas para objects.csv Referencia de configuración — Opciones de la interfaz de colección" + }, + "/docs/your-content/audio-objects/": { + "ids": [ + "adding-an-audio-object", + "audio-build-pipeline", + "audio-objects", + "clip-control", + "how-audio-appears", + "in-stories", + "in-the-gallery", + "on-object-pages", + "optional-dependencies", + "see-also", + "supported-formats" + ], + "selectors": { + "h1": [ + "Audio Objects" + ], + "h2": [ + "Adding an audio object", + "How audio appears", + "Clip control", + "Audio build pipeline", + "See also" + ], + "h3": [ + "Supported formats", + "In stories", + "On object pages", + "In the gallery", + "Optional dependencies" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "brew install ffmpeg audiowaveform", + "sudo apt install ffmpeg audiowaveform" + ], + "table": [ + "Column (English) Column (Spanish) Description clip_start inicio_clip Start time in seconds (e.g. 12.5) clip_end fin_clip End time in seconds loop bucle Loop the clip (true, yes, or sí)" + ], + "blockquote": [ + "You can also set clip times visually in the Compositor. See Video and Audio in the Compositor for details.", + "GitHub Actions handles this automatically. The build.yml workflow detects audio files in your repository and installs these tools during the build. No manual setup is needed for deployed sites." + ], + "img": [] + }, + "text": "Audio Objects Telar can display self-hosted audio files as objects in your exhibition. Audio works just like images and videos — you can build stories around recordings, focus on specific moments with clip control, and include them alongside your other objects. Unlike video objects (which embed from external platforms), audio files live directly in your repository. Place your MP3, OGG, or M4A files in telar-content/objects/ and Telar handles the rest. Adding an audio object To add an audio file, place it in telar-content/objects/ with a filename matching the object_id in your objects spreadsheet. For example, if your spreadsheet has an object with object_id = field-recording-01 , name your file field-recording-01.mp3 . Supported formats Telar recognizes three audio formats: MP3 — the most widely supported format OGG — open format with good compression M4A — common format from Apple devices and professional recorders How audio appears In stories When a story step references an audio object, a WaveSurfer waveform visualisation fills the viewer area with play/pause controls. If you set clip_start and clip_end values in your story spreadsheet, the player plays only the specified segment. This is useful for drawing attention to a particular moment in a longer recording. On object pages Each audio object has its own page ( /objects/{object-id}/ ) with a full waveform player. Below the waveform, a clip picker lets you select start and end times by dragging region edges on the waveform — useful when building story steps. Copy the values directly into your story spreadsheet. In the gallery Audio objects appear in the objects gallery with a waveform icon on a grey background. The gallery's Type filter lets visitors browse by media type (Image, Video, or Audio). Clip control Story steps can specify a start time, end time, and loop setting for audio objects. The columns work exactly the same way as they do for video — see Video Objects: Clip control for the full column reference and examples. Column (English) Column (Spanish) Description clip_start inicio_clip Start time in seconds (e.g. 12.5 ) clip_end fin_clip End time in seconds loop bucle Loop the clip ( true , yes , or sí ) You can also set clip times visually in the Compositor. See Video and Audio in the Compositor for details. Audio build pipeline Telar processes audio files during the build to extract clips and generate peak data for the waveform display. This is handled by process_audio.py , which runs automatically as part of the build. Optional dependencies Audio processing requires two external tools. These are only needed if your site includes audio objects — sites without audio do not need them. ffmpeg — extracts audio clips based on your clip_start and clip_end values audiowaveform — generates peak data for the waveform visualisation To install them locally: macOS: brew install ffmpeg audiowaveform Ubuntu/Debian: sudo apt install ffmpeg audiowaveform GitHub Actions handles this automatically. The build.yml workflow detects audio files in your repository and installs these tools during the build. No manual setup is needed for deployed sites. See also Video Objects — Embedding video from external platforms Objects — Defining objects in your spreadsheet Stories & Panels — Building story steps Story Columns — Complete column reference including clip columns Objects Gallery — How audio objects appear in the gallery" + }, + "/guia/desarrolladores/sistema-insercion/": { + "ids": [ + "archivos-de-idioma", + "atributo-sandbox-de-iframe", + "banner-view-full-site", + "compartir-recursos-de-origen-cruzado-cors", + "compatibilidad-de-navegadores", + "consideraciones-de-iframe", + "consideraciones-de-seguridad", + "creación-de-botones", + "creación-del-banner", + "detección-del-modo-embed", + "detectar-modo-embed-en-código-personalizado", + "documentación-relacionada", + "enlaces-a-pasos-y-estado-de-la-inserción", + "estilos-de-modo-embed", + "estilos-del-banner", + "estilos-personalizados-de-embed", + "generación-de-código-de-inserción", + "implementación-javascript", + "inyección-de-cadenas-de-idioma", + "limitaciones-conocidas", + "limpieza-de-url", + "mejoras-futuras", + "modificaciones-css", + "modificar-la-apariencia-del-banner", + "modos-de-navegación", + "navegación-en-modo-embed", + "navegadores-admitidos", + "normalización-de-dimensiones", + "panel-de-compartir-e-insertar", + "parámetro-de-url", + "personalizar-el-comportamiento-de-embed", + "política-de-seguridad-de-contenido", + "probar-el-modo-embed", + "pruebas-en-producción", + "pruebas-locales", + "referencia-del-sistema-de-inserción", + "resumen-de-arquitectura", + "sistema-de-navegación", + "soporte-multilingüe", + "tamaños-predefinidos" + ], + "selectors": { + "h1": [ + "Referencia del sistema de inserción" + ], + "h2": [ + "Resumen de arquitectura", + "Detección del modo embed", + "Modificaciones CSS", + "Sistema de navegación", + "Banner \"View Full Site\"", + "Panel de compartir e insertar", + "Soporte multilingüe", + "Compatibilidad de navegadores", + "Probar el modo embed", + "Consideraciones de seguridad", + "Personalizar el comportamiento de embed", + "Limitaciones conocidas", + "Enlaces a pasos y estado de la inserción", + "Documentación relacionada" + ], + "h3": [ + "Parámetro de URL", + "Implementación JavaScript", + "Estilos de modo embed", + "Navegación en modo embed", + "Modos de navegación", + "Creación de botones", + "Creación del banner", + "Estilos del banner", + "Generación de código de inserción", + "Limpieza de URL", + "Tamaños predefinidos", + "Normalización de dimensiones", + "Inyección de cadenas de idioma", + "Archivos de idioma", + "Navegadores admitidos", + "Consideraciones de iframe", + "Pruebas locales", + "Pruebas en producción", + "Política de seguridad de contenido", + "Compartir recursos de origen cruzado (CORS)", + "Atributo sandbox de iframe", + "Estilos personalizados de embed", + "Detectar modo embed en código personalizado", + "Modificar la apariencia del banner" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "https://tusitio.com/stories/story-1/?embed=true", + "(function() { 'use strict'; // Analizar parámetros de URL const params = new URLSearchParams(window.location.search); const embedParam = params.get('embed'); // Inicializar estado de embed window.telarEmbed = { enabled: embedParam === 'true' }; // Esperar a que el DOM esté listo if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } function init() { if (!window.telarEmbed.enabled) return; // Aplicar clase body de modo embed document.body.classList.add('embed-mode'); // Crear banner \"View full site\" createEmbedBanner(); } })();", + "body.embed-mode { // Ocultar elementos de navegación .home-button { display: none !important; } .share-button { display: none !important; } // Ocultar texto de carga en contador de pasos .viewer-overlay { display: none; } }", + "body.embed-mode { // Los botones de navegación se muestran en cualquier ancho en modo embed, // centrados sobre la columna narrativa con ancho intrínseco .mobile-nav { position: fixed; left: 20%; right: auto; bottom: max(8%, 1.5rem); transform: translateX(-50%); } }", + "// El mismo límite del diseño vertical de todo el sitio // (_responsive.scss $telar-vertical-min-width, 1024px) @media (max-width: $telar-vertical-min-width) { body.embed-mode .mobile-nav { // Apilados en el borde derecho right: 1rem; left: auto; bottom: 50%; transform: translateY(50%); flex-direction: column; } }", + "function createEmbedBanner() { // Obtener cadenas de idioma de Jekyll const lang = window.telarLang?.embedBanner || { text: 'This story is part of {site_name}...', link: 'View the complete site' }; const siteName = getSiteName(); const siteUrl = getFullSiteUrl(); const banner = document.createElement('div'); banner.className = 'embed-banner'; banner.innerHTML = ` ${lang.text.replace('{site_name}', siteName)} ${lang.link} `; document.body.appendChild(banner); // Manejar descarte banner.querySelector('.embed-banner-close').addEventListener('click', () => { banner.remove(); }); }", + ".embed-banner { position: fixed; top: 1rem; left: 1rem; z-index: 1000; background: rgba(255, 255, 255, 0.5); backdrop-filter: blur(8px); padding: 0.75rem 1rem; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); max-width: 380px; display: flex; align-items: center; gap: 0.75rem; }", + "function generateEmbedCode() { if (!currentStoryUrl) return ''; const width = embedWidthInput.value.trim() || '100%'; const height = embedHeightInput.value.trim() || '800'; // Normalizar dimensiones const widthAttr = normalizeDimension(width); const heightAttr = normalizeDimension(height); // Construir URL de embed const embedUrl = addEmbedParameter(currentStoryUrl); // Obtener título de historia const storyTitle = getStoryTitle(); // Generar código iframe const iframeCode = ``; return iframeCode; }", + "function addEmbedParameter(url) { try { const urlObj = new URL(url); // Limpiar parámetros de consulta y hash existentes urlObj.search = ''; urlObj.hash = ''; // Agregar parámetro embed limpio urlObj.searchParams.set('embed', 'true'); return urlObj.toString(); } catch (e) { // Alternativa si el análisis de URL falla const cleanUrl = url.split(/[?#]/)[0]; return cleanUrl + '?embed=true'; } }", + "const presets = { canvas: { width: '100%', height: '800' }, moodle: { width: '100%', height: '700' }, wordpress: { width: '100%', height: '600' }, squarespace: { width: '100%', height: '600' }, wix: { width: '100%', height: '550' }, mobile: { width: '375', height: '500' }, fixed: { width: '800', height: '600' } };", + "function normalizeDimension(value) { // Si es solo un número, agregar 'px' if (/^\\d+$/.test(value)) { return value + 'px'; } return value; }", + "", + "embed_banner: text: \"This story is part of {site_name}, a digital storytelling site built with Telar.\" link: \"View the complete site\"", + "embed_banner: text: \"Esta historia forma parte de {site_name}, un sitio web creado con Telar para contar historias.\" link: \"Ver el sitio completo\"", + " Prueba de Embed

Canvas LMS (100% × 800px)

", + "Content-Security-Policy: frame-ancestors 'self' https://canvas.instructure.com https://*.wordpress.com", + " ", + "body.embed-mode { // Tus estilos personalizados de embed .custom-element { // Ocultar en modo embed display: none; } }", + "if (window.telarEmbed?.enabled) { // Comportamiento personalizado para modo embed console.log('Ejecutando en modo embed'); }", + ".embed-banner { // Posición personalizada top: 2rem; left: 2rem; // Colores personalizados background: rgba(0, 0, 0, 0.8); color: white; }" + ], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Referencia del sistema de inserción Referencia técnica para el sistema de inserción mediante iframe de Telar. Resumen de arquitectura El sistema de inserción de Telar permite que las historias se muestren dentro de iframes en sitios web externos y plataformas LMS. El sistema está diseñado en torno a estos principios: Contenedores de altura fija: Escritorio: Diseño fijo de 100vh con columnas lado a lado Móvil/ Embed : Alturas fijas (visor 60vh, panel narrativo 40vh) El contenido se desplaza dentro de contenedores fijos Sin redimensionamiento dinámico: A diferencia de sistemas que usan postMessage para redimensionar iframes Las personas eligen una altura fija apropiada mediante tamaños predefinidos La filosofía de diseño de Telar se basa en desplazamiento interno, no alturas variables Compatibilidad universal: Funciona en cualquier plataforma que admita iframes No requiere integración especial Sin dependencias de APIs específicas de LMS Detección del modo embed Parámetro de URL El modo embed se activa mediante el parámetro de URL ?embed=true : https://tusitio.com/stories/story-1/?embed=true Manejo del parámetro: Detectado en assets/js/embed.js Almacenado en window.telarEmbed.enabled Disponible para todos los módulos JavaScript Implementación JavaScript Archivo: assets/js/embed.js (function() { 'use strict'; // Analizar parámetros de URL const params = new URLSearchParams(window.location.search); const embedParam = params.get('embed'); // Inicializar estado de embed window.telarEmbed = { enabled: embedParam === 'true' }; // Esperar a que el DOM esté listo if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } function init() { if (!window.telarEmbed.enabled) return; // Aplicar clase body de modo embed document.body.classList.add('embed-mode'); // Crear banner \"View full site\" createEmbedBanner(); } })(); Temporización: Se ejecuta antes que otros scripts Usa DOMContentLoaded para asegurar que el elemento body existe La clase body se aplica antes de la inicialización de navegación Modificaciones CSS Estilos de modo embed Archivo: assets/css/telar.scss El selector body.embed-mode aplica estilos específicos de embed : Elementos ocultos: body.embed-mode { // Ocultar elementos de navegación .home-button { display: none !important; } .share-button { display: none !important; } // Ocultar texto de carga en contador de pasos .viewer-overlay { display: none; } } Visibilidad y ubicación de los botones: body.embed-mode { // Los botones de navegación se muestran en cualquier ancho en modo embed, // centrados sobre la columna narrativa con ancho intrínseco .mobile-nav { position: fixed; left: 20%; right: auto; bottom: max(8%, 1.5rem); transform: translateX(-50%); } } Embeds angostos (en el límite del diseño vertical o por debajo): // El mismo límite del diseño vertical de todo el sitio // (_responsive.scss $telar-vertical-min-width, 1024px) @media (max-width: $telar-vertical-min-width) { body.embed-mode .mobile-nav { // Apilados en el borde derecho right: 1rem; left: auto; bottom: 50%; transform: translateY(50%); flex-direction: column; } } Sistema de navegación Navegación en modo embed Archivo: assets/js/telar-story/main.js Las historias insertadas usan siempre la navegación por botones, en cualquier ancho: los eventos de desplazamiento no se propagan de manera confiable dentro de un iframe, así que el motor de desplazamiento nunca se activa en un embed . Fuera de los embeds , el modo de navegación sigue el modo de diseño: el diseño horizontal usa el motor de desplazamiento (basado en Lenis) y el diseño vertical (pantallas de 1024px de ancho o menos, o más angostas que 3:4) usa los mismos botones de anterior/siguiente. El límite se declara una sola vez en _sass/_responsive.scss ( $telar-vertical-min-width ) y layout-mode.js lo lee en tiempo de ejecución. Modos de navegación Embeds (todos los anchos): navegación por botones; los embeds anchos centran los botones sobre la columna narrativa y los angostos los apilan en el borde derecho Sin embed , diseño horizontal: motor de desplazamiento basado en Lenis Sin embed , diseño vertical: la misma navegación por botones La navegación por teclado funciona en todos los modos Creación de botones Archivo: assets/js/telar-story/navigation.js initializeButtonNavigation() construye el contenedor .mobile-nav con sus botones .mobile-prev y .mobile-next y los conecta a la navegación por pasos; termina sin hacer nada si el contenedor ya existe. Banner \"View Full Site\" Creación del banner Archivo: assets/js/embed.js function createEmbedBanner() { // Obtener cadenas de idioma de Jekyll const lang = window.telarLang?.embedBanner || { text: 'This story is part of {site_name}...', link: 'View the complete site' }; const siteName = getSiteName(); const siteUrl = getFullSiteUrl(); const banner = document.createElement('div'); banner.className = 'embed-banner'; banner.innerHTML = ` ${lang.text.replace('{site_name}', siteName)} ${lang.link} `; document.body.appendChild(banner); // Manejar descarte banner.querySelector('.embed-banner-close').addEventListener('click', () => { banner.remove(); }); } Estilos del banner .embed-banner { position: fixed; top: 1rem; left: 1rem; z-index: 1000; background: rgba(255, 255, 255, 0.5); backdrop-filter: blur(8px); padding: 0.75rem 1rem; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); max-width: 380px; display: flex; align-items: center; gap: 0.75rem; } Comportamiento: Aparece en cada carga de página en modo embed Descartable mediante botón X Sin persistencia de sessionStorage Enlaza a la página de inicio del sitio (no a la página de historia) Panel de compartir e insertar Generación de código de inserción Archivo: assets/js/share-panel.js function generateEmbedCode() { if (!currentStoryUrl) return ''; const width = embedWidthInput.value.trim() || '100%'; const height = embedHeightInput.value.trim() || '800'; // Normalizar dimensiones const widthAttr = normalizeDimension(width); const heightAttr = normalizeDimension(height); // Construir URL de embed const embedUrl = addEmbedParameter(currentStoryUrl); // Obtener título de historia const storyTitle = getStoryTitle(); // Generar código iframe const iframeCode = ``; return iframeCode; } Limpieza de URL function addEmbedParameter(url) { try { const urlObj = new URL(url); // Limpiar parámetros de consulta y hash existentes urlObj.search = ''; urlObj.hash = ''; // Agregar parámetro embed limpio urlObj.searchParams.set('embed', 'true'); return urlObj.toString(); } catch (e) { // Alternativa si el análisis de URL falla const cleanUrl = url.split(/[?#]/)[0]; return cleanUrl + '?embed=true'; } } Propósito: Elimina el estado del visor (coordenadas hash) Elimina cualquier parámetro de consulta existente Agrega parámetro limpio ?embed=true Asegura que el embed siempre comience en el paso 1 Tamaños predefinidos Archivo: assets/js/share-panel.js const presets = { canvas: { width: '100%', height: '800' }, moodle: { width: '100%', height: '700' }, wordpress: { width: '100%', height: '600' }, squarespace: { width: '100%', height: '600' }, wix: { width: '100%', height: '550' }, mobile: { width: '375', height: '500' }, fixed: { width: '800', height: '600' } }; Normalización de dimensiones function normalizeDimension(value) { // Si es solo un número, agregar 'px' if (/^\\d+$/.test(value)) { return value + 'px'; } return value; } Formatos aceptados: 100% → 100% 800px → 800px 800 → 800px (agrega px automáticamente) Soporte multilingüe Inyección de cadenas de idioma Archivo: _layouts/story.html Proceso: Jekyll procesa etiquetas liquid durante el build Las cadenas de idioma se inyectan en window.telarLang JavaScript lee desde window.telarLang.embedBanner Alternativa al inglés si faltan datos de idioma Archivos de idioma Inglés: _data/languages/en.yml embed_banner: text: \"This story is part of {site_name}, a digital storytelling site built with Telar.\" link: \"View the complete site\" Español: _data/languages/es.yml embed_banner: text: \"Esta historia forma parte de {site_name}, un sitio web creado con Telar para contar historias.\" link: \"Ver el sitio completo\" Compatibilidad de navegadores Navegadores admitidos El modo embed de Telar funciona en todos los navegadores modernos: Chrome/Edge 90+ Firefox 88+ Safari 14+ Navegadores móviles (iOS Safari, Chrome Android) Consideraciones de iframe Mismo origen vs. origen cruzado: Los embeds de Telar son de origen cruzado (dominio diferente al anfitrión) Sin acceso a localStorage/sessionStorage entre orígenes Sin acceso al marco padre (seguridad intencional) El visor IIIF se muestra correctamente dentro del embed Estructura del embed : Historia de Telar (iframe 1) Visor OpenSeadragon (se muestra en línea, no es un iframe anidado) Teselas IIIF (fuentes de imagen) Rendimiento: Los navegadores modernos manejan iframes anidados eficientemente La carga de teselas IIIF no se ve afectada por el contexto iframe Los modales Bootstrap (glosario, panel de compartir) funcionan correctamente Probar el modo embed Pruebas locales Estructura del archivo de prueba: Prueba de Embed

Canvas LMS (100% × 800px)

Lista de verificación de pruebas: El banner de embed aparece y es descartable Los botones de navegación funcionan (clic y teclado) El visor IIIF carga y hace zoom correctamente El panel de compartir se abre y funciona Los enlaces del glosario funcionan Los modales Bootstrap se muestran correctamente Los botones de inicio y compartir están ocultos Comportamiento responsivo en diferentes anchos Pruebas en producción Despliega el sitio a producción (GitHub Pages o dominio personalizado) Prueba el código de inserción en curso real de Canvas LMS Verifica en múltiples navegadores (Chrome, Firefox, Safari) Prueba en dispositivos móviles (iOS, Android) Verifica la consola en busca de errores de JavaScript Consideraciones de seguridad Política de seguridad de contenido Si tu sitio usa encabezados CSP, asegúrate de que los iframes estén permitidos: Content-Security-Policy: frame-ancestors 'self' https://canvas.instructure.com https://*.wordpress.com GitHub Pages: Sin encabezados personalizados por defecto Insertable en cualquier sitio Considera esto al alojar contenido sensible Compartir recursos de origen cruzado (CORS) Teselas IIIF: Servidas desde el mismo origen que la historia Sin problemas de CORS Manifiestos IIIF externos: Requieren encabezados CORS de la institución fuente La mayoría de los proveedores IIIF incluyen encabezados CORS apropiados Prueba manifiestos externos antes de insertar Atributo sandbox de iframe No recomendado para Telar: Por qué: Rompe la funcionalidad de JavaScript Impide que el visor IIIF funcione Deshabilita navegación y modales Usa iframe estándar sin atributo sandbox Personalizar el comportamiento de embed Estilos personalizados de embed Agrega CSS personalizado para modo embed en assets/css/telar.scss : body.embed-mode { // Tus estilos personalizados de embed .custom-element { // Ocultar en modo embed display: none; } } Detectar modo embed en código personalizado if (window.telarEmbed?.enabled) { // Comportamiento personalizado para modo embed console.log('Ejecutando en modo embed'); } Modificar la apariencia del banner Sobrescribe estilos del banner en telar.scss : .embed-banner { // Posición personalizada top: 2rem; left: 2rem; // Colores personalizados background: rgba(0, 0, 0, 0.8); color: white; } Limitaciones conocidas Sin redimensionamiento dinámico de altura: Solo alturas fijas Sin postMessage lti.frameResize de Canvas Intencional: Telar usa desplazamiento interno Enlaces a pasos y estado de la inserción El código que genera Compartir retira la consulta y el fragmento actuales y agrega el parámetro de inserción; por eso abre la historia desde la introducción. No conserva los cambios temporales de desplazamiento y zoom del lector. El motor también admite fragmentos de pasos y paneles: #s3 abre el tercer paso de contenido, #s3l1 abre su primer panel y #s3l1g1 señala su primer enlace de glosario. Son distintos del parámetro ?section= , que no está implementado. Prueba los enlaces insertados que construyas manualmente en el alojamiento previsto antes de compartirlos. Documentación relacionada Guía para educadores : Insertar en LMS y sitios web Configuración de desarrollo : Desarrollo Local GitHub Actions : Flujo de trabajo de build automatizado" + }, + "/guia/personalizacion/temas/": { + "ids": [ + "accesibilidad-del-color", + "agrega-atribución-a-temas-personalizados", + "atribución-de-la-persona-creadora-del-tema", + "atribución-para-temas-predeterminados", + "austin", + "cambia-temas", + "campos-de-atribución", + "claves-de-color-del-tema", + "claves-de-tipografía", + "comparte-temas-personalizados", + "crea-temas-personalizados", + "cuando-falta-el-tema-o-una-de-sus-claves", + "cuando-telar-reemplaza-un-color", + "cómo-revisa-telar-tus-colores", + "cómo-se-muestra-la-atribución", + "ejemplos-de-fuentes", + "guide-title", + "lo-que-telar-no-revisa", + "los-colores-que-telar-no-puede-leer", + "neogranadina", + "paisajes-coloniales", + "paso-1-crea-un-archivo-de-tema", + "paso-2-activa-el-tema-personalizado", + "paso-3-prueba-y-refina", + "próximos-pasos", + "quitar-la-atribución", + "santa-barbara", + "temas", + "temas-disponibles", + "trama-predeterminado", + "usa-google-fonts" + ], + "selectors": { + "h1": [ + "Temas" + ], + "h2": [ + "Temas", + "Temas disponibles", + "Cambia temas", + "Crea temas personalizados", + "Claves de color del tema", + "Claves de tipografía", + "Usa Google Fonts", + "Atribución de la persona creadora del tema", + "Accesibilidad del color", + "Cuando falta el tema o una de sus claves", + "Próximos pasos" + ], + "h3": [ + "Trama (predeterminado)", + "Paisajes Coloniales", + "Neogranadina", + "Santa Barbara", + "Austin", + "Paso 1: crea un archivo de tema", + "Paso 2: activa el tema personalizado", + "Paso 3: prueba y refina", + "Ejemplos de fuentes", + "Agrega atribución a temas personalizados", + "Campos de atribución", + "Cómo se muestra la atribución", + "Atribución para temas predeterminados", + "Comparte temas personalizados", + "Quitar la atribución", + "Cómo revisa Telar tus colores", + "Cuando Telar reemplaza un color", + "Lo que Telar no revisa", + "Los colores que Telar no puede leer" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "telar_theme: \"santa-barbara\" # Opciones: trama, paisajes, neogranadina, santa-barbara, austin", + "name: \"Mi tema\" colors: text: heading: \"#1a1a1a\" # Encabezados body: \"#333333\" # Texto del cuerpo link: \"#883C36\" # Enlaces button: \"#FFFFFF\" # Texto de los botones panel_layer1: \"#333333\" # Texto del panel de la capa 1 panel_layer2: \"#FFFFFF\" # Texto del panel de la capa 2 panel_glossary: \"#333333\" # Texto del panel del glosario background: button: \"#883C36\" # Fondo de los botones panel_layer1: \"#C6D0F8\" # Fondo del panel de la capa 1 panel_layer2: \"#883C36\" # Fondo del panel de la capa 2 panel_glossary: \"#FFF6EF\" # Fondo del panel del glosario fonts: headings: \"'Playfair Display', Georgia, serif\" body: \"'Source Sans Pro', -apple-system, sans-serif\"", + "telar_theme: \"custom\"", + "fonts: headings: \"'Playfair Display', Georgia, serif\"", + "fonts: headings: \"'Montserrat', Helvetica, sans-serif\"", + "fonts: body: \"'Source Sans Pro', sans-serif\"", + "@import url('https://fonts.googleapis.com/css2?family=Tu+Fuente:wght@400;600;700&display=swap');", + "fonts: headings: \"'Tu Fuente', serif\"", + "name: \"Miami\" description: \"Retro Cool. Digital Heat.\" creator: \"Material/Image Research Lab\" creator_url: \"https://mirl.ucsb.edu\" colors: text: heading: \"#F990E8\" body: \"#000000\" link: \"#0BD2D3\" button: \"#F990E8\" panel_layer1: \"#FFFFFF\" panel_layer2: \"#FFFFFF\" panel_glossary: \"#FFFFFF\" background: button: \"#0BD2D3\" panel_layer1: \"#F990E8\" panel_layer2: \"#0BD2D3\" panel_glossary: \"#F990E8\" fonts: headings: \"'Limelight', serif\" body: \"'Inter', sans-serif\"", + "name: \"Miami\"", + "creator: \"Material/Image Research Lab\" creator: \"Jeff\"", + "creator_url: \"https://mirl.ucsb.edu\" creator_url: \"https://github.com/mirl-ucsb\"", + "description: \"Retro Cool. Digital Heat.\"", + "creator: \"\" creator_url: \"\"", + "Theme \"santa-barbara\": colors.text.button is #FFFFFF, a contrast ratio of 1.69:1 on its #FEBC11 background, below the 4.5:1 that text needs. Telar used #003660 instead, 7.32:1. To keep your own color, choose a lighter or darker colors.background.button." + ], + "table": [ + "Clave Uso colors.text.heading Todos los niveles de encabezado colors.text.body Texto del cuerpo colors.text.link Enlaces colors.text.button Texto de los botones colors.text.panel_layer1 Texto del panel de la capa 1 colors.text.panel_layer2 Texto del panel de la capa 2 colors.text.panel_glossary Texto del panel del glosario colors.background.button Fondo de los botones colors.background.panel_layer1 Fondo del panel de la capa 1 colors.background.panel_layer2 Fondo del panel de la capa 2 colors.background.panel_glossary Fondo del panel del glosario", + "Clave Uso fonts.headings h1–h6, títulos de página fonts.body Párrafos, listas, texto general" + ], + "blockquote": [ + "Telar solo lee las claves que aparecen aquí. Un archivo con otros nombres de clave se carga sin errores, pero no cambia nada: tu sitio se ve con los colores predeterminados. La salida del build nombra las claves que Telar buscó y no encontró.", + "Telar revisa el contraste del texto sobre los cuatro fondos de colors.background. Consulta Accesibilidad del color." + ], + "img": [] + }, + "text": "Temas Temas Telar incluye cinco temas visuales listos para usar, y puedes cambiarlos desde _config.yml . Temas disponibles Trama (predeterminado) La identidad visual de Telar, diseñada por Adelaida Ávila. Terracota y lavanda, con encabezados en Space Grotesk. Colores: Encabezados: gris oscuro #333333 Enlaces y botones: terracota #883C36 Paneles: lavanda #C6D0F8 y terracota #883C36 Glosario: crema #FFF6EF Tipografía: encabezados en Space Grotesk, cuerpo en Roboto Condensed. Ideal para: la mayoría de las exhibiciones; es el tema más versátil. Paisajes Coloniales Colores de tierra y cielo, del proyecto Paisajes Coloniales . Azul pizarra y ciruela, con encabezados en Playfair Display. Colores: Encabezados y botones: azul pizarra #2c3e50 Enlaces: marrón cuero #8b4513 Paneles: azul pálido #A8C5D4 y ciruela #3d2645 Glosario: arena #F5EDE1 Tipografía: encabezados en Playfair Display, cuerpo en Source Sans Pro. Ideal para: narrativas históricas y exhibiciones arqueológicas. Neogranadina Verde y carmesí encendidos sobre carbón, con IM Fell, una tipografía tomada de los punzones de una imprenta del siglo XVII. Colores: Encabezados: negro #000000 Enlaces: coral #D35F3A Botones: carbón #2A2F36 Paneles: verde #00b35c y carmesí #b31235 Glosario: blanco hueso #F5F7FA Tipografía: encabezados en IM Fell DW Pica, cuerpo en Mulish. Ideal para: materiales de archivo. Santa Barbara Dorado y azul marino, los colores de la Universidad de California en Santa Bárbara, con encabezados en Roboto Serif. Colores: Encabezados: azul marino #003660 Enlaces: verde azulado #047C91 Botones: dorado #FEBC11 Paneles: verde azulado #047C91 y azul marino #003660 Glosario: piedra #F1EEEA Tipografía: encabezados en Roboto Serif, cuerpo en Nunito Sans. Ideal para: imágenes en escala de grises y monocromas. Austin El naranja quemado de la Universidad de Texas en Austin, con verde salvia y piedra, y encabezados en Crimson Pro. Colores: Encabezados, enlaces y botones: naranja quemado #BF5700 Paneles: gris azulado #9CADB7 y verde salvia #577565 Glosario: piedra #D6D2C4 Tipografía: encabezados en Crimson Pro, cuerpo en Inter. Ideal para: materiales contemporáneos. Cambia temas Edita _config.yml en tu repositorio: telar_theme: \"santa-barbara\" # Opciones: trama, paisajes, neogranadina, santa-barbara, austin Confirma el cambio y GitHub Actions reconstruirá tu sitio automáticamente (2-5 minutos). Crea temas personalizados Paso 1: crea un archivo de tema Crea el archivo _data/themes/custom.yml . Los colores se agrupan en colors.text y colors.background , y las fuentes en fonts : name: \"Mi tema\" colors: text: heading: \"#1a1a1a\" # Encabezados body: \"#333333\" # Texto del cuerpo link: \"#883C36\" # Enlaces button: \"#FFFFFF\" # Texto de los botones panel_layer1: \"#333333\" # Texto del panel de la capa 1 panel_layer2: \"#FFFFFF\" # Texto del panel de la capa 2 panel_glossary: \"#333333\" # Texto del panel del glosario background: button: \"#883C36\" # Fondo de los botones panel_layer1: \"#C6D0F8\" # Fondo del panel de la capa 1 panel_layer2: \"#883C36\" # Fondo del panel de la capa 2 panel_glossary: \"#FFF6EF\" # Fondo del panel del glosario fonts: headings: \"'Playfair Display', Georgia, serif\" body: \"'Source Sans Pro', -apple-system, sans-serif\" Lo más rápido es copiar uno de los temas que ya vienen en _data/themes/ y cambiarle los valores. Todas las claves son opcionales: la que no pongas toma el valor de Trama. Telar solo lee las claves que aparecen aquí. Un archivo con otros nombres de clave se carga sin errores, pero no cambia nada: tu sitio se ve con los colores predeterminados. La salida del build nombra las claves que Telar buscó y no encontró. Paso 2: activa el tema personalizado En _config.yml : telar_theme: \"custom\" Paso 3: prueba y refina Confirma cambios Espera a que se construya el sitio Revisa tu sitio Ajusta colores y fuentes según sea necesario Claves de color del tema Todos los temas admiten estas claves de color: Clave Uso colors.text.heading Todos los niveles de encabezado colors.text.body Texto del cuerpo colors.text.link Enlaces colors.text.button Texto de los botones colors.text.panel_layer1 Texto del panel de la capa 1 colors.text.panel_layer2 Texto del panel de la capa 2 colors.text.panel_glossary Texto del panel del glosario colors.background.button Fondo de los botones colors.background.panel_layer1 Fondo del panel de la capa 1 colors.background.panel_layer2 Fondo del panel de la capa 2 colors.background.panel_glossary Fondo del panel del glosario Telar revisa el contraste del texto sobre los cuatro fondos de colors.background . Consulta Accesibilidad del color . Claves de tipografía Estas dos claves controlan las fuentes de todo el sitio: Clave Uso fonts.headings h1–h6, títulos de página fonts.body Párrafos, listas, texto general Ejemplos de fuentes Las dos claves van dentro de fonts , y cada una recibe una lista de fuentes: la que quieres y, después, las que el navegador usa si no puede cargar la primera. Encabezados serif: fonts: headings: \"'Playfair Display', Georgia, serif\" O 'Merriweather', Georgia, serif , o 'Lora', Georgia, serif . Encabezados sans-serif: fonts: headings: \"'Montserrat', Helvetica, sans-serif\" O 'Raleway', Arial, sans-serif . Fuentes del cuerpo: fonts: body: \"'Source Sans Pro', sans-serif\" O 'Open Sans', Helvetica, sans-serif , o 'Crimson Text', Georgia, serif . Usa Google Fonts Para usar fuentes no incluidas por defecto: Encuentra tu fuente en Google Fonts Agrega import a assets/css/telar.scss : @import url('https://fonts.googleapis.com/css2?family=Tu+Fuente:wght@400;600;700&display=swap'); Referencia en archivo de tema: fonts: headings: \"'Tu Fuente', serif\" Atribución de la persona creadora del tema Telar v0.4.0+ permite añadir atribución opcional para reconocer a quienes diseñan temas personalizados en el pie de página del sitio. Agrega atribución a temas personalizados Al crear un tema propio, agrega la información de la persona creadora en tu archivo YAML: name: \"Miami\" description: \"Retro Cool. Digital Heat.\" creator: \"Material/Image Research Lab\" creator_url: \"https://mirl.ucsb.edu\" colors: text: heading: \"#F990E8\" body: \"#000000\" link: \"#0BD2D3\" button: \"#F990E8\" panel_layer1: \"#FFFFFF\" panel_layer2: \"#FFFFFF\" panel_glossary: \"#FFFFFF\" background: button: \"#0BD2D3\" panel_layer1: \"#F990E8\" panel_layer2: \"#0BD2D3\" panel_glossary: \"#F990E8\" fonts: headings: \"'Limelight', serif\" body: \"'Inter', sans-serif\" Campos de atribución Todos los campos son opcionales: name - Nombre visible del tema name: \"Miami\" creator - Persona u organización que diseñó el tema creator: \"Material/Image Research Lab\" creator: \"Jeff\" creator_url - Sitio web o perfil para enlazar la atribución creator_url: \"https://mirl.ucsb.edu\" creator_url: \"https://github.com/mirl-ucsb\" description - Nota breve sobre el diseño (uso interno) description: \"Retro Cool. Digital Heat.\" Cómo se muestra la atribución Cuando agregas información de atribución, aparece en el pie de página: Con nombre y creadora: \"Miami theme by MIRL Lab\" (enlazado a creator_url si existe) Solo con creadora: \"Theme by MIRL Lab\" Solo con nombre: \"Miami theme\" Sin ninguno: No se muestra atribución Atribución para temas predeterminados Todos los temas incluidos en Telar traen atribución por defecto: Trama Creador: Telar URL: https://telar.org Paisajes Coloniales Creador: Neogranadina URL: https://neogranadina.org Neogranadina Creador: Neogranadina URL: https://neogranadina.org Santa Barbara Creador: AMPL en UC Santa Barbara URL: https://ampl.clair.ucsb.edu Austin Creador: AMPL en UT Austin URL: https://liberalarts.utexas.edu/history/ Comparte temas personalizados Si quieres compartir un tema con la comunidad de Telar: Incluye metadatos completos de atribución Documenta la paleta de colores y la lógica del diseño Describe recomendaciones de uso (ej., ideal para imágenes en escala de grises) Compártelo en el foro Telar Discussions Quitar la atribución Si prefieres usar un tema sin atribución: Omite los campos creator y creator_url en el archivo del tema O asígnales cadenas vacías: creator: \"\" creator_url: \"\" No se mostrará ninguna atribución en el pie de página. Accesibilidad del color Cada tema empareja un color de texto con un fondo: colors.text.panel_layer1 va sobre colors.background.panel_layer1 , y así con los demás. Cuando los dos se parecen demasiado en brillo, cuesta leer el texto. Cómo revisa Telar tus colores Al construir el sitio, Telar calcula un color de texto que alcance una relación de contraste de 4,5:1 sobre cada uno de los cuatro fondos: button , panel_layer1 , panel_layer2 y panel_glossary . Ese es el nivel AA de WCAG para texto de tamaño normal. Telar también calcula el color del texto que va sobre colors.text.heading allí donde ese color se usa como fondo, como en las etiquetas de los filtros activos de la página de objetos. Ese color de texto no se escoge en el archivo del tema, así que ahí Telar no reemplaza ninguna decisión tuya. Telar empieza por el color que escogiste y lo conserva siempre que llegue a 4,5:1, así que un tema cuyos colores cumplen se ve tal como lo escribiste. Solo cuando ese color no alcanza el nivel, Telar busca otro, en este orden: colors.text.heading o colors.text.button , el que tenga mayor contraste sobre ese fondo blanco o negro, el que tenga mayor contraste Cuando Telar reemplaza un color Telar escribe una línea en la salida del build por cada color que reemplaza: Theme \"santa-barbara\": colors.text.button is #FFFFFF, a contrast ratio of 1.69:1 on its #FEBC11 background, below the 4.5:1 that text needs. Telar used #003660 instead, 7.32:1. To keep your own color, choose a lighter or darker colors.background.button. El mensaje aparece en inglés. Si todos los colores del tema cumplen, no aparece ninguna línea. Para conservar el color que querías, cambia el fondo en vez del texto. Lo que Telar no revisa De esto te encargas tú: El texto del cuerpo sobre el fondo de la página Los colores de enlace ( colors.text.link ) El texto grande (de 18 px o más) , que necesita 3:1 y no 4,5:1 Los elementos interactivos , que deben seguir siendo distinguibles Para revisarlos, usa herramientas como el WebAIM Contrast Checker . Los colores que Telar no puede leer Telar solo lee colores hexadecimales, como #FFFFFF o #FFF . Un color con nombre como white , o un valor rgb() , queda tal como lo escribiste: Telar no lo revisa y lo anota en la salida del build . Cuando falta el tema o una de sus claves Si Telar no encuentra el archivo de tema que nombraste en _config.yml , vuelve al tema Trama y el sitio no se rompe. Si el archivo existe, Telar lo usa, incluso si no reconoce ninguno de los nombres de clave que trae. Cada clave que no pusiste toma el valor de Trama, y la salida del build dice cuáles faltan. Próximos pasos Estilos avanzados para personalización más profunda Configuración para otros ajustes del sitio Ver temas de ejemplo en acción" + }, + "/guia/primeros-pasos/compositor/": { + "ids": [ + "conecta-un-repositorio-existente", + "crea-un-sitio-nuevo", + "empieza-aquí", + "lo-que-necesitas", + "media-create-site-guia-primeros-pasos-compositor", + "media-editor-overview-guia-primeros-pasos-compositor", + "qué-puedes-hacer-con-el-compositor", + "siguientes-pasos", + "usa-el-compositor" + ], + "selectors": { + "h1": [ + "Usa el Compositor" + ], + "h2": [ + "Lo que necesitas", + "Empieza aquí", + "Qué puedes hacer con el Compositor", + "Siguientes pasos" + ], + "h3": [ + "Crea un sitio nuevo", + "Conecta un repositorio existente" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [ + "El repositorio será público. GitHub Pages requiere un repositorio público a menos que tengas un plan pago de GitHub." + ], + "img": [ + [ + "/assets/manual/tutorials/es-create-site.jpg", + "El formulario del sitio con nombre de repositorio, título visible, idioma y tema." + ], + [ + "/images/use-this-template.png", + "Captura de GitHub: botón Use this template" + ], + [ + "/images/github-actions.gif", + "Configurando GitHub Pages con GitHub Actions" + ], + [ + "/assets/manual/tutorials/es-editor-overview.jpg", + "El esquema de la historia, la tarjeta del paso y el visor del khipu en el Compositor." + ] + ] + }, + "text": "Usa el Compositor El Compositor de Telar es una herramienta visual para construir exhibiciones. Puedes agregar objetos, escribir historias, organizar pasos y previsualizar tu sitio — todo en el navegador, sin necesidad de programar. Cuando estés listo, el Compositor publica un sitio Telar completo en GitHub Pages. Lo que necesitas Una cuenta de GitHub (gratis) Imágenes, videos o archivos de audio para la exhibición Empieza aquí Ve a compositor.telar.org e inicia sesión con tu cuenta de GitHub. El Compositor te pedirá instalar la aplicación Telar Compositor en GitHub — esto le da permiso para crear y administrar repositorios en tu nombre. Una vez que hayas iniciado sesión, tienes dos opciones: Crea un sitio nuevo Abre el menú de proyectos y elige Agregar o crear un repositorio ; después, Un sitio de Telar . Escribe un nombre de repositorio y un título visible, y elige el idioma y el tema. Usa un nombre breve, en minúsculas y con guiones, como mi-exhibicion . Pulsa Crear sitio cuando estén listos esos datos. El Compositor crea el repositorio con la plantilla de Telar y prepara el sitio para editarlo. El repositorio será público. GitHub Pages requiere un repositorio público a menos que tengas un plan pago de GitHub. Elige el nombre del repositorio, el título, el idioma y el tema antes de crear el sitio. Ampliar captura ↗ Conecta un repositorio existente Si ya creaste un repositorio a partir de la plantilla de Telar o tienes un sitio Telar existente, selecciónalo de la lista y el Compositor importará tu contenido. Configuración manual: crea un repositorio en GitHub primero Si prefieres crear el repositorio tú mismo antes de conectarlo: Visita la plantilla de Telar Haz clic en el botón verde Use this template Elige Create a new repository Dale un nombre a tu repositorio — usa letras minúsculas y guiones (ej., mi-exhibicion ) Asegúrate de que Public esté seleccionado Haz clic en Create repository Luego habilita GitHub Pages: En tu repositorio, ve a Settings → Pages En Source , selecciona GitHub Actions Haz clic en Save Una vez hecho, vuelve a compositor.telar.org y conecta el repositorio. Qué puedes hacer con el Compositor Editar historias visualmente — agregar pasos, escribir texto, ajustar coordenadas de imagen y previsualizar la narrativa en tiempo real Subir imágenes — arrastra y suelta imágenes directamente; las teselas IIIF se generan de forma automática Agregar video y audio — inserta videos de YouTube, Vimeo o Google Drive, y archivos de audio autoalojados con controles de clip Publicar con un clic — revisa los cambios, haz commit a GitHub y sigue el estado del build sin salir del editor Para la guía completa, véase El Compositor . A la izquierda está el esquema; en el centro, el texto del paso; a la derecha, el objeto. Capturar posición guarda la vista del paso seleccionado. Ampliar captura ↗ Siguientes pasos Sigue con el recorrido de autoría visual: Objetos — Agrega fuentes y revisa sus metadatos. Usar un objeto IIIF en una historia — Sigue el ejemplo ilustrado del khipu. Editor de historias — Escribe pasos, captura vistas y desarrolla paneles. Publicación — Revisa los cambios y comprueba el sitio generado." + }, + "/guia/el-compositor/": { + "ids": [ + "antes-de-comenzar", + "cómo-funciona", + "el-compositor", + "en-esta-sección", + "las-partes-de-una-exhibición", + "manual-del-compositor", + "qué-es-el-compositor", + "requisitos" + ], + "selectors": { + "h1": [ + "Manual del Compositor" + ], + "h2": [ + "Las partes de una exhibición", + "Cómo funciona", + "Antes de comenzar", + "Comenzar", + "Fuentes e historias", + "La exhibición", + "Equipo y cursos", + "Publicar y mantener" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Manual del Compositor El Compositor de Telar es una herramienta de autoría visual para crear y administrar exhibiciones en Telar. Funciona en tu navegador en compositor.telar.org , donde puedes entretejer imágenes, video, audio y texto en narrativas visuales por capas sin escribir código. Puedes usarlo para proyectos de humanidades digitales, exhibiciones públicas, narrativas comunitarias y proyectos en el salón de clase, de forma individual o con un equipo. La interfaz está disponible en español e inglés. Telar proporciona el marco para la exhibición que explora tu público. El Compositor te ofrece un espacio de trabajo para reunir su contenido, previsualizar las historias y publicar el sitio. El contenido y la configuración del sitio publicado se conservan como archivos en un repositorio de GitHub. Las partes de una exhibición Los objetos son tus materiales de trabajo: imágenes, video o audio, con sus descripciones, fuentes y créditos. Las historias guían al público por esos materiales mediante una secuencia de pasos . Cada paso combina texto narrativo con un encuadre de un objeto o un fragmento de video o audio. Los paneles y las entradas del glosario ofrecen contexto adicional que el público puede abrir durante el recorrido. La página de inicio y las páginas de apoyo presentan la exhibición y ayudan al público a orientarse. Puedes administrar todo esto desde el Compositor, junto con la apariencia y la navegación del sitio. Cómo funciona Comienza un sitio. Crea un sitio Telar nuevo o conecta uno que ya tengas. Compón tu exhibición. Agrega las fuentes, escribe las historias, elige los detalles que mostrará cada paso y desarrolla el contexto. Revisa y publica. Comprueba tu trabajo y publica los cambios en GitHub. Después, Telar genera el sitio web público. Tu trabajo se guarda mientras editas. Publicar es una acción aparte, así que puedes desarrollar un borrador antes de actualizar el sitio público. Después de publicar, revisa el sitio cuando termine de generarse. Antes de comenzar Necesitas una cuenta de GitHub. La guía del primer sitio te acompaña al iniciar sesión, dar acceso a la aplicación de Telar en GitHub y crear un sitio. Si ya tienes un repositorio de Telar, sigue Conectar un sitio existente . Si todavía estás desarrollando tu idea, empieza por Planear una exhibición . Para un primer ejercicio práctico, el recorrido ilustrado del khipu lleva una imagen de una colección IIIF hasta un paso de una historia y muestra cómo guardar su encuadre. Comenzar Usa el Compositor Conectar un sitio existente Inicio y navegación Fuentes e historias Objetos Usar un objeto IIIF en una historia Editor de historias Video y audio La exhibición Crea y enlaza entradas del glosario Organiza el inicio y las páginas Ajusta la apariencia y la configuración Equipo y cursos Trabaja en equipo Organiza un curso con sitios de estudiantes Publicar y mantener Publicación Sincronización y actualizaciones Resuelve problemas y recupera historias" + }, + "/guia/tu-contenido/historias-paneles/": { + "ids": [ + "archivos-markdown-de-las-historias", + "botón-de-volver-al-comienzo", + "campos-requeridos", + "capas-de-los-paneles", + "compartir-y-enlaces-profundos", + "construir-los-pasos-de-la-historia", + "control-de-clips", + "controlar-la-visualización-de-las-historias", + "coordenadas", + "cómo-funciona-la-experiencia-de-desplazamiento", + "elegir-el-método-correcto", + "escribir-contenido-para-los-paneles", + "historias-y-paneles", + "método-1-introducir-texto-directamente", + "método-2-pegar-texto-markdown", + "método-3-indicar-un-archivo-markdown", + "navegación-por-teclado", + "ocultar-historias-de-la-página-principal", + "ocultar-indicadores-de-paso", + "pasos-multimedia", + "qué-se-puede-usar-en-los-paneles", + "registrar-historias", + "tabla-de-contenidos-de-secciones", + "tarjetas-de-título", + "texto-alternativo", + "título-del-panel", + "véase-también" + ], + "selectors": { + "h1": [ + "Historias y paneles" + ], + "h2": [ + "Cómo funciona la experiencia de desplazamiento", + "Registrar historias", + "Construir los pasos de la historia", + "Tarjetas de título", + "Capas de los paneles", + "Escribir contenido para los paneles", + "Archivos Markdown de las historias", + "Pasos multimedia", + "Control de clips", + "Texto alternativo", + "Navegación por teclado", + "Compartir y enlaces profundos", + "Controlar la visualización de las historias", + "Véase también" + ], + "h3": [ + "Campos requeridos", + "Coordenadas", + "Tabla de contenidos de secciones", + "Botón de volver al comienzo", + "Método 1: introducir texto directamente", + "Método 2: pegar texto Markdown", + "Método 3: indicar un archivo Markdown", + "Elegir el método correcto", + "Título del panel", + "Qué se puede usar en los paneles", + "Ocultar historias de la página principal", + "Ocultar indicadores de paso" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "order,story_id,title,subtitle,byline 1,textiles-coloniales,Textiles Coloniales,Tradiciones de tejido de las Américas,por Dra. María García", + "step,object,x,y,zoom,question,answer,layer1_content 1,textile-001,0.5,0.3,0.8,¿Qué es este textil?,Un fragmento colonial con patrones complejos de tejido,Este fragmento data de mediados del siglo XVII... 2,textile-001,0.2,0.7,0.4,¿Qué significa este patrón?,Un diseño de urdimbre entrelazada usado en telas ceremoniales,El patrón ha sido identificado como... 3,map-lima,0.5,0.5,1.0,¿Dónde se encontraron estos textiles?,En el centro histórico de Lima,Las excavaciones arqueológicas de los años 1990...", + "paso,objeto,x,y,zoom,pregunta,respuesta 1,textile-001,0.5,0.3,0.8,¿Qué es este textil?,Un fragmento colonial con patrones complejos de tejido. 2,,,,,Capítulo 2: Rutas comerciales,El movimiento de textiles a través de las Américas. 3,map-lima,0.5,0.5,1.0,¿Dónde se encontraron?,En el centro histórico de Lima.", + "layer1_content \"Este fragmento muestra **técnicas avanzadas de tejido** del periodo colonial.\"", + "layer1_content textiles-coloniales/step1-layer1.md", + "telar-content/texts/stories/ ├── textiles-coloniales/ │ ├── step1-layer1.md │ ├── step1-layer2.md │ ├── step2-layer1.md │ └── step2-layer2.md └── rutas-comerciales/ ├── step1-layer1.md └── step1-layer2.md", + "--- title: \"Técnicas de tejido\" --- El patrón de urdimbre entrelazada visible aquí indica una técnica de tejido compleja que era común en el periodo colonial.", + "step,object,clip_start,clip_end,loop,question,answer 1,interview-01,45,78,false,¿Qué describe ella?,La técnica de tejido utilizada en su comunidad. 2,field-recording,0,30,true,¿Qué sonidos rodean el taller?,El golpeteo rítmico del telar llena el espacio.", + "step,object,x,y,zoom,alt_text,question,answer 1,textile-001,0.5,0.3,0.8,Primer plano de hilos de urdimbre entrelazados en rojo y dorado,¿Qué es este textil?,Un fragmento colonial con patrones complejos de tejido.", + "story_interface: show_on_homepage: false", + "story_interface: show_story_steps: false" + ], + "table": [ + "Capa Texto predeterminado del botón Propósito Capa 1 \"Saber más\" Panel de detalle principal Capa 2 \"Profundizar más\" Panel de detalle secundario, que se abre sobre la capa 1", + "Escenario Método recomendado Explicación corta (1–2 párrafos) Método 1: Introducir directamente Panel con título personalizado o widgets Método 2: Pegar, o Método 3: Archivo Contenido con widgets (acordeón, pestañas, carrusel) Método 3: Archivo Mismo contenido usado en varios lugares Método 3: Archivo Ediciones rápidas sin salir de la hoja de cálculo Método 1 o 2", + "Columna (inglés) Columna (español) Descripción clip_start inicio_clip Tiempo de inicio en segundos (p. ej., 12.5) clip_end fin_clip Tiempo de fin en segundos loop bucle Repetir el clip (true, yes o sí)", + "Fragmento Significado #s3 Paso 3 #s3l1 Paso 3 con el primer panel de detalle abierto" + ], + "blockquote": [ + "El editor de historias del Compositor te permite hacer lo mismo sin editar las hojas de cálculo a mano: construir y reordenar pasos, configurar coordenadas y previsualizar la historia sin salir del navegador.", + "Si el primer capítulo comienza inmediatamente después de la tarjeta de inicio, crea también una tarjeta de título para ese capítulo. La tabla de contenidos solo lista las tarjetas de título que existan en el CSV de la historia — si el capítulo 1 no tiene tarjeta de título, no aparecerá en la tabla de contenidos.", + "Los tres métodos que siguen son para quien trabaja en una hoja de cálculo. En el Compositor, el título del panel tiene su propio campo, y todo lo que pegues en el campo Contenido —incluido un bloque ---— se publica como parte del texto del panel, no como título.", + "Si copias y pegas desde Microsoft Word, Google Docs o aplicaciones similares, el formato no se conservará. Escribe directamente en sintaxis Markdown — consulta la Guía de sintaxis Markdown.", + "Esto vale para los paneles que se escriben en una hoja de cálculo o en un archivo Markdown. En el Compositor, el título del panel tiene su propio campo, y un bloque --- que pegues en el campo Contenido se publica como parte del texto del panel, no como título.", + "También puedes fijar los tiempos del clip de forma visual en el Compositor. Consulta Video y audio en el Compositor para más detalles.", + "El texto alternativo de cada paso también se puede configurar en el editor de pasos del Compositor.", + "El botón de retroceso del navegador regresa a la página anterior — no al paso anterior. Los enlaces profundos están diseñados para compartir posiciones, no para navegar dentro de una historia." + ], + "img": [ + [ + "/images/story-viewer.png", + "Página de una historia con una tarjeta de texto sobre el visor IIIF" + ], + [ + "/images/coordinate-picker.png", + "Selector de coordenadas mostrando valores X, Y y Zoom debajo del visor de imágenes" + ] + ] + }, + "text": "Historias y paneles Las historias son narrativas que se leen desplazándose y se construyen en torno a los objetos. Cada historia lleva al público por una secuencia de pasos — que enfocan regiones concretas de las imágenes, momentos de los videos o segmentos de las grabaciones de audio — con pares de pregunta y respuesta y paneles de detalle expandibles. El editor de historias del Compositor te permite hacer lo mismo sin editar las hojas de cálculo a mano: construir y reordenar pasos, configurar coordenadas y previsualizar la historia sin salir del navegador. Cómo funciona la experiencia de desplazamiento Una historia llena la ventana del navegador. El objeto — ya sea una imagen en el visor IIIF, un reproductor de video o uno de audio — ocupa todo el fondo. A medida que se avanza en la historia, las tarjetas de texto pasan por encima una tras otra, en lugar de quedar apiladas. El desplazamiento es continuo con puntos de anclaje magnético . En lugar de saltar de un paso a otro, el público se desplaza con naturalidad por la historia. La vista se ancla magnéticamente a cada paso, de modo que la tarjeta de texto y la posición del objeto se mantienen sincronizadas. En los teléfonos y las tabletas en orientación vertical, la tarjeta de texto va anclada al borde inferior de la pantalla, encima de la parte baja del objeto. Cada paso: Enfoca una parte específica de un objeto (usando coordenadas x, y y zoom para imágenes, o tiempos de clip para video y audio) Muestra una pregunta y una breve respuesta en la tarjeta de texto Puede ofrecer hasta dos capas adicionales de detalle mediante botones expandibles Registrar historias Antes de construir los pasos de una historia, regístrala en project.csv : order,story_id,title,subtitle,byline 1,textiles-coloniales,Textiles Coloniales,Tradiciones de tejido de las Américas,por Dra. María García El story_id determina el nombre del archivo CSV de la historia y su URL. Con story_id: textiles-coloniales , Telar busca telar-content/spreadsheets/textiles-coloniales.csv y sirve la historia en /stories/textiles-coloniales/ . Si se omite story_id , Telar usa story-{order} (p. ej., story-1.csv si order es 1). Consulta la Referencia CSV: Proyecto para todas las columnas de project.csv. Construir los pasos de la historia Cada historia tiene su propio archivo CSV en telar-content/spreadsheets/ . El archivo define los pasos en secuencia: step,object,x,y,zoom,question,answer,layer1_content 1,textile-001,0.5,0.3,0.8,¿Qué es este textil?,Un fragmento colonial con patrones complejos de tejido,Este fragmento data de mediados del siglo XVII... 2,textile-001,0.2,0.7,0.4,¿Qué significa este patrón?,Un diseño de urdimbre entrelazada usado en telas ceremoniales,El patrón ha sido identificado como... 3,map-lima,0.5,0.5,1.0,¿Dónde se encontraron estos textiles?,En el centro histórico de Lima,Las excavaciones arqueológicas de los años 1990... Campos requeridos Cada paso necesita: step — Número secuencial (1, 2, 3...) sin saltos object — Un object_id de la hoja de cálculo de objetos. Déjalo vacío para crear una tarjeta de título x , y , zoom — El encuadre del paso (ver abajo). Se ignoran en tarjetas de título question — El encabezado que se muestra en la tarjeta de texto answer — Una respuesta breve debajo de la pregunta Coordenadas Las coordenadas le indican al visor dónde enfocar en cada paso. Los valores de x y y van de 0 a 1: x — Posición horizontal. 0 = borde izquierdo, 0.5 = centro, 1 = borde derecho y — Posición vertical. 0 = borde superior, 0.5 = centro, 1 = borde inferior zoom — Nivel de zoom. Con 1 se ve el objeto completo. Con valores mayores, la vista se acerca al punto que indican x y y : con 2 se ve más o menos la mitad del objeto. Ese punto queda en el centro de la vista, salvo cerca de un borde, porque la vista no pasa del borde del objeto. Con valores menores que 1, hasta 0.1, el objeto completo se ve más pequeño y centrado. Para encontrar coordenadas, usa el selector de coordenadas en cualquier página de objeto: amplía y desplázate hasta la región que deseas, luego haz clic en los botones Copy para copiar los valores x, y y zoom directamente a tu hoja de cálculo. Tarjetas de título Las tarjetas de título son pasos de solo texto, sin objeto asociado. Funcionan bien como encabezados de capítulo, separadores de sección o transiciones temáticas dentro de una historia. Para crear una tarjeta de título, deja vacía la columna objeto . Las columnas x , y y zoom se ignoran. El campo pregunta se convierte en el encabezado de la tarjeta y respuesta en el subtítulo. paso,objeto,x,y,zoom,pregunta,respuesta 1,textile-001,0.5,0.3,0.8,¿Qué es este textil?,Un fragmento colonial con patrones complejos de tejido. 2,,,,,Capítulo 2: Rutas comerciales,El movimiento de textiles a través de las Américas. 3,map-lima,0.5,0.5,1.0,¿Dónde se encontraron?,En el centro histórico de Lima. Las tarjetas de título participan plenamente en la navegación — el desplazamiento, el teclado y los enlaces profundos funcionan como se espera. Las tarjetas de título no admiten paneles de capas — las columnas de capa se ignoran, igual que x , y y zoom . Tabla de contenidos de secciones Si la historia usa tarjetas de título como encabezados de capítulo, se puede mostrar una tabla de contenidos navegable en la tarjeta de inicio. Actívala agregando mostrar_secciones: si (o show_sections: yes ) en la fila de la historia en project.csv . Cuando está activada, la tarjeta de inicio recorre la historia en busca de tarjetas de título y las lista como enlaces. Al hacer clic en uno se salta directamente a esa sección. La tarjeta de inicio también cambia a un fondo más oscuro (el color del panel de nivel 2) para distinguirla visualmente. Si el primer capítulo comienza inmediatamente después de la tarjeta de inicio, crea también una tarjeta de título para ese capítulo. La tabla de contenidos solo lista las tarjetas de título que existan en el CSV de la historia — si el capítulo 1 no tiene tarjeta de título, no aparecerá en la tabla de contenidos. Consulta Columnas del proyecto para la referencia de la columna mostrar_secciones . Botón de volver al comienzo Cuando se avanza más allá de la tarjeta de inicio, el botón Volver al inicio de la esquina superior izquierda cambia a Comienzo . Al hacer clic regresa a la tarjeta de inicio. En la tarjeta de inicio, el botón vuelve a mostrar \"Volver al inicio\" y enlaza a la página principal. Esto es automático — no requiere configuración. Capas de los paneles Cada paso puede tener hasta dos capas de detalle adicional, siguiendo el patrón QAI (pregunta, respuesta, invitación). La pregunta y la respuesta aparecen en la tarjeta de texto. La invitación es el conjunto de botones que abren paneles expandibles con contenido más profundo: Capa Texto predeterminado del botón Propósito Capa 1 \"Saber más\" Panel de detalle principal Capa 2 \"Profundizar más\" Panel de detalle secundario, que se abre sobre la capa 1 Para cada capa, agrega dos columnas a la hoja de cálculo de tu historia: Texto del botón ( layer1_button , layer2_button ) — Déjalo vacío para usar el texto predeterminado, o escribe un texto propio como \"Ver la técnica\" o \"Leer la fuente\" Contenido ( layer1_content , layer2_content ) — El contenido del panel Si una capa no tiene contenido, su botón se oculta automáticamente. A la capa 2 se entra desde la capa 1: su botón aparece al final del panel de la Capa 1, no en la tarjeta de texto principal. Escribir contenido para los paneles Puedes escribir el contenido de los paneles de tres maneras. Elige según la complejidad del contenido: Los tres métodos que siguen son para quien trabaja en una hoja de cálculo. En el Compositor, el título del panel tiene su propio campo, y todo lo que pegues en el campo Contenido —incluido un bloque --- — se publica como parte del texto del panel, no como título. Método 1: introducir texto directamente Escribe el texto directamente en la celda de la hoja de cálculo. Ideal para paneles cortos (1–2 párrafos). layer1_content \"Este fragmento muestra **técnicas avanzadas de tejido** del periodo colonial.\" Puedes usar formato básico: **negrita** , *cursiva* , [texto del enlace](url) y enlaces de glosario ( [[term-id]] ). Para saltos de línea dentro de una celda: Google Sheets : Presiona Ctrl+Enter (Windows/Linux) u Option+Enter (macOS) Archivos CSV : Usa saltos de línea reales dentro de texto entre comillas Alternativa : Usa etiquetas HTML
Método 2: pegar texto Markdown Pega texto escrito en un editor de texto plano. Así puedes usar todas las funciones de Markdown: encabezados, widgets (acordeón, carrusel, pestañas), control del tamaño de las imágenes y un título de panel propio con frontmatter YAML. Si copias y pegas desde Microsoft Word, Google Docs o aplicaciones similares, el formato no se conservará. Escribe directamente en sintaxis Markdown — consulta la Guía de sintaxis Markdown . Método 3: indicar un archivo Markdown Indica la ruta a un archivo Markdown en el repositorio. Ideal para paneles complejos — sobre todo los que llevan widgets o contenido que se quiera reutilizar en varios pasos. layer1_content textiles-coloniales/step1-layer1.md Guarda los archivos Markdown en telar-content/texts/stories/ . En la hoja de cálculo, ingresa solo el nombre del archivo — o si los archivos están organizados en subcarpetas, incluye el nombre de la subcarpeta. Cómo decide Telar : si el valor termina en .md y ese archivo existe, Telar carga el archivo; si no, trata el valor como contenido. Elegir el método correcto Escenario Método recomendado Explicación corta (1–2 párrafos) Método 1: Introducir directamente Panel con título personalizado o widgets Método 2: Pegar, o Método 3: Archivo Contenido con widgets (acordeón, pestañas, carrusel) Método 3: Archivo Mismo contenido usado en varios lugares Método 3: Archivo Ediciones rápidas sin salir de la hoja de cálculo Método 1 o 2 Archivos Markdown de las historias Al usar el Método 3 (archivos), los archivos Markdown de las historias se ubican en telar-content/texts/stories/ : telar-content/texts/stories/ ├── textiles-coloniales/ │ ├── step1-layer1.md │ ├── step1-layer2.md │ ├── step2-layer1.md │ └── step2-layer2.md └── rutas-comerciales/ ├── step1-layer1.md └── step1-layer2.md Organizar los archivos en subcarpetas por historia facilita el manejo a medida que crece el sitio. Título del panel Agrega un título de panel personalizado usando frontmatter YAML: --- title: \"Técnicas de tejido\" --- El patrón de urdimbre entrelazada visible aquí indica una técnica de tejido compleja que era común en el periodo colonial. Si omites el frontmatter, el panel no tiene título — el contenido comienza de inmediato. Esto vale para los paneles que se escriben en una hoja de cálculo o en un archivo Markdown. En el Compositor, el título del panel tiene su propio campo, y un bloque --- que pegues en el campo Contenido se publica como parte del texto del panel, no como título. Qué se puede usar en los paneles Los paneles de las historias admiten: Markdown estándar (encabezados, negrita, cursiva, enlaces, listas, imágenes) Widgets (carrusel, pestañas, acordeón) Autoenlaces de glosario ( [[term-id]] ) Imágenes con controles de tamaño (consulta la Guía de sintaxis Markdown ) Pasos multimedia Los pasos de una historia pueden hacer referencia a cualquier tipo de objeto — no solo imágenes. Cuando un paso apunta a un objeto de video o audio, en lugar del visor de imágenes aparece el reproductor correspondiente. Objetos de video — El reproductor de video llena la ventana detrás de las tarjetas de texto, con controles de reproducción estándar. Consulta Objetos de video para las plataformas compatibles y la configuración. Objetos de audio — El reproductor de audio llena la ventana detrás de las tarjetas de texto y muestra la forma de onda. Consulta Objetos de audio para los formatos compatibles y la configuración. No se necesita configuración adicional. Telar detecta el tipo de objeto en la hoja de cálculo de objetos y carga el reproductor que corresponde. Control de clips En los pasos de video y audio puedes fijar un tiempo de inicio, un tiempo de fin y la repetición en bucle. Agrega estas columnas a la hoja de cálculo de la historia: Columna (inglés) Columna (español) Descripción clip_start inicio_clip Tiempo de inicio en segundos (p. ej., 12.5 ) clip_end fin_clip Tiempo de fin en segundos loop bucle Repetir el clip ( true , yes o sí ) Las tres columnas son opcionales. Si se omiten, el medio se reproduce desde el inicio sin repetición. step,object,clip_start,clip_end,loop,question,answer 1,interview-01,45,78,false,¿Qué describe ella?,La técnica de tejido utilizada en su comunidad. 2,field-recording,0,30,true,¿Qué sonidos rodean el taller?,El golpeteo rítmico del telar llena el espacio. También puedes fijar los tiempos del clip de forma visual en el Compositor. Consulta Video y audio en el Compositor para más detalles. Consulta la Referencia CSV: Historias para la referencia completa de columnas incluyendo las columnas de clip. Texto alternativo Cada paso puede incluir una columna alt_text con una descripción de lo que se ve o se escucha en ese punto de la historia. Los lectores de pantalla y otras tecnologías de asistencia usan este texto. step,object,x,y,zoom,alt_text,question,answer 1,textile-001,0.5,0.3,0.8,Primer plano de hilos de urdimbre entrelazados en rojo y dorado,¿Qué es este textil?,Un fragmento colonial con patrones complejos de tejido. El texto alternativo de cada paso también se puede configurar en el editor de pasos del Compositor . Navegación por teclado Las historias admiten navegación por teclado. Las teclas de flecha, la barra espaciadora y Page Up/Page Down desplazan la historia, y los puntos de anclaje magnético aseguran que cada pulsación llegue al paso siguiente o anterior. Cuando un panel está abierto, el comportamiento del teclado cambia: Flecha Arriba/Abajo y Page Up/Page Down desplazan el contenido del panel en lugar de navegar entre pasos. La barra espaciadora desplaza el panel hacia adelante y Shift+Espacio lo desplaza hacia atrás. Compartir y enlaces profundos Telar actualiza automáticamente la URL en la barra de direcciones del navegador a medida que se avanza por la historia. La URL codifica el paso actual y cualquier capa de panel abierta, de modo que se puede copiar y compartir un enlace que abra directamente un punto específico de la historia. El fragmento de la URL usa un formato compacto: Fragmento Significado #s3 Paso 3 #s3l1 Paso 3 con el primer panel de detalle abierto Al abrir un enlace profundo, la historia salta directamente al paso codificado y abre el panel si se especificó uno. Esto funciona tanto con la navegación por desplazamiento como con la navegación por botones. El botón de retroceso del navegador regresa a la página anterior — no al paso anterior. Los enlaces profundos están diseñados para compartir posiciones, no para navegar dentro de una historia. Controlar la visualización de las historias Ocultar historias de la página principal Si deseas tener objetos en la página principal pero prefieres que a las historias se llegue por la navegación o enlaces directos: story_interface: show_on_homepage: false Las historias siguen accesibles en sus URL — solo se ocultan las tarjetas de la página principal. Ocultar indicadores de paso Los indicadores Paso 1 , Paso 2 de la esquina superior izquierda de la página de la historia se pueden ocultar para una vista más despejada: story_interface: show_story_steps: false Quien lee puede seguir navegando por los pasos con normalidad. Véase también Referencia CSV: Historias — Referencia completa de columnas para las hojas de cálculo de historias Objetos — Definir los objetos usados en las historias Objetos de video — Agregar objetos de video desde YouTube, Vimeo y Google Drive Objetos de audio — Agregar archivos de audio autoalojados Widgets — Carrusel, pestañas y acordeón en paneles de historias Historias privadas — Restringir el acceso a historias Configuración — Opciones de la interfaz de historias" + }, + "/guia/tu-contenido/iiif-externo/": { + "ids": [ + "agregar-una-imagen-externa", + "carga-lenta", + "combinar-imágenes-propias-y-externas", + "cuándo-escribir-tus-propios-valores", + "cómo-usarlo", + "detección-de-idioma", + "detección-inteligente-de-créditos", + "documentos-de-múltiples-páginas", + "encontrar-imágenes-iiif", + "encontrar-manifiestos-de-múltiples-páginas", + "extracción-automática-de-metadatos", + "formatos-de-url-de-manifiesto", + "historias", + "imágenes-iiif-externas", + "la-imagen-no-carga", + "limitaciones", + "los-metadatos-no-aparecen", + "procesamiento-durante-el-build", + "páginas-de-objetos", + "qué-busca-telar", + "solución-de-problemas", + "tus-datos-siempre-tienen-prioridad", + "validación", + "véase-también" + ], + "selectors": { + "h1": [ + "Imágenes IIIF externas" + ], + "h2": [ + "Encontrar imágenes IIIF", + "Agregar una imagen externa", + "Combinar imágenes propias y externas", + "Documentos de múltiples páginas", + "Extracción automática de metadatos", + "Solución de problemas", + "Véase también" + ], + "h3": [ + "Formatos de URL de manifiesto", + "Páginas de objetos", + "Historias", + "Encontrar manifiestos de múltiples páginas", + "Cómo usarlo", + "Tus datos siempre tienen prioridad", + "Detección de idioma", + "Detección inteligente de créditos", + "Qué busca Telar", + "Cuándo escribir tus propios valores", + "Procesamiento durante el build", + "Validación", + "Limitaciones", + "La imagen no carga", + "Los metadatos no aparecen", + "Carga lenta" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "https://example.org/iiif/image/abc123/info.json", + "object_id,title,...,source_url mi-textil,Mi textil,,, mapa-museo,Mapa del museo,...,https://example.org/iiif/manifest.json mi-ceramica,Mi cerámica,,,", + "object_id,title,source_url leyes-nuevas,Recopilación de leyes,https://example.org/iiif/presentation/3/leyes-nuevas/manifest.json", + "paso,objeto,x,y,zoom,pagina,pregunta,respuesta 1,leyes-nuevas,0.5,0.5,1,1,¿Qué es este documento?,Un código legal clave del periodo colonial. 2,leyes-nuevas,0.4,0.15,2.5,10,Una disposición clave,Esta página detalla el marco legal que gobernaba la administración colonial.", + "object_id,title,description,source_url,creator,period,location,credit map-001,,,https://example.org/iiif/manifest.json,,,,", + "object_id,title,description,source_url,creator,period,location,credit map-001,Mi título personalizado,,https://example.org/manifest.json,,,," + ], + "table": [ + "Campo Busca title Title, Label, Name description Description, Summary, Note creator Creator, Artist, Maker, Author period Date, Period, Creation Date, Date Created location Repository, Holding Institution, Current Location credit Attribution, Rights Holder, Credit Line, Provider" + ], + "blockquote": [ + "Encontrar coordenadas para una página específica. Navega a la página de objeto de tu documento de múltiples páginas. Usa los controles de navegación para ir a la página que deseas. Luego usa el selector de coordenadas — incluye automáticamente el número de página actual en los valores copiados." + ], + "img": [] + }, + "text": "Imágenes IIIF externas Muchos museos, bibliotecas y archivos ponen sus colecciones a disposición a través de una tecnología llamada IIIF (Marco Internacional de Interoperabilidad de Imágenes). Esto significa que puedes construir historias en Telar usando imágenes de alta resolución de instituciones de todo el mundo, sin descargar ni alojar las imágenes. Encontrar imágenes IIIF Busca recursos IIIF en: Guía IIIF para encontrar recursos Museos importantes (British Museum, Getty, Smithsonian, Rijksmuseum) Bibliotecas digitales (Internet Archive, Europeana, Gallica) Colecciones universitarias y archivos especializados Cuando una institución ofrece IIIF, generalmente encontrarás una URL de manifiesto — un enlace que describe la imagen y sus metadatos. Normalmente termina en info.json o manifest.json . Agregar una imagen externa En tu hoja de cálculo de objetos (Google Sheet u objects.csv ): Crea una fila con un object_id único (ej., museum-textile-001 ) Agrega la URL del manifiesto IIIF en la columna source_url : https://example.org/iiif/image/abc123/info.json Eso es todo. Telar obtendrá la imagen directamente del servidor de la institución cuando alguien visite tu sitio. Formatos de URL de manifiesto Las URLs IIIF normalmente se ven así: Image API : https://example.org/iiif/2/abc123/info.json Presentation API : https://example.org/iiif/2/abc123/manifest.json Telar es compatible con ambos formatos y con las dos versiones de IIIF (2.0 y 3.0). Combinar imágenes propias y externas Puedes usar tus propias imágenes e imágenes IIIF externas en el mismo proyecto. Deja source_url en blanco para los objetos con imágenes autoalojadas: object_id,title,...,source_url mi-textil,Mi textil,,, mapa-museo,Mapa del museo,...,https://example.org/iiif/manifest.json mi-ceramica,Mi cerámica,,, Documentos de múltiples páginas Algunos manifiestos IIIF describen documentos de múltiples páginas — libros digitalizados, manuscritos, registros legales o mapas con varias hojas. Estos manifiestos contienen múltiples canvases , uno por página. Telar maneja los manifiestos de múltiples páginas de la misma manera que los de una sola imagen. Agrega la URL del manifiesto a la columna source_url en tu hoja de cálculo de objetos: object_id,title,source_url leyes-nuevas,Recopilación de leyes,https://example.org/iiif/presentation/3/leyes-nuevas/manifest.json Páginas de objetos En las páginas de objetos, el visor muestra el documento completo con controles de navegación — flechas de avance y retroceso y un selector de página — para que quienes visitan puedan recorrer todas las páginas. Historias En las historias, cada paso puede hacer referencia a una página específica usando la columna pagina : paso,objeto,x,y,zoom,pagina,pregunta,respuesta 1,leyes-nuevas,0.5,0.5,1,1,¿Qué es este documento?,Un código legal clave del periodo colonial. 2,leyes-nuevas,0.4,0.15,2.5,10,Una disposición clave,Esta página detalla el marco legal que gobernaba la administración colonial. La columna pagina indica qué canvas (página) del manifiesto mostrar. Los números de página comienzan en 1. Encontrar coordenadas para una página específica. Navega a la página de objeto de tu documento de múltiples páginas. Usa los controles de navegación para ir a la página que deseas. Luego usa el selector de coordenadas — incluye automáticamente el número de página actual en los valores copiados. Encontrar manifiestos de múltiples páginas Los manifiestos IIIF de múltiples páginas son comunes en instituciones que han digitalizado libros y manuscritos: Bibliotecas nacionales — Bibliothèque nationale de France (Gallica), British Library, Library of Congress Bibliotecas universitarias — Muchos departamentos de colecciones especiales publican manifiestos IIIF de sus fondos digitalizados Repositorios digitales — Internet Archive ofrece manifiestos IIIF para sus libros digitalizados Plataformas archivísticas — La plataforma Zasqua de Neogranadina aloja miles de documentos históricos digitalizados de archivos latinoamericanos, todos disponibles a través de IIIF Busca un enlace de \"manifiesto IIIF\" en la página del objeto, o consulta la documentación IIIF de la institución. Extracción automática de metadatos Cuando proporcionas una source_url , Telar puede llenar automáticamente los metadatos a partir del manifiesto IIIF — título, descripción, creador, periodo, ubicación y crédito. Esto te ahorra escribir información que la institución ya tiene registrada. Cómo usarlo Agrega la URL del manifiesto IIIF a tu hoja de cálculo y deja los campos de metadatos vacíos: object_id,title,description,source_url,creator,period,location,credit map-001,,,https://example.org/iiif/manifest.json,,,, Cuando tu sitio se construya, Telar: Obtendrá el manifiesto IIIF Extraerá los metadatos disponibles Llenará los campos que dejaste vacíos Conservará los valores que hayas escrito Tus datos siempre tienen prioridad Tienes control total sobre lo que se extrae: Deja los campos vacíos y Telar los llena desde el manifiesto Llena algunos campos y Telar solo completa el resto Llena todo y los metadatos del manifiesto se ignoran Ejemplo — sobrescritura parcial: object_id,title,description,source_url,creator,period,location,credit map-001,Mi título personalizado,,https://example.org/manifest.json,,,, Telar usará \"Mi título personalizado\" (tu valor) y extraerá la descripción, creador, periodo, ubicación y crédito del manifiesto. Detección de idioma La extracción respeta la configuración de idioma de tu sitio ( telar_language en _config.yml ): Sitios en inglés ( en ) — Prioriza metadatos en inglés; recurre a otros idiomas si no están Sitios en español ( es ) — Prioriza español, luego inglés, luego otros idiomas Detección inteligente de créditos Para el campo credit , Telar filtra textos legales genéricos (URLs de Creative Commons, avisos de derechos) y busca líneas de atribución significativas — el nombre de la institución, el titular de los derechos o la línea de crédito. Qué busca Telar Cada institución nombra sus metadatos de manera diferente. Telar busca variaciones comunes: Campo Busca title Title, Label, Name description Description, Summary, Note creator Creator, Artist, Maker, Author period Date, Period, Creation Date, Date Created location Repository, Holding Institution, Current Location credit Attribution, Rights Holder, Credit Line, Provider Cuándo escribir tus propios valores Quizás quieras ingresar tus propios valores cuando: El manifiesto está en un idioma que tu público no entenderá La institución usa abreviaturas o códigos La descripción es muy técnica para tu público Prefieres una versión más corta o más simple de algún campo Procesamiento durante el build La extracción de metadatos ocurre automáticamente al construir el sitio: GitHub Pages : Se ejecuta durante el despliegue — no necesitas hacer nada Desarrollo local : Ejecuta python3 scripts/csv_to_json.py cuando agregues o actualices URLs de manifiestos Validación Durante el build , Telar verifica cada manifiesto: Manifiesto válido — Metadatos extraídos con éxito Manifiesto no disponible — La URL no respondió; se reintentará en el siguiente build Sin metadatos — El manifiesto es válido pero no contiene campos extraíbles Revisa los registros del build para ver el estado de la extracción. Limitaciones Solo funciona con manifiestos IIIF externos (las imágenes autoalojadas no tienen manifiestos de los cuales extraer) Los manifiestos deben ser de acceso público (sin inicio de sesión) Las etiquetas HTML se eliminan del texto extraído Algunos manifiestos pueden no incluir campos de metadatos Solución de problemas La imagen no carga Verifica que la URL del manifiesto sea correcta — intenta abrirla directamente en tu navegador Asegúrate de que el recurso sea de acceso público (sin autenticación) Confirma que pegaste la URL completa, incluyendo info.json o manifest.json Los metadatos no aparecen Revisa los registros del build para ver advertencias de extracción El manifiesto puede no incluir los campos que esperas Intenta ingresar los valores manualmente en tu hoja de cálculo Carga lenta Las imágenes externas se cargan desde el servidor de la institución — la velocidad depende de su infraestructura Algunas instituciones pueden limitar las solicitudes de sitios desconocidos Véase también Imágenes autoalojadas — Sube tus propias imágenes en lugar de usar fuentes externas Documentos PDF — Autoalojar documentos PDF de múltiples páginas Objetos — Cómo definir objetos en tu hoja de cálculo Columnas de objetos — Referencia completa de columnas de la hoja de cálculo de objetos" + }, + "/docs/configure/config-generator/": { + "ids": [ + "cg-author", + "cg-browse-and-search", + "cg-collection-mode", + "cg-copied", + "cg-copy", + "cg-custom-domain", + "cg-custom-domain-fields", + "cg-description", + "cg-domain-url", + "cg-domain-url-error", + "cg-domain-url-warn", + "cg-email", + "cg-featured-count", + "cg-generate", + "cg-gh-repo", + "cg-gh-repo-error", + "cg-gh-repo-warn", + "cg-gh-username", + "cg-gh-username-error", + "cg-ghpages", + "cg-ghpages-fields", + "cg-gsheets-fields", + "cg-gsheets-published", + "cg-gsheets-published-error", + "cg-gsheets-published-warn", + "cg-gsheets-toggle", + "cg-include-demo-content", + "cg-language", + "cg-lines", + "cg-load-btn", + "cg-load-feedback", + "cg-load-input", + "cg-load-lines", + "cg-load-results", + "cg-logo-fields", + "cg-logo-path", + "cg-logo-toggle", + "cg-manual-baseurl", + "cg-manual-fields", + "cg-manual-url", + "cg-manual-url-error", + "cg-mode-create", + "cg-mode-edit", + "cg-output", + "cg-output-wrapper", + "cg-paste-area", + "cg-protection-fields", + "cg-protection-toggle", + "cg-root-domain", + "cg-secret-key", + "cg-secret-key-error", + "cg-secret-key-warn", + "cg-show-link-on-homepage", + "cg-show-object-credits", + "cg-show-on-homepage", + "cg-show-sample-on-homepage", + "cg-show-story-steps", + "cg-template", + "cg-theme", + "cg-title", + "cg-title-warn", + "config-generator-and-editor" + ], + "selectors": { + "h1": [ + "Config Generator and Editor" + ], + "h2": [], + "h3": [ + "Site Settings", + "Hosting", + "Google Sheets Integration", + "Story Interface", + "Collection Interface", + "Private Stories" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Config Generator and Editor Fill in your site details to generate a ready-to-use _config.yml file for your Telar site. Your configuration is never sent to any server — everything runs in your browser. Create new Edit existing Paste your existing _config.yml below, then click Load to populate the form. 1 Load Site Settings Basic site information and appearance. These are the most important settings for your site. Title Your site's display name, shown in the browser tab and navigation header Description (optional) Used for search engine metadata and social sharing previews Author (optional) Email (optional) Theme trama paisajes neogranadina santa-barbara austin Controls your site's color scheme and visual style Use an image as logo When off, the site title is displayed as text in the navigation header Logo path Place your logo in telar-content/objects/ . Recommended: max 80px tall, 200–300px wide, PNG/JPG/SVG Language English (en) Español (es) Controls all interface elements: navigation, buttons, labels, error messages. Your content stays in whatever language you write it in. Collection mode When on, the homepage shows objects first in a large grid, with stories below. When off (default), stories appear first. Hosting Telar is designed to work with GitHub Pages — most users just need their username and repository name. Host on GitHub Pages If you are not using GitHub Pages, turn this off to enter your URL manually. GitHub username Repository name Custom domain Do you have a custom domain configured with GitHub Pages? Learn how to set one up Domain URL Serve on root domain When on, your site serves at the root of your domain. When off, it serves at domain.com/repo-name. URL Your site's base domain Baseurl Path after domain. Leave empty to serve at the root. Google Sheets Integration Manage your content via Google Sheets instead of editing CSV files directly. Telar fetches your data automatically during each build. Enable Google Sheets When off, Telar uses CSV files from your repository instead — make sure you have them in telar-content/spreadsheets/ Published URL From File → Share → Publish to web Story Interface Control how stories display and behave on your site. These settings affect the story viewer and homepage presentation. Show stories on the homepage When on, story cards appear on the homepage. Stories are still accessible via navigation when off. Show step indicators in stories Displays \"Step 1\", \"Step 2\", etc. as you scroll through a story. Purely visual. Show object credits Displays a dismissable credit badge in the bottom-left corner of story viewers. Credit information still appears in the metadata table either way. Include demo content Fetches tutorial stories from the Telar content server. These show a \"Demo\" badge and help new users explore the interface. Turn off for production sites. Collection Interface Control how the objects gallery displays and behaves, including filtering, search, and homepage presentation. Show the full browse and search interface Enables the filter sidebar with facets on the objects page Show link to objects on homepage Displays a \"View the objects\" link on the homepage Show a sample of your objects on the homepage Displays objects marked as featured in your objects.csv on the homepage Featured count Number of objects to show in the homepage sample Private Stories Encrypt stories so only viewers with the correct key can access them. Stories with private: yes in your project.csv (or Google Sheets Project tab) will be encrypted during build. Enable private stories Uses client-side encryption. Prevents casual access but is not suitable for highly sensitive content. Secret key Viewers access protected stories via ?key=your-secret-key Generate Copy Copied! Generated _config.yml 1" + }, + "/docs/developers/story-engine/": { + "ids": [ + "layouts", + "moving-between-steps", + "stacking", + "story-engine-vocabulary", + "the-parts-of-a-story", + "what-stays-loaded" + ], + "selectors": { + "h1": [ + "Story Engine Vocabulary" + ], + "h2": [ + "The Parts of a Story", + "Moving Between Steps", + "Layouts", + "What Stays Loaded", + "Stacking" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Story Engine Vocabulary The story engine is the code that runs a story page: it lays out the cards and the object, moves between steps, and decides what to keep loaded. Its code lives in assets/js/telar-story/ and is built into assets/js/telar-story.js . This page defines the terms the code, its comments and these docs use for the parts of a story and the ways it moves, so that each term names one thing. CSS classes, data-* attributes and the max_viewer_cards setting keep their older names, because sites and the Compositor read them. Where an older name differs from a term on this page, the entry says so. The Parts of a Story A story is built from these parts: Step : one row of a story's spreadsheet, holding a question, an answer and a framing. Scene : consecutive steps on the same object. On screen, a scene is a plate with its card stack on it, and it rises over the previous scene as one unit. A return to an object later in the story starts a new scene. Plate : the full-window part of a scene that shows the object. An image plate holds a viewer; a video or audio plate holds a player. Card stack : a scene's text cards, which pass one after another as the story moves from step to step, rather than stacking. The name comes from an earlier design, in which the cards stacked. A card belongs to its scene and moves with its scene's plate. The module that builds it is card-pool.js . Text card : the card holding a step's question and answer. Title card : a step with no object, either the story's title or a section heading. Viewer : the image viewer (OpenSeadragon) on an image plate. Player : the video or audio player on a media plate. Moving Between Steps These terms describe what happens when the reader goes from one step to the next: Framing : a step's authored x , y and zoom , for any plate type. Camera : what an image plate's viewer shows at a given moment. Only images have a camera. Move : one transition between steps. The scroll, the camera, the cards and the plates all run over one duration, which grows with how far the camera travels: max(1.2, min(3, 1.33 × S)) seconds, where S is the camera's zoom-and-pan path length between the two framings ( camera-travel.js ). A move with no camera travel takes the base of 1.2 seconds, and so do jumps from the contents and from a link. The reader's scroll : the reader's wheel, trackpad or touch input. Scrubbing : the state while the reader's scroll drives the story. The page carries the class is-scrubbing . Carry : when the reader's scroll stops between two steps, the engine finishes the gesture by moving to the nearer one. Dwell : the hold after a move arrives. Settle : the cards taking their positions for a step. Rest : the camera or the scroll standing still. Developers can tune the move duration for testing with ?nav=base,perUnit,maxSeconds in the page URL. ?nav=1.2,0 gives every move the base duration, whatever the camera travels. Layouts A story page uses one of two layouts. Horizontal layout : the text card sits beside the plate as a side card, and the reader moves with scroll navigation. Vertical layout : the reader moves with button navigation, and the text card sits below the plate as a bottom card, or beside it as a phone-height side card. The page uses the vertical layout when any of these is true of the window: It is 1024px wide or narrower. Its aspect ratio is 3:4 or narrower, as on a tablet held upright. It is 480px tall or shorter. It is between 481px and 632px tall and too narrow for a side card of the width its height needs. These windows, the short windows, are generated in 8px bands and published as --telar-vertical-short-windows . The terms for the cards and the space around them: Side card : the text card beside the plate in the horizontal layout. Its width is set by the window's height and kept between 37% and 52% of the window's width: min(0.52W, max(0.37W, min(718, 1544 − 1.6H))) , rounded to a whole pixel. Bottom card : the vertical layout's card below the plate. Phone-height side card : in the vertical layout, on a window 480px tall or shorter (a phone on its side, or a desktop window that short), the card sits beside the plate and the browser scrolls it. The code tests for it with isPhoneHeightSideCard() in layout-mode.js . The threshold is --telar-card-landscape-max-height , which keeps its older name. Compact type size : smaller type and tighter spacing on any window 600px tall or shorter, whatever its width. Band : the strip under the top controls that the cards sit below. Ceiling : the tallest a side card may be. Button navigation : previous and next buttons move the story one step at a time. It runs in the vertical layout, in embedded stories, and on iOS in either layout. Its buttons keep the class .mobile-nav . Scroll navigation : the reader's scroll moves the story. It runs in the horizontal layout everywhere but iOS. What Stays Loaded The engine keeps a capped number of objects loaded, so a long story does not hold every image and player in memory: Viewer pool : the loaded viewers. The cap is max_viewer_cards in _config.yml (default 8, at most 15); past it, the viewer on the plate farthest from the current step is unloaded. The setting means the most scenes whose viewer stays loaded. Player pool : the loaded media players, capped at three video players and three audio players, evicted the same way. These are the only uses of \"pool\" in the engine. Stacking Each scene's cards and plate use their own block of z-index values, its z-range , so a later scene covers an earlier one as a unit." + }, + "/docs/site-features/glossary/": { + "ids": [ + "creating-a-glossary", + "csv-format-recommended", + "custom-display-text", + "glossary", + "linking-to-glossary-terms", + "markdown-format-legacy", + "see-also", + "shorthand", + "tips", + "viewer-experience", + "where-links-work" + ], + "selectors": { + "h1": [ + "Glossary" + ], + "h2": [ + "Creating a Glossary", + "Linking to Glossary Terms", + "Viewer Experience", + "Tips", + "See Also" + ], + "h3": [ + "CSV Format (Recommended)", + "Markdown Format (Legacy)", + "Shorthand", + "Custom Display Text", + "Where Links Work" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "term_id,title,definition,related_terms loom,Loom,A device used to weave cloth and tapestry.,warp warp,Warp,\"The set of lengthwise yarns on a loom, through which the weft is woven.\",loom encomienda,Encomienda,\"A system of labor in colonial Spanish America, granting colonists authority over indigenous workers.\",", + "--- term_id: colonial-period title: \"Colonial Period\" related_terms: - encomienda - viceroyalty --- The Colonial Period in the Americas began with the arrival of European colonizers in the late 15th century...", + "The [[loom]] was central to textile production.", + "The [[loom|weaving device]] was central to textile production." + ], + "table": [], + "blockquote": [ + "If both a CSV glossary and markdown glossary files exist, Telar uses the CSV and ignores the markdown files (with a build warning).", + "Term matching is case-insensitive. [[loom]], [[Loom]], and [[LOOM]] all resolve to the same entry, so you can write a term however reads best — for example an acronym as [[IIIF]]." + ], + "img": [ + [ + "/images/glossary-page.png", + "Glossary page showing alphabetical term listing" + ] + ] + }, + "text": "Glossary The glossary lets you define terms that viewers can look up without leaving a story. When a viewer clicks a glossary link, the definition appears in a slide-over panel. For visual authoring, see create and link glossary entries . Creating a Glossary There are two ways to define glossary terms. The CSV format (new in v0.8.0) is recommended for most projects. CSV Format (Recommended) Add a glossary.csv file to telar-content/spreadsheets/ : term_id,title,definition,related_terms loom,Loom,A device used to weave cloth and tapestry.,warp warp,Warp,\"The set of lengthwise yarns on a loom, through which the weft is woven.\",loom encomienda,Encomienda,\"A system of labor in colonial Spanish America, granting colonists authority over indigenous workers.\", Each row defines one term: term_id — Unique identifier used in links (lowercase, hyphens recommended) title — Display name shown in the glossary panel definition — The definition text (supports basic markdown) related_terms — Other term_id values, separated by | , for cross-referencing The CSV format works with Google Sheets — the glossary tab is fetched automatically like your other CSVs. Column names can be in English or Spanish (see CSV Reference: Glossary for aliases). Markdown Format (Legacy) Individual markdown files in telar-content/texts/glossary/ : --- term_id: colonial-period title: \"Colonial Period\" related_terms: - encomienda - viceroyalty --- The Colonial Period in the Americas began with the arrival of European colonizers in the late 15th century... Each file defines one term. The body of the file is the definition. In these files, related_terms is written as a YAML list, not with the | that separates values in the CSV: Telar does not reinterpret the frontmatter of a markdown file. If both a CSV glossary and markdown glossary files exist, Telar uses the CSV and ignores the markdown files (with a build warning). Linking to Glossary Terms Link to glossary terms from your story text and panels using double-bracket syntax: Shorthand Uses the term's title as the link text: The [[loom]] was central to textile production. Renders as: The Loom was central to textile production. Custom Display Text Use a pipe separator to specify different link text: The [[loom|weaving device]] was central to textile production. Renders as: The weaving device was central to textile production. Where Links Work Glossary auto-links work in: Story step text — the answer of a story step (the main scrolling prose) Story panel content (all three methods: direct text, pasted markdown, file references) Custom pages The step question is a heading, so glossary links there are intentionally left as plain text. If a term_id is not found in the glossary, a warning icon and error message appear in the build output and in the story panel. Term matching is case-insensitive. [[loom]] , [[Loom]] , and [[LOOM]] all resolve to the same entry, so you can write a term however reads best — for example an acronym as [[IIIF]] . Viewer Experience When a viewer clicks a glossary link: A slide-over panel appears from the side of the screen The panel shows the term's title and definition Related terms appear as additional links at the bottom The viewer can navigate between related terms without closing the panel Clicking outside the panel or pressing the close button dismisses it The viewer stays on the current story step throughout — glossary lookups don't interrupt the narrative flow. Tips Keep definitions concise — Viewers are reading them mid-story. A sentence or two is ideal; save extended explanations for story panels. Use related terms to build a network of cross-references. This helps viewers explore connected concepts. Prefix demo terms with demo- (e.g., demo-loom ) to tag them as demo content. Test your links by building the site and checking for glossary warnings in the build output. See Also CSV Reference: Glossary — Complete glossary CSV column reference and aliases Stories & Panels — Where glossary links are used Markdown Syntax Guide — Formatting for definitions" + }, + "/guia/el-compositor/panel-de-control/": { + "ids": [ + "barra-de-estado", + "cambiar-de-proyecto", + "controles-de-borrador-y-privacidad", + "controles-de-borrador-y-privado", + "crear-una-historia-nueva", + "eliminar-una-historia", + "historias", + "inicio-y-navegación", + "media-stories-guia-el-compositor-panel-de-control", + "mensaje-de-bienvenida", + "panel-de-control", + "reordenar-historias", + "ver-y-abrir-historias", + "vista-previa-del-sitio", + "véase-también" + ], + "selectors": { + "h1": [ + "Inicio y navegación" + ], + "h2": [ + "Vista previa del sitio", + "Mensaje de bienvenida", + "Historias", + "Cambiar de proyecto", + "Barra de estado", + "Véase también" + ], + "h3": [ + "Ver y abrir historias", + "Crear una historia nueva", + "Reordenar historias", + "Eliminar una historia", + "Controles de borrador y privado" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [ + [ + "/assets/manual/tutorials/es-stories.jpg", + "La lista de historias con controles de orden, Borrador, Privada y Editar." + ] + ] + }, + "text": "Inicio y navegación La página Inicio presenta el proyecto activo, muestra su actividad reciente y enlaza con las partes principales del Compositor. La navegación superior permite pasar entre Objetos , Historias , Glosario , Inicio y páginas , Configuración del sitio y Publicar . Vista previa del sitio Edita el contenido de la página pública de tu exhibición en Inicio y páginas . Inicio ofrece una presentación del proyecto; no es el editor de la página pública. Mensaje de bienvenida Abre Inicio y páginas para editar la introducción que ven tus visitantes. Revisa el título, la descripción y el idioma de la interfaz pública en Configuración del sitio . Publica cuando quieras llevar esos cambios al sitio público. Historias La página Historias reúne las narrativas de tu exhibición. Ver y abrir historias Pulsa Editar en una historia para abrir el editor de historias . Cada fila muestra el título y el número de pasos. Crear una historia nueva Pulsa + Nueva historia . Escribe un título y, si lo necesitas, un subtítulo y una firma. Pulsa Guardar para crear la historia y abrir su editor. Reordenar historias Arrastra una historia desde su control de orden para cambiar cómo aparece en el sitio público. El nuevo orden se incluye cuando publicas. Eliminar una historia Usa Eliminar historia y lee la confirmación antes de continuar. El sitio público cambia cuando publicas la eliminación. Si borraste algo por error, revisa si está disponible Deshacer . Controles de borrador y privado Borrador excluye una historia de la exhibición pública. Úsalo para preparar trabajo que todavía no deba aparecer. Privado controla el acceso al contenido de la historia. Lee Historias privadas antes de usarlo en un proyecto. Borrador excluye una historia de la publicación; Privada utiliza la clave del sitio. Arrastrar una fila cambia el orden. Ampliar captura ↗ Cambiar de proyecto Usa el nombre del proyecto en el encabezado para cambiar entre sitios conectados. Cada sitio tiene su propia colección, historias y cambios sin publicar. Barra de estado El encabezado muestra el estado de la conexión y si hay cambios sin publicar. Espera a que la conexión esté lista antes de editar. Usa Publicar para revisar los cambios y seguir la generación del sitio. El control de colaboración abre información sobre el equipo y su actividad. Desde el menú de usuario puedes entrar a Cuenta , donde Idioma de la interfaz cambia las etiquetas del Compositor. No traduce los textos de la exhibición; el idioma de su interfaz pública se configura por separado. Véase también Guía rápida para talleres — Un recorrido breve por la primera historia Objetos — Agregar y administrar fuentes Editor de historias — Componer pasos y paneles Publicación — Revisar y publicar" + }, + "/docs/customization/themes/": { + "ids": [ + "adding-attribution-to-custom-themes", + "attribution-fields", + "attribution-for-preset-themes", + "austin", + "available-themes", + "color-accessibility", + "colors-telar-cannot-read", + "creating-custom-themes", + "font-examples", + "how-attribution-displays", + "how-telar-checks-your-colors", + "neogranadina", + "next-steps", + "paisajes-coloniales", + "removing-attribution", + "santa-barbara", + "sharing-custom-themes", + "step-1-create-theme-file", + "step-2-activate-custom-theme", + "step-3-test-and-refine", + "switching-themes", + "theme-color-keys", + "theme-creator-attribution", + "theme-fallback", + "themes", + "trama-default", + "typography-keys", + "using-google-fonts", + "what-telar-does-not-check", + "when-telar-replaces-a-color" + ], + "selectors": { + "h1": [ + "Themes" + ], + "h2": [ + "Available Themes", + "Switching Themes", + "Creating Custom Themes", + "Theme Color Keys", + "Typography Keys", + "Using Google Fonts", + "Theme Creator Attribution", + "Color Accessibility", + "Theme Fallback", + "Next Steps" + ], + "h3": [ + "Trama (Default)", + "Paisajes Coloniales", + "Neogranadina", + "Santa Barbara", + "Austin", + "Step 1: Create Theme File", + "Step 2: Activate Custom Theme", + "Step 3: Test and Refine", + "Font Examples", + "Adding Attribution to Custom Themes", + "Attribution Fields", + "How Attribution Displays", + "Attribution for Preset Themes", + "Sharing Custom Themes", + "Removing Attribution", + "How Telar Checks Your Colors", + "When Telar Replaces a Color", + "What Telar Does Not Check", + "Colors Telar Cannot Read" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "telar_theme: \"santa-barbara\" # Options: trama, paisajes, neogranadina, santa-barbara, austin", + "name: \"My Theme\" colors: text: heading: \"#1a1a1a\" # Headings body: \"#333333\" # Body text link: \"#883C36\" # Links button: \"#FFFFFF\" # Text on buttons panel_layer1: \"#333333\" # Text in the first panel panel_layer2: \"#FFFFFF\" # Text in the second panel panel_glossary: \"#333333\" # Text in the glossary panel background: button: \"#883C36\" # Button background panel_layer1: \"#C6D0F8\" # First panel background panel_layer2: \"#883C36\" # Second panel background panel_glossary: \"#FFF6EF\" # Glossary panel background fonts: headings: \"'Playfair Display', Georgia, serif\" body: \"'Source Sans Pro', -apple-system, sans-serif\"", + "telar_theme: \"custom\"", + "fonts: headings: \"'Playfair Display', Georgia, serif\"", + "fonts: headings: \"'Montserrat', Helvetica, sans-serif\"", + "fonts: body: \"'Source Sans Pro', sans-serif\"", + "@import url('https://fonts.googleapis.com/css2?family=Your+Font:wght@400;600;700&display=swap');", + "fonts: headings: \"'Your Font', serif\"", + "name: \"Miami\" description: \"Retro Cool. Digital Heat.\" creator: \"Material/Image Research Lab\" creator_url: \"https://mirl.ucsb.edu\" colors: text: heading: \"#F990E8\" body: \"#000000\" link: \"#0BD2D3\" button: \"#F990E8\" panel_layer1: \"#FFFFFF\" panel_layer2: \"#FFFFFF\" panel_glossary: \"#FFFFFF\" background: button: \"#0BD2D3\" panel_layer1: \"#F990E8\" panel_layer2: \"#0BD2D3\" panel_glossary: \"#F990E8\" fonts: headings: \"'Limelight', serif\" body: \"'Inter', sans-serif\"", + "name: \"Miami\"", + "creator: \"Material/Image Research Lab\" creator: \"Jeff\"", + "creator_url: \"https://mirl.ucsb.edu\" creator_url: \"https://github.com/mirl-ucsb\"", + "description: \"Retro Cool. Digital Heat.\"", + "creator: \"\" creator_url: \"\"", + "Theme \"santa-barbara\": colors.text.button is #FFFFFF, a contrast ratio of 1.69:1 on its #FEBC11 background, below the 4.5:1 that text needs. Telar used #003660 instead, 7.32:1. To keep your own color, choose a lighter or darker colors.background.button." + ], + "table": [ + "Key Usage colors.text.heading All heading levels colors.text.body Body text colors.text.link Links colors.text.button Text on buttons colors.text.panel_layer1 Text in the first panel colors.text.panel_layer2 Text in the second panel colors.text.panel_glossary Text in the glossary panel colors.background.button Button background colors.background.panel_layer1 First panel background colors.background.panel_layer2 Second panel background colors.background.panel_glossary Glossary panel background", + "Key Usage fonts.headings h1-h6, page titles fonts.body Paragraphs, lists, general text" + ], + "blockquote": [ + "Telar reads only the keys shown here. A theme file built from other key names loads without an error and has no effect, and your site renders in the default colors. The build log names the keys Telar looked for and did not find.", + "The four keys under colors.background are the ones Telar checks for contrast. See Color Accessibility." + ], + "img": [] + }, + "text": "Themes Telar includes 5 preset visual themes that can be easily switched via _config.yml . Available Themes Trama (Default) Telar's own visual identity, designed by Adelaida Ávila. Terracotta and lavender, with Space Grotesk headings. Colors: Headings: Dark grey #333333 Links and buttons: Terracotta #883C36 Panels: Lavender #C6D0F8 and terracotta #883C36 Glossary: Cream #FFF6EF Typography: Space Grotesk headings, Roboto Condensed body. Best for: A versatile default suitable for most exhibitions. Paisajes Coloniales Earth and sky, from the Colonial Landscapes project. Slate blue and plum, with Playfair Display headings. Colors: Headings and buttons: Slate blue #2c3e50 Links: Saddle brown #8b4513 Panels: Pale blue #A8C5D4 and plum #3d2645 Glossary: Sand #F5EDE1 Typography: Playfair Display headings, Source Sans Pro body. Best for: Historical narratives, archaeological exhibits. Neogranadina High-contrast green and crimson on charcoal, with IM Fell, a typeface cut from the punches of a seventeenth-century press. Colors: Headings: Black #000000 Links: Coral #D35F3A Buttons: Charcoal #2A2F36 Panels: Green #00b35c and crimson #b31235 Glossary: Off-white #F5F7FA Typography: IM Fell DW Pica headings, Mulish body. Best for: Archival materials. Santa Barbara Gold and deep navy, in the University of California, Santa Barbara colors. Roboto Serif headings. Colors: Headings: Navy #003660 Links: Teal #047C91 Buttons: Gold #FEBC11 Panels: Teal #047C91 and navy #003660 Glossary: Stone #F1EEEA Typography: Roboto Serif headings, Nunito Sans body. Best for: Greyscale and monochrome images Austin The University of Texas at Austin's burnt orange, with sage and stone. Crimson Pro headings. Colors: Headings, links and buttons: Burnt orange #BF5700 Panels: Blue grey #9CADB7 and sage #577565 Glossary: Stone #D6D2C4 Typography: Crimson Pro headings, Inter body. Best for: Contemporary materials Switching Themes Edit _config.yml in your repository: telar_theme: \"santa-barbara\" # Options: trama, paisajes, neogranadina, santa-barbara, austin Commit the change and GitHub Actions will rebuild your site automatically (2-5 minutes). Creating Custom Themes Step 1: Create Theme File Create a new file at _data/themes/custom.yml . Colors are grouped under colors.text and colors.background , and fonts under fonts : name: \"My Theme\" colors: text: heading: \"#1a1a1a\" # Headings body: \"#333333\" # Body text link: \"#883C36\" # Links button: \"#FFFFFF\" # Text on buttons panel_layer1: \"#333333\" # Text in the first panel panel_layer2: \"#FFFFFF\" # Text in the second panel panel_glossary: \"#333333\" # Text in the glossary panel background: button: \"#883C36\" # Button background panel_layer1: \"#C6D0F8\" # First panel background panel_layer2: \"#883C36\" # Second panel background panel_glossary: \"#FFF6EF\" # Glossary panel background fonts: headings: \"'Playfair Display', Georgia, serif\" body: \"'Source Sans Pro', -apple-system, sans-serif\" The quickest start is to copy a shipped theme from _data/themes/ and change its values. Every key is optional, and Telar uses the Trama value for any you leave out. Telar reads only the keys shown here. A theme file built from other key names loads without an error and has no effect, and your site renders in the default colors. The build log names the keys Telar looked for and did not find. Step 2: Activate Custom Theme In _config.yml : telar_theme: \"custom\" Step 3: Test and Refine Commit changes Wait for automatic build Review your site Adjust colors and fonts as needed Theme Color Keys All themes support these color keys: Key Usage colors.text.heading All heading levels colors.text.body Body text colors.text.link Links colors.text.button Text on buttons colors.text.panel_layer1 Text in the first panel colors.text.panel_layer2 Text in the second panel colors.text.panel_glossary Text in the glossary panel colors.background.button Button background colors.background.panel_layer1 First panel background colors.background.panel_layer2 Second panel background colors.background.panel_glossary Glossary panel background The four keys under colors.background are the ones Telar checks for contrast. See Color Accessibility . Typography Keys Control fonts across your site: Key Usage fonts.headings h1-h6, page titles fonts.body Paragraphs, lists, general text Font Examples Both keys sit under fonts , and each takes a stack: the font you want, then the fallbacks a browser uses when it cannot load that one. Serif headings: fonts: headings: \"'Playfair Display', Georgia, serif\" Or 'Merriweather', Georgia, serif , or 'Lora', Georgia, serif . Sans-serif headings: fonts: headings: \"'Montserrat', Helvetica, sans-serif\" Or 'Raleway', Arial, sans-serif . Body fonts: fonts: body: \"'Source Sans Pro', sans-serif\" Or 'Open Sans', Helvetica, sans-serif , or 'Crimson Text', Georgia, serif . Using Google Fonts To use fonts not included by default: Find your font at Google Fonts Add import to assets/css/telar.scss : @import url('https://fonts.googleapis.com/css2?family=Your+Font:wght@400;600;700&display=swap'); Reference in theme file: fonts: headings: \"'Your Font', serif\" Theme Creator Attribution Telar v0.4.0+ supports optional theme creator attribution, allowing you to credit theme designers in your site footer. Adding Attribution to Custom Themes When creating a custom theme, you can add creator information to your theme YAML file: name: \"Miami\" description: \"Retro Cool. Digital Heat.\" creator: \"Material/Image Research Lab\" creator_url: \"https://mirl.ucsb.edu\" colors: text: heading: \"#F990E8\" body: \"#000000\" link: \"#0BD2D3\" button: \"#F990E8\" panel_layer1: \"#FFFFFF\" panel_layer2: \"#FFFFFF\" panel_glossary: \"#FFFFFF\" background: button: \"#0BD2D3\" panel_layer1: \"#F990E8\" panel_layer2: \"#0BD2D3\" panel_glossary: \"#F990E8\" fonts: headings: \"'Limelight', serif\" body: \"'Inter', sans-serif\" Attribution Fields All fields are optional: name - Display name for your theme name: \"Miami\" creator - Name of the person or organization who designed the theme creator: \"Material/Image Research Lab\" creator: \"Jeff\" creator_url - Website or profile URL for attribution link creator_url: \"https://mirl.ucsb.edu\" creator_url: \"https://github.com/mirl-ucsb\" description - Brief note about the theme's design (for internal use) description: \"Retro Cool. Digital Heat.\" How Attribution Displays When you add creator information, it appears in your site footer: With both name and creator: \"Miami theme by MIRL Lab\" (linked to creator_url if provided) With only creator: \"Theme by MIRL Lab\" With only name: \"Miami theme\" With neither: No theme attribution shown Attribution for Preset Themes All of Telar's preset themes include attribution: Trama Creator: Telar URL: https://telar.org Paisajes Coloniales Creator: Neogranadina URL: https://neogranadina.org Neogranadina Creator: Neogranadina URL: https://neogranadina.org Santa Barbara Creator: AMPL at UC Santa Barbara URL: https://ampl.clair.ucsb.edu Austin Creator: AMPL at UT Austin URL: https://liberalarts.utexas.edu/history/ Sharing Custom Themes If you create a theme you'd like to share with the Telar community: Add complete attribution metadata Document color choices and design philosophy Include usage recommendations (best for grayscale images, colorful content, etc.) Share on the Telar Discussions forum Removing Attribution To use a theme without attribution: Simply omit the creator and creator_url fields from your theme file Or set them to empty strings: creator: \"\" creator_url: \"\" No attribution will appear in the footer. Color Accessibility Every theme pairs a text color with a background: colors.text.panel_layer1 sits on colors.background.panel_layer1 , and so on. When the two are too close in brightness, the text is hard to read. How Telar Checks Your Colors During the build, Telar works out a text color that reaches a contrast ratio of 4.5:1 on each of four backgrounds: button , panel_layer1 , panel_layer2 and panel_glossary . That is the WCAG AA level for normal-size text. Telar also works out the text color for colors.text.heading where that color is used as a background, such as the active filter chips on the objects page. You do not set that text color in the theme file, so Telar replaces nothing of yours there. Your own color comes first. Telar keeps it whenever it reaches 4.5:1, so a theme whose colors all pass renders exactly as you wrote it. Only when your color falls short does Telar look further, in this order: Your colors.text.heading or colors.text.button , whichever has the higher contrast on that background White or black, whichever has the higher contrast When Telar Replaces a Color Telar prints one line in the build log for each color it replaces: Theme \"santa-barbara\": colors.text.button is #FFFFFF, a contrast ratio of 1.69:1 on its #FEBC11 background, below the 4.5:1 that text needs. Telar used #003660 instead, 7.32:1. To keep your own color, choose a lighter or darker colors.background.button. A theme whose colors all pass prints nothing. To keep the color you wanted, change the background rather than the text. What Telar Does Not Check These are still yours to get right: Body text on the page background Link colors ( colors.text.link ) Large text (18px+) , which needs 3:1 rather than 4.5:1 Interactive elements , which must stay distinguishable Use tools like WebAIM Contrast Checker to verify. Colors Telar Cannot Read Telar only reads hex colors, like #FFFFFF or #FFF . A named color like white , or an rgb() value, is left exactly as you wrote it and unchecked, and the build log says so. Theme Fallback If Telar cannot find the theme file named in _config.yml , it falls back to the Trama theme, so your site never breaks. A file Telar can find is always used, even when none of its keys are ones Telar reads. Each key you have not set takes its Trama value, and the build log says which ones were missing. Next Steps Advanced Styling for deeper customization Configuration for other site settings View Example Themes in action" + }, + "/guia/tu-contenido/sintaxis-markdown/": { + "ids": [ + "agregar-fórmulas-en-línea-y-en-bloque", + "agregar-un-video-de-youtube", + "agregar-una-cita-con-nota-al-pie", + "agregar-una-imagen-con-pie", + "bloques-de-código", + "citas-en-bloque", + "crear-una-cita-en-bloque", + "código", + "código-en-línea", + "cómo-escribir-el-contenido-de-los-paneles", + "cómo-funciona", + "dónde-funciona-latex", + "ecuaciones-de-varias-líneas", + "ejemplos", + "encabezados", + "enlaces", + "enlazar-a-otro-objeto", + "enlazar-a-un-término-del-glosario", + "entornos-compatibles", + "estilos-de-texto", + "formato-básico", + "fórmulas-en-bloque", + "fórmulas-en-línea", + "fórmulas-químicas", + "imágenes", + "limitaciones", + "listas", + "longitud-del-contenido", + "medios-enriquecidos", + "mejores-prácticas", + "método-1-introducir-texto-directamente", + "método-2-pegar-texto-markdown", + "método-3-indicar-un-archivo-de-texto", + "nomenclatura-de-archivos", + "notación-matemática-y-científica-latex", + "notas-al-pie", + "opciones-de-tamaño", + "organización-de-imágenes", + "otros-iframes", + "pies-de-imagen", + "próximos-pasos", + "qué-es-markdown", + "recursos-de-aprendizaje", + "referencia-completa-de-sintaxis", + "referencia-de-sintaxis-de-markdown", + "referencia-rápida", + "rutas-de-imagen", + "sintaxis-básica", + "texto-alternativo-para-accesibilidad", + "videos-de-youtube" + ], + "selectors": { + "h1": [ + "Referencia de sintaxis de Markdown" + ], + "h2": [ + "¿Qué es Markdown?", + "Cómo escribir el contenido de los paneles", + "Formato básico", + "Imágenes", + "Medios enriquecidos", + "Código", + "Notas al pie", + "Notación matemática y científica (LaTeX)", + "Mejores prácticas", + "Referencia rápida", + "Limitaciones", + "Próximos pasos" + ], + "h3": [ + "Recursos de aprendizaje", + "Método 1: Introducir texto directamente", + "Método 2: Pegar texto Markdown", + "Método 3: Indicar un archivo de texto", + "Encabezados", + "Estilos de texto", + "Listas", + "Enlaces", + "Citas en bloque", + "Sintaxis básica", + "Opciones de tamaño", + "Rutas de imagen", + "Ejemplos", + "Pies de imagen", + "Videos de YouTube", + "Otros iframes", + "Código en línea", + "Bloques de código", + "Cómo funciona", + "Fórmulas en línea", + "Fórmulas en bloque", + "Ecuaciones de varias líneas", + "Entornos compatibles", + "Fórmulas químicas", + "Dónde funciona LaTeX", + "Referencia completa de sintaxis", + "Texto alternativo para accesibilidad", + "Organización de imágenes", + "Longitud del contenido", + "Nomenclatura de archivos", + "Agregar una imagen con pie", + "Agregar un video de YouTube", + "Agregar una cita con nota al pie", + "Enlazar a un término del glosario", + "Enlazar a otro objeto", + "Agregar fórmulas en línea y en bloque", + "Crear una cita en bloque" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "--- title: \"Técnicas de tejido\" --- El patrón de urdimbre entrelazada visible aquí indica una técnica de tejido compleja que era común en el período colonial. ## Detalles técnicos Estos patrones se creaban usando...", + "## Encabezado de segundo nivel ### Encabezado de tercer nivel #### Encabezado de cuarto nivel", + "**Texto en negrita** para énfasis *Texto en cursiva* para énfasis sutil ***Negrita y cursiva*** para máximo énfasis", + "- Primer elemento - Segundo elemento - Elemento anidado - Otro elemento anidado - Tercer elemento", + "1. Primer paso 2. Segundo paso 3. Tercer paso", + "[Texto del enlace](https://example.com) [Enlace interno](/objects/textile-001/)", + "> Esto es una cita en bloque. > Puede abarcar múltiples líneas.", + "![Texto alternativo descriptivo](ruta/a/imagen.jpg){tamaño}", + "![Detalle de tejido](textile-closeup.jpg){md}", + "![Logo del sitio](/telar-content/objects/logo.png){sm}", + "![Foto del museo](https://example.com/image.jpg){lg}", + "![Miniatura pequeña](thumb.jpg){small} ![Ilustración mediana](diagram.jpg){md} ![Imagen destacada grande](painting.jpg){large} ![Panorama de ancho completo](landscape.jpg){full}", + "![Fragmento textil colonial](textile.jpg){lg} Detalle que muestra el patrón de *urdimbre entrelazada* típico del período.", + "![Mapa de la región](map.jpg){md} caption: Mapa de la *Recopilación de Leyes*, 1680.", + "
", + "", + "El campo `object_id` debe coincidir con el nombre del archivo.", + "``` git add . git commit -m \"Actualizar contenido\" git push ```", + "```yaml title: Mi Historia description: Una narrativa convincente ```", + "El textil muestra técnicas avanzadas.[^1] [^1]: Basado en el análisis de la Dra. Smith (2020).", + "El coeficiente es $C = \\frac{8}{35}$ y el polinomio es $P_4(x)$.", + "$$x^4 = \\frac{8}{35}P_4(x) + \\frac{4}{7}P_2(x) + \\frac{1}{5}P_0(x)$$", + "\\[E = mc^2\\]", + "$$\\begin{align} P_0(x) &= 1\\\\ P_1(x) &= x\\\\ P_2(x) &= \\frac{1}{2}(3x^2 - 1) \\end{align}$$", + "La reacción $\\ce{2H2 + O2 -> 2H2O}$ produce agua. $$\\ce{CO2 + C -> 2CO}$$", + "✅ ![Vista detallada de hilos de urdimbre entrelazados](closeup.jpg){lg} ❌ ![Imagen](closeup.jpg){lg}", + "telar-content/objects/ ├── story1-context.jpg ├── story1-detail.jpg ├── story2-map.jpg └── ...", + "✅ ![Patrón de tejido colonial](colonial-textile-detail.jpg){md} ❌ ![Foto](IMG_1234.JPG){md}", + "![Textil colonial con patrón entrelazado](textile-detail.jpg){lg} Detalle de los hilos de urdimbre, circa 1650.", + "
", + "Estudios recientes cuestionan esta interpretación.[^1] [^1]: García, M. (2023). *Repensando los textiles coloniales*. Editorial Universitaria.", + "El sistema de [[encomienda]] estructuró las relaciones tributarias coloniales.", + "Compara con el [textil de Lima](/objects/textile-lima/).", + "El coeficiente es $C = \\frac{8}{35}$ y el resultado es: $$x^4 = \\frac{8}{35}P_4(x) + \\frac{4}{7}P_2(x) + \\frac{1}{5}P_0(x)$$", + "> \"Los patrones revelan una comprensión sofisticada de la geometría.\" > — Autor" + ], + "table": [ + "contenido_capa1 Este textil muestra técnicas avanzadas de tejido del período colonial. El patrón entrelazado indica una artesanía sofisticada.", + "contenido_capa1 textiles-coloniales/paso1-capa1.md", + "Tamaño Palabra clave Ancho máx. Caso de uso Pequeño {sm} o {small} 250 px Miniaturas, iconos, detalles pequeños Mediano {md} o {medium} 450 px Ilustraciones estándar (predeterminado) Grande {lg} o {large} 700 px Imágenes destacadas, vistas detalladas Completo {full} 100% Panoramas, visuales de ancho completo", + "Entorno Propósito align, align* Ecuaciones alineadas (con/sin numeración) equation, equation* Ecuaciones individuales (con/sin numeración) cases Funciones definidas por tramos pmatrix Matrices con paréntesis bmatrix Matrices con corchetes", + "Tipo de contenido Cómo se carga Paneles de historias (capa 1 / capa 2) Automático — se detecta al construir el sitio Texto de paso de historia Automático — se detecta al construir el sitio Descripciones de objetos Automático — se detecta al construir el sitio Definiciones del glosario Automático — se detecta al construir el sitio Páginas personalizadas Siempre disponible Historias cifradas Se carga automáticamente tras descifrar" + ], + "blockquote": [ + "Esta referencia cubre el contenido de los paneles: lo que sigue vale para layer1_content y layer2_content, y para los archivos Markdown que indiquen esas columnas. Los campos question y answer de un paso funcionan de otra manera. La pregunta es un encabezado, así que va en texto plano, sin procesamiento Markdown. Las respuestas quedan en texto corrido y Telar recorta las que pasan de 18 líneas. Consulta Las respuestas son texto corrido.", + "Los tres métodos que siguen son para quien trabaja en una hoja de cálculo. En el Compositor, el título del panel tiene su propio campo, y todo lo que pegues en el campo Contenido —incluido un bloque ---— se publica como parte del texto del panel, no como título.", + "Si copias y pegas desde Microsoft Word, Google Docs o aplicaciones similares, el formato no se conservará. Escribe en sintaxis Markdown.", + "Consejo: No uses # Primer nivel en los paneles; cada panel ya tiene su título.", + "Tamaño predeterminado: las imágenes sin etiqueta de tamaño salen en mediano (450 px). Ponle la etiqueta a cada imagen para que el tamaño quede explícito.", + "Heurística del signo de dólar: para evitar falsos positivos con monedas (ej., \"$50\"), Telar solo trata $...$ como fórmula cuando el contenido incluye caracteres propios de LaTeX como \\, ^, _ o {. Los signos dobles ($$...$$) siempre se tratan como fórmulas." + ], + "img": [] + }, + "text": "Referencia de sintaxis de Markdown El contenido de los paneles de Telar admite formato Markdown enriquecido. Esta referencia recoge la sintaxis más útil para el texto narrativo. Esta referencia cubre el contenido de los paneles : lo que sigue vale para layer1_content y layer2_content , y para los archivos Markdown que indiquen esas columnas. Los campos question y answer de un paso funcionan de otra manera. La pregunta es un encabezado, así que va en texto plano, sin procesamiento Markdown. Las respuestas quedan en texto corrido y Telar recorta las que pasan de 18 líneas. Consulta Las respuestas son texto corrido . ¿Qué es Markdown? Markdown es un lenguaje de marcado ligero que te permite formatear texto usando una sintaxis simple y legible. En lugar de etiquetas HTML complejas, escribes en texto plano con caracteres especiales como * para énfasis o # para encabezados. Markdown es: Fácil de leer : Markdown se lee bien incluso sin procesar Fácil de escribir : sintaxis simple, más rápida que HTML Portátil : los archivos de texto plano funcionan en cualquier parte Convertible : se convierte automáticamente a HTML para mostrarse en el sitio Recursos de aprendizaje ¿Estás empezando con Markdown? Estos recursos te ayudarán: Guía de Markdown — Guía completa para empezar Tutorial de CommonMark — Tutorial interactivo de 10 minutos Hoja de referencia de Markdown — Referencia rápida Telar usa el procesador Python Markdown con las extensiones extra y nl2br . Cómo escribir el contenido de los paneles Puedes escribir el contenido de los paneles de tres maneras. Para más detalles, consulta la Referencia CSV: Historias . Los tres métodos que siguen son para quien trabaja en una hoja de cálculo. En el Compositor, el título del panel tiene su propio campo, y todo lo que pegues en el campo Contenido —incluido un bloque --- — se publica como parte del texto del panel, no como título. Método 1: Introducir texto directamente Escribe el texto del panel directamente en la columna contenido_capa1 de tu hoja de cálculo: contenido_capa1 Este textil muestra técnicas avanzadas de tejido del período colonial. El patrón entrelazado indica una artesanía sofisticada. Los saltos de línea en la celda de tu hoja de cálculo crean saltos de párrafo. Si no indicas otro, el título del panel es el texto del botón. Método 2: Pegar texto Markdown Pega texto desde un editor de texto plano. Puedes incluir encabezados, widgets y un título de panel personalizado usando frontmatter YAML: --- title: \"Técnicas de tejido\" --- El patrón de urdimbre entrelazada visible aquí indica una técnica de tejido compleja que era común en el período colonial. ## Detalles técnicos Estos patrones se creaban usando... Si copias y pegas desde Microsoft Word, Google Docs o aplicaciones similares, el formato no se conservará. Escribe en sintaxis Markdown. Método 3: Indicar un archivo de texto Para contenido complejo, indica un archivo Markdown guardado en telar-content/texts/stories/ : contenido_capa1 textiles-coloniales/paso1-capa1.md El archivo usa frontmatter para el título del panel y admite todas las funciones de Markdown, incluidos los widgets . Cuándo usar archivos de texto : Contenido con widgets (acordeón, pestañas, carrusel) Contenido reutilizado en varias historias Narrativas largas que se benefician de la edición en un editor de texto Formato básico Encabezados ## Encabezado de segundo nivel ### Encabezado de tercer nivel #### Encabezado de cuarto nivel Consejo : No uses # Primer nivel en los paneles; cada panel ya tiene su título. Estilos de texto **Texto en negrita** para énfasis *Texto en cursiva* para énfasis sutil ***Negrita y cursiva*** para máximo énfasis Listas Listas desordenadas: - Primer elemento - Segundo elemento - Elemento anidado - Otro elemento anidado - Tercer elemento Listas ordenadas: 1. Primer paso 2. Segundo paso 3. Tercer paso Enlaces [Texto del enlace](https://example.com) [Enlace interno](/objects/textile-001/) Citas en bloque > Esto es una cita en bloque. > Puede abarcar múltiples líneas. Imágenes Telar proporciona sintaxis especial para controlar los tamaños de imagen en los paneles. Sintaxis básica ![Texto alternativo descriptivo](ruta/a/imagen.jpg){tamaño} Opciones de tamaño Tamaño Palabra clave Ancho máx. Caso de uso Pequeño {sm} o {small} 250 px Miniaturas, iconos, detalles pequeños Mediano {md} o {medium} 450 px Ilustraciones estándar (predeterminado) Grande {lg} o {large} 700 px Imágenes destacadas, vistas detalladas Completo {full} 100% Panoramas, visuales de ancho completo Rutas de imagen Rutas relativas (sin barra inicial) se cargan automáticamente desde /telar-content/objects/ : ![Detalle de tejido](textile-closeup.jpg){md} → Carga /telar-content/objects/textile-closeup.jpg Rutas absolutas (las que empiezan por / ) se cargan desde la raíz del sitio: ![Logo del sitio](/telar-content/objects/logo.png){sm} URLs externas funcionan como se espera: ![Foto del museo](https://example.com/image.jpg){lg} Ejemplos ![Miniatura pequeña](thumb.jpg){small} ![Ilustración mediana](diagram.jpg){md} ![Imagen destacada grande](painting.jpg){large} ![Panorama de ancho completo](landscape.jpg){full} Tamaño predeterminado : las imágenes sin etiqueta de tamaño salen en mediano (450 px). Ponle la etiqueta a cada imagen para que el tamaño quede explícito. Pies de imagen Agrega un pie de imagen colocando texto en la línea inmediatamente después de la imagen: ![Fragmento textil colonial](textile.jpg){lg} Detalle que muestra el patrón de *urdimbre entrelazada* típico del período. El pie de imagen aparece centrado debajo de la imagen en una fuente de peso ligero. Prefijo opcional : Puedes usar caption: para hacer los pies más explícitos: ![Mapa de la región](map.jpg){md} caption: Mapa de la *Recopilación de Leyes*, 1680. El prefijo caption: se elimina del texto mostrado. Markdown en los pies de imagen : admiten formato Markdown como *cursivas* , **negritas** y [enlaces](url) . Medios enriquecidos Videos de YouTube Inserta videos de YouTube adaptables usando un iframe HTML:
Reemplaza VIDEO_ID con el ID de tu video de YouTube. El padding-bottom: 56.25% crea un contenedor con relación de aspecto 16:9. Otros iframes Cualquier contenido incrustable con iframe funciona: Código Código en línea Usa comillas invertidas para referencias de código en línea : El campo `object_id` debe coincidir con el nombre del archivo. Bloques de código Usa triple comillas invertidas para bloques de código: ``` git add . git commit -m \"Actualizar contenido\" git push ``` Con resaltado de sintaxis: ```yaml title: Mi Historia description: Una narrativa convincente ``` Notas al pie Crea notas al pie con sintaxis [^1] : El textil muestra técnicas avanzadas.[^1] [^1]: Basado en el análisis de la Dra. Smith (2020). Las notas al pie aparecen automáticamente al final del panel, con el estilo que les corresponde. Las notas al pie solo funcionan en el contenido de los paneles. Si pones una en la respuesta de un paso, Telar quita tanto el número como el texto de la nota, y lo anota en la salida del build . Notación matemática y científica (LaTeX) Telar permite representar fórmulas matemáticas mediante KaTeX . Puedes incluir fórmulas, ecuaciones químicas y notación científica en cualquier lugar donde se use Markdown: paneles de historias, definiciones del glosario, descripciones de objetos y páginas personalizadas. Cómo funciona Telar detecta automáticamente el LaTeX en el contenido al construir el sitio. No necesitas configurar nada — si el texto contiene notación LaTeX, se representará como fórmula formateada. Fórmulas en línea Encierra las expresiones entre signos de dólar simples para que aparezcan en línea con el texto: El coeficiente es $C = \\frac{8}{35}$ y el polinomio es $P_4(x)$. Se muestra así: El coeficiente es $C = \\frac{8}{35}$ y el polinomio es $P_4(x)$. Heurística del signo de dólar : para evitar falsos positivos con monedas (ej., \"$50\"), Telar solo trata $...$ como fórmula cuando el contenido incluye caracteres propios de LaTeX como \\ , ^ , _ o { . Los signos dobles ( $$...$$ ) siempre se tratan como fórmulas. Fórmulas en bloque Encierra las expresiones entre signos de dólar dobles para obtener ecuaciones centradas e independientes: $$x^4 = \\frac{8}{35}P_4(x) + \\frac{4}{7}P_2(x) + \\frac{1}{5}P_0(x)$$ Se muestra así: $$x^4 = \\frac{8}{35}P_4(x) + \\frac{4}{7}P_2(x) + \\frac{1}{5}P_0(x)$$ También puedes usar los delimitadores \\[...\\] : \\[E = mc^2\\] Ecuaciones de varias líneas Usa \\begin{align}...\\end{align} para ecuaciones alineadas en varias líneas. Marca los puntos de alineación con & y los saltos de línea con \\\\ : $$\\begin{align} P_0(x) &= 1\\\\ P_1(x) &= x\\\\ P_2(x) &= \\frac{1}{2}(3x^2 - 1) \\end{align}$$ Se muestra así: $$\\begin{align} P_0(x) &= 1\\\\ P_1(x) &= x\\\\ P_2(x) &= \\frac{1}{2}(3x^2 - 1) \\end{align}$$ Entornos compatibles Entorno Propósito align , align* Ecuaciones alineadas (con/sin numeración) equation , equation* Ecuaciones individuales (con/sin numeración) cases Funciones definidas por tramos pmatrix Matrices con paréntesis bmatrix Matrices con corchetes Fórmulas químicas Telar incluye la extensión mhchem para notación química: La reacción $\\ce{2H2 + O2 -> 2H2O}$ produce agua. $$\\ce{CO2 + C -> 2CO}$$ Se muestra así: La reacción $\\ce{2H2 + O2 -> 2H2O}$ produce agua. $$\\ce{CO2 + C -> 2CO}$$ Dónde funciona LaTeX Tipo de contenido Cómo se carga Paneles de historias (capa 1 / capa 2) Automático — se detecta al construir el sitio Texto de paso de historia Automático — se detecta al construir el sitio Descripciones de objetos Automático — se detecta al construir el sitio Definiciones del glosario Automático — se detecta al construir el sitio Páginas personalizadas Siempre disponible Historias cifradas Se carga automáticamente tras descifrar Referencia completa de sintaxis Para la lista completa de comandos LaTeX compatibles, consulta la tabla de funciones de KaTeX . Mejores prácticas Texto alternativo para accesibilidad Siempre proporciona texto alternativo descriptivo para las imágenes: ✅ ![Vista detallada de hilos de urdimbre entrelazados](closeup.jpg){lg} ❌ ![Imagen](closeup.jpg){lg} Organización de imágenes Guarda las imágenes de los paneles en /telar-content/objects/ para encontrarlas fácilmente: telar-content/objects/ ├── story1-context.jpg ├── story1-detail.jpg ├── story2-map.jpg └── ... Longitud del contenido Capa 1 : 2–3 párrafos de contexto Capa 2 : Contenido académico más extenso, citas, análisis extendido Divide los textos largos con encabezados, listas e imágenes para que se lean mejor. Nomenclatura de archivos Usa nombres de archivo descriptivos, en minúsculas con guiones: ✅ ![Patrón de tejido colonial](colonial-textile-detail.jpg){md} ❌ ![Foto](IMG_1234.JPG){md} Referencia rápida Ejemplos listos para copiar y pegar de las tareas de formato más comunes: Agregar una imagen con pie ![Textil colonial con patrón entrelazado](textile-detail.jpg){lg} Detalle de los hilos de urdimbre, circa 1650. Agregar un video de YouTube
Agregar una cita con nota al pie Estudios recientes cuestionan esta interpretación.[^1] [^1]: García, M. (2023). *Repensando los textiles coloniales*. Editorial Universitaria. Enlazar a un término del glosario El sistema de [[encomienda]] estructuró las relaciones tributarias coloniales. Enlazar a otro objeto Compara con el [textil de Lima](/objects/textile-lima/). Agregar fórmulas en línea y en bloque El coeficiente es $C = \\frac{8}{35}$ y el resultado es: $$x^4 = \\frac{8}{35}P_4(x) + \\frac{4}{7}P_2(x) + \\frac{1}{5}P_0(x)$$ Crear una cita en bloque > \"Los patrones revelan una comprensión sofisticada de la geometría.\" > — Autor Limitaciones Sin JavaScript : Markdown se convierte a HTML estático Sin atributos HTML personalizados : Usa la sintaxis de tamaño proporcionada en lugar de clases personalizadas Procesamiento de imágenes : Las imágenes en telar-content/objects/ que aparecen en tu CSV de objetos sin fuentes IIIF externas se convertirán automáticamente en teselas ( tiles ) IIIF. LaTeX en el glosario entre páginas : si una página de historia no contiene LaTeX pero un término del glosario sí, las fórmulas no se representarán en la ventana emergente del glosario (KaTeX no se carga en esa página). Es un caso muy poco frecuente. Próximos pasos Tu contenido — Aprende a organizar tus archivos Markdown Contenido enriquecido con Markdown — Crea y edita archivos Markdown Estilos avanzados — Personaliza la apariencia de los paneles" + }, + "/docs/configure/configuration/": { + "ids": [ + "advanced-settings", + "available-themes", + "baseurl-vs-url", + "browse_and_search", + "build-settings", + "christmas_tree_mode", + "collection-interface-settings", + "collection_mode", + "collections", + "configuration", + "defaults", + "development-features", + "featured_count", + "full-example", + "google-sheets-integration", + "hide_warnings", + "iiif-metadata-language-detection", + "include_demo_content", + "multilingual-interface", + "plugins", + "see-also", + "setup-steps", + "show_link_on_homepage", + "show_object_credits", + "show_on_homepage", + "show_sample_on_homepage", + "show_story_steps", + "site-logo", + "site-settings", + "skip_collections", + "skip_stories", + "story-interface-settings", + "story-protection", + "telar-version", + "theme-selection", + "viewer_preloading", + "what-gets-translated", + "what-stays-in-your-language" + ], + "selectors": { + "h1": [ + "Configuration" + ], + "h2": [ + "Site Settings", + "Theme Selection", + "Multilingual Interface", + "Google Sheets Integration", + "Story Interface Settings", + "Collection Interface Settings", + "Story Protection", + "Advanced Settings", + "Full Example", + "See Also" + ], + "h3": [ + "collection_mode", + "baseurl vs. url", + "Site Logo", + "Available Themes", + "What Gets Translated", + "What Stays in Your Language", + "IIIF Metadata Language Detection", + "Setup Steps", + "show_on_homepage", + "show_story_steps", + "include_demo_content", + "browse_and_search", + "show_link_on_homepage", + "show_sample_on_homepage", + "featured_count", + "show_object_credits", + "Collections", + "Defaults", + "Build Settings", + "Plugins", + "Telar Version", + "Development Features" + ], + "h4": [ + "christmas_tree_mode", + "hide_warnings", + "viewer_preloading", + "skip_stories", + "skip_collections" + ], + "h5": [], + "h6": [], + "pre": [ + "# Site Settings title: Your Narrative Title description: A brief description of your narrative exhibition baseurl: \"/repository-name\" # For GitHub Pages subdirectory url: \"https://username.github.io\" author: Your Name email: your-email@example.com telar_theme: \"paisajes\" # Options: paisajes, neogranadina, santa-barbara, austin, or custom logo: \"\" # Path to logo image (optional) telar_language: \"en\" # Options: \"en\" (English), \"es\" (Español) collection_mode: false # Set to true for objects-first homepage layout", + "# GitHub Pages subdirectory url: \"https://username.github.io\" baseurl: \"/telar-site\" # Result: https://username.github.io/telar-site # Custom domain at root url: \"https://mysite.org\" baseurl: \"\" # Result: https://mysite.org", + "logo: \"/telar-content/objects/my-logo.png\"", + "telar_theme: \"paisajes\" # Options: paisajes, neogranadina, santa-barbara, austin, or custom", + "telar_language: \"en\" # Options: \"en\" (English), \"es\" (Español)", + "google_sheets: enabled: true published_url: \"https://docs.google.com/spreadsheets/d/e/YOUR_PUBLISHED_ID/pubhtml\"", + "story_interface: show_on_homepage: true # Set to false to hide stories section from homepage show_story_steps: true # Set to false to hide \"Step X\" overlay show_object_credits: true # Set to false to hide credits badge on objects include_demo_content: false # Set to true to enable demo stories", + "collection_interface: browse_and_search: true # Set to false to disable filtering sidebar and search show_link_on_homepage: true # Set to false to hide \"View the objects\" link show_sample_on_homepage: true # Set to true to show sample objects on homepage featured_count: 4 # Number of objects to show on homepage", + "story_key: \"your-secret-key\"", + "collections: stories: output: true permalink: /stories/:name/ objects: output: true permalink: /objects/:name/ glossary: output: true permalink: /glossary/:name/ pages: output: true permalink: /:name/ # Collections Directory collections_dir: _jekyll-files", + "defaults: - scope: path: \"\" type: \"stories\" values: layout: \"story\" - scope: path: \"\" type: \"objects\" values: layout: \"object\" - scope: path: \"\" type: \"glossary\" values: layout: \"glossary\" - scope: path: \"\" type: \"pages\" values: layout: \"user-page\"", + "markdown: kramdown permalink: pretty exclude: - Gemfile - Gemfile.lock - node_modules - vendor - .github - README.md - docs/ - scripts/ # Tell Jekyll not to expect dates for collections future: true show_drafts: false", + "plugins: - jekyll-seo-tag", + "telar: version: \"1.8.3\" release_date: \"2026-10-31\"", + "development-features: christmas_tree_mode: false hide_warnings: false viewer_preloading: max_viewer_cards: 8 preload_steps: 6 loading_threshold: 5 min_ready_viewers: 3 skip_stories: false skip_collections: false", + "# Site Settings title: Colonial Textiles description: An exhibition of colonial-era textiles from the Americas baseurl: \"/colonial-textiles\" url: \"https://username.github.io\" author: Jane Smith email: jane@example.com telar_theme: \"paisajes\" logo: \"\" telar_language: \"en\" collection_mode: false # Story Interface Settings story_interface: show_on_homepage: true show_story_steps: true show_object_credits: true include_demo_content: false # Collection Interface Settings collection_interface: browse_and_search: true show_link_on_homepage: true show_sample_on_homepage: true featured_count: 4 # Story Protection (optional) # story_key: \"your-secret-key\" # Google Sheets Integration (optional) google_sheets: enabled: true published_url: \"https://docs.google.com/spreadsheets/d/e/XYZ789/pubhtml\" # # PLEASE DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING # # Collections collections: stories: output: true permalink: /stories/:name/ objects: output: true permalink: /objects/:name/ glossary: output: true permalink: /glossary/:name/ pages: output: true permalink: /:name/ collections_dir: _jekyll-files # Build Settings markdown: kramdown permalink: pretty exclude: - Gemfile - Gemfile.lock - node_modules - vendor - .github - README.md - docs/ - scripts/ # Defaults defaults: - scope: path: \"\" type: \"stories\" values: layout: \"story\" - scope: path: \"\" type: \"objects\" values: layout: \"object\" - scope: path: \"\" type: \"glossary\" values: layout: \"glossary\" - scope: path: \"\" type: \"pages\" values: layout: \"user-page\" future: true show_drafts: false # Telar Settings telar: version: \"1.8.3\" release_date: \"2026-10-31\" # Plugins plugins: - jekyll-seo-tag # WEBrick server configuration for development (enables CORS for IIIF) webrick: headers: Access-Control-Allow-Origin: \"*\" Access-Control-Allow-Methods: \"GET, POST, OPTIONS\" Access-Control-Allow-Headers: \"Content-Type\" # Development & Testing development-features: christmas_tree_mode: false hide_warnings: false viewer_preloading: max_viewer_cards: 8 preload_steps: 6 loading_threshold: 5 min_ready_viewers: 3 skip_stories: false skip_collections: false" + ], + "table": [], + "blockquote": [ + "If you need a fully bilingual site with content in multiple languages, you'll need to create separate Telar sites for each language.", + "Only the published URL is needed. If your config still has a shared_url line from an older version, it is safely ignored.", + "Story protection uses client-side encryption. It prevents casual access but is not suitable for highly sensitive content. For stronger security, use a private GitHub repository.", + "Do Not Edit The Telar _config.yml includes a line: \"PLEASE DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING\". The sections below this line are configured automatically and rarely need changes.", + "You typically don't need to modify collection settings unless doing advanced customization.", + "Renamed from hide_stories in v0.8.0. The old name still works for backward compatibility.", + "When skip_collections is enabled, skip_stories is automatically implied. Renamed from hide_collections in v0.8.0 — the old name still works for backward compatibility." + ], + "img": [] + }, + "text": "Configuration Configure your Telar site through the _config.yml file in your repository root. Site Settings Basic site information and appearance: # Site Settings title: Your Narrative Title description: A brief description of your narrative exhibition baseurl: \"/repository-name\" # For GitHub Pages subdirectory url: \"https://username.github.io\" author: Your Name email: your-email@example.com telar_theme: \"paisajes\" # Options: paisajes, neogranadina, santa-barbara, austin, or custom logo: \"\" # Path to logo image (optional) telar_language: \"en\" # Options: \"en\" (English), \"es\" (Español) collection_mode: false # Set to true for objects-first homepage layout collection_mode Switches the homepage layout from stories-first (default) to objects-first: false (default) : Stories appear first on the homepage, with a sample of objects below true : Objects appear first in a large grid (up to 8), with stories in a smaller grid below This is a top-level setting — not nested inside collection_interface: . See Customizing the Home Page for layout details. New in v1.1.0. baseurl vs. url url : Your site's base domain baseurl : Path after domain (use \"\" for root domain, or /repo-name for GitHub Pages) Examples: # GitHub Pages subdirectory url: \"https://username.github.io\" baseurl: \"/telar-site\" # Result: https://username.github.io/telar-site # Custom domain at root url: \"https://mysite.org\" baseurl: \"\" # Result: https://mysite.org Site Logo Add a logo to replace the site title in the navigation header: logo: \"/telar-content/objects/my-logo.png\" Place your logo image in telar-content/objects/ Leave empty ( logo: \"\" ) to display the site title as text instead Recommended dimensions: max 80px tall, 200-300px wide Supports PNG, JPG, SVG formats Theme Selection Telar includes 4 preset themes: telar_theme: \"paisajes\" # Options: paisajes, neogranadina, santa-barbara, austin, or custom Available Themes paisajes (default): Terracotta and olive neogranadina : Burgundy and gold santa-barbara : Teal and coral austin : Burnt orange and slate blue See Customization: Themes for details and creating custom themes. Multilingual Interface Telar v0.4.0+ supports multilingual user interfaces in English and Spanish: telar_language: \"en\" # Options: \"en\" (English), \"es\" (Español) This controls the language of all interface elements, including navigation, buttons, labels, error messages, and instructions. What Gets Translated The telar_language setting changes the language of: Navigation menu : Home, Objects, Stories, Glossary, About Button labels : Copy, Back, Learn More, Go Deeper, etc. Metadata fields : Creator, Period, Medium, Location, Credit, etc. Error messages : All IIIF warnings, validation errors, and configuration issues Story interface : Step indicators, panel headers, coordinate tool Object pages : IIIF manifest labels, coordinate identification instructions Glossary : Panel headers, navigation elements What Stays in Your Language The telar_language setting does not translate your content: Story narratives and panel text (markdown files you create) Object descriptions and metadata (CSV data you provide) Glossary definitions About page content Site title and description If you need a fully bilingual site with content in multiple languages, you'll need to create separate Telar sites for each language. IIIF Metadata Language Detection When Telar auto-extracts metadata from IIIF manifests, it respects your telar_language setting: For English sites ( en ): Prioritizes English metadata, falls back to other languages if unavailable For Spanish sites ( es ): Prioritizes Spanish metadata, falls back to English, then other languages This ensures that object metadata appears in your preferred language when available from the source institution. Google Sheets Integration Manage content via Google Sheets instead of editing CSV files directly: google_sheets: enabled: true published_url: \"https://docs.google.com/spreadsheets/d/e/YOUR_PUBLISHED_ID/pubhtml\" Setup Steps Get the template : Duplicate the template at bit.ly/telar-template Publish your sheet : File → Share → Publish to web Paste the published URL into _config.yml Set enabled: true Commit changes Automated fetching: GitHub Pages : GitHub Actions automatically discovers tab GIDs and fetches CSVs Local development : Run python3 scripts/fetch_google_sheets.py before building Only the published URL is needed. If your config still has a shared_url line from an older version, it is safely ignored. See Google Sheets Reference for complete setup instructions. Story Interface Settings Control how stories display and behave: story_interface: show_on_homepage: true # Set to false to hide stories section from homepage show_story_steps: true # Set to false to hide \"Step X\" overlay show_object_credits: true # Set to false to hide credits badge on objects include_demo_content: false # Set to true to enable demo stories show_on_homepage Controls whether the stories section appears on the homepage: true (default) : Stories appear on the homepage as cards false : Hides the stories section from the homepage (stories remain accessible via direct URL) Use this when you want objects on the homepage but prefer stories to be accessed through navigation or direct links rather than homepage cards. show_story_steps Controls whether the \"Step X\" indicator appears in the top-left corner of the story page. true (default) : Shows \"Step 1\", \"Step 2\", etc. on the story page false : Hides the step indicators for a cleaner, more immersive experience This is purely visual - users can still navigate through steps normally. include_demo_content Enable pre-built demonstration stories that showcase Telar's features: false (default) : Site contains only your content true : Adds tutorial and example stories to your site Demo stories appear alongside your own content with a \"Demo content\" badge. They're automatically fetched during the build process and matched to your site's language. When to enable: Learning how to structure stories Testing Telar features without creating content Showing stakeholders what Telar can do When to disable: Publishing your final production site Testing only your own content See Demo Content for complete details on available demos. Collection Interface Settings Control how the objects gallery displays and behaves: collection_interface: browse_and_search: true # Set to false to disable filtering sidebar and search show_link_on_homepage: true # Set to false to hide \"View the objects\" link show_sample_on_homepage: true # Set to true to show sample objects on homepage featured_count: 4 # Number of objects to show on homepage browse_and_search Controls the gallery's filtering sidebar and full-text search: true (default) : Objects page shows a filter sidebar with facets (type, creator, period, subjects) and a search bar powered by Lunr.js false : Objects page shows a simple grid without filtering or search show_link_on_homepage Controls the \"View the objects\" link on the homepage: true (default) : Shows a link to the objects gallery on the homepage false : Hides the link (objects page still accessible via navigation) show_sample_on_homepage Controls whether sample objects appear on the homepage: true (default) : Shows a sample of objects on the homepage, drawn from those marked as featured in objects.csv (or random if none are featured) false : No objects displayed on the homepage featured_count Number of objects to display on the homepage when show_sample_on_homepage is true: Default : 4 Prioritizes objects marked featured: yes in objects.csv If fewer featured objects exist than featured_count , fills remaining slots randomly Story Protection Encrypt stories so that only viewers with the correct key can access them: story_key: \"your-secret-key\" Stories with private: yes in project.csv will be encrypted after the build ( protected also accepted as a column name) Viewers access private stories via a URL parameter: ?key=your-secret-key Leave story_key empty or omit it to disable story protection If any story is marked private: yes , the build fails rather than publish it as plaintext — either because story_key is missing, or because the build workflow doesn't run the encryption step (sites upgraded from before v1.6.0 need this added by hand) See Private Stories for setup, local-testing, and build-failure details Story protection uses client-side encryption. It prevents casual access but is not suitable for highly sensitive content. For stronger security, use a private GitHub repository. show_object_credits Controls the credit attribution badge on object pages: true (default) : Shows credit badge on all objects with credit information false : Hides the credit badge (credit info still accessible via metadata table) The credit badge displays in the top-right corner of object images, showing attribution from the credit field in your objects.csv . Advanced Settings The following settings are pre-configured and typically don't need modification unless you're doing advanced customization. Do Not Edit The Telar _config.yml includes a line: \"PLEASE DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING\". The sections below this line are configured automatically and rarely need changes. Collections Jekyll collections define content types: collections: stories: output: true permalink: /stories/:name/ objects: output: true permalink: /objects/:name/ glossary: output: true permalink: /glossary/:name/ pages: output: true permalink: /:name/ # Collections Directory collections_dir: _jekyll-files You typically don't need to modify collection settings unless doing advanced customization. The collections_dir setting tells Jekyll where to find auto-generated working files. Defaults Layout defaults for each collection: defaults: - scope: path: \"\" type: \"stories\" values: layout: \"story\" - scope: path: \"\" type: \"objects\" values: layout: \"object\" - scope: path: \"\" type: \"glossary\" values: layout: \"glossary\" - scope: path: \"\" type: \"pages\" values: layout: \"user-page\" Build Settings Standard Jekyll build configuration: markdown: kramdown permalink: pretty exclude: - Gemfile - Gemfile.lock - node_modules - vendor - .github - README.md - docs/ - scripts/ # Tell Jekyll not to expect dates for collections future: true show_drafts: false Plugins Required plugin: plugins: - jekyll-seo-tag Installed automatically when you run bundle install . Telar Version Version information (updated automatically during releases): telar: version: \"1.8.3\" release_date: \"2026-10-31\" Development Features Options for development, testing, and special use cases (please do not edit these unless you know what you are doing): development-features: christmas_tree_mode: false hide_warnings: false viewer_preloading: max_viewer_cards: 8 preload_steps: 6 loading_threshold: 5 min_ready_viewers: 3 skip_stories: false skip_collections: false christmas_tree_mode Displays all warning messages for testing multilingual support: false (default) : Normal operation true : Shows test objects with fake errors to verify all warning messages display correctly Use this only when testing translations or warning message styling. hide_warnings Hides the warnings the build produces on the published site: false (default) : Warnings about your content (missing images, IIIF problems, missing glossary entries, configuration errors) appear on the pages they refer to, so you can see and fix them true : Visitors don't see the warnings, but the build log still lists them Use this only when you have checked a warning and know it does not affect your site. While it is on, you won't see warnings about new problems on your site either. viewer_preloading Controls how story viewers are preloaded for smoother navigation: max_viewer_cards (default: 8, max: 15): The most scenes whose viewer stays loaded; past it, the viewer farthest from the current step is unloaded preload_steps (default: 6): Steps to preload ahead of current position loading_threshold (default: 5): Show loading shimmer on intro if story has this many or more viewers min_ready_viewers (default: 3): Hide shimmer when this many viewers are ready Higher values = smoother scrolling but more memory usage. The defaults work well for most sites. skip_stories Build a site without stories, keeping only objects visible: false (default) : Stories are generated and displayed normally true : Skips story generation and hides the stories section from the index page Use this when you want to showcase objects without narrative stories, or when building a catalog-style site. Renamed from hide_stories in v0.8.0. The old name still works for backward compatibility. skip_collections Build a site with only custom user pages (no objects or stories): false (default) : Objects and stories are generated normally true : Skips both object AND story generation, hides stories section and objects teaser from index, removes /objects/ from navigation Use this when building a site with only custom pages (like an \"About\" or landing page) without any collections. When skip_collections is enabled, skip_stories is automatically implied. Renamed from hide_collections in v0.8.0 — the old name still works for backward compatibility. Full Example Here's a complete _config.yml example: # Site Settings title: Colonial Textiles description: An exhibition of colonial-era textiles from the Americas baseurl: \"/colonial-textiles\" url: \"https://username.github.io\" author: Jane Smith email: jane@example.com telar_theme: \"paisajes\" logo: \"\" telar_language: \"en\" collection_mode: false # Story Interface Settings story_interface: show_on_homepage: true show_story_steps: true show_object_credits: true include_demo_content: false # Collection Interface Settings collection_interface: browse_and_search: true show_link_on_homepage: true show_sample_on_homepage: true featured_count: 4 # Story Protection (optional) # story_key: \"your-secret-key\" # Google Sheets Integration (optional) google_sheets: enabled: true published_url: \"https://docs.google.com/spreadsheets/d/e/XYZ789/pubhtml\" # # PLEASE DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING # # Collections collections: stories: output: true permalink: /stories/:name/ objects: output: true permalink: /objects/:name/ glossary: output: true permalink: /glossary/:name/ pages: output: true permalink: /:name/ collections_dir: _jekyll-files # Build Settings markdown: kramdown permalink: pretty exclude: - Gemfile - Gemfile.lock - node_modules - vendor - .github - README.md - docs/ - scripts/ # Defaults defaults: - scope: path: \"\" type: \"stories\" values: layout: \"story\" - scope: path: \"\" type: \"objects\" values: layout: \"object\" - scope: path: \"\" type: \"glossary\" values: layout: \"glossary\" - scope: path: \"\" type: \"pages\" values: layout: \"user-page\" future: true show_drafts: false # Telar Settings telar: version: \"1.8.3\" release_date: \"2026-10-31\" # Plugins plugins: - jekyll-seo-tag # WEBrick server configuration for development (enables CORS for IIIF) webrick: headers: Access-Control-Allow-Origin: \"*\" Access-Control-Allow-Methods: \"GET, POST, OPTIONS\" Access-Control-Allow-Headers: \"Content-Type\" # Development & Testing development-features: christmas_tree_mode: false hide_warnings: false viewer_preloading: max_viewer_cards: 8 preload_steps: 6 loading_threshold: 5 min_ready_viewers: 3 skip_stories: false skip_collections: false See Also Config Validator — Check your _config.yml for common errors Config Generator and Editor — Generate or edit a _config.yml file Customize Your Theme Customize Your Home Page Configure Navigation Menu Demo Content Private Stories CSV Reference: Project GitHub Actions" + }, + "/docs/developers/github-actions/": { + "ids": [ + "automated-actions-github", + "build-fails-every-time", + "build-performance", + "build-status", + "build-succeeds-but-site-not-updating", + "build-triggers", + "checking-build-status", + "common-build-errors", + "csv-parsing-error", + "github-actions-workflow", + "google-sheets-fetch-error", + "google-sheets-not-updating", + "how-to-manually-trigger", + "iiif-generation-error", + "jekyll-build-error", + "manual-build-trigger", + "next-steps", + "optimizing-build-time", + "private-story-build-failure", + "spreadsheet-refused", + "troubleshooting", + "user-actions-you", + "viewing-build-logs", + "what-github-actions-does", + "when-to-trigger-manually", + "workflow-file" + ], + "selectors": { + "h1": [ + "GitHub Actions Workflow" + ], + "h2": [ + "What GitHub Actions Does", + "Build Triggers", + "Manual Build Trigger", + "Workflow File", + "Build Status", + "Common Build Errors", + "Build Performance", + "Troubleshooting", + "Next Steps" + ], + "h3": [ + "User Actions (You)", + "Automated Actions (GitHub)", + "How to Manually Trigger", + "When to Trigger Manually", + "Checking Build Status", + "Viewing Build Logs", + "CSV Parsing Error", + "Spreadsheet Refused", + "IIIF Generation Error", + "Jekyll Build Error", + "Google Sheets Fetch Error", + "Private Story Build Failure", + "Optimizing Build Time", + "Build Fails Every Time", + "Build Succeeds But Site Not Updating", + "Google Sheets Not Updating" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "name: Build and Deploy Telar Site on: push: branches: [main] workflow_dispatch: inputs: force_iiif: description: 'Force IIIF tile regeneration' type: boolean default: true force_audio: description: 'Force audio regeneration' type: boolean default: true jobs: build-and-deploy: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v7 - name: Set up Ruby uses: ruby/setup-ruby@v1 with: ruby-version: '3.2' - name: Set up Python uses: actions/setup-python@v7 with: python-version: '3.11' - name: Set up Node.js uses: actions/setup-node@v7 with: node-version: '22' - name: Build JavaScript bundle - name: Fetch data from Google Sheets (if enabled) - name: Convert CSV to JSON - name: Generate Jekyll collections - name: Generate search data - name: Process audio objects (peaks + clips) # Only when audio files changed, or on a manual run with force_audio; # otherwise the audio data is restored from the cache - name: Build Jekyll site - name: Check for destination conflicts - name: Generate IIIF tiles into _site # Only when images, objects.csv or _config.yml changed, or on a manual # run with force_iiif; otherwise the tiles are restored from the cache - name: Encrypt protected stories - name: Upload artifact uses: actions/upload-pages-artifact@v5 - name: Deploy to GitHub Pages uses: actions/deploy-pages@v5" + ], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "GitHub Actions Workflow Telar uses GitHub Actions to automatically build and deploy your site. Understanding this workflow helps you troubleshoot issues and optimize your development process. What GitHub Actions Does When you deploy via GitHub Pages, the build process is fully automated . No manual steps required! User Actions (You) Edit content directly on GitHub or push from local: Edit the objects tab in your Google Sheet or objects.csv in telar-content/spreadsheets/ Edit markdown in telar-content/texts/ Add images to telar-content/objects/ Commit and push to main branch Automated Actions (GitHub) The workflow ( .github/workflows/build.yml ) automatically: Fetches Google Sheets (if enabled) Downloads content from your published Google Sheet Converts to CSV format Saves to telar-content/spreadsheets/ Converts CSVs to JSON Runs scripts/csv_to_json.py Reads CSVs from telar-content/spreadsheets/ Embeds markdown content from telar-content/texts/ Generates JSON files in _data/ for Jekyll Generates IIIF Tiles Runs scripts/generate_iiif.py Processes only objects listed in objects.csv without external IIIF manifests Finds images in telar-content/objects/ by object_id Creates tiled image pyramids in iiif/objects/ Generates manifest files Processes Audio (conditional) Runs only when audio files are detected in telar-content/objects/ Installs ffmpeg and audiowaveform on the runner Extracts audio clips and generates waveform peak data Uses a content-hash cache key so unchanged audio is not reprocessed Builds JavaScript Bundle Sets up Node.js and runs npm install Bundles JavaScript modules with esbuild in IIFE format Outputs assets/js/telar-story.js with source map Builds Jekyll Site Runs bundle exec jekyll build Compiles templates with data Outputs to _site/ directory Encrypts Private Stories Runs scripts/encrypt_protected_stories.py , unconditionally, immediately before deploy Encrypts any story marked private: yes (or protected: yes ) in place in _site/ Fails the build if anything would otherwise ship as plaintext Deploys to GitHub Pages Publishes _site/ directory Site goes live at your GitHub Pages URL Build Triggers The workflow runs automatically when: Push to main branch : Any commit triggers a build CSV or markdown changes : Content updates deploy immediately Config changes : _config.yml modifications rebuild site Manual Build Trigger Sometimes you need to rebuild without making code changes (e.g., after editing Google Sheets). How to Manually Trigger Go to your repository on GitHub Click Actions tab Select Build and Deploy workflow Click Run workflow button (top right) Select branch (usually main ) Click green Run workflow button Wait 2-5 minutes for completion When to Trigger Manually After editing Google Sheets content After adding objects or story steps in Google Sheets To rebuild without code changes To force a clean build Workflow File The workflow is defined in .github/workflows/build.yml . The following is a simplified outline — the actual file contains caching logic and conditional steps: name: Build and Deploy Telar Site on: push: branches: [main] workflow_dispatch: inputs: force_iiif: description: 'Force IIIF tile regeneration' type: boolean default: true force_audio: description: 'Force audio regeneration' type: boolean default: true jobs: build-and-deploy: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v7 - name: Set up Ruby uses: ruby/setup-ruby@v1 with: ruby-version: '3.2' - name: Set up Python uses: actions/setup-python@v7 with: python-version: '3.11' - name: Set up Node.js uses: actions/setup-node@v7 with: node-version: '22' - name: Build JavaScript bundle - name: Fetch data from Google Sheets (if enabled) - name: Convert CSV to JSON - name: Generate Jekyll collections - name: Generate search data - name: Process audio objects (peaks + clips) # Only when audio files changed, or on a manual run with force_audio; # otherwise the audio data is restored from the cache - name: Build Jekyll site - name: Check for destination conflicts - name: Generate IIIF tiles into _site # Only when images, objects.csv or _config.yml changed, or on a manual # run with force_iiif; otherwise the tiles are restored from the cache - name: Encrypt protected stories - name: Upload artifact uses: actions/upload-pages-artifact@v5 - name: Deploy to GitHub Pages uses: actions/deploy-pages@v5 On a manual run, the force_iiif and force_audio checkboxes decide whether IIIF tiles and audio are regenerated. Both are ticked by default. Untick one to take that part from the cache instead, and the build finishes sooner. Build Status Checking Build Status Go to Actions tab in your repository See list of recent workflow runs Green checkmark = successful build Red X = failed build Viewing Build Logs Click on a workflow run Click on the job name (e.g., \"build-and-deploy\") Expand steps to see detailed logs Use logs to troubleshoot errors Common Build Errors CSV Parsing Error Error: Failed to parse story-1.csv Solution: Check CSV file for syntax errors Ensure all required columns are present Verify no special characters breaking CSV format Spreadsheet Refused Error: Two columns in this spreadsheet mean the same thing: ... (fails at the \"Convert CSV to JSON\" step; the message names the file) Solution: Two of the sheet's headers name the same field, for example medium and medium_genre , or privado and protected . Keep one of each pair, delete the other, and rebuild. If you edit your site in the Compositor, publish it again from there instead of editing the file. Error: This spreadsheet has a column Telar uses for itself: '_metadata' (fails at the same step) Solution: Rename the _metadata column and rebuild. Telar keeps that name for its own use: if a row has anything in that column, Telar reads it as its own data and leaves the row off the published site. IIIF Generation Error Error: Failed to process image textile-001.jpg Solution: Verify image file exists in telar-content/objects/ Ensure object is listed in the objects tab of your Google Sheet or objects.csv with blank source_url Check image isn't corrupted Ensure image format is supported (JPG, PNG, TIFF) Jekyll Build Error Error: Liquid syntax error Solution: Check markdown files for invalid syntax Verify frontmatter is properly formatted Look for unclosed tags or brackets Google Sheets Fetch Error Error: Failed to fetch Google Sheets Solution: Verify published_url is correct in _config.yml Ensure sheet is published to web (not just shared) Check sheet has proper permissions Private Story Build Failure Error: story/stories are marked protected but no story_key is set (fails at the \"Convert CSV to JSON\" step) Solution: Add story_key: yourkey to _config.yml , or remove private: yes from the story Error: story/stories are marked protected, but .github/workflows/build.yml does not run scripts/encrypt_protected_stories.py (fails at the \"Convert CSV to JSON\" step) Solution: Your build workflow predates v1.6.0's private-story encryption step. See Upgrading Telar: v1.6.0 Upgrade Notes to update build.yml . Error: the \"Encrypt protected stories\" step itself fails (near the end of the build, just before \"Upload artifact\") Solution: This means the rendered site still contains a trace of a private story's content that should have been encrypted away. This is a bug, not a configuration issue — report it with the workflow run link. Build Performance Typical build times: Small sites (< 10 objects, 1-2 stories): 2-3 minutes Medium sites (10-50 objects, multiple stories): 3-5 minutes Large sites (50+ objects, many stories): 5-10 minutes Optimizing Build Time Use external IIIF for large images (skips tile generation) Commit fewer images at once (split large uploads) Clean repository periodically (remove unused files) Troubleshooting Build Fails Every Time Check recent commits for errors Review build logs for specific error messages Test locally first ( bundle exec jekyll serve ) — note that this never runs the private-story encryption step, so it won't reproduce a private-story build failure. For that, use python3 scripts/build_local_site.py --build-only instead (see Local Development Reference ) Revert to last working commit if needed Build Succeeds But Site Not Updating Clear browser cache (hard refresh: Cmd+Shift+R or Ctrl+Shift+R) Wait 5 minutes for CDN propagation Check GitHub Pages settings (Settings → Pages) Verify correct branch is set for Pages deployment Google Sheets Not Updating Manually trigger workflow (see above) Verify the published URL in _config.yml Check the sheet is published to web Review fetch logs in Actions tab Next Steps Local Development Reference Configuration Guide Troubleshooting Tips" + }, + "/guia/desarrolladores/github-actions/": { + "ids": [ + "acciones-automatizadas-github", + "acciones-del-usuario-tú", + "activador-manual-del-build", + "activadores-del-build", + "cuándo-activarlo-manualmente", + "cómo-activarlo-manualmente", + "el-build-falla-cada-vez", + "el-build-tiene-éxito-pero-el-sitio-no-se-actualiza", + "error-de-análisis-csv", + "error-de-generación-iiif", + "error-de-obtención-de-google-sheets", + "error-del-build-de-jekyll", + "errores-comunes-del-build", + "fallo-del-build-por-historia-privada", + "flujo-de-trabajo-con-github-actions", + "google-sheets-no-se-actualiza", + "guide-title", + "hoja-de-cálculo-rechazada", + "optimiza-el-tiempo-del-build", + "próximos-pasos", + "qué-hace-github-actions", + "rendimiento-del-build", + "solución-de-problemas" + ], + "selectors": { + "h1": [ + "GitHub Actions" + ], + "h2": [ + "Flujo de trabajo con GitHub Actions", + "Qué hace GitHub Actions", + "Activadores del build", + "Activador manual del build", + "Errores comunes del build", + "Rendimiento del build", + "Solución de problemas", + "Próximos pasos" + ], + "h3": [ + "Acciones del usuario (tú)", + "Acciones automatizadas (GitHub)", + "Cómo activarlo manualmente", + "Cuándo activarlo manualmente", + "Error de análisis CSV", + "Hoja de cálculo rechazada", + "Error de generación IIIF", + "Error del build de Jekyll", + "Error de obtención de Google Sheets", + "Fallo del build por historia privada", + "Optimiza el tiempo del build", + "El build falla cada vez", + "El build tiene éxito pero el sitio no se actualiza", + "Google Sheets no se actualiza" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [ + "Cuando activas el flujo de trabajo a mano, las casillas force_iiif y force_audio deciden si se regeneran las teselas IIIF y el audio. Las dos vienen marcadas. Si desmarcas una, esa parte se toma del caché y el build termina antes." + ], + "img": [] + }, + "text": "GitHub Actions Flujo de trabajo con GitHub Actions Telar usa GitHub Actions para construir y publicar automáticamente tu sitio. Entender este flujo de trabajo te ayuda a solucionar problemas y optimizar tu proceso de desarrollo. Qué hace GitHub Actions Cuando publicas vía GitHub Pages, el build es completamente automatizado . ¡No se requieren pasos manuales! Acciones del usuario (tú) Edita contenido directamente en GitHub o empuja desde local: Edita la pestaña objects de tu Google Sheet o objects.csv en telar-content/spreadsheets/ Edita Markdown en telar-content/texts/ Agrega imágenes a telar-content/objects/ Haz commit y push a la rama main Acciones automatizadas (GitHub) El flujo de trabajo ( .github/workflows/build.yml ) automáticamente: Obtiene Google Sheets (si está habilitado) Descarga contenido de tu Google Sheet publicado Convierte a formato CSV Guarda en telar-content/spreadsheets/ Convierte CSVs a JSON Ejecuta scripts/csv_to_json.py Lee CSVs de telar-content/spreadsheets/ Incrusta contenido Markdown de telar-content/texts/ Genera archivos JSON en _data/ para Jekyll Genera teselas IIIF Ejecuta scripts/generate_iiif.py Procesa solo los objetos listados en objects.csv que no tienen manifiestos IIIF externos Busca imágenes en telar-content/objects/ según el object_id Crea pirámides de teselas en iiif/objects/ Genera archivos de manifiesto Procesa audio (condicional) Se ejecuta solo cuando se detectan archivos de audio en telar-content/objects/ Instala ffmpeg y audiowaveform en el ejecutor Extrae clips de audio y genera datos de picos para la forma de onda Usa una clave de caché basada en el hash del contenido para no reprocesar audio sin cambios Construye el paquete de JavaScript Configura Node.js y ejecuta npm install Empaqueta los módulos de JavaScript con esbuild en formato IIFE Genera assets/js/telar-story.js con mapa de origen Construye el sitio Jekyll Ejecuta bundle exec jekyll build Combina las plantillas con los datos Salida al directorio _site/ Cifra las historias privadas Ejecuta scripts/encrypt_protected_stories.py , siempre, justo antes de publicar Cifra en el propio _site/ cualquier historia marcada private: yes (o protected: yes ) Hace fallar el build si algo quedara por publicarse en texto plano Publica en GitHub Pages Publica directorio _site/ El sitio queda en vivo en la URL de GitHub Pages Activadores del build El flujo de trabajo se ejecuta automáticamente cuando: Push a rama main : Cualquier confirmación activa un build Cambios a CSV o Markdown : Las actualizaciones de contenido se publican inmediatamente Cambios a config : Modificaciones a _config.yml reconstruyen el sitio Activador manual del build A veces necesitas reconstruir sin hacer cambios de código (ej., después de editar Google Sheets). Cómo activarlo manualmente Ve a tu repositorio en GitHub Haz clic en la pestaña Actions Selecciona el flujo de trabajo Build and Deploy Haz clic en el botón Run workflow (arriba a la derecha) Selecciona la rama (usualmente main ) Haz clic en el botón verde Run workflow Espera 2-5 minutos para completar Cuándo activarlo manualmente Después de editar contenido de Google Sheets Después de agregar objetos o pasos de historia en Google Sheets Para reconstruir sin cambios de código Para forzar un build limpio Cuando activas el flujo de trabajo a mano, las casillas force_iiif y force_audio deciden si se regeneran las teselas IIIF y el audio. Las dos vienen marcadas. Si desmarcas una, esa parte se toma del caché y el build termina antes. Errores comunes del build Error de análisis CSV Error: Failed to parse story-1.csv Solución: Verifica el archivo CSV para errores de sintaxis Asegura que todas las columnas requeridas estén presentes Verifica que no haya caracteres especiales rompiendo el formato CSV Hoja de cálculo rechazada Error: Two columns in this spreadsheet mean the same thing: ... (falla en el paso \"Convert CSV to JSON\"; el mensaje nombra el archivo) Solución: Dos encabezados de la hoja nombran el mismo campo, por ejemplo medium y medium_genre , o privado y protected . Deja uno de cada par, borra el otro y reconstruye el sitio. Si editas tu sitio en el Compositor, vuelve a publicarlo desde allí en lugar de editar el archivo. Error: This spreadsheet has a column Telar uses for itself: '_metadata' (falla en el mismo paso) Solución: Cámbiale el nombre a la columna _metadata y reconstruye el sitio. Telar reserva ese nombre para su propio uso: si una fila tiene algo escrito en esa columna, Telar la toma por un dato interno y no la muestra en el sitio publicado. Error de generación IIIF Error: Failed to process image textile-001.jpg Solución: Verifica que el archivo de imagen exista en telar-content/objects/ Asegúrate de que el objeto esté listado en la pestaña objects de tu Google Sheet o en objects.csv con la columna source_url vacía Verifica que la imagen no esté dañada Asegúrate de que el formato de imagen sea compatible (JPG, PNG, TIFF) Error del build de Jekyll Error: Liquid syntax error Solución: Verifica archivos Markdown para sintaxis inválida Verifica que el frontmatter esté correctamente formateado Busca etiquetas o corchetes sin cerrar Error de obtención de Google Sheets Error: Failed to fetch Google Sheets Solución: Verifica que published_url sea correcto en _config.yml Asegura que la hoja esté publicada en la web (no solo compartida) Verifica que la hoja tenga permisos apropiados Fallo del build por historia privada Error: story/stories are marked protected but no story_key is set (falla en el paso \"Convert CSV to JSON\") Solución: Agrega story_key: tuclave a _config.yml , o quítale private: yes a la historia Error: story/stories are marked protected, but .github/workflows/build.yml does not run scripts/encrypt_protected_stories.py (falla en el paso \"Convert CSV to JSON\") Solución: Tu flujo de trabajo Build and Deploy es anterior al paso de cifrado de historias privadas de v1.6.0. Consulta Actualizar Telar: notas de v1.6.0 para actualizar build.yml . Error: el propio paso \"Encrypt protected stories\" falla (cerca del final del build , justo antes de \"Upload artifact\") Solución: Significa que el sitio generado todavía contiene un rastro del contenido de una historia privada que debió quedar cifrado. Es un error del programa, no de configuración — repórtalo con el enlace a la ejecución del flujo de trabajo. Rendimiento del build Tiempos típicos del build : Sitios pequeños (< 10 objetos, 1-2 historias): 2-3 minutos Sitios medianos (10-50 objetos, múltiples historias): 3-5 minutos Sitios grandes (50+ objetos, muchas historias): 5-10 minutos Optimiza el tiempo del build Usa IIIF externo para imágenes grandes (evita generar teselas ( tiles )) Confirma menos imágenes a la vez (divide cargas grandes) Limpia repositorio periódicamente (elimina archivos sin usar) Solución de problemas El build falla cada vez Verifica confirmaciones recientes para errores Revisa el registro del build para mensajes de error específicos Prueba localmente primero ( bundle exec jekyll serve ) — ten en cuenta que este comando nunca ejecuta el paso de cifrado de historias privadas, así que no reproduce un fallo del build por historia privada. Para eso, usa python3 scripts/build_local_site.py --build-only (consulta la Referencia de Desarrollo Local ) Revierte a la última confirmación funcional si es necesario El build tiene éxito pero el sitio no se actualiza Limpia caché del navegador (recarga forzada: Cmd+Shift+R o Ctrl+Shift+R) Espera 5 minutos para propagación de CDN Verifica configuración de GitHub Pages (Settings → Pages) Verifica que la rama correcta esté establecida para publicación en Pages Google Sheets no se actualiza Activa flujo de trabajo manualmente (ver arriba) Verifica la URL publicada en _config.yml Verifica que la hoja esté publicada en la web Revisa los logs de obtención en pestaña Actions Próximos pasos Referencia de Desarrollo Local Guía de Configuración Consejos de Solución de Problemas" + }, + "/docs/getting-started/narrative-structure/": { + "ids": [ + "build-a-string-of-questions", + "give-the-opening-a-job", + "layered-panels", + "plan-your-narrative", + "planning-your-story", + "sketch-the-narrative-arc", + "the-questionanswerinvitation-pattern", + "try-the-sequence-aloud", + "write-an-ending-that-follows-from-the-steps" + ], + "selectors": { + "h1": [ + "Sketch the narrative arc" + ], + "h2": [ + "Give the opening a job", + "Build a string of questions", + "Write an ending that follows from the steps", + "Try the sequence aloud" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Sketch the narrative arc A story leads visitors from an opening to an ending through a sequence of close looks. Its steps should develop the guiding question in your exhibition brief. Give the opening a job Introduce the source, the question and the context visitors need to begin. Offer a first view that helps them orient themselves. Save details that matter later for the steps where they become useful. The opening square in the narrative planner marks this introduction. It is not an extra question to squeeze into the first step. Build a string of questions Write one question or observation for each circle. Move from something visitors can recognise towards the relationships or interpretation you want them to understand. For a painting, a possible sequence is: What do we see? Which details identify the place? Why were those details included? What does their arrangement suggest? These are prompts to investigate, not claims the image proves by itself. Put a source or source detail beside each question. If you cannot show the evidence for an answer, revise the answer, add a source or acknowledge the uncertainty. Beginning Questions & sources Further layers Ending Write an ending that follows from the steps The upward triangle marks the ending. Return to the guiding question and draw together what the visitor has examined. Do not introduce the source on which the whole interpretation depends only at the end. Ask whether the ending would make sense to someone who read only the main route. Optional panels can enrich the argument, but the central thread should remain understandable without them. Try the sequence aloud Read just the questions and short answers in order. Then ask a colleague to do the same while looking at the proposed views. Remove repeated explanations. Divide a step that asks visitors to make two unrelated observations. Add a transition where a change of source, place or time is hard to follow. Move specialist context into a panel when it interrupts the main route. Your result: an opening, a numbered sequence of questions with sources, and a provisional ending. Next, choose the framing for each step ." + }, + "/guia/primeros-pasos/agrega-contenido/": { + "ids": [ + "agrega-el-primer-paso", + "agrega-la-fuente", + "agrega-paneles-de-detalle", + "agrega-profundidad-opcional", + "agrega-tu-contenido", + "agrega-tus-archivos-multimedia", + "agrega-un-objeto-y-una-primera-historia", + "construye-tu-sitio", + "estructura-tu-historia", + "genera-la-primera-versión", + "registra-la-historia", + "registra-tus-historias", + "registra-tus-objetos" + ], + "selectors": { + "h1": [ + "Agrega un objeto y una primera historia" + ], + "h2": [ + "Agrega la fuente", + "Registra la historia", + "Agrega el primer paso", + "Agrega profundidad opcional", + "Genera la primera versión" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "https://juancobo.com/138la/iiif/khipu/p7/manifest.json" + ], + "table": [ + "order story_id title 1 historia-khipu Examinando un khipu", + "Columna Ejemplo step 1 object khipu x, y, zoom 0.5, 0.5, 1 question ¿Qué actividad documenta esta imagen? answer Una toma de muestras de un khipu para datación por radiocarbono en la primavera de 2025. alt_text Manos con guantes trabajan con cuerdas anudadas sobre una superficie blanca." + ], + "blockquote": [], + "img": [] + }, + "text": "Agrega un objeto y una primera historia Empieza con un objeto y una secuencia breve. Cuando funcione el recorrido completo, amplíalo con otras fuentes y capas opcionales. Agrega la fuente En objects , agrega ID, título, dirección de origen y metadatos útiles. Para una fuente IIIF externa, pega el manifiesto en source_url . Si necesitas un ejemplo para practicar: https://juancobo.com/138la/iiif/khipu/p7/manifest.json Elige el ID khipu y un título como \"Khipu háptico\". Describe la actividad visible y conserva la información de catálogo y el crédito de la fuente. Para alojar un archivo propio, súbelo a telar-content/objects/ en el repositorio, usa su nombre como ID y deja source_url vacío. Consulta las imágenes autoalojadas para formatos y procesamiento. Registra la historia En project , agrega orden, ID estable y título. Por ejemplo: order story_id title 1 historia-khipu Examinando un khipu Crea o renombra la pestaña como historia-khipu . El ID y la pestaña deben coincidir. Conserva los encabezados de la plantilla. Agrega el primer paso Completa una fila: Columna Ejemplo step 1 object khipu x , y , zoom 0.5 , 0.5 , 1 question ¿Qué actividad documenta esta imagen? answer Una toma de muestras de un khipu para datación por radiocarbono en la primavera de 2025. alt_text Manos con guantes trabajan con cuerdas anudadas sobre una superficie blanca. Agrega otra fila numerada para la siguiente observación. Puedes volver al mismo objeto con otro encuadre. En objetos de varias páginas, la columna opcional page elige primero la página. Para grabaciones, usa clip_start y clip_end en segundos y loop cuando corresponda. Revisa video y audio antes de elegir un proveedor con otro comportamiento de reproducción. Agrega profundidad opcional Escribe contexto adicional en layer1_content y un nombre útil para el botón en layer1_button . El segundo panel usa layer2_content y se abre desde el primero. Para textos extensos, referencia un archivo Markdown. Agrega términos en glossary e inserta enlaces [[id-del-termino]] en los campos que los admiten. Genera la primera versión Guarda los cambios de la hoja. En el repositorio, abre Actions , selecciona Build and Deploy y después Run workflow . El build descarga la hoja publicada. Espera a que termine y abre el sitio. Sigue con los encuadres y la revisión ." + }, + "/guia/configurar/": { + "ids": [ + "configura-tu-proyecto", + "en-esta-sección" + ], + "selectors": { + "h1": [ + "Configura tu proyecto" + ], + "h2": [ + "En esta sección" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Configura tu proyecto El comportamiento de Telar se controla a través de _config.yml , un archivo YAML en la raíz de tu repositorio. Allí se definen el título de tu sitio, el tema, el idioma, la conexión con Google Sheets y las opciones de funciones. Si usaste la configuración con Google Sheets , ya tienes un _config.yml funcional. Esta sección te ayuda a entender qué contiene y cómo modificarlo. En esta sección Generador y editor de configuración — Crea un nuevo _config.yml desde cero o carga uno existente para editarlo Referencia de configuración — Lista completa de cada opción y qué hace Validador de configuración — Pega tu _config.yml para verificar errores antes de hacer commit" + }, + "/guia/desarrolladores/estilos/": { + "ids": [ + "agregar-interacciones-personalizadas", + "animación", + "capas-de-cascada", + "css-personalizado", + "cuerpo-de-texto", + "diseño-adaptable", + "estilos-avanzados", + "estilos-de-componentes", + "estilos-de-encabezados", + "guide-title", + "mejores-prácticas", + "modifica-los-diseños", + "modifica-los-includes", + "modificar-el-comportamiento-de-la-historia", + "método-1-agrega-a-telarscss", + "método-2-crea-una-hoja-de-estilos-personalizada", + "optimización-de-rendimiento", + "paneles-en-capas", + "pasos-de-historia", + "personalización-de-javascript", + "personalización-de-tipografía", + "personalización-del-diseño", + "próximos-pasos", + "tarjetas-de-objeto", + "variables-css" + ], + "selectors": { + "h1": [ + "Estilos avanzados" + ], + "h2": [ + "Estilos avanzados", + "CSS personalizado", + "Variables CSS", + "Personalización del diseño", + "Estilos de componentes", + "Diseño adaptable", + "Capas de cascada", + "Personalización de JavaScript", + "Personalización de tipografía", + "Animación", + "Mejores prácticas", + "Optimización de rendimiento", + "Próximos pasos" + ], + "h3": [ + "Método 1: agrega a telar.scss", + "Método 2: crea una hoja de estilos personalizada", + "Modifica los diseños", + "Modifica los includes", + "Pasos de historia", + "Paneles en capas", + "Tarjetas de objeto", + "Modificar el comportamiento de la historia", + "Agregar interacciones personalizadas", + "Estilos de encabezados", + "Cuerpo de texto" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "// Tus estilos personalizados .story-step { padding: 2rem; border-left: 3px solid var(--primary-color); } .object-card { box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); transition: transform 0.2s; &:hover { transform: translateY(-5px); } }", + "/* Ajustes personalizados */ .site-header { background: linear-gradient(to right, #667eea 0%, #764ba2 100%); } .story-answer { font-style: italic; color: #666; }", + "", + ":root { // Colores --primary-color: #c7522a; --secondary-color: #5f7351; --accent-color: #8b7355; --text-color: #333; --heading-color: #1a1a1a; // Tipografía --font-headings: 'Playfair Display', Georgia, serif; --font-body: 'Source Sans Pro', sans-serif; // Espaciado --spacing-unit: 1rem; --story-step-padding: 3rem; // Bordes --border-radius: 4px; --border-color: #e0e0e0; }", + ".story-step { padding: var(--story-step-padding); margin-bottom: 2rem; .story-question { font-size: 2rem; margin-bottom: 1rem; } .story-answer { font-size: 1.125rem; line-height: 1.6; } }", + ".layer-panel { background: white; padding: 2rem; box-shadow: 0 10px 40px rgba(0, 0, 0, 0.1); .layer-title { border-bottom: 2px solid var(--primary-color); padding-bottom: 0.5rem; margin-bottom: 1.5rem; } }", + ".object-card { border: 1px solid var(--border-color); border-radius: var(--border-radius); overflow: hidden; .object-thumbnail { aspect-ratio: 4 / 3; object-fit: cover; } .object-info { padding: 1rem; } }", + "// Disposición vertical: ancho reducido O relación de aspecto vertical. // Nota: las historias ocupan toda la ventana en lugar de dividirse // en columnas; estos ajustes son para tus propios contenedores. @media (max-width: 1024px), (max-aspect-ratio: 3 / 4) { .my-block { flex-direction: column; } } // Disposición amplia (escritorio) @media (min-width: 1025px) { .my-block { max-width: 600px; } }", + "reset, third-party, telar-base, telar-bootstrap-overrides, telar-components, telar-overrides", + "npm run build:js", + "document.addEventListener('DOMContentLoaded', function() { // Desplazamiento suave a enlaces internos document.querySelectorAll('a[href^=\"#\"]').forEach(anchor => { anchor.addEventListener('click', function (e) { e.preventDefault(); const target = document.querySelector(this.getAttribute('href')); target.scrollIntoView({ behavior: 'smooth' }); }); }); // Animación en tarjetas de objeto al entrar en vista const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { entry.target.classList.add('fade-in'); } }); }); document.querySelectorAll('.object-card').forEach(card => { observer.observe(card); }); });", + "h1, h2, h3, h4, h5, h6 { font-family: var(--font-headings); color: var(--heading-color); font-weight: 400; line-height: 1.2; } // Tamaños personalizados de encabezado h1 { font-size: 2.5rem; } h2 { font-size: 2rem; } h3 { font-size: 1.75rem; }", + "body { font-family: var(--font-body); font-size: 1rem; line-height: 1.6; color: var(--text-color); } p { margin-bottom: 1rem; }", + "// Animación de aparición gradual @keyframes fadeIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .fade-in { animation: fadeIn 0.6s ease-out; } // Hover de tarjeta de objeto .object-card { transition: all 0.3s ease; &:hover { transform: translateY(-5px); box-shadow: 0 10px 30px rgba(0, 0, 0, 0.15); } }", + "// Usa will-change para animaciones .animated-element { will-change: transform; } // Optimiza imágenes .object-thumbnail { image-rendering: -webkit-optimize-contrast; } // Aceleración por hardware .smooth-scroll { transform: translateZ(0); }" + ], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Estilos avanzados Estilos avanzados Ve más allá de los temas con CSS personalizado, modificaciones de diseño y estilos de componentes. CSS personalizado Método 1: agrega a telar.scss Edita assets/css/telar.scss para agregar estilos personalizados: // Tus estilos personalizados .story-step { padding: 2rem; border-left: 3px solid var(--primary-color); } .object-card { box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); transition: transform 0.2s; &:hover { transform: translateY(-5px); } } Método 2: crea una hoja de estilos personalizada Crea assets/css/custom.css : /* Ajustes personalizados */ .site-header { background: linear-gradient(to right, #667eea 0%, #764ba2 100%); } .story-answer { font-style: italic; color: #666; } Luego inclúyela en tu _layouts/default.html : Variables CSS Telar usa propiedades personalizadas CSS que puedes sobrescribir: :root { // Colores --primary-color: #c7522a; --secondary-color: #5f7351; --accent-color: #8b7355; --text-color: #333; --heading-color: #1a1a1a; // Tipografía --font-headings: 'Playfair Display', Georgia, serif; --font-body: 'Source Sans Pro', sans-serif; // Espaciado --spacing-unit: 1rem; --story-step-padding: 3rem; // Bordes --border-radius: 4px; --border-color: #e0e0e0; } Sobrescribe estas en tu CSS personalizado para hacer cambios globales. Personalización del diseño Modifica los diseños Edita archivos en el directorio _layouts/ : default.html : Plantilla base (encabezado, pie de página, nav) story.html : Página de scrollytelling object.html : Página de detalle de objeto glossary.html : Página de término de glosario home.html : Diseño de página de inicio Modifica los includes Edita componentes reutilizables en _includes/ : header.html : Encabezado y navegación del sitio footer.html : Pie de página del sitio story-step.html : Paso individual de historia object-card.html : Tarjeta de cuadrícula de objetos Estilos de componentes Pasos de historia .story-step { padding: var(--story-step-padding); margin-bottom: 2rem; .story-question { font-size: 2rem; margin-bottom: 1rem; } .story-answer { font-size: 1.125rem; line-height: 1.6; } } Paneles en capas .layer-panel { background: white; padding: 2rem; box-shadow: 0 10px 40px rgba(0, 0, 0, 0.1); .layer-title { border-bottom: 2px solid var(--primary-color); padding-bottom: 0.5rem; margin-bottom: 1.5rem; } } Tarjetas de objeto .object-card { border: 1px solid var(--border-color); border-radius: var(--border-radius); overflow: hidden; .object-thumbnail { aspect-ratio: 4 / 3; object-fit: cover; } .object-info { padding: 1rem; } } Diseño adaptable El diseño de historias de Telar cambia a su disposición vertical cuando la ventana mide menos de 1024px de ancho o tiene una relación de aspecto menor que 3:4 (consulta Optimización móvil para más detalles). Cuando agregues reglas adaptables a tus propios componentes, usa esos mismos puntos de quiebre ( breakpoints ) para que tus estilos cambien al mismo tiempo que el diseño: // Disposición vertical: ancho reducido O relación de aspecto vertical. // Nota: las historias ocupan toda la ventana en lugar de dividirse // en columnas; estos ajustes son para tus propios contenedores. @media (max-width: 1024px), (max-aspect-ratio: 3 / 4) { .my-block { flex-direction: column; } } // Disposición amplia (escritorio) @media (min-width: 1025px) { .my-block { max-width: 600px; } } Capas de cascada Desde la v1.4.0, los estilos de Telar se organizan en capas de cascada CSS, declaradas en este orden: reset, third-party, telar-base, telar-bootstrap-overrides, telar-components, telar-overrides Bootstrap se carga en la capa third-party y los estilos propios de Telar se cargan en las capas posteriores, así que los estilos de Telar prevalecen sobre Bootstrap de manera confiable, sin necesidad de !important . Esto también facilita tus personalizaciones: el CSS sin capa siempre prevalece sobre el CSS con capa , sin importar la especificidad del selector. Cualquier regla de CSS común que agregues por fuera de estas capas tiene prioridad sobre los estilos de Telar, así que casi siempre puedes cambiar la apariencia sin recurrir a !important . Si una regla personalizada no se aplica como esperas, revisa que no haya quedado dentro de alguna de las capas de Telar. Personalización de JavaScript Modificar el comportamiento de la historia El código fuente del motor de historias vive en assets/js/telar-story/ (un módulo por función — motor de desplazamiento, navegación, tarjetas, paneles) y se empaqueta en assets/js/telar-story.js , que es el archivo que las páginas cargan. Para cambiar el comportamiento de las historias, edita los módulos y vuelve a generar el paquete: npm run build:js Nunca edites assets/js/telar-story.js directamente: es un archivo generado y la próxima vez que se genere el paquete lo sobrescribe. El mapa del directorio en assets/js/README.md describe qué hace cada módulo y dónde conviene hacer cada tipo de cambio. Agregar interacciones personalizadas Crea assets/js/custom.js : document.addEventListener('DOMContentLoaded', function() { // Desplazamiento suave a enlaces internos document.querySelectorAll('a[href^=\"#\"]').forEach(anchor => { anchor.addEventListener('click', function (e) { e.preventDefault(); const target = document.querySelector(this.getAttribute('href')); target.scrollIntoView({ behavior: 'smooth' }); }); }); // Animación en tarjetas de objeto al entrar en vista const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { entry.target.classList.add('fade-in'); } }); }); document.querySelectorAll('.object-card').forEach(card => { observer.observe(card); }); }); Personalización de tipografía Estilos de encabezados h1, h2, h3, h4, h5, h6 { font-family: var(--font-headings); color: var(--heading-color); font-weight: 400; line-height: 1.2; } // Tamaños personalizados de encabezado h1 { font-size: 2.5rem; } h2 { font-size: 2rem; } h3 { font-size: 1.75rem; } Cuerpo de texto body { font-family: var(--font-body); font-size: 1rem; line-height: 1.6; color: var(--text-color); } p { margin-bottom: 1rem; } Animación Agrega animaciones sutiles: // Animación de aparición gradual @keyframes fadeIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .fade-in { animation: fadeIn 0.6s ease-out; } // Hover de tarjeta de objeto .object-card { transition: all 0.3s ease; &:hover { transform: translateY(-5px); box-shadow: 0 10px 30px rgba(0, 0, 0, 0.15); } } Mejores prácticas Usa variables CSS para valores que se repiten Prueba en múltiples tamaños de pantalla Mantén accesibilidad (contraste, navegación por teclado) Manténlo eficiente (evita animaciones pesadas, imágenes grandes) Comenta tu código para referencia futura Prueba en múltiples navegadores (Chrome, Firefox, Safari) Optimización de rendimiento // Usa will-change para animaciones .animated-element { will-change: transform; } // Optimiza imágenes .object-thumbnail { image-rendering: -webkit-optimize-contrast; } // Aceleración por hardware .smooth-scroll { transform: translateZ(0); } Próximos pasos Conoce sobre temas Ver sitios de ejemplo Explora los diseños de Jekyll" + }, + "/guia/tus-datos/csv-proyecto/": { + "ids": [ + "alias-del-csv-de-proyecto", + "byline", + "columnas", + "columnas-del-proyecto", + "csv-de-proyecto-projectcsv--proyectocsv", + "descripción-general", + "ejemplo", + "normalización-de-columnas", + "notas-de-los-campos", + "order", + "private", + "show_sections", + "soporte-de-encabezados-dobles", + "story_id", + "subtitle", + "title", + "véase-también" + ], + "selectors": { + "h1": [ + "Columnas del proyecto" + ], + "h2": [ + "Descripción general", + "CSV de proyecto (project.csv / proyecto.csv)", + "Véase también" + ], + "h3": [ + "Normalización de columnas", + "Soporte de encabezados dobles", + "Columnas", + "Ejemplo", + "Notas de los campos", + "Alias del CSV de proyecto" + ], + "h4": [ + "order", + "story_id", + "title", + "subtitle", + "byline", + "private", + "show_sections" + ], + "h5": [], + "h6": [], + "pre": [ + "order,story_id,title,subtitle,byline orden,id_historia,titulo,subtitulo,firma 1,colonial-textiles,Colonial Textiles,Weaving traditions,by Dr. Smith 2,textiles-coloniales,Textiles Coloniales,Tradiciones textiles,por Dra. García", + "order,story_id,title,subtitle,byline,private,show_sections 1,colonial-textiles,Colonial Textiles,Weaving traditions of the Americas,by Dr. Jane Smith,,yes 2,trade-routes,Trade Routes,Following the threads of commerce,based on [original research](https://example.com),yes,", + "orden,id_historia,titulo,subtitulo,firma,privada,mostrar_secciones 1,textiles-coloniales,Textiles Coloniales,Tradiciones de tejido de las Américas,por Dra. María García,,si 2,rutas-comerciales,Rutas Comerciales,Siguiendo los hilos del comercio,basado en [investigación original](https://ejemplo.com),si," + ], + "table": [ + "Inglés Español Requerido Descripción order orden Sí Orden de visualización en la página principal (1, 2, 3...) story_id id_historia No Identificador semántico (ej., textiles-coloniales). Si se omite, usa story-{order} title titulo Sí Título de la historia mostrado en la página principal y en la historia subtitle subtitulo No Descripción breve mostrada en las tarjetas de historia byline firma No Atribución de autoría; admite Markdown para enlaces y formato private privada No Pon yes para encriptar esta historia (requiere story_key en la configuración); también se aceptan protected/protegida show_sections mostrar_secciones No Pon si para mostrar una tabla de contenidos en la tarjeta de inicio de la historia. Consulta Historias y paneles: Tabla de contenidos de secciones. Nuevo en v1.2.0", + "Normalizado Acepta order order, orden story_id story_id, id_historia title title, titulo subtitle subtitle, subtitulo byline byline, firma private private, privada, protected, protegida show_sections show_sections, mostrar_secciones" + ], + "blockquote": [], + "img": [] + }, + "text": "Columnas del proyecto Referencia completa de las columnas de project.csv con soporte bilingüe de nombres de columnas. Descripción general Telar v0.6.0+ admite columnas CSV en inglés y español. Puedes usar cualquiera de los dos idiomas de forma consistente, mezclarlos o incluir encabezados dobles para referencia bilingüe. Normalización de columnas Todos los nombres de columnas se normalizan durante el procesamiento: Sin distinción entre mayúsculas y minúsculas ( Title = title = TITLE ) Espacios recortados Nombres en español mapeados a equivalentes en inglés Caracteres con tilde admitidos Soporte de encabezados dobles Incluye encabezados en inglés y español para equipos bilingües: order,story_id,title,subtitle,byline orden,id_historia,titulo,subtitulo,firma 1,colonial-textiles,Colonial Textiles,Weaving traditions,by Dr. Smith 2,textiles-coloniales,Textiles Coloniales,Tradiciones textiles,por Dra. García Telar detecta automáticamente y omite la segunda fila de encabezado. CSV de proyecto (project.csv / proyecto.csv) Define las historias y su orden de visualización en la página principal. Ubicación : telar-content/spreadsheets/project.csv o telar-content/spreadsheets/proyecto.csv Columnas Inglés Español Requerido Descripción order orden Sí Orden de visualización en la página principal (1, 2, 3...) story_id id_historia No Identificador semántico (ej., textiles-coloniales ). Si se omite, usa story-{order} title titulo Sí Título de la historia mostrado en la página principal y en la historia subtitle subtitulo No Descripción breve mostrada en las tarjetas de historia byline firma No Atribución de autoría; admite Markdown para enlaces y formato private privada No Pon yes para encriptar esta historia (requiere story_key en la configuración); también se aceptan protected / protegida show_sections mostrar_secciones No Pon si para mostrar una tabla de contenidos en la tarjeta de inicio de la historia. Consulta Historias y paneles: Tabla de contenidos de secciones . Nuevo en v1.2.0 Ejemplo Inglés: order,story_id,title,subtitle,byline,private,show_sections 1,colonial-textiles,Colonial Textiles,Weaving traditions of the Americas,by Dr. Jane Smith,,yes 2,trade-routes,Trade Routes,Following the threads of commerce,based on [original research](https://example.com),yes, Español: orden,id_historia,titulo,subtitulo,firma,privada,mostrar_secciones 1,textiles-coloniales,Textiles Coloniales,Tradiciones de tejido de las Américas,por Dra. María García,,si 2,rutas-comerciales,Rutas Comerciales,Siguiendo los hilos del comercio,basado en [investigación original](https://ejemplo.com),si, Notas de los campos order Deben ser enteros únicos Determina el orden de las tarjetas en la página principal Se permiten saltos (1, 2, 5 funciona bien) Se renumera automáticamente si se incluye contenido de demostración story_id Nuevo en v0.6.0 Solo minúsculas, guiones y guiones bajos Se usa para: nombre del archivo CSV de la historia, URL de la historia, referencias internas Si se omite: se usa story-1 , story-2 , etc. según el orden Ejemplos: textiles-coloniales , paisajes_coloniales , story-one title Se muestra en las tarjetas de la página principal y en los encabezados de la historia Sin procesamiento Markdown (solo texto plano) Recomendado: 2-6 palabras subtitle Se muestra debajo del título en las tarjetas de la página principal Sin procesamiento Markdown Recomendado: 5-12 palabras Describe brevemente el contenido de la historia byline Admite Markdown (v0.6.0+) Página principal: se renderiza como texto plano Página de la historia: renderiza enlaces Markdown como clicables Patrones comunes: por Dra. María García por María García y Juan López basado en [investigación original](https://example.com) curado por *Proyecto de Archivo Digital* private Nuevo en v0.8.0 Pon yes para encriptar la historia cuando el build termina (durante el build de Jekyll la historia se genera normalmente; la encriptación es un paso aparte que corre después) Requiere story_key en _config.yml — si falta la clave, el build falla en lugar de publicar la historia en texto plano Las personas acceden a historias privadas mediante el parámetro de URL ?key=tu-clave La previsualización local ( bundle exec jekyll serve ) no encripta nada — consulta Historias privadas: Probar localmente Déjalo vacío u omítelo para historias públicas Consulta Historias Privadas para detalles show_sections Nuevo en v1.2.0 Pon si para mostrar una tabla de contenidos navegable en la tarjeta de inicio La tabla de contenidos genera enlaces automáticamente a cada tarjeta de título de la historia Déjalo vacío u omítelo para mostrar la tarjeta de inicio sin tabla de contenidos Consulta Historias y paneles para detalles Alias del CSV de proyecto Normalizado Acepta order order , orden story_id story_id , id_historia title title , titulo subtitle subtitle , subtitulo byline byline , firma private private , privada , protected , protegida show_sections show_sections , mostrar_secciones Véase también Columnas de objetos — Columnas de objects.csv Columnas de historias — Columnas de los CSV de historia Columnas del glosario — Columnas de glossary.csv Google Sheets — Uso de Google Sheets con Telar" + }, + "/guia/funciones/paginas-personalizadas/": { + "ids": [ + "crear-una-página-personalizada", + "diferencias-con-las-capas-de-historia", + "diseño-y-estilo", + "ejemplo-página-de-créditos", + "enlaces-de-glosario", + "formato-markdown", + "funcionalidades-soportadas", + "nombres-de-archivo", + "paso-1-crea-el-archivo-markdown", + "paso-2-escribe-tu-contenido", + "paso-3-agrega-a-la-navegación", + "próximos-pasos", + "páginas-personalizadas", + "qué-son-las-páginas-personalizadas", + "widgets" + ], + "selectors": { + "h1": [ + "Páginas personalizadas" + ], + "h2": [ + "¿Qué son las páginas personalizadas?", + "Crear una página personalizada", + "Funcionalidades soportadas", + "Diseño y estilo", + "Nombres de archivo", + "Ejemplo: página de créditos", + "Diferencias con las capas de historia", + "Próximos pasos" + ], + "h3": [ + "Paso 1: crea el archivo Markdown", + "Paso 2: escribe tu contenido", + "Paso 3: agrega a la navegación", + "Formato Markdown", + "Widgets", + "Enlaces de glosario" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "telar-content/texts/pages/ ├── about.md # Página predeterminada (incluida en la plantilla) ├── credits.md # Tu página de créditos personalizada └── methodology.md # Tu página de metodología personalizada", + "--- --- # Acerca de este proyecto Este archivo digital explora redes comerciales coloniales a través de... ## Equipo de investigación - **Investigador Principal**: Dr. Jane Smith - **Desarrollador de Humanidades Digitales**: Alex Chen - **Investigadores de Posgrado**: María González, John Davis ## Reconocimientos Este proyecto fue posible gracias a...
Fuentes de Financiamiento - National Endowment for the Humanities - University Research Grant Program - Digital Scholarship Initiative
", + "El sistema de [[encomienda]] fue una institución clave...", + "--- --- # Créditos ## Equipo del proyecto **Investigador Principal**: Dr. Elena Martínez (University of California) **Coordinador de Investigación Digital**: James Park (UCSB Library) **Asistentes de Investigación**: Sofia Rodriguez, Michael Chen ## Financiamiento Este proyecto recibió generoso apoyo de: - National Endowment for the Humanities (Grant #AB-12345) - Andrew W. Mellon Foundation - UC Digital Humanities Program ## Créditos técnicos Construido con [Telar](https://telar.org), un framework de código abierto para narrativa digital.
Fuentes de Imágenes y Permisos Todas las imágenes usadas con permiso: - Pintura de Bogotá (1614): Princeton University Art Museum - Mapas Coloniales: Library of Congress, Geography and Map Division - Figuras de Cerámica: Smithsonian National Museum of the American Indian
Agradecimientos Especiales Estamos agradecidos con las siguientes personas e instituciones: - Archivo de Indias (Sevilla, España) - Archivo Nacional de Colombia (Bogotá) - Dr. Maria Santos por asistencia en investigación de archivo - The Digital Scholarship Commons at UCSB
" + ], + "table": [ + "Archivo URL about.md /about/ credits.md /credits/ methodology.md /methodology/ team-bios.md /team-bios/", + "Funcionalidad Capas de Historia Páginas Personalizadas Ubicación telar-content/texts/stories/ telar-content/texts/pages/ Integración con visor Sí (pantalla dividida con IIIF) No (texto de ancho completo) Navegación por pasos Sí (coordinado con visor) No (página independiente) Widgets Sí Sí Glosario Sí Sí Navegación Vía interfaz de historia Vía menú del sitio Estructura de URL /nombre-historia/ /nombre-pagina/" + ], + "blockquote": [ + "El frontmatter (líneas ---) es requerido pero puede estar vacío. Le indica a Jekyll que procese el archivo." + ], + "img": [] + }, + "text": "Páginas personalizadas Crea páginas personalizadas para créditos, metodología, información del equipo, o cualquier otro contenido que no encaje en la estructura de la historia. Para autoría visual, consulta inicio y páginas . ¿Qué son las páginas personalizadas? Las páginas personalizadas son páginas independientes que aparecen en el menú de navegación de tu sitio pero no son parte del visor de historia. A diferencia de las capas de historia, que están estrechamente integradas con objetos IIIF y navegación de pasos, las páginas personalizadas son contenedores flexibles para cualquier contenido que quieras compartir. Casos de uso comunes: Acerca de : Presenta tu proyecto y equipo de investigación Metodología : Explica tus métodos de investigación y fuentes Créditos : Reconoce colaboradores, financiadores e instituciones Bibliografía : Lista fuentes y lecturas adicionales Contacto : Proporciona formas de ponerse en contacto Crear una página personalizada Paso 1: crea el archivo Markdown Agrega un nuevo archivo .md en el directorio telar-content/texts/pages/ : telar-content/texts/pages/ ├── about.md # Página predeterminada (incluida en la plantilla) ├── credits.md # Tu página de créditos personalizada └── methodology.md # Tu página de metodología personalizada Paso 2: escribe tu contenido Las páginas personalizadas usan Markdown estándar con soporte completo para widgets y glosario: --- --- # Acerca de este proyecto Este archivo digital explora redes comerciales coloniales a través de... ## Equipo de investigación - **Investigador Principal**: Dr. Jane Smith - **Desarrollador de Humanidades Digitales**: Alex Chen - **Investigadores de Posgrado**: María González, John Davis ## Reconocimientos Este proyecto fue posible gracias a...
Fuentes de Financiamiento - National Endowment for the Humanities - University Research Grant Program - Digital Scholarship Initiative
El frontmatter (líneas --- ) es requerido pero puede estar vacío. Le indica a Jekyll que procese el archivo. Paso 3: agrega a la navegación Actualiza _data/navigation.yml para incluir tu nueva página en el menú. Consulta Configuración de Navegación para más detalles. Funcionalidades soportadas Las páginas personalizadas soportan las mismas funcionalidades de Markdown que las capas de historia: Formato Markdown Encabezados (h1-h6) Negrita , cursiva y otro formato de texto Listas (con viñetas y numeradas) Enlaces e imágenes Citas en bloque Widgets Todos los widgets de Telar funcionan en páginas personalizadas: Acordeón : Secciones colapsables Pestañas : Paneles de contenido con pestañas Carrusel : Presentaciones de imágenes Consulta Referencia de Sintaxis Markdown para documentación completa de widgets. Enlaces de glosario El enlace automático del glosario funciona de la misma manera: El sistema de [[encomienda]] fue una institución clave... Cuando las personas hacen clic en el enlace, el panel de glosario se abre con la definición. Diseño y estilo Las páginas personalizadas usan el layout user-page , que proporciona: Contenedor responsivo : El contenido está centrado y limitado para legibilidad Encabezado/pie de página consistentes : Menú de navegación y marca del sitio Procesamiento de widgets : Soporte para acordeón, pestañas y carrusel Integración de glosario : Enlace automático y visualización de panel También está disponible el layout convencional de Jekyll, layout: page , si agregas tus propios archivos Markdown con front matter: una columna de texto centrada y mínima, con el encabezado y el pie de página del sitio, pero sin procesamiento de widgets ni integración con el glosario. Nombres de archivo Los nombres de archivo determinan la URL de la página: Archivo URL about.md /about/ credits.md /credits/ methodology.md /methodology/ team-bios.md /team-bios/ Reglas de nombres: Usa minúsculas Usa guiones para espacios (no guiones bajos) Usa nombres descriptivos (el nombre del archivo se convierte en la URL) Ejemplo: página de créditos Aquí hay un ejemplo completo que muestra créditos con un acordeón para reconocimientos detallados: --- --- # Créditos ## Equipo del proyecto **Investigador Principal**: Dr. Elena Martínez (University of California) **Coordinador de Investigación Digital**: James Park (UCSB Library) **Asistentes de Investigación**: Sofia Rodriguez, Michael Chen ## Financiamiento Este proyecto recibió generoso apoyo de: - National Endowment for the Humanities (Grant #AB-12345) - Andrew W. Mellon Foundation - UC Digital Humanities Program ## Créditos técnicos Construido con [Telar](https://telar.org), un framework de código abierto para narrativa digital.
Fuentes de Imágenes y Permisos Todas las imágenes usadas con permiso: - Pintura de Bogotá (1614): Princeton University Art Museum - Mapas Coloniales: Library of Congress, Geography and Map Division - Figuras de Cerámica: Smithsonian National Museum of the American Indian
Agradecimientos Especiales Estamos agradecidos con las siguientes personas e instituciones: - Archivo de Indias (Sevilla, España) - Archivo Nacional de Colombia (Bogotá) - Dr. Maria Santos por asistencia en investigación de archivo - The Digital Scholarship Commons at UCSB
Diferencias con las capas de historia Funcionalidad Capas de Historia Páginas Personalizadas Ubicación telar-content/texts/stories/ telar-content/texts/pages/ Integración con visor Sí (pantalla dividida con IIIF) No (texto de ancho completo) Navegación por pasos Sí (coordinado con visor) No (página independiente) Widgets Sí Sí Glosario Sí Sí Navegación Vía interfaz de historia Vía menú del sitio Estructura de URL /nombre-historia/ /nombre-pagina/ Próximos pasos Aprende cómo configurar la navegación para agregar páginas a tu menú Explora sintaxis de widgets para acordeón, pestañas y carruseles Consulta configuración de glosario para configurar el enlace automático Nuevo en v0.6.0 : Páginas personalizadas con soporte completo para widgets y glosario." + }, + "/docs/the-compositor/dashboard/": { + "ids": [ + "create-a-new-story", + "dashboard", + "delete-a-story", + "draft-and-private-toggles", + "media-stories-docs-the-compositor-dashboard", + "project-switching", + "reorder-stories", + "see-also", + "site-preview", + "start-and-navigation", + "status-bar", + "stories", + "view-and-open-stories", + "welcome-message" + ], + "selectors": { + "h1": [ + "Start and navigation" + ], + "h2": [ + "Site preview", + "Welcome message", + "Stories", + "Project switching", + "Status bar", + "See also" + ], + "h3": [ + "View and open stories", + "Create a new story", + "Reorder stories", + "Delete a story", + "Draft and private toggles" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [ + [ + "/assets/manual/tutorials/en-stories.jpg", + "The story list with order handles, Draft and Private switches and Edit links." + ] + ] + }, + "text": "Start and navigation The Start page introduces the active project, shows its recent activity and links to the main parts of the Compositor. Use the navigation across the top to move between Objects , Stories , Glossary , Home and Pages , Site settings and Publish . Site preview Edit your exhibition's landing-page content in Home and Pages . The Start page is a project overview; it is not the editor for the public homepage. Welcome message Open Home and Pages to edit the introduction that visitors see on your site. Review the site's title, description and interface language in Site settings . Publish when you want these changes to reach the public site. Stories The Stories page lists the narratives in your exhibition. View and open stories Choose Edit on a story to open the Story Editor . Each row shows its title and number of steps. Create a new story Choose + New Story . Enter a title and, if needed, a subtitle and byline. Choose Save to create the story and open its editor. Reorder stories Drag a story by its handle to change the order in which stories appear on the public site. The new order is included when you publish. Delete a story Use Delete story and read the confirmation before continuing. Your public site changes when the deletion is published. Check the available Undo control if you removed something by mistake. Draft and private toggles Draft excludes a story from the public exhibition. Use it while preparing work that should not appear. Private controls access to the story's content. Read Private Stories before relying on this for a project. Draft excludes a story from publication; Private uses the site's key. Dragging a row changes the story order. Open full-size screenshot ↗ Project switching Use the project name in the header to switch between connected sites. Each site has its own collection, stories and unpublished changes. Status bar The header shows the connection state and whether the active project has unpublished changes. Wait for the connection to be ready before editing. Use Publish to review the changes and follow the resulting site build. The collaboration control opens information about the project's team and activity. Your user menu leads to Account , where Interface language changes the Compositor's labels. It does not translate your exhibition's text; the public site's interface language is a separate setting. See also Workshop quick guide — A short path through the first story Objects — Add and manage sources Story Editor — Compose steps and panels Publishing — Review and publish" + }, + "/docs/your-content/video-objects/": { + "ids": [ + "adding-a-video-object", + "clip-control", + "finding-clip-times", + "how-videos-appear", + "in-stories", + "in-the-gallery", + "on-object-pages", + "see-also", + "supported-platforms", + "video-objects" + ], + "selectors": { + "h1": [ + "Video Objects" + ], + "h2": [ + "Adding a video object", + "How videos appear", + "Clip control", + "See also" + ], + "h3": [ + "Supported platforms", + "In stories", + "On object pages", + "In the gallery", + "Finding clip times" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "object_id,title,source_url interview-01,Oral history interview,https://www.youtube.com/watch?v=dQw4w9WgXcQ", + "step,object,clip_start,clip_end,loop,question,answer 1,interview-01,45,78,false,What does she describe?,The weaving technique used in her community. 2,interview-01,120,145,true,A recurring motif,Notice how the pattern repeats — this clip loops to highlight the repetition." + ], + "table": [ + "Column (English) Column (Spanish) Description clip_start inicio_clip Start time in seconds (e.g. 12.5) clip_end fin_clip End time in seconds loop bucle Loop the clip (true, yes, or sí)" + ], + "blockquote": [ + "Telar does not support self-hosted video files. Videos must be hosted on one of the supported platforms. For self-hosted media, see Audio Objects.", + "You can also set clip times visually in the Compositor. See Video and Audio in the Compositor for details." + ], + "img": [] + }, + "text": "Video Objects Telar can display videos from YouTube, Vimeo, and Google Drive as objects in your exhibition. Videos work just like images — you can build stories around them, focus on specific moments with clip control, and include them alongside your other objects. Videos are not stored in your repository — Telar embeds them directly from the platform where they are already hosted. Adding a video object To add a video, put the video's URL in the source_url column of your objects spreadsheet. Telar detects the media type automatically from the URL — no additional configuration is needed. For example, a row in your objects spreadsheet might look like this: object_id,title,source_url interview-01,Oral history interview,https://www.youtube.com/watch?v=dQw4w9WgXcQ Supported platforms Telar recognizes video URLs from three platforms: YouTube — youtube.com/watch?v=... and youtu.be/... short links Vimeo — vimeo.com/123456789 Google Drive — drive.google.com/file/d/.../view (the video must be shared publicly or with \"Anyone with the link\") Telar does not support self-hosted video files. Videos must be hosted on one of the supported platforms. For self-hosted media, see Audio Objects . How videos appear In stories When a story step references a video object, the video player fills the viewer area. The player includes standard playback controls (play, pause, seek) and responds to any clip settings you define for that step. If you set clip_start and clip_end values in your story spreadsheet, the video plays only the specified segment. This is useful for drawing attention to a particular moment without requiring your audience to watch the full recording. On object pages Each video object has its own page ( /objects/{object-id}/ ) with an embedded player. Below the player, a clip time picker lets you play to a position and capture timestamps — useful when building story steps. In the gallery Video objects appear in the objects gallery with a play icon on a grey background. The gallery's Type filter lets visitors browse by media type (Image, Video, or Audio). Clip control Story steps can specify a start time, end time, and loop setting for video objects. Add these columns to your story spreadsheet: Column (English) Column (Spanish) Description clip_start inicio_clip Start time in seconds (e.g. 12.5 ) clip_end fin_clip End time in seconds loop bucle Loop the clip ( true , yes , or sí ) All three columns are optional. If omitted, the video plays from the beginning without looping. step,object,clip_start,clip_end,loop,question,answer 1,interview-01,45,78,false,What does she describe?,The weaving technique used in her community. 2,interview-01,120,145,true,A recurring motif,Notice how the pattern repeats — this clip loops to highlight the repetition. Finding clip times The object page for each video includes a clip time picker: Navigate to the object page for your video ( /objects/{object-id}/ ) Play the video to the position you want Click the timestamp capture buttons to record start and end times Copy the values into your story spreadsheet You can also set clip times visually in the Compositor. See Video and Audio in the Compositor for details. See also Audio Objects — Adding self-hosted audio files Objects — Defining objects in your spreadsheet Stories & Panels — Building story steps Story Columns — Complete column reference including clip columns Objects Gallery — How videos appear in the gallery" + }, + "/guia/tus-datos/google-sheets/": { + "ids": [ + "configurar-_configyml", + "cómo-se-conectan-las-pestañas", + "elige-la-hoja-como-fuente", + "empieza-con-la-plantilla", + "entiende-la-hoja-de-cálculo", + "estructura-de-la-hoja", + "inicio-rápido", + "integración-con-google-sheets", + "mantén-ids-consistentes", + "obtener-datos-solo-desarrollo-local", + "referencia-de-columnas-resumen", + "solución-de-problemas", + "usa-texto-y-referencias-a-archivos", + "véase-también" + ], + "selectors": { + "h1": [ + "Entiende la hoja de cálculo" + ], + "h2": [ + "Cómo se conectan las pestañas", + "Empieza con la plantilla", + "Mantén IDs consistentes", + "Usa texto y referencias a archivos", + "Elige la hoja como fuente" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "google_sheets: enabled: true published_url: \"URL-PUBLICADA-DE-TU-HOJA\"" + ], + "table": [ + "Pestaña Función Relación project Enumera historias y su orden story_id identifica la pestaña de una historia objects Describe la colección compartida object_id se usa en los pasos Una pestaña por historia Enumera pasos, vistas, preguntas y paneles object corresponde al ID de un objeto glossary Define términos recurrentes term_id se usa en enlaces del texto" + ], + "blockquote": [], + "img": [] + }, + "text": "Entiende la hoja de cálculo Tu hoja de Google Sheets es la fuente de una versión generada de la exhibición. Editar una celda no cambia inmediatamente el sitio público: el siguiente build descarga y procesa la hoja publicada. Cómo se conectan las pestañas Pestaña Función Relación project Enumera historias y su orden story_id identifica la pestaña de una historia objects Describe la colección compartida object_id se usa en los pasos Una pestaña por historia Enumera pasos, vistas, preguntas y paneles object corresponde al ID de un objeto glossary Define términos recurrentes term_id se usa en enlaces del texto La plantilla incluye instrucciones y encabezados bilingües. Conserva los nombres de columnas que procesa Telar. Se ignoran las filas o columnas que comienzan con # . Empieza con la plantilla Usa la plantilla enlazada en la configuración guiada . Haz tu propia copia y publícala mediante Archivo → Compartir → Publicar en la Web . El enlace de edición es distinto del publicado. La configuración necesita este último: google_sheets: enabled: true published_url: \"URL-PUBLICADA-DE-TU-HOJA\" Publica las pestañas que necesita Telar. No pongas notas confidenciales en contenido publicado en la web. Mantén IDs consistentes Usa IDs breves y estables, en minúsculas y con guiones. El ID de historia debe coincidir con su pestaña. La referencia de un objeto debe coincidir con su ID en objects . Un enlace al glosario debe corresponder al ID del término. Los títulos pueden cambiar sin alterar estas relaciones. Si cambias un ID, actualiza sus referencias. Usa texto y referencias a archivos Puedes escribir un panel breve en layer1_content o layer2_content . Usa Markdown para el formato. Una ruta terminada en .md puede referirse a un texto más extenso en la carpeta de textos de historias del repositorio. Las respuestas son prosa breve y sin formato enriquecido. Los paneles sirven para ampliar el contexto. Consulta los campos en columnas de historias . Elige la hoja como fuente Si pasas al Compositor, revisa la importación y cambia deliberadamente la fuente de contenido. El Compositor no devuelve tus ediciones visuales a Google Sheets. Si dejas Sheets activo, un build posterior puede reemplazarlas con el contenido de la hoja. En trabajo local, python3 scripts/build_local_site.py descarga Sheets cuando está activo. Los CSV de telar-content/spreadsheets/ son copias descargadas; edita la hoja si esa es tu fuente. Sigue con un objeto y tu primera historia ." + }, + "/docs/developers/mobile/": { + "ids": [ + "accessibility", + "browser-devtools", + "common-screen-sizes", + "compact-type-size", + "content-on-small-screens", + "content-overflowing", + "glossary-index", + "images", + "ios-safari-and-notches", + "layouts-and-small-screens", + "loading", + "navigation", + "navigation-not-working", + "objects-gallery", + "panels", + "performance", + "real-devices", + "slow-performance", + "testing-checklist", + "testing-your-site-on-small-screens", + "text", + "the-text-card", + "the-two-layouts", + "troubleshooting", + "widgets" + ], + "selectors": { + "h1": [ + "Layouts and Small Screens" + ], + "h2": [ + "The Two Layouts", + "Compact Type Size", + "iOS Safari and Notches", + "Panels", + "Objects Gallery", + "Glossary Index", + "Testing Your Site on Small Screens", + "Content on Small Screens", + "Performance", + "Accessibility", + "Troubleshooting", + "Testing Checklist" + ], + "h3": [ + "The text card", + "Navigation", + "Loading", + "Browser DevTools", + "Real Devices", + "Common Screen Sizes", + "Images", + "Text", + "Widgets", + "Content overflowing", + "Navigation not working", + "Slow performance" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Layouts and Small Screens A story page has two layouts, horizontal and vertical, and chooses between them from the size and shape of the window rather than from the kind of device. This page describes what each layout does and how the rest of the site adapts to small and short windows. The terms it uses are defined in 8.7 Story Engine Vocabulary . The Two Layouts In the horizontal layout, the text card sits beside the object as a side card, and the reader moves through the story by scrolling. In the vertical layout, the text card sits below the object as a bottom card, and the reader moves with previous and next buttons. The page uses the vertical layout when any of these is true of the window: It is 1024px wide or narrower. Its aspect ratio is 3:4 or narrower, as on a tablet held upright, whatever its width. It is 480px tall or shorter. It is between 481px and 632px tall and too narrow for a side card of the width its height needs. Otherwise it uses the horizontal layout. The layout follows the window as it is resized. The text card In the horizontal layout, the side card is between 37% and 52% of the window's width, set by the window's height, and white, over the object. In the vertical layout, the bottom card is anchored to the bottom of the window and white, up to 40% of the window's height (35% for a video or audio object). On a window 480px tall or shorter, such as a phone on its side, the card returns to the side of the object while the page stays in the vertical layout. This is the phone-height side card: it takes 37% of the window's width and scrolls within itself when its text is longer than the window. The text inside a card also sizes itself to the card: when the card is 480px wide or narrower, and again at 360px, its padding and type get smaller. An answer longer than 15 lines is set at 90% of the card's answer size, so that an answer at the 18-line limit fits the side card without scrolling. Navigation How the reader moves is decided once, when the story loads: Scroll navigation (wheel, trackpad, touch and keyboard) in the horizontal layout. Button navigation in the vertical layout, in embedded stories, and on iPhone and iPad in either layout, where momentum scrolling is not reliable. The previous and next buttons are 66px circles fixed to the right edge of the window, centered vertically. Because the choice is made at load, a window opened wide and then narrowed keeps scroll navigation, and one opened narrow and then widened keeps the buttons. The keyboard works in both: the arrow keys, Page Up and Page Down, Space, Home and End. In the vertical layout, the back button becomes a 44px round icon, the step counter moves to the center of the top edge, and the credits badge shrinks to one line. Loading Both layouts load objects the same way: the viewers for the next preload_steps steps (6 by default) and the previous 2, up to max_viewer_cards . See 3.2 Configuration . When a story has loading_threshold or more distinct objects (5 by default), a shimmer shows while the first viewers load; in button navigation it also shows when the reader reaches an object that is not ready yet. Compact Type Size On any window 600px tall or shorter, whatever its width, Telar uses a compact type size: smaller type and tighter spacing in page content, the objects gallery, the navigation bar, the panels and their titles, and the story's navigation buttons, which become 45px. iOS Safari and Notches Stable heights: layout heights use dynamic viewport units ( dvh ) with a vh fallback, so the layout does not jump when Safari's address bar appears or disappears. Notch safe areas: the credits badge, the navigation buttons, the bottom card and the panels keep clear of the device notch and home indicator. Hover: hover styles apply only on devices with a fine pointer ( @media (hover: hover) and (pointer: fine) ), so they do not stick after a tap on a touchscreen. Reduced motion: when the operating system asks for reduced motion, smooth scrolling is off, the camera moves to each framing at once, and card and panel transitions are off. Panels Panels slide in from the right in both layouts. In the horizontal layout, layer 1 takes 65% of the window (at most 800px), layer 2 55% (at most 750px) and the glossary 50% (at most 700px); on windows between 1025px and 1200px wide they take 80%, 75% and 70%. In the vertical layout they take nearly the whole width (98%, 96% and 94%) and 76% of the height, show only the close button, and use less padding. Panel type gets smaller only in the compact type size: titles go from 2rem to 1.4rem, body text from 1.05rem to 0.9rem, and line height from 1.8 to 1.35. Objects Gallery The gallery fills the width with columns at least 250px wide. In the vertical layout it shows two columns, and on windows 441px wide or narrower, one. Glossary Index In the vertical layout, the glossary index tightens its spacing: letter headings get smaller and their margins shrink by a third, and the space between terms is halved. Testing Your Site on Small Screens Browser DevTools Use your browser's developer tools to try different window sizes: Chrome: Open DevTools (F12) Click the device toolbar icon Select a device preset or enter custom dimensions Try both orientations Firefox: Open DevTools (F12) Click Responsive Design Mode Try different devices Resize the window across the layout thresholds: 1024px wide, a 3:4 aspect ratio, and 480px and 600px tall. Reload after a resize to see the navigation a reader with that window would get. Real Devices Test on real devices when you can: iOS : Safari on iPhone and iPad Android : Chrome on a phone and a tablet Common Screen Sizes iPhone SE : 375 × 667px iPhone 12/13/14 : 390 × 844px iPhone 12/13/14 Pro Max : 428 × 926px iPad : 768 × 1024px Samsung Galaxy S : 360 × 740px Samsung Galaxy Note : 412 × 915px Content on Small Screens Images Make sure IIIF images have enough detail when zoomed. Check that the features a step points to are visible on a small screen. Check how your framings look in both layouts. Text Keep answer paragraphs short (3 to 5 sentences). Use lists to break up long passages. Put essential information in layer 1 and supplementary detail in layer 2, since readers on phones may not open every layer. Widgets Carousels: 3 to 5 images, with short captions. Tabs: 2 or 3 tabs with short labels; on narrow screens the tab row scrolls sideways. Accordions: work well on small screens; use clear titles. Performance Readers on phones often have slow or metered connections: Compress images before you upload them (aim for under 2MB each) and let IIIF tiling handle progressive loading. Choose external IIIF sources with fast servers, and test how quickly their manifests load. Keep images in panels to the ones the text needs. Accessibility Most controls are at least 44 × 44px, the WCAG 2.1 minimum touch target; the story's navigation buttons are 66px, or 45px in the compact type size. Navigation buttons and other controls carry ARIA labels. Troubleshooting Content overflowing Check custom CSS for fixed-width elements. Make sure images have max-width: 100% . Try the page in your browser's responsive mode. Navigation not working Clear the browser cache, or try a private window. Check the JavaScript console for errors. Check that custom code does not block touch or wheel events. Slow performance Reduce image file sizes. Check how quickly IIIF manifests respond. Test on a throttled connection in DevTools. Testing Checklist The home page loads and displays correctly The objects gallery shows two columns in the vertical layout, and one on a narrow phone The story uses the expected layout and navigation at each window size The navigation buttons are easy to tap Panels open and close Text is readable without zooming Images load Widgets work Glossary links work The site works with the phone upright and on its side Performance is acceptable on a slow connection" + }, + "/docs/the-compositor/getting-started/": { + "ids": [ + "after-import", + "connect-a-repository", + "connect-an-existing-site", + "getting-started-with-the-compositor", + "import-from-google-sheets", + "install-the-github-app", + "prerequisites", + "see-also", + "sign-in" + ], + "selectors": { + "h1": [ + "Connect an existing site" + ], + "h2": [ + "Prerequisites", + "Sign in", + "Install the GitHub App", + "Connect a repository", + "Import from Google Sheets", + "After import", + "See also" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [ + "If you only want the Compositor to access one repository, select Only select repositories and choose it from the list. You can change this later in your GitHub settings under Applications." + ], + "img": [] + }, + "text": "Connect an existing site Use this guide when your Telar repository already exists. To start a new project, follow Create your first site . Prerequisites Before you begin, make sure you have: A GitHub account — sign up for free if you don't have one A Telar repository — create one from the Telar template (see Use the Compositor for step-by-step instructions) GitHub Pages enabled — in your repository settings, set the Pages source to GitHub Actions Sign in The Compositor uses your GitHub account for authentication and publishing. No separate account is needed. Go to compositor.telar.org Click Sign in with GitHub Authorize the Telar Compositor when GitHub prompts you Install the GitHub App On your first sign-in, the Compositor asks you to install the Telar GitHub App. This app gives the Compositor permission to read and write to your repositories. When prompted, click Install Choose whether to grant access to all repositories or only specific ones Confirm the installation If you only want the Compositor to access one repository, select Only select repositories and choose it from the list. You can change this later in your GitHub settings under Applications . Connect a repository After signing in, you select which repository to work with. The Compositor shows a list of your GitHub repositories that have the Telar GitHub App installed Select the repository you want to edit The Compositor scans the repository to detect Telar content files If the repository was created from the Telar template and has content in telar-content/ , the Compositor imports it automatically. Import from Google Sheets If the site uses Google Sheets, follow the import and settings checks shown by the Compositor. Review the content that is imported and any request to switch off the Sheets connection before proceeding with visual authoring. Your spreadsheet is not deleted by importing it. Decide which authoring method will manage future changes; do not assume edits in the Compositor automatically update the original sheet. After import After import and the setup checks, use the main navigation to: View and manage your stories Browse and edit your objects Start building new content Your imported content is saved on the server. Changes you make are not sent to GitHub until you publish — so you can explore and experiment freely. See also Start and navigation — Navigate your project and manage stories Objects — Browse, edit, and add objects Use the Compositor — Create a repository and enable GitHub Pages" + }, + "/docs/developers/": { + "ids": [ + "81-local-dev-setup", + "82-github-actions", + "83-demo-system-architecture", + "84-embedding-system", + "85-advanced-styling", + "86-layouts-and-small-screens", + "87-story-engine-vocabulary", + "contributing-to-telar", + "for-developers", + "getting-help", + "quick-links", + "whats-in-this-section", + "who-this-section-is-for" + ], + "selectors": { + "h1": [ + "For Developers" + ], + "h2": [ + "Who This Section Is For", + "What's In This Section", + "Contributing to Telar", + "Getting Help", + "Quick Links" + ], + "h3": [ + "8.1 Local Dev Setup", + "8.2 GitHub Actions", + "8.3 Demo System Architecture", + "8.4 Embedding System", + "8.5 Advanced Styling", + "8.6 Layouts and Small Screens", + "8.7 Story Engine Vocabulary" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "For Developers Technical documentation for developers, contributors, and those maintaining Telar forks. Who This Section Is For This section is designed for: Developers building features or fixing bugs in Telar Maintainers of Telar forks for specific institutions Contributors wanting to understand Telar's architecture Advanced users troubleshooting build issues or customizing the framework If you're a storyteller creating content for a Telar site, you probably want the main documentation sections instead. What's In This Section 8.1 Local Dev Setup Set up your development environment, run builds locally, and test changes before deploying. 8.2 GitHub Actions Understand Telar's automated build workflow and how to customize the deployment pipeline. 8.3 Demo System Architecture Learn how the demo content fetching system works, from version matching to bundle integration. 8.4 Embedding System Technical details of Telar's iframe embedding system and how it handles different contexts. 8.5 Advanced Styling Customize Telar's styles with custom CSS, CSS variables and cascade layers. 8.6 Layouts and Small Screens How the story page chooses between its two layouts, and how the site adapts to small and short windows. 8.7 Story Engine Vocabulary The terms the story engine's code and these docs use for a story's parts, its moves and its layouts. Contributing to Telar Telar is open source and welcomes contributions. Before contributing: Set up local development (8.1) to test your changes Understand the build system (8.2, 8.3) to see how content is processed Follow the existing patterns in the codebase Test thoroughly before submitting pull requests Repository : UCSB-AMPLab/telar Getting Help Issues : Report bugs or request features on GitHub Issues Discussions : Ask questions in GitHub Discussions Email : Contact the maintainers for sensitive issues or institutional partnerships Quick Links Main Documentation - User-facing docs for storytellers Configuration Reference - All _config.yml options CSV Reference: Project - CSV column documentation" + }, + "/guia/tu-contenido/objetos-de-video/": { + "ids": [ + "agregar-un-objeto-de-video", + "control-de-clips", + "cómo-se-muestran-los-videos", + "en-historias", + "en-la-galería", + "en-páginas-de-objetos", + "encontrar-tiempos-de-clip", + "objetos-de-video", + "plataformas-compatibles", + "véase-también" + ], + "selectors": { + "h1": [ + "Objetos de video" + ], + "h2": [ + "Agregar un objeto de video", + "Cómo se muestran los videos", + "Control de clips", + "Véase también" + ], + "h3": [ + "Plataformas compatibles", + "En historias", + "En páginas de objetos", + "En la galería", + "Encontrar tiempos de clip" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "object_id,title,source_url interview-01,Oral history interview,https://www.youtube.com/watch?v=dQw4w9WgXcQ", + "paso,objeto,inicio_clip,fin_clip,bucle,pregunta,respuesta 1,entrevista-01,45,78,false,¿Qué describe ella?,La técnica de tejido utilizada en su comunidad. 2,entrevista-01,120,145,true,Un motivo recurrente,Observa cómo se repite el patrón — este *clip* se reproduce en bucle para resaltar la repetición." + ], + "table": [ + "Columna (inglés) Columna (español) Descripción clip_start inicio_clip Tiempo de inicio en segundos (ej., 12.5) clip_end fin_clip Tiempo de fin en segundos loop bucle Repetir el clip en bucle (true, yes o sí)" + ], + "blockquote": [ + "Telar no admite archivos de video autoalojados. Los videos deben estar alojados en una de las plataformas compatibles. Para medios autoalojados, consulta Objetos de audio.", + "También puedes fijar los tiempos del clip de forma visual en el Compositor. Consulta Video y audio en el Compositor para más detalles." + ], + "img": [] + }, + "text": "Objetos de video Telar puede mostrar videos de YouTube, Vimeo y Google Drive como objetos en tu exhibición. Los videos funcionan igual que las imágenes — puedes construir historias alrededor de ellos, enfocar momentos específicos con control de clips e incluirlos junto a los demás objetos. Los videos no se almacenan en el repositorio — Telar los inserta directamente desde la plataforma donde ya están alojados. Agregar un objeto de video Para agregar un video, pon la URL del video en la columna source_url de tu hoja de cálculo de objetos. Telar detecta el tipo de medio automáticamente a partir de la URL — no se necesita configuración adicional. Por ejemplo, una fila en tu hoja de cálculo de objetos podría verse así: object_id,title,source_url interview-01,Oral history interview,https://www.youtube.com/watch?v=dQw4w9WgXcQ Plataformas compatibles Telar reconoce URLs de video de tres plataformas: YouTube — youtube.com/watch?v=... y enlaces cortos youtu.be/... Vimeo — vimeo.com/123456789 Google Drive — drive.google.com/file/d/.../view (el video debe estar compartido públicamente o con \"Cualquier persona con el enlace\") Telar no admite archivos de video autoalojados. Los videos deben estar alojados en una de las plataformas compatibles. Para medios autoalojados, consulta Objetos de audio . Cómo se muestran los videos En historias Cuando un paso de la historia hace referencia a un objeto de video, el reproductor ocupa el área del visor. El reproductor incluye controles de reproducción estándar (reproducir, pausar, avanzar) y responde a cualquier configuración de clip definida para ese paso. Si estableces valores de clip_start y clip_end en tu hoja de cálculo de historias, el video reproduce solo el segmento especificado. Esto es útil para dirigir la atención a un momento particular sin requerir que el público vea la grabación completa. En páginas de objetos Cada objeto de video tiene su propia página ( /objects/{object-id}/ ) con un reproductor insertado. Debajo del reproductor, un selector de tiempos de clip permite reproducir hasta una posición y capturar marcas de tiempo — útil al construir pasos de historias. En la galería Los objetos de video aparecen en la galería de objetos con un ícono de reproducción sobre un fondo gris. El filtro Type de la galería permite a quienes visitan explorar por tipo de medio (Image, Video o Audio). Control de clips Los pasos de la historia pueden especificar un tiempo de inicio, un tiempo de fin y una configuración de bucle para los objetos de video. Agrega estas columnas a la hoja de cálculo de la historia: Columna (inglés) Columna (español) Descripción clip_start inicio_clip Tiempo de inicio en segundos (ej., 12.5 ) clip_end fin_clip Tiempo de fin en segundos loop bucle Repetir el clip en bucle ( true , yes o sí ) Las tres columnas son opcionales. Si se omiten, el video se reproduce desde el inicio sin bucle. paso,objeto,inicio_clip,fin_clip,bucle,pregunta,respuesta 1,entrevista-01,45,78,false,¿Qué describe ella?,La técnica de tejido utilizada en su comunidad. 2,entrevista-01,120,145,true,Un motivo recurrente,Observa cómo se repite el patrón — este *clip* se reproduce en bucle para resaltar la repetición. Encontrar tiempos de clip La página de objeto de cada video incluye un selector de tiempos de clip: Navega a la página de objeto del video ( /objects/{object-id}/ ) Reproduce el video hasta la posición deseada Haz clic en los botones de captura de marca de tiempo para registrar los tiempos de inicio y fin Copia los valores en tu hoja de cálculo de historias También puedes fijar los tiempos del clip de forma visual en el Compositor. Consulta Video y audio en el Compositor para más detalles. Véase también Objetos de audio — Agregar archivos de audio autoalojados Objetos — Definir objetos en tu hoja de cálculo Historias y paneles — Construir pasos de historias Columnas de historias — Referencia completa de columnas incluyendo columnas de clip Galería de objetos — Cómo se muestran los videos en la galería" + }, + "/docs/your-content/": { + "ids": [ + "your-content" + ], + "selectors": { + "h1": [ + "Your Content" + ], + "h2": [], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Your Content Objects, stories, panels and supporting pages make up an exhibition. This reference describes their source files and formats. Use the Compositor manual for visual editing, the Sheets manual for spreadsheet authoring or the local manual for CSV and Markdown files. All three routes produce a static site. Objects — The visual items your stories explore — images, maps, documents, photographs Self-Hosted Images — Upload your own images and Telar generates zoomable tiles automatically External IIIF Images — Use images from museums, libraries, and other IIIF providers Stories & Panels — Step-by-step narratives built around your objects, with expandable detail panels Rich Content with Markdown — Enhance story panels with longer narratives, embedded media, and reusable content Markdown Syntax — Formatting reference for markdown files used in panels and pages Widgets — Interactive elements for story panels and custom pages — carousels, tabs, accordions" + }, + "/docs/site-features/custom-pages/": { + "ids": [ + "creating-a-custom-page", + "custom-pages", + "differences-from-story-layers", + "example-credits-page", + "file-naming", + "glossary-links", + "layout-and-styling", + "markdown-formatting", + "next-steps", + "step-1-create-the-markdown-file", + "step-2-write-your-content", + "step-3-add-to-navigation", + "supported-features", + "what-are-custom-pages", + "widgets" + ], + "selectors": { + "h1": [ + "Custom Pages" + ], + "h2": [ + "What are Custom Pages?", + "Creating a Custom Page", + "Supported Features", + "Layout and Styling", + "File Naming", + "Example: Credits Page", + "Differences from Story Layers", + "Next Steps" + ], + "h3": [ + "Step 1: Create the Markdown File", + "Step 2: Write Your Content", + "Step 3: Add to Navigation", + "Markdown Formatting", + "Widgets", + "Glossary Links" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "telar-content/texts/pages/ ├── about.md # Default page (included in template) ├── credits.md # Your custom credits page └── methodology.md # Your custom methodology page", + "--- --- # About This Project This digital archive explores colonial trade networks through... ## Research Team - **Principal Investigator**: Dr. Jane Smith - **Digital Humanities Developer**: Alex Chen - **Graduate Researchers**: María González, John Davis ## Acknowledgments This project was made possible by...
Funding Sources - National Endowment for the Humanities - University Research Grant Program - Digital Scholarship Initiative
", + "The [[encomienda]] system was a key institution...", + "--- --- # Credits ## Project Team **Principal Investigator**: Dr. Elena Martínez (University of California) **Digital Scholarship Coordinator**: James Park (UCSB Library) **Research Assistants**: Sofia Rodriguez, Michael Chen ## Funding This project received generous support from: - National Endowment for the Humanities (Grant #AB-12345) - Andrew W. Mellon Foundation - UC Digital Humanities Program ## Technical Credits Built with [Telar](https://telar.org), an open-source framework for digital storytelling.
Image Sources and Permissions All images used with permission: - Bogotá Painting (1614): Princeton University Art Museum - Colonial Maps: Library of Congress, Geography and Map Division - Ceramic Figures: Smithsonian National Museum of the American Indian
Special Thanks We are grateful to the following individuals and institutions: - Archive of the Indies (Seville, Spain) - Colombian National Archive (Bogotá) - Dr. Maria Santos for archival research assistance - The Digital Scholarship Commons at UCSB
" + ], + "table": [ + "File URL about.md /about/ credits.md /credits/ methodology.md /methodology/ team-bios.md /team-bios/", + "Feature Story Layers Custom Pages Location telar-content/texts/stories/ telar-content/texts/pages/ Viewer integration Yes (split-screen with IIIF) No (full-width text) Step navigation Yes (coordinated with viewer) No (standalone page) Widgets Yes Yes Glossary Yes Yes Navigation Via story interface Via site menu URL structure /story-name/ /page-name/" + ], + "blockquote": [ + "The frontmatter (---) lines are required but can be empty. They tell Jekyll to process the file." + ], + "img": [] + }, + "text": "Custom Pages Create custom pages for credits, methodology, team information, or any other content that doesn't fit into the story structure. For visual authoring, see homepage and pages . What are Custom Pages? Custom pages are standalone pages that appear in your site's navigation menu but aren't part of the story viewer. Unlike story layers, which are tightly integrated with IIIF objects and step navigation, custom pages are flexible containers for any content you want to share. Common use cases: About : Introduce your project and research team Methodology : Explain your research methods and sources Credits : Acknowledge contributors, funders, and institutions Bibliography : List sources and further reading Contact : Provide ways to get in touch Creating a Custom Page Step 1: Create the Markdown File Add a new .md file in the telar-content/texts/pages/ directory: telar-content/texts/pages/ ├── about.md # Default page (included in template) ├── credits.md # Your custom credits page └── methodology.md # Your custom methodology page Step 2: Write Your Content Custom pages use standard markdown with full widget and glossary support: --- --- # About This Project This digital archive explores colonial trade networks through... ## Research Team - **Principal Investigator**: Dr. Jane Smith - **Digital Humanities Developer**: Alex Chen - **Graduate Researchers**: María González, John Davis ## Acknowledgments This project was made possible by...
Funding Sources - National Endowment for the Humanities - University Research Grant Program - Digital Scholarship Initiative
The frontmatter ( --- ) lines are required but can be empty. They tell Jekyll to process the file. Step 3: Add to Navigation Update _data/navigation.yml to include your new page in the menu. See Navigation Configuration for details. Supported Features Custom pages support the same markdown features as story layers: Markdown Formatting Headings (h1-h6) Bold , italic , and other text formatting Lists (bulleted and numbered) Links and images Blockquotes Widgets All Telar widgets work on custom pages: Accordion : Collapsible sections Tabs : Tabbed content panels Carousel : Image slideshows See Markdown Syntax Reference for complete widget documentation. Glossary Links Glossary auto-linking works the same way: The [[encomienda]] system was a key institution... When users click the link, the glossary panel opens with the definition. Layout and Styling Custom pages use the user-page layout, which provides: Responsive container : Content is centered and constrained for readability Consistent header/footer : Navigation menu and site branding Widget processing : Accordion, tabs, and carousel support Glossary integration : Auto-linking and panel display Jekyll's conventional layout: page is also available if you add your own markdown files with front matter: a minimal centered prose column with the site header and footer, without widget processing or glossary integration. File Naming File names determine the page URL: File URL about.md /about/ credits.md /credits/ methodology.md /methodology/ team-bios.md /team-bios/ Naming rules: Use lowercase Use hyphens for spaces (not underscores) Use descriptive names (the filename becomes the URL) Example: Credits Page Here's a complete example showing credits with an accordion for detailed acknowledgments: --- --- # Credits ## Project Team **Principal Investigator**: Dr. Elena Martínez (University of California) **Digital Scholarship Coordinator**: James Park (UCSB Library) **Research Assistants**: Sofia Rodriguez, Michael Chen ## Funding This project received generous support from: - National Endowment for the Humanities (Grant #AB-12345) - Andrew W. Mellon Foundation - UC Digital Humanities Program ## Technical Credits Built with [Telar](https://telar.org), an open-source framework for digital storytelling.
Image Sources and Permissions All images used with permission: - Bogotá Painting (1614): Princeton University Art Museum - Colonial Maps: Library of Congress, Geography and Map Division - Ceramic Figures: Smithsonian National Museum of the American Indian
Special Thanks We are grateful to the following individuals and institutions: - Archive of the Indies (Seville, Spain) - Colombian National Archive (Bogotá) - Dr. Maria Santos for archival research assistance - The Digital Scholarship Commons at UCSB
Differences from Story Layers Feature Story Layers Custom Pages Location telar-content/texts/stories/ telar-content/texts/pages/ Viewer integration Yes (split-screen with IIIF) No (full-width text) Step navigation Yes (coordinated with viewer) No (standalone page) Widgets Yes Yes Glossary Yes Yes Navigation Via story interface Via site menu URL structure /story-name/ /page-name/ Next Steps Learn how to configure navigation to add pages to your menu Explore widget syntax for accordion, tabs, and carousels See glossary configuration for auto-linking setup New in v0.6.0 : Custom pages with full widget and glossary support." + }, + "/docs/customization/navigation-menu/": { + "ids": [ + "adding-a-new-page", + "best-practices", + "bilingual-labels", + "clear-descriptive-labels", + "complete-example", + "consistent-ordering", + "creating-your-navigation-file", + "external-link-not-opening-in-new-tab", + "external-links", + "fallback-behavior", + "fallback-menu", + "how-it-works", + "how-language-selection-works", + "internal-pages", + "limit-menu-length", + "menu-item-types", + "menu-not-updating", + "menu-order", + "navigation-menu-configuration", + "objects-index", + "optional-fields", + "related-documentation", + "removing-a-page", + "reordering-items", + "required-fields", + "step-1-create-the-file", + "step-2-define-your-menu-structure", + "stories-homepage", + "troubleshooting", + "updating-the-menu", + "what-is-the-navigation-menu", + "wrong-language-showing" + ], + "selectors": { + "h1": [ + "Navigation Menu Configuration" + ], + "h2": [ + "What is the Navigation Menu?", + "How It Works", + "Creating Your Navigation File", + "Menu Item Types", + "Complete Example", + "Bilingual Labels", + "Menu Order", + "Updating the Menu", + "Fallback Menu", + "Troubleshooting", + "Best Practices", + "Related Documentation" + ], + "h3": [ + "Step 1: Create the File", + "Step 2: Define Your Menu Structure", + "Required Fields", + "Optional Fields", + "Internal Pages", + "External Links", + "Stories Homepage", + "Objects Index", + "How Language Selection Works", + "Fallback Behavior", + "Adding a New Page", + "Removing a Page", + "Reordering Items", + "Menu Not Updating", + "Wrong Language Showing", + "External Link Not Opening in New Tab", + "Clear, Descriptive Labels", + "Consistent Ordering", + "Limit Menu Length" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "_data/ ├── navigation.yml # Your custom navigation config ├── objects.json # Generated objects data └── project.json # Generated project data", + "menu: - title_en: \"Stories\" titulo_es: \"Historias\" url: \"/\" - title_en: \"Objects\" titulo_es: \"Objetos\" url: \"/objects/\" - title_en: \"About\" titulo_es: \"Acerca de\" url: \"/about/\" - title_en: \"Credits\" titulo_es: \"Créditos\" url: \"/credits/\"", + "- title_en: \"Methodology\" titulo_es: \"Metodología\" url: \"/methodology/\"", + "- title_en: \"Project Archive\" titulo_es: \"Archivo del Proyecto\" url: \"https://archive.example.org\" external: true", + "- title_en: \"Stories\" titulo_es: \"Historias\" url: \"/\"", + "- title_en: \"Objects\" titulo_es: \"Objetos\" url: \"/objects/\"", + "menu: # Stories homepage - title_en: \"Stories\" titulo_es: \"Historias\" url: \"/\" # Objects catalog - title_en: \"Objects\" titulo_es: \"Objetos\" url: \"/objects/\" # Custom pages - title_en: \"About\" titulo_es: \"Acerca de\" url: \"/about/\" - title_en: \"Methodology\" titulo_es: \"Metodología\" url: \"/methodology/\" - title_en: \"Team\" titulo_es: \"Equipo\" url: \"/team/\" - title_en: \"Credits\" titulo_es: \"Créditos\" url: \"/credits/\" # External link - title_en: \"Full Archive\" titulo_es: \"Archivo Completo\" url: \"https://archive.example.org\" external: true", + "menu: - title_en: \"Stories\" # Appears first ... - title_en: \"Objects\" # Appears second ... - title_en: \"About\" # Appears third ...", + "- title_en: \"Contact\" titulo_es: \"Contacto\" url: \"/contact/\"", + "# - title_en: \"Old Page\" # titulo_es: \"Página Antigua\" # url: \"/old-page/\"", + "menu: # Move \"About\" to the top - title_en: \"About\" titulo_es: \"Acerca de\" url: \"/about/\" - title_en: \"Stories\" titulo_es: \"Historias\" url: \"/\" # Rest of menu...", + "- title_en: \"External Resource\" titulo_es: \"Recurso Externo\" url: \"https://example.com\" external: true # Required for new tab", + "- title_en: \"Research Methodology\" titulo_es: \"Metodología de Investigación\"", + "- title_en: \"Info\" titulo_es: \"Info\"", + "# Project pages - title_en: \"About\" - title_en: \"Team\" - title_en: \"Methodology\" # Content pages - title_en: \"Stories\" - title_en: \"Objects\" # External resources - title_en: \"Archive\"" + ], + "table": [ + "Field Purpose Example title_en English label \"About\" titulo_es Spanish label \"Acerca de\" url Page URL \"/about/\"", + "Field Purpose Example external Opens in new tab true" + ], + "blockquote": [], + "img": [ + [ + "/images/navigation-menu.png", + "Navigation menu in the site header" + ] + ] + }, + "text": "Navigation Menu Configuration Customize your site's navigation menu to include custom pages, external links, and bilingual labels. In the Compositor, arrange navigation in Home and Pages . This page documents the underlying navigation file. What is the Navigation Menu? The navigation menu appears in your site's header and provides links to: Your stories (automatically generated) Custom pages (About, Credits, etc.) Objects index (automatically included) External resources (optional) How It Works Navigation is configured through _data/navigation.yml . This data-driven approach gives you complete control over menu structure and labels. When navigation.yml exists, Telar uses it to build your menu. If the file is missing, a hardcoded fallback menu appears with basic links (Stories, Objects, About). Creating Your Navigation File Step 1: Create the File Add navigation.yml to the _data/ directory: _data/ ├── navigation.yml # Your custom navigation config ├── objects.json # Generated objects data └── project.json # Generated project data Step 2: Define Your Menu Structure Here's a basic configuration: menu: - title_en: \"Stories\" titulo_es: \"Historias\" url: \"/\" - title_en: \"Objects\" titulo_es: \"Objetos\" url: \"/objects/\" - title_en: \"About\" titulo_es: \"Acerca de\" url: \"/about/\" - title_en: \"Credits\" titulo_es: \"Créditos\" url: \"/credits/\" Required Fields Each menu item needs: Field Purpose Example title_en English label \"About\" titulo_es Spanish label \"Acerca de\" url Page URL \"/about/\" Optional Fields Field Purpose Example external Opens in new tab true Menu Item Types Internal Pages Link to pages within your site: - title_en: \"Methodology\" titulo_es: \"Metodología\" url: \"/methodology/\" The URL should match your page's filename ( methodology.md → /methodology/ ). External Links Link to external resources: - title_en: \"Project Archive\" titulo_es: \"Archivo del Proyecto\" url: \"https://archive.example.org\" external: true When external: true , the link opens in a new tab with target=\"_blank\" . Stories Homepage Link to the stories list: - title_en: \"Stories\" titulo_es: \"Historias\" url: \"/\" Objects Index Link to the objects catalog: - title_en: \"Objects\" titulo_es: \"Objetos\" url: \"/objects/\" Complete Example Here's a full navigation configuration for a research project: menu: # Stories homepage - title_en: \"Stories\" titulo_es: \"Historias\" url: \"/\" # Objects catalog - title_en: \"Objects\" titulo_es: \"Objetos\" url: \"/objects/\" # Custom pages - title_en: \"About\" titulo_es: \"Acerca de\" url: \"/about/\" - title_en: \"Methodology\" titulo_es: \"Metodología\" url: \"/methodology/\" - title_en: \"Team\" titulo_es: \"Equipo\" url: \"/team/\" - title_en: \"Credits\" titulo_es: \"Créditos\" url: \"/credits/\" # External link - title_en: \"Full Archive\" titulo_es: \"Archivo Completo\" url: \"https://archive.example.org\" external: true Bilingual Labels How Language Selection Works Telar displays menu labels based on your site's language setting ( telar_language in _config.yml ): If telar_language: en → Shows title_en labels If telar_language: es → Shows titulo_es labels Fallback Behavior If a menu item is missing the appropriate language label, Telar falls back gracefully: Try current language label ( title_en or titulo_es ) If missing, try the other language If both missing, show URL as label Menu Order Menu items appear in the order you list them in navigation.yml : menu: - title_en: \"Stories\" # Appears first ... - title_en: \"Objects\" # Appears second ... - title_en: \"About\" # Appears third ... Updating the Menu Adding a New Page When you create a new custom page: Create the markdown file ( telar-content/texts/pages/contact.md ) Add it to navigation.yml : - title_en: \"Contact\" titulo_es: \"Contacto\" url: \"/contact/\" Rebuild your site The menu updates automatically. Removing a Page To remove a page from the menu: Delete or comment out the entry in navigation.yml : # - title_en: \"Old Page\" # titulo_es: \"Página Antigua\" # url: \"/old-page/\" Rebuild your site The page file can remain in telar-content/texts/pages/ but won't appear in navigation. Reordering Items Change the order in navigation.yml : menu: # Move \"About\" to the top - title_en: \"About\" titulo_es: \"Acerca de\" url: \"/about/\" - title_en: \"Stories\" titulo_es: \"Historias\" url: \"/\" # Rest of menu... Fallback Menu If _data/navigation.yml doesn't exist, Telar shows a hardcoded fallback menu: Stories (homepage) Objects (catalog) About (if about.md exists) This ensures your site always has basic navigation, even without configuration. Troubleshooting Menu Not Updating If your menu changes don't appear: Check YAML syntax : Use a YAML validator to verify navigation.yml is valid Rebuild the site : Run bundle exec jekyll build to regenerate Clear browser cache : Use Ctrl+Shift+R (Cmd+Shift+R on Mac) to hard refresh Verify file location : File must be at _data/navigation.yml (not data/ or _data/nav.yml ) Wrong Language Showing If menu labels appear in the wrong language: Check telar_language in _config.yml Verify you're using correct field names ( title_en and titulo_es , not title or label ) Ensure both language labels are present External Link Not Opening in New Tab Add the external: true field: - title_en: \"External Resource\" titulo_es: \"Recurso Externo\" url: \"https://example.com\" external: true # Required for new tab Best Practices Clear, Descriptive Labels Use labels that clearly describe the destination: ✓ Good: - title_en: \"Research Methodology\" titulo_es: \"Metodología de Investigación\" ✗ Avoid: - title_en: \"Info\" titulo_es: \"Info\" Consistent Ordering Keep related items together: # Project pages - title_en: \"About\" - title_en: \"Team\" - title_en: \"Methodology\" # Content pages - title_en: \"Stories\" - title_en: \"Objects\" # External resources - title_en: \"Archive\" Limit Menu Length Keep menus focused (5-7 items is ideal). For larger sites, consider grouping content differently or using footer links for secondary pages. Related Documentation Custom Pages - Creating pages to link in navigation Configuration Reference - Complete _config.yml options including telar_language Customization Overview - Other customization options New in v0.6.0 : Customizable navigation with bilingual labels and external link support." + }, + "/docs/your-data/csv-objects/": { + "ids": [ + "alt_text--texto_alt", + "column-aliases", + "columns", + "credit--credito", + "custom-metadata-columns", + "description--descripcion", + "example", + "featured--destacado", + "field-notes", + "file-organization", + "gallery-metadata-tips", + "medium--medio_genero", + "migration-from-v07x-to-v080", + "new-columns-optional", + "object-columns", + "object_id--id_objeto", + "object_type--tipo_objeto", + "objects-csv-objectscsv--objetoscsv", + "renamed-columns", + "see-also", + "source--fuente", + "source_url--url_fuente", + "subjects--temas", + "thumbnail--miniatura", + "validation", + "year--año" + ], + "selectors": { + "h1": [ + "Object Columns" + ], + "h2": [ + "Objects CSV (objects.csv / objetos.csv)", + "Gallery Metadata Tips", + "File Organization", + "Migration from v0.7.x to v0.8.0", + "Validation", + "See Also" + ], + "h3": [ + "Columns", + "Custom metadata columns", + "Example", + "Field Notes", + "Column Aliases", + "New columns (optional)", + "Renamed columns" + ], + "h4": [ + "object_id / id_objeto", + "description / descripcion", + "source_url / url_fuente", + "year / año", + "source / fuente", + "medium / medio_genero", + "alt_text / texto_alt", + "object_type / tipo_objeto", + "subjects / temas", + "featured / destacado", + "credit / credito", + "thumbnail / miniatura" + ], + "h5": [], + "h6": [], + "pre": [ + "object_id,title,material,technique textile-001,Colonial Textile,Cotton and wool blend,Backstrap loom weaving", + "object_id,title,description,creator,year,object_type,subjects,source,credit,featured,source_url textile-001,Colonial Textile,A woven fragment showing complex patterns...,Unknown,1650,textile,\"weaving, colonial\",National Museum,Public Domain,yes, map-lima,Map of Lima,Early colonial map showing city layout,Juan de Cuellar,1685,map,\"cartography, Lima\",British Library,,no,https://example.org/iiif/map/info.json", + "id_objeto,titulo,descripcion,creador,año,tipo_objeto,temas,fuente,credito,destacado,url_fuente textil-001,Textil Colonial,Un fragmento tejido con patrones complejos...,Desconocido,1650,textil,\"tejido, colonial\",Museo Nacional,Dominio Público,si, mapa-lima,Mapa de Lima,Mapa colonial temprano...,Juan de Cuellar,1685,mapa,\"cartografía, Lima\",Biblioteca Británica,,no,https://ejemplo.org/iiif/mapa/info.json", + "telar-content/spreadsheets/ ├── project.csv # Story metadata ├── objects.csv # Object catalog ├── colonial-textiles.csv # Story steps (using story_id) ├── trade-routes.csv # Another story └── glossary.csv # Glossary terms (optional)" + ], + "table": [ + "English Spanish Required Description object_id id_objeto Yes Unique identifier (lowercase, hyphens, underscores) title titulo Yes Object title description descripcion No Long-form description (markdown supported) source_url url_fuente No IIIF image info.json or manifest URL creator creador No Creator or artist name period periodo No Historical period year año No Year created or dated (used for gallery sorting) medium medio_genero No Genre or medium of the object (e.g., \"Photograph\", \"Oil painting\") dimensions dimensiones No Physical dimensions source fuente No Location or repository (renamed from location in v0.8.0) credit credito No Attribution or credit line thumbnail miniatura No Path to thumbnail image alt_text texto_alt No Alt text for accessibility (falls back to title if empty) object_type tipo_objeto No Object classification (used for gallery filter) subjects temas No Topical subjects, comma-separated (used for gallery filter) featured destacado No Set to yes to feature on homepage", + "Normalized Accepts object_id object_id, id_objeto, objeto, object, id title title, titulo description description, descripcion creator creator, creador period period, periodo year year, año, ano medium medium, medio, medio_genero, medium_genre, object_type, tipo_objeto dimensions dimensions, dimensiones source source, fuente, location, ubicacion credit credit, credito thumbnail thumbnail, miniatura alt_text alt_text, texto_alt subjects subjects, temas, materias, materia featured featured, destacado source_url source_url, url_fuente iiif_manifest iiif_manifest, manifiesto_iiif (legacy)", + "Column Purpose year Enables sort-by-year in gallery object_type Enables type filter in sidebar subjects Enables subjects filter in sidebar featured Controls homepage object sample", + "Old (v0.7.x) New (v0.8.0) Notes location source Old name still works" + ], + "blockquote": [ + "If you use the Compositor, it manages objects.csv visually — you don't need to edit this file directly." + ], + "img": [] + }, + "text": "Object Columns Complete reference for objects.csv columns with bilingual column name support. For column normalization and dual header support, see Project Columns . Objects CSV (objects.csv / objetos.csv) Catalogs all objects used in stories and displayed in the gallery. Location : telar-content/spreadsheets/objects.csv or telar-content/spreadsheets/objetos.csv If you use the Compositor , it manages objects.csv visually — you don't need to edit this file directly. Columns English Spanish Required Description object_id id_objeto Yes Unique identifier (lowercase, hyphens, underscores) title titulo Yes Object title description descripcion No Long-form description (markdown supported) source_url url_fuente No IIIF image info.json or manifest URL creator creador No Creator or artist name period periodo No Historical period year año No Year created or dated (used for gallery sorting) medium medio_genero No Genre or medium of the object (e.g., \"Photograph\", \"Oil painting\") dimensions dimensiones No Physical dimensions source fuente No Location or repository (renamed from location in v0.8.0) credit credito No Attribution or credit line thumbnail miniatura No Path to thumbnail image alt_text texto_alt No Alt text for accessibility (falls back to title if empty) object_type tipo_objeto No Object classification (used for gallery filter) subjects temas No Topical subjects, comma-separated (used for gallery filter) featured destacado No Set to yes to feature on homepage Custom metadata columns Any columns you add beyond the 16 standard columns listed above are automatically displayed on object pages as additional metadata fields. The column name becomes the label and the cell value becomes the displayed text. For example, adding material and technique columns to your spreadsheet: object_id,title,material,technique textile-001,Colonial Textile,Cotton and wool blend,Backstrap loom weaving The values \"Cotton and wool blend\" and \"Backstrap loom weaving\" appear as extra metadata on the object page, labeled \"material\" and \"technique\" respectively. Example English: object_id,title,description,creator,year,object_type,subjects,source,credit,featured,source_url textile-001,Colonial Textile,A woven fragment showing complex patterns...,Unknown,1650,textile,\"weaving, colonial\",National Museum,Public Domain,yes, map-lima,Map of Lima,Early colonial map showing city layout,Juan de Cuellar,1685,map,\"cartography, Lima\",British Library,,no,https://example.org/iiif/map/info.json Spanish: id_objeto,titulo,descripcion,creador,año,tipo_objeto,temas,fuente,credito,destacado,url_fuente textil-001,Textil Colonial,Un fragmento tejido con patrones complejos...,Desconocido,1650,textil,\"tejido, colonial\",Museo Nacional,Dominio Público,si, mapa-lima,Mapa de Lima,Mapa colonial temprano...,Juan de Cuellar,1685,mapa,\"cartografía, Lima\",Biblioteca Británica,,no,https://ejemplo.org/iiif/mapa/info.json Field Notes object_id / id_objeto Unique across all objects Referenced in story CSVs Used in URLs: /objects/{object_id}/ Format: lowercase, hyphens, underscores description / descripcion Markdown supported Displayed on object pages Can include headings, lists, links, emphasis source_url / url_fuente URL to IIIF Image API info.json or IIIF Presentation API manifest Use for objects from external IIIF servers Leave empty for self-hosted images (tiles generated automatically) v0.5.0+ : Preferred over the legacy iiif_manifest column (which still works) year / año New in v0.8.0 Used for sorting objects in the gallery (sort by year) Flexible format: 1650 , 1685 , 1750 Accepts año or ano (without tilde) as Spanish aliases source / fuente Renamed in v0.8.0 from location Current location or holding repository The old column name location (and Spanish aliases ubicacion , locacion ) still works for backward compatibility medium / medio_genero Renamed in v1.0.0 from object_type / tipo_objeto Describes the genre or medium of the object — not the media type (Image, Video, Audio), which is now auto-detected from the object's source Examples: Photograph , Oil painting , Textile , Map Used as a facet in the gallery filter sidebar when browse_and_search: true The old column name object_type (and Spanish alias tipo_objeto ) still works for backward compatibility Also accepts medium_genre as an English alias alt_text / texto_alt New in v1.0.0 Alt text for the object image, used for accessibility Falls back to the object's title if left empty Displayed in the alt attribute of object images across the site object_type / tipo_objeto Deprecated in v1.0.0 — use medium / medio_genero instead Still works as a backward-compatible alias for medium Object classification used as a facet in the gallery filter sidebar Examples: map , textile , photograph , painting Appears as a filter category when browse_and_search: true subjects / temas New in v0.8.0 Comma-separated topical subjects used as facets in the gallery filter sidebar Examples: \"weaving, colonial, textiles\" , \"cartography, Lima, urban planning\" Also accepts Spanish aliases: materias , materia featured / destacado New in v0.8.0 Set to yes to feature this object on the homepage Featured objects are prioritized when show_sample_on_homepage: true in config The number shown is controlled by featured_count (default: 4) credit / credito Displayed as badge in top-right corner of object images (if show_object_credits: true ) Also shown in metadata table Use for attribution: Public Domain , CC BY 4.0 , Courtesy of National Archive thumbnail / miniatura Path to a thumbnail image file Relative to the repository root If omitted, Telar generates thumbnails from the IIIF source Column Aliases Normalized Accepts object_id object_id , id_objeto , objeto , object , id title title , titulo description description , descripcion creator creator , creador period period , periodo year year , año , ano medium medium , medio , medio_genero , medium_genre , object_type , tipo_objeto dimensions dimensions , dimensiones source source , fuente , location , ubicacion credit credit , credito thumbnail thumbnail , miniatura alt_text alt_text , texto_alt subjects subjects , temas , materias , materia featured featured , destacado source_url source_url , url_fuente iiif_manifest iiif_manifest , manifiesto_iiif (legacy) Gallery Metadata Tips For the best gallery experience with browse, search, and filter: Fill in medium for every object — this powers the type filter Add subjects with 2-4 comma-separated terms — this powers the subjects filter Include year for chronological sorting Mark 4-6 objects as featured: yes for the homepage sample Write meaningful description fields — the search indexes these for full-text search File Organization telar-content/spreadsheets/ ├── project.csv # Story metadata ├── objects.csv # Object catalog ├── colonial-textiles.csv # Story steps (using story_id) ├── trade-routes.csv # Another story └── glossary.csv # Glossary terms (optional) Migration from v0.7.x to v0.8.0 New columns (optional) Add these to your objects.csv if you want gallery filtering and sorting: Column Purpose year Enables sort-by-year in gallery object_type Enables type filter in sidebar subjects Enables subjects filter in sidebar featured Controls homepage object sample Renamed columns Old (v0.7.x) New (v0.8.0) Notes location source Old name still works No breaking changes. All v0.7.x CSVs work without modification. Validation Telar checks object CSV data during build and prints messages to the build log. What the build checks : Rows with an empty object_id are silently dropped. Each object must have either a source_url pointing to a valid IIIF manifest, or a matching local image file in telar-content/objects/ . Missing or unreachable sources produce a warning; the object is still written to the output. Thumbnail values that are not image paths (for example, \"n/a\" or \"none\") are cleared with a warning. Object IDs that contain spaces produce a warning, as spaces may cause issues with file paths. What the build does not enforce : Missing or duplicate object_id values do not stop the build. Rows with no object_id are dropped without a message; duplicate IDs are not detected, and the last row wins when collection files are generated. A missing or empty title does not stop the build; the object is output with a blank title. All warnings appear in the build log. Review the output for messages marked [WARN] to catch data problems before publishing. See Also Project Columns — Project CSV column reference Story Columns — Story step CSV columns Objects — Defining objects and object pages Objects Gallery — Gallery browse, search, and filter Configuration Reference — Collection interface settings" + }, + "/guia/primeros-pasos/estructura-narrativa/": { + "ids": [ + "cierra-la-historia-retomando-la-pregunta-inicial", + "construye-una-secuencia-de-preguntas", + "dale-una-tarea-al-inicio", + "dibuja-el-arco-narrativo", + "el-patrón-preguntarespuestainvitación", + "escribe-un-cierre-que-se-desprenda-de-los-pasos", + "lee-la-secuencia-en-voz-alta", + "paneles-en-capas", + "paso-2-planea-tu-narrativa", + "planea-el-recorrido-de-la-historia", + "planea-tu-historia", + "presenta-la-fuente-y-la-pregunta" + ], + "selectors": { + "h1": [ + "Planea el recorrido de la historia" + ], + "h2": [ + "Presenta la fuente y la pregunta", + "Construye una secuencia de preguntas", + "Cierra la historia retomando la pregunta inicial", + "Lee la secuencia en voz alta" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Planea el recorrido de la historia Organiza la historia alrededor de una pregunta central. Cada paso debe ayudar a responderla con un detalle o una fuente que el público pueda examinar. Presenta la fuente y la pregunta Al comienzo, presenta la fuente, plantea la pregunta y da el contexto que el público necesita para empezar. Elige una primera vista que le permita orientarse. Deja cada detalle para el paso en el que lo vayas a analizar. En el planeador narrativo , el cuadrado representa la introducción. Úsalo para anotar cómo vas a presentar la historia; las preguntas de los pasos van en los círculos. Construye una secuencia de preguntas Escribe junto a cada círculo la pregunta u observación de un paso. Empieza por detalles que el público pueda reconocer y úsalos para introducir las relaciones o interpretaciones que quieres explicar. Para una pintura, una posible secuencia es: ¿Qué vemos? ¿Qué detalles identifican el lugar? ¿Por qué se incluyeron? ¿Qué sugiere su distribución? Son preguntas para investigar, no afirmaciones que la imagen demuestre por sí sola. Anota junto a cada pregunta la fuente o el detalle en que se apoya la respuesta. Si no puedes mostrar esa evidencia, revisa la respuesta, busca otra fuente o señala qué sigue siendo incierto. Inicio Preguntas y fuentes Capas adicionales Cierre Cierra la historia retomando la pregunta inicial El triángulo que apunta hacia arriba representa el final de la historia. Vuelve a la pregunta inicial y explica qué aportan los detalles que el público examinó. No dejes para el final la fuente de la que depende toda la interpretación: preséntala durante el recorrido. Comprueba que alguien que lea solo el recorrido principal, sin abrir los paneles, entienda el cierre. La explicación principal debe entenderse por sí sola; los paneles sirven para ampliar el contexto o profundizar en un argumento. Lee la secuencia en voz alta Lee en orden solo las preguntas y las respuestas breves. Luego, pídele a otra persona que haga lo mismo mientras mira los encuadres propuestos. Elimina explicaciones repetidas. Si un paso reúne dos observaciones sin relación entre sí, divídelo en dos. Agrega una transición si un cambio de fuente, lugar o época resulta difícil de seguir. Lleva a un panel el contexto especializado que interrumpe el hilo principal. Resultado: un inicio, una secuencia numerada de preguntas con sus fuentes y un cierre provisional. Sigue con el encuadre de cada paso ." + }, + "/docs/your-data/google-sheets/": { + "ids": [ + "choose-this-sheet-as-the-source", + "column-reference-summary", + "configuring-_configyml", + "fetching-data-local-dev-only", + "google-sheets-integration", + "how-the-tabs-connect", + "keep-ids-consistent", + "quick-start", + "see-also", + "sheet-structure", + "start-with-the-template", + "troubleshooting", + "understand-the-spreadsheet", + "use-text-and-file-references" + ], + "selectors": { + "h1": [ + "Understand the spreadsheet" + ], + "h2": [ + "How the tabs connect", + "Start with the template", + "Keep IDs consistent", + "Use text and file references", + "Choose this sheet as the source" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "google_sheets: enabled: true published_url: \"YOUR-PUBLISHED-SPREADSHEET-URL\"" + ], + "table": [ + "Tab Purpose Connection project Lists stories and their display order story_id identifies a story tab objects Describes the shared source collection object_id is used in story rows A tab for each story Lists its steps, views, questions and panels object matches an object ID glossary Defines recurring terms term_id is used in text links" + ], + "blockquote": [], + "img": [] + }, + "text": "Understand the spreadsheet Your Google Sheet is the source for a generated edition of your exhibition. Editing a cell does not immediately change the public site: the next build fetches the published sheet and processes it. How the tabs connect Tab Purpose Connection project Lists stories and their display order story_id identifies a story tab objects Describes the shared source collection object_id is used in story rows A tab for each story Lists its steps, views, questions and panels object matches an object ID glossary Defines recurring terms term_id is used in text links The template includes guidance and bilingual headers. Keep the machine-readable column names. Rows or columns beginning with # are ignored. Start with the template Use the template linked in the guided setup . Make your own copy, then publish the spreadsheet through File → Share → Publish to web . The ordinary editing link is different from the published link. The configuration needs the published address: google_sheets: enabled: true published_url: \"YOUR-PUBLISHED-SPREADSHEET-URL\" Publish the tabs Telar must read. Do not put confidential notes in content you publish to the web. Keep IDs consistent Use short, stable IDs with lowercase letters and hyphens. A story ID must match its tab name. An object reference must match an ID in objects . A glossary link must match the term ID. Titles can change without changing these relationships. Renaming an ID requires updating the references that use it. Use text and file references A short panel can be written directly in a layer1_content or layer2_content cell. Use Markdown syntax for formatting. A path ending in .md can refer to a longer text in the repository's stories text folder. Answers are brief plain prose. Panels are the place for richer formatting and further context. See story columns for supported fields. Choose this sheet as the source If you move to the Compositor, review its import process and switch the content source deliberately. The Compositor does not write your visual edits back to the Google Sheet. Leaving Sheets enabled can cause later builds to replace those edits with the sheet's content. For local work, python3 scripts/build_local_site.py fetches Sheets when enabled. The CSV copies in telar-content/spreadsheets/ are fetched inputs; edit the sheet if it is your chosen source. Next, add an object and build a first story ." + }, + "/docs/your-data/csv-project/": { + "ids": [ + "byline", + "column-aliases", + "column-normalization", + "columns", + "dual-header-support", + "example", + "field-notes", + "order", + "overview", + "private", + "project-columns", + "project-csv-projectcsv--proyectocsv", + "see-also", + "show_sections", + "story_id", + "subtitle", + "title" + ], + "selectors": { + "h1": [ + "Project Columns" + ], + "h2": [ + "Overview", + "Project CSV (project.csv / proyecto.csv)", + "See Also" + ], + "h3": [ + "Column Normalization", + "Dual Header Support", + "Columns", + "Example", + "Field Notes", + "Column Aliases" + ], + "h4": [ + "order", + "story_id", + "title", + "subtitle", + "byline", + "private", + "show_sections" + ], + "h5": [], + "h6": [], + "pre": [ + "order,story_id,title,subtitle,byline orden,id_historia,titulo,subtitulo,firma 1,colonial-textiles,Colonial Textiles,Weaving traditions,by Dr. Smith 2,textiles-coloniales,Textiles Coloniales,Tradiciones textiles,por Dra. García", + "order,story_id,title,subtitle,byline,private,show_sections 1,colonial-textiles,Colonial Textiles,Weaving traditions of the Americas,by Dr. Jane Smith,,yes 2,trade-routes,Trade Routes,Following the threads of commerce,based on [original research](https://example.com),yes,", + "orden,id_historia,titulo,subtitulo,firma,privada,mostrar_secciones 1,textiles-coloniales,Textiles Coloniales,Tradiciones de tejido de las Américas,por Dra. María García,,si 2,rutas-comerciales,Rutas Comerciales,Siguiendo los hilos del comercio,basado en [investigación original](https://ejemplo.com),si," + ], + "table": [ + "English Spanish Required Description order orden Yes Display order on homepage (1, 2, 3...) story_id id_historia No Semantic identifier (e.g., colonial-textiles). If omitted, uses story-{order} title titulo Yes Story title shown on homepage and story page subtitle subtitulo No Brief description shown on story cards byline firma No Author attribution; supports markdown for links and formatting private privada No Set to yes to encrypt this story (requires story_key in config); protected/protegida also accepted show_sections mostrar_secciones No Set to yes to display a table of contents on the story's intro card. See Stories & Panels: Section table of contents. New in v1.2.0", + "Normalized Accepts order order, orden story_id story_id, id_historia title title, titulo subtitle subtitle, subtitulo byline byline, firma private private, privada, protected, protegida show_sections show_sections, mostrar_secciones" + ], + "blockquote": [], + "img": [] + }, + "text": "Project Columns Complete reference for project.csv columns with bilingual column name support. Overview Telar v0.6.0+ supports CSV columns in both English and Spanish. You can use either language consistently, mix them, or include dual headers for bilingual reference. Column Normalization All column names are normalized during processing: Case-insensitive ( Title = title = TITLE ) Whitespace-trimmed Spanish names mapped to English equivalents Accented characters supported Dual Header Support Include both English and Spanish headers for bilingual teams: order,story_id,title,subtitle,byline orden,id_historia,titulo,subtitulo,firma 1,colonial-textiles,Colonial Textiles,Weaving traditions,by Dr. Smith 2,textiles-coloniales,Textiles Coloniales,Tradiciones textiles,por Dra. García Telar automatically detects and skips the second header row. Project CSV (project.csv / proyecto.csv) Defines stories and their display order on the homepage. Location : telar-content/spreadsheets/project.csv or telar-content/spreadsheets/proyecto.csv Columns English Spanish Required Description order orden Yes Display order on homepage (1, 2, 3...) story_id id_historia No Semantic identifier (e.g., colonial-textiles ). If omitted, uses story-{order} title titulo Yes Story title shown on homepage and story page subtitle subtitulo No Brief description shown on story cards byline firma No Author attribution; supports markdown for links and formatting private privada No Set to yes to encrypt this story (requires story_key in config); protected / protegida also accepted show_sections mostrar_secciones No Set to yes to display a table of contents on the story's intro card. See Stories & Panels: Section table of contents . New in v1.2.0 Example English: order,story_id,title,subtitle,byline,private,show_sections 1,colonial-textiles,Colonial Textiles,Weaving traditions of the Americas,by Dr. Jane Smith,,yes 2,trade-routes,Trade Routes,Following the threads of commerce,based on [original research](https://example.com),yes, Spanish: orden,id_historia,titulo,subtitulo,firma,privada,mostrar_secciones 1,textiles-coloniales,Textiles Coloniales,Tradiciones de tejido de las Américas,por Dra. María García,,si 2,rutas-comerciales,Rutas Comerciales,Siguiendo los hilos del comercio,basado en [investigación original](https://ejemplo.com),si, Field Notes order Must be unique integers Determines card order on homepage Gaps allowed (1, 2, 5 works fine) Automatically renumbered if demo content is included story_id New in v0.6.0 Lowercase, hyphens, underscores only Used for: story CSV filename, story URL, internal references If omitted: defaults to story-1 , story-2 , etc. based on order Examples: colonial-textiles , paisajes_coloniales , story-one title Displayed on homepage cards and story page headers No markdown processing (plain text only) Recommended: 2-6 words subtitle Shown below title on homepage cards No markdown processing Recommended: 5-12 words Describes story content briefly byline Supports markdown (v0.6.0+) Homepage: renders as plain text Story page: renders markdown links as clickable Common patterns: by Dr. Jane Smith por María García y Juan López based on [original research](https://example.com) curated by *Digital Archive Project* private New in v0.8.0 Set to yes to encrypt the story after the build finishes (the story renders normally during the Jekyll build itself; encryption is a separate step that runs afterward) Requires story_key in _config.yml — the build fails rather than publish the story as plaintext if the key is missing Viewers access private stories via ?key=your-key URL parameter Leave empty or omit for public stories Local preview ( bundle exec jekyll serve ) does not encrypt anything — see Private Stories: Testing Locally See Private Stories for details show_sections New in v1.2.0 Set to yes to display a navigable table of contents on the intro card The TOC auto-generates links to every title card in the story Leave empty or omit to show the intro card without a TOC See Stories & Panels for details Column Aliases Normalized Accepts order order , orden story_id story_id , id_historia title title , titulo subtitle subtitle , subtitulo byline byline , firma private private , privada , protected , protegida show_sections show_sections , mostrar_secciones See Also Object Columns — Objects CSV column reference Story Columns — Story step CSV columns Glossary Columns — Glossary CSV columns Google Sheets — Managing data via Google Sheets" + }, + "/guia/desarrolladores/desarrollo-local/": { + "ids": [ + "comandos-para-construir-el-sitio", + "comandos-principales-manuales", + "configuración", + "configuración-del-proyecto", + "configuración-inicial", + "desarrollo-local", + "estructura-de-directorios", + "flujo-de-trabajo-de-desarrollo", + "flujo-de-trabajo-diario", + "guías-de-instalación", + "inicio-rápido-script-de-build-recomendado", + "lista-de-verificación-de-pruebas-locales", + "mejores-prácticas", + "obtener-ayuda", + "opcional-recomendado", + "opcional-solo-para-objetos-de-audio", + "opciones-de-comando", + "preparar-para-publicación", + "problemas-comunes", + "problemas-de-dependencias", + "problemas-de-inserción-embed", + "pruebas", + "pruebas-automatizadas", + "pruebas-de-navegador", + "próximos-pasos", + "publicación", + "requisitos-previos", + "software-requerido", + "solución-de-problemas", + "validación" + ], + "selectors": { + "h1": [ + "Desarrollo local" + ], + "h2": [ + "Requisitos previos", + "Configuración del proyecto", + "Comandos para construir el sitio", + "Flujo de trabajo de desarrollo", + "Estructura de directorios", + "Solución de problemas", + "Pruebas", + "Publicación", + "Mejores prácticas", + "Obtener ayuda", + "Próximos pasos" + ], + "h3": [ + "Software requerido", + "Guías de instalación", + "Opcional (recomendado)", + "Opcional (solo para objetos de audio)", + "Configuración inicial", + "Configuración", + "Inicio rápido: script de build (recomendado)", + "Comandos principales (manuales)", + "Opciones de comando", + "Flujo de trabajo diario", + "Problemas comunes", + "Problemas de dependencias", + "Problemas de inserción (embed)", + "Lista de verificación de pruebas locales", + "Pruebas de navegador", + "Validación", + "Pruebas automatizadas", + "Preparar para publicación" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "brew install ruby python node git gem install bundler", + "sudo apt-get install ruby-full python3 python3-pip nodejs npm git build-essential gem install bundler", + "brew install vips", + "sudo apt-get install libvips-dev", + "brew install audiowaveform", + "sudo apt install audiowaveform", + "# Clona el repositorio git clone https://github.com/usuario/tu-sitio-telar.git cd tu-sitio-telar # Instala dependencias de Ruby bundle install # Instala dependencias de Python pip install -r requirements.txt # Instala dependencias de Node.js npm install", + "baseurl: \"\" # Vacío para desarrollo local url: \"http://localhost:4001\"", + "# Construye y sirve en el puerto 4001 (predeterminado) python3 scripts/build_local_site.py # Solo construir, sin iniciar servidor python3 scripts/build_local_site.py --build-only # Usar un puerto diferente python3 scripts/build_local_site.py --port 4000 # Omitir generación de teselas IIIF (el sitio se vuelve a construir más rápido cuando las imágenes no han cambiado) python3 scripts/build_local_site.py --skip-iiif # Omitir la descarga desde Google Sheets (usa los CSV existentes) python3 scripts/build_local_site.py --skip-fetch # Omitir procesamiento de audio (el sitio se vuelve a construir más rápido cuando el audio no ha cambiado) python3 scripts/build_local_site.py --skip-audio", + "# 1. Trae datos desde Google Sheets (si está habilitado) python3 scripts/fetch_google_sheets.py # 2. Convierte CSVs a JSON python3 scripts/csv_to_json.py # 3. Genera archivos de colección de Jekyll python3 scripts/generate_collections.py # 4. Procesa archivos de audio (si los hay — requiere audiowaveform) # Nota: la detección básica de audio funciona sin este paso (csv_to_json.py # genera el manifiesto de audio automáticamente). Este script solo se # necesita para los datos de forma de onda y la extracción de clips. python3 scripts/process_audio.py # 5. Genera teselas (*tiles*) IIIF python3 scripts/generate_iiif.py --base-url http://localhost:4001 # 6. Construye el paquete de JavaScript npm run build:js # O: npx esbuild assets/js/telar-story/main.js --bundle --outfile=assets/js/telar-story.js --sourcemap --format=iife # 7. Sirve con recarga automática bundle exec jekyll serve --livereload --port 4001 # Solo construir (salida a _site/) bundle exec jekyll build # Borrar los archivos generados al construir el sitio bundle exec jekyll clean", + "# Sirve en puerto personalizado bundle exec jekyll serve --port 4001 # Sirve en red local bundle exec jekyll serve --host 0.0.0.0 # Construir solo lo que cambió (más rápido) bundle exec jekyll serve --incremental # Deshabilitar la recarga automática bundle exec jekyll serve", + "# Especifica directorio fuente diferente python3 scripts/generate_iiif.py --source-dir ruta/a/imagenes # Especifica URL base personalizada python3 scripts/generate_iiif.py --base-url https://misitio.org # Procesa solo imagen específica python3 scripts/generate_iiif.py --image textile-001.jpg", + "# 1. Inicia servidor Jekyll bundle exec jekyll serve --livereload # 2. Haz cambios al contenido # - Edita CSVs en telar-content/spreadsheets/ # - Edita markdown en telar-content/texts/ # - Agrega imágenes a telar-content/objects/ # 3. Reconstruye los datos (cuando cambian los CSV) python3 scripts/csv_to_json.py # 4. Regenera las teselas (*tiles*) (cuando cambian las imágenes) python3 scripts/generate_iiif.py # 5. Jekyll recarga automáticamente el navegador # El sitio se actualiza automáticamente", + "tu-sitio-telar/ ├── _config.yml # Configuración del sitio ├── _data/ # Datos JSON generados │ ├── objects.json │ ├── project.json │ └── stories/ ├── _jekyll-files/ # Colecciones autogeneradas │ ├── _stories/ │ ├── _objects/ │ └── _glossary/ ├── _layouts/ # Plantillas de página │ ├── default.html │ ├── story.html │ └── object.html ├── _includes/ # Componentes reutilizables │ ├── header.html │ └── footer.html ├── assets/ # Recursos estáticos │ ├── css/ │ ├── js/ │ └── images/ ├── telar-content/ # CONTENIDO FUENTE (¡editar aquí!) │ ├── structures/ # Archivos CSV │ ├── images/ # Imágenes fuente │ └── texts/ # Archivos Markdown ├── iiif/ # Teselas (*tiles*) IIIF generadas ├── scripts/ # Scripts para construir el sitio │ ├── build_local_site.py # Build local todo‑en‑uno │ ├── fetch_google_sheets.py │ ├── csv_to_json.py │ ├── generate_collections.py │ ├── process_audio.py # *Clips* de audio y datos de picos │ └── generate_iiif.py └── _site/ # Sitio construido (¡no editar!)", + "# Actualiza dependencias bundle update # Limpia y reintenta bundle exec jekyll clean bundle exec jekyll serve", + "# Reinicia Jekyll (Ctrl+C, luego reinicia) bundle exec jekyll serve --livereload # Recarga forzada del navegador (Cmd+Shift+R o Ctrl+Shift+R)", + "# Verifica dependencias de Python pip install -r requirements.txt # Verifica que existan archivos de imagen ls -la telar-content/objects/ # Verifica mensajes de error python3 scripts/generate_iiif.py", + "# Verifica sintaxis CSV cat telar-content/spreadsheets/story-1.csv # Verifica que existan archivos markdown ls -la telar-content/texts/stories/ # Ejecuta con salida detallada python3 scripts/csv_to_json.py --verbose", + "# Actualiza RubyGems gem update --system # Limpia caché de bundle bundle clean --force bundle install", + "# Actualiza pip pip install --upgrade pip # Usa virtualenv python3 -m venv venv source venv/bin/activate # En Windows: venv\\Scripts\\activate pip install -r requirements.txt", + "document.body.classList.contains('embed-mode')", + "# Prueba la URL del manifiesto IIIF curl https://tusitio.com/iiif/objects/object-1/info.json", + "console.log(window.telarLang.embedBanner)", + "document.querySelector('.embed-banner')", + "// En la consola del navegador typeof OpenSeadragon", + "// Debería estar establecido cuando la página carga console.log(window.location.href)", + "# Verifica validez de HTML bundle exec htmlproofer ./_site --disable-external # Revisa enlaces rotos bundle exec jekyll doctor", + "# Ejecuta todas las pruebas unitarias de Python python3 -m pytest tests/unit/ -v # Ejecuta con reporte de cobertura python3 -m pytest tests/unit/ --cov=scripts/telar", + "# Ejecuta las pruebas de JavaScript npm run test:js # Ejecuta en modo *watch* (re-ejecuta al cambiar archivos) npm run test:js:watch", + "# Instala navegadores de Playwright (configuración inicial, una sola vez) playwright install chromium # Inicia el servidor Jekyll en una terminal bundle exec jekyll serve --port 4001 # Ejecuta las pruebas E2E en otra terminal python3 -m pytest tests/e2e/ -v", + "# 1. Prueba localmente bundle exec jekyll serve # 2. Actualiza _config.yml para producción baseurl: \"/tu-nombre-repo\" url: \"https://usuario.github.io\" # 3. Confirma cambios git add . git commit -m \"Actualizar contenido\" # 4. Empuja a GitHub git push origin main # 5. GitHub Actions construye automáticamente" + ], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Desarrollo local Referencia completa para desarrollo local, comandos para construir el sitio y solución de problemas. Requisitos previos Software requerido Ruby 3.2+ : Runtime de Jekyll Bundler : Gestión de dependencias de Ruby Python 3.12 : Generación IIIF y procesamiento CSV Node.js 22 : Empaquetado de JavaScript (esbuild) Git : Control de versiones Telar necesita Ruby 3.2 o una versión más nueva, y la integración continua construye el sitio con la 3.2.11. La plantilla de Telar trae un archivo .ruby-version con esa versión, de modo que gestores de versiones como rbenv, chruby o asdf la reconocen por su cuenta. Con una versión anterior, bundle install se detiene e indica cuál esperaba, en vez de seguir con un conjunto distinto de gemas. Guías de instalación macOS (Homebrew): brew install ruby python node git gem install bundler Ubuntu/Debian: sudo apt-get install ruby-full python3 python3-pip nodejs npm git build-essential gem install bundler Windows: Instala RubyInstaller Instala Python Instala Node.js (se recomienda la versión LTS) Instala Git for Windows Opcional (recomendado) libvips : Procesamiento rápido de imágenes para la generación de teselas IIIF. Telar recurre a Python puro si no está instalado, pero libvips es aproximadamente 28 veces más rápido. macOS: brew install vips Ubuntu/Debian: sudo apt-get install libvips-dev Opcional (solo para objetos de audio) Si el sitio incluye audio, audiowaveform prepara los datos de la forma de onda. Los límites de los fragmentos se aplican en el navegador; el script no extrae archivos separados. Los sitios sin audio no necesitan esta herramienta. audiowaveform : Datos de picos para el reproductor WaveSurfer macOS: brew install audiowaveform Ubuntu/Debian: sudo apt install audiowaveform Configuración del proyecto Configuración inicial # Clona el repositorio git clone https://github.com/usuario/tu-sitio-telar.git cd tu-sitio-telar # Instala dependencias de Ruby bundle install # Instala dependencias de Python pip install -r requirements.txt # Instala dependencias de Node.js npm install Configuración Edita _config.yml para desarrollo local: baseurl: \"\" # Vacío para desarrollo local url: \"http://localhost:4001\" Comandos para construir el sitio Inicio rápido: script de build (recomendado) La forma más sencilla de construir y servir tu sitio Telar localmente es usando el script de build todo‑en‑uno: # Construye y sirve en el puerto 4001 (predeterminado) python3 scripts/build_local_site.py # Solo construir, sin iniciar servidor python3 scripts/build_local_site.py --build-only # Usar un puerto diferente python3 scripts/build_local_site.py --port 4000 # Omitir generación de teselas IIIF (el sitio se vuelve a construir más rápido cuando las imágenes no han cambiado) python3 scripts/build_local_site.py --skip-iiif # Omitir la descarga desde Google Sheets (usa los CSV existentes) python3 scripts/build_local_site.py --skip-fetch # Omitir procesamiento de audio (el sitio se vuelve a construir más rápido cuando el audio no ha cambiado) python3 scripts/build_local_site.py --skip-audio Este script ejecuta en secuencia todos los pasos necesarios del build , imitando lo que hace GitHub Actions al publicar el sitio. También detiene instancias de Jekyll que estén ejecutándose antes de iniciar una nueva. Comandos principales (manuales) Si prefieres ejecutar los pasos por separado: # 1. Trae datos desde Google Sheets (si está habilitado) python3 scripts/fetch_google_sheets.py # 2. Convierte CSVs a JSON python3 scripts/csv_to_json.py # 3. Genera archivos de colección de Jekyll python3 scripts/generate_collections.py # 4. Procesa archivos de audio (si los hay — requiere audiowaveform) # Nota: la detección básica de audio funciona sin este paso (csv_to_json.py # genera el manifiesto de audio automáticamente). Este script solo se # necesita para los datos de forma de onda y la extracción de clips. python3 scripts/process_audio.py # 5. Genera teselas (*tiles*) IIIF python3 scripts/generate_iiif.py --base-url http://localhost:4001 # 6. Construye el paquete de JavaScript npm run build:js # O: npx esbuild assets/js/telar-story/main.js --bundle --outfile=assets/js/telar-story.js --sourcemap --format=iife # 7. Sirve con recarga automática bundle exec jekyll serve --livereload --port 4001 # Solo construir (salida a _site/) bundle exec jekyll build # Borrar los archivos generados al construir el sitio bundle exec jekyll clean Opciones de comando Opciones de Jekyll serve: # Sirve en puerto personalizado bundle exec jekyll serve --port 4001 # Sirve en red local bundle exec jekyll serve --host 0.0.0.0 # Construir solo lo que cambió (más rápido) bundle exec jekyll serve --incremental # Deshabilitar la recarga automática bundle exec jekyll serve Opciones de generación IIIF: # Especifica directorio fuente diferente python3 scripts/generate_iiif.py --source-dir ruta/a/imagenes # Especifica URL base personalizada python3 scripts/generate_iiif.py --base-url https://misitio.org # Procesa solo imagen específica python3 scripts/generate_iiif.py --image textile-001.jpg Flujo de trabajo de desarrollo Flujo de trabajo diario # 1. Inicia servidor Jekyll bundle exec jekyll serve --livereload # 2. Haz cambios al contenido # - Edita CSVs en telar-content/spreadsheets/ # - Edita markdown en telar-content/texts/ # - Agrega imágenes a telar-content/objects/ # 3. Reconstruye los datos (cuando cambian los CSV) python3 scripts/csv_to_json.py # 4. Regenera las teselas (*tiles*) (cuando cambian las imágenes) python3 scripts/generate_iiif.py # 5. Jekyll recarga automáticamente el navegador # El sitio se actualiza automáticamente Estructura de directorios tu-sitio-telar/ ├── _config.yml # Configuración del sitio ├── _data/ # Datos JSON generados │ ├── objects.json │ ├── project.json │ └── stories/ ├── _jekyll-files/ # Colecciones autogeneradas │ ├── _stories/ │ ├── _objects/ │ └── _glossary/ ├── _layouts/ # Plantillas de página │ ├── default.html │ ├── story.html │ └── object.html ├── _includes/ # Componentes reutilizables │ ├── header.html │ └── footer.html ├── assets/ # Recursos estáticos │ ├── css/ │ ├── js/ │ └── images/ ├── telar-content/ # CONTENIDO FUENTE (¡editar aquí!) │ ├── structures/ # Archivos CSV │ ├── images/ # Imágenes fuente │ └── texts/ # Archivos Markdown ├── iiif/ # Teselas (*tiles*) IIIF generadas ├── scripts/ # Scripts para construir el sitio │ ├── build_local_site.py # Build local todo‑en‑uno │ ├── fetch_google_sheets.py │ ├── csv_to_json.py │ ├── generate_collections.py │ ├── process_audio.py # *Clips* de audio y datos de picos │ └── generate_iiif.py └── _site/ # Sitio construido (¡no editar!) Solución de problemas Problemas comunes Jekyll no inicia: # Actualiza dependencias bundle update # Limpia y reintenta bundle exec jekyll clean bundle exec jekyll serve Los cambios no aparecen: # Reinicia Jekyll (Ctrl+C, luego reinicia) bundle exec jekyll serve --livereload # Recarga forzada del navegador (Cmd+Shift+R o Ctrl+Shift+R) Las teselas ( tiles ) IIIF no se generan: # Verifica dependencias de Python pip install -r requirements.txt # Verifica que existan archivos de imagen ls -la telar-content/objects/ # Verifica mensajes de error python3 scripts/generate_iiif.py La conversión CSV a JSON falla: # Verifica sintaxis CSV cat telar-content/spreadsheets/story-1.csv # Verifica que existan archivos markdown ls -la telar-content/texts/stories/ # Ejecuta con salida detallada python3 scripts/csv_to_json.py --verbose Problemas de dependencias bundle install falla: # Actualiza RubyGems gem update --system # Limpia caché de bundle bundle clean --force bundle install pip install falla: # Actualiza pip pip install --upgrade pip # Usa virtualenv python3 -m venv venv source venv/bin/activate # En Windows: venv\\Scripts\\activate pip install -r requirements.txt Problemas de inserción ( embed ) Los botones de navegación no funcionan en el iframe: Verifica si el modo embed se detecta correctamente: Abre DevTools del navegador en el iframe (clic derecho en el contenido del iframe) Verifica errores de JavaScript en la consola Verifica el parámetro ?embed=true en la URL Confirma que la clase body.embed-mode está aplicada: document.body.classList.contains('embed-mode') Si el modo embed no se detecta, verifica que el parámetro de URL sea correcto. Las imágenes no cargan en la vista insertada: Las teselas IIIF no cargan en el iframe: Verifica errores de CORS en la consola del navegador Verifica que tu sitio esté desplegado y accesible públicamente: # Prueba la URL del manifiesto IIIF curl https://tusitio.com/iiif/objects/object-1/info.json Asegúrate de que el despliegue de GitHub Pages se completó exitosamente Para manifiestos IIIF externos, verifica que la institución fuente permita CORS El banner View full site no aparece: El banner de embed debería aparecer automáticamente: Verifica el parámetro ?embed=true en la URL Verifica errores de JavaScript en la consola en embed.js Confirma que window.telarLang.embedBanner está definido: console.log(window.telarLang.embedBanner) Verifica si el banner existe en el DOM pero está oculto por CSS: document.querySelector('.embed-banner') Si el banner falta, verifica que assets/js/embed.js se está cargando. Problemas de desplazamiento en LMS: Telar usa navegación por botones en modo embed , no desplazamiento: Verifica que los botones de navegación sean visibles Verifica que los botones sean clicables (no detrás de otros elementos) Prueba la navegación por teclado (teclas de flecha, Re Pág/Av Pág) Asegúrate de que la altura del iframe sea adecuada (mínimo 600px recomendado) Si los botones no son visibles, verifica que la clase body.embed-mode esté aplicada. El visor IIIF no se muestra: El visor de imágenes no carga en el iframe: Verifica si OpenSeadragon se cargó: // En la consola del navegador typeof OpenSeadragon Verifica que la URL del manifiesto IIIF sea accesible Verifica restricciones de Content Security Policy (CSP) en el sitio anfitrión Prueba la URL de la historia directamente (no en iframe) para aislar el problema El panel de compartir no se abre: El botón de compartir debería estar oculto en modo embed : Verifica que este es el comportamiento esperado (botón de compartir intencionalmente oculto) Si necesitas compartir en modo embed , las personas pueden descartar el banner de embed y hacer clic en View full site Para comportamiento personalizado, modifica el CSS de body.embed-mode .share-button El código de inserción no se genera: En el panel de compartir, el área de texto del código de inserción está vacía: En la página de inicio: Selecciona una historia del menú desplegable primero Verifica que el JSON de datos de historia esté presente en el código fuente de la página Verifica errores de JavaScript en la consola en share-panel.js En la página de historia: Actualiza la página para restablecer el panel de compartir Verifica errores en la consola Verifica que currentStoryUrl esté establecido: // Debería estar establecido cuando la página carga console.log(window.location.href) Las dimensiones no se actualizan: Al cambiar las entradas de ancho/alto: Haz clic en el campo de entrada y escribe el valor Presiona Enter o haz clic fuera del campo para activar la actualización Verifica si el menú desplegable de tamaños predefinidos está interfiriendo (selecciona el tamaño predefinido \"Custom\") Verifica que JavaScript se esté ejecutando sin errores Pruebas Lista de verificación de pruebas locales Antes de publicar: Todas las páginas cargan sin errores Las historias se desplazan con fluidez El visor IIIF amplía correctamente Las miniaturas de objetos se muestran La navegación funciona Los enlaces son correctos Adaptable a pantallas móviles Compatible con múltiples navegadores Pruebas de navegador Prueba en: Chrome/Edge (última versión) Firefox (última versión) Safari (última versión) Navegadores móviles (iOS Safari, Chrome Mobile) Validación # Verifica validez de HTML bundle exec htmlproofer ./_site --disable-external # Revisa enlaces rotos bundle exec jekyll doctor Pruebas automatizadas Telar incluye pruebas automatizadas para los scripts de Python y los módulos de JavaScript. Ejecutar las pruebas es opcional para narradores, pero se recomienda para personas que contribuyen al desarrollo del marco. Pruebas unitarias de Python: # Ejecuta todas las pruebas unitarias de Python python3 -m pytest tests/unit/ -v # Ejecuta con reporte de cobertura python3 -m pytest tests/unit/ --cov=scripts/telar Pruebas unitarias de JavaScript: # Ejecuta las pruebas de JavaScript npm run test:js # Ejecuta en modo *watch* (re-ejecuta al cambiar archivos) npm run test:js:watch Pruebas de extremo a extremo (Playwright): Las pruebas E2E requieren un servidor Jekyll ejecutándose y los navegadores de Playwright: # Instala navegadores de Playwright (configuración inicial, una sola vez) playwright install chromium # Inicia el servidor Jekyll en una terminal bundle exec jekyll serve --port 4001 # Ejecuta las pruebas E2E en otra terminal python3 -m pytest tests/e2e/ -v Las pruebas se ejecutan automáticamente en GitHub mediante el flujo de trabajo telar-tests.yml cada vez que haces push a main o abres un pull request. Publicación Preparar para publicación # 1. Prueba localmente bundle exec jekyll serve # 2. Actualiza _config.yml para producción baseurl: \"/tu-nombre-repo\" url: \"https://usuario.github.io\" # 3. Confirma cambios git add . git commit -m \"Actualizar contenido\" # 4. Empuja a GitHub git push origin main # 5. GitHub Actions construye automáticamente Mejores prácticas Confirma frecuentemente : Confirmaciones pequeñas y enfocadas Prueba localmente primero : Siempre previsualiza antes de empujar Usa ramas : Ramas de características para cambios importantes Documenta cambios : Mensajes de confirmación claros Respalda contenido : Mantén copias de archivos importantes Control de versiones : Rastrea todo el contenido en git Builds limpios: ejecuta jekyll clean periódicamente Obtener ayuda GitHub Issues Documentación Jekyll Documentación IIIF Próximos pasos Referencia de GitHub Actions Guía de Personalización Referencia de Configuración" + }, + "/docs/customization/home-page/": { + "ids": [ + "adding-custom-content", + "basic-structure", + "best-practices", + "collection-mode", + "customizing-the-home-page", + "demo-site-notice", + "example-alert-box", + "example-custom-welcome", + "examples", + "file-location", + "frontmatter-options", + "minimal-homepage", + "next-steps", + "objects_heading", + "objects_intro", + "stories_heading", + "stories_intro", + "technical-notes", + "to-customize", + "to-remove", + "with-introductory-text" + ], + "selectors": { + "h1": [ + "Customizing the Home Page" + ], + "h2": [ + "File Location", + "Basic Structure", + "Collection mode", + "Frontmatter Options", + "Adding Custom Content", + "Demo Site Notice", + "Examples", + "Best Practices", + "Technical Notes", + "Next Steps" + ], + "h3": [ + "stories_heading", + "stories_intro", + "objects_heading", + "objects_intro", + "Example: Custom Welcome", + "Example: Alert Box", + "To Customize", + "To Remove", + "Minimal Homepage", + "With Introductory Text" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "--- layout: index title: Home stories_heading: \"Explore the stories\" stories_intro: \"\" objects_heading: \"See the objects behind the stories\" objects_intro: \"Browse {count} objects featured in the stories.\" --- Your custom content goes here...", + "collection_mode: true", + "--- layout: index title: Home stories_heading: \"Explore the stories\" stories_intro: \"\" objects_heading: \"See the objects behind the stories\" objects_intro: \"Browse {count} objects featured in the stories.\" --- ## Welcome to the Colonial Textiles Project This digital exhibition explores the hidden stories woven into colonial-era textiles from the Andean region. Navigate through our curated stories to discover the techniques, patterns, and cultural significance of these remarkable artifacts.", + "--- layout: index title: Home stories_heading: \"Explore the stories\" stories_intro: \"\" objects_heading: \"See the objects behind the stories\" objects_intro: \"Browse {count} objects featured in the stories.\" --- {: .alert .alert-warning} > **🚧 Exhibition in Progress** > > This exhibition is being actively developed. New stories and objects > are added regularly. Check back soon for updates!", + "--- layout: index title: Home stories_heading: \"Explore the stories\" stories_intro: \"\" objects_heading: \"See the objects behind the stories\" objects_intro: \"Browse {count} objects featured in the stories.\" ---", + "--- layout: index title: Home stories_heading: \"Explore the stories\" stories_intro: \"Each story reveals a unique perspective on our shared cultural heritage.\" objects_heading: \"See the objects behind the stories\" objects_intro: \"Browse {count} objects featured in the stories.\" --- ## About This Exhibition {: .lead} The **Colonial Landscapes Project** uses digital storytelling to explore the complex histories embedded in material culture." + ], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Customizing the Home Page The homepage of your Telar site is controlled by a simple markdown file ( index.md ) in the root of your repository. This makes it easy to customize your welcome message, section headings, and introductory content. In the Compositor, use Home and Pages . The file format below describes the same published homepage. File Location index.md must be in the root directory of your repository (not in a subdirectory). Jekyll automatically serves this file as your homepage. Basic Structure Here's the default index.md structure: --- layout: index title: Home stories_heading: \"Explore the stories\" stories_intro: \"\" objects_heading: \"See the objects behind the stories\" objects_intro: \"Browse {count} objects featured in the stories.\" --- Your custom content goes here... Collection mode By default, the homepage shows stories first with a sample of objects below. Collection mode reverses this — objects appear first in a large grid, with stories in a smaller grid below. Enable it in _config.yml : collection_mode: true When collection mode is active: Objects grid : Up to 8 objects displayed in a 4-column grid (2 columns on tablet, 1 on mobile). Objects are drawn from those marked as featured in objects.csv . If no objects are marked as featured, the first 8 objects are used Video and audio objects show icon placeholders; image objects show IIIF thumbnails A View all objects button links to the full gallery Stories grid : All stories appear below in a smaller grid. The show_on_homepage setting in story_interface is ignored in collection mode — all stories are shown The section heading — \"Explore the collection\" — comes from your site's language files, not from index.md frontmatter Collection mode works well for sites with a large number of objects and fewer stories, or for collection-first exhibitions where browsing objects is the primary entry point. New in v1.1.0. See Configuration Reference for the setting details. Frontmatter Options stories_heading The heading displayed above the story grid. Default: \"Explore the stories\" stories_intro Optional introductory text displayed between the heading and story grid. Leave blank ( \"\" ) if you don't want intro text. objects_heading The heading displayed above the objects section teaser. Default: \"See the objects behind the stories\" objects_intro Introductory text for the objects section. Use {count} as a placeholder for the number of objects. Default: \"Browse {count} objects featured in the stories.\" The {count} placeholder will be automatically replaced with the actual number of objects. Adding Custom Content Any markdown content you add below the frontmatter will appear above the stories section. This is perfect for: Welcome messages Exhibition overviews Important notices Custom calls-to-action Example: Custom Welcome --- layout: index title: Home stories_heading: \"Explore the stories\" stories_intro: \"\" objects_heading: \"See the objects behind the stories\" objects_intro: \"Browse {count} objects featured in the stories.\" --- ## Welcome to the Colonial Textiles Project This digital exhibition explores the hidden stories woven into colonial-era textiles from the Andean region. Navigate through our curated stories to discover the techniques, patterns, and cultural significance of these remarkable artifacts. Example: Alert Box Use Bootstrap alert classes for styled messages: --- layout: index title: Home stories_heading: \"Explore the stories\" stories_intro: \"\" objects_heading: \"See the objects behind the stories\" objects_intro: \"Browse {count} objects featured in the stories.\" --- {: .alert .alert-warning} > **🚧 Exhibition in Progress** > > This exhibition is being actively developed. New stories and objects > are added regularly. Check back soon for updates! Demo Site Notice The template includes a demo site notice by default that links to the GitHub repository and documentation. To Customize Edit the markdown content to match your project. To Remove Simply delete the demo notice block from index.md . Examples Minimal Homepage --- layout: index title: Home stories_heading: \"Explore the stories\" stories_intro: \"\" objects_heading: \"See the objects behind the stories\" objects_intro: \"Browse {count} objects featured in the stories.\" --- No custom content — just displays stories and objects. Story cards show media-type-aware thumbnails: video and audio stories display an icon placeholder when no image object is available. With Introductory Text --- layout: index title: Home stories_heading: \"Explore the stories\" stories_intro: \"Each story reveals a unique perspective on our shared cultural heritage.\" objects_heading: \"See the objects behind the stories\" objects_intro: \"Browse {count} objects featured in the stories.\" --- ## About This Exhibition {: .lead} The **Colonial Landscapes Project** uses digital storytelling to explore the complex histories embedded in material culture. Best Practices Keep homepage content concise to get visitors into your stories quickly Use ## (second-level) or ### (third-level) headings for custom content Test your homepage on different screen sizes Update notices and introductory text as your exhibition evolves Technical Notes The layout: index setting is required and should not be changed The title setting controls the page tag All markdown features are supported (see Markdown Syntax Guide ) Next Steps Learn about themes to style your homepage Explore advanced styling for custom CSS See the markdown reference for formatting options" + }, + "/docs/your-data/csv-glossary/": { + "ids": [ + "column-aliases", + "columns", + "csv-vs-markdown-glossary", + "definition--definicion", + "example", + "field-notes", + "glossary-columns", + "glossary-csv-glossarycsv", + "inline-link-syntax", + "related_terms--terminos_relacionados", + "see-also", + "term_id--id_termino", + "title--titulo", + "validation" + ], + "selectors": { + "h1": [ + "Glossary Columns" + ], + "h2": [ + "Glossary CSV (glossary.csv)", + "Validation", + "See Also" + ], + "h3": [ + "Columns", + "Example", + "Field Notes", + "Inline Link Syntax", + "Column Aliases", + "CSV vs. Markdown Glossary" + ], + "h4": [ + "term_id / id_termino", + "title / titulo", + "definition / definicion", + "related_terms / terminos_relacionados" + ], + "h5": [], + "h6": [], + "pre": [ + "term_id,title,definition,related_terms loom,Loom,A device used to weave cloth and tapestry.,warp warp,Warp,\"The set of lengthwise yarns on a loom, through which the weft is woven.\",loom encomienda,Encomienda,\"A system of labor in colonial Spanish America, granting colonists authority over indigenous workers.\",", + "id_termino,titulo,definicion,terminos_relacionados telar,Telar,Un dispositivo utilizado para tejer tela y tapices.,urdimbre urdimbre,Urdimbre,\"El conjunto de hilos longitudinales en un telar, a través de los cuales se teje la trama.\",telar encomienda,Encomienda,\"Un sistema de trabajo en la América colonial española, que otorgaba a los colonos autoridad sobre los trabajadores indígenas.\",", + "The [[loom]] was central to textile production.", + "The [[loom|weaving device]] was central to textile production." + ], + "table": [ + "English Spanish Required Description term_id id_termino Yes Unique identifier for the term (used in link syntax) title titulo Yes Display title of the term definition definicion No The term definition text related_terms terminos_relacionados No Related term IDs, separated by a vertical bar", + "Normalized Accepts term_id term_id, id_termino, id_término title title, titulo, título definition definition, definicion, definición related_terms related_terms, terminos_relacionados, términos_relacionados", + "Aspect CSV (preferred) Markdown (legacy) Location telar-content/spreadsheets/glossary.csv telar-content/texts/glossary/*.md Format Rows with columns Individual files with YAML frontmatter Bilingual headers Yes (via column aliases) No Google Sheets Yes (fetched like other CSVs) No" + ], + "blockquote": [], + "img": [] + }, + "text": "Glossary Columns Complete reference for glossary.csv columns with bilingual column name support. For column normalization and dual header support, see Project Columns . Glossary CSV (glossary.csv) Defines glossary terms that can be linked from story panels using [[term_id]] syntax. Location : telar-content/spreadsheets/glossary.csv New in v0.8.0. The CSV format is the preferred method for glossary terms. Legacy markdown files in telar-content/texts/glossary/ are still supported but CSV takes precedence if both exist. Columns English Spanish Required Description term_id id_termino Yes Unique identifier for the term (used in link syntax) title titulo Yes Display title of the term definition definicion No The term definition text related_terms terminos_relacionados No Related term IDs, separated by a vertical bar Example English: term_id,title,definition,related_terms loom,Loom,A device used to weave cloth and tapestry.,warp warp,Warp,\"The set of lengthwise yarns on a loom, through which the weft is woven.\",loom encomienda,Encomienda,\"A system of labor in colonial Spanish America, granting colonists authority over indigenous workers.\", Spanish: id_termino,titulo,definicion,terminos_relacionados telar,Telar,Un dispositivo utilizado para tejer tela y tapices.,urdimbre urdimbre,Urdimbre,\"El conjunto de hilos longitudinales en un telar, a través de los cuales se teje la trama.\",telar encomienda,Encomienda,\"Un sistema de trabajo en la América colonial española, que otorgaba a los colonos autoridad sobre los trabajadores indígenas.\", Field Notes term_id / id_termino Unique across all glossary terms Used in inline link syntax: [[term_id]] or [[term_id|display text]] Format: lowercase, hyphens recommended Terms prefixed with demo- are tagged as demo content title / titulo The display name shown in the glossary panel and as link text When using [[term_id]] shorthand, the title is used as the link text automatically definition / definicion The definition text shown in the glossary entry Supports basic markdown formatting related_terms / terminos_relacionados Other term_id values, separated by | (for example, warp|loom ) Used for cross-referencing between glossary entries Inline Link Syntax Link to glossary terms from story panels using double-bracket syntax: Shorthand — uses the term's title as link text: The [[loom]] was central to textile production. With custom display text — use a pipe separator: The [[loom|weaving device]] was central to textile production. If the term_id is not found in the glossary, a warning icon and error message appear in the build output and in the story panel. Column Aliases Normalized Accepts term_id term_id , id_termino , id_término title title , titulo , título definition definition , definicion , definición related_terms related_terms , terminos_relacionados , términos_relacionados CSV vs. Markdown Glossary Aspect CSV (preferred) Markdown (legacy) Location telar-content/spreadsheets/glossary.csv telar-content/texts/glossary/*.md Format Rows with columns Individual files with YAML frontmatter Bilingual headers Yes (via column aliases) No Google Sheets Yes (fetched like other CSVs) No If both a CSV and markdown glossary exist, the CSV is used and the markdown files are ignored (with a build warning). Validation Glossary warnings : Missing term_id or title (row skipped) Glossary link [[term_id]] references nonexistent term See Also Project Columns — Project CSV column reference Object Columns — Objects CSV column reference Story Columns — Story step CSV columns Glossary — Glossary setup and auto-linking" + }, + "/docs/your-content/self-hosted-images/": { + "ids": [ + "adding-images", + "coordinate-system", + "finding-coordinates", + "how-it-works", + "image-not-loading", + "low-quality-display", + "see-also", + "self-hosted-images", + "slow-loading", + "supported-file-formats", + "troubleshooting" + ], + "selectors": { + "h1": [ + "Self-Hosted Images" + ], + "h2": [ + "Adding images", + "Supported file formats", + "How it works", + "Coordinate system", + "Troubleshooting", + "See also" + ], + "h3": [ + "Finding coordinates", + "Image not loading", + "Low quality display", + "Slow loading" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "python3 scripts/generate_iiif.py --base-url http://localhost:4001" + ], + "table": [], + "blockquote": [ + "Telar only generates tiles for objects listed in your spreadsheet that don't already have an external IIIF source. This is automatic — just add your images and they'll be processed during the next build.", + "iPhone photos work directly. HEIC photos from iPhones are supported natively — no need to convert them first. Telar converts them to JPEG automatically during tile generation while keeping your originals.", + "SVG drawings become images. When Telar builds the site it renders each SVG to an image 4000 pixels on its longest side and generates the tiles from that. Your original file is kept, but zoom stops at that resolution, so a drawing with very fine detail may look soft at full zoom. If you need more detail, export the drawing to PNG or TIFF at a larger size and upload that instead.", + "Naming tip. Use simple, descriptive IDs without spaces or special characters: textile-001.jpg, ceramic-bowl-blue.jpg", + "Fast tile generation with libvips. Telar uses libvips for IIIF tile generation when available, which is roughly 28x faster than the pure-Python fallback. If libvips is not installed, Telar falls back to the Python iiif library automatically. See Local Development for installation instructions.", + "The coordinate tool has a Copy entire row button that copies a complete row template with the coordinates already filled in — ready to paste into your spreadsheet." + ], + "img": [] + }, + "text": "Self-Hosted Images If you have your own images — photographs, scans of documents, maps — you can upload them directly to your Telar site. Telar automatically converts them into zoomable, high-resolution tiles so viewers can explore every detail. You can also host audio files (MP3, OGG, M4A) in the same directory. Telar auto-detects the file type and displays the appropriate player. This process uses a technology called IIIF (International Image Interoperability Framework) behind the scenes for images, but you don't need to understand IIIF to use self-hosted files. Just upload your files and Telar handles the rest. Adding images Each image needs to match an object defined in your spreadsheet. The filename (without its extension) must match the object's object_id . For example, if your spreadsheet has an object with object_id = textile-001 , name your image file textile-001.jpg . From the GitHub web interface: Navigate to telar-content/objects/ in your repository Click Add file > Upload files Drag your images into the upload area Make sure filenames match your object IDs Commit changes For local development: Place your images in telar-content/objects/ Generate the IIIF tiles: python3 scripts/generate_iiif.py --base-url http://localhost:4001 Telar only generates tiles for objects listed in your spreadsheet that don't already have an external IIIF source. This is automatic — just add your images and they'll be processed during the next build. Supported file formats JPG, PNG, HEIC, WebP, TIFF, GIF, BMP — all common image formats work SVG — vector drawings, maps and diagrams. Telar renders these to images when it builds your site (see below) PDF — each page of a document becomes its own zoomable image. See PDF Documents MP3, OGG, M4A — audio files are also placed in telar-content/objects/ Case doesn't matter: .JPG , .png , .Tiff are all fine Resolution : Higher is better — at least 2000px on the longest side is recommended for good zoom quality Size limits : Individual images up to 100 MB; keep the total repository under 1 GB for GitHub iPhone photos work directly. HEIC photos from iPhones are supported natively — no need to convert them first. Telar converts them to JPEG automatically during tile generation while keeping your originals. SVG drawings become images. When Telar builds the site it renders each SVG to an image 4000 pixels on its longest side and generates the tiles from that. Your original file is kept, but zoom stops at that resolution, so a drawing with very fine detail may look soft at full zoom. If you need more detail, export the drawing to PNG or TIFF at a larger size and upload that instead. Naming tip. Use simple, descriptive IDs without spaces or special characters: textile-001.jpg , ceramic-bowl-blue.jpg How it works When you add an image and build your site: Telar creates tiled versions at multiple zoom levels Tiles are saved to iiif/objects/{object-id}/ A manifest file describes the image structure The viewer loads tiles progressively — only the visible area at the current zoom level, not the entire image This allows smooth zooming even on very large images. Fast tile generation with libvips. Telar uses libvips for IIIF tile generation when available, which is roughly 28x faster than the pure-Python fallback. If libvips is not installed, Telar falls back to the Python iiif library automatically. See Local Development for installation instructions. Coordinate system Telar uses normalized coordinates (values from 0 to 1) to describe positions within an image: x : Horizontal position (0 = left edge, 1 = right edge) y : Vertical position (0 = top edge, 1 = bottom edge) zoom : Zoom level (1.0 = full image, 2.0 = 2x zoom, etc.) You use these coordinates in your story steps to tell Telar where to zoom in on each image. Finding coordinates Each object page includes a built-in coordinate picker: Navigate to any object page on your site Click the Identify coordinates button Pan and zoom to the view you want Copy the X, Y, and Zoom values Paste them into your story spreadsheet or CSV The coordinate tool has a Copy entire row button that copies a complete row template with the coordinates already filled in — ready to paste into your spreadsheet. Troubleshooting Image not loading Check that the file exists in telar-content/objects/ Make sure the filename (without extension) matches the object_id in your spreadsheet Verify the object has a blank source_url column (otherwise Telar expects an external image) Make sure IIIF tiles have been generated (check that iiif/objects/{object-id}/ exists) Low quality display Use higher resolution source images (at least 2000px on the longest side) Very small images won't look good when zoomed in Slow loading Optimize file sizes before uploading (large TIFFs can be converted to high-quality JPEGs) GitHub Pages has bandwidth limits — for high-traffic sites, consider alternative hosting See also External IIIF Images — Use images from museums and libraries instead of uploading your own Objects — How to define objects in your spreadsheet Object Columns — Complete column reference for the objects spreadsheet" + }, + "/docs/the-compositor/sync-updates/": { + "ids": [ + "media-upgrade-docs-the-compositor-sync-updates", + "on-return-detection", + "one-click-upgrade", + "re-sync", + "see-also", + "sync-and-updates", + "upgrade-page", + "version-detection" + ], + "selectors": { + "h1": [ + "Sync and Updates" + ], + "h2": [ + "On return detection", + "Re-sync", + "Version detection", + "Upgrade page", + "One-click upgrade", + "See also" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [ + "Sync review and publishing are separate actions. Review the consequences shown for each item; do not use re-importing as a routine way to undo a small editing mistake." + ], + "img": [ + [ + "/assets/manual/tutorials/en-upgrade.jpg", + "An example upgrade notice comparing Telar 1.8.2 with 1.8.3." + ] + ] + }, + "text": "Sync and Updates The Compositor checks for changes made on GitHub as well as available Telar updates. A change made outside the editor needs review before it is applied to your draft. On return detection When you open a connected project, the Compositor checks its repository. If GitHub has changed, follow the review prompt. The review covers the affected objects, stories, settings, glossary terms and pages. Re-sync The Changes on GitHub review shows what differs and asks which version to keep where a choice is needed. Read each change and its consequence. Choose GitHub's version or the Compositor's version, as appropriate. Resolve the choices the review requires. Choose Apply these choices when the result is the one you intend. Keeping the Compositor's version means the next publish sends that version to GitHub. Taking GitHub's version applies the corresponding content to the Compositor. Unpublished changes made only in the Compositor are kept. Sync review and publishing are separate actions. Review the consequences shown for each item; do not use re-importing as a routine way to undo a small editing mistake. If files cannot be read or the repository changes while you are reviewing, follow the message and refresh the comparison before applying it. Version detection The Compositor checks the version of Telar used by your site and may ask you to upgrade before continuing. Upgrade page Review the current and target versions, release notes and grouped file changes. An upgrade can update framework files and migrate settings needed by the new version. Read the proposed changes before accepting them. An example version notice before publication. Compare the versions and review the proposed file changes; the versions shown will vary. Open full-size screenshot ↗ One-click upgrade Follow the upgrade controls, wait for the operation and site build to complete, then follow the return link. Check the site before continuing with the work that prompted the upgrade. Your repository's history records the changes made by the upgrade. If something does not look right, use the build information and the proposed file list to understand what changed. See also Publishing Start and navigation Connect an existing site Upgrading Telar — Framework upgrade reference" + }, + "/docs/customization/demo-content/": { + "ids": [ + "colonial-landscapes", + "demo-content", + "demo-content-and-your-own-content", + "demo-content-is-in-the-wrong-language", + "demo-stories-do-not-appear", + "language", + "the-allegorical-woman", + "the-demo-content-could-not-be-downloaded", + "the-demo-stories", + "troubleshooting", + "turning-demo-content-on-or-off", + "using-the-demos-as-models", + "what-is-demo-content", + "where-demo-content-appears" + ], + "selectors": { + "h1": [ + "Demo Content" + ], + "h2": [ + "What is Demo Content?", + "The Demo Stories", + "Turning Demo Content On or Off", + "Where Demo Content Appears", + "Language", + "Demo Content and Your Own Content", + "Using the Demos as Models", + "Troubleshooting" + ], + "h3": [ + "The Allegorical Woman", + "Colonial Landscapes", + "Demo Stories Do Not Appear", + "The Demo Content Could Not Be Downloaded", + "Demo Content Is in the Wrong Language" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "story_interface: include_demo_content: true" + ], + "table": [ + "English title Spanish title Steps What it shows The Allegorical Woman La mujer alegórica 10 A simple story built around one image Colonial Landscapes Paisajes coloniales 22 A longer story with chapters, panels and primary sources", + "Where What you see Home page The demo stories, listed before your own stories, with a DEMO badge Story intro card A Demo content label above the story title Layer panels A Demo content badge next to the panel title Objects page The demo objects, listed after your own objects, with a DEMO badge Object page A Demo content label above the object title Glossary page A DEMO badge next to each demo entry Glossary entry page A Demo content badge next to the entry title", + "Your setting Demo content you get telar_language: \"en\" English stories, objects and glossary telar_language: \"es\" Spanish stories, objects and glossary", + "Your content Demo content Where it lives Your repository Downloaded during each build; not saved in your repository Editable Yes No Label None DEMO badge or Demo content label Same object ID as one of yours — Your object is kept and the demo object is left out Same glossary entry ID as one of yours — Your entry is kept and the demo entry is left out" + ], + "blockquote": [ + "Keep the demos while you learn The demo stories are useful to keep open next to your own while you write your first story. Turn them off before you share your site." + ], + "img": [] + }, + "text": "Demo Content Demo content adds two finished example stories to your site, so you can see how a Telar story is built and how it behaves before you write your own. What is Demo Content? Demo content is a set of example stories, together with the objects and glossary entries they use. Telar downloads it from content.telar.org each time your site builds and adds it to your own content. It is never saved in your repository, so when you turn it off, the next build leaves it out. Demo content is marked wherever it appears, so you can always tell it apart from your own work. The Demo Stories Your site gets two stories, in your site's language: English title Spanish title Steps What it shows The Allegorical Woman La mujer alegórica 10 A simple story built around one image Colonial Landscapes Paisajes coloniales 22 A longer story with chapters, panels and primary sources The Allegorical Woman This story, by Natalie Cobo, follows the details of Aspecto Symbólico del Mundo Hispánico , a 1761 engraving by Laureano Atlas held by Princeton University Library. It shows: Steps that move around a single image, zooming in on one detail at a time A IIIF (pronounced \"triple-eye-eff\") image served by the institution that holds it, Princeton University Library, rather than by content.telar.org A step that switches to a second image, the frontispiece of Hobbes's Leviathan Layer panels, including one step with a second layer Links to glossary entries from the story's text The first step links to the story's spreadsheet in Google Sheets, so you can compare each row with the step it produces. Colonial Landscapes This story is a selection from Colonial Landscapes , a project by Santiago Muñoz, Adelaida Ávila, and María Alejandra Orduz Avella. It is built around a 1614 painting of the Bogotá savanna, made for a lawsuit and held by the Archivo General de Indias in Seville. The story is organized as follows: The first step introduces the original project and links to it, and the last step repeats that link Four chapters, each opened by a title card: \"A Painting of the Savanna\", \"Villages for the \"indios\"\", \"From Terraces to Grasslands\", and \"A Divided Landscape\" Most of the other steps have a layer panel, which holds the longer text, image carousels, and callouts to primary sources Each primary source is a glossary entry, which opens from its callout in a panel. Many of the entries end with a See full document link to the document's own object page; two panels link to documents in the same way. The painting and the nine documents are served from content.telar.org as IIIF images. Five of the documents have more than one page, and their object pages let you move from page to page. The glossary also includes several key terms and one person, so the glossary page groups its entries under Key terms , Primary sources , and People and entities . Turning Demo Content On or Off Demo content is controlled by one setting in _config.yml . A new Telar site has it turned on. To change it: Open _config.yml Find the story_interface section Set include_demo_content to true to show the demo stories, or false to hide them: story_interface: include_demo_content: true Commit the change GitHub Actions rebuilds your site, and the change appears when the build finishes. If you build your site on your own computer, run python3 scripts/csv_to_json.py and python3 scripts/generate_collections.py (or python3 scripts/build_local_site.py , which runs both) before Jekyll. See Local Development . Keep the demos while you learn The demo stories are useful to keep open next to your own while you write your first story. Turn them off before you share your site. Where Demo Content Appears Demo content appears in the same places as your own content, with a label: Where What you see Home page The demo stories, listed before your own stories, with a DEMO badge Story intro card A Demo content label above the story title Layer panels A Demo content badge next to the panel title Objects page The demo objects, listed after your own objects, with a DEMO badge Object page A Demo content label above the object title Glossary page A DEMO badge next to each demo entry Glossary entry page A Demo content badge next to the entry title On a Spanish site the labels read DEMO and Contenido de demostración . Language Demo content follows your site's language, set by telar_language in _config.yml : Your setting Demo content you get telar_language: \"en\" English stories, objects and glossary telar_language: \"es\" Spanish stories, objects and glossary Any other value gets the English demo content. If you change your site's language, the next build fetches the demo content in the new language. Demo Content and Your Own Content Demo content is added to your content during the build, and it never replaces anything of yours: Your content Demo content Where it lives Your repository Downloaded during each build; not saved in your repository Editable Yes No Label None DEMO badge or Demo content label Same object ID as one of yours — Your object is kept and the demo object is left out Same glossary entry ID as one of yours — Your entry is kept and the demo entry is left out The demo object and glossary IDs all begin with demo- , so they do not normally match yours. Using the Demos as Models The demo stories are written in the same spreadsheet format as your own stories. Their sources are published in the demo content repository on GitHub, under demos/v1.8.0/en/ and demos/v1.8.0/es/ : demo-project.csv : the two stories' rows in the project sheet demo-objects.csv : the objects allegorical-woman.csv and colonial-landscapes.csv ( mujer-alegorica.csv and paisajes.csv in Spanish): the stories' steps glossary.csv ( glosario.csv in Spanish): the glossary entries, with the kind column that marks sources and people texts/stories/ : the markdown files for the Colonial Landscapes panels To see how a story's structure shows up on the page, compare the rows of colonial-landscapes.csv with the story on your site: the rows with an empty object column are the chapter title cards. Troubleshooting Demo Stories Do Not Appear If you turned demo content on and the stories are missing: Check that include_demo_content: true is inside the story_interface section of _config.yml Check that the build finished in your repository's Actions tab Open the build log, expand the Convert CSV to JSON step, and look for the lines that begin with Telar Demo Content Fetcher Reload the page without the cache (Ctrl+Shift+R on Windows/Linux, Cmd+Shift+R on Mac) The Demo Content Could Not Be Downloaded If content.telar.org cannot be reached, or the download fails, the build log says that your site will build without demos, and the build continues. Your own content is published as usual, without the demo stories. The next build tries again. Demo Content Is in the Wrong Language Check telar_language in _config.yml . It must be \"en\" or \"es\" ; any other value gets the English demo content." + }, + "/guia/el-compositor/editor-historias/": { + "ids": [ + "atajos-de-teclado", + "barra-de-formato", + "conservación-de-inserciones", + "edición-de-capas", + "editor-de-historias", + "gestión-de-pasos", + "inserción-de-imágenes", + "media-editor-overview-guia-el-compositor-editor-historias", + "media-framing-guia-el-compositor-editor-historias", + "media-panel-editor-guia-el-compositor-editor-historias", + "media-panels-guia-el-compositor-editor-historias", + "pegado-con-formato", + "pegado-enriquecido", + "portada", + "preservación-de-inserciones", + "selector-de-objetos", + "tarjeta-de-título", + "visor-iiif", + "véase-también" + ], + "selectors": { + "h1": [ + "Editor de historias" + ], + "h2": [ + "Portada", + "Visor IIIF", + "Gestión de pasos", + "Edición de capas", + "Véase también" + ], + "h3": [ + "Barra de formato", + "Atajos de teclado", + "Inserción de imágenes", + "Pegado con formato", + "Conservación de inserciones" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [ + "Mover la imagen y ajustar el zoom te permite explorar el objeto. Capturar posición guarda el encuadre del paso seleccionado. Vuelve a capturarlo si cambias la vista que quieres conservar." + ], + "img": [ + [ + "/assets/manual/tutorials/es-editor-overview.jpg", + "El esquema de la historia, la tarjeta del paso y el visor del khipu en el Compositor." + ], + [ + "/assets/manual/tutorials/es-framing-poster.jpg", + "Cambia el encuadre del khipu y Capturar posición confirma que quedó guardado." + ], + [ + "/assets/manual/tutorials/es-panels-poster.jpg", + "Un paso abre su panel contextual junto a la tarjeta principal." + ], + [ + "/assets/manual/tutorials/es-panel-editor.jpg", + "Un panel contextual con el editor de texto y su barra de formato abiertos." + ] + ] + }, + "text": "Editor de historias Abre una historia desde Historias para escribir sus preguntas, respuestas breves y paneles opcionales. El editor reúne el esquema narrativo, los textos editables y la vista que tendrán tus visitantes. La barra lateral usa un cuadrado para la portada, círculos para los pasos y un triángulo hacia arriba para el último paso. El primer panel se desprende de su paso; el segundo se desprende del primero. A la izquierda está el esquema; en el centro, el texto del paso; a la derecha, el objeto. Capturar posición guarda la vista del paso seleccionado. Ampliar captura ↗ Portada Selecciona la portada en la parte superior del esquema. Haz clic en el título, el subtítulo o la firma, o en el icono de edición correspondiente, para cambiar el campo. Tus cambios se guardan mientras trabajas. Visor IIIF Selecciona un paso con imagen y usa Cambiar objeto para elegir su fuente. Desplaza la imagen y ajusta el zoom hasta el detalle que quieras mostrar. Para guardar la vista: Selecciona el paso. Desplaza la imagen y ajusta el zoom al encuadre deseado. Pulsa Capturar posición . Comprueba la confirmación Capturada . Pasa a la portada o a otro paso; después, regresa y revisa el encuadre guardado. Mover la imagen y ajustar el zoom te permite explorar el objeto. Capturar posición guarda el encuadre del paso seleccionado. Vuelve a capturarlo si cambias la vista que quieres conservar. Ajusta la vista, pulsa Capturar posición y comprueba Capturada. Todo el recorrido muestra el mismo khipu. Ver los pasos Ampliar captura ↗ Descargar GIF Las guías indican el marco y el centro de la vista. El límite del texto ayuda a ver cuánto de la respuesta breve cabe en la tarjeta pública. Gestión de pasos + Agregar paso crea un paso. Si el diálogo ofrece el objeto anterior, puedes conservarlo o elegir otro. Cambiar objeto selecciona otra fuente para el paso actual. Arrastra un paso desde su control de orden para cambiar su posición. Usa el control de eliminación y lee la confirmación antes de quitar un paso. Agregar título de sección inserta un encabezado para agrupar partes de la historia. Escribe una pregunta y una respuesta breve en cada tarjeta. Haz clic en el texto o en su icono de edición. El campo de respuesta acepta Markdown; haz clic fuera para revisar el texto con formato. Los pasos de video y audio tienen controles de medios en lugar del visor de imágenes. Consulta Video y audio . Edición de capas Pulsa + Agregar panel en la tarjeta de un paso o abre un panel existente con su botón. Edita el título y el contenido directamente desde el texto o los iconos de edición. El primer panel puede ofrecer un botón para abrir un segundo panel. Mantén breve la respuesta principal. Usa los paneles para el contexto, la evidencia y los matices que una persona pueda elegir explorar. Abre el panel del paso para desarrollar el contexto. Este ejemplo usa la historia existente sobre el mapa y la pintura. Ver los pasos Ampliar captura ↗ Descargar GIF Barra de formato Al editar el contenido de un panel, usa los controles de formato o escribe Markdown directamente. Revisa el panel con formato al terminar. Consulta Sintaxis de Markdown y Contenido enriquecido . Haz clic en el texto del panel para editarlo. La barra ofrece formato, enlaces, imágenes y otros controles de contenido. Ampliar captura ↗ Atajos de teclado Los atajos dependen del campo que tenga el foco. Mantén el foco en el editor de texto al aplicar un comando de formato. Usa la barra de herramientas si no sabes qué comando está disponible. Inserción de imágenes Usa los controles de imágenes del editor de paneles y completa los datos que solicite el diálogo. Una imagen dentro del panel hace parte de la explicación; la fuente principal del paso se elige por separado con Cambiar objeto . Pegado con formato Al traer texto de otra aplicación, revisa el formato, los enlaces y el espaciado del panel antes de publicar. Conservación de inserciones Para agregar medios y contenido interactivo dentro de los paneles, sigue Contenido enriquecido y Widgets . Revisa el resultado publicado además de la vista del editor. Véase también Usar un objeto IIIF en una historia Inicio y navegación Video y audio Publicación" + }, + "/docs/site-features/": { + "ids": [ + "site-features" + ], + "selectors": { + "h1": [ + "Site Features" + ], + "h2": [], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Site Features Telar includes several built-in features that enhance your exhibition beyond the core story experience. Objects Gallery — A browsable, searchable gallery page for your entire collection, with filtering by type, creator, period, and subjects Glossary — Define terms that viewers can look up from within stories without leaving the narrative Private Stories — Encrypt stories so only viewers with the correct key can access them Custom Pages — Create standalone pages for content outside the story structure — about, credits, methodology Embedding in Canvas — Embed your Telar site or individual stories in learning management systems" + }, + "/docs/setup/": { + "ids": [ + "maintenance", + "manual-setup", + "set-up-your-site" + ], + "selectors": { + "h1": [ + "Set Up Your Site" + ], + "h2": [ + "Maintenance" + ], + "h3": [ + "Manual Setup" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Set Up Your Site Looking for setup instructions? Head to Getting Started to choose between the Compositor, Google Sheets, or local development. This section covers manual configuration and maintenance for existing sites. Manual Setup The step-by-step manual approach for users already comfortable with GitHub and YAML. Build a complete exhibition in your browser with no software to install. Manual Setup Maintenance Upgrading Telar — Keep your site up to date with the latest features" + }, + "/docs/the-compositor/": { + "ids": [ + "before-you-begin", + "compositor-manual", + "how-it-works", + "in-this-section", + "requirements", + "the-compositor", + "the-parts-of-an-exhibition", + "what-is-the-compositor" + ], + "selectors": { + "h1": [ + "Compositor manual" + ], + "h2": [ + "The parts of an exhibition", + "How it works", + "Before you begin", + "Get started", + "Sources and stories", + "The exhibition", + "Team and courses", + "Publish and maintain" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Compositor manual The Telar Compositor is a visual authoring tool for creating and managing Telar exhibitions. It runs in your browser at compositor.telar.org , where you can bring images, video, audio and text together into layered visual narratives without writing code. You can use it for digital scholarship, public exhibitions, community storytelling and classroom projects, working on your own or with collaborators. The interface is available in English and Spanish. Telar provides the framework for the exhibition your visitors explore. The Compositor gives you a workspace to assemble its content, preview your stories and publish the site. Your published site's content and configuration are kept as files in a GitHub repository. The parts of an exhibition Objects are your source materials: images, video or audio, with their descriptions, sources and credits. Stories guide visitors through those materials in a sequence of steps . Each step combines narrative text with a view of an object or a media clip. Panels and glossary entries offer further context that visitors can open as they explore. The homepage and supporting pages introduce the exhibition and help visitors find their way around it. You can manage all of these in the Compositor, along with the site's appearance and navigation. How it works Start a site. Create a new Telar site or connect one you already have. Compose your exhibition. Add your sources, write stories, choose the details each step will show and develop the surrounding context. Review and publish. Check your work and publish the changes to GitHub. Telar then builds the public website. Your work is saved as you edit. Publishing is a separate action, so you can develop a draft before updating the public site. After publishing, check the website once its build has finished. Before you begin You need a GitHub account. The first-site guide takes you through signing in, granting the Telar GitHub App access and creating a site. If you already have a Telar repository, follow Connect an existing site . If you are still developing your idea, start with Plan an exhibition . For a practical first exercise, the illustrated khipu walkthrough takes one image from an IIIF collection into a story step and shows how to save its framing. Get started Use the Compositor Connect an existing site Start and navigation Sources and stories Objects Use an IIIF object in a story Story Editor Video and Audio The exhibition Create and link glossary entries Arrange the homepage and pages Adjust appearance and site settings Team and courses Work with a team Run a course with student sites Publish and maintain Publishing Sync and Updates Resolve problems and recover stories" + }, + "/guia/el-compositor/sincronizacion-y-actualizaciones/": { + "ids": [ + "actualización-con-un-clic", + "detección-al-regresar", + "detección-de-versión", + "media-upgrade-guia-el-compositor-sincronizacion-y-actualizaciones", + "página-de-actualización", + "resincronización", + "resincronizar", + "sincronización-y-actualizaciones", + "véase-también" + ], + "selectors": { + "h1": [ + "Sincronización y actualizaciones" + ], + "h2": [ + "Detección al regresar", + "Resincronizar", + "Detección de versión", + "Página de actualización", + "Actualización con un clic", + "Véase también" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [ + "Revisar la sincronización y publicar son acciones distintas. Lee las consecuencias de cada elemento; no uses una nueva importación como forma habitual de deshacer un pequeño error de edición." + ], + "img": [ + [ + "/assets/manual/tutorials/es-upgrade.jpg", + "Un aviso de actualización que compara, como ejemplo, Telar 1.8.2 y 1.8.3." + ] + ] + }, + "text": "Sincronización y actualizaciones El Compositor comprueba los cambios hechos en GitHub y las actualizaciones disponibles de Telar. Los cambios hechos fuera del editor se revisan antes de aplicarlos al borrador. Detección al regresar Al abrir un proyecto conectado, el Compositor revisa su repositorio. Si GitHub cambió, sigue el aviso para revisar las diferencias. La revisión abarca los objetos, historias, ajustes, términos del glosario y páginas afectados. Resincronizar La revisión de Cambios en GitHub muestra las diferencias y pide elegir qué versión conservar cuando es necesario. Lee cada cambio y sus consecuencias. Elige la versión de GitHub o la del Compositor, según corresponda. Resuelve las decisiones que solicite la revisión. Pulsa Aplicar estas elecciones cuando el resultado sea el que buscas. Conservar la versión del Compositor significa que la próxima publicación enviará esa versión a GitHub. Tomar la versión de GitHub aplica el contenido correspondiente al Compositor. Los cambios sin publicar que solo existen en el Compositor se conservan. Revisar la sincronización y publicar son acciones distintas. Lee las consecuencias de cada elemento; no uses una nueva importación como forma habitual de deshacer un pequeño error de edición. Si no se puede leer un archivo o el repositorio cambia durante la revisión, sigue el mensaje y actualiza la comparación antes de aplicarla. Detección de versión El Compositor comprueba la versión de Telar que usa tu sitio y puede pedir una actualización antes de continuar. Página de actualización Revisa las versiones actual y de destino, las notas de la versión y los cambios agrupados por archivo. Una actualización puede cambiar archivos del framework y migrar los ajustes que necesite la nueva versión. Lee la propuesta antes de aceptarla. Un ejemplo del aviso previo a publicar. Compara las versiones y revisa los archivos propuestos; los números cambian según tu sitio. Ampliar captura ↗ Actualización con un clic Sigue los controles de actualización y espera a que terminen la operación y la generación del sitio. Después, sigue el enlace de regreso. Revisa el sitio antes de continuar con el trabajo que motivó la actualización. El historial del repositorio registra los cambios de la actualización. Si algo no se ve bien, usa la información de la generación y la lista de archivos propuesta para entender qué cambió. Véase también Publicación Inicio y navegación Conectar un sitio existente Actualizar Telar — Referencia de actualización del framework" + }, + "/docs/site-features/objects-gallery/": { + "ids": [ + "browse-and-search-mode", + "configuration", + "featured-objects-on-the-homepage", + "gallery-page", + "homepage-objects-link", + "objects-gallery", + "populating-gallery-metadata", + "see-also", + "simple-grid-mode" + ], + "selectors": { + "h1": [ + "Objects Gallery" + ], + "h2": [ + "Gallery Page", + "Featured Objects on the Homepage", + "Configuration", + "See Also" + ], + "h3": [ + "Browse and Search Mode", + "Simple Grid Mode", + "Populating Gallery Metadata", + "Homepage Objects Link" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "collection_interface: show_sample_on_homepage: true featured_count: 4", + "collection_interface: show_link_on_homepage: true # Show or hide the link to /objects/", + "collection_interface: browse_and_search: true # Filter sidebar and search bar show_link_on_homepage: true # \"View the objects\" link on homepage show_sample_on_homepage: true # Featured objects grid on homepage featured_count: 4 # Number of homepage objects" + ], + "table": [ + "Value Description Image Self-hosted or IIIF images Video YouTube, Vimeo, or Google Drive videos Audio Self-hosted audio files (MP3, OGG, M4A)", + "Facet CSV column Example values Creator creator Unknown, Juan de Cuellar Period period Colonial, 18th century Subjects subjects weaving, cartography, Lima" + ], + "blockquote": [ + "Objects added or uploaded via the Compositor appear in the gallery after publishing." + ], + "img": [ + [ + "/images/gallery-browse.png", + "Objects gallery with search bar, sort options, and filter sidebar" + ] + ] + }, + "text": "Objects Gallery The objects gallery provides a browsable, searchable interface for your collection at /objects/ . Gallery Page There are two modes, controlled by the browse_and_search setting in your _config.yml : Browse and Search Mode When browse_and_search is true (the default), the gallery includes a filter sidebar and a search bar for exploring your collection. Search uses full-text indexing powered by Lunr.js. It searches across title, creator, description, period, subjects, and medium — with title matches weighted most heavily. Type a few characters and results update instantly. Filters let you narrow the gallery by five facets across two sections: Type filters by the auto-detected media type of each object: Value Description Image Self-hosted or IIIF images Video YouTube, Vimeo, or Google Drive videos Audio Self-hosted audio files (MP3, OGG, M4A) Medium/Genre filters by the medium column in your objects.csv (previously called object_type ). Values are user-defined — for example, map, textile, photograph, or painting. The remaining facets work as before: Facet CSV column Example values Creator creator Unknown, Juan de Cuellar Period period Colonial, 18th century Subjects subjects weaving, cartography, Lima Each facet shows the number of matching objects in parentheses. Select multiple values within a facet to broaden results (OR logic), or combine facets to narrow them (AND logic). Video and audio objects display icon placeholder thumbnails in the gallery grid instead of blank spaces. Each gallery item also carries data-media-type and data-medium attributes for styling or scripting purposes. Sorting offers two options: Title — Alphabetical (A–Z or Z–A) Year — Chronological, using the year column from your CSV Active filters and search terms appear as removable chips above the grid. Click Clear all to reset. Simple Grid Mode When browse_and_search is false , the gallery shows a plain grid of object cards without filtering or search. Populating Gallery Metadata For the best gallery experience, fill in these columns in your objects.csv : medium for every object — powers the Medium/Genre filter (the column was previously called object_type ; both names are accepted) subjects with 2–4 comma-separated terms — powers the Subjects filter year — enables chronological sorting description — indexed for full-text search creator and period — power their respective filters Without these columns, the gallery still works but filtering and sorting options are limited. Objects added or uploaded via the Compositor appear in the gallery after publishing. Featured Objects on the Homepage You can showcase a selection of objects on your homepage by marking them as featured: In objects.csv , set featured to yes for the objects you want to highlight In _config.yml , set show_sample_on_homepage: true under collection_interface collection_interface: show_sample_on_homepage: true featured_count: 4 The homepage displays up to featured_count objects (default: 4). If you mark fewer objects as featured than the count allows, the remaining slots are filled randomly from your collection. Homepage Objects Link The \"View the objects\" link on the homepage is controlled separately: collection_interface: show_link_on_homepage: true # Show or hide the link to /objects/ Even when the link is hidden, the gallery page remains accessible through the navigation menu. Configuration All gallery settings live under collection_interface in _config.yml : collection_interface: browse_and_search: true # Filter sidebar and search bar show_link_on_homepage: true # \"View the objects\" link on homepage show_sample_on_homepage: true # Featured objects grid on homepage featured_count: 4 # Number of homepage objects See Configuration Reference for full details on each setting. See Also Objects — Defining objects and object pages Object Columns — Complete column reference for objects.csv Configuration Reference — Collection interface settings" + }, + "/guia/tus-datos/csv-historias/": { + "ids": [ + "alias-del-csv-de-historia", + "alt_text--texto_alt", + "answer--respuesta", + "botones-de-las-capas", + "clip_start-clip_end--inicio_clip-fin_clip", + "columnas", + "columnas-de-historias", + "consejos-para-la-entrada-de-datos", + "contenido-de-las-capas", + "csv-de-historia-story-idcsv", + "ejemplo", + "el-límite-de-las-respuestas", + "elegir-el-método-correcto", + "las-respuestas-son-texto-corrido", + "loop--bucle", + "notas-de-los-campos", + "object--objeto", + "page--pagina", + "question--pregunta", + "step--paso", + "validación", + "véase-también", + "x-y-zoom" + ], + "selectors": { + "h1": [ + "Columnas de historias" + ], + "h2": [ + "CSV de historia (story-{id}.csv)", + "Las respuestas son texto corrido", + "Consejos para la entrada de datos", + "Validación", + "Véase también" + ], + "h3": [ + "Columnas", + "Ejemplo", + "Notas de los campos", + "Elegir el método correcto", + "Alias del CSV de historia", + "El límite de las respuestas" + ], + "h4": [ + "step / paso", + "object / objeto", + "x, y, zoom", + "page / pagina", + "question / pregunta", + "answer / respuesta", + "Botones de las capas", + "Contenido de las capas", + "clip_start, clip_end / inicio_clip, fin_clip", + "loop / bucle", + "alt_text / texto_alt" + ], + "h5": [], + "h6": [], + "pre": [ + "step,object,x,y,zoom,question,answer,layer1_button,layer1_content,layer2_button,layer2_content 1,textile-001,0.5,0.5,1.0,What is this?,A colonial textile fragment,\"\",This fragment shows **advanced weaving techniques** from the colonial period.,\"Learn More\",colonial-textiles/step1-layer2.md 2,textile-001,0.3,0.7,0.5,What is this pattern?,An interlocking warp design,\"\",colonial-textiles/step2-layer1.md,\"\",colonial-textiles/step2-layer2.md", + "paso,objeto,x,y,zoom,pregunta,respuesta,boton_capa1,contenido_capa1,boton_capa2,contenido_capa2 1,textil-001,0.5,0.5,1.0,¿Qué es esto?,Un fragmento de textil colonial,\"\",Este fragmento muestra **técnicas avanzadas de tejido** del período colonial.,\"Saber más\",textiles-coloniales/paso1-capa2.md 2,textil-001,0.3,0.7,0.5,¿Qué es este patrón?,Un diseño de urdimbre entrelazada,\"\",textiles-coloniales/paso2-capa1.md,\"\",textiles-coloniales/paso2-capa2.md" + ], + "table": [ + "Inglés Español Requerido Descripción step paso Sí Número de paso (1, 2, 3...) object objeto Sí ID de objeto del objects.csv x x Sí Coordenada horizontal (0-1 normalizada) y y Sí Coordenada vertical (0-1 normalizada) zoom zoom Sí Nivel de zoom: con 1 se ve el objeto completo; con valores mayores, la vista se acerca page pagina No Página que se muestra en este paso, en objetos de múltiples páginas (la primera es 1) question pregunta Sí Encabezado mostrado en el panel de la historia answer respuesta Sí Texto de respuesta breve layer1_button boton_capa1 No Texto personalizado del botón (vacío = \"Saber más\") layer1_content contenido_capa1 No Contenido del panel: texto en línea o ruta a archivo .md layer2_button boton_capa2 No Texto personalizado del botón (vacío = \"Profundizar más\") layer2_content contenido_capa2 No Contenido del panel: texto en línea o ruta a archivo .md layer3_button boton_capa3 No Texto personalizado del botón (vacío = predeterminado) layer3_content contenido_capa3 No Contenido del panel: texto en línea o ruta a archivo .md clip_start inicio_clip No Inicio del clip en segundos (ej., 12.5) clip_end fin_clip No Fin del clip en segundos loop bucle No Reproducción en bucle (true, false, yes, no, sí). Predeterminado: false alt_text texto_alt No Texto alternativo por paso para accesibilidad", + "contenido_capa1 Este textil muestra técnicas avanzadas de tejido del periodo colonial.", + "Entorno Cómo crear saltos de línea Google Sheets Presiona Ctrl+Enter (Windows/Linux) u Option+Enter (macOS) Archivos CSV Usa saltos de línea reales dentro de texto entre comillas Alternativa Usa HTML: <br> para saltos de línea, <p>...</p> para párrafos", + "contenido_capa1 textiles-coloniales/step1-layer1.md", + "Escenario Método recomendado Explicación corta (1-2 párrafos) Método 1: Introducir directamente Panel con título personalizado o widgets Método 2: Pegar, o Método 3: Archivo Contenido con widgets (acordeón, pestañas, carrusel) Método 3: Archivo Mismo contenido usado en varios lugares Método 3: Archivo Ediciones rápidas sin salir de la hoja de cálculo Método 1 o 2", + "Normalizado Acepta step step, paso object object, objeto, object_id x x y y zoom zoom page page, pagina, página question question, pregunta answer answer, respuesta layer1_button layer1_button, boton_capa1 layer1_content layer1_content, contenido_capa1, layer1_file, archivo_capa1 layer2_button layer2_button, boton_capa2 layer2_content layer2_content, contenido_capa2, layer2_file, archivo_capa2 layer3_button layer3_button, boton_capa3 layer3_content layer3_content, contenido_capa3, layer3_file, archivo_capa3 clip_start clip_start, inicio_clip clip_end clip_end, fin_clip loop loop, bucle alt_text alt_text, texto_alt" + ], + "blockquote": [ + "Si copias y pegas desde Microsoft Word, Google Docs o aplicaciones similares, el formato no se preservará. Escribe con sintaxis Markdown en su lugar — consulta la Guía de Sintaxis Markdown.", + "Los nombres de columna layer_file / archivo_capa son alias heredados de antes de v0.6.3. Los nombres preferidos son layer_content / contenido_capa." + ], + "img": [] + }, + "text": "Columnas de historias Referencia completa de las columnas del CSV de historia con soporte bilingüe de nombres de columnas. Para la normalización de columnas y soporte de encabezados dobles, consulta Columnas del proyecto . CSV de historia (story-{id}.csv) Define la navegación paso a paso y el contenido de paneles para cada historia. Ubicación : telar-content/spreadsheets/{story_id}.csv Nomenclatura : Si story_id está especificado en project.csv: usa ese nombre (ej., textiles-coloniales.csv ) Si story_id se omite: usa story-{order}.csv (ej., story-1.csv , story-2.csv ) Columnas Inglés Español Requerido Descripción step paso Sí Número de paso (1, 2, 3...) object objeto Sí ID de objeto del objects.csv x x Sí Coordenada horizontal (0-1 normalizada) y y Sí Coordenada vertical (0-1 normalizada) zoom zoom Sí Nivel de zoom: con 1 se ve el objeto completo; con valores mayores, la vista se acerca page pagina No Página que se muestra en este paso, en objetos de múltiples páginas (la primera es 1) question pregunta Sí Encabezado mostrado en el panel de la historia answer respuesta Sí Texto de respuesta breve layer1_button boton_capa1 No Texto personalizado del botón (vacío = \"Saber más\") layer1_content contenido_capa1 No Contenido del panel: texto en línea o ruta a archivo .md layer2_button boton_capa2 No Texto personalizado del botón (vacío = \"Profundizar más\") layer2_content contenido_capa2 No Contenido del panel: texto en línea o ruta a archivo .md layer3_button boton_capa3 No Texto personalizado del botón (vacío = predeterminado) layer3_content contenido_capa3 No Contenido del panel: texto en línea o ruta a archivo .md clip_start inicio_clip No Inicio del clip en segundos (ej., 12.5 ) clip_end fin_clip No Fin del clip en segundos loop bucle No Reproducción en bucle ( true , false , yes , no , sí ). Predeterminado: false alt_text texto_alt No Texto alternativo por paso para accesibilidad Ejemplo Inglés (con contenido en línea): step,object,x,y,zoom,question,answer,layer1_button,layer1_content,layer2_button,layer2_content 1,textile-001,0.5,0.5,1.0,What is this?,A colonial textile fragment,\"\",This fragment shows **advanced weaving techniques** from the colonial period.,\"Learn More\",colonial-textiles/step1-layer2.md 2,textile-001,0.3,0.7,0.5,What is this pattern?,An interlocking warp design,\"\",colonial-textiles/step2-layer1.md,\"\",colonial-textiles/step2-layer2.md Español (con contenido en línea): paso,objeto,x,y,zoom,pregunta,respuesta,boton_capa1,contenido_capa1,boton_capa2,contenido_capa2 1,textil-001,0.5,0.5,1.0,¿Qué es esto?,Un fragmento de textil colonial,\"\",Este fragmento muestra **técnicas avanzadas de tejido** del período colonial.,\"Saber más\",textiles-coloniales/paso1-capa2.md 2,textil-001,0.3,0.7,0.5,¿Qué es este patrón?,Un diseño de urdimbre entrelazada,\"\",textiles-coloniales/paso2-capa1.md,\"\",textiles-coloniales/paso2-capa2.md El paso 1 usa contenido en línea para la capa 1, mientras que el paso 2 usa una referencia a archivo. Ambos enfoques funcionan y se pueden mezclar libremente. Notas de los campos step / paso Deben ser enteros secuenciales comenzando en 1 No se permiten saltos (1, 2, 3... no 1, 3, 5) Determina el orden de navegación object / objeto Debe coincidir con un object_id del objects.csv Dejar vacío para crear una tarjeta de título — un paso de solo texto sin objeto asociado. Consulta Historias y paneles . Actualizado en v1.1.0 Varios pasos pueden hacer referencia al mismo objeto x, y, zoom x y y van de 0 a 1 x : 0 = borde izquierdo, 1 = borde derecho, 0.5 = centro y : 0 = borde superior, 1 = borde inferior, 0.5 = centro zoom : con 1 se ve el objeto completo junto a la tarjeta de texto. Con valores mayores, la vista se acerca y el punto que indican x y y queda en el centro: con 2 se ve más o menos la mitad del objeto y con 4, una cuarta parte. Con valores menores que 1, hasta 0.1, el objeto completo se ve más pequeño y con espacio alrededor. Con 1 o menos, el objeto queda centrado y x y y no lo mueven. Si el punto está cerca de un borde del objeto, la vista no pasa de ese borde, así que el punto puede no quedar en el centro. Usa el selector de coordenadas en las páginas de objetos para encontrar los valores page / pagina Solo para objetos de múltiples páginas: un PDF alojado en tu sitio o un manifiesto IIIF externo con varias imágenes Los números de página comienzan en 1 x , y y zoom encuadran la página que indiques en esta columna, no el documento completo Deja la columna vacía para objetos de una sola imagen Si el valor no es un número entero positivo, se ignora y aparece una advertencia que nombra el paso Consulta Documentos PDF e Imágenes IIIF externas question / pregunta Se muestra como encabezado de la tarjeta de texto Solo texto plano, sin procesamiento Markdown Pregunta o afirmación breve Recomendado: 3-8 palabras answer / respuesta Respuesta breve que se muestra en la tarjeta de texto, debajo de la pregunta Solo texto corrido. Consulta Las respuestas son texto corrido Se recorta si pasa de 18 líneas. Consulta El límite de las respuestas Recomendado: 1-2 oraciones Botones de las capas Cadena vacía = texto predeterminado del botón Texto personalizado: cualquier cadena (ej., \"Ver detalles\", \"See details\") Si hay contenido pero el botón está vacío: muestra el texto predeterminado Si no hay contenido: el botón se oculta Contenido de las capas El contenido del panel se puede proporcionar de tres maneras: Método 1: Introducir texto directamente Escribe el texto del panel directamente en la celda de la hoja de cálculo. Es el enfoque más sencillo para paneles cortos. contenido_capa1 Este textil muestra técnicas avanzadas de tejido del periodo colonial. Para crear saltos de párrafo dentro de una celda: Entorno Cómo crear saltos de línea Google Sheets Presiona Ctrl+Enter (Windows/Linux) u Option+Enter (macOS) Archivos CSV Usa saltos de línea reales dentro de texto entre comillas Alternativa Usa HTML: <br> para saltos de línea, <p>...</p> para párrafos Puedes usar formato básico: **negrita** , *cursiva* , [texto del enlace](url) , y enlaces de glosario ( [[term-id]] ). Método 2: Pegar texto Markdown Pega texto escrito en un editor de texto plano. Esto admite la gama completa de características de formato, incluyendo encabezados, widgets (acordeón, carrusel, pestañas), controles de tamaño de imagen y un título de panel personalizado usando frontmatter YAML. Si copias y pegas desde Microsoft Word, Google Docs o aplicaciones similares, el formato no se preservará. Escribe con sintaxis Markdown en su lugar — consulta la Guía de Sintaxis Markdown . Método 3: Indicar un archivo Markdown Indica la ruta a un archivo Markdown en tu repositorio. Esto se recomienda para paneles complejos, especialmente aquellos con widgets o contenido que quieras reutilizar. contenido_capa1 textiles-coloniales/step1-layer1.md Guarda los archivos Markdown en telar-content/texts/stories/ . En tu hoja de cálculo, ingresa solo el nombre del archivo — o si organizaste los archivos en subcarpetas, incluye el nombre de la subcarpeta. Cómo decide Telar : Si lo que ingresas termina en .md y el archivo existe, lo carga. De lo contrario, trata el valor como contenido. clip_start, clip_end / inicio_clip, fin_clip Nuevo en v1.0.0 Tiempos de inicio y fin en segundos para objetos de video y audio (ej., 12.5 , 65 ) Se ignoran para objetos de imagen Deja ambos vacíos para reproducir el archivo completo Puedes fijar los valores del clip de forma visual en el Compositor loop / bucle Nuevo en v1.0.0 Controla si la reproducción de video o audio se repite en bucle Acepta true , false , yes , no , sí Predeterminado: false si se deja vacío Se ignora para objetos de imagen alt_text / texto_alt Nuevo en v1.0.0 Texto alternativo por paso para accesibilidad Si se deja vacío, usa el texto alternativo del objeto (de objects.csv ) y luego el title del objeto Úsalo para proporcionar contexto específico de lo que muestra el paso — ej., un detalle ampliado que difiere de la descripción general del objeto Elegir el método correcto Escenario Método recomendado Explicación corta (1-2 párrafos) Método 1: Introducir directamente Panel con título personalizado o widgets Método 2: Pegar, o Método 3: Archivo Contenido con widgets (acordeón, pestañas, carrusel) Método 3: Archivo Mismo contenido usado en varios lugares Método 3: Archivo Ediciones rápidas sin salir de la hoja de cálculo Método 1 o 2 Alias del CSV de historia Normalizado Acepta step step , paso object object , objeto , object_id x x y y zoom zoom page page , pagina , página question question , pregunta answer answer , respuesta layer1_button layer1_button , boton_capa1 layer1_content layer1_content , contenido_capa1 , layer1_file , archivo_capa1 layer2_button layer2_button , boton_capa2 layer2_content layer2_content , contenido_capa2 , layer2_file , archivo_capa2 layer3_button layer3_button , boton_capa3 layer3_content layer3_content , contenido_capa3 , layer3_file , archivo_capa3 clip_start clip_start , inicio_clip clip_end clip_end , fin_clip loop loop , bucle alt_text alt_text , texto_alt Los nombres de columna layer_file / archivo_capa son alias heredados de antes de v0.6.3. Los nombres preferidos son layer_content / contenido_capa . Las respuestas son texto corrido El campo answer aparece en la tarjeta de texto, debajo de la pregunta. En pantallas de escritorio esa tarjeta tiene un tamaño fijo y no se desplaza, así que lo que se salga del borde no le llega a quien lee. Por eso Telar deja las respuestas en texto corrido al construir el sitio, y anota cada cambio en la salida del build . Lo que se conserva tal como lo escribiste: Saltos de párrafo Negrita y cursiva Enlaces en línea Enlaces de glosario , con la sintaxis [[term-id]] Fórmulas LaTeX en línea Código en línea Lo que conserva las palabras y pierde el formato: Listas , con viñetas o numeradas Títulos (los encabezados de Markdown) Citas en bloque Lo que desaparece por completo, junto con el texto que lleve adentro: Imágenes y elementos incrustados , tanto la sintaxis de imagen de Markdown como las etiquetas <img> , <iframe> , <video> , <audio> , <embed> y <object> Notas al pie , tanto el número como el texto de la nota Tablas Bloques de código Líneas divisorias El límite de las respuestas La respuesta tiene que caber entera en la tarjeta, sin que quien lee tenga que desplazarse. Por eso Telar no la mide en palabras sino en líneas: cuenta 53 caracteres por línea y dos líneas más por cada párrafo después del primero. Una respuesta puede tener hasta 18 líneas y cinco párrafos. En un solo párrafo, eso da para unas 150 palabras; si la divides en párrafos, para menos. Si pasa de 15 líneas, se muestra con letra un poco más pequeña. Telar recorta toda respuesta que pase del límite y lo anota en la salida del build . El corte cae entre palabras y nunca parte un enlace, un término del glosario, un fragmento de código ni una fórmula LaTeX. El texto que sobra no aparece en la historia. Escribe una o dos oraciones. Cuando necesites más espacio, pasa el detalle a un panel: los paneles admiten todo lo que describe la Referencia de sintaxis de Markdown , incluidas las notas al pie, las tablas, las imágenes y los widgets. Consejos para la entrada de datos Coordenadas : Usa el selector de coordenadas en las páginas de objetos para encontrar los valores x, y y zoom, y cópialos directamente a tu CSV. Markdown en los campos : layer_content , definition : Admiten Markdown completo question : Solo texto plano, sin procesamiento Markdown answer : Solo texto corrido y formato en línea; se recorta si pasa de 18 líneas Contenido de paneles : Usa referencias a archivos (Método 3) para contenido complejo con widgets. Usa texto en línea (Método 1) para paneles cortos. Validación Telar valida los datos CSV de historias durante el build : Errores de historias (el build falla) : Faltan columnas requeridas Secuencia de step inválida (saltos, duplicados) Archivos Markdown de capas faltantes Valores de coordenadas inválidos (fuera del rango 0-1) Advertencias de historias (el build continúa) : Nombres de columnas no reconocidos (se ignoran) ID de objeto no encontrado en objects.csv Formato quitado de la respuesta de un paso, o respuesta recortada a 18 líneas Véase también Columnas del proyecto — Columnas de project.csv Columnas de objetos — Columnas de objects.csv Columnas del glosario — Columnas de glossary.csv Historias y paneles — Cómo estructurar historias Sintaxis Markdown — Formato para contenido de paneles" + }, + "/docs/your-content/markdown-syntax/": { + "ids": [ + "add-a-citation-with-footnote", + "add-a-youtube-video", + "add-an-image-with-caption", + "add-inline-and-display-math", + "alt-text-for-accessibility", + "basic-formatting", + "basic-syntax", + "best-practices", + "blockquotes", + "chemical-formulas", + "code", + "code-blocks", + "content-length", + "create-a-blockquote", + "display-math", + "examples", + "file-naming", + "footnotes", + "full-syntax-reference", + "headings", + "how-it-works", + "image-captions", + "image-organization", + "image-paths", + "images", + "inline-code", + "inline-math", + "learning-resources", + "limitations", + "link-to-a-glossary-term", + "link-to-another-object", + "links", + "lists", + "markdown-syntax-reference", + "math-and-science-notation-latex", + "method-1-entering-text-directly", + "method-2-pasting-markdown-text", + "method-3-referencing-a-markdown-file", + "multi-line-equations", + "next-steps", + "other-iframes", + "panel-content-methods", + "quick-reference", + "rich-media", + "size-options", + "supported-environments", + "text-styling", + "what-is-markdown", + "where-latex-works", + "youtube-videos" + ], + "selectors": { + "h1": [ + "Markdown Syntax Reference" + ], + "h2": [ + "What is Markdown?", + "Panel Content Methods", + "Basic Formatting", + "Images", + "Rich Media", + "Code", + "Footnotes", + "Math and Science Notation (LaTeX)", + "Best Practices", + "Quick Reference", + "Limitations", + "Next Steps" + ], + "h3": [ + "Learning Resources", + "Method 1: Entering Text Directly", + "Method 2: Pasting Markdown Text", + "Method 3: Referencing a Markdown File", + "Headings", + "Text Styling", + "Lists", + "Links", + "Blockquotes", + "Basic Syntax", + "Size Options", + "Image Paths", + "Examples", + "Image Captions", + "YouTube Videos", + "Other Iframes", + "Inline Code", + "Code Blocks", + "How It Works", + "Inline Math", + "Display Math", + "Multi-line Equations", + "Supported Environments", + "Chemical Formulas", + "Where LaTeX Works", + "Full Syntax Reference", + "Alt Text for Accessibility", + "Image Organization", + "Content Length", + "File Naming", + "Add an image with caption", + "Add a YouTube video", + "Add a citation with footnote", + "Link to a glossary term", + "Link to another object", + "Add inline and display math", + "Create a blockquote" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "--- title: \"Weaving Techniques\" --- The interlocking warp pattern visible here indicates a complex weaving technique that was common in the colonial period. ## Technical Details These patterns were created using...", + "## Second Level Heading ### Third Level Heading #### Fourth Level Heading", + "**Bold text** for emphasis *Italic text* for subtle emphasis ***Bold and italic*** for maximum emphasis", + "- First item - Second item - Nested item - Another nested item - Third item", + "1. First step 2. Second step 3. Third step", + "[Link text](https://example.com) [Internal link](/objects/textile-001/)", + "> This is a blockquote. > It can span multiple lines.", + "![Alt text description](path/to/image.jpg){size}", + "![Weaving detail](textile-closeup.jpg){md}", + "![Site logo](/telar-content/objects/logo.png){sm}", + "![Museum photo](https://example.com/image.jpg){lg}", + "![Small thumbnail](thumb.jpg){small} ![Medium illustration](diagram.jpg){md} ![Large featured image](painting.jpg){large} ![Full-width panorama](landscape.jpg){full}", + "![Colonial textile fragment](textile.jpg){lg} Detail showing the *interlocking warp* pattern typical of the period.", + "![Map of the region](map.jpg){md} caption: Map from *Recopilación de Leyes*, 1680.", + "<div style=\"position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; margin: 1.5rem 0;\"> <iframe style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\" src=\"https://www.youtube.com/embed/VIDEO_ID\" frameborder=\"0\" allowfullscreen> </iframe> </div>", + "<iframe src=\"https://example.com/embed\" width=\"100%\" height=\"400\" frameborder=\"0\"> </iframe>", + "The `object_id` field must match the filename.", + "``` git add . git commit -m \"Update content\" git push ```", + "```yaml title: My Story description: A compelling narrative ```", + "The textile shows advanced techniques.[^1] [^1]: Based on analysis by Dr. Smith (2020).", + "The coefficient is $C = \\frac{8}{35}$ and the polynomial is $P_4(x)$.", + "$$x^4 = \\frac{8}{35}P_4(x) + \\frac{4}{7}P_2(x) + \\frac{1}{5}P_0(x)$$", + "\\[E = mc^2\\]", + "$$\\begin{align} P_0(x) &= 1\\\\ P_1(x) &= x\\\\ P_2(x) &= \\frac{1}{2}(3x^2 - 1) \\end{align}$$", + "The reaction $\\ce{2H2 + O2 -> 2H2O}$ produces water. $$\\ce{CO2 + C -> 2CO}$$", + "✅ ![Detailed view of interlocking warp threads](closeup.jpg){lg} ❌ ![Image](closeup.jpg){lg}", + "telar-content/objects/ ├── story1-context.jpg ├── story1-detail.jpg ├── story2-map.jpg └── ...", + "✅ ![Colonial weaving pattern](colonial-textile-detail.jpg){md} ❌ ![Photo](IMG_1234.JPG){md}", + "![Colonial textile showing interlocking pattern](textile-detail.jpg){lg} Detail of the warp threads, circa 1650.", + "<div style=\"position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; margin: 1.5rem 0;\"> <iframe style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\" src=\"https://www.youtube.com/embed/dQw4w9WgXcQ\" frameborder=\"0\" allowfullscreen></iframe> </div>", + "Recent scholarship challenges this interpretation.[^1] [^1]: García, M. (2023). *Rethinking Colonial Textiles*. University Press.", + "The [[encomienda]] system structured colonial tributary relations.", + "Compare with the [Lima textile](/objects/textile-lima/).", + "The coefficient is $C = \\frac{8}{35}$ and the result is: $$x^4 = \\frac{8}{35}P_4(x) + \\frac{4}{7}P_2(x) + \\frac{1}{5}P_0(x)$$", + "> \"The patterns speak to a sophisticated understanding of geometry.\" > — Author" + ], + "table": [ + "layer1_content This textile shows advanced weaving techniques from the colonial period. The interlocking pattern indicates sophisticated craftsmanship.", + "layer1_content colonial-textiles/step1-layer1.md", + "Size Keyword Max Width Use Case Small {sm} or {small} 250px Thumbnails, icons, small details Medium {md} or {medium} 450px Standard illustrations (default) Large {lg} or {large} 700px Featured images, detailed views Full {full} 100% Panoramas, full-width visuals", + "Environment Purpose align, align* Aligned equations (with/without numbering) equation, equation* Single equations (with/without numbering) cases Piecewise functions pmatrix Parenthesized matrices bmatrix Bracketed matrices", + "Content type How it loads Story panels (layer 1 / layer 2) Automatic — detected at build time Story step text Automatic — detected at build time Object descriptions Automatic — detected at build time Glossary definitions Automatic — detected at build time Custom pages Always available Encrypted stories Loaded automatically after decryption" + ], + "blockquote": [ + "This reference covers panel content: these options apply to layer1_content and layer2_content, and to the markdown files they point to. A step's question and answer work differently. The question is a heading, so it is plain text with no markdown processing. Answers are reduced to plain prose, and Telar cuts any answer over 18 lines. See Answers Are Plain Prose.", + "The three methods that follow describe authoring in a spreadsheet. In the Compositor, the panel title has its own field, and anything pasted into the Content field — a --- block included — is published as part of the panel's text, not read as a title.", + "If you copy and paste from Microsoft Word, Google Docs, or similar applications, formatting will not be preserved. Write in markdown syntax instead.", + "Tip: Don't use # First Level in panels — each panel already has a title.", + "Default Size: Images without a size tag default to medium (450px). Always include size tags for clarity.", + "Dollar sign heuristic: To avoid false positives with currency (e.g. \"$50\"), Telar only treats $...$ as math when the content contains LaTeX-like characters such as \\, ^, _, or {. Double dollar signs ($$...$$) are always treated as math." + ], + "img": [] + }, + "text": "Markdown Syntax Reference Panel content in Telar supports rich markdown formatting. This reference covers the syntax most useful for narrative content. This reference covers panel content : these options apply to layer1_content and layer2_content , and to the markdown files they point to. A step's question and answer work differently. The question is a heading, so it is plain text with no markdown processing. Answers are reduced to plain prose, and Telar cuts any answer over 18 lines. See Answers Are Plain Prose . What is Markdown? Markdown is a lightweight markup language that lets you format text using simple, readable syntax. Instead of complex HTML tags, you write in plain text with special characters like * for emphasis or # for headings. Markdown is: Easy to read : Even in its raw form, markdown is readable Easy to write : Simple syntax that's faster than HTML Portable : Plain text files work everywhere Convertible : Automatically converted to HTML for display Learning Resources New to markdown? These resources will help: Markdown Guide - Comprehensive getting started guide CommonMark Tutorial - Interactive 10-minute tutorial Markdown Cheat Sheet - Quick reference In case you're wondering, Telar uses the Python Markdown processor with the extra and nl2br extensions. Panel Content Methods You can provide panel content in three ways. For full details, see the CSV Reference: Stories . The three methods that follow describe authoring in a spreadsheet. In the Compositor, the panel title has its own field, and anything pasted into the Content field — a --- block included — is published as part of the panel's text, not read as a title. Method 1: Entering Text Directly Type panel text directly in your spreadsheet's layer1_content column: layer1_content This textile shows advanced weaving techniques from the colonial period. The interlocking pattern indicates sophisticated craftsmanship. Line breaks in your spreadsheet cell create paragraph breaks. The panel title defaults to the button text. Method 2: Pasting Markdown Text Paste text from a plain text editor. You can include headings, widgets, and a custom panel title using YAML frontmatter: --- title: \"Weaving Techniques\" --- The interlocking warp pattern visible here indicates a complex weaving technique that was common in the colonial period. ## Technical Details These patterns were created using... If you copy and paste from Microsoft Word, Google Docs, or similar applications, formatting will not be preserved. Write in markdown syntax instead. Method 3: Referencing a Markdown File For complex content, reference a markdown file saved in telar-content/texts/stories/ : layer1_content colonial-textiles/step1-layer1.md The file uses frontmatter for the panel title and supports all markdown features including widgets. When to use file references : Content with widgets (accordion, tabs, carousel) Content reused across multiple stories Long narratives that benefit from editing in a text editor Basic Formatting Headings ## Second Level Heading ### Third Level Heading #### Fourth Level Heading Tip : Don't use # First Level in panels — each panel already has a title. Text Styling **Bold text** for emphasis *Italic text* for subtle emphasis ***Bold and italic*** for maximum emphasis Lists Unordered lists: - First item - Second item - Nested item - Another nested item - Third item Ordered lists: 1. First step 2. Second step 3. Third step Links [Link text](https://example.com) [Internal link](/objects/textile-001/) Blockquotes > This is a blockquote. > It can span multiple lines. Images Telar provides special syntax for controlling image sizes in panels. Basic Syntax ![Alt text description](path/to/image.jpg){size} Size Options Size Keyword Max Width Use Case Small {sm} or {small} 250px Thumbnails, icons, small details Medium {md} or {medium} 450px Standard illustrations (default) Large {lg} or {large} 700px Featured images, detailed views Full {full} 100% Panoramas, full-width visuals Image Paths Relative paths (no leading slash) automatically load from /telar-content/objects/ : ![Weaving detail](textile-closeup.jpg){md} → Loads /telar-content/objects/textile-closeup.jpg Absolute paths (starting with / ) load from site root: ![Site logo](/telar-content/objects/logo.png){sm} External URLs work as expected: ![Museum photo](https://example.com/image.jpg){lg} Examples ![Small thumbnail](thumb.jpg){small} ![Medium illustration](diagram.jpg){md} ![Large featured image](painting.jpg){large} ![Full-width panorama](landscape.jpg){full} Default Size : Images without a size tag default to medium (450px). Always include size tags for clarity. Image Captions Add a caption to any image by placing text on the line immediately after the image: ![Colonial textile fragment](textile.jpg){lg} Detail showing the *interlocking warp* pattern typical of the period. The caption appears centered below the image in a lighter weight font. Optional prefix : You can use caption: to make captions more explicit: ![Map of the region](map.jpg){md} caption: Map from *Recopilación de Leyes*, 1680. The caption: prefix is stripped from the displayed text. Markdown in captions : Captions support inline markdown formatting like *italics* , **bold** , and [links](url) . Rich Media YouTube Videos Embed responsive YouTube videos using iframe HTML: <div style=\"position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; margin: 1.5rem 0;\"> <iframe style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\" src=\"https://www.youtube.com/embed/VIDEO_ID\" frameborder=\"0\" allowfullscreen> </iframe> </div> Replace VIDEO_ID with your YouTube video ID. The padding-bottom: 56.25% creates a 16:9 aspect ratio container. Other Iframes Any iframe-embeddable content works: <iframe src=\"https://example.com/embed\" width=\"100%\" height=\"400\" frameborder=\"0\"> </iframe> Code Inline Code Use backticks for inline code references: The `object_id` field must match the filename. Code Blocks Use triple backticks for code blocks: ``` git add . git commit -m \"Update content\" git push ``` With syntax highlighting: ```yaml title: My Story description: A compelling narrative ``` Footnotes Create footnotes with [^1] syntax: The textile shows advanced techniques.[^1] [^1]: Based on analysis by Dr. Smith (2020). Footnotes automatically appear at the bottom of panel content with proper styling. Footnotes work in panel content only. If you put one in a step's answer , Telar removes both the reference and the note, and tells you in the build log. Math and Science Notation (LaTeX) Telar supports LaTeX math rendering via KaTeX . You can include mathematical formulas, chemical equations, and scientific notation anywhere markdown appears: story panels, glossary definitions, object descriptions, and custom pages. How It Works Telar automatically detects LaTeX in your content at build time. No configuration is needed — if your text contains LaTeX notation, it will render as formatted math. Inline Math Wrap expressions in single dollar signs to display math inline with surrounding text: The coefficient is $C = \\frac{8}{35}$ and the polynomial is $P_4(x)$. Renders as: The coefficient is $C = \\frac{8}{35}$ and the polynomial is $P_4(x)$. Dollar sign heuristic : To avoid false positives with currency (e.g. \"$50\"), Telar only treats $...$ as math when the content contains LaTeX-like characters such as \\ , ^ , _ , or { . Double dollar signs ( $$...$$ ) are always treated as math. Display Math Wrap expressions in double dollar signs for centered, standalone equations: $$x^4 = \\frac{8}{35}P_4(x) + \\frac{4}{7}P_2(x) + \\frac{1}{5}P_0(x)$$ Renders as: $$x^4 = \\frac{8}{35}P_4(x) + \\frac{4}{7}P_2(x) + \\frac{1}{5}P_0(x)$$ You can also use \\[...\\] delimiters: \\[E = mc^2\\] Multi-line Equations Use \\begin{align}...\\end{align} for aligned multi-line equations. Use & to mark alignment points and \\\\ for line breaks: $$\\begin{align} P_0(x) &= 1\\\\ P_1(x) &= x\\\\ P_2(x) &= \\frac{1}{2}(3x^2 - 1) \\end{align}$$ Renders as: $$\\begin{align} P_0(x) &= 1\\\\ P_1(x) &= x\\\\ P_2(x) &= \\frac{1}{2}(3x^2 - 1) \\end{align}$$ Supported Environments Environment Purpose align , align* Aligned equations (with/without numbering) equation , equation* Single equations (with/without numbering) cases Piecewise functions pmatrix Parenthesized matrices bmatrix Bracketed matrices Chemical Formulas Telar includes the mhchem extension for chemical notation: The reaction $\\ce{2H2 + O2 -> 2H2O}$ produces water. $$\\ce{CO2 + C -> 2CO}$$ Renders as: The reaction $\\ce{2H2 + O2 -> 2H2O}$ produces water. $$\\ce{CO2 + C -> 2CO}$$ Where LaTeX Works Content type How it loads Story panels (layer 1 / layer 2) Automatic — detected at build time Story step text Automatic — detected at build time Object descriptions Automatic — detected at build time Glossary definitions Automatic — detected at build time Custom pages Always available Encrypted stories Loaded automatically after decryption Full Syntax Reference For the complete list of supported LaTeX commands, see the KaTeX function support table . Best Practices Alt Text for Accessibility Always provide descriptive alt text for images: ✅ ![Detailed view of interlocking warp threads](closeup.jpg){lg} ❌ ![Image](closeup.jpg){lg} Image Organization Keep panel images in /telar-content/objects/ for easy reference: telar-content/objects/ ├── story1-context.jpg ├── story1-detail.jpg ├── story2-map.jpg └── ... Content Length Layer 1 : 2-3 paragraphs of context Layer 2 : Longer scholarly content, citations, extended analysis Break up long text with headings, lists, and images for better readability. File Naming Use descriptive, lowercase filenames with hyphens: ✅ ![Colonial weaving pattern](colonial-textile-detail.jpg){md} ❌ ![Photo](IMG_1234.JPG){md} Quick Reference Copy-paste examples for the most common formatting tasks: Add an image with caption ![Colonial textile showing interlocking pattern](textile-detail.jpg){lg} Detail of the warp threads, circa 1650. Add a YouTube video <div style=\"position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; margin: 1.5rem 0;\"> <iframe style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\" src=\"https://www.youtube.com/embed/dQw4w9WgXcQ\" frameborder=\"0\" allowfullscreen></iframe> </div> Add a citation with footnote Recent scholarship challenges this interpretation.[^1] [^1]: García, M. (2023). *Rethinking Colonial Textiles*. University Press. Link to a glossary term The [[encomienda]] system structured colonial tributary relations. Link to another object Compare with the [Lima textile](/objects/textile-lima/). Add inline and display math The coefficient is $C = \\frac{8}{35}$ and the result is: $$x^4 = \\frac{8}{35}P_4(x) + \\frac{4}{7}P_2(x) + \\frac{1}{5}P_0(x)$$ Create a blockquote > \"The patterns speak to a sophisticated understanding of geometry.\" > — Author Limitations No JavaScript : Markdown is converted to static HTML No custom HTML attributes : Use the provided size syntax instead of custom classes Image processing : Images from telar-content/objects/ that are listed in your objects CSV without external IIIF sources will be converted into IIIF tiles automatically. LaTeX cross-page glossary : If a story page has no LaTeX but a fetched glossary term contains LaTeX, the math will not render in the glossary popup (KaTeX is not loaded on that page). This is a rare edge case. Next Steps Your Content Guide - Learn how to organize your markdown files Rich Content with Markdown - Create and edit markdown files Advanced Styling - Customize panel appearance" + }, + "/docs/local-authoring/content/": { + "ids": [ + "add-panels-and-glossary-links", + "connect-a-story-and-its-steps", + "edit-objects-stories-and-text-files", + "know-the-source-folders", + "media-public-object-docs-local-authoring-content", + "register-one-object" + ], + "selectors": { + "h1": [ + "Edit objects, stories and text files" + ], + "h2": [ + "Know the source folders", + "Register one object", + "Connect a story and its steps", + "Add panels and glossary links" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "object_id,title,source_url,alt_text khipu,Haptic khipu,https://juancobo.com/138la/iiif/khipu/p7/manifest.json,Gloved hands working with knotted cords on a white surface", + "order,story_id,title 1,khipu-story,Examining a khipu", + "step,object,x,y,zoom,question,answer 1,khipu,0.5,0.5,1,Which activity is shown?,The photograph documents sampling for radiocarbon dating." + ], + "table": [ + "Location What to edit telar-content/spreadsheets/ Object catalogue, story list, story steps and glossary CSV files telar-content/objects/ Images, PDFs and audio hosted by your site telar-content/texts/stories/ Longer panel texts referenced from story rows telar-content/texts/glossary/ Glossary text files where used _config.yml Site identity and configuration _data/navigation.yml Published menu" + ], + "blockquote": [], + "img": [ + [ + "/assets/manual/tutorials/en-public-object.jpg", + "The khipu object page generated locally by Telar." + ] + ] + }, + "text": "Edit objects, stories and text files The editable content lives in telar-content/ . Generated JSON, collections and the built _site/ directory are outputs; changes made only there disappear at the next build. Know the source folders Location What to edit telar-content/spreadsheets/ Object catalogue, story list, story steps and glossary CSV files telar-content/objects/ Images, PDFs and audio hosted by your site telar-content/texts/stories/ Longer panel texts referenced from story rows telar-content/texts/glossary/ Glossary text files where used _config.yml Site identity and configuration _data/navigation.yml Published menu Register one object For a local file, use a simple filename such as khipu.jpg and put it in the objects folder. Match that name with the object ID. For an external IIIF object, add its manifest to source_url . No image download is required. A minimal objects.csv example is: object_id,title,source_url,alt_text khipu,Haptic khipu,https://juancobo.com/138la/iiif/khipu/p7/manifest.json,Gloved hands working with knotted cords on a white surface Keep catalogue information and credits in the other supported columns. See object columns for the complete schema. The local build produces a zoomable object page with its catalogue information and manifest link. Open full-size screenshot ↗ Connect a story and its steps Add a story to project.csv : order,story_id,title 1,khipu-story,Examining a khipu Create khipu-story.csv in the same folder. Its filename matches the story ID: step,object,x,y,zoom,question,answer 1,khipu,0.5,0.5,1,Which activity is shown?,The photograph documents sampling for radiocarbon dating. Use the object page's coordinate tool to refine the starting view. A new row can return to the same object at another view. Keep steps numbered in order. Add panels and glossary links Use layer1_content and layer2_content for inline panel text or a Markdown file path relative to the stories text folder. Use the matching button columns to describe what opens. Glossary definitions can live in glossary.csv ; link them as [[term-id]] . Read story columns and glossary columns before adding more complex content. Next, rebuild and inspect the result ." + }, + "/docs/google-sheets/": { + "ids": [], + "selectors": { + "h1": [ + "Google Sheets manual" + ], + "h2": [ + "How the spreadsheet fits together", + "How it works", + "Before you begin", + "In this manual", + "Reference for your work" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Google Sheets manual The Google Sheets workflow lets you author a Telar exhibition in a shared spreadsheet. You catalogue your sources, arrange story steps and write narrative text in rows and columns; Telar reads that content and builds the website. This approach suits people who prefer a spreadsheet, want to review several records at once or write with a team. The sheet brings together narrative content and metadata. Images and other media load from their source addresses or from files in your site. How the spreadsheet fits together objects holds your source catalogue, including descriptions, credits and addresses. project lists the stories and sets their order in the exhibition. Each story has its own tab. Each row is a step, connecting text to an object, its framing and its panels. glossary defines terms you can link from your text. How it works Set up the site and sheet. Create a Telar repository on GitHub, copy the Google Sheets template and connect its published address to the site. Write and arrange. Catalogue objects, add stories and steps, and develop the text. Use the site's viewer to choose image framings. Build and review. Run the build on GitHub to bring in the updated sheet content. Open the website and check the result. Editing a cell does not immediately update the public site. Each build reads the published sheet and produces a new edition of the exhibition. Before you begin You need Google and GitHub accounts. The guided setup takes you from copying the templates to connecting the site and generates your configuration file. If you are still developing the narrative, begin with Plan an exhibition . In this manual Set Up with Google Sheets Manual Setup Understand the spreadsheet Add an object and a first story Frame, review and publish from Sheets Reference for your work Files and columns Sources and content Site configuration" + }, + "/guia/autoria-local/vista-previa/": { + "ids": [ + "comprueba-la-fuente-de-cada-paso", + "genera-y-revisa-el-sitio-local", + "media-coordinates-guia-autoria-local-vista-previa", + "prueba-las-historias-privadas-por-separado", + "revisa-la-etapa-que-informa-el-error", + "vuelve-a-generar-después-de-editar-contenido" + ], + "selectors": { + "h1": [ + "Genera y revisa el sitio local" + ], + "h2": [ + "Vuelve a generar después de editar contenido", + "Comprueba la fuente de cada paso", + "Prueba las historias privadas por separado", + "Revisa la etapa que informa el error" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "python3 scripts/build_local_site.py", + "python3 scripts/build_local_site.py --skip-iiif --skip-fetch", + "python3 scripts/build_local_site.py --port 4003 --build-only python3 -m http.server 4003 --directory _site" + ], + "table": [], + "blockquote": [], + "img": [ + [ + "/assets/manual/tutorials/es-coordinates-poster.jpg", + "Se encuadra el khipu en su página y después se copian X, Y y Zoom desde el panel de coordenadas." + ] + ] + }, + "text": "Genera y revisa el sitio local El script local prepara el contenido antes de iniciar Jekyll. El observador de archivos de Jekyll no vuelve a ejecutar todo el procesamiento previo. Vuelve a generar después de editar contenido Detén el servidor con Ctrl+C y ejecuta: python3 scripts/build_local_site.py Después de editar CSV hay que convertir los datos y generar las colecciones. Después de agregar o reemplazar una imagen o PDF hay que generar las teselas IIIF. El script realiza estas etapas. Si no cambiaron las imágenes ni la hoja de Google Sheets: python3 scripts/build_local_site.py --skip-iiif --skip-fetch No omitas una etapa cuyos insumos cambiaron. Jekyll puede actualizar parte del resultado al editar Markdown o estilos, pero vuelve a usar el script para revisar el sitio completo. Comprueba la fuente de cada paso Abre la galería, la página del objeto y la historia. En el ejemplo del khipu, las tres deben mostrar el khipu. Revisa encuadre, texto alternativo, créditos, paneles y enlaces del glosario. Prueba una ventana más pequeña y la navegación con teclado. Usa la revisión con lectores para evaluar también la narrativa. Encuadra el khipu, baja al panel y copia los valores para Sheets o CSV. Es un ejemplo local construido con Telar. Ver los pasos Ampliar captura ↗ Descargar GIF Prueba las historias privadas por separado El servidor de desarrollo muestra las historias privadas sin cifrar. Como regenera las páginas continuamente, su resultado no conserva el cifrado. Para probar el bloqueo, detén Jekyll. Configura temporalmente baseurl: \"\" para que el servidor estático sirva el resultado desde su raíz y ejecuta: python3 scripts/build_local_site.py --port 4003 --build-only python3 -m http.server 4003 --directory _site Restaura la ruta de producción después de esta prueba. Este build ejecuta el cifrado posterior a la generación. Abre la historia en el servidor estático y prueba las vistas bloqueada y desbloqueada. Trata la vista previa de desarrollo como material de trabajo local. Revisa la etapa que informa el error Una imagen ausente puede deberse a un ID distinto, una fuente inaccesible o una falla al generar teselas. Una historia ausente puede deberse a que su ID y el archivo tienen nombres diferentes. La terminal ayuda a identificar la etapa. Corrige la fuente y vuelve a generar. Evita editar JSON o HTML generados para ocultar el problema. Sigue con la publicación y el mantenimiento ." + }, + "/docs/the-compositor/pages/": { + "ids": [ + "add-a-supporting-page", + "arrange-the-homepage-and-pages", + "arrange-the-menu", + "check-page-addresses", + "edit-the-homepage", + "media-homepage-docs-the-compositor-pages", + "media-pages-docs-the-compositor-pages", + "review-the-complete-route" + ], + "selectors": { + "h1": [ + "Arrange the homepage and pages" + ], + "h2": [ + "Edit the homepage", + "Add a supporting page", + "Arrange the menu", + "Check page addresses", + "Review the complete route" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [ + [ + "/assets/manual/tutorials/en-homepage.jpg", + "The pinned Home entry selected beside the homepage title and description fields." + ], + [ + "/assets/manual/tutorials/en-pages.jpg", + "A supporting page with its title, address and content below the navigation preview." + ] + ] + }, + "text": "Arrange the homepage and pages Open Home and Pages to edit the exhibition's introduction, arrange its menu and create supporting pages. Edit the homepage Select the pinned Home entry. Edit the site title and description, welcome text, and headings or introductions for the stories and objects sections. These fields describe the whole exhibition. Explain what visitors can explore and give them a clear starting point. Keep the longer introduction to an individual story inside that story. Arrange story cards in the order you want readers to encounter them. Story drafts remain excluded from publication. The collection's display settings live in Site settings , while the objects' featured status and metadata are edited in Objects . Choose the pinned Home entry to edit the introduction. Its editing position is separate from the order of the published menu. Open full-size screenshot ↗ Add a supporting page Choose Add page . Add a title, such as About, Team or Methodology. Write the page's content using the text editor. Check its URL and the menu preview. A page is useful for information that should remain available outside a story: credits, contributors, research methods or acknowledgements. It does not have the sequence of framed steps that a story has. If the Compositor finds existing pages in the repository, it offers to import them. Review the imported content before replacing or duplicating it. A supporting page has its own title, address and content. The menu preview above shows how readers will find it. Open full-size screenshot ↗ Arrange the menu Use the navigation preview to reorder the menu items and choose the page you want to edit. Keep destination names short and recognisable. The pinned Home entry in the editing sidebar does not force Home to be first in the published menu. Check the menu preview itself to confirm the public order. Check page addresses A page's URL must be unique and cannot use an address reserved by the site. The Compositor explains collisions beside the field. Changing an address affects the next publication. Existing links to the old address will no longer reach the page. Update links in your content and any places where you have shared it. Review the complete route After publishing, begin at the homepage, open each menu item and check that the intended title, content and story order appear. A change saved in the editor is not yet a change to the public site. Next, adjust appearance and site settings ." + }, + "/docs/local-authoring/preview/": { + "ids": [ + "check-the-actual-source-in-each-step", + "media-coordinates-docs-local-authoring-preview", + "read-failures-at-the-stage-that-reports-them", + "rebuild-after-content-changes", + "rebuild-and-inspect-the-local-site", + "test-private-stories-separately" + ], + "selectors": { + "h1": [ + "Rebuild and inspect the local site" + ], + "h2": [ + "Rebuild after content changes", + "Check the actual source in each step", + "Test private stories separately", + "Read failures at the stage that reports them" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "python3 scripts/build_local_site.py", + "python3 scripts/build_local_site.py --skip-iiif --skip-fetch", + "python3 scripts/build_local_site.py --port 4003 --build-only python3 -m http.server 4003 --directory _site" + ], + "table": [], + "blockquote": [], + "img": [ + [ + "/assets/manual/tutorials/en-coordinates-poster.jpg", + "The khipu is framed on its object page, then the coordinate panel copies X, Y and Zoom for Sheets." + ] + ] + }, + "text": "Rebuild and inspect the local site The local helper prepares content before it starts Jekyll. Jekyll's file watcher alone does not rerun every preprocessing step. Rebuild after content changes Stop the running server with Ctrl+C, then run: python3 scripts/build_local_site.py After changing CSV files, the conversion and collection-generation steps must run again. After adding or replacing an image or PDF, regenerate its IIIF tiles. The helper handles these stages. If images and the Google Sheet have not changed, use: python3 scripts/build_local_site.py --skip-iiif --skip-fetch Do not skip a stage whose inputs changed. For Markdown or styling work, Jekyll can update some output while serving, but use the helper again when checking the complete result. Check the actual source in each step Open the objects gallery, the object page and the story. For the khipu example, all three should show the khipu. Check the framing, alt text, credits, panels and glossary links. Test with a smaller browser window and keyboard navigation. Use the reader-review guide to check the narrative as well as the build. Frame the khipu, scroll to the coordinate panel and copy the values for Sheets or CSV. This is a local example built with Telar. Play steps Open full-size screenshot ↗ Download GIF Test private stories separately The development server shows private-story content in plaintext. It continually regenerates pages, so its output does not stay encrypted. To test the locked behaviour, stop Jekyll. Temporarily set baseurl: \"\" in your configuration so the static server can serve the output at its root, then run: python3 scripts/build_local_site.py --port 4003 --build-only python3 -m http.server 4003 --directory _site Restore your production base path after this test. This build runs the post-build encryption step. Open the story from the static server and check both locked and unlocked views. Treat the live development preview as local working material. Read failures at the stage that reports them A missing image may come from an object ID mismatch, an unreachable source or a tile-generation failure. A missing story may come from a mismatched filename and story ID. The terminal output helps identify which stage failed. Fix the source and rebuild. Avoid editing generated JSON or HTML to conceal a source problem. Next, publish and maintain the site ." + }, + "/guia/autoria-local/contenido/": { + "ids": [ + "agrega-paneles-y-enlaces-al-glosario", + "conecta-una-historia-y-sus-pasos", + "edita-objetos-historias-y-textos", + "media-public-object-guia-autoria-local-contenido", + "registra-un-objeto", + "ubica-los-archivos-fuente" + ], + "selectors": { + "h1": [ + "Edita objetos, historias y textos" + ], + "h2": [ + "Ubica los archivos fuente", + "Registra un objeto", + "Conecta una historia y sus pasos", + "Agrega paneles y enlaces al glosario" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "object_id,title,source_url,alt_text khipu,Khipu háptico,https://juancobo.com/138la/iiif/khipu/p7/manifest.json,Manos con guantes trabajan con cuerdas anudadas sobre una superficie blanca", + "order,story_id,title 1,historia-khipu,Examinando un khipu", + "step,object,x,y,zoom,question,answer 1,khipu,0.5,0.5,1,¿Qué actividad muestra?,La fotografía documenta una toma de muestras para datación por radiocarbono." + ], + "table": [ + "Ubicación Qué editas telar-content/spreadsheets/ Catálogo de objetos, lista de historias, pasos y glosario en CSV telar-content/objects/ Imágenes, PDF y audio alojados por el sitio telar-content/texts/stories/ Textos de paneles referenciados desde los pasos telar-content/texts/glossary/ Archivos de texto del glosario, cuando se utilizan _config.yml Identidad y configuración del sitio _data/navigation.yml Menú público" + ], + "blockquote": [], + "img": [ + [ + "/assets/manual/tutorials/es-public-object.jpg", + "La página del khipu generada localmente por Telar." + ] + ] + }, + "text": "Edita objetos, historias y textos El contenido editable está en telar-content/ . Los JSON generados, las colecciones y _site/ son resultados del build: los cambios hechos solo allí desaparecen al volver a generar. Ubica los archivos fuente Ubicación Qué editas telar-content/spreadsheets/ Catálogo de objetos, lista de historias, pasos y glosario en CSV telar-content/objects/ Imágenes, PDF y audio alojados por el sitio telar-content/texts/stories/ Textos de paneles referenciados desde los pasos telar-content/texts/glossary/ Archivos de texto del glosario, cuando se utilizan _config.yml Identidad y configuración del sitio _data/navigation.yml Menú público Registra un objeto Para un archivo local, usa un nombre sencillo como khipu.jpg y guárdalo en la carpeta de objetos. Haz corresponder ese nombre con el ID. Para un objeto IIIF externo, agrega el manifiesto en source_url . No necesitas descargar la imagen. Ejemplo mínimo de objects.csv : object_id,title,source_url,alt_text khipu,Khipu háptico,https://juancobo.com/138la/iiif/khipu/p7/manifest.json,Manos con guantes trabajan con cuerdas anudadas sobre una superficie blanca Completa la ficha y los créditos en las demás columnas. La referencia de columnas de objetos explica el formato completo. El build local genera una página ampliable con la información de catálogo y el enlace al manifiesto. Ampliar captura ↗ Conecta una historia y sus pasos Agrega la historia en project.csv : order,story_id,title 1,historia-khipu,Examinando un khipu Crea historia-khipu.csv en la misma carpeta. El nombre corresponde al ID: step,object,x,y,zoom,question,answer 1,khipu,0.5,0.5,1,¿Qué actividad muestra?,La fotografía documenta una toma de muestras para datación por radiocarbono. Usa la herramienta de coordenadas del objeto para ajustar la vista. Otro paso puede volver al mismo objeto con un encuadre distinto. Numera los pasos en orden. Agrega paneles y enlaces al glosario Usa layer1_content y layer2_content para texto directo o una ruta de Markdown relativa a la carpeta de textos de historias. Describe lo que se abre con las columnas de botones. Las definiciones pueden estar en glossary.csv ; enlázalas con [[id-del-termino]] . Consulta las columnas de historias y del glosario antes de agregar contenido más complejo. Sigue con la generación y revisión ." + }, + "/guia/el-compositor/paginas/": { + "ids": [ + "agrega-una-página-de-apoyo", + "comprueba-el-recorrido-completo", + "edita-la-página-de-inicio", + "media-homepage-guia-el-compositor-paginas", + "media-pages-guia-el-compositor-paginas", + "organiza-el-inicio-y-las-páginas", + "organiza-el-menú", + "revisa-las-direcciones" + ], + "selectors": { + "h1": [ + "Organiza el inicio y las páginas" + ], + "h2": [ + "Edita la página de inicio", + "Agrega una página de apoyo", + "Organiza el menú", + "Revisa las direcciones", + "Comprueba el recorrido completo" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [ + [ + "/assets/manual/tutorials/es-homepage.jpg", + "La entrada Inicio seleccionada junto a los campos de título y descripción." + ], + [ + "/assets/manual/tutorials/es-pages.jpg", + "Una página de apoyo con título, dirección y contenido bajo la vista previa del menú." + ] + ] + }, + "text": "Organiza el inicio y las páginas Abre Inicio y páginas para editar la presentación de la exhibición, organizar el menú y crear páginas de apoyo. Edita la página de inicio Selecciona Inicio , que aparece fijo en la barra lateral. Edita el título y la descripción, el texto de bienvenida y los encabezados o introducciones de las secciones de historias y objetos. Estos campos presentan toda la exhibición. Explica qué puede explorar el público y ofrece un punto de entrada claro. Deja la introducción extensa de cada historia dentro de ella. Organiza las tarjetas en el orden de lectura que prefieras. Las historias en borrador se excluyen de la publicación. La presentación de la colección se ajusta en Configuración del sitio ; los metadatos y el estado destacado de los objetos se editan en Objetos . Selecciona Inicio en la barra lateral para editar la presentación. Su posición en el editor es independiente del orden del menú público. Ampliar captura ↗ Agrega una página de apoyo Elige Agregar página . Escribe un título, por ejemplo, Presentación, Equipo o Metodología. Redacta el contenido con el editor de texto. Revisa su URL y la vista previa del menú. Una página sirve para información que debe estar disponible fuera de las historias: créditos, participantes, métodos de investigación o agradecimientos. No tiene la secuencia de pasos con encuadres de una historia. Si el Compositor encuentra páginas existentes en el repositorio, ofrece importarlas. Revisa su contenido antes de reemplazarlo o duplicarlo. Cada página de apoyo tiene título, dirección y contenido propios. La vista previa superior muestra cómo la encontrará el público. Ampliar captura ↗ Organiza el menú Usa la vista previa de navegación para ordenar los enlaces y seleccionar la página que quieres editar. Los nombres deben ser breves y reconocibles. Que Inicio esté fijo en la barra lateral del editor no obliga a que sea el primer enlace del menú público. Comprueba el orden en la vista previa del menú. Revisa las direcciones Cada página necesita una URL propia y no puede ocupar una dirección reservada por el sitio. El Compositor explica los conflictos junto al campo. El cambio de dirección se aplica al publicar. Los enlaces anteriores dejarán de llevar a la página. Actualiza los enlaces del contenido y los lugares donde la hayas compartido. Comprueba el recorrido completo Después de publicar, empieza en el inicio y abre todos los enlaces del menú. Revisa títulos, contenido y orden de historias. Guardar un cambio en el editor todavía no modifica el sitio público. Sigue con la apariencia y la configuración ." + }, + "/guia/planear/": { + "ids": [ + "audience", + "exercise", + "next", + "purpose", + "sources" + ], + "selectors": { + "h1": [ + "Empieza por lo que quieres que las personas observen." + ], + "h2": [ + "1. Convierte un tema en una pregunta", + "2. Imagina a tus visitantes", + "3. Examina las fuentes antes de ordenarlas", + "4. Escribe un planteamiento que puedas desarrollar", + "Después: esboza el arco narrativo" + ], + "h3": [ + "¿Qué hay allí?", + "¿Qué preguntas surgen?" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Capítulo 1 · Propósito, público y fuentes Empieza por lo que quieres que las personas observen. Una exhibición reúne fuentes e interpretación. Antes de elegir un editor, piensa qué quieres que tus visitantes exploren y con qué materiales podrán hacerlo. Al terminar este capítulo Tendrás un planteamiento breve de la exhibición: una pregunta central, un público y un pequeño conjunto de fuentes por examinar. 1. Convierte un tema en una pregunta Un tema define de qué trata tu exhibición. Una pregunta invita a mirar con atención. Empieza por algo que puedas explorar a través de tus materiales. Un ejemplo para pensar Tema Una pintura de la Sabana de Bogotá. Posible pregunta central ¿Qué nos permite entender esta pintura sobre las personas y la tierra? Es una posible pregunta de partida, no una interpretación terminada. Los detalles que examines darán forma al argumento. Escribe la idea que quieres que tus visitantes se lleven, aunque sea provisional. Después, piensa qué preguntas podrían ayudarles a llegar a ella. El inicio debe darles una entrada; el cierre debe retomar lo que la exhibición les ha ayudado a ver. 2. Imagina a tus visitantes Piensa en alguien que llega sin los conocimientos que tú tienes sobre el material. ¿Qué puede reconocer? ¿Qué necesita una introducción? ¿Qué palabras o supuestos podrían dificultar la lectura? ¿Para quién estás creando esta exhibición? ¿Qué contexto necesita antes de observar los primeros detalles? ¿Qué debería poder observar o explicar al terminar? Usa esas respuestas para elegir el inicio, el lenguaje y la cantidad de contexto. El glosario puede explicar términos recurrentes; un panel puede desarrollar el contexto de un paso específico. 3. Examina las fuentes antes de ordenarlas Elige un conjunto pequeño para empezar: una imagen, un documento, una grabación de audio, un video o varios materiales relacionados. Puedes volver a la misma fuente en más de un paso. Observa y escucha con cuidado. Anota elementos importantes, las relaciones entre ellos, las preguntas que plantean y lo que sigue siendo incierto. Conecta cada posible observación con un detalle que puedas mostrar. ¿Qué hay allí? Personas, palabras, símbolos, sonidos, gestos, distribuciones y ausencias. ¿Qué preguntas surgen? Preguntas sobre su creación, uso, público, fecha, lugar e interpretación. Guarda junto a tus notas la dirección de la fuente, los datos del catálogo y el crédito. Identifica qué puedes compartir y qué debes revisar. Señala las interpretaciones inciertas como preguntas por investigar. 4. Escribe un planteamiento que puedas desarrollar En papel o en un documento, completa estas cuatro frases: Mi exhibición pregunta... Escribe una pregunta central. La estoy creando para... Define el público y el contexto que necesitará. Voy a trabajar con... Enumera un pequeño conjunto de fuentes y los detalles que vale la pena examinar. Al terminar, mis visitantes deberían... Describe una comprensión u observación que la exhibición pueda ayudar a desarrollar. Mantén el planteamiento abierto. La planeación es un proceso de revisión. A medida que examines las fuentes y pruebes la historia con lectores, ajusta la pregunta, la secuencia y la conclusión. Después: esboza el arco narrativo Convierte tu planteamiento en un inicio, una secuencia de preguntas y un cierre. Sigue con el arco narrativo ; después relaciona los pasos con las fuentes, planea las capas y organiza la exhibición. El planeador narrativo ofrece un inicio y un cierre entre los cuales trabajar. Las diapositivas del taller muestran cómo agregar preguntas, fuentes y capas. Planea el recorrido de la historia →" + }, + "/docs/local-authoring/": { + "ids": [], + "selectors": { + "h1": [ + "Local authoring & builds" + ], + "h2": [ + "The files you work with", + "How it works", + "Before you begin", + "In this manual", + "Reference for your work" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Local authoring & builds Local authoring means editing your exhibition's source files on your computer and generating a preview there. You work with CSV and Markdown files in your preferred editor and use Telar's tools to turn them into a website. Choose this approach if you want direct access to the files, want to customise the site or need control over building and hosting it. The result is a static site you can publish on GitHub Pages or another web server. The files you work with CSV: plain-text tables for the object catalogue, story list, steps and glossary. Markdown: text files for longer panels, glossary entries and supporting pages. Media files: images and other materials hosted by your site. You can also reference IIIF objects and media hosted by other collections. Configuration: files that define the site's title, language, theme and navigation. How it works Set up a local copy. Get the Telar source files and install the tools needed to build the site. Edit and preview. Add your sources, write stories and build a preview in your browser. Repeat as you check framings, text and links. Publish. Send changes to your GitHub repository to build the public site, or host the generated files on your chosen server. The local preview lets you review the work before publishing. Keep your editable source files: they are the starting point for revisions and future editions of the site. Before you begin You should be comfortable working with folders, editing text files and running commands in a terminal. The installation guide covers the tools you need: Ruby, Python, Node.js and Git. If you are still developing the narrative, begin with Plan an exhibition . In this manual Install and run Telar locally Edit objects, stories and text files Rebuild and inspect the local site Publish and maintain a local project Reference for your work Files and columns Sources and content Site configuration" + }, + "/guia/planear/fuentes-y-encuadres/": { + "ids": [ + "decide-qué-se-verá-en-cada-paso", + "describe-la-evidencia-junto-a-la-interpretación", + "elige-fuentes-y-encuadres", + "lleva-un-registro-de-fuentes", + "planea-imágenes-documentos-y-grabaciones", + "relaciona-cada-paso-con-una-vista" + ], + "selectors": { + "h1": [ + "Elige fuentes y encuadres" + ], + "h2": [ + "Lleva un registro de fuentes", + "Decide qué se verá en cada paso", + "Planea imágenes, documentos y grabaciones", + "Describe la evidencia junto a la interpretación" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Elige fuentes y encuadres El encuadre debe ayudar a responder la pregunta del paso. Acerca la imagen cuando un detalle sirva de evidencia y aléjala cuando importe la relación entre varios elementos. Lleva un registro de fuentes Para cada objeto, anota el título, la autoría conocida, la fecha o época, la institución que lo conserva, la dirección de la ficha de catálogo y el crédito. Anota por separado la dirección del manifiesto IIIF y la de la ficha de catálogo: el manifiesto proporciona la imagen y la ficha, el contexto del objeto. Registra qué puedes publicar y las dudas de atribución o interpretación. Si trabajas con materiales propios, conserva el archivo original además de la copia preparada para la exhibición. Decide qué se verá en cada paso Agrega tres notas a cada pregunta del plan: ¿Qué objeto, página o fragmento verá el visitante? ¿Qué detalle debe notar? ¿Qué explica la respuesta breve sobre ese detalle? Puedes volver al mismo objeto varias veces. Un cambio de encuadre permite desarrollar un argumento sin introducir una fuente nueva en cada paso. Usa una vista más amplia al pasar entre detalles distantes para que el público entienda su relación. Planea imágenes, documentos y grabaciones En documentos de varias páginas, elige primero la página y después el encuadre. Para video o audio, identifica un fragmento y anota su inicio y final. Revisa si necesita una transcripción u otra explicación. El ejemplo del khipu muestra cómo agregar un objeto con la URL de su manifiesto IIIF, seleccionarlo en un paso, ajustar el encuadre y guardarlo con Capturar posición . Comprueba que la imagen que encuadras sea la del objeto que agregaste. Describe la evidencia junto a la interpretación Describe los detalles visuales o sonoros pertinentes mediante el texto alternativo del paso o la explicación que lo acompaña. Evita depender únicamente de \"mira aquí\" o de un color para señalar la evidencia. Prueba la vista en una ventana más pequeña. Una etiqueta que puedes leer en tu monitor quizá necesite un acercamiento, una transcripción o una explicación escrita. Resultado: un registro de fuentes y una vista o un fragmento propuesto para cada paso. Sigue con los paneles y el glosario ." + }, + "/guia/planear/organizar-la-exhibicion/": { + "ids": [ + "decide-qué-presenta-la-página-de-inicio", + "define-la-relación-entre-historias", + "dibuja-la-navegación", + "elige-una-primera-versión-manejable", + "media-public-home-guia-planear-organizar-la-exhibicion", + "ofrece-otras-entradas-a-las-fuentes", + "organiza-toda-la-exhibición" + ], + "selectors": { + "h1": [ + "Organiza toda la exhibición" + ], + "h2": [ + "Decide qué presenta la página de inicio", + "Define la relación entre historias", + "Ofrece otras entradas a las fuentes", + "Dibuja la navegación", + "Elige una primera versión manejable" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [ + [ + "/assets/manual/tutorials/es-public-home.jpg", + "La página de inicio completa con presentación, tarjetas de historias, objetos y navegación." + ] + ] + }, + "text": "Organiza toda la exhibición Una exhibición incluye la página de inicio, las historias, los objetos, el glosario y las páginas de apoyo. Planea cómo recorrerlos antes de pulir cada pantalla. Decide qué presenta la página de inicio Explica el tema, la pregunta central y quién hizo la exhibición. Ofrece contexto suficiente para elegir una historia sin repetir la introducción completa de cada una. Dale a cada tarjeta un título propio y un subtítulo útil. Si el orden importa, pon primero la historia por la que recomiendas comenzar. Aclara cuándo pueden leerse de manera independiente. El inicio conecta la presentación, las historias y la colección de objetos. Abre la captura completa para examinar la organización. Ampliar captura ↗ Define la relación entre historias Usa una historia para un argumento continuo o un examen guiado. Divide el material cuando cada historia tenga una pregunta, un público o un conjunto de fuentes distinto. Describe en una frase la función de cada historia. Si dos descripciones son intercambiables, reconsidera la división. Si una historia requiere conocimientos de otra, explica o enlaza esa relación. Ofrece otras entradas a las fuentes La galería de objetos permite explorar fuera de los recorridos guiados. Los títulos, créditos y descripciones útiles, junto con metadatos consistentes, ayudan a comprender lo que aparece allí. El glosario ofrece contexto recurrente. Una página de presentación o metodología puede explicar autorías, decisiones de investigación, selección de fuentes y agradecimientos sin interrumpir las historias. Dibuja la navegación Enumera los enlaces del menú y la página que debe abrir cada uno. Mantén una lista que se pueda comprender de un vistazo. Usa nombres que describan el destino. En el Compositor, organiza el menú en Inicio y páginas y ajusta la presentación de historias y objetos en Configuración del sitio . Con archivos, la navegación se guarda en _data/navigation.yml ; consulta la referencia de navegación . Elige una primera versión manejable Construye primero un recorrido completo: inicio → historia → fuente o panel → cierre. Después agrega otras historias y páginas de apoyo. Resultado: un mapa sencillo del sitio, una lista ordenada de historias y un esquema de inicio. Sigue con las pruebas con lectores ." + }, + "/guia/el-compositor/iiif-a-historia/": { + "ids": [ + "abrir", + "contexto", + "elegir", + "encuadrar", + "manifest-url", + "media-editor-overview-guia-el-compositor-iiif-a-historia", + "media-framing-guia-el-compositor-iiif-a-historia", + "media-import-guia-el-compositor-iiif-a-historia", + "metadatos", + "obtener", + "problemas", + "publicar", + "usar-un-objeto-iiif-en-una-historia" + ], + "selectors": { + "h1": [ + "Usar un objeto IIIF en una historia" + ], + "h2": [ + "1. Abre la ventana de importación", + "2. Obtén el manifiesto", + "3. Revisa el objeto", + "4. Úsalo en un paso", + "5. Captura el encuadre", + "6. Agrega contexto", + "7. Publica y comprueba", + "Si algo no funciona" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "https://juancobo.com/138la/iiif/khipu/p7/manifest.json" + ], + "table": [], + "blockquote": [], + "img": [ + [ + "/assets/manual/tutorials/es-import-poster.jpg", + "La ventana IIIF pasa de la URL vacía al manifiesto escrito y a la vista previa del khipu." + ], + [ + "/assets/manual/tutorials/es-editor-overview.jpg", + "El esquema de la historia, la tarjeta del paso y el visor del khipu en el Compositor." + ], + [ + "/assets/manual/tutorials/es-framing-poster.jpg", + "Cambia el encuadre del khipu y Capturar posición confirma que quedó guardado." + ] + ] + }, + "text": "Usar un objeto IIIF en una historia Conecta una imagen alojada en otra colección con tu exhibición, úsala en un paso y captura el encuadre que quieres mostrar al público. Antes de empezar: un sitio y una historia que puedas editar Ejemplo: el manifiesto IIIF de un khipu Si el khipu ya está en tu colección, puedes ir directamente a Úsalo en un paso . Tres acciones distintas: agregar un objeto lo deja disponible en el Compositor. Elegirlo en un paso lo incorpora a tu historia. Publicar envía tus cambios al repositorio para que el sitio se vuelva a construir. En esta guía Abre la ventana de importación Obtén el manifiesto Revisa el objeto Úsalo en un paso Captura el encuadre Agrega contexto Publica y comprueba Si algo no funciona 1. Abre la ventana de importación Abre Objetos , pulsa + Agregar objeto y elige Manifiesto IIIF . Un manifiesto IIIF describe un objeto e indica al visor dónde cargar sus imágenes. Usa la dirección del manifiesto que proporciona la colección. 2. Obtén el manifiesto Pega este ejemplo en URL del manifiesto IIIF y pulsa Obtener manifiesto . https://juancobo.com/138la/iiif/khipu/p7/manifest.json Copiar URL del manifiesto Espera a que aparezca la vista previa. Este ejemplo lleva el título \"Haptic khipu — Taking a sample from the khipu for radio-carbon dating, Spring 2025\". 3. Revisa el objeto Revisa Título , Creador , Año , Descripción , Fuente y Crédito . Es posible que el proveedor incluya solo algunos datos. Conserva la información de fuente y crédito, y completa lo que falte con información de catálogo confiable. Desplázate dentro de la ventana para revisar los demás campos. El idioma de la interfaz no traduce los metadatos del manifiesto. Puedes revisar su redacción para tu exhibición. Pega el manifiesto, obtén los datos y revisa el khipu y sus metadatos. Agregar el objeto es una acción posterior. Ver los pasos Ampliar captura ↗ Descargar GIF Pulsa Agregar objeto . El objeto debe aparecer en tu colección. Abre su ficha para comprobar la imagen y agregar una Descripción para accesibilidad . 4. Úsalo en un paso Abre Historias y elige la historia que vas a editar. Pulsa + Agregar paso . Si aparece la opción de conservar el objeto anterior, elige Elegir otro objeto . Selecciona el khipu en el selector de objetos. También puedes usar Cambiar objeto en un paso existente. El paso debe mostrar la imagen importada. Escribe una pregunta y una respuesta breve. Para este ejercicio puedes usar: Pregunta: ¿Qué actividad se documenta en esta imagen? Respuesta: Una toma de muestra de un khipu para datación por radiocarbono, en la primavera de 2025. Estas frases describen el ejemplo. Tu propia historia debe desarrollar las preguntas que quieres explorar con el público. A la izquierda está el esquema; en el centro, el texto del paso; a la derecha, el objeto. Capturar posición guarda la vista del paso seleccionado. Ampliar captura ↗ 5. Captura el encuadre Desplaza y amplía la imagen hasta mostrar el detalle que quieres presentar. Usa las guías de encuadre para comprender el área que conservará el paso. Pulsa Capturar posición . Comprueba que el control confirme Capturada . Captura después de encuadrar. Mover el visor te permite explorar el objeto. Capturar posición guarda la vista de este paso. Vuelve a capturarla si cambias el encuadre que quieres conservar. Pasa a otro paso y regresa. Comprueba que se haya conservado el encuadre que elegiste. Ajusta la vista, pulsa Capturar posición y comprueba Capturada. Todo el recorrido muestra el mismo khipu. Ver los pasos Ampliar captura ↗ Descargar GIF 6. Agrega contexto En la tarjeta del paso, pulsa + Agregar panel . Si el paso ya tiene un panel, ábrelo con el botón correspondiente. Usa los iconos de edición del título y del texto del panel para escribir su contenido. Por ejemplo, explica cómo la imagen ayuda a explorar tu pregunta y enlaza la fuente del objeto. Mantén la respuesta breve legible en la tarjeta del paso. Usa los paneles para los detalles que ayudan a comprender la evidencia. 7. Publica y comprueba Abre Publicar y revisa los cambios. Corrige los errores que bloqueen la publicación y revisa las advertencias antes de publicar. Cuando termine la construcción del sitio, abre la historia publicada y comprueba que: El nuevo paso muestre el objeto correcto. El encuadre muestre el detalle que capturaste. La pregunta, la respuesta y el panel se lean correctamente. La fuente, el crédito y la descripción para accesibilidad del objeto sean adecuados. Si algo no funciona El manifiesto no carga. Revisa la dirección completa e intenta abrirla en un navegador. La dirección debe devolver un manifiesto IIIF. Una página de catálogo o un archivo de imagen son recursos distintos. Faltan metadatos. Revisa el catálogo de la colección y completa los campos correspondientes. Los datos importados dependen de lo que incluya el proveedor. La imagen aparece en Objetos, pero no en la historia. Abre el paso y comprueba qué objeto tiene seleccionado. El encuadre publicado es distinto. Vuelve a encuadrar el paso, pulsa Capturar posición , publica y comprueba que la construcción termine. El sitio en línea todavía muestra el contenido anterior. Revisa el estado de la publicación y de la construcción. Editar el borrador y publicarlo son operaciones distintas. Revisar el guion propuesto y sus textos exactos →" + }, + "/docs/reference/": { + "ids": [], + "selectors": { + "h1": [ + "Reference" + ], + "h2": [ + "Configuration and hosting", + "Sources and content", + "Data formats", + "Reader features", + "Appearance and navigation", + "Maintenance" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Reference Look up formats, content, configuration and features shared by the three ways of building an exhibition. For a step-by-step walkthrough, choose one of the manuals from the section menu. Here you can go straight to the topic you need. Configuration and hosting Set Up Your Site Configure Your Site Config Generator and Editor Configuration Config Validator Sources and content Your Content Objects Audio Objects Self-Hosted Images External IIIF Images Stories & Panels Rich Content with Markdown Markdown Syntax Reference Widgets PDF Documents Video Objects Data formats Your Data Project Columns Object Columns Story Columns Glossary Columns Reader features Site Features Objects Gallery Glossary Private Stories Custom Pages Embedding Telar Stories in LMS & Websites Appearance and navigation Customization Themes Customizing the Home Page Navigation Menu Configuration Demo Content Maintenance Upgrading Telar" + }, + "/guia/ensenar/": { + "ids": [ + "teaching-access-heading" + ], + "selectors": { + "h1": [ + "Enseñar con Telar" + ], + "h2": [ + "Usa el Compositor con tu clase", + "Durante el taller", + "Planeación narrativa", + "Del ejercicio a la exhibición", + "Compartir el trabajo" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Enseñar con Telar Planea un taller o un proyecto de clase que empiece por las fuentes y las preguntas que tus estudiantes quieren explorar. Usa el Compositor con tu clase El modo docente permite compartir una colección de objetos con la clase, trabajar en sitios de grupos de estudiantes y revisar sus exhibiciones desde un espacio de curso. El acceso se habilita por solicitud. Cuéntanos sobre tu curso o taller para que podamos ayudarte a comenzar. Solicita acceso al modo docente Cómo funcionan los cursos → Durante el taller Comparte el acceso corto y usa los seis pasos para acompañar la creación de una primera historia. Guía rápida · /empezar → Planeación narrativa Combina las diapositivas con el planeador para ordenar preguntas, fuentes y capas antes de editar. Diapositivas ↗ Planeador ↓ Del ejercicio a la exhibición La guía de planeación ayuda a definir el público, la pregunta central y las fuentes de un proyecto. Los proyectos hechos con Telar permiten conversar sobre decisiones narrativas concretas. Compartir el trabajo Insertar una exhibición en Canvas Entender las historias privadas Trabajar con el Compositor" + }, + "/docs/plan/exhibition-layout/": { + "ids": [ + "arrange-the-whole-exhibition", + "choose-a-manageable-first-version", + "decide-how-stories-relate", + "decide-what-the-homepage-introduces", + "media-public-home-docs-plan-exhibition-layout", + "offer-other-ways-into-the-sources", + "sketch-the-navigation" + ], + "selectors": { + "h1": [ + "Arrange the whole exhibition" + ], + "h2": [ + "Decide what the homepage introduces", + "Decide how stories relate", + "Offer other ways into the sources", + "Sketch the navigation", + "Choose a manageable first version" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [ + [ + "/assets/manual/tutorials/en-public-home.jpg", + "The full exhibition homepage with introduction, story cards, featured objects and navigation." + ] + ] + }, + "text": "Arrange the whole exhibition An exhibition includes its homepage, stories, objects, glossary and supporting pages. Plan how someone will find a route through them before polishing individual screens. Decide what the homepage introduces State the exhibition's subject, its guiding question and who made it. Offer enough context to choose a story without reproducing the whole introduction to every story. Give story cards distinct titles and useful subtitles. Put the suggested starting story first when order matters. If stories can be read independently, make that clear. A complete homepage connects the introduction, story choices and object collection. Open the full-size image to examine the layout. Open full-size screenshot ↗ Decide how stories relate Use one story for a continuous argument or guided examination. Split material into several stories when each has a distinct question, audience or source group. Write a one-sentence description of each story's role. If two descriptions are interchangeable, reconsider the division. If a later story depends on earlier knowledge, explain or link that relationship. Offer other ways into the sources The objects gallery supports browsing beyond the guided narratives. Meaningful titles, credits, descriptions and consistent metadata help visitors understand what they find there. The glossary provides recurring context. An About or methodology page can explain contributors, research choices, source selection and acknowledgements without interrupting every story. Sketch the navigation List the menu entries and the page each should open. Keep the list short enough to understand at a glance. Use names that describe the destination. In the Compositor, arrange the menu in Home and Pages and adjust homepage and collection display in Site settings . With files, the navigation lives in _data/navigation.yml ; see navigation reference . Choose a manageable first version Build one complete route through the exhibition first: homepage → story → source or panel → ending. Then add the other stories and supporting pages. Your result: a simple site map, ordered story list and homepage outline. Next, test the exhibition with readers ." + }, + "/docs/plan/sources-and-framing/": { + "ids": [ + "choose-sources-and-framing", + "keep-a-source-register", + "pair-each-step-with-a-view", + "plan-images-documents-and-recordings", + "write-the-description-alongside-the-interpretation" + ], + "selectors": { + "h1": [ + "Choose sources and framing" + ], + "h2": [ + "Keep a source register", + "Pair each step with a view", + "Plan images, documents and recordings", + "Write the description alongside the interpretation" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Choose sources and framing Choose a view because it helps visitors examine the question in that step. A closer view is useful when it reveals evidence; an overview is useful when the relationship between details matters. Keep a source register For each object, record its title, creator when known, date or period, holding institution, catalogue address and credit. Keep the IIIF manifest address separately from the catalogue page: the former supplies the image; the latter gives readers its context. Note what you can publish and any uncertainties in attribution or interpretation. For your own material, keep the original file as well as the copy prepared for the exhibition. Pair each step with a view Add three notes to each question in your plan: Which object, page or time segment will visitors see? Which detail should they notice? What does the short answer help them understand about it? You can return to the same object several times. Changing the framing can build an argument without introducing a new source at every step. Use a wider view when moving between distant details so visitors can understand their relationship. Plan images, documents and recordings For a multi-page document, choose the page before choosing the framing. For video or audio, identify a segment and write down the proposed start and end. Check whether the segment needs a transcript or other explanation. The khipu walkthrough demonstrates the full image workflow: add the manifest, select that khipu in a story step, frame the khipu and capture the position. The source shown in the framing step must match the object you added. Write the description alongside the interpretation Describe the relevant visible or audible details in the step's alternative text or accompanying prose. Do not rely on \"look here\" or colour alone to identify the evidence. Test the view at a smaller window size. A tiny label that you can read on your own monitor may need a closer view, a transcription or an explanation in text. Your result: a source register and a proposed view or segment for every step. Next, decide what belongs in panels and the glossary ." + }, + "/docs/the-compositor/iiif-to-story/": { + "ids": [ + "choose", + "context", + "fetch", + "frame", + "manifest-url", + "media-editor-overview-docs-the-compositor-iiif-to-story", + "media-framing-docs-the-compositor-iiif-to-story", + "media-import-docs-the-compositor-iiif-to-story", + "metadata", + "open-import", + "problems", + "publish", + "use-an-iiif-object-in-a-story" + ], + "selectors": { + "h1": [ + "Use an IIIF object in a story" + ], + "h2": [ + "1. Open the import dialog", + "2. Fetch the manifest", + "3. Review the object", + "4. Use it in a step", + "5. Capture the framing", + "6. Add context", + "7. Publish and check", + "If something goes wrong" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "https://juancobo.com/138la/iiif/khipu/p7/manifest.json" + ], + "table": [], + "blockquote": [], + "img": [ + [ + "/assets/manual/tutorials/en-import-poster.jpg", + "The IIIF dialog moves from an empty URL to the pasted manifest and the fetched khipu preview." + ], + [ + "/assets/manual/tutorials/en-editor-overview.jpg", + "The story outline, step card and khipu viewer in the Compositor." + ], + [ + "/assets/manual/tutorials/en-framing-poster.jpg", + "The khipu view changes, then Capture position confirms that it has been captured." + ] + ] + }, + "text": "Use an IIIF object in a story Connect an image held elsewhere to your exhibition, choose it for a story step and capture the view you want visitors to see. Before you begin: a site and a story you can edit Example: a khipu IIIF manifest If the khipu is already in your collection, go straight to Use it in a step . Three separate actions: adding an object makes it available in the Compositor. Choosing it in a step brings it into your story. Publishing sends your changes to the repository so your site can rebuild. In this guide Open the import dialog Fetch the manifest Review the object Use it in a step Capture the framing Add context Publish and check If something goes wrong 1. Open the import dialog Open Objects , choose + Add object , then select IIIF manifest . An IIIF manifest describes an object and tells the viewer where to load its images. Use the manifest address supplied by the collection. 2. Fetch the manifest Paste this example into IIIF manifest URL , then choose Fetch manifest . https://juancobo.com/138la/iiif/khipu/p7/manifest.json Copy manifest URL Wait for the preview to load. This example is labelled \"Haptic khipu — Taking a sample from the khipu for radio-carbon dating, Spring 2025\". 3. Review the object Review Title , Creator , Year , Description , Source and Credit . The provider may supply only some of them. Retain the source and credit information and fill any gaps from reliable cataloguing information. Scroll within the dialog to review the remaining fields. The interface language does not translate the metadata supplied by a manifest. You can review the wording for your exhibition. Paste the manifest, fetch it, then check the returned khipu and metadata. Adding the object is a separate action. Play steps Open full-size screenshot ↗ Download GIF Choose Add object . The object should appear in your collection. Open its record to check the image and add a Description for accessibility . 4. Use it in a step Open Stories and choose the story you want to edit. Choose + Add step . If the new-step dialog offers to keep the previous object, choose Choose another object . Select the khipu from the object picker. You can also use Change object on an existing step. The step should now show the imported image. Write a question and a short answer. For this exercise, you could use: Question: Which activity does this image document? Answer: Sampling a khipu for radiocarbon dating in spring 2025. These sentences describe this example. Your own story should develop the questions you want your visitors to explore. The outline is on the left, the step text in the centre and the object on the right. Capture position records the view for the selected step. Open full-size screenshot ↗ 5. Capture the framing Pan and zoom to the detail you want to show. Use the framing guides to understand the area the step will preserve. Choose Capture position . Check that the control confirms Captured . Capture after framing. Moving the viewer lets you explore the object. Capture position records the view for this step. Capture it again if you change the framing you want to preserve. Move to another step and return. Check that the saved framing is the one you intended. Adjust the view, choose Capture position and look for Captured. The same khipu is shown throughout. Play steps Open full-size screenshot ↗ Download GIF 6. Add context On the step card, choose + Add panel . If the step already has a panel, open it using its panel button. Use the editing icons for the panel title and text to write your content. For example, explain how the image supports your question and link to the object's source. Keep the brief answer readable on the step card. Use panels for the detail that helps visitors understand the evidence. 7. Publish and check Open Publish and review the changes. Resolve any errors that block publication and review the warnings before publishing. Once the site build completes, open the published story and check: The correct object appears in the new step. Its framing shows the detail you captured. The question, answer and panel read correctly. The object's source, credit and accessibility description are appropriate. If something goes wrong The manifest does not load. Check the complete address and try opening it in a browser. The address should return an IIIF manifest. A catalogue-page URL or an image-file URL is a different resource. Metadata is missing. Review the collection's catalogue and complete the relevant fields. Imported metadata depends on what the provider supplies. The image works in Objects but is absent from the story. Open the step and check its selected object. The published framing is different. Reframe the step, choose Capture position , then publish and check the completed build. The live site still shows the previous content. Check the publishing and build status. Editing the draft and publishing it are separate operations. Review the proposed screencast and its exact captions →" + }, + "/guia/el-compositor/solucionar-problemas/": { + "ids": [ + "el-editor-cambió-pero-el-sitio-no", + "falta-un-control-o-se-rechaza-una-acción", + "github-tiene-otro-contenido", + "hay-un-objeto-o-encuadre-incorrecto", + "recupera-una-historia-que-no-aparece", + "resuelve-problemas-y-recupera-historias" + ], + "selectors": { + "h1": [ + "Resuelve problemas y recupera historias" + ], + "h2": [ + "El editor cambió, pero el sitio no", + "Hay un objeto o encuadre incorrecto", + "GitHub tiene otro contenido", + "Recupera una historia que no aparece", + "Falta un control o se rechaza una acción" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Resuelve problemas y recupera historias Identifica primero qué versión estás viendo: el contenido guardado en el editor, los archivos de GitHub o el sitio público generado. Cada una requiere una corrección distinta. El editor cambió, pero el sitio no Guardar conserva el contenido en el Compositor. Publica los cambios y espera a que termine el build. Si la publicación terminó pero el build falló, revisa el error en lugar de publicar repetidamente los mismos cambios. Confirma el repositorio y el idioma en el encabezado y abre la dirección pública desde el proyecto. Una pestaña puede seguir mostrando una versión anterior; recárgala después del build exitoso. Hay un objeto o encuadre incorrecto Abre el objeto y revisa su dirección de origen. Una ficha de catálogo no es un manifiesto IIIF. Usa Obtener manifiesto para comprobar la dirección y revisa la vista previa antes de agregar otro objeto. Si la historia muestra otra imagen, selecciona el objeto correcto en ese paso. Si muestra la imagen correcta con otra vista, elige la página del documento cuando corresponda, ajusta el encuadre y usa Capturar posición . Espera la confirmación y vuelve a visitar el paso. GitHub tiene otro contenido Abre Cambios en GitHub y revisa los elementos afectados. Decide qué versión conservar en cada caso. La revisión conserva el trabajo sin publicar que solo existe en el editor; no es una orden para descartarlo todo. Si Google Sheets está activo, revisa si un build descargó contenido de la hoja. Decide qué método alimentará los próximos builds antes de volver a editar ambas copias. Recupera una historia que no aparece Si hay archivos de historias en GitHub que no están en el Compositor, Inicio puede ofrecer a la persona responsable Restaurar como borradores . La restauración lee esos archivos y trae las historias como borradores. Lee los avisos, abre cada historia y revisa sus pasos y referencias a paneles antes de habilitarla para publicar. Ignorar descarta esta opción de recuperación para las historias detectadas. No equivale a eliminar sus archivos de GitHub. Falta un control o se rechaza una acción Confirma tu rol y consulta el equipo y el acceso al repositorio . Algunos controles corresponden a la persona responsable; los de pertenencia a un curso se administran desde el curso. Para pedir ayuda, anota la dirección del proyecto, la acción intentada, el error visible y si ocurre al editar, publicar o generar el sitio. Comparte esos datos con quien mantiene el proyecto o en un reporte de Telar . Excluye claves de acceso y contenido privado." + }, + "/guia/google-sheets/": { + "ids": [], + "selectors": { + "h1": [ + "Manual de Google Sheets" + ], + "h2": [ + "Cómo se organiza la hoja de cálculo", + "Cómo funciona", + "Antes de comenzar", + "En este manual", + "Referencia para tu trabajo" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Manual de Google Sheets La autoría con Google Sheets te permite crear una exhibición en Telar desde una hoja de cálculo compartida. Registras tus fuentes, organizas los pasos de las historias y escribes los textos en filas y columnas; Telar lee ese contenido y genera el sitio web. Esta forma de trabajo es útil si prefieres editar en una hoja de cálculo, revisar varios registros a la vez o escribir con un equipo. La hoja reúne el contenido narrativo y los metadatos. Las imágenes y los demás medios se cargan desde sus direcciones de origen o desde los archivos del sitio. Cómo se organiza la hoja de cálculo objects reúne el catálogo de fuentes, con sus descripciones, créditos y direcciones. project enumera las historias y define su orden en la exhibición. Cada historia tiene su propia pestaña. Cada fila corresponde a un paso y relaciona el texto con un objeto, su encuadre y sus paneles. glossary define términos que puedes enlazar desde los textos. Cómo funciona Prepara el sitio y la hoja. Crea un repositorio de Telar en GitHub, copia la plantilla de Google Sheets y conecta su dirección publicada con el sitio. Escribe y organiza. Registra objetos, agrega historias y pasos, y desarrolla los textos. Usa el visor del sitio para elegir los encuadres. Genera y revisa. Ejecuta el proceso de generación en GitHub para incorporar el contenido actualizado de la hoja. Abre el sitio y comprueba el resultado. Editar una celda no actualiza de inmediato el sitio público. Cada generación lee la versión publicada de la hoja y produce una nueva versión de la exhibición. Antes de comenzar Necesitas cuentas de Google y GitHub. La configuración guiada te acompaña desde la copia de las plantillas hasta la conexión del sitio y genera el archivo de configuración. Si todavía estás desarrollando la narrativa, empieza por Planear una exhibición . En este manual Configura con Google Sheets Configuración manual Entiende la hoja de cálculo Agrega un objeto y una primera historia Encuadra, revisa y publica desde Sheets Referencia para tu trabajo Archivos y columnas Fuentes y contenido Configuración del sitio" + }, + "/docs/plan/review/": { + "ids": [ + "ask-someone-to-try-it", + "prepare-the-version-you-will-share", + "rehearse-the-main-route", + "test-other-ways-of-reading", + "test-the-exhibition-with-readers" + ], + "selectors": { + "h1": [ + "Test the exhibition with readers" + ], + "h2": [ + "Rehearse the main route", + "Ask someone to try it", + "Test other ways of reading", + "Prepare the version you will share" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Test the exhibition with readers A successful build shows that the site was generated. A reader test shows whether the exhibition makes sense to someone encountering it for the first time. Do both before sharing it widely. Rehearse the main route Start at the homepage without using your editor bookmarks. Choose a story, follow every step and reach the ending. Check that each source appears at the intended page, framing or time segment. Read the question and answer against that view. Open all panels and glossary links, then return to the story. Ask someone to try it Give a reader a small task: find the first story, explain what changed between two views, or locate the source behind a claim. Observe before explaining the interface. Ask what they noticed, what they understood and where they lost the thread. Separate an interface problem from an interpretation that needs rewriting. Revise, then try the changed passage again. Test other ways of reading Use a narrow window and a phone if one is available. Navigate with the keyboard and check that links and controls have a visible focus. Read alternative text and transcripts alongside the visual and audio material. Check text size, contrast and button wording. Follow external source links and verify credits. Check the interface language and any text the site supplies automatically. If a source fails, test its catalogue page and manifest independently. If the framing is wrong, return to that step and capture or copy the intended view again. Prepare the version you will share Remove unfinished material from the publication route. In the Compositor, a draft is excluded from publication; making a story private is a different choice and uses a key. Verify the published result, not only the editor. Record the public address, the date tested and any known limitations. Keep the source files and a short note explaining how to rebuild the exhibition. Your result: a tested first edition and a short list of improvements for the next one. Choose the Compositor , Google Sheets or local authoring manual for the build process." + }, + "/docs/plan/layers-and-glossary/": { + "ids": [ + "give-each-panel-a-purpose", + "media-panels-docs-plan-layers-and-glossary", + "plan-panels-and-glossary-links", + "review-optional-routes", + "use-the-glossary-for-recurring-context", + "write-the-short-answer-first" + ], + "selectors": { + "h1": [ + "Plan panels and glossary links" + ], + "h2": [ + "Write the short answer first", + "Give each panel a purpose", + "Use the glossary for recurring context", + "Review optional routes" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [ + [ + "/assets/manual/tutorials/en-panels-poster.jpg", + "A story step opens its contextual panel alongside the main card." + ] + ] + }, + "text": "Plan panels and glossary links Keep the main route readable, then offer further context where readers may want it. Panels belong to a particular step; glossary entries explain terms that can recur across the exhibition. Write the short answer first Answer the step's question in a sentence or two. Keep the observation and the inference distinct: what does the source show, and what do you argue it means? Read the questions and answers without opening anything else. If an essential explanation is missing, bring it into this main route before adding optional detail. Give each panel a purpose A first panel might explain the source's making, introduce a comparison or show the evidence behind an interpretation. A second panel opens from the first and can develop that discussion further. In the planner, draw the first branch from its question and the second branch from the first panel. This represents how readers encounter them: step → first panel → second panel. Choose a button label that tells visitors what they will find. \"How the sample was taken\" is more informative than repeating \"More\" everywhere. A panel need not contain every piece of research you collected. Open the step's panel to develop its context. This example uses the existing map-and-painting story. Play steps Open full-size screenshot ↗ Download GIF Use the glossary for recurring context Define a term when its explanation will help more than one passage. Keep the definition understandable on its own; link related entries where useful. For example, a story about a khipu may need a short explanation of the term and a panel about the particular activity shown in one photograph. These serve different purposes. The link syntax is [[term-id]] , or [[term-id|visible text]] when the sentence needs different wording. The Compositor also provides an insertion control. Review optional routes Open each panel and glossary link in the order a reader would encounter them. Check that the title, button and first paragraph agree. Make it clear which source supports a claim and where a comparison comes from. Your result: short answers, purposeful panel outlines and a list of shared terms. Next, arrange the exhibition as a whole ." + }, + "/guia/planear/revision/": { + "ids": [ + "invita-a-alguien-a-probarla", + "prepara-la-versión-que-vas-a-compartir", + "prueba-la-exhibición-con-lectores", + "prueba-otras-formas-de-lectura", + "recorre-el-hilo-principal" + ], + "selectors": { + "h1": [ + "Prueba la exhibición con lectores" + ], + "h2": [ + "Recorre el hilo principal", + "Invita a alguien a probarla", + "Prueba otras formas de lectura", + "Prepara la versión que vas a compartir" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Prueba la exhibición con lectores Que el sitio se genere sin errores no garantiza que se entienda. Antes de difundirlo, pide a otras personas que lo prueben para comprobar si tiene sentido para quien lo ve por primera vez. Recorre el hilo principal Entra al sitio publicado por la página de inicio, no por los enlaces que guardaste mientras editabas. Elige una historia y recórrela paso a paso hasta el final, como lo haría alguien que llega por primera vez. Comprueba que cada fuente aparezca en la página, encuadre o fragmento previsto. Lee la pregunta y respuesta frente a esa vista. Abre todos los paneles y enlaces del glosario y vuelve a la historia. Invita a alguien a probarla Propón una tarea pequeña: encontrar la primera historia, explicar qué cambia entre dos vistas o localizar la fuente de una afirmación. Observa antes de explicar la interfaz. Pregunta qué notó, qué entendió y dónde perdió el hilo. Distingue un problema de interfaz de una interpretación que necesita reescritura. Revisa el pasaje y vuelve a probarlo. Prueba otras formas de lectura Usa una ventana estrecha y un teléfono, si tienes uno disponible. Navega con el teclado: al pasar de un enlace o un control a otro, debe verse en cuál estás, por ejemplo con un borde resaltado. Lee el texto alternativo y las transcripciones junto a los materiales visuales y sonoros. Revisa tamaño del texto, contraste y nombres de botones. Abre los enlaces externos de las fuentes y verifica los créditos. Revisa el idioma de la interfaz y los textos que el sitio aporta automáticamente. Si una fuente no carga, prueba por separado la ficha de catálogo y el manifiesto. Si falla el encuadre, vuelve al paso y captura o copia de nuevo la vista prevista. Prepara la versión que vas a compartir Retira del recorrido público el material incompleto. Una historia marcada como Borrador no aparece en el índice de historias del sitio, pero sus archivos CSV pueden escribirse en el repositorio de GitHub cuando publicas. Privada es un estado distinto: cifra el contenido de la historia y pide una clave para leerlo. Revisa el resultado en el sitio publicado, no solo en el editor. Registra la dirección pública, la fecha de las pruebas y las limitaciones conocidas. Conserva los archivos fuente y una nota breve sobre cómo volver a generar la exhibición. Resultado: una primera versión probada y una lista breve de mejoras. Si necesitas ayuda para construirla o corregirla, consulta el manual del Compositor , de Google Sheets o de autoría local ." + }, + "/docs/the-compositor/troubleshooting/": { + "ids": [ + "a-control-is-missing-or-an-action-is-refused", + "an-object-or-framing-is-wrong", + "github-has-different-content", + "resolve-problems-and-recover-stories", + "restore-an-unlisted-story", + "the-editor-changed-but-the-site-did-not" + ], + "selectors": { + "h1": [ + "Resolve problems and recover stories" + ], + "h2": [ + "The editor changed but the site did not", + "An object or framing is wrong", + "GitHub has different content", + "Restore an unlisted story", + "A control is missing or an action is refused" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Resolve problems and recover stories First identify which version you are looking at: the editor's saved content, the files on GitHub or the built public site. Each has a different route to a correction. The editor changed but the site did not Saving content keeps it in the Compositor. Publish the changes, then wait for the site's build to finish. If the publication succeeded but the build failed, read the build error rather than repeatedly publishing the same changes. Check the repository and language in the header, then open the public address from the project. A browser tab may still show an older page; reload it after the successful build. An object or framing is wrong Open the object and check its source address. A catalogue page is not an IIIF manifest. Use Fetch Manifest to check the address and verify the preview before adding a new object. If the story shows the wrong image, select the intended object in that step. If it shows the right image at the wrong view, choose the correct document page where relevant, adjust the framing and use Capture position . Wait for the captured confirmation, then revisit the step. GitHub has different content Use Changes on GitHub and review the affected items. Choose which version to keep for each one. The review preserves editor-only unpublished work; it is not a command to discard everything in the editor. If Google Sheets is enabled, check whether a build fetched content from the sheet. Decide which authoring method will supply future builds before editing both copies again. Restore an unlisted story When story files exist on GitHub but are missing from the Compositor, Start can offer the convenor Restore as drafts . Restoration reads those files and brings the stories into the editor as drafts. Read any warnings, open the restored story and inspect its steps and panel references before making it publishable. Ignore dismisses this recovery route for the detected stories. It is not the same as deleting their files from GitHub. A control is missing or an action is refused Check your project role and the team and repository access guide . Some controls belong to the convenor, and course membership controls come from the course. For help, record the project address, the action you attempted, the visible error and whether the problem affects the editor, publication or build. Share those details with the maintainer or in a Telar issue . Exclude access keys and private content." + }, + "/docs/plan/": { + "ids": [ + "audience", + "exercise", + "next", + "purpose", + "sources" + ], + "selectors": { + "h1": [ + "Begin with what you want people to notice." + ], + "h2": [ + "1. Turn a topic into a question", + "2. Picture your visitors", + "3. Read your sources before arranging them", + "4. Draft a brief you can build from", + "Next: sketch the narrative arc" + ], + "h3": [ + "What is there?", + "What does it raise?" + ], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Chapter 1 · Purpose, audience and sources Begin with what you want people to notice. An exhibition brings sources and interpretation together. Before choosing an editor, decide what you want visitors to explore and which materials can help them do it. By the end of this chapter You will have a short exhibition brief: a guiding question, an intended audience and a small set of sources to examine. 1. Turn a topic into a question A topic gives your exhibition a subject. A question gives visitors a reason to look closely. Start with something that can be explored through your materials. An example to think with Topic A painting of the Bogotá savanna. Possible guiding question What can this painting help us understand about people and land? This is a possible starting question, not a finished interpretation. The details you examine will shape the argument. Write the idea you want visitors to leave with, even if it is provisional. Then consider which questions could help them reach it. The opening should give them a way in; the ending should return to what the exhibition has helped them see. 2. Picture your visitors Imagine someone arriving without the knowledge you bring to the material. What can they recognise? What will need an introduction? Which words or assumptions could get in the way? For whom are you making this exhibition? What context will they need before the first close look? What should they be able to notice or explain afterwards? Use those answers to choose your opening, your language and the amount of context you offer. A glossary can explain recurring terms; a panel can develop the context of a particular step. 3. Read your sources before arranging them Choose a manageable starting set: an image, a document, an audio recording, a video, or a few related items. You can return to the same source in more than one step. Look and listen closely. Note significant elements, how they relate to one another, the questions they raise and what remains uncertain. Connect each possible observation to a detail you can actually show. What is there? People, words, symbols, sounds, gestures, arrangements and absences. What does it raise? Questions about making, use, audience, time, place and interpretation. Keep the source address, catalogue information and credit alongside your notes. Identify what can be shared and what needs further checking. Mark uncertain interpretations as questions to investigate. 4. Draft a brief you can build from On paper or in a document, finish these four prompts: My exhibition asks... State one guiding question. I am making it for... Name your intended audience and the context they will need. I will work with... List a small starting set of sources and the details worth examining. By the end, visitors should... Describe an understanding or observation your exhibition can help develop. Keep this provisional. Planning is iterative. As you examine the sources and try the story with readers, revise the question, the sequence and the conclusion. Next: sketch the narrative arc Turn your brief into an opening, a sequence of questions and an ending. Continue with the narrative arc , then connect each step to a source view, plan optional layers and arrange the whole exhibition. The narrative planner gives you a beginning and ending to build between. The workshop slides demonstrate how to add questions, sources and layers. Sketch the narrative arc →" + }, + "/guia/autoria-local/": { + "ids": [], + "selectors": { + "h1": [ + "Autoría local" + ], + "h2": [ + "Los archivos con los que trabajas", + "Cómo funciona", + "Antes de comenzar", + "En este manual", + "Referencia para tu trabajo" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Autoría local La autoría local consiste en editar los archivos de tu exhibición en tu computador y generar allí una vista previa. Trabajas con archivos CSV y Markdown en el editor que prefieras y usas las herramientas de Telar para convertirlos en un sitio web. Elige esta forma de trabajo si quieres acceso directo a los archivos, personalizar el sitio o controlar el proceso de generación y el alojamiento. El resultado es un sitio estático que puedes publicar en GitHub Pages o en otro servidor web. Los archivos con los que trabajas CSV: tablas en texto plano para el catálogo de objetos, la lista de historias, los pasos y el glosario. Markdown: archivos de texto para paneles extensos, entradas del glosario y páginas de apoyo. Archivos de medios: imágenes y otros materiales que alojas en tu sitio. También puedes referenciar objetos IIIF y medios alojados en otras colecciones. Configuración: archivos que definen el título, el idioma, el tema y la navegación del sitio. Cómo funciona Prepara una copia local. Obtén los archivos de Telar e instala las herramientas necesarias para generar el sitio. Edita y previsualiza. Agrega las fuentes, escribe las historias y genera una vista previa en tu navegador. Repite este proceso para revisar los encuadres, los textos y los enlaces. Publica. Envía los cambios al repositorio de GitHub para generar el sitio público o aloja los archivos generados en el servidor que elijas. La vista previa local te permite revisar el trabajo antes de publicarlo. Conserva los archivos de autoría: son la fuente para las revisiones y las futuras versiones del sitio. Antes de comenzar Debes poder trabajar con carpetas, editar archivos de texto y ejecutar comandos en una terminal. La guía de instalación explica las herramientas necesarias: Ruby, Python, Node.js y Git. Si todavía estás desarrollando la narrativa, empieza por Planear una exhibición . En este manual Instala y ejecuta Telar localmente Edita objetos, historias y textos Genera y revisa el sitio local Publica y mantén un proyecto local Referencia para tu trabajo Archivos y columnas Fuentes y contenido Configuración del sitio" + }, + "/guia/planear/capas-y-glosario/": { + "ids": [ + "dale-un-propósito-a-cada-panel", + "escribe-primero-la-respuesta-breve", + "media-panels-guia-planear-capas-y-glosario", + "planea-los-paneles-y-el-glosario", + "revisa-los-recorridos-opcionales", + "usa-el-glosario-para-el-contexto-recurrente" + ], + "selectors": { + "h1": [ + "Planea los paneles y el glosario" + ], + "h2": [ + "Escribe primero la respuesta breve", + "Dale un propósito a cada panel", + "Usa el glosario para el contexto recurrente", + "Revisa los recorridos opcionales" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [ + [ + "/assets/manual/tutorials/es-panels-poster.jpg", + "Un paso abre su panel contextual junto a la tarjeta principal." + ] + ] + }, + "text": "Planea los paneles y el glosario Mantén claro el hilo principal y ofrece contexto adicional donde el público pueda necesitarlo. Los paneles corresponden a un paso; las entradas del glosario explican términos que pueden aparecer en toda la exhibición. Escribe primero la respuesta breve Responde la pregunta en una o dos frases. Distingue la observación de la inferencia: ¿qué muestra la fuente y qué propones que significa? Lee las preguntas y respuestas sin abrir nada más. Si falta una explicación esencial, incorpórala al hilo principal antes de agregar detalles opcionales. Dale un propósito a cada panel Un primer panel puede explicar cómo se produjo una fuente, introducir una comparación o presentar la evidencia de una interpretación. El segundo se abre desde el primero y permite desarrollar esa discusión. En el planeador, dibuja la primera rama desde la pregunta y la segunda desde el primer panel. Así se representa el recorrido: paso → primer panel → segundo panel. Elige un botón que anticipe el contenido. \"Cómo se tomó la muestra\" orienta mejor que repetir \"Más\" en todos los pasos. No tienes que incluir en los paneles todo lo que investigaste. Abre el panel del paso para desarrollar el contexto. Este ejemplo usa la historia existente sobre el mapa y la pintura. Ver los pasos Ampliar captura ↗ Descargar GIF Usa el glosario para el contexto recurrente Define un término si la explicación ayudará en varios pasajes. La definición debe entenderse por sí sola; enlaza entradas relacionadas cuando resulte útil. Una historia sobre un khipu puede necesitar una explicación del término y un panel sobre la actividad que muestra una fotografía específica. Son funciones distintas. La sintaxis es [[id-del-termino]] , o [[id-del-termino|texto visible]] si la frase requiere otra expresión. El Compositor también ofrece un control para insertar estos enlaces. Revisa los recorridos opcionales Abre los paneles y enlaces del glosario en el orden en que los encontraría un lector. Comprueba que el título, el botón y el primer párrafo correspondan. Aclara qué fuente respalda cada afirmación y de dónde viene una comparación. Resultado: respuestas breves, esquemas de paneles con un propósito claro y una lista de términos compartidos. Sigue con la organización de toda la exhibición ." + }, + "/docs/the-compositor/glossary/": { + "ids": [ + "add-an-entry", + "change-an-id-or-a-kind-carefully", + "create-and-link-glossary-entries", + "link-it-from-a-story", + "media-glossary-docs-the-compositor-glossary", + "review-where-a-term-is-used" + ], + "selectors": { + "h1": [ + "Create and link glossary entries" + ], + "h2": [ + "Add an entry", + "Link it from a story", + "Review where a term is used", + "Change an ID or a kind carefully" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "[[khipu]] [[khipu|knotted cords]]" + ], + "table": [], + "blockquote": [], + "img": [ + [ + "/assets/manual/tutorials/en-glossary.jpg", + "A glossary term with its title, kind, ID, usage list, definition editor and reader preview." + ] + ] + }, + "text": "Create and link glossary entries Use the glossary for definitions and context that readers may need in more than one place. A term has an ID used in links, a title readers see, a kind and a definition. Add an entry Open Glossary in the main navigation. If you are the site's convenor, choose + New Term . Write a useful title and a definition that can stand on its own. Choose the kind: key term, primary source, person or entity, or place. Check How readers see this . The convenor adds and deletes entries and changes their IDs. Other team members can work on the content of existing entries. If the creation control is absent, ask your convenor to add the term. The ID connects links to this entry. Edit the definition in the middle and check the reader preview on the right. Open full-size screenshot ↗ Link it from a story In a panel's text editor, use Insert glossary link and search for the term. Choose custom link text when the sentence needs a different form. You can also write the link directly: [[khipu]] [[khipu|knotted cords]] The text before the vertical bar is the term ID, not its display title. Use the ID of the entry you created. Check the link in the preview and again on the published site. Review where a term is used The Used in list shows references in stories, pages and other terms. Open a reference to inspect its context before changing a definition that several passages rely on. A short definition works best when it answers the reader's immediate question. Place a longer discussion of one source in that step's panel and link to the glossary where shared context is needed. Change an ID or a kind carefully The convenor can change a term ID. The Compositor updates its internal links, but the public address changes on the next publication. Links shared outside the project will still point to the old address. Edit kinds lets the convenor add site-specific categories with an ID, a label shown in the panel and a heading for the glossary page. These labels should be in the exhibition's language. Deleting an entry leaves references to it unresolved. Use Used in first and replace or remove the links before publishing. Check your work: open the term from a story panel, verify the displayed wording and return to the same step. Then arrange the homepage and pages ." + }, + "/docs/the-compositor/courses/": { + "ids": [ + "add-teaching-staff", + "create-the-course-collection", + "give-students-a-class-code", + "manage-the-course-over-time", + "run-a-course-with-student-sites", + "understand-what-a-code-protects" + ], + "selectors": { + "h1": [ + "Run a course with student sites" + ], + "h2": [ + "Create the course collection", + "Give students a class code", + "Add teaching staff", + "Manage the course over time", + "Understand what a code protects" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Run a course with student sites A course shares an object collection with sites made by student groups. Each group works on its own exhibition; course staff can enter its site through the course screen. Course creation appears only for accounts with course access. If the option is absent, you can still create a normal exhibition site. Create the course collection When creating a project, choose the course option. Add the objects the class will work with and review their titles, credits and source addresses. Prepare a small sample narrative and the workshop quick guide before the session. Students need both a technical route and a question they can investigate with the materials. Open the course's management screen with its access password when prompted. Keep that password separate from the join codes you give students. Give students a class code Open Course , choose New code and select the class-code option. Add a label so you can distinguish sections and set an expiry where needed. Students enter this code when creating their site. The convenor of an existing site can also enter it in that site's settings. Joining attaches the site to the course and brings in its collection. A student group should join with its site, rather than treating a staff code as a class code. Add teaching staff Create a separate staff code for instructors. Whoever enters it joins as an instructor, so share it only with the intended teaching team. The course screen lists enrolled sites and their members. Open a site from that list to review its stories and help with authoring. Instructor access is tied to course membership. Manage the course over time Deactivate a code when it should admit no one else. Deactivation does not remove sites or staff who already joined. Removing a site from a course lets the group continue independently. The site keeps the objects it received as ordinary objects, and course staff lose their course-derived membership in that site. Review the confirmation before removing it. Understand what a code protects A join code controls course membership. It does not restrict access to externally hosted images. Those images remain on the servers their manifests point to; a class code or story key does not make a public image private. Check the material's publication conditions before sharing it through a course. Before the workshop: test the join process with a teaching example, confirm the object collection and give students the short guide link. Use planning an exhibition for the narrative exercise." + }, + "/docs/the-compositor/team/": { + "ids": [ + "check-repository-access", + "coordinate-edits-and-publication", + "invite-a-collaborator", + "understand-project-roles", + "work-with-a-team" + ], + "selectors": { + "h1": [ + "Work with a team" + ], + "h2": [ + "Invite a collaborator", + "Understand project roles", + "Check repository access", + "Coordinate edits and publication" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Work with a team Team members work on the same project in the Compositor. The project role and GitHub repository access are related but separate: someone may be able to edit in the Compositor while a GitHub invitation still needs attention. Invite a collaborator The convenor can use the project's team controls to choose + Invite Collaborator and enter a GitHub username. If that person already has a Compositor account, the project can be added to their account. Otherwise, the Compositor supplies an invitation link for you to share within 48 hours. Check the pending invitations list if they have not joined. Invite the account the person actually uses to sign in. A display name or email address is not a GitHub username. Understand project roles The convenor manages project membership and structural settings. A collaborator edits content and can publish, upload files and run an upgrade. An instructor receives editorial access through a course and has the same publishing rights. Some structural controls, including creating glossary entries and changing their IDs, belong to the convenor. Deletion controls also consider who created an item. The interface explains when your role cannot perform an action. Check repository access Open Repository access to see the GitHub status for each member. A pending invitation needs acceptance; an expired invitation can be reissued by the convenor. Members can accept their own invitation from this page or follow the GitHub invitation link if the Compositor cannot accept it. The convenor can add or withdraw repository access for other members where the controls allow it. Publishing uses the installed GitHub App. A successful Compositor publish does not by itself confirm that every member has accepted personal GitHub access. Coordinate edits and publication Wait for the collaboration connection to settle before starting. Agree who will edit a passage and who will publish the shared changes. Review the publication list together when several people have been working. Removing a collaborator takes away project access. Course instructors are managed through the course and cannot be removed individually while the site remains attached to it. Check your work: ask the collaborator to sign in, open the intended project and confirm their role. Continue with course projects if you are teaching a class." + }, + "/docs/the-compositor/settings/": { + "ids": [ + "adjust-appearance-and-site-settings", + "choose-one-content-source", + "decide-what-the-homepage-shows", + "media-preferences-docs-the-compositor-settings", + "media-theme-language-docs-the-compositor-settings", + "save-and-publish", + "set-the-identity-and-language", + "understand-the-convenors-settings" + ], + "selectors": { + "h1": [ + "Adjust appearance and site settings" + ], + "h2": [ + "Set the identity and language", + "Decide what the homepage shows", + "Understand the convenor's settings", + "Choose one content source", + "Save and publish" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [ + [ + "/assets/manual/tutorials/en-theme-language.jpg", + "Site theme swatches, logo field, exhibition language and hosting settings." + ], + [ + "/assets/manual/tutorials/en-preferences.jpg", + "Account Preferences with the English and Spanish interface-language options." + ] + ] + }, + "text": "Adjust appearance and site settings Use Site settings for the exhibition's identity, language, theme, display options and hosting address. The page distinguishes settings that every editor can change from those reserved for the convenor. Set the identity and language Review the site title, description, author and contact email. The title and description should agree with the homepage introduction. The site's language controls interface text supplied by Telar. Your account's language controls the Compositor interface. Changing either setting does not translate the content you wrote. Choose a theme from those available in your repository. The convenor can refresh the list when themes have changed on GitHub. Preview the result with your actual text and images. These settings affect the exhibition. The language here controls the site's interface; it does not translate your written content. Open full-size screenshot ↗ Decide what the homepage shows Story settings control story visibility on the homepage, the step indicator and object credits. Collection settings control browsing, the collection link, featured objects and whether objects or stories appear first. Use a story-led homepage when a guided route is the main invitation. Use collection mode when visitors should first explore a set of objects. Check the resulting homepage after publication. Understand the convenor's settings Only the convenor can change the hosting URL and base path, the story key, Google Sheets integration and inclusion of demo content. Other members can change editorial settings such as titles, theme and display options. Site URL is the domain, such as https://example.github.io . Base URL is the path, such as /my-exhibition ; leave it empty for a domain-root site. The story key is used for stories marked private. It is separate from the draft flag. Demo content is sample material; turn it off when it no longer belongs in your exhibition. An address change affects links throughout the site. Confirm the address and hosting arrangement before publishing it. Choose one content source If Google Sheets remains enabled, a build can fetch the sheet and replace the objects and stories you edited visually. Read the notice in settings. The Compositor's object-saving workflow switches the project to Compositor-managed content. Before switching methods, review the latest sheet content and the unpublished editor changes. The Compositor does not write your edits back to Google Sheets. Account → Preferences changes the Compositor's interface language. The exhibition's language is a separate site setting. Open full-size screenshot ↗ Save and publish Use Save Changes on the settings page and wait for confirmation. Then review the publication separately. Check the live homepage, menu and a story after the build completes. See publishing for the complete process." + }, + "/docs/local-authoring/publish/": { + "ids": [ + "keep-a-reproducible-source-copy", + "publish-and-maintain-a-local-project", + "publish-through-github-actions", + "publish-to-another-static-host", + "upgrade-in-a-separate-step" + ], + "selectors": { + "h1": [ + "Publish and maintain a local project" + ], + "h2": [ + "Publish through GitHub Actions", + "Publish to another static host", + "Keep a reproducible source copy", + "Upgrade in a separate step" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "python3 scripts/build_local_site.py --build-only python3 scripts/generate_iiif.py --base-url https://example.org/my-exhibition bundle exec jekyll build python3 scripts/encrypt_protected_stories.py" + ], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Publish and maintain a local project Keep the editable source and the published output distinct. Your source lets you revise the exhibition; the generated site is the edition visitors read. Publish through GitHub Actions Confirm url and baseurl in the configuration. Enable GitHub Pages with GitHub Actions as its source. Review the files you changed, commit the intended source files and push them to your repository. The template's deployment workflow processes content, generates media assets, builds the site and applies private-story encryption before deploying. Open Actions , inspect the run and wait for successful deployment. Then test the public address. A local preview is not evidence that deployment finished. Keep virtual environments, dependencies and temporary output out of the source commit. Review git status before committing. Publish to another static host The local helper generates IIIF addresses for its local preview. Do not upload that preview unchanged to a public host. For a standalone deployment, first run the complete build pipeline, then regenerate hosted-image addresses with the full public site address and rebuild: python3 scripts/build_local_site.py --build-only python3 scripts/generate_iiif.py --base-url https://example.org/my-exhibition bundle exec jekyll build python3 scripts/encrypt_protected_stories.py Replace the example address with the actual domain and path. Set url and baseurl to match. Upload the resulting _site/ directory to your host after the encryption command succeeds. Check any destination-conflict warnings before treating the build as ready. If you rebuild Jekyll afterwards, run encryption again before publishing private stories. See private stories for the full model. Keep a reproducible source copy Back up configuration, content, media and custom themes. Keep the dependency files and a note of the Telar version. External IIIF sources remain external dependencies; retain their catalogue and manifest addresses. Upgrade in a separate step Back up or commit your current work, read the release notes and follow upgrading Telar . Review changes before publishing, then retest a representative image, story, panel, glossary entry and any private story. Separate an upgrade from a large content revision where possible. That makes a failure easier to trace." + }, + "/guia/referencia/": { + "ids": [], + "selectors": { + "h1": [ + "Referencia" + ], + "h2": [ + "Configuración y alojamiento", + "Fuentes y contenido", + "Formatos de datos", + "Funciones de lectura", + "Apariencia y navegación", + "Mantenimiento" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Referencia Consulta formatos, contenido, configuración y funciones que comparten las tres formas de construir una exhibición. Para un recorrido paso a paso, elige uno de los manuales desde el menú. Aquí puedes ir directamente al tema que necesitas. Configuración y alojamiento Configura tu sitio Configura tu proyecto Generador y editor de configuración Configuración Validador de Configuración Fuentes y contenido Tu contenido Objetos Objetos de audio Imágenes autoalojadas Imágenes IIIF externas Historias y paneles Contenido enriquecido con Markdown Referencia de sintaxis de Markdown Widgets Documentos PDF Objetos de video Formatos de datos Tus datos Columnas del proyecto Columnas de objetos Columnas de historias Columnas del glosario Funciones de lectura Funciones del sitio Galería de objetos Glosario Historias privadas Páginas personalizadas Insertar historias de Telar en LMS y sitios web Apariencia y navegación Personalización Temas Personalizar la página de inicio Configuración del menú de navegación Contenido de demostración Mantenimiento Actualizar Telar" + }, + "/guia/el-compositor/equipo/": { + "ids": [ + "coordina-las-ediciones-y-la-publicación", + "entiende-los-roles", + "invita-a-otra-persona", + "revisa-el-acceso-al-repositorio", + "trabaja-en-equipo" + ], + "selectors": { + "h1": [ + "Trabaja en equipo" + ], + "h2": [ + "Invita a otra persona", + "Entiende los roles", + "Revisa el acceso al repositorio", + "Coordina las ediciones y la publicación" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Trabaja en equipo Los integrantes editan el mismo proyecto en el Compositor. El rol del proyecto y el acceso al repositorio de GitHub están relacionados, pero son distintos: alguien puede editar en el Compositor mientras tiene pendiente una invitación de GitHub. Invita a otra persona La persona responsable puede usar los controles del equipo para elegir + Invitar colaborador e ingresar el nombre de usuario de GitHub. Si esa persona ya tiene cuenta en el Compositor, el proyecto puede agregarse a su cuenta. De lo contrario, el Compositor proporciona un enlace que debes compartir antes de 48 horas. Revisa las invitaciones pendientes si todavía no se ha unido. Invita la cuenta que la persona usa para iniciar sesión. Su nombre visible o correo no son su nombre de usuario de GitHub. Entiende los roles La persona responsable , identificada como Coordinador/a , administra los integrantes y los ajustes estructurales. Un colaborador edita contenido y puede publicar, subir archivos y ejecutar una actualización. Un docente recibe acceso editorial mediante un curso y tiene los mismos permisos de publicación. Algunos controles estructurales, como crear entradas del glosario y cambiar sus IDs, corresponden a la persona responsable. La eliminación también tiene en cuenta quién creó el elemento. La interfaz indica cuándo tu rol no permite una acción. Revisa el acceso al repositorio Abre Acceso al repositorio para consultar el estado en GitHub de cada integrante. Las invitaciones pendientes deben aceptarse; la persona responsable puede renovar las vencidas. Cada integrante puede aceptar su invitación en esta página o abrirla en GitHub si el Compositor no logra aceptarla. La persona responsable puede agregar o retirar acceso de otros integrantes donde la interfaz lo permita. La publicación utiliza la aplicación de GitHub instalada. Publicar desde el Compositor no confirma que todos hayan aceptado su acceso personal a GitHub. Coordina las ediciones y la publicación Espera a que se establezca la conexión de colaboración antes de comenzar. Acuerden quién editará cada pasaje y quién publicará los cambios compartidos. Revisen juntos la lista de publicación cuando hayan trabajado varias personas. Retirar a alguien elimina su acceso al proyecto. Los docentes se administran desde el curso y no pueden retirarse individualmente mientras el sitio siga vinculado a él. Comprueba el resultado: pídele a la persona invitada que inicie sesión, abra el proyecto correcto y confirme su rol. Sigue con los proyectos de curso si vas a trabajar con una clase." + }, + "/docs/teaching/": { + "ids": [ + "teaching-access-heading" + ], + "selectors": { + "h1": [ + "Teaching with Telar" + ], + "h2": [ + "Use the Compositor with your class", + "During a workshop", + "Narrative planning", + "From exercise to exhibition", + "Sharing the work" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Teaching with Telar Plan a workshop or a classroom project that begins with sources and the questions your students want to explore. Use the Compositor with your class Teaching mode lets you share an object collection with a class, work with student-group sites and review their exhibitions from a course workspace. Access is enabled on request. Tell us about your course or workshop so we can help you get started. Request teaching-mode access How courses work → During a workshop Share the short link and use the six steps to guide the creation of a first story. Quick guide · /start → Narrative planning Combine the slides and planner to arrange questions, sources and layers before editing. Slides ↗ Planner ↓ From exercise to exhibition The planning guide helps define a project's audience, guiding question and sources. Projects made with Telar offer examples for discussing narrative choices. Sharing the work Embed an exhibition in Canvas Understand private stories Work with the Compositor" + }, + "/guia/el-compositor/cursos/": { + "ids": [ + "administra-el-curso", + "agrega-al-equipo-docente", + "comparte-un-código-de-clase", + "crea-la-colección-del-curso", + "entiende-qué-protege-el-código", + "organiza-un-curso-con-sitios-de-estudiantes" + ], + "selectors": { + "h1": [ + "Organiza un curso con sitios de estudiantes" + ], + "h2": [ + "Crea la colección del curso", + "Comparte un código de clase", + "Agrega al equipo docente", + "Administra el curso", + "Entiende qué protege el código" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Organiza un curso con sitios de estudiantes Un curso comparte una colección de objetos con los sitios de los grupos de estudiantes. Cada grupo construye su exhibición; los docentes pueden entrar a ella desde la pantalla del curso. La creación de cursos aparece solo en las cuentas con acceso a esa función. Si no ves la opción, puedes crear un sitio de exhibición normal. Crea la colección del curso Al crear un proyecto, elige la opción de curso. Agrega los objetos con los que trabajará la clase y revisa títulos, créditos y direcciones de las fuentes. Prepara una historia breve de ejemplo y la guía rápida del taller antes de la sesión. Los estudiantes necesitan un recorrido técnico y una pregunta que puedan investigar con los materiales. Abre la administración del curso con su contraseña de acceso cuando se solicite. Mantén esa contraseña separada de los códigos que compartes con los estudiantes. Comparte un código de clase Abre Curso , elige Nuevo código y selecciona la opción para la clase. Agrega una etiqueta que permita distinguir las secciones y define un vencimiento cuando corresponda. Los estudiantes ingresan el código al crear su sitio. La persona responsable de un sitio existente también puede ingresarlo en su configuración. Al unirse, el sitio queda vinculado al curso y recibe su colección. El grupo debe unir su sitio con el código de clase; no debe usar un código para docentes. Agrega al equipo docente Crea un código separado para docentes. Quien lo usa se une como docente, así que compártelo solo con el equipo previsto. La pantalla del curso enumera los sitios inscritos y sus integrantes. Abre un sitio desde esa lista para revisar historias y acompañar la autoría. El acceso docente depende de la pertenencia al curso. Administra el curso Desactiva un código cuando ya no deba admitir a nadie. Esto no retira los sitios ni docentes que ya se unieron. Sacar un sitio del curso permite que el grupo continúe por su cuenta. El sitio conserva como objetos normales los materiales que recibió y los docentes pierden el acceso derivado del curso. Lee la confirmación antes de retirarlo. Entiende qué protege el código El código controla quién se une al curso. No restringe el acceso a imágenes externas. Estas permanecen en los servidores de sus manifiestos; un código de clase o una clave de historia no vuelve privada una imagen pública. Revisa las condiciones de publicación del material antes de compartirlo mediante un curso. Antes del taller: prueba el ingreso con un ejemplo docente, confirma la colección y comparte el enlace corto de la guía. Usa la guía de planeación para el ejercicio narrativo." + }, + "/guia/el-compositor/glosario/": { + "ids": [ + "agrega-una-entrada", + "cambia-un-id-o-un-tipo-con-cuidado", + "crea-y-enlaza-entradas-del-glosario", + "enlázala-desde-una-historia", + "media-glossary-guia-el-compositor-glosario", + "revisa-dónde-se-usa" + ], + "selectors": { + "h1": [ + "Crea y enlaza entradas del glosario" + ], + "h2": [ + "Agrega una entrada", + "Enlázala desde una historia", + "Revisa dónde se usa", + "Cambia un ID o un tipo con cuidado" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "[[khipu]] [[khipu|cuerdas anudadas]]" + ], + "table": [], + "blockquote": [], + "img": [ + [ + "/assets/manual/tutorials/es-glossary.jpg", + "Un término del glosario con título, tipo, ID, usos, editor de definición y vista previa." + ] + ] + }, + "text": "Crea y enlaza entradas del glosario Usa el glosario para definiciones y contexto que puedan servir en varios lugares. Cada entrada tiene un ID para los enlaces, un título visible, un tipo y una definición. Agrega una entrada Abre Glosario en la navegación principal. Si eres responsable del sitio, elige + Nuevo término . Escribe un título claro y una definición que se entienda por sí sola. Elige el tipo: palabra clave, fuente primaria, persona o entidad, o lugar. Revisa la vista previa para lectores. La persona responsable agrega y elimina entradas y cambia sus IDs. Los demás integrantes pueden trabajar en el contenido de las entradas existentes. Si no aparece el control de creación, pídele a la persona responsable que agregue el término. El ID relaciona los enlaces con esta entrada. Edita la definición en el centro y revisa la vista del lector a la derecha. Ampliar captura ↗ Enlázala desde una historia En el editor de texto de un panel, usa Insertar enlace de glosario y busca el término. Elige un texto personalizado si la frase requiere otra expresión. También puedes escribir el enlace: [[khipu]] [[khipu|cuerdas anudadas]] Antes de la barra vertical va el ID, no el título visible. Usa el ID de la entrada que creaste. Revisa el enlace en la vista previa y después en el sitio publicado. Revisa dónde se usa La lista de usos muestra referencias en historias, páginas y otros términos. Abre cada referencia para revisar su contexto antes de cambiar una definición de la que dependen varios pasajes. Una definición breve debe resolver la duda inmediata del lector. Lleva una discusión extensa sobre una fuente al panel de ese paso y enlaza el glosario cuando necesites contexto compartido. Cambia un ID o un tipo con cuidado La persona responsable puede cambiar el ID. El Compositor actualiza sus enlaces internos, pero la dirección pública cambia al publicar. Los enlaces compartidos fuera del proyecto seguirán apuntando a la dirección anterior. Editar tipos permite agregar categorías propias con un ID, una etiqueta para el panel y un encabezado para la página del glosario. Escribe esas etiquetas en el idioma de la exhibición. Eliminar una entrada deja sus referencias sin resolver. Revisa primero dónde se usa y reemplaza o retira los enlaces antes de publicar. Comprueba el resultado: abre el término desde un panel, revisa el texto visible y vuelve al mismo paso. Sigue con el inicio y las páginas ." + }, + "/guia/autoria-local/publicar/": { + "ids": [ + "actualiza-por-separado", + "conserva-una-copia-reproducible", + "publica-en-otro-alojamiento-estático", + "publica-mediante-github-actions", + "publica-y-mantén-un-proyecto-local" + ], + "selectors": { + "h1": [ + "Publica y mantén un proyecto local" + ], + "h2": [ + "Publica mediante GitHub Actions", + "Publica en otro alojamiento estático", + "Conserva una copia reproducible", + "Actualiza por separado" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [ + "python3 scripts/build_local_site.py --build-only python3 scripts/generate_iiif.py --base-url https://ejemplo.org/mi-exhibicion bundle exec jekyll build python3 scripts/encrypt_protected_stories.py" + ], + "table": [], + "blockquote": [], + "img": [] + }, + "text": "Publica y mantén un proyecto local Distingue los archivos editables del resultado publicado. Las fuentes permiten revisar la exhibición; el sitio generado es la versión que consulta el público. Publica mediante GitHub Actions Confirma url y baseurl en la configuración. Activa GitHub Pages con GitHub Actions como fuente. Revisa los archivos modificados, confirma los cambios de las fuentes previstas y súbelos al repositorio. El flujo de la plantilla procesa contenido, genera recursos, construye el sitio y cifra las historias privadas antes de desplegarlo. Abre Actions , revisa la ejecución y espera la publicación exitosa. Prueba después la dirección pública. La vista previa local no demuestra que terminó el despliegue. Excluye del commit los entornos virtuales, dependencias y resultados temporales. Revisa git status antes de confirmar. Publica en otro alojamiento estático El script local genera direcciones IIIF para su vista previa. No subas esa vista sin cambios a un servidor público. Para una publicación independiente, ejecuta primero todo el proceso. Después genera las direcciones de imágenes con la dirección pública completa y reconstruye: python3 scripts/build_local_site.py --build-only python3 scripts/generate_iiif.py --base-url https://ejemplo.org/mi-exhibicion bundle exec jekyll build python3 scripts/encrypt_protected_stories.py Reemplaza la dirección por el dominio y la ruta reales. Haz corresponder url y baseurl . Sube _site/ al alojamiento después de que termine correctamente el cifrado. Revisa los avisos de conflicto de destinos antes de considerar listo el build. Si vuelves a ejecutar Jekyll, ejecuta de nuevo el cifrado antes de publicar historias privadas. Consulta las historias privadas para entender el modelo completo. Conserva una copia reproducible Respalda configuración, contenido, medios y temas propios. Conserva los archivos de dependencias y anota la versión de Telar. Las fuentes IIIF externas siguen siendo dependencias externas; guarda sus direcciones de catálogo y manifiesto. Actualiza por separado Respalda o confirma tu trabajo, lee las notas de versión y sigue la guía de actualización . Revisa los cambios antes de publicar. Prueba una imagen, historia, panel y entrada del glosario representativos, además de historias privadas si las hay. Separa la actualización de una revisión extensa del contenido cuando sea posible. Así será más fácil encontrar la causa de una falla." + }, + "/guia/el-compositor/configuracion/": { + "ids": [ + "ajusta-la-apariencia-y-la-configuración", + "decide-qué-muestra-el-inicio", + "define-la-identidad-y-el-idioma", + "elige-una-fuente-de-contenido", + "guarda-y-publica", + "media-preferences-guia-el-compositor-configuracion", + "media-theme-language-guia-el-compositor-configuracion", + "reconoce-los-ajustes-de-la-persona-responsable" + ], + "selectors": { + "h1": [ + "Ajusta la apariencia y la configuración" + ], + "h2": [ + "Define la identidad y el idioma", + "Decide qué muestra el inicio", + "Reconoce los ajustes de la persona responsable", + "Elige una fuente de contenido", + "Guarda y publica" + ], + "h3": [], + "h4": [], + "h5": [], + "h6": [], + "pre": [], + "table": [], + "blockquote": [], + "img": [ + [ + "/assets/manual/tutorials/es-theme-language.jpg", + "Los temas, el campo del logo, el idioma de la exhibición y los ajustes de alojamiento." + ], + [ + "/assets/manual/tutorials/es-preferences.jpg", + "Preferencias de la cuenta con las opciones de idioma de interfaz EN y ES." + ] + ] + }, + "text": "Ajusta la apariencia y la configuración Usa Configuración del sitio para la identidad, el idioma, el tema, las opciones de presentación y la dirección de alojamiento. La página distingue los ajustes editoriales de los reservados para la persona responsable. Define la identidad y el idioma Revisa título, descripción, autoría y correo de contacto. El título y la descripción deben corresponder a la presentación del inicio. El idioma del sitio controla los textos de interfaz que aporta Telar. El idioma de tu cuenta controla la interfaz del Compositor. Ninguno traduce el contenido que escribiste. Elige un tema disponible en el repositorio. La persona responsable puede actualizar la lista si los temas cambiaron en GitHub. Revisa el resultado con tus textos e imágenes. Estos ajustes afectan la exhibición. El idioma de esta página controla la interfaz del sitio; no traduce el contenido que escribiste. Ampliar captura ↗ Decide qué muestra el inicio Los ajustes de historias controlan su presentación en el inicio, el indicador de pasos y los créditos de objetos. Los de colección controlan la exploración, el enlace a la colección, los objetos destacados y si aparecen primero los objetos o las historias. Da prioridad a las historias si propones un recorrido guiado. Usa el modo de colección si el público debe comenzar explorando objetos. Revisa el inicio después de publicar. Reconoce los ajustes de la persona responsable Solo la persona responsable cambia el dominio y la ruta de alojamiento, la clave de historias, la integración con Google Sheets y la inclusión de contenido de demostración. Los demás integrantes pueden cambiar ajustes editoriales como títulos, tema y opciones de presentación. La URL del sitio es el dominio, por ejemplo, https://ejemplo.github.io . La URL base es la ruta, por ejemplo, /mi-exhibicion ; déjala vacía si el sitio ocupa la raíz del dominio. La clave se usa en historias privadas. Es distinta del estado de borrador. El contenido de demostración son ejemplos; desactívalo cuando ya no corresponda a tu exhibición. Cambiar la dirección afecta los enlaces del sitio. Confirma el alojamiento y la dirección antes de publicarlos. Elige una fuente de contenido Si Google Sheets sigue activo, un build puede descargar la hoja y reemplazar los objetos e historias que editaste visualmente. Lee el aviso de configuración. El proceso de guardar objetos en el Compositor cambia el proyecto a contenido gestionado por el Compositor. Antes de cambiar de método, revisa la última versión de la hoja y los cambios sin publicar. El Compositor no devuelve tus ediciones a Google Sheets. Cuenta → Preferencias cambia el idioma de la interfaz del Compositor. El idioma de la exhibición es un ajuste separado del sitio. Ampliar captura ↗ Guarda y publica Usa Guardar cambios en esta página y espera la confirmación. Revisa después la publicación por separado. Cuando termine el build, comprueba el inicio, el menú y una historia. Consulta el proceso de publicación ." + } +} diff --git a/migration/fixtures/showcase.json b/migration/fixtures/showcase.json new file mode 100644 index 0000000..7fdc72c --- /dev/null +++ b/migration/fixtures/showcase.json @@ -0,0 +1 @@ +{"projects":[{"id":"357km3mxkwmm","title":"Big Basin Redwoods State Park Digital History","url":"https://sevallos.github.io/bigbasinhistory/","description":"How concerned citizens, none of which were elites by any measure, founded California's oldest state park.","language":"en","context":"research","authorship":"individual","image":"https://sevallos.github.io/bigbasinhistory/iiif/objects/43573/full/600,360/0/default.jpg","author":"Gabriel Sevallos","approved_at":"2026-10-16T19:43:51Z"}]} \ No newline at end of file diff --git a/migration/inventory.json b/migration/inventory.json new file mode 100644 index 0000000..8d06c6b --- /dev/null +++ b/migration/inventory.json @@ -0,0 +1,2102 @@ +{ + "pages": [ + { + "source": "showcase.md", + "content_path": "content/en/showcase/_index.md", + "url": "/showcase/", + "lang": "en", + "type": "section", + "translationKey": "showcase", + "sha256": "1a0953a23ee80f3f48ba92a17eb6618381880c18c0bd5c5d60750330ff79600e" + }, + { + "source": "start.html", + "content_path": "content/en/start.md", + "url": "/start/", + "lang": "en", + "type": "guide", + "translationKey": "empezar", + "sha256": "62ff502656e87e60065460004589a6f74181732b70dee868125cae278bb36989" + }, + { + "source": "showcase-submit.es.md", + "content_path": "content/es/proyectos/compartir.md", + "url": "/proyectos/compartir/", + "lang": "es", + "type": "section", + "translationKey": "showcase-submit", + "sha256": "09664e36e5c767ef8978003366355ae359ea15f48483d539438da021948655c3" + }, + { + "source": "empezar.html", + "content_path": "content/es/empezar.md", + "url": "/empezar/", + "lang": "es", + "type": "guide", + "translationKey": "empezar", + "sha256": "951da86b6f2919a8aaae805839b2f6ce78ccaca5b25424d8fabb998565d8e54c" + }, + { + "source": "showcase.es.md", + "content_path": "content/es/proyectos/_index.md", + "url": "/proyectos/", + "lang": "es", + "type": "section", + "translationKey": "showcase", + "sha256": "51f68b74bd6494a5b7ace4cf93e8496dead394177ed3c6374e274094ef9e9590" + }, + { + "source": "showcase-submit.md", + "content_path": "content/en/showcase/submit.md", + "url": "/showcase/submit/", + "lang": "en", + "type": "section", + "translationKey": "showcase-submit", + "sha256": "9aed1ff14e797d47e1482b296e7f3e97eebdc94559b9dc28723bd5214ceaf3e6" + }, + { + "source": "guide-sketch/index.en.html", + "content_path": "content/en/guide-sketch/en/_index.md", + "url": "/guide-sketch/en/", + "lang": "en", + "type": "redirect", + "translationKey": "guide-sketch-index-html", + "sha256": "485a649d30f77342d1d85a311276758f1e4118584abfc97fe177b68aba62c21b" + }, + { + "source": "guide-sketch/quick.en.html", + "content_path": "content/en/guide-sketch/en/quick-start.md", + "url": "/guide-sketch/en/quick-start/", + "lang": "en", + "type": "redirect", + "translationKey": "guide-sketch-quick-html", + "sha256": "db35ac00443b3972ce4ba9d460f39d29e7abea450fddff89ba8195b1b6e77d5a" + }, + { + "source": "guide-sketch/plan.es.html", + "content_path": "content/es/guide-sketch/es/plan.md", + "url": "/guide-sketch/es/plan/", + "lang": "es", + "type": "redirect", + "translationKey": "guide-sketch-plan-html", + "sha256": "1c549c187af81ae512714f93c2519e7d4dc4a926ac9f175f5dbc25c41bb8599f" + }, + { + "source": "guide-sketch/index.es.html", + "content_path": "content/es/guide-sketch/es/_index.md", + "url": "/guide-sketch/es/", + "lang": "es", + "type": "redirect", + "translationKey": "guide-sketch-index-html", + "sha256": "58f7c23f0bf074ecc4976ddcb11c0ccb5d6a3a01181dae5948baa63f6221fc4d" + }, + { + "source": "guide-sketch/quick.es.html", + "content_path": "content/es/guide-sketch/es/quick-start.md", + "url": "/guide-sketch/es/quick-start/", + "lang": "es", + "type": "redirect", + "translationKey": "guide-sketch-quick-html", + "sha256": "b5f15eac86251e9850a973c102ff9a04b119bf33d5cbd8486b53a3bc533d6d73" + }, + { + "source": "guide-sketch/plan.en.html", + "content_path": "content/en/guide-sketch/en/plan.md", + "url": "/guide-sketch/en/plan/", + "lang": "en", + "type": "redirect", + "translationKey": "guide-sketch-plan-html", + "sha256": "ab6ee66d9f2b0a6bd0333bddb549c8a082c1288cf49ad1c7e8c9e60ee83d55e6" + }, + { + "source": "docs/4-1-objects.md", + "content_path": "content/en/docs/your-content/objects.md", + "url": "/docs/your-content/objects/", + "lang": "en", + "type": "guide", + "translationKey": "docs-your-content-objects", + "sha256": "ead1eb40347b790eb4fc587affb897d7ad800c9ddfb321933c9db268964b3a8f" + }, + { + "source": "docs/4-5-rich-content.md", + "content_path": "content/en/docs/your-content/rich-content.md", + "url": "/docs/your-content/rich-content/", + "lang": "en", + "type": "guide", + "translationKey": "docs-your-content-rich-content", + "sha256": "382ba34ac3c9968056ef7f6ea048cd1fd3fc12dbc9441d4a8f8beea5d7dc3f03" + }, + { + "source": "docs/9-3-objects.es.md", + "content_path": "content/es/guia/el-compositor/objetos.md", + "url": "/guia/el-compositor/objetos/", + "lang": "es", + "type": "guide", + "translationKey": "docs-the-compositor-objects", + "sha256": "decb19fbfc1698db62325e50a2caa00ff390aeeb612c60259cf9f14154f8ca25" + }, + { + "source": "docs/6-5-embedding.md", + "content_path": "content/en/docs/site-features/embedding.md", + "url": "/docs/site-features/embedding/", + "lang": "en", + "type": "guide", + "translationKey": "docs-site-features-embedding", + "sha256": "851c360b856cba14763cdccf6c2bffd2379bc98f6d92b78302f1a59d113cd19f" + }, + { + "source": "docs/6-0-site-features.es.md", + "content_path": "content/es/guia/funciones/_index.md", + "url": "/guia/funciones/", + "lang": "es", + "type": "guide", + "translationKey": "docs-site-features", + "sha256": "a84fc3cf257ef8a3f58eefef54fca07b89f76351920789634ed98703de8df73b" + }, + { + "source": "docs/2-1-manual-setup.es.md", + "content_path": "content/es/guia/configuracion/configuracion-manual.md", + "url": "/guia/configuracion/configuracion-manual/", + "lang": "es", + "type": "guide", + "translationKey": "docs-setup-manual", + "sha256": "5f4e8e868dd8ea7ef6f477c3c5a82b67ed7290a5f528e0f9854e238b1f0bbb8c" + }, + { + "source": "docs/4-3-external-iiif.md", + "content_path": "content/en/docs/your-content/external-iiif.md", + "url": "/docs/your-content/external-iiif/", + "lang": "en", + "type": "guide", + "translationKey": "docs-your-content-external-iiif", + "sha256": "9c040d1e8da4f18848e47574abc59b5b2fc941415692e876b6f33ff43624df11" + }, + { + "source": "docs/9-5-video-audio.md", + "content_path": "content/en/docs/the-compositor/video-audio.md", + "url": "/docs/the-compositor/video-audio/", + "lang": "en", + "type": "guide", + "translationKey": "docs-the-compositor-video-audio", + "sha256": "856b7291d94182920b82c77bb7df957281709bf7c06197d3623781be7985448d" + }, + { + "source": "docs/8-0-for-developers.es.md", + "content_path": "content/es/guia/desarrolladores/_index.md", + "url": "/guia/desarrolladores/", + "lang": "es", + "type": "guide", + "translationKey": "docs-developers", + "sha256": "b2c7a545dd57f8dd3b4e8041a9b2d9d8b969f82f0aba5e185ad3242e51a8e90c" + }, + { + "source": "docs/4-1-objects.es.md", + "content_path": "content/es/guia/tu-contenido/objetos.md", + "url": "/guia/tu-contenido/objetos/", + "lang": "es", + "type": "guide", + "translationKey": "docs-your-content-objects", + "sha256": "e1e880fb836ce33cdcca9b081c7f0acdd5c2ea9ab59d8f7420fbfbfd5bda9086" + }, + { + "source": "docs/3-3-config-validator.md", + "content_path": "content/en/docs/configure/config-validator.md", + "url": "/docs/configure/config-validator/", + "lang": "en", + "type": "guide", + "translationKey": "docs-configure-config-validator", + "sha256": "67c3564fb5f250567f60bd6a0c51b7f490d3dcc71a55cbb4452f5c7c8764c959" + }, + { + "source": "docs/9-5-video-audio.es.md", + "content_path": "content/es/guia/el-compositor/video-y-audio.md", + "url": "/guia/el-compositor/video-y-audio/", + "lang": "es", + "type": "guide", + "translationKey": "docs-the-compositor-video-audio", + "sha256": "436d401f7f5ba172164bb2f98bb8d1325c7daa2c1dce7bf6230801ae961b012e" + }, + { + "source": "docs/4-8-pdf-documents.md", + "content_path": "content/en/docs/your-content/pdf-documents.md", + "url": "/docs/your-content/pdf-documents/", + "lang": "en", + "type": "guide", + "translationKey": "docs-your-content-pdf-documents", + "sha256": "7275b994042633e506bab8e75ac0e70349b7cd5712c33bae0f13e10f21acf5f2" + }, + { + "source": "docs/2-3-upgrading.md", + "content_path": "content/en/docs/setup/upgrading.md", + "url": "/docs/setup/upgrading/", + "lang": "en", + "type": "guide", + "translationKey": "docs-setup-upgrading", + "sha256": "b06f54c09bce9c85a111f3e200d0cf02496ca9c7a7204e86b143a300b5d636f9" + }, + { + "source": "docs/5-3-csv-objects.es.md", + "content_path": "content/es/guia/tus-datos/csv-objetos.md", + "url": "/guia/tus-datos/csv-objetos/", + "lang": "es", + "type": "guide", + "translationKey": "docs-your-data-csv-objects", + "sha256": "34789090b4d14258f55719d9960c9e2d698f40b8050b0a0a4b2009d8a0a88ec3" + }, + { + "source": "docs/9-6-publishing.es.md", + "content_path": "content/es/guia/el-compositor/publicacion.md", + "url": "/guia/el-compositor/publicacion/", + "lang": "es", + "type": "guide", + "translationKey": "docs-the-compositor-publishing", + "sha256": "18b90369e006a36f78c1804a3555a32699af3f86cfd85211850cafe4ce36def9" + }, + { + "source": "docs/6-3-private-stories.md", + "content_path": "content/en/docs/site-features/private-stories.md", + "url": "/docs/site-features/private-stories/", + "lang": "en", + "type": "guide", + "translationKey": "docs-site-features-private-stories", + "sha256": "a836c61eba5e91630a74e08223184e71952b119ece072288f25028fab918b42f" + }, + { + "source": "docs/9-3-objects.md", + "content_path": "content/en/docs/the-compositor/objects.md", + "url": "/docs/the-compositor/objects/", + "lang": "en", + "type": "guide", + "translationKey": "docs-the-compositor-objects", + "sha256": "9a3f9a2f47689ceac5076e21bdd8ed61ecafe919b18aa83849add82c909d79e7" + }, + { + "source": "docs/1-1-compositor.md", + "content_path": "content/en/docs/getting-started/compositor.md", + "url": "/docs/getting-started/compositor/", + "lang": "en", + "type": "guide", + "translationKey": "docs-getting-started-compositor", + "sha256": "217b9d284eb0305dad38bb6457f7d6f1cbdd966fdb4b48f5f52f89b4169dafbc" + }, + { + "source": "docs/4-7-widgets.es.md", + "content_path": "content/es/guia/tu-contenido/widgets.md", + "url": "/guia/tu-contenido/widgets/", + "lang": "es", + "type": "guide", + "translationKey": "docs-your-content-widgets", + "sha256": "e4a96355aac8f85d1bf79ba774e6a397479f8dbca2d60d42a8c29eb61f0bf09d" + }, + { + "source": "docs/7-3-navigation-menu.es.md", + "content_path": "content/es/guia/personalizacion/menu-navegacion.md", + "url": "/guia/personalizacion/menu-navegacion/", + "lang": "es", + "type": "guide", + "translationKey": "docs-customization-navigation-menu", + "sha256": "5ecb04f770a00554bb41c0d055a025ae5b3b41a1f9fe690ae463a0e9d799580b" + }, + { + "source": "docs/1-6-review-refine.md", + "content_path": "content/en/docs/getting-started/review-refine.md", + "url": "/docs/getting-started/review-refine/", + "lang": "en", + "type": "guide", + "translationKey": "docs-getting-started-review-refine", + "sha256": "4ef3bcbdb6bcffff8788a101e923cd163fff8b8a530bada52f8b497f41ab0775" + }, + { + "source": "docs/3-2-configuration.es.md", + "content_path": "content/es/guia/configurar/configuracion.md", + "url": "/guia/configurar/configuracion/", + "lang": "es", + "type": "guide", + "translationKey": "docs-configure-configuration", + "sha256": "c0e386114d3de383a96d78822909ec6869a253d88f8e2df95afdea7141153c3b" + }, + { + "source": "docs/1-2-google-sheets-option.md", + "content_path": "content/en/docs/getting-started/google-sheets.md", + "url": "/docs/getting-started/google-sheets/", + "lang": "en", + "type": "guide", + "translationKey": "docs-getting-started-google-sheets", + "sha256": "3605022f24aba55e341b30f1f86fd23591974a27cf766472d29534a0c007462f" + }, + { + "source": "docs/1-2-google-sheets-option.es.md", + "content_path": "content/es/guia/primeros-pasos/google-sheets.md", + "url": "/guia/primeros-pasos/google-sheets/", + "lang": "es", + "type": "guide", + "translationKey": "docs-getting-started-google-sheets", + "sha256": "19b1cbd5fde50a9f136a2ddd6334b8e01055d7aa3858f0e18a4b65fb7d348c79" + }, + { + "source": "docs/4-4-stories-panels.md", + "content_path": "content/en/docs/your-content/stories-panels.md", + "url": "/docs/your-content/stories-panels/", + "lang": "en", + "type": "guide", + "translationKey": "docs-your-content-stories-panels", + "sha256": "3e7a1d1e39b331449640d4d810369379230eabbc5fd767bf1efcd17e8d941d4c" + }, + { + "source": "docs/4-0-your-content.es.md", + "content_path": "content/es/guia/tu-contenido/_index.md", + "url": "/guia/tu-contenido/", + "lang": "es", + "type": "guide", + "translationKey": "docs-your-content", + "sha256": "388b17a1fc4abb856ff14fa81e6a92de9141daceb07c9cb3232b380704b43323" + }, + { + "source": "docs/4-5-rich-content.es.md", + "content_path": "content/es/guia/tu-contenido/contenido-enriquecido.md", + "url": "/guia/tu-contenido/contenido-enriquecido/", + "lang": "es", + "type": "guide", + "translationKey": "docs-your-content-rich-content", + "sha256": "ab5baaae152d975971cf5298627914e07d81be1da403c773be21fd5801940633" + }, + { + "source": "docs/9-6-publishing.md", + "content_path": "content/en/docs/the-compositor/publishing.md", + "url": "/docs/the-compositor/publishing/", + "lang": "en", + "type": "guide", + "translationKey": "docs-the-compositor-publishing", + "sha256": "550a1488532469b6560d6c20240a8d92459f20ae51b349ed5a935c5469cd5068" + }, + { + "source": "docs/1-0-getting-started.es.md", + "content_path": "content/es/guia/primeros-pasos/_index.md", + "url": "/guia/primeros-pasos/", + "lang": "es", + "type": "guide", + "translationKey": "docs-getting-started", + "sha256": "bfbd3c5bf98a7dc5fab59a8479ccc7352b26660586f4f3a21c1f394577297ddb" + }, + { + "source": "docs/8-1-local-development.md", + "content_path": "content/en/docs/developers/local-development.md", + "url": "/docs/developers/local-development/", + "lang": "en", + "type": "guide", + "translationKey": "docs-developers-local-development", + "sha256": "66811083d468fa914c519b0f366228ff197a4ddef5aea733e13cd7d697515ea9" + }, + { + "source": "docs/8-3-demo-system-architecture.md", + "content_path": "content/en/docs/developers/demo-system.md", + "url": "/docs/developers/demo-system/", + "lang": "en", + "type": "guide", + "translationKey": "docs-developers-demo-system", + "sha256": "f9d3dd9a084750b4b075335df9972145f9bfc01f4dfedea8f0784bbb51e01d13" + }, + { + "source": "docs/8-3-demo-system-architecture.es.md", + "content_path": "content/es/guia/desarrolladores/sistema-demos.md", + "url": "/guia/desarrolladores/sistema-demos/", + "lang": "es", + "type": "guide", + "translationKey": "docs-developers-demo-system", + "sha256": "34851deb3739ec79fdb1971031231b5a35fa3322669b5ed5e5bed570ba0d221e" + }, + { + "source": "docs/3-1-config-generator.es.md", + "content_path": "content/es/guia/configurar/generador-de-configuracion.md", + "url": "/guia/configurar/generador-de-configuracion/", + "lang": "es", + "type": "guide", + "translationKey": "docs-configure-config-generator", + "sha256": "7b4a02bb331057ebc02362ec51cdcb4f8877394d1a01f0a09ca1d1c14179e6f0" + }, + { + "source": "docs/5-0-your-data.es.md", + "content_path": "content/es/guia/tus-datos/_index.md", + "url": "/guia/tus-datos/", + "lang": "es", + "type": "guide", + "translationKey": "docs-your-data", + "sha256": "db1c8f63c827157dacdbc5023a2e4de2f30f8a0c440c0b11a1328cb025506c7a" + }, + { + "source": "docs/6-3-private-stories.es.md", + "content_path": "content/es/guia/funciones/historias-privadas.md", + "url": "/guia/funciones/historias-privadas/", + "lang": "es", + "type": "guide", + "translationKey": "docs-site-features-private-stories", + "sha256": "190223ecd57d80faee3eed62b3c3ba5c937361425ac67fe6aab2a5d79433a03e" + }, + { + "source": "docs/5-5-csv-glossary.es.md", + "content_path": "content/es/guia/tus-datos/csv-glosario.md", + "url": "/guia/tus-datos/csv-glosario/", + "lang": "es", + "type": "guide", + "translationKey": "docs-your-data-csv-glossary", + "sha256": "62c58fe9b5ce753c2bcfcea793da2a3b3531d31e907102ead843dbeca8416349" + }, + { + "source": "docs/1-3-local-dev.es.md", + "content_path": "content/es/guia/primeros-pasos/desarrollo-local.md", + "url": "/guia/primeros-pasos/desarrollo-local/", + "lang": "es", + "type": "guide", + "translationKey": "docs-getting-started-local-dev", + "sha256": "cb2865ebe13940668c066c8bd280d3b295a16104b5527078c3000713673ac942" + }, + { + "source": "docs/4-8-pdf-documents.es.md", + "content_path": "content/es/guia/tu-contenido/documentos-pdf.md", + "url": "/guia/tu-contenido/documentos-pdf/", + "lang": "es", + "type": "guide", + "translationKey": "docs-your-content-pdf-documents", + "sha256": "96b773619fc543cebf83018f131100a7465a096ddd1d37e8d9c841294d33c62b" + }, + { + "source": "docs/2-3-upgrading.es.md", + "content_path": "content/es/guia/configuracion/actualizacion.md", + "url": "/guia/configuracion/actualizacion/", + "lang": "es", + "type": "guide", + "translationKey": "docs-setup-upgrading", + "sha256": "079c148e457b3297269c99bdf0fcf953c1e2ae6579fa8a2d9d10cb102d6034a0" + }, + { + "source": "docs/7-2-home-page.es.md", + "content_path": "content/es/guia/personalizacion/pagina-de-inicio.md", + "url": "/guia/personalizacion/pagina-de-inicio/", + "lang": "es", + "type": "guide", + "translationKey": "docs-customization-home-page", + "sha256": "f52bdf8d7e1b69b13c38744660419e021c829a62839a67cf450c892c929ffdbb" + }, + { + "source": "docs/6-5-embedding.es.md", + "content_path": "content/es/guia/funciones/insercion.md", + "url": "/guia/funciones/insercion/", + "lang": "es", + "type": "guide", + "translationKey": "docs-site-features-embedding", + "sha256": "6f4b43498e3efb597b1d08cb4ad748c6f0ea7e104e3f9015ab8e201bb630b882" + }, + { + "source": "docs/1-5-add-content.md", + "content_path": "content/en/docs/getting-started/add-content.md", + "url": "/docs/getting-started/add-content/", + "lang": "en", + "type": "guide", + "translationKey": "docs-getting-started-add-content", + "sha256": "cfb07f90f3041d566a0fc6045df0ef47dd899cba30cc2968fcb8936c5eb14953" + }, + { + "source": "docs/2-0-setup.es.md", + "content_path": "content/es/guia/configuracion/_index.md", + "url": "/guia/configuracion/", + "lang": "es", + "type": "guide", + "translationKey": "docs-setup", + "sha256": "13edeb522cd570b8c34861f8f81f0ef930c01b7d53150882abdea4f3abe0861f" + }, + { + "source": "docs/8-6-mobile.es.md", + "content_path": "content/es/guia/desarrolladores/moviles.md", + "url": "/guia/desarrolladores/moviles/", + "lang": "es", + "type": "guide", + "translationKey": "docs-developers-mobile", + "sha256": "aef6723fff87a7d75146609031361cb16f1e1f8e7f14d88c90763efbda2efd84" + }, + { + "source": "docs/7-4-demo-content.es.md", + "content_path": "content/es/guia/personalizacion/contenido-demostracion.md", + "url": "/guia/personalizacion/contenido-demostracion/", + "lang": "es", + "type": "guide", + "translationKey": "docs-customization-demo-content", + "sha256": "d69da43bf4a81e0fda4b7d3008b19a135cfa8d70873372dda601d8cebe2ec1d1" + }, + { + "source": "docs/6-2-glossary.es.md", + "content_path": "content/es/guia/funciones/glosario.md", + "url": "/guia/funciones/glosario/", + "lang": "es", + "type": "guide", + "translationKey": "docs-site-features-glossary", + "sha256": "c1a37d6434204b7b9e1ef98f11f5f85b2cafd74042db58785d12f8eb9efae876" + }, + { + "source": "docs/7-0-customization.es.md", + "content_path": "content/es/guia/personalizacion/_index.md", + "url": "/guia/personalizacion/", + "lang": "es", + "type": "guide", + "translationKey": "docs-customization", + "sha256": "7fc033870265b6057d64c314984953b058a33f9aca2aa1c1cf15ebfa511a104e" + }, + { + "source": "docs/5-4-csv-stories.md", + "content_path": "content/en/docs/your-data/csv-stories.md", + "url": "/docs/your-data/csv-stories/", + "lang": "en", + "type": "guide", + "translationKey": "docs-your-data-csv-stories", + "sha256": "9c7c8e2798f44953080ad5e9a454eb72663a76af9da9b7b754501e0ac48a200c" + }, + { + "source": "docs/1-3-local-dev.md", + "content_path": "content/en/docs/getting-started/local-dev.md", + "url": "/docs/getting-started/local-dev/", + "lang": "en", + "type": "guide", + "translationKey": "docs-getting-started-local-dev", + "sha256": "f6fbfc4749918a77d389e2df2fcf35da6610f99669a11f1744e902cf7acbea25" + }, + { + "source": "docs/8-5-styling.md", + "content_path": "content/en/docs/developers/styling.md", + "url": "/docs/developers/styling/", + "lang": "en", + "type": "guide", + "translationKey": "docs-developers-styling", + "sha256": "aecd922862383758950d3e681d10b92d585dcc085b6445bf3d329b1231366df9" + }, + { + "source": "docs/9-4-story-editor.md", + "content_path": "content/en/docs/the-compositor/story-editor.md", + "url": "/docs/the-compositor/story-editor/", + "lang": "en", + "type": "guide", + "translationKey": "docs-the-compositor-story-editor", + "sha256": "5c30358f98c8d9ff6ca2ad9cef8eadfff334ae9db56f07b1446f4217fef0fe11" + }, + { + "source": "docs/3-3-config-validator.es.md", + "content_path": "content/es/guia/configurar/validador-de-configuracion.md", + "url": "/guia/configurar/validador-de-configuracion/", + "lang": "es", + "type": "guide", + "translationKey": "docs-configure-config-validator", + "sha256": "0d548a1b208fb5cc74a853d0fb1bab7416f5abf816129034399c7c5d86683c0b" + }, + { + "source": "docs/8-4-embedding-system.md", + "content_path": "content/en/docs/developers/embedding-system.md", + "url": "/docs/developers/embedding-system/", + "lang": "en", + "type": "guide", + "translationKey": "docs-developers-embedding-system", + "sha256": "96c41490e690c7fee71b8b72d4aef142ae9643973a4b97335ca0b70e00d003ed" + }, + { + "source": "docs/8-7-story-engine.es.md", + "content_path": "content/es/guia/desarrolladores/motor-de-historias.md", + "url": "/guia/desarrolladores/motor-de-historias/", + "lang": "es", + "type": "guide", + "translationKey": "docs-developers-story-engine", + "sha256": "6a7e1b36c6c8b1207cd03ba2b3b6027b1268f6d07af70ae557406a3471d7b63c" + }, + { + "source": "docs/4-2-self-hosted-images.es.md", + "content_path": "content/es/guia/tu-contenido/imagenes-autoalojadas.md", + "url": "/guia/tu-contenido/imagenes-autoalojadas/", + "lang": "es", + "type": "guide", + "translationKey": "docs-your-content-self-hosted-images", + "sha256": "dac2de970e4d81d635730d55e178d052c8db067cb9a610936d1ac45c9478b728" + }, + { + "source": "docs/7-0-customization.md", + "content_path": "content/en/docs/customization/_index.md", + "url": "/docs/customization/", + "lang": "en", + "type": "guide", + "translationKey": "docs-customization", + "sha256": "c54f737d0bb91df18c399d41754bc216a6958190e67ca6e759ad96be222fc311" + }, + { + "source": "docs/5-0-your-data.md", + "content_path": "content/en/docs/your-data/_index.md", + "url": "/docs/your-data/", + "lang": "en", + "type": "guide", + "translationKey": "docs-your-data", + "sha256": "31211e5e97d36bd97b6545e57442a52dd4b13bc7c570a48917230f1916b02b8c" + }, + { + "source": "docs/1-6-review-refine.es.md", + "content_path": "content/es/guia/primeros-pasos/revisa-y-perfecciona.md", + "url": "/guia/primeros-pasos/revisa-y-perfecciona/", + "lang": "es", + "type": "guide", + "translationKey": "docs-getting-started-review-refine", + "sha256": "89c0daf636f4a9b3abbb598f2ae4985f29685197f95514cc001c0e1c6cd6ea03" + }, + { + "source": "docs/3-0-configure.md", + "content_path": "content/en/docs/configure/_index.md", + "url": "/docs/configure/", + "lang": "en", + "type": "guide", + "translationKey": "docs-configure", + "sha256": "1d5cd2b61c714e07029b6c47a2dacf09fa0795846f976fc40dad89e83381c19e" + }, + { + "source": "docs/4-7-widgets.md", + "content_path": "content/en/docs/your-content/widgets.md", + "url": "/docs/your-content/widgets/", + "lang": "en", + "type": "guide", + "translationKey": "docs-your-content-widgets", + "sha256": "d23e4ce211a59d698f05e22d91254f004410dd4f21d06d1512944d3807430a20" + }, + { + "source": "docs/2-1-manual-setup.md", + "content_path": "content/en/docs/setup/manual.md", + "url": "/docs/setup/manual/", + "lang": "en", + "type": "guide", + "translationKey": "docs-setup-manual", + "sha256": "380d6c9a07580bf862f30f112614f37c6e70e91ec65d5009c44cb75f17f8c8ce" + }, + { + "source": "docs/index.es.md", + "content_path": "content/es/guia/_index.md", + "url": "/guia/", + "lang": "es", + "type": "guide", + "translationKey": "docs", + "sha256": "d455b9b588b4eeddd7ad839f6204b18505e557a866272ac78055d42f790a5a52" + }, + { + "source": "docs/4-10-audio-objects.es.md", + "content_path": "content/es/guia/tu-contenido/objetos-de-audio.md", + "url": "/guia/tu-contenido/objetos-de-audio/", + "lang": "es", + "type": "guide", + "translationKey": "docs-your-content-audio-objects", + "sha256": "88b9b5124306f9db1a3524b9787771659b94416d3fd9469f794e59e8ea1b7210" + }, + { + "source": "docs/9-1-getting-started.es.md", + "content_path": "content/es/guia/el-compositor/primeros-pasos.md", + "url": "/guia/el-compositor/primeros-pasos/", + "lang": "es", + "type": "guide", + "translationKey": "docs-the-compositor-getting-started", + "sha256": "a3ae1a50fd1f8f6fd76902fc91943975d32bcf525f6bfdb1aa16dee3d8cc5ed5" + }, + { + "source": "docs/1-0-getting-started.md", + "content_path": "content/en/docs/getting-started/_index.md", + "url": "/docs/getting-started/", + "lang": "en", + "type": "guide", + "translationKey": "docs-getting-started", + "sha256": "58c91901e3e34a01d5695057e1d25f6d5a852f236e67a56550b36437ae0be856" + }, + { + "source": "docs/6-1-objects-gallery.es.md", + "content_path": "content/es/guia/funciones/galeria-objetos.md", + "url": "/guia/funciones/galeria-objetos/", + "lang": "es", + "type": "guide", + "translationKey": "docs-site-features-objects-gallery", + "sha256": "d33dbbc004e5d89dc0ae7cc48ad78321f55e1b03f69a9ed80ee95c42b5db7ff7" + }, + { + "source": "docs/4-10-audio-objects.md", + "content_path": "content/en/docs/your-content/audio-objects.md", + "url": "/docs/your-content/audio-objects/", + "lang": "en", + "type": "guide", + "translationKey": "docs-your-content-audio-objects", + "sha256": "c6b823e30fb337f234d2f0b5a474850c6177c2ad19d03c0e095df33d228260fb" + }, + { + "source": "docs/8-4-embedding-system.es.md", + "content_path": "content/es/guia/desarrolladores/sistema-insercion.md", + "url": "/guia/desarrolladores/sistema-insercion/", + "lang": "es", + "type": "guide", + "translationKey": "docs-developers-embedding-system", + "sha256": "a585088f63724bd57145ea96ba05e9a7ce420bcc6208e6d95d76d597a6ef8f00" + }, + { + "source": "docs/7-1-themes.es.md", + "content_path": "content/es/guia/personalizacion/temas.md", + "url": "/guia/personalizacion/temas/", + "lang": "es", + "type": "guide", + "translationKey": "docs-customization-themes", + "sha256": "f8f8f7ebf365bfa6767f4d210d17433e98e298b0d754494b4504b50a7734e98a" + }, + { + "source": "docs/1-1-compositor.es.md", + "content_path": "content/es/guia/primeros-pasos/compositor.md", + "url": "/guia/primeros-pasos/compositor/", + "lang": "es", + "type": "guide", + "translationKey": "docs-getting-started-compositor", + "sha256": "34dddcbb377e8e1214afebe6b67466b9ccd9bde8667b892384a4ad4fd5f1246d" + }, + { + "source": "docs/index.md", + "content_path": "content/en/docs/_index.md", + "url": "/docs/", + "lang": "en", + "type": "guide", + "translationKey": "docs", + "sha256": "fe4a68f2277f7f4b74e4828e99202d48e7f1ae8f62ad2afa0def4e3d8ac23fea" + }, + { + "source": "docs/9-0-compositor.es.md", + "content_path": "content/es/guia/el-compositor/_index.md", + "url": "/guia/el-compositor/", + "lang": "es", + "type": "guide", + "translationKey": "docs-the-compositor", + "sha256": "45d6f43103bc5593c070fe308ee094d364e07bf99fc16d49078e52d4c78e1776" + }, + { + "source": "docs/4-4-stories-panels.es.md", + "content_path": "content/es/guia/tu-contenido/historias-paneles.md", + "url": "/guia/tu-contenido/historias-paneles/", + "lang": "es", + "type": "guide", + "translationKey": "docs-your-content-stories-panels", + "sha256": "1428bd931ab435b6b3e3a8e2bcb800e114a0c8c98a1dd309c2beb2434b0cbc9c" + }, + { + "source": "docs/4-3-external-iiif.es.md", + "content_path": "content/es/guia/tu-contenido/iiif-externo.md", + "url": "/guia/tu-contenido/iiif-externo/", + "lang": "es", + "type": "guide", + "translationKey": "docs-your-content-external-iiif", + "sha256": "36ce0a4503c774199aa9b5dc0a9c667867b184fa150312bb279c4486359f7704" + }, + { + "source": "docs/3-1-config-generator.md", + "content_path": "content/en/docs/configure/config-generator.md", + "url": "/docs/configure/config-generator/", + "lang": "en", + "type": "guide", + "translationKey": "docs-configure-config-generator", + "sha256": "d5582f91ec468485a06aa5cac30f3cab9f767c5fd20daf6d33a30ddc21842711" + }, + { + "source": "docs/8-7-story-engine.md", + "content_path": "content/en/docs/developers/story-engine.md", + "url": "/docs/developers/story-engine/", + "lang": "en", + "type": "guide", + "translationKey": "docs-developers-story-engine", + "sha256": "99dbe7eef3020f4d4c9209dbbe188e29ee0111cca271bba7158beb56b62aab64" + }, + { + "source": "docs/6-2-glossary.md", + "content_path": "content/en/docs/site-features/glossary.md", + "url": "/docs/site-features/glossary/", + "lang": "en", + "type": "guide", + "translationKey": "docs-site-features-glossary", + "sha256": "1d49d665df07c33d92a0b878a3bc399e65c30481a69b2a8fd21146bb4bd3aeab" + }, + { + "source": "docs/9-2-dashboard.es.md", + "content_path": "content/es/guia/el-compositor/panel-de-control.md", + "url": "/guia/el-compositor/panel-de-control/", + "lang": "es", + "type": "guide", + "translationKey": "docs-the-compositor-dashboard", + "sha256": "913212be5f5e2d6689d30ecd24a4bf06c342f77e6acd9a95d8bd496cac905a9f" + }, + { + "source": "docs/7-1-themes.md", + "content_path": "content/en/docs/customization/themes.md", + "url": "/docs/customization/themes/", + "lang": "en", + "type": "guide", + "translationKey": "docs-customization-themes", + "sha256": "1bf2438088227f7af2883eaf678b71aa0c482accf835821b9825ee0de1860d3f" + }, + { + "source": "docs/4-6-markdown-syntax.es.md", + "content_path": "content/es/guia/tu-contenido/sintaxis-markdown.md", + "url": "/guia/tu-contenido/sintaxis-markdown/", + "lang": "es", + "type": "guide", + "translationKey": "docs-your-content-markdown-syntax", + "sha256": "88d9f1d8318f5348564726a574ab831c6b855d2ecafa714295d57617fb6a2b70" + }, + { + "source": "docs/3-2-configuration.md", + "content_path": "content/en/docs/configure/configuration.md", + "url": "/docs/configure/configuration/", + "lang": "en", + "type": "guide", + "translationKey": "docs-configure-configuration", + "sha256": "fd6c5e41ac0f78468d6046495c6d11501fcdc49f2db1db1c93c8ec0f2fd07e92" + }, + { + "source": "docs/8-2-github-actions.md", + "content_path": "content/en/docs/developers/github-actions.md", + "url": "/docs/developers/github-actions/", + "lang": "en", + "type": "guide", + "translationKey": "docs-developers-github-actions", + "sha256": "683724e99c4e9539d83dad17d81d4e31a9af25b5a47424a251b483233f118fe0" + }, + { + "source": "docs/8-2-github-actions.es.md", + "content_path": "content/es/guia/desarrolladores/github-actions.md", + "url": "/guia/desarrolladores/github-actions/", + "lang": "es", + "type": "guide", + "translationKey": "docs-developers-github-actions", + "sha256": "f260d541f76510cdf4f2f00da5ba07c562baf25a9e737e25fc41e98ec89be15a" + }, + { + "source": "docs/1-4-narrative-structure.md", + "content_path": "content/en/docs/getting-started/narrative-structure.md", + "url": "/docs/getting-started/narrative-structure/", + "lang": "en", + "type": "guide", + "translationKey": "docs-getting-started-narrative-structure", + "sha256": "e3ad1bbfec089e9b8d184e1a88a62370c2d4313e75ff4289e32d072559aa4098" + }, + { + "source": "docs/1-5-add-content.es.md", + "content_path": "content/es/guia/primeros-pasos/agrega-contenido.md", + "url": "/guia/primeros-pasos/agrega-contenido/", + "lang": "es", + "type": "guide", + "translationKey": "docs-getting-started-add-content", + "sha256": "c15ef9f57d261c8d77010b1aeeb77a3e7e563b7020163af5c6b0ca4d3544b17e" + }, + { + "source": "docs/3-0-configure.es.md", + "content_path": "content/es/guia/configurar/_index.md", + "url": "/guia/configurar/", + "lang": "es", + "type": "guide", + "translationKey": "docs-configure", + "sha256": "e8591d88c807ee6cd8b6a02faf1c5033d2c412369ce919f9f5ef72e80bad94f7" + }, + { + "source": "docs/8-5-styling.es.md", + "content_path": "content/es/guia/desarrolladores/estilos.md", + "url": "/guia/desarrolladores/estilos/", + "lang": "es", + "type": "guide", + "translationKey": "docs-developers-styling", + "sha256": "b94b5a73b529f24e8c873f59a1ebea8328d3085914fb2a3b734fc489035739ad" + }, + { + "source": "docs/5-2-csv-project.es.md", + "content_path": "content/es/guia/tus-datos/csv-proyecto.md", + "url": "/guia/tus-datos/csv-proyecto/", + "lang": "es", + "type": "guide", + "translationKey": "docs-your-data-csv-project", + "sha256": "dc13295ff3c00fbf794372eddf944fa22eb741fb1de328b28df794e0123c9da7" + }, + { + "source": "docs/6-4-custom-pages.es.md", + "content_path": "content/es/guia/funciones/paginas-personalizadas.md", + "url": "/guia/funciones/paginas-personalizadas/", + "lang": "es", + "type": "guide", + "translationKey": "docs-site-features-custom-pages", + "sha256": "ebc2cd2e5bf61c73b992d34025552edec68c7ff82cb8632039c9366ec9306331" + }, + { + "source": "docs/9-2-dashboard.md", + "content_path": "content/en/docs/the-compositor/dashboard.md", + "url": "/docs/the-compositor/dashboard/", + "lang": "en", + "type": "guide", + "translationKey": "docs-the-compositor-dashboard", + "sha256": "51ab670cc9e6479a3a52fe1a9369dc1dcafb2d1742b2b440c85e64df2a699b4a" + }, + { + "source": "docs/4-9-video-objects.md", + "content_path": "content/en/docs/your-content/video-objects.md", + "url": "/docs/your-content/video-objects/", + "lang": "en", + "type": "guide", + "translationKey": "docs-your-content-video-objects", + "sha256": "4790baeb2e599d906d579d33c7fadad92852df64752d3ae6bb2572ea97268196" + }, + { + "source": "docs/5-1-google-sheets.es.md", + "content_path": "content/es/guia/tus-datos/google-sheets.md", + "url": "/guia/tus-datos/google-sheets/", + "lang": "es", + "type": "guide", + "translationKey": "docs-your-data-google-sheets", + "sha256": "6e2162579ba6a0e960fa8a6c4da46ab22509aaccf6b5c58b9cb4d94a859ff3e2" + }, + { + "source": "docs/8-6-mobile.md", + "content_path": "content/en/docs/developers/mobile.md", + "url": "/docs/developers/mobile/", + "lang": "en", + "type": "guide", + "translationKey": "docs-developers-mobile", + "sha256": "3d81c8d0776a09dce9e08a46dad44fcaad8d220243db004dd97c91dade3b541a" + }, + { + "source": "docs/9-1-getting-started.md", + "content_path": "content/en/docs/the-compositor/getting-started.md", + "url": "/docs/the-compositor/getting-started/", + "lang": "en", + "type": "guide", + "translationKey": "docs-the-compositor-getting-started", + "sha256": "fe9f92909c8741a9105bb33065e7a563e601e6c0217e6c4c5a97d15bac332fe8" + }, + { + "source": "docs/8-0-for-developers.md", + "content_path": "content/en/docs/developers/_index.md", + "url": "/docs/developers/", + "lang": "en", + "type": "guide", + "translationKey": "docs-developers", + "sha256": "94f48780c6ec1e23926636a2f1390a75acff4c0a857ede57f60b97d0ff87ce13" + }, + { + "source": "docs/4-9-video-objects.es.md", + "content_path": "content/es/guia/tu-contenido/objetos-de-video.md", + "url": "/guia/tu-contenido/objetos-de-video/", + "lang": "es", + "type": "guide", + "translationKey": "docs-your-content-video-objects", + "sha256": "dd0e7e1af053c2ac0d6c1c6fae6949416c0626e60b8a1c9e2a039fb0d13ae9e8" + }, + { + "source": "docs/4-0-your-content.md", + "content_path": "content/en/docs/your-content/_index.md", + "url": "/docs/your-content/", + "lang": "en", + "type": "guide", + "translationKey": "docs-your-content", + "sha256": "5c96159ed2a1fc1fea8225c7f0f3b3069ef8bef8bc667706851deba1043303cf" + }, + { + "source": "docs/6-4-custom-pages.md", + "content_path": "content/en/docs/site-features/custom-pages.md", + "url": "/docs/site-features/custom-pages/", + "lang": "en", + "type": "guide", + "translationKey": "docs-site-features-custom-pages", + "sha256": "d98644aa3076553041b115648289f55966f1c3b32f4bca493441ee602a049ff4" + }, + { + "source": "docs/7-3-navigation-menu.md", + "content_path": "content/en/docs/customization/navigation-menu.md", + "url": "/docs/customization/navigation-menu/", + "lang": "en", + "type": "guide", + "translationKey": "docs-customization-navigation-menu", + "sha256": "8a937075682ffdeeb5a29edc4b00fdda0153a32b534580ab260c6f507a765cdd" + }, + { + "source": "docs/5-3-csv-objects.md", + "content_path": "content/en/docs/your-data/csv-objects.md", + "url": "/docs/your-data/csv-objects/", + "lang": "en", + "type": "guide", + "translationKey": "docs-your-data-csv-objects", + "sha256": "9cc166c62fd3badc9a51c7989b837a5623a1a87f20b431adfafca74e7b46ad66" + }, + { + "source": "docs/1-4-narrative-structure.es.md", + "content_path": "content/es/guia/primeros-pasos/estructura-narrativa.md", + "url": "/guia/primeros-pasos/estructura-narrativa/", + "lang": "es", + "type": "guide", + "translationKey": "docs-getting-started-narrative-structure", + "sha256": "056fb404b459e9a62bc09b3c9edfe32537a06bbbe4de47a4cb330179f9bc9d05" + }, + { + "source": "docs/5-1-google-sheets.md", + "content_path": "content/en/docs/your-data/google-sheets.md", + "url": "/docs/your-data/google-sheets/", + "lang": "en", + "type": "guide", + "translationKey": "docs-your-data-google-sheets", + "sha256": "c3bc5592b0526c8ef17b9981cc4147b735e5d08fce9b2fe1dd2d624fe02c92ac" + }, + { + "source": "docs/5-2-csv-project.md", + "content_path": "content/en/docs/your-data/csv-project.md", + "url": "/docs/your-data/csv-project/", + "lang": "en", + "type": "guide", + "translationKey": "docs-your-data-csv-project", + "sha256": "371b0315bd9389ceea659608a2327a8befb5ab9cbf7d67e75e4e12809e4417d2" + }, + { + "source": "docs/8-1-local-development.es.md", + "content_path": "content/es/guia/desarrolladores/desarrollo-local.md", + "url": "/guia/desarrolladores/desarrollo-local/", + "lang": "es", + "type": "guide", + "translationKey": "docs-developers-local-development", + "sha256": "179683306d3c3792fdd1666f5b7945632735bd0ee9194f2de77096b33c2d561c" + }, + { + "source": "docs/7-2-home-page.md", + "content_path": "content/en/docs/customization/home-page.md", + "url": "/docs/customization/home-page/", + "lang": "en", + "type": "guide", + "translationKey": "docs-customization-home-page", + "sha256": "1409c50c8bc588a2eb99e4e00afe2c6558252f4c90456ad594307d3ae7391963" + }, + { + "source": "docs/5-5-csv-glossary.md", + "content_path": "content/en/docs/your-data/csv-glossary.md", + "url": "/docs/your-data/csv-glossary/", + "lang": "en", + "type": "guide", + "translationKey": "docs-your-data-csv-glossary", + "sha256": "7761e42288c25c49ea24f7052ac2bceeaa3f8ec9de1030e7820e2bc74f6e1c52" + }, + { + "source": "docs/4-2-self-hosted-images.md", + "content_path": "content/en/docs/your-content/self-hosted-images.md", + "url": "/docs/your-content/self-hosted-images/", + "lang": "en", + "type": "guide", + "translationKey": "docs-your-content-self-hosted-images", + "sha256": "67e8c14d7f5c3271c440bb1c017c3186966b33c33b9c40e683739da0876cc9ba" + }, + { + "source": "docs/9-7-sync-updates.md", + "content_path": "content/en/docs/the-compositor/sync-updates.md", + "url": "/docs/the-compositor/sync-updates/", + "lang": "en", + "type": "guide", + "translationKey": "docs-the-compositor-sync-updates", + "sha256": "1829d050a30e2025a5c82b29e2b144c93647fb9576b011dec94a8332f2317175" + }, + { + "source": "docs/7-4-demo-content.md", + "content_path": "content/en/docs/customization/demo-content.md", + "url": "/docs/customization/demo-content/", + "lang": "en", + "type": "guide", + "translationKey": "docs-customization-demo-content", + "sha256": "1ba1d8281b3d2dc69c26f249c40b9dd7793f998b3aa41e69ee7f5e039b9a2d4e" + }, + { + "source": "docs/9-4-story-editor.es.md", + "content_path": "content/es/guia/el-compositor/editor-historias.md", + "url": "/guia/el-compositor/editor-historias/", + "lang": "es", + "type": "guide", + "translationKey": "docs-the-compositor-story-editor", + "sha256": "bf8c6d604f58c3e1329ca6aef03b97f42a46224692100367ce95692ef87d6341" + }, + { + "source": "docs/6-0-site-features.md", + "content_path": "content/en/docs/site-features/_index.md", + "url": "/docs/site-features/", + "lang": "en", + "type": "guide", + "translationKey": "docs-site-features", + "sha256": "be7f1f11893cc5b5dc67ae5dd7ce856fb93e10fb8d923e0aa1358ad213ff57e5" + }, + { + "source": "docs/2-0-setup.md", + "content_path": "content/en/docs/setup/_index.md", + "url": "/docs/setup/", + "lang": "en", + "type": "guide", + "translationKey": "docs-setup", + "sha256": "dd3d15a9a12320b06bb7672d17d05203f9b8be84ef3d99c06d56b535c4b82233" + }, + { + "source": "docs/9-0-compositor.md", + "content_path": "content/en/docs/the-compositor/_index.md", + "url": "/docs/the-compositor/", + "lang": "en", + "type": "guide", + "translationKey": "docs-the-compositor", + "sha256": "a5ec38d049fd0a06aa72a53f2c5829c7fda9021f99e76005ace49f19ed81ebc9" + }, + { + "source": "docs/9-7-sync-updates.es.md", + "content_path": "content/es/guia/el-compositor/sincronizacion-y-actualizaciones.md", + "url": "/guia/el-compositor/sincronizacion-y-actualizaciones/", + "lang": "es", + "type": "guide", + "translationKey": "docs-the-compositor-sync-updates", + "sha256": "a9e93d5c8985ed5e847ddc58a58bf06329d3c2c70d852ad95b5f1dab9cec0468" + }, + { + "source": "docs/6-1-objects-gallery.md", + "content_path": "content/en/docs/site-features/objects-gallery.md", + "url": "/docs/site-features/objects-gallery/", + "lang": "en", + "type": "guide", + "translationKey": "docs-site-features-objects-gallery", + "sha256": "b723ef1e81e2b7490e3243a1f05d6e0ae2760dec5f89b65de89316343b6a6541" + }, + { + "source": "docs/5-4-csv-stories.es.md", + "content_path": "content/es/guia/tus-datos/csv-historias.md", + "url": "/guia/tus-datos/csv-historias/", + "lang": "es", + "type": "guide", + "translationKey": "docs-your-data-csv-stories", + "sha256": "9149b12e76f0877e33b41597bc737043897c499b48b49542e9b362338a4abd6a" + }, + { + "source": "docs/4-6-markdown-syntax.md", + "content_path": "content/en/docs/your-content/markdown-syntax.md", + "url": "/docs/your-content/markdown-syntax/", + "lang": "en", + "type": "guide", + "translationKey": "docs-your-content-markdown-syntax", + "sha256": "1804c701d6b77c30865258d97da90337695f1cd9138c60cb7097e7377acf8515" + }, + { + "source": "manual/review.html", + "content_path": "content/es/manual/review.md", + "url": "/manual/review/", + "lang": "es", + "type": "guide", + "translationKey": "manual-review-html", + "sha256": "ef2de554ef6fcd0d76b62d09f015d34abbf705ab64a3c33b34e692347f931fcf" + }, + { + "source": "manual/index.en.html", + "content_path": "content/en/manual/en/_index.md", + "url": "/manual/en/", + "lang": "en", + "type": "redirect", + "translationKey": "manual-index-html", + "sha256": "f7571add236bc7a4ab1d43ce372e7dfa96c9c4f49dc6b8843682ac4e99380df8" + }, + { + "source": "manual/iiif.es.md", + "content_path": "content/es/manual/es/iiif-a-historia.md", + "url": "/manual/es/iiif-a-historia/", + "lang": "es", + "type": "redirect", + "translationKey": "manual-iiif-md", + "sha256": "44b400574b620370324881373cf625832311d86efff923733a8f78e19f72f64f" + }, + { + "source": "manual/iiif.en.md", + "content_path": "content/en/manual/en/iiif-to-story.md", + "url": "/manual/en/iiif-to-story/", + "lang": "en", + "type": "redirect", + "translationKey": "manual-iiif-md", + "sha256": "615931af1a6ac3b36c2437c80fc9f5537f1e6cad2cc9a39b3cc09e610e91032c" + }, + { + "source": "manual/index.es.html", + "content_path": "content/es/manual/es/_index.md", + "url": "/manual/es/", + "lang": "es", + "type": "redirect", + "translationKey": "manual-index-html", + "sha256": "bec3c0fb80c23dd99d40b0ade6d554072236dce419040bff06acc1f38d2bbc91" + }, + { + "source": "redirects/es-ec-objetos-galeria.md", + "content_path": "content/es/guia/estructura-de-contenido/objetos-galeria.md", + "url": "/guia/estructura-de-contenido/objetos-galeria/", + "lang": "es", + "type": "redirect", + "translationKey": "redirects-es-ec-objetos-galeria-md", + "sha256": "6e762aa0a5486ab4b793f6b3df836bcc54bba4d90e37a71559f7955e0b2fb9a1" + }, + { + "source": "redirects/en-wf-embedding.md", + "content_path": "content/en/docs/workflows/embedding.md", + "url": "/docs/workflows/embedding/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-wf-embedding-md", + "sha256": "7943fa2a2f354323ffd07ddd0a71626d265c1d747bc380d761a67e5fcf6cde55" + }, + { + "source": "redirects/es-ft-desarrollo-local.md", + "content_path": "content/es/guia/flujos-de-trabajo/desarrollo-local.md", + "url": "/guia/flujos-de-trabajo/desarrollo-local/", + "lang": "es", + "type": "redirect", + "translationKey": "redirects-es-ft-desarrollo-local-md", + "sha256": "937532894c8b85c99b43a4ce12000c138f40a01642a90e4dec0205ab04d4ad73" + }, + { + "source": "redirects/en-cust-styling.md", + "content_path": "content/en/docs/customization/styling.md", + "url": "/docs/customization/styling/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-cust-styling-md", + "sha256": "eba960fdc0eb35e65469e37ebb68a02fc581282cf47f704feb6f69419a327474" + }, + { + "source": "redirects/en-ref-csv-stories-glossary.md", + "content_path": "content/en/docs/reference/csv-stories-glossary.md", + "url": "/docs/reference/csv-stories-glossary/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-ref-csv-stories-glossary-md", + "sha256": "ee3654871cd08e0538306658a28dd3a82c84ff5d69e8b287a574c5033c6a1786" + }, + { + "source": "redirects/es-ft-inicio-rapido-guiado.md", + "content_path": "content/es/guia/flujos-de-trabajo/inicio-rapido-guiado.md", + "url": "/guia/flujos-de-trabajo/inicio-rapido-guiado/", + "lang": "es", + "type": "redirect", + "translationKey": "redirects-es-ft-inicio-rapido-guiado-md", + "sha256": "9248c8e020383d03a34146af568c88bd191bdd354b725d3a3e49cdabf67f6589" + }, + { + "source": "redirects/es-ft-flujos-de-trabajo.md", + "content_path": "content/es/guia/flujos-de-trabajo/_index.md", + "url": "/guia/flujos-de-trabajo/", + "lang": "es", + "type": "redirect", + "translationKey": "redirects-es-ft-flujos-de-trabajo-md", + "sha256": "56b4d94f9d46b317030d119be5363efa27bedc5fc25776dd0bf0b9fae04f2ef0" + }, + { + "source": "redirects/en-wf-guided-quickstart.md", + "content_path": "content/en/docs/workflows/guided-quickstart.md", + "url": "/docs/workflows/guided-quickstart/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-wf-guided-quickstart-md", + "sha256": "e551f0db4b30fbc009710d0c172aab6856423ed339d1dea6b12cd487ab3611eb" + }, + { + "source": "redirects/en-workshop.md", + "content_path": "content/en/workshop.md", + "url": "/workshop/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-workshop-md", + "sha256": "247f9c6d3aa3fdc5731ea10f6b5b46daff3fa01d40cbee1bc1f8d2a18445542d" + }, + { + "source": "redirects/es-iiif-contenido-demo.md", + "content_path": "content/es/guia/iiif/contenido-demostracion.md", + "url": "/guia/iiif/contenido-demostracion/", + "lang": "es", + "type": "redirect", + "translationKey": "redirects-es-iiif-contenido-demo-md", + "sha256": "a683cfc1de26ea6585fee00fabacec814ff0753530dd94dd6a52f9a3af2ee945" + }, + { + "source": "redirects/en-cs-glossary.md", + "content_path": "content/en/docs/content-structure/glossary.md", + "url": "/docs/content-structure/glossary/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-cs-glossary-md", + "sha256": "1634cfd5539a70ca119f48b79415dd87095f0c80e9893364b29d44d8f68bb783" + }, + { + "source": "redirects/es-integracion-iiif.md", + "content_path": "content/es/guia/integracion-iiif.md", + "url": "/guia/integracion-iiif/", + "lang": "es", + "type": "redirect", + "translationKey": "redirects-es-integracion-iiif-md", + "sha256": "aa1d3b2fb08bb3e97a3009e6cc4717bc4be832211f85380144a2916096767b9c" + }, + { + "source": "redirects/es-ft-insercion.md", + "content_path": "content/es/guia/flujos-de-trabajo/insercion.md", + "url": "/guia/flujos-de-trabajo/insercion/", + "lang": "es", + "type": "redirect", + "translationKey": "redirects-es-ft-insercion-md", + "sha256": "47b23a0417b79e635cf8f904557391947cf39a083c6045f80bad2a2cb3cb0402" + }, + { + "source": "redirects/es-conf-desarrollo-local.md", + "content_path": "content/es/guia/configuracion/desarrollo-local.md", + "url": "/guia/configuracion/desarrollo-local/", + "lang": "es", + "type": "redirect", + "translationKey": "redirects-es-conf-desarrollo-local-md", + "sha256": "1b70544eb3a844f0dfe485bbe47e4aa66d2a8f4cceb65c1e070484174e2b7b86" + }, + { + "source": "redirects/es-pers-moviles.md", + "content_path": "content/es/guia/personalizacion/moviles.md", + "url": "/guia/personalizacion/moviles/", + "lang": "es", + "type": "redirect", + "translationKey": "redirects-es-pers-moviles-md", + "sha256": "7d4ac59e0a1bebfa68b7e42b2d0125b0984b2b1b38717d9ce35eae79fd9f27ef" + }, + { + "source": "redirects/es-ft-actualizacion.md", + "content_path": "content/es/guia/flujos-de-trabajo/actualizacion.md", + "url": "/guia/flujos-de-trabajo/actualizacion/", + "lang": "es", + "type": "redirect", + "translationKey": "redirects-es-ft-actualizacion-md", + "sha256": "d48bd4b37764245d748701e4bca0d675d404f51bc5ab14ef2ba8b3ed6d3bdfcf" + }, + { + "source": "redirects/en-cs-custom-pages.md", + "content_path": "content/en/docs/content-structure/custom-pages.md", + "url": "/docs/content-structure/custom-pages/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-cs-custom-pages-md", + "sha256": "77dcb846de53508748564ed4eb3530273d2e4b1de92301f5ffa63f57dccaa730" + }, + { + "source": "redirects/en-wf-upgrading.md", + "content_path": "content/en/docs/workflows/upgrading.md", + "url": "/docs/workflows/upgrading/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-wf-upgrading-md", + "sha256": "2951c3eb6eb51534802d03962e79e0c832dbfa868f3a4ff1186cec50214c6b93" + }, + { + "source": "redirects/en-ref-config-validator.md", + "content_path": "content/en/docs/reference/config-validator.md", + "url": "/docs/reference/config-validator/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-ref-config-validator-md", + "sha256": "a7a68d5a95b79e01a9f41cecdea5b6c4d6b5ac3d67d9ec0c9474909bb25d612f" + }, + { + "source": "redirects/en-cs-objects-gallery.md", + "content_path": "content/en/docs/content-structure/objects-gallery.md", + "url": "/docs/content-structure/objects-gallery/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-cs-objects-gallery-md", + "sha256": "48c46ce5f305c3e3fe7751a991c34476079605e4f45f411a2c0919b293cac69a" + }, + { + "source": "redirects/es-ref-generador.md", + "content_path": "content/es/guia/referencia/generador-de-configuracion.md", + "url": "/guia/referencia/generador-de-configuracion/", + "lang": "es", + "type": "redirect", + "translationKey": "redirects-es-ref-generador-md", + "sha256": "a19fc5d7ff792c9e565bafb62dd90f7bc2ad86e93928238df475bf09c51bf83a" + }, + { + "source": "redirects/en-cs-private-stories.md", + "content_path": "content/en/docs/content-structure/private-stories.md", + "url": "/docs/content-structure/private-stories/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-cs-private-stories-md", + "sha256": "0f945c46b166f89826773881fbcebdb27934c5245d3d742675fd40d5cfdbe106" + }, + { + "source": "redirects/en-wf-local-dev.md", + "content_path": "content/en/docs/workflows/local-dev.md", + "url": "/docs/workflows/local-dev/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-wf-local-dev-md", + "sha256": "9c2047ffc7972796a598578a3cb83729c8e254d4439e1a4975d278d1fa6175b4" + }, + { + "source": "redirects/en-content-structure.md", + "content_path": "content/en/docs/content-structure/_index.md", + "url": "/docs/content-structure/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-content-structure-md", + "sha256": "369ad6c019ed101671d9f0431072b45f8d15b4e22df09c68d530beca9225ba4a" + }, + { + "source": "redirects/es-ref-sintaxis-markdown.md", + "content_path": "content/es/guia/referencia/sintaxis-markdown.md", + "url": "/guia/referencia/sintaxis-markdown/", + "lang": "es", + "type": "redirect", + "translationKey": "redirects-es-ref-sintaxis-markdown-md", + "sha256": "3ee3d36e8a7dd16dd648c75fb1b4cc97957ddeab607108052b249419a5084436" + }, + { + "source": "redirects/en-gs-quick-start.md", + "content_path": "content/en/docs/getting-started/quick-start.md", + "url": "/docs/getting-started/quick-start/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-gs-quick-start-md", + "sha256": "b21ca966168bef67051feb8121af83cf357f071533a9f6e27eac061aa0369b11" + }, + { + "source": "redirects/es-pp-inicio-rapido.md", + "content_path": "content/es/guia/primeros-pasos/inicio-rapido.md", + "url": "/guia/primeros-pasos/inicio-rapido/", + "lang": "es", + "type": "redirect", + "translationKey": "redirects-es-pp-inicio-rapido-md", + "sha256": "b8fcb6710964aa9bb245d6ac1119f4959b19df0b3290525c62aeae161ef61c63" + }, + { + "source": "redirects/es-pers-estilos.md", + "content_path": "content/es/guia/personalizacion/estilos.md", + "url": "/guia/personalizacion/estilos/", + "lang": "es", + "type": "redirect", + "translationKey": "redirects-es-pers-estilos-md", + "sha256": "9a643eeb5fea98e811ab493ab975776b4261ac2ccaf622a3aaff48d7055231d0" + }, + { + "source": "redirects/en-wf-hybrid.md", + "content_path": "content/en/docs/workflows/hybrid.md", + "url": "/docs/workflows/hybrid/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-wf-hybrid-md", + "sha256": "3deddc605edfa39d99c8e898f82bf8ed2d433b166cb086872ef83530e1da4a16" + }, + { + "source": "redirects/en-ref-csv-project-objects.md", + "content_path": "content/en/docs/reference/csv-project-objects.md", + "url": "/docs/reference/csv-project-objects/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-ref-csv-project-objects-md", + "sha256": "d474a32c3d50c061c464688fcfd7b38c3950669211eb36afbc5c590168bd1cfe" + }, + { + "source": "redirects/en-ref-markdown-syntax.md", + "content_path": "content/en/docs/reference/markdown-syntax.md", + "url": "/docs/reference/markdown-syntax/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-ref-markdown-syntax-md", + "sha256": "6c8f49cc7c6b181b83eddcb4026193cc27300d1cb5bf5723838a2ae3a2bc31ef" + }, + { + "source": "redirects/en-ref-configuration.md", + "content_path": "content/en/docs/reference/configuration.md", + "url": "/docs/reference/configuration/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-ref-configuration-md", + "sha256": "6ac295a4f2388c2aa1486d2142d087a2b7a5dc1dfe3a48e96e5278384a5eec7b" + }, + { + "source": "redirects/es-ft-interfaz-web-github.md", + "content_path": "content/es/guia/flujos-de-trabajo/interfaz-web-github.md", + "url": "/guia/flujos-de-trabajo/interfaz-web-github/", + "lang": "es", + "type": "redirect", + "translationKey": "redirects-es-ft-interfaz-web-github-md", + "sha256": "124f900b5f69ffc64ca53a946827cf3536944ca949bd25cece4c943b3d7b0d36" + }, + { + "source": "redirects/en-wf-workflows.md", + "content_path": "content/en/docs/workflows/_index.md", + "url": "/docs/workflows/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-wf-workflows-md", + "sha256": "ed464c9f94ef05cc6d28aba994801a2af7e981b56accbaa212efe963fc13cca2" + }, + { + "source": "redirects/es-ref-csv-proyecto-objetos.md", + "content_path": "content/es/guia/referencia/csv-proyecto-objetos.md", + "url": "/guia/referencia/csv-proyecto-objetos/", + "lang": "es", + "type": "redirect", + "translationKey": "redirects-es-ref-csv-proyecto-objetos-md", + "sha256": "232a36e8b11bafa6788f1c27d9afbf90407d424eb416a8e87153c836b12c2b6e" + }, + { + "source": "redirects/en-worksheet.md", + "content_path": "content/en/worksheet.md", + "url": "/worksheet/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-worksheet-md", + "sha256": "112e2de231e03be1d442f56fa62e9f63f36076c15ddf19093f90d96750079d3b" + }, + { + "source": "redirects/es-ft-google-sheets.md", + "content_path": "content/es/guia/flujos-de-trabajo/google-sheets.md", + "url": "/guia/flujos-de-trabajo/google-sheets/", + "lang": "es", + "type": "redirect", + "translationKey": "redirects-es-ft-google-sheets-md", + "sha256": "86b7dcdcde1e46b15b35648c2bb2445769b5d972a05bf756f873ee3ffb18aeb3" + }, + { + "source": "redirects/es-ft-hibrido.md", + "content_path": "content/es/guia/flujos-de-trabajo/hibrido.md", + "url": "/guia/flujos-de-trabajo/hibrido/", + "lang": "es", + "type": "redirect", + "translationKey": "redirects-es-ft-hibrido-md", + "sha256": "6fb7022a634be62edc7290a309658d55c1006e48696ab617a6f12e9979fe289b" + }, + { + "source": "redirects/en-cs-stories-panels.md", + "content_path": "content/en/docs/content-structure/stories-panels.md", + "url": "/docs/content-structure/stories-panels/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-cs-stories-panels-md", + "sha256": "d7e93898f18a6e3f87056ed181af73577b4176c9dac0c64fbd19e9e2a08a73d8" + }, + { + "source": "redirects/en-setup-local-dev.md", + "content_path": "content/en/docs/setup/local-dev.md", + "url": "/docs/setup/local-dev/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-setup-local-dev-md", + "sha256": "056c9df5c68c5ac1124355dcd81e3d7ef4adb516086d4e997920e0327b372797" + }, + { + "source": "redirects/es-ref-csv-historias-glosario.md", + "content_path": "content/es/guia/referencia/csv-historias-glosario.md", + "url": "/guia/referencia/csv-historias-glosario/", + "lang": "es", + "type": "redirect", + "translationKey": "redirects-es-ref-csv-historias-glosario-md", + "sha256": "5fa241f2809d8ee6c2a1734760391e0556b476a841169c82a62247a41ee13a08" + }, + { + "source": "redirects/es-ref-configuracion.md", + "content_path": "content/es/guia/referencia/configuracion.md", + "url": "/guia/referencia/configuracion/", + "lang": "es", + "type": "redirect", + "translationKey": "redirects-es-ref-configuracion-md", + "sha256": "8096facf49d06dedbd4baef9b78cf879d284c8f7f9231e343ab8b2eb3c5081dc" + }, + { + "source": "redirects/es-pp-como-funciona-telar.md", + "content_path": "content/es/guia/primeros-pasos/como-funciona-telar.md", + "url": "/guia/primeros-pasos/como-funciona-telar/", + "lang": "es", + "type": "redirect", + "translationKey": "redirects-es-pp-como-funciona-telar-md", + "sha256": "8a7221ed12d798427411d80401cf1fc0fd3215a9f8de019841aba0e4b4743583" + }, + { + "source": "redirects/es-estructura-contenido.md", + "content_path": "content/es/guia/estructura-de-contenido/_index.md", + "url": "/guia/estructura-de-contenido/", + "lang": "es", + "type": "redirect", + "translationKey": "redirects-es-estructura-contenido-md", + "sha256": "1f771c7deea658e0d176a4e6b50473c9e2c14efc771a104ba587f4b009096a71" + }, + { + "source": "redirects/es-ec-historias-paneles.md", + "content_path": "content/es/guia/estructura-de-contenido/historias-paneles.md", + "url": "/guia/estructura-de-contenido/historias-paneles/", + "lang": "es", + "type": "redirect", + "translationKey": "redirects-es-ec-historias-paneles-md", + "sha256": "b7aad9b8abc55f0faefdc149284e95e538bc6736b6e6320ef3835dd1af54b33a" + }, + { + "source": "redirects/es-ec-historias-privadas.md", + "content_path": "content/es/guia/estructura-de-contenido/historias-privadas.md", + "url": "/guia/estructura-de-contenido/historias-privadas/", + "lang": "es", + "type": "redirect", + "translationKey": "redirects-es-ec-historias-privadas-md", + "sha256": "93f7b97bdd5b1e278e18834ff2a7a979c894b2a2f7d3b27b7ef50a7d2bd73bcd" + }, + { + "source": "redirects/en-wf-github-web.md", + "content_path": "content/en/docs/workflows/github-web.md", + "url": "/docs/workflows/github-web/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-wf-github-web-md", + "sha256": "9aed1758956b38c4428ed439f01f6ec9b500d4cc2f783b4d49265237d1283c9b" + }, + { + "source": "redirects/en-iiif-integration.md", + "content_path": "content/en/docs/iiif-integration.md", + "url": "/docs/iiif-integration/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-iiif-integration-md", + "sha256": "9dff2fbcf10e5145c4891a1a3baed1717e8ca6042621371d87c93466f7835414" + }, + { + "source": "redirects/en-ref-config-generator.md", + "content_path": "content/en/docs/reference/config-generator.md", + "url": "/docs/reference/config-generator/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-ref-config-generator-md", + "sha256": "a45401c9a3192d77e435052655b0c7c09c886a741c1e35d8f57694a3bbde4b2e" + }, + { + "source": "redirects/es-ref-validador.md", + "content_path": "content/es/guia/referencia/validador-de-configuracion.md", + "url": "/guia/referencia/validador-de-configuracion/", + "lang": "es", + "type": "redirect", + "translationKey": "redirects-es-ref-validador-md", + "sha256": "68bcaadceea83cf28bda82d3d8f76850613e6a0c1ad9e814c0b78d82518d3e49" + }, + { + "source": "redirects/en-gs-how-telar-works.md", + "content_path": "content/en/docs/getting-started/how-telar-works.md", + "url": "/docs/getting-started/how-telar-works/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-gs-how-telar-works-md", + "sha256": "7e4454a49ffe39dcdec48fe1e758fba5f556dca4783fe637ee2869cf14dea2bc" + }, + { + "source": "redirects/en-iiif-demo-content.md", + "content_path": "content/en/docs/iiif/demo-content.md", + "url": "/docs/iiif/demo-content/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-iiif-demo-content-md", + "sha256": "326140e23bd7cdf802d82b0542b40ea8c35de04d34d1cf77a422ea44f70fad42" + }, + { + "source": "redirects/en-cust-mobile.md", + "content_path": "content/en/docs/customization/mobile.md", + "url": "/docs/customization/mobile/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-cust-mobile-md", + "sha256": "a5f48cf10bacc167c8e0e6a590f7db54a75e128f65390c1e7bdfbf654ff74233" + }, + { + "source": "redirects/es-ec-glosario.md", + "content_path": "content/es/guia/estructura-de-contenido/glosario.md", + "url": "/guia/estructura-de-contenido/glosario/", + "lang": "es", + "type": "redirect", + "translationKey": "redirects-es-ec-glosario-md", + "sha256": "58d9dd05c0487e491e4433e406636e9a581e5ae4a5c88e3c576c8321441a4f8c" + }, + { + "source": "redirects/es-ec-paginas-personalizadas.md", + "content_path": "content/es/guia/estructura-de-contenido/paginas-personalizadas.md", + "url": "/guia/estructura-de-contenido/paginas-personalizadas/", + "lang": "es", + "type": "redirect", + "translationKey": "redirects-es-ec-paginas-personalizadas-md", + "sha256": "431108417afe4f7c410da571a7468adf447e73587931f267d8a6e09a3a787d9a" + }, + { + "source": "redirects/es-ec-widgets.md", + "content_path": "content/es/guia/estructura-de-contenido/widgets.md", + "url": "/guia/estructura-de-contenido/widgets/", + "lang": "es", + "type": "redirect", + "translationKey": "redirects-es-ec-widgets-md", + "sha256": "4ea48b1a3b51464ab5e4177bfc57f7a733c03f0934bb58a3af2a682e28c58275" + }, + { + "source": "redirects/en-cs-widgets.md", + "content_path": "content/en/docs/content-structure/widgets.md", + "url": "/docs/content-structure/widgets/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-cs-widgets-md", + "sha256": "1d9bfafdf4b2c64b6ea83c84d3e6850e91a6157ff0887e7c2fba70f80e0a6672" + }, + { + "source": "redirects/en-wf-google-sheets.md", + "content_path": "content/en/docs/workflows/google-sheets.md", + "url": "/docs/workflows/google-sheets/", + "lang": "en", + "type": "redirect", + "translationKey": "redirects-en-wf-google-sheets-md", + "sha256": "494854f9951c33589b5b67aa9da1c15a9e4a405edc886272b428edbb72f4124a" + }, + { + "source": "guides/local-content.en.md", + "content_path": "content/en/docs/local-authoring/content.md", + "url": "/docs/local-authoring/content/", + "lang": "en", + "type": "guide", + "translationKey": "docs-local-authoring-content", + "sha256": "01be9ff86fb11c5bba5c2e4c224550398b72264b2729ddadf9ae60126db755bb" + }, + { + "source": "guides/sheets.en.html", + "content_path": "content/en/docs/google-sheets.md", + "url": "/docs/google-sheets/", + "lang": "en", + "type": "guide", + "translationKey": "docs-google-sheets", + "sha256": "d44561ef17e38fcdc34d2b622eb15e6551dc96867fdfdf93c698bf6050ad8990" + }, + { + "source": "guides/local-preview.es.md", + "content_path": "content/es/guia/autoria-local/vista-previa.md", + "url": "/guia/autoria-local/vista-previa/", + "lang": "es", + "type": "guide", + "translationKey": "docs-local-authoring-preview", + "sha256": "77841c15672ac7d57aedbb921b1ac051ececb64d4d49cadd97890560dea7307f" + }, + { + "source": "guides/compositor-pages.en.md", + "content_path": "content/en/docs/the-compositor/pages.md", + "url": "/docs/the-compositor/pages/", + "lang": "en", + "type": "guide", + "translationKey": "docs-the-compositor-pages", + "sha256": "cef1ec3ec7a46a3a001aa9fd91da9e03477790897e584fbf6f68632e1badb00d" + }, + { + "source": "guides/local-preview.en.md", + "content_path": "content/en/docs/local-authoring/preview.md", + "url": "/docs/local-authoring/preview/", + "lang": "en", + "type": "guide", + "translationKey": "docs-local-authoring-preview", + "sha256": "975b368d0299749be12860373b7226478d7fc044a9857b4cf4af72dab426eb50" + }, + { + "source": "guides/local-content.es.md", + "content_path": "content/es/guia/autoria-local/contenido.md", + "url": "/guia/autoria-local/contenido/", + "lang": "es", + "type": "guide", + "translationKey": "docs-local-authoring-content", + "sha256": "7aca98bba7eca26b16deb194db3fbeeb2fdb39ef47d3d0748c817a3f066a1401" + }, + { + "source": "guides/compositor-pages.es.md", + "content_path": "content/es/guia/el-compositor/paginas.md", + "url": "/guia/el-compositor/paginas/", + "lang": "es", + "type": "guide", + "translationKey": "docs-the-compositor-pages", + "sha256": "4ce892497b02e2553eabbf32cee18c57aecd536246cbe5e419378536d66de15b" + }, + { + "source": "guides/planning.es.html", + "content_path": "content/es/guia/planear/_index.md", + "url": "/guia/planear/", + "lang": "es", + "type": "guide", + "translationKey": "docs-plan", + "sha256": "dc9c79d9874e361a3a6360b8a5d12c90ef333e9bdc083f0337d886ad27abfa78" + }, + { + "source": "guides/teaching-request.en.html", + "content_path": "content/en/docs/teaching/request-access.md", + "url": "/docs/teaching/request-access/", + "lang": "en", + "type": "guide", + "translationKey": "docs-teaching-request-access", + "sha256": "9767a762415a5ef8bac28360b28fee059ec9061cb5756cb45a37bd467207423d" + }, + { + "source": "guides/local.en.html", + "content_path": "content/en/docs/local-authoring/_index.md", + "url": "/docs/local-authoring/", + "lang": "en", + "type": "guide", + "translationKey": "docs-local-authoring", + "sha256": "dd4b88736ee9bf52847c4bd2e4f7e6e4fb8500f6a3d8d10deab738c4ffcf3732" + }, + { + "source": "guides/planning-sources.es.md", + "content_path": "content/es/guia/planear/fuentes-y-encuadres.md", + "url": "/guia/planear/fuentes-y-encuadres/", + "lang": "es", + "type": "guide", + "translationKey": "docs-plan-sources-and-framing", + "sha256": "9ec54426b0906954668c4b788eb012d3466d81a633e2ea0b75c867c3cb9aa778" + }, + { + "source": "guides/planning-layout.es.md", + "content_path": "content/es/guia/planear/organizar-la-exhibicion.md", + "url": "/guia/planear/organizar-la-exhibicion/", + "lang": "es", + "type": "guide", + "translationKey": "docs-plan-exhibition-layout", + "sha256": "055c5d0c6d5ab92e5bb70a65bde95dcf81a20b7917cad09de3dc95a3b159a384" + }, + { + "source": "guides/iiif.es.md", + "content_path": "content/es/guia/el-compositor/iiif-a-historia.md", + "url": "/guia/el-compositor/iiif-a-historia/", + "lang": "es", + "type": "guide", + "translationKey": "docs-the-compositor-iiif-to-story", + "sha256": "de2ec3def06850ce0c82098c615c393f7dd7981457c819a03b141df3fb195808" + }, + { + "source": "guides/reference.en.html", + "content_path": "content/en/docs/reference/_index.md", + "url": "/docs/reference/", + "lang": "en", + "type": "guide", + "translationKey": "docs-reference", + "sha256": "717ce2514bb9e8ceb991d641c6e1596dfd35716f1f77c713e97a935a21617b14" + }, + { + "source": "guides/teaching.es.html", + "content_path": "content/es/guia/ensenar/_index.md", + "url": "/guia/ensenar/", + "lang": "es", + "type": "guide", + "translationKey": "docs-teaching", + "sha256": "e654d7c2a641c63a5b6bd7132b0fa9823ca3e4ad93b8c5cff5d434f27e19b903" + }, + { + "source": "guides/planning-layout.en.md", + "content_path": "content/en/docs/plan/exhibition-layout.md", + "url": "/docs/plan/exhibition-layout/", + "lang": "en", + "type": "guide", + "translationKey": "docs-plan-exhibition-layout", + "sha256": "75048add869a391d85c1880f30e0465cb4573fcc59fba5f4f416b9c5f4b413a0" + }, + { + "source": "guides/planning-sources.en.md", + "content_path": "content/en/docs/plan/sources-and-framing.md", + "url": "/docs/plan/sources-and-framing/", + "lang": "en", + "type": "guide", + "translationKey": "docs-plan-sources-and-framing", + "sha256": "d82b71982882f4de5945d319f1b9ca8254189f38fc93cdd794be2e1e698c4d5b" + }, + { + "source": "guides/iiif.en.md", + "content_path": "content/en/docs/the-compositor/iiif-to-story.md", + "url": "/docs/the-compositor/iiif-to-story/", + "lang": "en", + "type": "guide", + "translationKey": "docs-the-compositor-iiif-to-story", + "sha256": "cee1a12001d7976819433e01be5f6dba5f60f4fb5da6f532cedb8aae20059d10" + }, + { + "source": "guides/compositor-recovery.es.md", + "content_path": "content/es/guia/el-compositor/solucionar-problemas.md", + "url": "/guia/el-compositor/solucionar-problemas/", + "lang": "es", + "type": "guide", + "translationKey": "docs-the-compositor-troubleshooting", + "sha256": "37476d97b1ad0e3c6dcc40538a2f078a6bc3be707df3315a5187a3199daca3ae" + }, + { + "source": "guides/sheets.es.html", + "content_path": "content/es/guia/google-sheets.md", + "url": "/guia/google-sheets/", + "lang": "es", + "type": "guide", + "translationKey": "docs-google-sheets", + "sha256": "da5246ae47cb524ef235db19c4ac42447d0da48e87c2dd949bc9ea3992d5dac0" + }, + { + "source": "guides/planning-review.en.md", + "content_path": "content/en/docs/plan/review.md", + "url": "/docs/plan/review/", + "lang": "en", + "type": "guide", + "translationKey": "docs-plan-review", + "sha256": "34ca3366816f971713d2d8a8888cbd4654aadd983295aa7d20d368481b4255bf" + }, + { + "source": "guides/planning-layers.en.md", + "content_path": "content/en/docs/plan/layers-and-glossary.md", + "url": "/docs/plan/layers-and-glossary/", + "lang": "en", + "type": "guide", + "translationKey": "docs-plan-layers-and-glossary", + "sha256": "ec85c463a5df1133395fd7381a922bd15e83a274fe91fce251c034d64c721abd" + }, + { + "source": "guides/planning-review.es.md", + "content_path": "content/es/guia/planear/revision.md", + "url": "/guia/planear/revision/", + "lang": "es", + "type": "guide", + "translationKey": "docs-plan-review", + "sha256": "ae814ff77d2a332c71241953bfd02fb5c2358f5182a8a24fc3b35f981b77e682" + }, + { + "source": "guides/compositor-recovery.en.md", + "content_path": "content/en/docs/the-compositor/troubleshooting.md", + "url": "/docs/the-compositor/troubleshooting/", + "lang": "en", + "type": "guide", + "translationKey": "docs-the-compositor-troubleshooting", + "sha256": "957eca1aa3d93485f1c5aca227d8ee284333c52927953ca7885bd60fc540ea1e" + }, + { + "source": "guides/planning.en.html", + "content_path": "content/en/docs/plan/_index.md", + "url": "/docs/plan/", + "lang": "en", + "type": "guide", + "translationKey": "docs-plan", + "sha256": "8a2c3502f8e7904c7958253c4542b2a6398af72cb0c1f9adfb4a16f8b08d1361" + }, + { + "source": "guides/local.es.html", + "content_path": "content/es/guia/autoria-local/_index.md", + "url": "/guia/autoria-local/", + "lang": "es", + "type": "guide", + "translationKey": "docs-local-authoring", + "sha256": "29ad417523f08afe7b3da74d1cc2ff09560e811931563a1ceaf5caaa03cb0489" + }, + { + "source": "guides/teaching-request.es.html", + "content_path": "content/es/guia/ensenar/solicitar-acceso.md", + "url": "/guia/ensenar/solicitar-acceso/", + "lang": "es", + "type": "guide", + "translationKey": "docs-teaching-request-access", + "sha256": "7d4d56126ce52cee166af5b5fa6a14345a461807d89339295675ab2550865549" + }, + { + "source": "guides/planning-layers.es.md", + "content_path": "content/es/guia/planear/capas-y-glosario.md", + "url": "/guia/planear/capas-y-glosario/", + "lang": "es", + "type": "guide", + "translationKey": "docs-plan-layers-and-glossary", + "sha256": "e7346ffce30339551a423a92d7b8a54548d7f3a93878f69571160671e2cf7b38" + }, + { + "source": "guides/compositor-glossary.en.md", + "content_path": "content/en/docs/the-compositor/glossary.md", + "url": "/docs/the-compositor/glossary/", + "lang": "en", + "type": "guide", + "translationKey": "docs-the-compositor-glossary", + "sha256": "c5e904ce600b3ccfcf28c694297703175051eb16c451a22c3bd526f29afc191c" + }, + { + "source": "guides/compositor-courses.en.md", + "content_path": "content/en/docs/the-compositor/courses.md", + "url": "/docs/the-compositor/courses/", + "lang": "en", + "type": "guide", + "translationKey": "docs-the-compositor-courses", + "sha256": "bf228adb8dff8e17cc0ba26c7bb2a0759ec524eee564f4f7f27dffd00564936d" + }, + { + "source": "guides/compositor-team.en.md", + "content_path": "content/en/docs/the-compositor/team.md", + "url": "/docs/the-compositor/team/", + "lang": "en", + "type": "guide", + "translationKey": "docs-the-compositor-team", + "sha256": "65c3b949400de0acf1d7c01fa4928ff992c5d6e0cf1b48751e5fa579ac65d337" + }, + { + "source": "guides/compositor-settings.en.md", + "content_path": "content/en/docs/the-compositor/settings.md", + "url": "/docs/the-compositor/settings/", + "lang": "en", + "type": "guide", + "translationKey": "docs-the-compositor-settings", + "sha256": "710d385cb2182410182e7d79d2a172f01f132bf55c030bea168201eda1b195ef" + }, + { + "source": "guides/local-publish.en.md", + "content_path": "content/en/docs/local-authoring/publish.md", + "url": "/docs/local-authoring/publish/", + "lang": "en", + "type": "guide", + "translationKey": "docs-local-authoring-publish", + "sha256": "8157eb0c033838d915e3cca5cf457a41156d28c9cac9f39930ac57df61251fef" + }, + { + "source": "guides/reference.es.html", + "content_path": "content/es/guia/referencia/_index.md", + "url": "/guia/referencia/", + "lang": "es", + "type": "guide", + "translationKey": "docs-reference", + "sha256": "9ad25b83cbe5c50bcee737b5166d8b11f19f8b63af4bc7829303fd6ac9ba38b7" + }, + { + "source": "guides/compositor-team.es.md", + "content_path": "content/es/guia/el-compositor/equipo.md", + "url": "/guia/el-compositor/equipo/", + "lang": "es", + "type": "guide", + "translationKey": "docs-the-compositor-team", + "sha256": "112e761b35429c97c8a8211097f3e396ffe24604fd78d4e23799bfaf63942b63" + }, + { + "source": "guides/teaching.en.html", + "content_path": "content/en/docs/teaching/_index.md", + "url": "/docs/teaching/", + "lang": "en", + "type": "guide", + "translationKey": "docs-teaching", + "sha256": "5fccf3f023234edb28a82271e4dd59392dcca91abe60639de8daab7e13ee970f" + }, + { + "source": "guides/compositor-courses.es.md", + "content_path": "content/es/guia/el-compositor/cursos.md", + "url": "/guia/el-compositor/cursos/", + "lang": "es", + "type": "guide", + "translationKey": "docs-the-compositor-courses", + "sha256": "6921b2cba025a63f7ea603893d2221fcb5c5d0e4d657693fd1aa10412ed7c2e0" + }, + { + "source": "guides/compositor-glossary.es.md", + "content_path": "content/es/guia/el-compositor/glosario.md", + "url": "/guia/el-compositor/glosario/", + "lang": "es", + "type": "guide", + "translationKey": "docs-the-compositor-glossary", + "sha256": "742d2ccd80ecdc8044f3390067e0f4e21298467865cb5fb52872c4443185fbd6" + }, + { + "source": "guides/local-publish.es.md", + "content_path": "content/es/guia/autoria-local/publicar.md", + "url": "/guia/autoria-local/publicar/", + "lang": "es", + "type": "guide", + "translationKey": "docs-local-authoring-publish", + "sha256": "b00441925b9bccc085c91b6c0acda974453337bcb73f281618fd9f1e3d6277ee" + }, + { + "source": "guides/compositor-settings.es.md", + "content_path": "content/es/guia/el-compositor/configuracion.md", + "url": "/guia/el-compositor/configuracion/", + "lang": "es", + "type": "guide", + "translationKey": "docs-the-compositor-settings", + "sha256": "06f8513ffeb35be3b8b5cd0e378a3fa1709867addd9c663cae52e8dad0529388" + } + ], + "heading_warnings": [] +} diff --git a/migration/legacy-routes.json b/migration/legacy-routes.json new file mode 100644 index 0000000..3fedc6e --- /dev/null +++ b/migration/legacy-routes.json @@ -0,0 +1,592 @@ +[ + { + "file": "docs/1-0-getting-started.es.md", + "url": "/guia/primeros-pasos/", + "lang": "es" + }, + { + "file": "docs/1-0-getting-started.md", + "url": "/docs/getting-started/", + "lang": "en" + }, + { + "file": "docs/1-1-compositor.es.md", + "url": "/guia/primeros-pasos/compositor/", + "lang": "es" + }, + { + "file": "docs/1-1-compositor.md", + "url": "/docs/getting-started/compositor/", + "lang": "en" + }, + { + "file": "docs/1-2-google-sheets-option.es.md", + "url": "/guia/primeros-pasos/google-sheets/", + "lang": "es" + }, + { + "file": "docs/1-2-google-sheets-option.md", + "url": "/docs/getting-started/google-sheets/", + "lang": "en" + }, + { + "file": "docs/1-3-local-dev.es.md", + "url": "/guia/primeros-pasos/desarrollo-local/", + "lang": "es" + }, + { + "file": "docs/1-3-local-dev.md", + "url": "/docs/getting-started/local-dev/", + "lang": "en" + }, + { + "file": "docs/1-4-narrative-structure.es.md", + "url": "/guia/primeros-pasos/estructura-narrativa/", + "lang": "es" + }, + { + "file": "docs/1-4-narrative-structure.md", + "url": "/docs/getting-started/narrative-structure/", + "lang": "en" + }, + { + "file": "docs/1-5-add-content.es.md", + "url": "/guia/primeros-pasos/agrega-contenido/", + "lang": "es" + }, + { + "file": "docs/1-5-add-content.md", + "url": "/docs/getting-started/add-content/", + "lang": "en" + }, + { + "file": "docs/1-6-review-refine.es.md", + "url": "/guia/primeros-pasos/revisa-y-perfecciona/", + "lang": "es" + }, + { + "file": "docs/1-6-review-refine.md", + "url": "/docs/getting-started/review-refine/", + "lang": "en" + }, + { + "file": "docs/2-0-setup.es.md", + "url": "/guia/configuracion/", + "lang": "es" + }, + { + "file": "docs/2-0-setup.md", + "url": "/docs/setup/", + "lang": "en" + }, + { + "file": "docs/2-1-manual-setup.es.md", + "url": "/guia/configuracion/configuracion-manual/", + "lang": "es" + }, + { + "file": "docs/2-1-manual-setup.md", + "url": "/docs/setup/manual/", + "lang": "en" + }, + { + "file": "docs/2-3-upgrading.es.md", + "url": "/guia/configuracion/actualizacion/", + "lang": "es" + }, + { + "file": "docs/2-3-upgrading.md", + "url": "/docs/setup/upgrading/", + "lang": "en" + }, + { + "file": "docs/3-0-configure.es.md", + "url": "/guia/configurar/", + "lang": "es" + }, + { + "file": "docs/3-0-configure.md", + "url": "/docs/configure/", + "lang": "en" + }, + { + "file": "docs/3-1-config-generator.es.md", + "url": "/guia/configurar/generador-de-configuracion/", + "lang": "es" + }, + { + "file": "docs/3-1-config-generator.md", + "url": "/docs/configure/config-generator/", + "lang": "en" + }, + { + "file": "docs/3-2-configuration.es.md", + "url": "/guia/configurar/configuracion/", + "lang": "es" + }, + { + "file": "docs/3-2-configuration.md", + "url": "/docs/configure/configuration/", + "lang": "en" + }, + { + "file": "docs/3-3-config-validator.es.md", + "url": "/guia/configurar/validador-de-configuracion/", + "lang": "es" + }, + { + "file": "docs/3-3-config-validator.md", + "url": "/docs/configure/config-validator/", + "lang": "en" + }, + { + "file": "docs/4-0-your-content.es.md", + "url": "/guia/tu-contenido/", + "lang": "es" + }, + { + "file": "docs/4-0-your-content.md", + "url": "/docs/your-content/", + "lang": "en" + }, + { + "file": "docs/4-1-objects.es.md", + "url": "/guia/tu-contenido/objetos/", + "lang": "es" + }, + { + "file": "docs/4-1-objects.md", + "url": "/docs/your-content/objects/", + "lang": "en" + }, + { + "file": "docs/4-10-audio-objects.es.md", + "url": "/guia/tu-contenido/objetos-de-audio/", + "lang": "es" + }, + { + "file": "docs/4-10-audio-objects.md", + "url": "/docs/your-content/audio-objects/", + "lang": "en" + }, + { + "file": "docs/4-2-self-hosted-images.es.md", + "url": "/guia/tu-contenido/imagenes-autoalojadas/", + "lang": "es" + }, + { + "file": "docs/4-2-self-hosted-images.md", + "url": "/docs/your-content/self-hosted-images/", + "lang": "en" + }, + { + "file": "docs/4-3-external-iiif.es.md", + "url": "/guia/tu-contenido/iiif-externo/", + "lang": "es" + }, + { + "file": "docs/4-3-external-iiif.md", + "url": "/docs/your-content/external-iiif/", + "lang": "en" + }, + { + "file": "docs/4-4-stories-panels.es.md", + "url": "/guia/tu-contenido/historias-paneles/", + "lang": "es" + }, + { + "file": "docs/4-4-stories-panels.md", + "url": "/docs/your-content/stories-panels/", + "lang": "en" + }, + { + "file": "docs/4-5-rich-content.es.md", + "url": "/guia/tu-contenido/contenido-enriquecido/", + "lang": "es" + }, + { + "file": "docs/4-5-rich-content.md", + "url": "/docs/your-content/rich-content/", + "lang": "en" + }, + { + "file": "docs/4-6-markdown-syntax.es.md", + "url": "/guia/tu-contenido/sintaxis-markdown/", + "lang": "es" + }, + { + "file": "docs/4-6-markdown-syntax.md", + "url": "/docs/your-content/markdown-syntax/", + "lang": "en" + }, + { + "file": "docs/4-7-widgets.es.md", + "url": "/guia/tu-contenido/widgets/", + "lang": "es" + }, + { + "file": "docs/4-7-widgets.md", + "url": "/docs/your-content/widgets/", + "lang": "en" + }, + { + "file": "docs/4-8-pdf-documents.es.md", + "url": "/guia/tu-contenido/documentos-pdf/", + "lang": "es" + }, + { + "file": "docs/4-8-pdf-documents.md", + "url": "/docs/your-content/pdf-documents/", + "lang": "en" + }, + { + "file": "docs/4-9-video-objects.es.md", + "url": "/guia/tu-contenido/objetos-de-video/", + "lang": "es" + }, + { + "file": "docs/4-9-video-objects.md", + "url": "/docs/your-content/video-objects/", + "lang": "en" + }, + { + "file": "docs/5-0-your-data.es.md", + "url": "/guia/tus-datos/", + "lang": "es" + }, + { + "file": "docs/5-0-your-data.md", + "url": "/docs/your-data/", + "lang": "en" + }, + { + "file": "docs/5-1-google-sheets.es.md", + "url": "/guia/tus-datos/google-sheets/", + "lang": "es" + }, + { + "file": "docs/5-1-google-sheets.md", + "url": "/docs/your-data/google-sheets/", + "lang": "en" + }, + { + "file": "docs/5-2-csv-project.es.md", + "url": "/guia/tus-datos/csv-proyecto/", + "lang": "es" + }, + { + "file": "docs/5-2-csv-project.md", + "url": "/docs/your-data/csv-project/", + "lang": "en" + }, + { + "file": "docs/5-3-csv-objects.es.md", + "url": "/guia/tus-datos/csv-objetos/", + "lang": "es" + }, + { + "file": "docs/5-3-csv-objects.md", + "url": "/docs/your-data/csv-objects/", + "lang": "en" + }, + { + "file": "docs/5-4-csv-stories.es.md", + "url": "/guia/tus-datos/csv-historias/", + "lang": "es" + }, + { + "file": "docs/5-4-csv-stories.md", + "url": "/docs/your-data/csv-stories/", + "lang": "en" + }, + { + "file": "docs/5-5-csv-glossary.es.md", + "url": "/guia/tus-datos/csv-glosario/", + "lang": "es" + }, + { + "file": "docs/5-5-csv-glossary.md", + "url": "/docs/your-data/csv-glossary/", + "lang": "en" + }, + { + "file": "docs/6-0-site-features.es.md", + "url": "/guia/funciones/", + "lang": "es" + }, + { + "file": "docs/6-0-site-features.md", + "url": "/docs/site-features/", + "lang": "en" + }, + { + "file": "docs/6-1-objects-gallery.es.md", + "url": "/guia/funciones/galeria-objetos/", + "lang": "es" + }, + { + "file": "docs/6-1-objects-gallery.md", + "url": "/docs/site-features/objects-gallery/", + "lang": "en" + }, + { + "file": "docs/6-2-glossary.es.md", + "url": "/guia/funciones/glosario/", + "lang": "es" + }, + { + "file": "docs/6-2-glossary.md", + "url": "/docs/site-features/glossary/", + "lang": "en" + }, + { + "file": "docs/6-3-private-stories.es.md", + "url": "/guia/funciones/historias-privadas/", + "lang": "es" + }, + { + "file": "docs/6-3-private-stories.md", + "url": "/docs/site-features/private-stories/", + "lang": "en" + }, + { + "file": "docs/6-4-custom-pages.es.md", + "url": "/guia/funciones/paginas-personalizadas/", + "lang": "es" + }, + { + "file": "docs/6-4-custom-pages.md", + "url": "/docs/site-features/custom-pages/", + "lang": "en" + }, + { + "file": "docs/6-5-embedding.es.md", + "url": "/guia/funciones/insercion/", + "lang": "es" + }, + { + "file": "docs/6-5-embedding.md", + "url": "/docs/site-features/embedding/", + "lang": "en" + }, + { + "file": "docs/7-0-customization.es.md", + "url": "/guia/personalizacion/", + "lang": "es" + }, + { + "file": "docs/7-0-customization.md", + "url": "/docs/customization/", + "lang": "en" + }, + { + "file": "docs/7-1-themes.es.md", + "url": "/guia/personalizacion/temas/", + "lang": "es" + }, + { + "file": "docs/7-1-themes.md", + "url": "/docs/customization/themes/", + "lang": "en" + }, + { + "file": "docs/7-2-home-page.es.md", + "url": "/guia/personalizacion/pagina-de-inicio/", + "lang": "es" + }, + { + "file": "docs/7-2-home-page.md", + "url": "/docs/customization/home-page/", + "lang": "en" + }, + { + "file": "docs/7-3-navigation-menu.es.md", + "url": "/guia/personalizacion/menu-navegacion/", + "lang": "es" + }, + { + "file": "docs/7-3-navigation-menu.md", + "url": "/docs/customization/navigation-menu/", + "lang": "en" + }, + { + "file": "docs/7-4-demo-content.es.md", + "url": "/guia/personalizacion/contenido-demostracion/", + "lang": "es" + }, + { + "file": "docs/7-4-demo-content.md", + "url": "/docs/customization/demo-content/", + "lang": "en" + }, + { + "file": "docs/8-0-for-developers.es.md", + "url": "/guia/desarrolladores/", + "lang": "es" + }, + { + "file": "docs/8-0-for-developers.md", + "url": "/docs/developers/", + "lang": "en" + }, + { + "file": "docs/8-1-local-development.es.md", + "url": "/guia/desarrolladores/desarrollo-local/", + "lang": "es" + }, + { + "file": "docs/8-1-local-development.md", + "url": "/docs/developers/local-development/", + "lang": "en" + }, + { + "file": "docs/8-2-github-actions.es.md", + "url": "/guia/desarrolladores/github-actions/", + "lang": "es" + }, + { + "file": "docs/8-2-github-actions.md", + "url": "/docs/developers/github-actions/", + "lang": "en" + }, + { + "file": "docs/8-3-demo-system-architecture.es.md", + "url": "/guia/desarrolladores/sistema-demos/", + "lang": "es" + }, + { + "file": "docs/8-3-demo-system-architecture.md", + "url": "/docs/developers/demo-system/", + "lang": "en" + }, + { + "file": "docs/8-4-embedding-system.es.md", + "url": "/guia/desarrolladores/sistema-insercion/", + "lang": "es" + }, + { + "file": "docs/8-4-embedding-system.md", + "url": "/docs/developers/embedding-system/", + "lang": "en" + }, + { + "file": "docs/8-5-styling.es.md", + "url": "/guia/desarrolladores/estilos/", + "lang": "es" + }, + { + "file": "docs/8-5-styling.md", + "url": "/docs/developers/styling/", + "lang": "en" + }, + { + "file": "docs/8-6-mobile.es.md", + "url": "/guia/desarrolladores/moviles/", + "lang": "es" + }, + { + "file": "docs/8-6-mobile.md", + "url": "/docs/developers/mobile/", + "lang": "en" + }, + { + "file": "docs/8-7-story-engine.es.md", + "url": "/guia/desarrolladores/motor-de-historias/", + "lang": "es" + }, + { + "file": "docs/8-7-story-engine.md", + "url": "/docs/developers/story-engine/", + "lang": "en" + }, + { + "file": "docs/9-0-compositor.es.md", + "url": "/guia/el-compositor/", + "lang": "es" + }, + { + "file": "docs/9-0-compositor.md", + "url": "/docs/the-compositor/", + "lang": "en" + }, + { + "file": "docs/9-1-getting-started.es.md", + "url": "/guia/el-compositor/primeros-pasos/", + "lang": "es" + }, + { + "file": "docs/9-1-getting-started.md", + "url": "/docs/the-compositor/getting-started/", + "lang": "en" + }, + { + "file": "docs/9-2-dashboard.es.md", + "url": "/guia/el-compositor/panel-de-control/", + "lang": "es" + }, + { + "file": "docs/9-2-dashboard.md", + "url": "/docs/the-compositor/dashboard/", + "lang": "en" + }, + { + "file": "docs/9-3-objects.es.md", + "url": "/guia/el-compositor/objetos/", + "lang": "es" + }, + { + "file": "docs/9-3-objects.md", + "url": "/docs/the-compositor/objects/", + "lang": "en" + }, + { + "file": "docs/9-4-story-editor.es.md", + "url": "/guia/el-compositor/editor-historias/", + "lang": "es" + }, + { + "file": "docs/9-4-story-editor.md", + "url": "/docs/the-compositor/story-editor/", + "lang": "en" + }, + { + "file": "docs/9-5-video-audio.es.md", + "url": "/guia/el-compositor/video-y-audio/", + "lang": "es" + }, + { + "file": "docs/9-5-video-audio.md", + "url": "/docs/the-compositor/video-audio/", + "lang": "en" + }, + { + "file": "docs/9-6-publishing.es.md", + "url": "/guia/el-compositor/publicacion/", + "lang": "es" + }, + { + "file": "docs/9-6-publishing.md", + "url": "/docs/the-compositor/publishing/", + "lang": "en" + }, + { + "file": "docs/9-7-sync-updates.es.md", + "url": "/guia/el-compositor/sincronizacion-y-actualizaciones/", + "lang": "es" + }, + { + "file": "docs/9-7-sync-updates.md", + "url": "/docs/the-compositor/sync-updates/", + "lang": "en" + }, + { + "file": "docs/index.es.md", + "url": "/guia/", + "lang": "es" + }, + { + "file": "docs/index.md", + "url": "/docs/", + "lang": "en" + } +] diff --git a/migration/validation.json b/migration/validation.json new file mode 100644 index 0000000..9ab22e1 --- /dev/null +++ b/migration/validation.json @@ -0,0 +1,72 @@ +{ + "recorded_on": "2026-11-01", + "branch": "site/hugo-migration", + "baseline_html_routes": 234, + "migrated_non_home_pages": 233, + "native_homepages": [ + "/", + "/es/" + ], + "canonical_docs_pages": 160, + "legacy_route_inventory": 118, + "source_output_parity_issues": 0, + "production_checks": { + "checks": 20441, + "failures": 0, + "routes": 233 + }, + "preview_checks": { + "checks": 20370, + "failures": 0, + "routes": 233 + }, + "clean_install": "npm ci completed successfully", + "browser_checks": [ + "English and Spanish guide search", + "Native translation links and query-homepage compatibility", + "Six KaTeX expressions in the syntax reference with zero math errors", + "Configuration generator output accepted by validator with no issues", + "English and Spanish teaching requests stored in isolated local database", + "Showcase form validation and a local pending submission", + "Public showcase fixture loaded in both interface languages", + "Slash shortcut opens search; Escape closes it", + "Animated guide GIF play/stop controls" + ], + "viewport_checks": { + "mobile_width": 390, + "mobile_height": 844, + "mobile_routes": [ + "/guia/", + "/empezar/", + "/guia/el-compositor/iiif-a-historia/", + "/guia/tu-contenido/sintaxis-markdown/", + "/proyectos/compartir/", + "/es/", + "/guia/configurar/generador-de-configuracion/" + ], + "tablet_width": 768, + "tablet_height": 1024, + "tablet_routes": [ + "/docs/", + "/docs/teaching/request-access/", + "/showcase/submit/", + "/es/" + ], + "horizontal_overflow": false + }, + "notification_test": { + "teaching_records": 2, + "showcase_test_records": 1, + "notification_attempts": 0, + "sent_notices": 0, + "scope": "separate local database; synthetic contact details" + }, + "verification_scope": "pre-publication local validation", + "upstream_base": "143fc62", + "source_design_commit": "6eb1299", + "release_verification": [ + "GitHub-hosted workflow execution", + "Production deployment", + "Live notification delivery after deployment" + ] +} diff --git a/package.json b/package.json index 656e4dd..79d3537 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "scripts": { "build": "node scripts/build.mjs", "preview": "node scripts/serve.mjs", + "test": "node scripts/verify.mjs", "dev": "hugo server --config hugo.json,hugo.preview.json --bind 127.0.0.1 --port 4004 --disableFastRender", "build:preview": "node scripts/build.mjs --preview" }, diff --git a/scripts/preview-api.mjs b/scripts/preview-api.mjs new file mode 100644 index 0000000..5a72a75 --- /dev/null +++ b/scripts/preview-api.mjs @@ -0,0 +1,31 @@ +// Local integration harness. Copies code, never credentials or Worker state. +import { cpSync,existsSync,mkdtempSync,readFileSync,writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { dirname,resolve,join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { spawnSync,spawn } from 'node:child_process'; +const root=resolve(dirname(fileURLToPath(import.meta.url)),'..'); +const i=process.argv.indexOf('--worker'); +if(i<0||!process.argv[i+1]){console.error('Usage: node scripts/preview-api.mjs --worker /path/to/telar-showcase');process.exit(1)} +const source=resolve(process.argv[i+1]);const wrangler=join(source,'node_modules','.bin','wrangler'); +if(!existsSync(wrangler)||!existsSync(join(source,'src','index.ts'))){console.error('The Worker checkout and its installed Wrangler dependency are required.');process.exit(1)} +const work=mkdtempSync(join(tmpdir(),'telar-docs-preview-')); +for(const name of ['src','migrations'])cpSync(join(source,name),join(work,name),{recursive:true}); +const config={name:'telar-docs-local-api',main:'src/index.ts',compatibility_date:'2025-03-14',d1_databases:[{binding:'DB',database_name:'telar-docs-local',database_id:'00000000-0000-0000-0000-000000000000',migrations_dir:'migrations'}],vars:{ALLOWED_ORIGIN:'http://127.0.0.1:4004',TURNSTILE_SECRET:'1x0000000000000000000000000000000AA',SLACK_WEBHOOK_URL:''}}; +writeFileSync(join(work,'wrangler.json'),JSON.stringify(config,null,2)); +writeFileSync(join(work,'.dev.vars'),'SLACK_WEBHOOK_URL=""\n'); +const run=args=>{const result=spawnSync(wrangler,args,{cwd:work,stdio:'inherit'});if(result.status!==0)process.exit(result.status||1)}; +run(['d1','migrations','apply','telar-docs-local','--local','--config','wrangler.json','--persist-to','.wrangler/state']); +const projects=JSON.parse(readFileSync(join(root,'migration','fixtures','showcase.json'),'utf8')).projects; +const q=value=>value==null?'NULL':"'"+String(value).replaceAll("'","''")+"'"; +const sql=projects.map(p=>{ + const row={id:'fixture-'+p.id,created_at:p.approved_at,name:p.author||'Public showcase fixture',email:'fixture@example.invalid',title:p.title,url:p.url,description:p.description,language:p.language,context:p.context,authorship:p.authorship,consent:p.author?'named':'anonymous',status:'approved',reviewed_at:p.approved_at,image_url:p.image}; + return `INSERT OR REPLACE INTO submissions (${Object.keys(row).join(',')}) VALUES (${Object.values(row).map(q).join(',')});`; +}).join('\n'); +writeFileSync(join(work,'fixtures.sql'),sql); +if(sql)run(['d1','execute','telar-docs-local','--local','--config','wrangler.json','--persist-to','.wrangler/state','--file','fixtures.sql']); +console.log('Local preview API: http://127.0.0.1:8790 — notification delivery disabled.'); +console.log('Temporary local data:',work); +const server=spawn(wrangler,['dev','--local','--ip','127.0.0.1','--port','8790','--config','wrangler.json','--persist-to','.wrangler/state'],{cwd:work,stdio:'inherit'}); +for(const signal of ['SIGINT','SIGTERM'])process.on(signal,()=>server.kill(signal)); +server.on('exit',code=>process.exit(code??0)); diff --git a/scripts/verify.mjs b/scripts/verify.mjs new file mode 100644 index 0000000..467f443 --- /dev/null +++ b/scripts/verify.mjs @@ -0,0 +1,6 @@ +import { spawnSync } from 'node:child_process'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; +const root=resolve(dirname(fileURLToPath(import.meta.url)),'..'); +const result=spawnSync(process.env.PYTHON||'python3',[resolve(root,'scripts/verify.py')],{cwd:root,stdio:'inherit'}); +process.exit(result.status??1); diff --git a/scripts/verify.py b/scripts/verify.py new file mode 100644 index 0000000..a5bf040 --- /dev/null +++ b/scripts/verify.py @@ -0,0 +1,89 @@ +from collections import Counter,defaultdict +from html.parser import HTMLParser +from pathlib import Path +from urllib.parse import unquote,urlsplit +import html,json,re,sys +ROOT=Path(__file__).resolve().parents[1];PUBLIC=ROOT/'public' +VOID={'area','base','br','col','embed','hr','img','input','link','meta','param','source','track','wbr'} +def norm(s):return re.sub(r'\s+',' ',html.unescape(s)).strip().replace('’',"'").replace('“','"').replace('”','"').replace('…','...') +class Page(HTMLParser): + def __init__(self,path): + super().__init__(convert_charrefs=True) + self.ids=Counter();self.links=[];self.images=[];self.lang=None;self.canon=[];self.alternates={};self.titles=0;self.descriptions=0;self.robots=[];self.stack=[];self.article=None;self.active=[];self.selectors=defaultdict(list);self.runtime_urls=[] + self.feed(path.read_text()) + def handle_starttag(self,tag,attrs): + a=dict(attrs);depth=len(self.stack) + if a.get('id'):self.ids[a['id']]+=1 + for key in ('href','src'): + if a.get(key):self.links.append(a[key]) + if tag=='html':self.lang=a.get('lang') + if tag=='title':self.titles+=1 + if tag=='meta': + if a.get('name')=='description':self.descriptions+=1 + if a.get('name')=='robots':self.robots.append(a.get('content','')) + if tag=='link': + if a.get('rel')=='canonical':self.canon.append(a.get('href')) + if a.get('rel')=='alternate' and a.get('hreflang'):self.alternates[a['hreflang']]=a['href'] + if tag=='img':self.images.append(a) + if tag in ('script','iframe','img','link') and a.get('src',a.get('href')):self.runtime_urls.append(a.get('src',a.get('href'))) + if tag=='form' and a.get('action'):self.runtime_urls.append(a['action']) + if 'docs-content' in a.get('class','').split():self.article=depth + if self.article is not None: + if tag=='img':self.selectors[tag].append([a.get('src'),a.get('alt')]) + if tag in ('h1','h2','h3','h4','h5','h6','pre','table','blockquote'):self.active.append({'tag':tag,'depth':depth,'text':[]}) + if tag not in VOID:self.stack.append(tag) + def handle_endtag(self,tag): + if tag not in self.stack:return + depth=len(self.stack)-1-self.stack[::-1].index(tag) + for cap in list(self.active): + if cap['depth']>=depth:self.selectors[cap['tag']].append(norm(''.join(cap['text'])));self.active.remove(cap) + if self.article is not None and self.article>=depth:self.article=None + self.stack=self.stack[:depth] + def handle_data(self,data): + for cap in self.active:cap['text'].append(data) +inventory=json.loads((ROOT/'migration/inventory.json').read_text())['pages'] +contracts=json.loads((ROOT/'migration/content-contracts.json').read_text()) +preview=json.loads((ROOT/'.build-result.json').read_text())['preview'];base='http://127.0.0.1:4004' if preview else 'https://telar.org' +pages={};errors=[];checks=0 +def check(ok,msg): + global checks + checks+=1 + if not ok:errors.append(msg) +def route_file(route):return PUBLIC/route.strip('/')/'index.html' +for file in PUBLIC.rglob('*.html'): + if 'pagefind' not in file.parts:pages[file.resolve()]=Page(file) +pairs=defaultdict(list) +for row in inventory:pairs[row['translationKey']].append(row) +for row in inventory: + route=row['url'];p=pages.get(route_file(route).resolve());check(p is not None,'Missing route '+route) + if p is None:continue + check(p.lang==row['lang'],'Wrong language '+route);check(all(n==1 for n in p.ids.values()),'Duplicate IDs '+route) + if row['type']=='redirect':continue + check(p.titles==1 and p.descriptions==1,'Duplicate/missing metadata '+route);check(p.canon==[base+route],'Wrong canonical '+route) + for other in pairs[row['translationKey']]:check(p.alternates.get(other['lang'])==base+other['url'],'Wrong hreflang '+route) + if route in contracts: + contract=contracts[route];check(set(contract['ids']).issubset(p.ids),'Lost anchors '+route) + for selector,expected in contract['selectors'].items():check(p.selectors[selector]==expected,'Changed '+selector+' content '+route) + if preview:check(any('noindex' in v for v in p.robots),'Preview is indexable '+route) +legacy=json.loads((ROOT/'migration/legacy-routes.json').read_text()) +for row in legacy:check(route_file(row['url']).exists(),'Lost legacy route '+row['url']) +for file,p in pages.items(): + for img in p.images:check('alt' in img,'Missing image alt '+str(file)) + for href in p.links: + u=urlsplit(href);check(not re.search(r'127\.0\.0\.1:(4002|4003)',href),'Prototype dependency '+href) + if u.scheme or u.netloc:continue + target=file if not u.path else (PUBLIC/unquote(u.path.lstrip('/')) if u.path.startswith('/') else file.parent/unquote(u.path)) + if target.is_dir() or u.path.endswith('/'):target=target/'index.html' + check(target.exists(),'Broken link '+str(file.relative_to(PUBLIC))+' -> '+href) + if u.fragment and target.suffix=='.html' and target.exists(): + other=pages.get(target.resolve());check(other and unquote(u.fragment) in other.ids,'Broken fragment '+href) + if not preview:check(all('127.0.0.1' not in u for u in p.runtime_urls),'Local runtime URL in production '+str(file.relative_to(PUBLIC))) +for lang,route in [('en','/'),('es','/es/')]: + p=pages.get(route_file(route).resolve());check(p and p.lang==lang,'Missing home '+lang);check(p and p.canon==[base+route],'Wrong home canonical '+lang) +check((PUBLIC/'pagefind/pagefind.js').exists(),'Search index missing');check((PUBLIC/'sitemap.xml').exists(),'Sitemap missing') +check(('Disallow: /' in (PUBLIC/'robots.txt').read_text())==preview,'Wrong robots policy') +out={'checks':checks,'failures':len(errors),'preview':preview,'routes':len(inventory),'errors':errors} +(ROOT/'reports').mkdir(exist_ok=True);(ROOT/'reports/verification.json').write_text(json.dumps(out,indent=2)+'\n') +print(json.dumps({k:v for k,v in out.items() if k!='errors'})) +for error in errors[:30]:print(error,file=sys.stderr) +sys.exit(bool(errors))