diff --git a/apps/dashboard/src/lib/features/course/components/sidebar/constants.ts b/apps/dashboard/src/lib/features/course/components/sidebar/constants.ts
index c8645097..7fe6bc02 100644
--- a/apps/dashboard/src/lib/features/course/components/sidebar/constants.ts
+++ b/apps/dashboard/src/lib/features/course/components/sidebar/constants.ts
@@ -15,6 +15,6 @@ export const NAV_IDS = {
};
export const COURSE_SIDEBAR_DEFAULT_WIDTH = 320;
-export const COURSE_SIDEBAR_MIN_WIDTH = 220;
+export const COURSE_SIDEBAR_MIN_WIDTH = 280;
export const COURSE_SIDEBAR_MAX_WIDTH = 420;
export const COURSE_SIDEBAR_STORAGE_KEY = 'classroomio-course-sidebar-width';
diff --git a/apps/dashboard/src/lib/utils/translations/da.json b/apps/dashboard/src/lib/utils/translations/da.json
index fb08f39a..bf38273b 100644
--- a/apps/dashboard/src/lib/utils/translations/da.json
+++ b/apps/dashboard/src/lib/utils/translations/da.json
@@ -2007,6 +2007,8 @@
"cancel_upload": "Annuller upload",
"upload_cancelled": "Upload annulleret af brugeren",
"downloading": "Downloader...",
+ "download_success": "Dokument downloadet",
+ "download_error": "Kunne ikke downloade dokumentet",
"view_pdf": "Se PDF",
"remove_document": "Fjern dokumentet",
"delete": "Slet",
@@ -2016,7 +2018,11 @@
"failed_to_render_pdf": "Kunne ikke gengive PDF-siden",
"use_arrow_keys": "Brug piletasterne til at navigere, +/- for at zoome, eller klik på kontrollerne ovenfor. Højreklik er deaktiveret.",
"empty_title": "Ingen dokumenter endnu",
- "empty_description": "Upload dokumenter for at dele med dine elever"
+ "empty_description": "Upload dokumenter for at dele med dine elever",
+ "attachments_heading": "Vedhæftede filer",
+ "file_count": "{count, plural, one {# fil} other {# filer}}",
+ "view_file": "Vis fil",
+ "reorder_file": "Omarranger fil"
},
"video": {
"title": "Video",
diff --git a/apps/dashboard/src/lib/utils/translations/de.json b/apps/dashboard/src/lib/utils/translations/de.json
index 8e99ce55..e4301307 100644
--- a/apps/dashboard/src/lib/utils/translations/de.json
+++ b/apps/dashboard/src/lib/utils/translations/de.json
@@ -2007,6 +2007,8 @@
"cancel_upload": "Hochladen abbrechen",
"upload_cancelled": "Der Upload wurde vom Benutzer abgebrochen",
"downloading": "Herunterladen...",
+ "download_success": "Dokument erfolgreich heruntergeladen",
+ "download_error": "Dokument konnte nicht heruntergeladen werden",
"view_pdf": "PDF ansehen",
"remove_document": "Dokument entfernen",
"delete": "Löschen",
@@ -2016,7 +2018,11 @@
"failed_to_render_pdf": "PDF-Seite konnte nicht gerendert werden",
"use_arrow_keys": "Verwenden Sie die Pfeiltasten zum Navigieren, +/- zum Zoomen oder klicken Sie auf die Steuerelemente oben. Der Rechtsklick ist deaktiviert.",
"empty_title": "Noch keine Dokumente",
- "empty_description": "Laden Sie Dokumente hoch, um sie mit Ihren Schülern zu teilen"
+ "empty_description": "Laden Sie Dokumente hoch, um sie mit Ihren Schülern zu teilen",
+ "attachments_heading": "Anhänge",
+ "file_count": "{count, plural, one {# Datei} other {# Dateien}}",
+ "view_file": "Datei anzeigen",
+ "reorder_file": "Datei neu anordnen"
},
"video": {
"title": "Video",
diff --git a/apps/dashboard/src/lib/utils/translations/en.json b/apps/dashboard/src/lib/utils/translations/en.json
index 52f3dec0..178ce8c2 100644
--- a/apps/dashboard/src/lib/utils/translations/en.json
+++ b/apps/dashboard/src/lib/utils/translations/en.json
@@ -2448,6 +2448,8 @@
"cancel_upload": "Cancel Upload",
"upload_cancelled": "Upload cancelled by user",
"downloading": "Downloading...",
+ "download_success": "Document downloaded successfully",
+ "download_error": "Failed to download document",
"view_pdf": "View PDF",
"remove_document": "Remove document",
"delete": "Delete",
@@ -2457,7 +2459,11 @@
"failed_to_render_pdf": "Failed to render PDF page",
"use_arrow_keys": "Use arrow keys to navigate, +/- to zoom, or click the controls above. Right-click is disabled.",
"empty_title": "No documents yet",
- "empty_description": "Upload documents to share with your students"
+ "empty_description": "Upload documents to share with your students",
+ "attachments_heading": "Attachments",
+ "file_count": "{count, plural, one {# file} other {# files}}",
+ "view_file": "View file",
+ "reorder_file": "Reorder file"
}
},
"button_done": "Done"
diff --git a/apps/dashboard/src/lib/utils/translations/es.json b/apps/dashboard/src/lib/utils/translations/es.json
index 05245e7d..09a42a31 100644
--- a/apps/dashboard/src/lib/utils/translations/es.json
+++ b/apps/dashboard/src/lib/utils/translations/es.json
@@ -2007,6 +2007,8 @@
"cancel_upload": "Cancelar carga",
"upload_cancelled": "Subida cancelada por el usuario",
"downloading": "Descargando...",
+ "download_success": "Documento descargado correctamente",
+ "download_error": "No se pudo descargar el documento",
"view_pdf": "Ver PDF",
"remove_document": "Quitar documento",
"delete": "Eliminar",
@@ -2016,7 +2018,11 @@
"failed_to_render_pdf": "No se pudo renderizar la página PDF",
"use_arrow_keys": "Utilice las teclas de flecha para navegar, +/- para hacer zoom o haga clic en los controles de arriba. El clic derecho está deshabilitado.",
"empty_title": "Aún no hay documentos",
- "empty_description": "Cargue documentos para compartir con sus estudiantes"
+ "empty_description": "Cargue documentos para compartir con sus estudiantes",
+ "attachments_heading": "Adjuntos",
+ "file_count": "{count, plural, one {# archivo} other {# archivos}}",
+ "view_file": "Ver archivo",
+ "reorder_file": "Reordenar archivo"
},
"video": {
"title": "Video",
diff --git a/apps/dashboard/src/lib/utils/translations/fr.json b/apps/dashboard/src/lib/utils/translations/fr.json
index 37f775b0..196b71d8 100644
--- a/apps/dashboard/src/lib/utils/translations/fr.json
+++ b/apps/dashboard/src/lib/utils/translations/fr.json
@@ -2007,6 +2007,8 @@
"cancel_upload": "Annuler le téléchargement",
"upload_cancelled": "Téléchargement annulé par l'utilisateur",
"downloading": "Téléchargement...",
+ "download_success": "Document téléchargé avec succès",
+ "download_error": "Échec du téléchargement du document",
"view_pdf": "Afficher le PDF",
"remove_document": "Supprimer le document",
"delete": "Supprimer",
@@ -2016,7 +2018,11 @@
"failed_to_render_pdf": "Échec du rendu de la page PDF",
"use_arrow_keys": "Utilisez les touches fléchées pour naviguer, +/- pour zoomer ou cliquez sur les commandes ci-dessus. Le clic droit est désactivé.",
"empty_title": "Aucun document pour l'instant",
- "empty_description": "Téléchargez des documents à partager avec vos étudiants"
+ "empty_description": "Téléchargez des documents à partager avec vos étudiants",
+ "attachments_heading": "Pièces jointes",
+ "file_count": "{count, plural, one {# fichier} other {# fichiers}}",
+ "view_file": "Voir le fichier",
+ "reorder_file": "Réordonner le fichier"
},
"video": {
"title": "Vidéo",
diff --git a/apps/dashboard/src/lib/utils/translations/hi.json b/apps/dashboard/src/lib/utils/translations/hi.json
index 165c2316..dcb8466f 100644
--- a/apps/dashboard/src/lib/utils/translations/hi.json
+++ b/apps/dashboard/src/lib/utils/translations/hi.json
@@ -2007,6 +2007,8 @@
"cancel_upload": "अपलोड रद्द करें",
"upload_cancelled": "उपयोगकर्ता द्वारा अपलोड रद्द कर दिया गया",
"downloading": "डाउनलोड हो रहा है...",
+ "download_success": "दस्तावेज़ सफलतापूर्वक डाउनलोड हुआ",
+ "download_error": "दस्तावेज़ डाउनलोड करने में विफल",
"view_pdf": "पीडीएफ देखें",
"remove_document": "दस्तावेज़ हटाएँ",
"delete": "हटाएँ",
@@ -2016,7 +2018,11 @@
"failed_to_render_pdf": "पीडीएफ पेज प्रस्तुत करने में विफल",
"use_arrow_keys": "नेविगेट करने के लिए तीर कुंजियों का उपयोग करें, ज़ूम करने के लिए +/- का उपयोग करें, या ऊपर दिए गए नियंत्रणों पर क्लिक करें। राइट-क्लिक अक्षम है.",
"empty_title": "अभी तक कोई दस्तावेज़ नहीं",
- "empty_description": "अपने छात्रों के साथ साझा करने के लिए दस्तावेज़ अपलोड करें"
+ "empty_description": "अपने छात्रों के साथ साझा करने के लिए दस्तावेज़ अपलोड करें",
+ "attachments_heading": "अटैचमेंट",
+ "file_count": "{count, plural, one {# फ़ाइल} other {# फ़ाइलें}}",
+ "view_file": "फ़ाइल देखें",
+ "reorder_file": "फ़ाइल को पुनः क्रमित करें"
},
"video": {
"title": "वीडियो",
diff --git a/apps/dashboard/src/lib/utils/translations/pl.json b/apps/dashboard/src/lib/utils/translations/pl.json
index ee644b9d..79214763 100644
--- a/apps/dashboard/src/lib/utils/translations/pl.json
+++ b/apps/dashboard/src/lib/utils/translations/pl.json
@@ -2007,6 +2007,8 @@
"cancel_upload": "Anuluj przesyłanie",
"upload_cancelled": "Przesyłanie anulowane przez użytkownika",
"downloading": "Pobieram...",
+ "download_success": "Dokument pobrano pomyślnie",
+ "download_error": "Nie udało się pobrać dokumentu",
"view_pdf": "Zobacz PDF",
"remove_document": "Usuń dokument",
"delete": "Usuń",
@@ -2016,7 +2018,11 @@
"failed_to_render_pdf": "Nie udało się wyrenderować strony PDF",
"use_arrow_keys": "Użyj klawiszy strzałek do nawigacji, +/-, aby powiększyć, lub kliknij elementy sterujące powyżej. Kliknięcie prawym przyciskiem myszy jest wyłączone.",
"empty_title": "Nie ma jeszcze dokumentów",
- "empty_description": "Prześlij dokumenty, aby udostępnić je swoim uczniom"
+ "empty_description": "Prześlij dokumenty, aby udostępnić je swoim uczniom",
+ "attachments_heading": "Załączniki",
+ "file_count": "{count, plural, one {# plik} few {# pliki} many {# plików} other {# plika}}",
+ "view_file": "Wyświetl plik",
+ "reorder_file": "Zmień kolejność pliku"
},
"video": {
"title": "Wideo",
diff --git a/apps/dashboard/src/lib/utils/translations/pt.json b/apps/dashboard/src/lib/utils/translations/pt.json
index 583e131f..10e776f3 100644
--- a/apps/dashboard/src/lib/utils/translations/pt.json
+++ b/apps/dashboard/src/lib/utils/translations/pt.json
@@ -2007,6 +2007,8 @@
"cancel_upload": "Cancelar upload",
"upload_cancelled": "Upload cancelado pelo usuário",
"downloading": "Baixando...",
+ "download_success": "Documento baixado com sucesso",
+ "download_error": "Falha ao baixar o documento",
"view_pdf": "Ver PDF",
"remove_document": "Remover documento",
"delete": "Excluir",
@@ -2016,7 +2018,11 @@
"failed_to_render_pdf": "Falha ao renderizar a página PDF",
"use_arrow_keys": "Use as teclas de seta para navegar, +/- para ampliar ou clique nos controles acima. O clique com o botão direito está desativado.",
"empty_title": "Ainda não há documentos",
- "empty_description": "Faça upload de documentos para compartilhar com seus alunos"
+ "empty_description": "Faça upload de documentos para compartilhar com seus alunos",
+ "attachments_heading": "Anexos",
+ "file_count": "{count, plural, one {# arquivo} other {# arquivos}}",
+ "view_file": "Ver arquivo",
+ "reorder_file": "Reordenar arquivo"
},
"video": {
"title": "Vídeo",
diff --git a/apps/dashboard/src/lib/utils/translations/ru.json b/apps/dashboard/src/lib/utils/translations/ru.json
index 18fb1c0f..7b037ec5 100644
--- a/apps/dashboard/src/lib/utils/translations/ru.json
+++ b/apps/dashboard/src/lib/utils/translations/ru.json
@@ -2007,6 +2007,8 @@
"cancel_upload": "Отменить загрузку",
"upload_cancelled": "Загрузка отменена пользователем",
"downloading": "Загрузка...",
+ "download_success": "Документ успешно загружен",
+ "download_error": "Не удалось загрузить документ",
"view_pdf": "Посмотреть PDF",
"remove_document": "Удалить документ",
"delete": "Удалить",
@@ -2016,7 +2018,11 @@
"failed_to_render_pdf": "Не удалось отобразить страницу PDF.",
"use_arrow_keys": "Используйте клавиши со стрелками для навигации, +/- для масштабирования или нажимайте элементы управления выше. Щелчок правой кнопкой мыши отключен.",
"empty_title": "Документов пока нет",
- "empty_description": "Загрузите документы, чтобы поделиться ими со своими учениками"
+ "empty_description": "Загрузите документы, чтобы поделиться ими со своими учениками",
+ "attachments_heading": "Вложения",
+ "file_count": "{count, plural, one {# файл} few {# файла} many {# файлов} other {# файла}}",
+ "view_file": "Просмотреть файл",
+ "reorder_file": "Изменить порядок файла"
},
"video": {
"title": "Видео",
diff --git a/apps/dashboard/src/lib/utils/translations/vi.json b/apps/dashboard/src/lib/utils/translations/vi.json
index 28b92d14..5617b438 100644
--- a/apps/dashboard/src/lib/utils/translations/vi.json
+++ b/apps/dashboard/src/lib/utils/translations/vi.json
@@ -2007,6 +2007,8 @@
"cancel_upload": "Hủy tải lên",
"upload_cancelled": "Tải lên bị người dùng hủy",
"downloading": "Đang tải xuống...",
+ "download_success": "Tài liệu đã được tải xuống thành công",
+ "download_error": "Không thể tải xuống tài liệu",
"view_pdf": "Xem PDF",
"remove_document": "Xóa tài liệu",
"delete": "Xóa",
@@ -2016,7 +2018,11 @@
"failed_to_render_pdf": "Không thể hiển thị trang PDF",
"use_arrow_keys": "Sử dụng các phím mũi tên để điều hướng, +/- để thu phóng hoặc nhấp vào các điều khiển ở trên. Nhấp chuột phải bị vô hiệu hóa.",
"empty_title": "Chưa có tài liệu nào",
- "empty_description": "Tải lên tài liệu để chia sẻ với sinh viên của bạn"
+ "empty_description": "Tải lên tài liệu để chia sẻ với sinh viên của bạn",
+ "attachments_heading": "Tệp đính kèm",
+ "file_count": "{count, plural, one {# tệp} other {# tệp}}",
+ "view_file": "Xem tệp",
+ "reorder_file": "Sắp xếp lại tệp"
},
"video": {
"title": "Video",
diff --git a/packages/storybook/src/molecules/attachment-list/attachment-list.stories.svelte b/packages/storybook/src/molecules/attachment-list/attachment-list.stories.svelte
new file mode 100644
index 00000000..e46d1692
--- /dev/null
+++ b/packages/storybook/src/molecules/attachment-list/attachment-list.stories.svelte
@@ -0,0 +1,103 @@
+
+
+
+ {#snippet template()}
+
+ {/snippet}
+
diff --git a/packages/storybook/src/molecules/attachment-list/fields.ts b/packages/storybook/src/molecules/attachment-list/fields.ts
new file mode 100644
index 00000000..3f419594
--- /dev/null
+++ b/packages/storybook/src/molecules/attachment-list/fields.ts
@@ -0,0 +1 @@
+export const FIELDS = ['mode', 'files', 'labels', 'class'];
diff --git a/packages/ui/README.md b/packages/ui/README.md
index 554dca0a..e03a1109 100644
--- a/packages/ui/README.md
+++ b/packages/ui/README.md
@@ -96,6 +96,10 @@ Learner and author UIs for exercise questions (take, preview, review, submission
Marketing / demo widget: left-hand list of question types and a live **take**-mode preview using `ExerciseQuestion.QuestionRenderer`. Copy is English-only (no dashboard i18n). Also consumed by the **`@cio/embeds`** app as a CDN bundle (`apps/embeds`).
+### Attachment list (`src/custom/attachment-list/`)
+
+Presentational list for lesson (or similar) file attachments with **view** and **edit** modes. View mode shows a header (paperclip + title + file count) and rows with view/download icon buttons. Edit mode shows sortable rows (when `onReorder` is provided) with a drag handle, view, and delete actions. Copy is passed via the `labels: AttachmentListLabels` prop (including `reorder` for the drag handle) so dashboard wrappers can supply translated strings. `AttachmentListFile.type` accepts a file extension or MIME type for icon styling. See `Molecules/AttachmentList` in Storybook.
+
### Live session card (`src/custom/live-session-card/`)
Presentational card for a live-class lesson with three states (`live`, `upcoming`, `ended`) derived from `lessonAt` + `durationMinutes`, or forced via the `status` prop (used by Storybook). Shows a join/copy action set when live, an "Add to calendar" combo button (Google, Outlook.com, Office 365, Yahoo, plus an `.ics` download for Apple) and a countdown when upcoming. All copy is passed in via the `labels: LiveSessionLabels` prop, so the dashboard wrapper supplies translated strings; `onCopyLink` fires after the link is copied (e.g. for a snackbar). See `Molecules/LiveSessionCard` in Storybook.
diff --git a/packages/ui/src/custom/attachment-list/attachment-list-row.svelte b/packages/ui/src/custom/attachment-list/attachment-list-row.svelte
new file mode 100644
index 00000000..47663f20
--- /dev/null
+++ b/packages/ui/src/custom/attachment-list/attachment-list-row.svelte
@@ -0,0 +1,119 @@
+
+
+