# Panel de contenido (Sveltia CMS). # # Escribe los mismos archivos Markdown de `src/content/`, así que nada de lo # que ya funciona cambia: el esquema los sigue validando al compilar, git sigue # guardando el historial de cada letra y el catálogo sigue sin hacer consultas. # # Los campos de aquí replican el esquema de `src/lib/content/schema.ts`. Cuando # se añada un campo allí, hay que añadirlo también aquí, o el panel lo borrará # al guardar una entrada. backend: name: github # Cambiar por el repositorio real cuando exista. Trabajando en local no se # usa: el flujo local abre la carpeta del proyecto desde el propio navegador. repo: senzapaura/senzapaura branch: main # Dónde aterrizan las imágenes que se suban desde el panel. Si prefieres # agruparlas por disco (static/images//), se mueven a mano después: al # esquema le vale cualquier ruta que empiece por "/". media_folder: static/images public_folder: /images collections: # ---------------------------------------------------------------- estilos - name: estilos label: Estilos label_singular: Estilo description: Cada estilo es un segmento de la página de música. folder: src/content/estilos identifier_field: nombre create: true slug: '{{slug}}' summary: '{{nombre}}' fields: - { name: nombre, label: Nombre, widget: string } - name: resumen label: Resumen widget: string required: false hint: Una frase corta; acompaña al título del segmento. - name: orden label: Orden widget: number value_type: int min: 0 default: 10 hint: Menor número, más arriba en la página de música. - name: principal label: Estilo principal widget: boolean default: false required: false hint: Solo uno puede serlo. Es el que abre la portada. - { name: imagen, label: Imagen del segmento, widget: image, required: false } - name: body label: Texto introductorio widget: markdown required: false # ---------------------------------------------------------------- álbumes - name: albumes label: Álbumes label_singular: Álbum description: Discos, EPs, singles y colecciones. folder: src/content/albumes identifier_field: titulo create: true slug: '{{slug}}' summary: '{{titulo}} · {{fecha}}' fields: - { name: titulo, label: Título, widget: string } - name: estilo label: Estilo widget: relation collection: estilos value_field: '{{slug}}' display_fields: [nombre] search_fields: [nombre] - { name: fecha, label: Fecha de publicación, widget: datetime, date_format: 'YYYY-MM-DD', time_format: false, picker_utc: true } - name: tipo label: Tipo widget: select default: album options: [album, ep, single, coleccion] - { name: portada, label: Portada, widget: image, required: false } - { name: sello, label: Sello, widget: string, required: false } - { name: resumen, label: Resumen, widget: string, required: false } - { name: destacado, label: Destacado, widget: boolean, default: false, required: false } - name: edicion label: Datos de edición widget: object required: false collapsed: true fields: - { name: numeroCatalogo, label: Nº de catálogo, widget: string, required: false } - name: formatos label: Formatos widget: select multiple: true required: false options: [digital, cd, vinilo, casete] - { name: pais, label: País, widget: string, required: false } - name: creditos label: Créditos del disco widget: list required: false label_singular: Crédito summary: '{{rol}}: {{nombre}}' fields: - { name: rol, label: Cometido, widget: string } - { name: nombre, label: Nombre, widget: string } - name: enlaces label: Enlaces de escucha widget: object required: false collapsed: true fields: - { name: spotify, label: Spotify, widget: string, required: false } - { name: appleMusic, label: Apple Music, widget: string, required: false } - { name: youtube, label: YouTube, widget: string, required: false } - { name: bandcamp, label: Bandcamp, widget: string, required: false } - name: body label: Notas del disco widget: markdown required: false # -------------------------------------------------------------- canciones - name: canciones label: Canciones label_singular: Canción description: El cuerpo del texto es la letra. Los saltos de línea se respetan. folder: src/content/canciones identifier_field: titulo create: true slug: '{{slug}}' summary: '{{titulo}}' fields: - { name: titulo, label: Título, widget: string } - name: estilo label: Estilo widget: relation collection: estilos value_field: '{{slug}}' display_fields: [nombre] search_fields: [nombre] - name: album label: Álbum widget: relation collection: albumes value_field: '{{slug}}' display_fields: [titulo] search_fields: [titulo] required: false hint: Déjalo vacío si es un single suelto; irá al álbum «Singles» de su estilo. - name: numero label: Nº de pista widget: number value_type: int min: 1 required: false hint: Obligatorio si hay álbum. Se ignora en los singles. - name: duracion label: Duración widget: string required: false pattern: ['^\d{1,2}:[0-5]\d$', 'Escríbela como m:ss, por ejemplo 4:12'] - { name: ano, label: Año, widget: number, value_type: int, min: 1900, max: 2200, required: false } - name: audio label: Archivo de audio widget: file required: false media_folder: /media/audio/subidas public_folder: subidas hint: >- Sube aquí el archivo completo, con el nombre que sea. Al arrancar (`npm run dev`) se coloca en la carpeta de su disco, se genera el fragmento de muestra y se rellena la duración si está vacía. - { name: portada, label: Portada propia, widget: image, required: false, hint: 'Si la dejas vacía se usa la del álbum.' } - name: interpretes label: Intérpretes widget: list required: false field: { name: nombre, label: Nombre, widget: string } - name: letra label: Firma de la letra widget: list required: false hint: Déjalo vacío si la firmas tú. field: { name: nombre, label: Nombre, widget: string } - name: musica label: Firma de la música widget: list required: false hint: Déjalo vacío si la firmas tú. field: { name: nombre, label: Nombre, widget: string } - { name: destacada, label: Destacada, widget: boolean, default: false, required: false } - name: instrumental label: Instrumental widget: boolean default: false required: false hint: Sin letra. El cuerpo pasa a leerse como notas de la pieza. - { name: alaVenta, label: A la venta, widget: boolean, required: false, hint: 'Por defecto se vende si tiene audio.' } - name: inspiracion label: De dónde sale widget: text required: false hint: Separa los párrafos con una línea en blanco. - name: etiquetas label: Etiquetas widget: list required: false hint: >- De qué habla, cómo suena, con quién se canta. Cruzan el catálogo por donde no lo hacen el estilo ni el disco. - name: versiones label: Alternativas musicales widget: list required: false label_singular: Versión summary: '{{nombre}}' collapsed: true fields: - { name: nombre, label: Nombre del arreglo, widget: string } - name: audio label: Archivo de audio widget: file media_folder: /media/audio/subidas public_folder: subidas hint: El arreglo completo. Se coloca solo al arrancar, como el principal. - name: duracion label: Duración widget: string required: false pattern: ['^\d{1,2}:[0-5]\d$', 'Escríbela como m:ss'] - { name: nota, label: Nota, widget: string, required: false } - name: videos label: Vídeos widget: list required: false label_singular: Vídeo summary: '{{titulo}}' collapsed: true fields: - name: youtube label: Enlace o id de YouTube widget: string hint: Pega el enlace tal cual; el esquema saca el id. - { name: titulo, label: Qué es, widget: string, required: false } - name: registro label: Registro de la obra widget: object required: false collapsed: true fields: - name: iswc label: ISWC widget: string required: false pattern: ['^[Tt][-\s.]?\d{3}[.\s]?\d{3}[.\s]?\d{3}[-\s]?\d$', 'Formato T-DDD.DDD.DDD-C'] hint: Identifica la OBRA. Es el mismo en todas sus versiones. - name: isrc label: ISRC widget: string required: false pattern: ['^[A-Za-z]{2}[-\s]?[A-Za-z0-9]{3}[-\s]?\d{2}[-\s]?\d{5}$', 'Formato CC-XXX-YY-NNNNN'] hint: Identifica ESTA grabación. Cada versión tiene el suyo. - { name: entidad, label: Entidad de gestión, widget: string, required: false } - { name: numero, label: Nº de registro, widget: string, required: false } - { name: editorial, label: Editorial musical, widget: string, required: false } - name: reparto label: Reparto de autoría widget: list required: false label_singular: Parte summary: '{{nombre}} — {{porcentaje}} %' hint: Si lo rellenas, los porcentajes tienen que sumar exactamente 100. fields: - { name: nombre, label: Nombre, widget: string } - name: rol label: Qué firma widget: select default: letra y musica options: ['letra', 'musica', 'letra y musica'] - { name: porcentaje, label: Porcentaje, widget: number, value_type: float, min: 0.01, max: 100 } - name: enlaces label: Enlaces de escucha widget: object required: false collapsed: true fields: - { name: spotify, label: Spotify, widget: string, required: false } - { name: appleMusic, label: Apple Music, widget: string, required: false } - { name: youtube, label: YouTube, widget: string, required: false } - name: body label: Letra widget: markdown required: false hint: Los saltos de línea se respetan; cada verso en su línea. # ----------------------------------------------------------------- taller - name: taller label: Taller de letras label_singular: Capítulo description: Los principios del oficio y una ficha de creación por estilo. folder: src/content/taller identifier_field: titulo create: true slug: '{{slug}}' summary: '{{titulo}}' fields: - { name: titulo, label: Título, widget: string } - name: tipo label: Tipo widget: select default: principio options: - { label: 'Principio (el curso)', value: principio } - { label: 'Ficha de estilo', value: ficha } - { name: orden, label: Orden dentro de su bloque, widget: number, value_type: int, min: 0, default: 10 } - { name: resumen, label: Resumen, widget: string, required: false } - name: ficha label: Datos del estilo widget: object required: false collapsed: true hint: Solo para las fichas de estilo; en los principios se deja vacío. fields: - { name: origen, label: Origen, widget: string, required: false } - { name: compas, label: Compás, widget: string, required: false } - { name: tempo, label: Tempo, widget: string, required: false } - { name: metrica, label: Métrica, widget: string, required: false } - { name: estructura, label: Estructura, widget: string, required: false } - { name: rima, label: Rima, widget: string, required: false } - name: temas label: De qué se habla widget: list required: false field: { name: tema, label: Tema, widget: string } - name: rasgos label: Rasgos de escritura widget: list required: false field: { name: rasgo, label: Rasgo, widget: string } - { name: body, label: Texto del capítulo, widget: markdown } # ---------------------------------------------------------------- páginas # ------------------------------------------------------------------- blog - name: blog label: Blog label_singular: Entrada description: Apuntes fechados. El cuerpo del texto es el artículo. folder: src/content/blog identifier_field: titulo create: true slug: '{{slug}}' summary: '{{titulo}} · {{fecha}}' fields: - { name: titulo, label: Título, widget: string } - { name: fecha, label: Fecha, widget: datetime, date_format: 'YYYY-MM-DD', time_format: false, picker_utc: true } - name: resumen label: Resumen widget: string required: false hint: Una frase; es lo que se lee en el listado y en los buscadores. - { name: imagen, label: Imagen de cabecera, widget: image, required: false } - name: etiquetas label: Etiquetas widget: list required: false hint: Las mismas que las canciones; así el blog cruza con el catálogo. - name: canciones label: Temas de los que habla widget: relation collection: canciones value_field: '{{slug}}' display_fields: [titulo] search_fields: [titulo] multiple: true required: false - name: borrador label: Borrador widget: boolean default: false required: false hint: Mientras esté marcado no aparece en la web. - name: body label: Texto widget: markdown - name: paginas label: Páginas label_singular: Página description: Textos sueltos, como la biografía. folder: src/content/paginas identifier_field: titulo create: true slug: '{{slug}}' summary: '{{titulo}}' fields: - { name: titulo, label: Título, widget: string } - { name: descripcion, label: Descripción, widget: string, required: false } - { name: body, label: Texto, widget: markdown }