<div class="rtds-upload rtds-w-full rtds-space-y-5 md:rtds-space-y-6">
<!-- Pulsante principale per il caricamento -->
<div class="rtds-upload__button-area rtds-flex rtds-flex-col rtds-p-4 rtds-items-center rtds-justify-center rtds-gap-4 md:rtds-gap-6 rtds-background-01 rtds-border-dashed rtds-border-gray-03 rtds-border-2 rtds-rounded-md">
<div class="rtds-upload__description rtds-space-y-1.5">
<!--
note per accessibilità: il seguente paragrafo NON fornisce informazioni aggiuntive chi usa tecnologie assistive
così come è formulato è riferito all'esperienza utente che usa un mouse ecc (non tastiera o screen reader).
Inoltre fornisce indicazioni per la localizzazione del pulsante tramite posizionamento del pulsante stesso ("clicca sul pulsante qui sotto")
violando così il criterio di successo WCAG 1.3.3 -->
<p class="rtds-upload__help">Clicca il pulsante qui sotto per caricare i documenti dal tuo dispositivo.</p>
<!-- note per accessibilità: il seguente paragrafo fornisce informazioni aggiuntive chi usa tecnologie assistive
attraverso l'uso dell'id e dell'attributo aria-describedby="id-del-paragrafo" sull'input file-->
<p id="upload-help-text" class="rtds-upload__help">Formati <strong>PDF, DOCX, JPG, PNG</strong> - Max: <strong>10 MB per file</strong></p>
</div>
<input type="file" id="upload-input-file-upload-default" class="rtds-upload__input rtds-sr-only" aria-describedby="upload-help-text" multiple accept="image/*,.pdf,.doc,.docx">
<label for="upload-input-file-upload-default" class="rtds-upload__button rtds-btn rtds-btn--outlined rtds-content-01 rtds-border-gray-03 rtds-cursor-pointer">
<svg class="rtds-icon rtds-fill-current rtds-w-5 rtds-h-5" aria-hidden="true" focusable="false" role="img">
<use href="../../icons.svg#outline--arrow-up-on-square" />
</svg>
Carica file
</label>
</div>
<!-- Lista dei file caricati/in caricamento -->
</div>
<div class="rtds-upload rtds-w-full rtds-space-y-5 md:rtds-space-y-6">
<!-- Pulsante principale per il caricamento -->
<div class="rtds-upload__button-area rtds-flex rtds-flex-col rtds-p-4 rtds-items-center rtds-justify-center rtds-gap-4 md:rtds-gap-6 rtds-background-01 rtds-border-dashed rtds-border-gray-03 rtds-border-2 rtds-rounded-md">
<div class="rtds-upload__description rtds-space-y-1.5">
<!--
note per accessibilità: il seguente paragrafo NON fornisce informazioni aggiuntive chi usa tecnologie assistive
così come è formulato è riferito all'esperienza utente che usa un mouse ecc (non tastiera o screen reader).
Inoltre fornisce indicazioni per la localizzazione del pulsante tramite posizionamento del pulsante stesso ("clicca sul pulsante qui sotto")
violando così il criterio di successo WCAG 1.3.3 -->
<p class="rtds-upload__help">Clicca il pulsante qui sotto per caricare i documenti dal tuo dispositivo.</p>
<!-- note per accessibilità: il seguente paragrafo fornisce informazioni aggiuntive chi usa tecnologie assistive
attraverso l'uso dell'id e dell'attributo aria-describedby="id-del-paragrafo" sull'input file-->
<p id="upload-help-text" class="rtds-upload__help">Formati <strong>PDF, DOCX, JPG, PNG</strong> - Max: <strong>10 MB per file</strong></p>
</div>
<input
type="file"
id="upload-input-{{ 'file-upload-' + (loop.index if loop.index is defined else 'default') }}"
class="rtds-upload__input rtds-sr-only"
aria-describedby="upload-help-text"
{% if multiple %}multiple{% endif %}
{% if accept %}accept="{{ accept }}"{% endif %}
>
<label for="upload-input-{{ 'file-upload-' + (loop.index if loop.index is defined else 'default') }}" class="rtds-upload__button rtds-btn rtds-btn--outlined rtds-content-01 rtds-border-gray-03 rtds-cursor-pointer">
{% render '@icon', {
id: 'outline--arrow-up-on-square',
size: 'rtds-w-5 rtds-h-5'
}, true %}
{{ label or 'Carica file' }}
</label>
</div>
<!-- Lista dei file caricati/in caricamento -->
{% if files and files.length > 0 %}
<ul class="rtds-upload__file-list">
{% for file in files %}
<li class="rtds-upload__file">
{% render '@file' + file.variant, file.context, true %}
</li>
{% endfor %}
</ul>
{% endif %}
</div>
{
"label": "Carica file",
"multiple": true,
"accept": "image/*,.pdf,.doc,.docx",
"helpText": "Formato supportati: JPG, PNG, PDF, DOC, DOCX. Dimensione massima: 10MB per file.",
"maxFileSize": "10MB",
"files": []
}
/**
* UPLOAD COMPONENT
* Componente per il caricamento file
*/
@layer components {
.rtds-upload__button {
@apply focus-visible:rtds-ring focus-visible:rtds-ring-offset-2 focus-visible:rtds-ring-offset-white focus-visible:rtds-ring-focusring focus-visible:rtds-shadow-[0_0_0_7px_rgba(255,255,255,1)] focus-visible:rtds-outline-none;
}
.rtds-upload__input:focus + .rtds-upload__button,
.rtds-upload__input:focus-visible + .rtds-upload__button {
@apply rtds-ring rtds-ring-offset-2 rtds-ring-offset-white rtds-ring-focusring rtds-shadow-[0_0_0_7px_rgba(255,255,255,1)] rtds-outline-none;
}
.rtds-upload__description {
@apply rtds-text-sm md:rtds-text-base rtds-text-center rtds-content-03;
}
/* Lista file - Struttura ul/li */
.rtds-upload__file-list {
@apply rtds-list-none rtds-p-0 rtds-m-0 rtds-space-y-3;
}
}
Componente per il caricamento di file basato sul Design System di Designers Italia, variante “Lista file” con rappresentazione statica degli stati.
Il componente Upload è un organismo che permette la rappresentazione dell’interfaccia di caricamento file con una struttura semantica ul/li seguendo esattamente le specifiche di Designers Italia. Il componente mostra diversi stati dei file (successo, caricamento, errore) in modo puramente visuale.
Utilizza questo componente quando è necessario mostrare l’interfaccia di caricamento file, come:
<ul class="upload-file-list"> e <li class="upload-file">rtds-sr-only per screen readerIl componente Upload utilizza il componente File separato (@file) per gestire la rappresentazione di ogni singolo file. Consulta la documentazione del componente File per maggiori dettagli sui parametri e comportamenti specifici.
Il componente è puramente rappresentativo e non include logica JavaScript. Mostra stati statici definiti nella configurazione. La lista dei file utilizza il componente separato @file per ogni elemento.
Ogni file viene renderizzato tramite il componente File che supporta i seguenti stati:
loading: File in caricamentoloading-error: Errore durante caricamento loading-completed: Caricamento completatodownload: File disponibile per downloadIl componente rispetta le linee guida WCAG 2.1:
rtds-sr-only per contestolabel (string)label: "Carica documenti"multiple (boolean)truemultiple: falseaccept (string)"image/*,.pdf,.doc,.docx""image/*"".pdf"".pdf,.doc,.docx,.txt"helpText (string)helpText: "Dimensione massima: 5MB per file"maxFileSize (string)"10MB""5MB", "2GB", "500KB"files (array)files:
- name: "documento.pdf"
size: "1.2MB"
status: "loading-completed" # loading, loading-error, loading-completed, download
progress: 100 # obbligatorio per stati loading
errorMessage: "Messaggio di errore" # solo per loading-errorcontext:
label: 'Carica documenti'context:
files:
- name: 'documento-caricamento.pdf'
size: '2.1MB'
status: 'loading'
progress: 65
- name: 'file-completato.jpg'
size: '850KB'
status: 'loading-completed'
progress: 100
- name: 'file-errore.pdf'
size: '15MB'
status: 'loading-error'
progress: 30
errorMessage: 'File troppo grande. Max 10MB'
- name: 'documento-download.docx'
size: '2.1MB'
status: 'download'.rtds-upload: Container principale.rtds-upload__button-area: Area pulsante di caricamento.rtds-upload__button: Pulsante di caricamento.rtds-upload__file-list: Lista file (ul)Le classi per i singoli file sono gestite dal componente File:
.rtds-upload__file: Singolo file (su elemento <li> che wrappa il componente rtds-file).rtds-file.is-loading: File in caricamento.rtds-file.is-loading-error: File con errore.rtds-file.is-loading-completed: File completato.rtds-file.is-download: File per downloadIl componente è completamente responsive:
rtds-rtds-sr-only per contesto