@micha.bigler/ui-core-micha 2.41.2 → 2.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,118 +1,118 @@
1
1
  export const messagingTranslations = {
2
- 'MessagingComposer.ADD_EMOJI': { de: 'Emoji hinzufügen', en: 'Add emoji', fr: 'Ajouter un emoji' },
3
- 'MessagingComposer.EMOJI_PICKER': { de: 'Emoji auswählen', en: 'Choose an emoji', fr: 'Choisir un emoji' },
4
- 'MessagingComposer.STAGED_FILES': { de: 'Vorgemerkte Anhänge', en: 'Staged attachments', fr: 'Pièces jointes préparées' },
5
- 'MessagingComposer.REMOVE_ATTACHMENT': { de: '{{name}} entfernen', en: 'Remove {{name}}', fr: 'Supprimer {{name}}' },
6
- 'MessagingComposer.UPLOADING': { de: 'Anhänge werden hochgeladen…', en: 'Uploading attachments…', fr: 'Téléversement des pièces jointes…' },
7
- 'MessagingList.LABEL': { de: 'Unterhaltungen', en: 'Conversations', fr: 'Conversations' },
8
- 'MessagingList.EMPTY': { de: 'Noch keine Unterhaltungen.', en: 'No conversations yet.', fr: 'Aucune conversation pour le moment.' },
9
- 'MessagingList.NO_MESSAGES': { de: 'Noch keine Nachrichten', en: 'No messages yet', fr: 'Aucun message pour le moment' },
10
- 'MessagingList.UNTITLED': { de: 'Unbenannte Unterhaltung', en: 'Untitled conversation', fr: 'Conversation sans titre' },
11
- 'MessagingList.ACTIONS': { de: 'Aktionen für Unterhaltung', en: 'Conversation actions', fr: 'Actions de la conversation' },
12
- 'MessagingList.LOAD_MORE': { de: 'Mehr laden', en: 'Load more', fr: 'Charger plus' },
13
- 'MessagingList.LOAD_ERROR': { de: 'Unterhaltungen konnten nicht geladen werden.', en: 'Conversations could not be loaded.', fr: 'Impossible de charger les conversations.' },
14
- 'MessagingList.ARCHIVE': { de: 'Archivieren', en: 'Archive', fr: 'Archiver' },
15
- 'MessagingList.ARCHIVE_ERROR': { de: 'Unterhaltung konnte nicht archiviert werden.', en: 'Conversation could not be archived.', fr: 'Impossible d’archiver la conversation.' },
16
- 'MessagingList.MUTE': { de: 'Stummschalten', en: 'Mute', fr: 'Mettre en sourdine' },
17
- 'MessagingList.UNMUTE': { de: 'Stummschaltung aufheben', en: 'Unmute', fr: 'Réactiver le son' },
18
- 'MessagingList.PREFERENCES_ERROR': { de: 'Einstellungen konnten nicht gespeichert werden.', en: 'Preferences could not be saved.', fr: 'Impossible d’enregistrer les préférences.' },
19
- 'MessagingLaunchers.OPEN_GROUP': { de: 'Gruppenunterhaltung öffnen', en: 'Open group conversation', fr: 'Ouvrir la conversation de groupe' },
20
- 'MessagingLaunchers.OPEN_BROADCAST': { de: 'Ankündigungen öffnen', en: 'Open announcements', fr: 'Ouvrir les annonces' },
21
- 'MessagingLaunchers.OPEN_ERROR': { de: 'Unterhaltung konnte nicht geöffnet werden.', en: 'Conversation could not be opened.', fr: 'Impossible d’ouvrir la conversation.' },
22
- 'MessagingThread.TIMELINE': { de: 'Nachrichtenverlauf', en: 'Message timeline', fr: 'Chronologie des messages' },
23
- 'MessagingThread.MESSAGE': { de: 'Nachricht', en: 'Message', fr: 'Message' },
24
- 'MessagingThread.EMPTY': { de: 'Noch keine Nachrichten.', en: 'No messages yet.', fr: 'Aucun message pour le moment.' },
25
- 'MessagingThread.LOAD_OLDER': { de: 'Ältere Nachrichten laden', en: 'Load older messages', fr: 'Charger les messages plus anciens' },
26
- 'MessagingThread.LOAD_ERROR': { de: 'Nachrichten konnten nicht geladen werden.', en: 'Messages could not be loaded.', fr: 'Impossible de charger les messages.' },
27
- 'MessagingThread.REPLIES_ERROR': { de: 'Antworten konnten nicht geladen werden.', en: 'Replies could not be loaded.', fr: 'Impossible de charger les réponses.' },
28
- 'MessagingThread.DELETED': { de: 'Diese Nachricht wurde gelöscht.', en: 'This message was deleted.', fr: 'Ce message a été supprimé.' },
29
- 'MessagingThread.EDITED': { de: 'bearbeitet', en: 'edited', fr: 'modifié' },
30
- 'MessagingThread.REPLY': { de: 'Antworten', en: 'Reply', fr: 'Répondre' },
31
- 'MessagingThread.REPLY_TO': { de: 'Antwort auf {{sender}}', en: 'Reply to {{sender}}', fr: 'Réponse à {{sender}}' },
32
- 'MessagingThread.REPLYING_TO': { de: 'Antwort an {{sender}}', en: 'Replying to {{sender}}', fr: 'Réponse à {{sender}}' },
33
- 'MessagingThread.SHOW_REPLIES_one': { de: '{{count}} Antwort anzeigen', en: 'Show {{count}} reply', fr: 'Afficher {{count}} réponse' },
34
- 'MessagingThread.SHOW_REPLIES_other': { de: '{{count}} Antworten anzeigen', en: 'Show {{count}} replies', fr: 'Afficher {{count}} réponses' },
35
- 'MessagingThread.HIDE_REPLIES': { de: 'Antworten ausblenden', en: 'Hide replies', fr: 'Masquer les réponses' },
36
- 'MessagingThread.UNREAD_REPLIES': { de: 'Ungelesene Antworten', en: 'Unread replies', fr: 'Réponses non lues' },
37
- 'MessagingThread.UNKNOWN_SENDER': { de: 'Unbekannte Person', en: 'Unknown person', fr: 'Personne inconnue' },
38
- 'MessagingThread.QUOTE_ATTACHMENT': { de: 'Anhang', en: 'Attachment', fr: 'Pièce jointe' },
39
- 'MessagingActions.MENU': { de: 'Nachrichtenaktionen', en: 'Message actions', fr: 'Actions du message' },
40
- 'MessagingActions.EDIT': { de: 'Bearbeiten', en: 'Edit', fr: 'Modifier' },
41
- 'MessagingActions.SAVE': { de: 'Speichern', en: 'Save', fr: 'Enregistrer' },
42
- 'MessagingActions.CANCEL': { de: 'Abbrechen', en: 'Cancel', fr: 'Annuler' },
43
- 'MessagingActions.DELETE': { de: 'Löschen', en: 'Delete', fr: 'Supprimer' },
44
- 'MessagingActions.COPY': { de: 'Kopieren', en: 'Copy', fr: 'Copier' },
45
- 'MessagingActions.DELETE_CONFIRM_TITLE': { de: 'Nachricht löschen?', en: 'Delete message?', fr: 'Supprimer le message ?' },
46
- 'MessagingActions.DELETE_CONFIRM_BODY': { de: 'Diese Nachricht wird für alle entfernt.', en: 'This message will be removed for everyone.', fr: 'Ce message sera supprimé pour tout le monde.' },
47
- 'MessagingActions.EDIT_ERROR': { de: 'Nachricht konnte nicht bearbeitet werden: {{message}}', en: 'Message could not be edited: {{message}}', fr: 'Impossible de modifier le message : {{message}}' },
48
- 'MessagingActions.DELETE_ERROR': { de: 'Nachricht konnte nicht gelöscht werden: {{message}}', en: 'Message could not be deleted: {{message}}', fr: 'Impossible de supprimer le message : {{message}}' },
49
- 'MessagingActions.COPY_ERROR': { de: 'Nachricht konnte nicht kopiert werden: {{message}}', en: 'Message could not be copied: {{message}}', fr: 'Impossible de copier le message : {{message}}' },
50
- 'MessagingDirect.LAUNCH': { de: 'Direktnachricht starten', en: 'Start direct message', fr: 'Démarrer un message direct' },
51
- 'MessagingDirect.TITLE': { de: 'Direktnachricht starten', en: 'Start direct message', fr: 'Démarrer un message direct' },
52
- 'MessagingDirect.CANDIDATES': { de: 'Empfängerinnen und Empfänger', en: 'Recipients', fr: 'Destinataires' },
53
- 'MessagingDirect.EMPTY': { de: 'Keine Personen verfügbar.', en: 'No people are available.', fr: 'Aucune personne n’est disponible.' },
54
- 'MessagingDirect.START': { de: 'Starten', en: 'Start', fr: 'Démarrer' },
55
- 'MessagingDirect.STARTING': { de: 'Direktnachricht wird gestartet…', en: 'Starting direct message…', fr: 'Démarrage du message direct…' },
56
- 'MessagingDirect.CANCEL': { de: 'Abbrechen', en: 'Cancel', fr: 'Annuler' },
57
- 'MessagingDirect.START_ERROR': { de: 'Direktnachricht konnte nicht gestartet werden.', en: 'Direct message could not be started.', fr: 'Impossible de démarrer le message direct.' },
58
- 'MessagingReadTicks.ALL_READ': { de: 'Von allen gelesen', en: 'Read by everyone', fr: 'Lu par tout le monde' },
59
- 'MessagingReadTicks.SENT': { de: 'Gesendet', en: 'Sent', fr: 'Envoyé' },
60
- 'MessagingReadTicks.READ_RATIO': { de: '{{read}} von {{total}} gelesen', en: '{{read}} of {{total}} read', fr: '{{read}} sur {{total}} lu(s)' },
61
- 'MessagingReadTicks.RECIPIENTS': { de: 'Lesebestätigungen', en: 'Read recipients', fr: 'Destinataires lus' },
62
- 'MessagingComposer.LABEL': { de: 'Nachricht verfassen', en: 'Compose message', fr: 'Rédiger un message' },
63
- 'MessagingComposer.MESSAGE': { de: 'Nachricht', en: 'Message', fr: 'Message' },
64
- 'MessagingComposer.SEND': { de: 'Senden', en: 'Send', fr: 'Envoyer' },
65
- 'MessagingComposer.RETRY': { de: 'Erneut versuchen', en: 'Retry', fr: 'Réessayer' },
66
- 'MessagingComposer.ADD_ATTACHMENT': { de: 'Anhang hinzufügen', en: 'Add attachment', fr: 'Ajouter une pièce jointe' },
67
- 'MessagingComposer.FILES_SELECTED_one': { de: '{{count}} Anhang ausgewählt', en: '{{count}} attachment selected', fr: '{{count}} pièce jointe sélectionnée' },
68
- 'MessagingComposer.FILES_SELECTED_other': { de: '{{count}} Anhänge ausgewählt', en: '{{count}} attachments selected', fr: '{{count}} pièces jointes sélectionnées' },
69
- 'MessagingComposer.REPLYING_TO': { de: 'Antwort an {{sender}}', en: 'Replying to {{sender}}', fr: 'Réponse à {{sender}}' },
70
- 'MessagingComposer.SEND_ERROR': { de: 'Nachricht konnte nicht gesendet werden: {{message}}', en: 'Message could not be sent: {{message}}', fr: 'Impossible d’envoyer le message : {{message}}' },
71
- 'MessagingComposer.UPLOAD_ERROR': { de: 'Anhang wurde abgelehnt: {{message}}', en: 'Attachment was rejected: {{message}}', fr: 'La pièce jointe a été rejetée : {{message}}' },
72
- 'MessagingAttachments.LABEL': { de: 'Anhänge', en: 'Attachments', fr: 'Pièces jointes' },
73
- 'MessagingAttachments.DOWNLOAD': { de: '{{name}} herunterladen', en: 'Download {{name}}', fr: 'Télécharger {{name}}' },
74
- 'MessagingAttachments.PREVIEW': { de: '{{name}} als Vorschau öffnen', en: 'Preview {{name}}', fr: 'Prévisualiser {{name}}' },
75
- 'MessagingAttachments.CLOSE_PREVIEW': { de: 'Vorschau schliessen', en: 'Close preview', fr: 'Fermer l’aperçu' },
76
- 'MessagingAttachments.DOWNLOAD_ACTION': { de: 'Herunterladen', en: 'Download', fr: 'Télécharger' },
77
- 'MessagingAttachments.LOADING_PREVIEW': { de: 'Vorschau wird geladen', en: 'Loading preview', fr: 'Chargement de l’aperçu' },
78
- 'MessagingAttachments.PREVIEW_ERROR': { de: 'Vorschau konnte nicht geladen werden.', en: 'Preview could not be loaded.', fr: 'Impossible de charger l’aperçu.' },
79
- 'MessagingReactions.LABEL': { de: 'Reaktionen', en: 'Reactions', fr: 'Réactions' },
80
- 'MessagingReactions.ADD': { de: 'Reaktion hinzufügen', en: 'Add reaction', fr: 'Ajouter une réaction' },
81
- 'MessagingReactions.TOGGLE_one': { de: '{{emoji}} Reaktion mit {{count}} Stimme umschalten', en: 'Toggle {{emoji}} reaction with {{count}} vote', fr: 'Basculer la réaction {{emoji}} avec {{count}} vote' },
82
- 'MessagingReactions.TOGGLE_other': { de: '{{emoji}} Reaktion mit {{count}} Stimmen umschalten', en: 'Toggle {{emoji}} reaction with {{count}} votes', fr: 'Basculer la réaction {{emoji}} avec {{count}} votes' },
83
- 'MessagingReactions.ERROR': { de: 'Reaktion konnte nicht gespeichert werden: {{message}}', en: 'Reaction could not be saved: {{message}}', fr: 'Impossible d’enregistrer la réaction : {{message}}' },
84
- 'MessagingPoll.LABEL': { de: 'Umfrage', en: 'Poll', fr: 'Sondage' },
85
- 'MessagingPoll.CLOSE': { de: 'Umfrage schliessen', en: 'Close poll', fr: 'Clore le sondage' },
86
- 'MessagingPoll.CLOSED': { de: 'Geschlossen', en: 'Closed', fr: 'Clos' },
87
- 'MessagingPoll.OPTION_RESULT': { de: '{{count}} ({{percent}} %)', en: '{{count}} ({{percent}}%)', fr: '{{count}} ({{percent}} %)' },
88
- 'MessagingPoll.VOTE_ERROR': { de: 'Stimme konnte nicht gespeichert werden: {{message}}', en: 'Vote could not be saved: {{message}}', fr: 'Impossible d’enregistrer le vote : {{message}}' },
89
- 'MessagingPoll.CLOSE_ERROR': { de: 'Umfrage konnte nicht geschlossen werden: {{message}}', en: 'Poll could not be closed: {{message}}', fr: 'Impossible de clore le sondage : {{message}}' },
90
- 'MessagingPoll.CREATE': { de: 'Umfrage erstellen', en: 'Create poll', fr: 'Créer un sondage' },
91
- 'MessagingPoll.CREATE_ERROR': { de: 'Umfrage konnte nicht erstellt werden: {{message}}', en: 'Poll could not be created: {{message}}', fr: 'Impossible de créer le sondage : {{message}}' },
92
- 'MessagingPoll.CREATE_VALIDATION': { de: 'Frage und mindestens zwei Optionen sind erforderlich.', en: 'A question and at least two options are required.', fr: 'Une question et au moins deux options sont requises.' },
93
- 'MessagingPoll.QUESTION': { de: 'Frage', en: 'Question', fr: 'Question' },
94
- 'MessagingPoll.OPTION': { de: 'Option {{count}}', en: 'Option {{count}}', fr: 'Option {{count}}' },
95
- 'MessagingPoll.ADD_OPTION': { de: 'Option hinzufügen', en: 'Add option', fr: 'Ajouter une option' },
96
- 'MessagingPoll.ALLOW_MULTIPLE': { de: 'Mehrfachauswahl erlauben', en: 'Allow multiple choices', fr: 'Autoriser plusieurs choix' },
97
- 'MessagingPoll.CANCEL': { de: 'Abbrechen', en: 'Cancel', fr: 'Annuler' },
98
- 'MessagingPoll.YOU_VOTED': { de: 'von dir gewählt', en: 'voted by you', fr: 'voté par vous' },
99
- 'MessagingConfig.LABEL': { de: 'Nachrichten-Einstellungen', en: 'Messaging settings', fr: 'Paramètres de messagerie' },
100
- 'MessagingConfig.TITLE': { de: 'Nachrichten-Einstellungen', en: 'Messaging settings', fr: 'Paramètres de messagerie' },
101
- 'MessagingConfig.LOADING': { de: 'Einstellungen werden geladen…', en: 'Loading settings…', fr: 'Chargement des paramètres…' },
102
- 'MessagingConfig.LOAD_ERROR': { de: 'Einstellungen konnten nicht geladen werden: {{message}}', en: 'Settings could not be loaded: {{message}}', fr: 'Impossible de charger les paramètres : {{message}}' },
103
- 'MessagingConfig.SAVE_ERROR': { de: 'Einstellungen konnten nicht gespeichert werden: {{message}}', en: 'Settings could not be saved: {{message}}', fr: 'Impossible d’enregistrer les paramètres : {{message}}' },
104
- 'MessagingConfig.DM_POLICY': { de: 'Direktnachrichten-Regel', en: 'Direct-message policy', fr: 'Règle des messages directs' },
105
- 'MessagingConfig.DM_ALL': { de: 'Alle', en: 'Everyone', fr: 'Tout le monde' },
106
- 'MessagingConfig.DM_SHARED': { de: 'Nur gemeinsame Gruppen', en: 'Shared groups only', fr: 'Groupes communs uniquement' },
107
- 'MessagingConfig.DM_TEAM': { de: 'Nur Team', en: 'Team only', fr: 'Équipe uniquement' },
108
- 'MessagingConfig.GROUP_ENABLED': { de: 'Gruppenchat aktivieren', en: 'Enable group chat', fr: 'Activer le chat de groupe' },
109
- 'MessagingConfig.EVERYONE_POSTS': { de: 'Alle dürfen schreiben', en: 'Everyone can post', fr: 'Tout le monde peut publier' },
110
- 'MessagingAnnouncement.CREATE': { de: 'Ankündigung erstellen', en: 'Create announcement', fr: 'Créer une annonce' },
111
- 'MessagingAnnouncement.TITLE': { de: 'Titel', en: 'Title', fr: 'Titre' },
112
- 'MessagingAnnouncement.BODY': { de: 'Text', en: 'Body', fr: 'Texte' },
113
- 'MessagingAnnouncement.SEND': { de: 'Ankündigung senden', en: 'Send announcement', fr: 'Envoyer l’annonce' },
114
- 'MessagingAnnouncement.CANCEL': { de: 'Abbrechen', en: 'Cancel', fr: 'Annuler' },
115
- 'MessagingAnnouncement.VALIDATION': { de: 'Ein Titel ist erforderlich.', en: 'A title is required.', fr: 'Un titre est requis.' },
116
- 'MessagingAnnouncement.ERROR': { de: 'Ankündigung konnte nicht gesendet werden: {{message}}', en: 'Announcement could not be sent: {{message}}', fr: 'Impossible d’envoyer l’annonce : {{message}}' },
117
- 'MessagingAnnouncement.OPEN_LINK': { de: 'Link öffnen', en: 'Open link', fr: 'Ouvrir le lien' },
2
+ 'MessagingComposer.ADD_EMOJI': { de: 'Emoji hinzufügen', en: 'Add emoji', fr: 'Ajouter un emoji', sw: 'Ongeza emoji' },
3
+ 'MessagingComposer.EMOJI_PICKER': { de: 'Emoji auswählen', en: 'Choose an emoji', fr: 'Choisir un emoji', sw: 'Chagua emoji' },
4
+ 'MessagingComposer.STAGED_FILES': { de: 'Vorgemerkte Anhänge', en: 'Staged attachments', fr: 'Pièces jointes préparées', sw: 'Viambatisho vilivyoandaliwa' },
5
+ 'MessagingComposer.REMOVE_ATTACHMENT': { de: '{{name}} entfernen', en: 'Remove {{name}}', fr: 'Supprimer {{name}}', sw: 'Ondoa {{name}}' },
6
+ 'MessagingComposer.UPLOADING': { de: 'Anhänge werden hochgeladen…', en: 'Uploading attachments…', fr: 'Téléversement des pièces jointes…', sw: 'Inapakia viambatisho…' },
7
+ 'MessagingList.LABEL': { de: 'Unterhaltungen', en: 'Conversations', fr: 'Conversations', sw: 'Mazungumzo' },
8
+ 'MessagingList.EMPTY': { de: 'Noch keine Unterhaltungen.', en: 'No conversations yet.', fr: 'Aucune conversation pour le moment.', sw: 'Bado hakuna mazungumzo.' },
9
+ 'MessagingList.NO_MESSAGES': { de: 'Noch keine Nachrichten', en: 'No messages yet', fr: 'Aucun message pour le moment', sw: 'Bado hakuna ujumbe' },
10
+ 'MessagingList.UNTITLED': { de: 'Unbenannte Unterhaltung', en: 'Untitled conversation', fr: 'Conversation sans titre', sw: 'Mazungumzo yasiyo na kichwa' },
11
+ 'MessagingList.ACTIONS': { de: 'Aktionen für Unterhaltung', en: 'Conversation actions', fr: 'Actions de la conversation', sw: 'Vitendo vya mazungumzo' },
12
+ 'MessagingList.LOAD_MORE': { de: 'Mehr laden', en: 'Load more', fr: 'Charger plus', sw: 'Pakia zaidi' },
13
+ 'MessagingList.LOAD_ERROR': { de: 'Unterhaltungen konnten nicht geladen werden.', en: 'Conversations could not be loaded.', fr: 'Impossible de charger les conversations.', sw: 'Mazungumzo hayakuweza kupakiwa.' },
14
+ 'MessagingList.ARCHIVE': { de: 'Archivieren', en: 'Archive', fr: 'Archiver', sw: 'Weka kwenye kumbukumbu' },
15
+ 'MessagingList.ARCHIVE_ERROR': { de: 'Unterhaltung konnte nicht archiviert werden.', en: 'Conversation could not be archived.', fr: 'Impossible d’archiver la conversation.', sw: 'Mazungumzo hayakuweza kuwekwa kwenye kumbukumbu.' },
16
+ 'MessagingList.MUTE': { de: 'Stummschalten', en: 'Mute', fr: 'Mettre en sourdine', sw: 'Nyamazisha' },
17
+ 'MessagingList.UNMUTE': { de: 'Stummschaltung aufheben', en: 'Unmute', fr: 'Réactiver le son', sw: 'Ondoa unyamazishaji' },
18
+ 'MessagingList.PREFERENCES_ERROR': { de: 'Einstellungen konnten nicht gespeichert werden.', en: 'Preferences could not be saved.', fr: 'Impossible d’enregistrer les préférences.', sw: 'Mapendeleo hayakuweza kuhifadhiwa.' },
19
+ 'MessagingLaunchers.OPEN_GROUP': { de: 'Gruppenunterhaltung öffnen', en: 'Open group conversation', fr: 'Ouvrir la conversation de groupe', sw: 'Fungua mazungumzo ya kikundi' },
20
+ 'MessagingLaunchers.OPEN_BROADCAST': { de: 'Ankündigungen öffnen', en: 'Open announcements', fr: 'Ouvrir les annonces', sw: 'Fungua matangazo' },
21
+ 'MessagingLaunchers.OPEN_ERROR': { de: 'Unterhaltung konnte nicht geöffnet werden.', en: 'Conversation could not be opened.', fr: 'Impossible d’ouvrir la conversation.', sw: 'Mazungumzo hayakuweza kufunguliwa.' },
22
+ 'MessagingThread.TIMELINE': { de: 'Nachrichtenverlauf', en: 'Message timeline', fr: 'Chronologie des messages', sw: 'Mfuatano wa ujumbe' },
23
+ 'MessagingThread.MESSAGE': { de: 'Nachricht', en: 'Message', fr: 'Message', sw: 'Ujumbe' },
24
+ 'MessagingThread.EMPTY': { de: 'Noch keine Nachrichten.', en: 'No messages yet.', fr: 'Aucun message pour le moment.', sw: 'Bado hakuna ujumbe.' },
25
+ 'MessagingThread.LOAD_OLDER': { de: 'Ältere Nachrichten laden', en: 'Load older messages', fr: 'Charger les messages plus anciens', sw: 'Pakia ujumbe wa zamani' },
26
+ 'MessagingThread.LOAD_ERROR': { de: 'Nachrichten konnten nicht geladen werden.', en: 'Messages could not be loaded.', fr: 'Impossible de charger les messages.', sw: 'Ujumbe haukuweza kupakiwa.' },
27
+ 'MessagingThread.REPLIES_ERROR': { de: 'Antworten konnten nicht geladen werden.', en: 'Replies could not be loaded.', fr: 'Impossible de charger les réponses.', sw: 'Majibu hayakuweza kupakiwa.' },
28
+ 'MessagingThread.DELETED': { de: 'Diese Nachricht wurde gelöscht.', en: 'This message was deleted.', fr: 'Ce message a été supprimé.', sw: 'Ujumbe huu ulifutwa.' },
29
+ 'MessagingThread.EDITED': { de: 'bearbeitet', en: 'edited', fr: 'modifié', sw: 'umehaririwa' },
30
+ 'MessagingThread.REPLY': { de: 'Antworten', en: 'Reply', fr: 'Répondre', sw: 'Jibu' },
31
+ 'MessagingThread.REPLY_TO': { de: 'Antwort auf {{sender}}', en: 'Reply to {{sender}}', fr: 'Réponse à {{sender}}', sw: 'Jibu kwa {{sender}}' },
32
+ 'MessagingThread.REPLYING_TO': { de: 'Antwort an {{sender}}', en: 'Replying to {{sender}}', fr: 'Réponse à {{sender}}', sw: 'Unamjibu {{sender}}' },
33
+ 'MessagingThread.SHOW_REPLIES_one': { de: '{{count}} Antwort anzeigen', en: 'Show {{count}} reply', fr: 'Afficher {{count}} réponse', sw: 'Onyesha jibu {{count}}' },
34
+ 'MessagingThread.SHOW_REPLIES_other': { de: '{{count}} Antworten anzeigen', en: 'Show {{count}} replies', fr: 'Afficher {{count}} réponses', sw: 'Onyesha majibu {{count}}' },
35
+ 'MessagingThread.HIDE_REPLIES': { de: 'Antworten ausblenden', en: 'Hide replies', fr: 'Masquer les réponses', sw: 'Ficha majibu' },
36
+ 'MessagingThread.UNREAD_REPLIES': { de: 'Ungelesene Antworten', en: 'Unread replies', fr: 'Réponses non lues', sw: 'Majibu ambayo hayajasomwa' },
37
+ 'MessagingThread.UNKNOWN_SENDER': { de: 'Unbekannte Person', en: 'Unknown person', fr: 'Personne inconnue', sw: 'Mtu asiyejulikana' },
38
+ 'MessagingThread.QUOTE_ATTACHMENT': { de: 'Anhang', en: 'Attachment', fr: 'Pièce jointe', sw: 'Kiambatisho' },
39
+ 'MessagingActions.MENU': { de: 'Nachrichtenaktionen', en: 'Message actions', fr: 'Actions du message', sw: 'Vitendo vya ujumbe' },
40
+ 'MessagingActions.EDIT': { de: 'Bearbeiten', en: 'Edit', fr: 'Modifier', sw: 'Hariri' },
41
+ 'MessagingActions.SAVE': { de: 'Speichern', en: 'Save', fr: 'Enregistrer', sw: 'Hifadhi' },
42
+ 'MessagingActions.CANCEL': { de: 'Abbrechen', en: 'Cancel', fr: 'Annuler', sw: 'Ghairi' },
43
+ 'MessagingActions.DELETE': { de: 'Löschen', en: 'Delete', fr: 'Supprimer', sw: 'Futa' },
44
+ 'MessagingActions.COPY': { de: 'Kopieren', en: 'Copy', fr: 'Copier', sw: 'Nakili' },
45
+ 'MessagingActions.DELETE_CONFIRM_TITLE': { de: 'Nachricht löschen?', en: 'Delete message?', fr: 'Supprimer le message ?', sw: 'Ufute ujumbe?' },
46
+ 'MessagingActions.DELETE_CONFIRM_BODY': { de: 'Diese Nachricht wird für alle entfernt.', en: 'This message will be removed for everyone.', fr: 'Ce message sera supprimé pour tout le monde.', sw: 'Ujumbe huu utaondolewa kwa kila mtu.' },
47
+ 'MessagingActions.EDIT_ERROR': { de: 'Nachricht konnte nicht bearbeitet werden: {{message}}', en: 'Message could not be edited: {{message}}', fr: 'Impossible de modifier le message : {{message}}', sw: 'Ujumbe haukuweza kuhaririwa: {{message}}' },
48
+ 'MessagingActions.DELETE_ERROR': { de: 'Nachricht konnte nicht gelöscht werden: {{message}}', en: 'Message could not be deleted: {{message}}', fr: 'Impossible de supprimer le message : {{message}}', sw: 'Ujumbe haukuweza kufutwa: {{message}}' },
49
+ 'MessagingActions.COPY_ERROR': { de: 'Nachricht konnte nicht kopiert werden: {{message}}', en: 'Message could not be copied: {{message}}', fr: 'Impossible de copier le message : {{message}}', sw: 'Ujumbe haukuweza kunakiliwa: {{message}}' },
50
+ 'MessagingDirect.LAUNCH': { de: 'Direktnachricht starten', en: 'Start direct message', fr: 'Démarrer un message direct', sw: 'Anza ujumbe wa moja kwa moja' },
51
+ 'MessagingDirect.TITLE': { de: 'Direktnachricht starten', en: 'Start direct message', fr: 'Démarrer un message direct', sw: 'Anza ujumbe wa moja kwa moja' },
52
+ 'MessagingDirect.CANDIDATES': { de: 'Empfängerinnen und Empfänger', en: 'Recipients', fr: 'Destinataires', sw: 'Wapokeaji' },
53
+ 'MessagingDirect.EMPTY': { de: 'Keine Personen verfügbar.', en: 'No people are available.', fr: 'Aucune personne n’est disponible.', sw: 'Hakuna watu wanaopatikana.' },
54
+ 'MessagingDirect.START': { de: 'Starten', en: 'Start', fr: 'Démarrer', sw: 'Anza' },
55
+ 'MessagingDirect.STARTING': { de: 'Direktnachricht wird gestartet…', en: 'Starting direct message…', fr: 'Démarrage du message direct…', sw: 'Inaanzisha ujumbe wa moja kwa moja…' },
56
+ 'MessagingDirect.CANCEL': { de: 'Abbrechen', en: 'Cancel', fr: 'Annuler', sw: 'Ghairi' },
57
+ 'MessagingDirect.START_ERROR': { de: 'Direktnachricht konnte nicht gestartet werden.', en: 'Direct message could not be started.', fr: 'Impossible de démarrer le message direct.', sw: 'Ujumbe wa moja kwa moja haukuweza kuanzishwa.' },
58
+ 'MessagingReadTicks.ALL_READ': { de: 'Von allen gelesen', en: 'Read by everyone', fr: 'Lu par tout le monde', sw: 'Wote wamesoma' },
59
+ 'MessagingReadTicks.SENT': { de: 'Gesendet', en: 'Sent', fr: 'Envoyé', sw: 'Umetumwa' },
60
+ 'MessagingReadTicks.READ_RATIO': { de: '{{read}} von {{total}} gelesen', en: '{{read}} of {{total}} read', fr: '{{read}} sur {{total}} lu(s)', sw: '{{read}} kati ya {{total}} wamesoma' },
61
+ 'MessagingReadTicks.RECIPIENTS': { de: 'Lesebestätigungen', en: 'Read recipients', fr: 'Destinataires lus', sw: 'Wapokeaji waliosoma' },
62
+ 'MessagingComposer.LABEL': { de: 'Nachricht verfassen', en: 'Compose message', fr: 'Rédiger un message', sw: 'Andika ujumbe' },
63
+ 'MessagingComposer.MESSAGE': { de: 'Nachricht', en: 'Message', fr: 'Message', sw: 'Ujumbe' },
64
+ 'MessagingComposer.SEND': { de: 'Senden', en: 'Send', fr: 'Envoyer', sw: 'Tuma' },
65
+ 'MessagingComposer.RETRY': { de: 'Erneut versuchen', en: 'Retry', fr: 'Réessayer', sw: 'Jaribu tena' },
66
+ 'MessagingComposer.ADD_ATTACHMENT': { de: 'Anhang hinzufügen', en: 'Add attachment', fr: 'Ajouter une pièce jointe', sw: 'Ongeza kiambatisho' },
67
+ 'MessagingComposer.FILES_SELECTED_one': { de: '{{count}} Anhang ausgewählt', en: '{{count}} attachment selected', fr: '{{count}} pièce jointe sélectionnée', sw: 'Kiambatisho {{count}} kimechaguliwa' },
68
+ 'MessagingComposer.FILES_SELECTED_other': { de: '{{count}} Anhänge ausgewählt', en: '{{count}} attachments selected', fr: '{{count}} pièces jointes sélectionnées', sw: 'Viambatisho {{count}} vimechaguliwa' },
69
+ 'MessagingComposer.REPLYING_TO': { de: 'Antwort an {{sender}}', en: 'Replying to {{sender}}', fr: 'Réponse à {{sender}}', sw: 'Unamjibu {{sender}}' },
70
+ 'MessagingComposer.SEND_ERROR': { de: 'Nachricht konnte nicht gesendet werden: {{message}}', en: 'Message could not be sent: {{message}}', fr: 'Impossible d’envoyer le message : {{message}}', sw: 'Ujumbe haukuweza kutumwa: {{message}}' },
71
+ 'MessagingComposer.UPLOAD_ERROR': { de: 'Anhang wurde abgelehnt: {{message}}', en: 'Attachment was rejected: {{message}}', fr: 'La pièce jointe a été rejetée : {{message}}', sw: 'Kiambatisho kilikataliwa: {{message}}' },
72
+ 'MessagingAttachments.LABEL': { de: 'Anhänge', en: 'Attachments', fr: 'Pièces jointes', sw: 'Viambatisho' },
73
+ 'MessagingAttachments.DOWNLOAD': { de: '{{name}} herunterladen', en: 'Download {{name}}', fr: 'Télécharger {{name}}', sw: 'Pakua {{name}}' },
74
+ 'MessagingAttachments.PREVIEW': { de: '{{name}} als Vorschau öffnen', en: 'Preview {{name}}', fr: 'Prévisualiser {{name}}', sw: 'Kagua {{name}}' },
75
+ 'MessagingAttachments.CLOSE_PREVIEW': { de: 'Vorschau schliessen', en: 'Close preview', fr: 'Fermer l’aperçu', sw: 'Funga onyesho la kukagua' },
76
+ 'MessagingAttachments.DOWNLOAD_ACTION': { de: 'Herunterladen', en: 'Download', fr: 'Télécharger', sw: 'Pakua' },
77
+ 'MessagingAttachments.LOADING_PREVIEW': { de: 'Vorschau wird geladen', en: 'Loading preview', fr: 'Chargement de l’aperçu', sw: 'Inapakia onyesho la kukagua' },
78
+ 'MessagingAttachments.PREVIEW_ERROR': { de: 'Vorschau konnte nicht geladen werden.', en: 'Preview could not be loaded.', fr: 'Impossible de charger l’aperçu.', sw: 'Onyesho la kukagua halikuweza kupakiwa.' },
79
+ 'MessagingReactions.LABEL': { de: 'Reaktionen', en: 'Reactions', fr: 'Réactions', sw: 'Miitikio' },
80
+ 'MessagingReactions.ADD': { de: 'Reaktion hinzufügen', en: 'Add reaction', fr: 'Ajouter une réaction', sw: 'Ongeza mwitikio' },
81
+ 'MessagingReactions.TOGGLE_one': { de: '{{emoji}} Reaktion mit {{count}} Stimme umschalten', en: 'Toggle {{emoji}} reaction with {{count}} vote', fr: 'Basculer la réaction {{emoji}} avec {{count}} vote', sw: 'Badilisha mwitikio wa {{emoji}} wenye kura {{count}}' },
82
+ 'MessagingReactions.TOGGLE_other': { de: '{{emoji}} Reaktion mit {{count}} Stimmen umschalten', en: 'Toggle {{emoji}} reaction with {{count}} votes', fr: 'Basculer la réaction {{emoji}} avec {{count}} votes', sw: 'Badilisha mwitikio wa {{emoji}} wenye kura {{count}}' },
83
+ 'MessagingReactions.ERROR': { de: 'Reaktion konnte nicht gespeichert werden: {{message}}', en: 'Reaction could not be saved: {{message}}', fr: 'Impossible d’enregistrer la réaction : {{message}}', sw: 'Mwitikio haukuweza kuhifadhiwa: {{message}}' },
84
+ 'MessagingPoll.LABEL': { de: 'Umfrage', en: 'Poll', fr: 'Sondage', sw: 'Kura ya maoni' },
85
+ 'MessagingPoll.CLOSE': { de: 'Umfrage schliessen', en: 'Close poll', fr: 'Clore le sondage', sw: 'Funga kura ya maoni' },
86
+ 'MessagingPoll.CLOSED': { de: 'Geschlossen', en: 'Closed', fr: 'Clos', sw: 'Imefungwa' },
87
+ 'MessagingPoll.OPTION_RESULT': { de: '{{count}} ({{percent}} %)', en: '{{count}} ({{percent}}%)', fr: '{{count}} ({{percent}} %)', sw: '{{count}} ({{percent}}%)' },
88
+ 'MessagingPoll.VOTE_ERROR': { de: 'Stimme konnte nicht gespeichert werden: {{message}}', en: 'Vote could not be saved: {{message}}', fr: 'Impossible d’enregistrer le vote : {{message}}', sw: 'Kura haikuweza kuhifadhiwa: {{message}}' },
89
+ 'MessagingPoll.CLOSE_ERROR': { de: 'Umfrage konnte nicht geschlossen werden: {{message}}', en: 'Poll could not be closed: {{message}}', fr: 'Impossible de clore le sondage : {{message}}', sw: 'Kura ya maoni haikuweza kufungwa: {{message}}' },
90
+ 'MessagingPoll.CREATE': { de: 'Umfrage erstellen', en: 'Create poll', fr: 'Créer un sondage', sw: 'Unda kura ya maoni' },
91
+ 'MessagingPoll.CREATE_ERROR': { de: 'Umfrage konnte nicht erstellt werden: {{message}}', en: 'Poll could not be created: {{message}}', fr: 'Impossible de créer le sondage : {{message}}', sw: 'Kura ya maoni haikuweza kuundwa: {{message}}' },
92
+ 'MessagingPoll.CREATE_VALIDATION': { de: 'Frage und mindestens zwei Optionen sind erforderlich.', en: 'A question and at least two options are required.', fr: 'Une question et au moins deux options sont requises.', sw: 'Swali na angalau chaguo mbili vinahitajika.' },
93
+ 'MessagingPoll.QUESTION': { de: 'Frage', en: 'Question', fr: 'Question', sw: 'Swali' },
94
+ 'MessagingPoll.OPTION': { de: 'Option {{count}}', en: 'Option {{count}}', fr: 'Option {{count}}', sw: 'Chaguo {{count}}' },
95
+ 'MessagingPoll.ADD_OPTION': { de: 'Option hinzufügen', en: 'Add option', fr: 'Ajouter une option', sw: 'Ongeza chaguo' },
96
+ 'MessagingPoll.ALLOW_MULTIPLE': { de: 'Mehrfachauswahl erlauben', en: 'Allow multiple choices', fr: 'Autoriser plusieurs choix', sw: 'Ruhusu chaguo nyingi' },
97
+ 'MessagingPoll.CANCEL': { de: 'Abbrechen', en: 'Cancel', fr: 'Annuler', sw: 'Ghairi' },
98
+ 'MessagingPoll.YOU_VOTED': { de: 'von dir gewählt', en: 'voted by you', fr: 'voté par vous', sw: 'ulichagua' },
99
+ 'MessagingConfig.LABEL': { de: 'Nachrichten-Einstellungen', en: 'Messaging settings', fr: 'Paramètres de messagerie', sw: 'Mipangilio ya ujumbe' },
100
+ 'MessagingConfig.TITLE': { de: 'Nachrichten-Einstellungen', en: 'Messaging settings', fr: 'Paramètres de messagerie', sw: 'Mipangilio ya ujumbe' },
101
+ 'MessagingConfig.LOADING': { de: 'Einstellungen werden geladen…', en: 'Loading settings…', fr: 'Chargement des paramètres…', sw: 'Inapakia mipangilio…' },
102
+ 'MessagingConfig.LOAD_ERROR': { de: 'Einstellungen konnten nicht geladen werden: {{message}}', en: 'Settings could not be loaded: {{message}}', fr: 'Impossible de charger les paramètres : {{message}}', sw: 'Mipangilio haikuweza kupakiwa: {{message}}' },
103
+ 'MessagingConfig.SAVE_ERROR': { de: 'Einstellungen konnten nicht gespeichert werden: {{message}}', en: 'Settings could not be saved: {{message}}', fr: 'Impossible d’enregistrer les paramètres : {{message}}', sw: 'Mipangilio haikuweza kuhifadhiwa: {{message}}' },
104
+ 'MessagingConfig.DM_POLICY': { de: 'Direktnachrichten-Regel', en: 'Direct-message policy', fr: 'Règle des messages directs', sw: 'Sera ya ujumbe wa moja kwa moja' },
105
+ 'MessagingConfig.DM_ALL': { de: 'Alle', en: 'Everyone', fr: 'Tout le monde', sw: 'Kila mtu' },
106
+ 'MessagingConfig.DM_SHARED': { de: 'Nur gemeinsame Gruppen', en: 'Shared groups only', fr: 'Groupes communs uniquement', sw: 'Vikundi vya pamoja pekee' },
107
+ 'MessagingConfig.DM_TEAM': { de: 'Nur Team', en: 'Team only', fr: 'Équipe uniquement', sw: 'Timu pekee' },
108
+ 'MessagingConfig.GROUP_ENABLED': { de: 'Gruppenchat aktivieren', en: 'Enable group chat', fr: 'Activer le chat de groupe', sw: 'Washa gumzo la kikundi' },
109
+ 'MessagingConfig.EVERYONE_POSTS': { de: 'Alle dürfen schreiben', en: 'Everyone can post', fr: 'Tout le monde peut publier', sw: 'Kila mtu anaweza kutuma ujumbe' },
110
+ 'MessagingAnnouncement.CREATE': { de: 'Ankündigung erstellen', en: 'Create announcement', fr: 'Créer une annonce', sw: 'Unda tangazo' },
111
+ 'MessagingAnnouncement.TITLE': { de: 'Titel', en: 'Title', fr: 'Titre', sw: 'Kichwa' },
112
+ 'MessagingAnnouncement.BODY': { de: 'Text', en: 'Body', fr: 'Texte', sw: 'Maandishi' },
113
+ 'MessagingAnnouncement.SEND': { de: 'Ankündigung senden', en: 'Send announcement', fr: 'Envoyer l’annonce', sw: 'Tuma tangazo' },
114
+ 'MessagingAnnouncement.CANCEL': { de: 'Abbrechen', en: 'Cancel', fr: 'Annuler', sw: 'Ghairi' },
115
+ 'MessagingAnnouncement.VALIDATION': { de: 'Ein Titel ist erforderlich.', en: 'A title is required.', fr: 'Un titre est requis.', sw: 'Kichwa kinahitajika.' },
116
+ 'MessagingAnnouncement.ERROR': { de: 'Ankündigung konnte nicht gesendet werden: {{message}}', en: 'Announcement could not be sent: {{message}}', fr: 'Impossible d’envoyer l’annonce : {{message}}', sw: 'Tangazo halikuweza kutumwa: {{message}}' },
117
+ 'MessagingAnnouncement.OPEN_LINK': { de: 'Link öffnen', en: 'Open link', fr: 'Ouvrir le lien', sw: 'Fungua kiungo' },
118
118
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@micha.bigler/ui-core-micha",
3
- "version": "2.41.2",
3
+ "version": "2.42.0",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.js",
6
6
  "sideEffects": [
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React, { useEffect } from 'react';
2
2
  import { Box } from '@mui/material';
3
3
  import { useTheme } from '@mui/material/styles';
4
4
  import { useTranslation } from 'react-i18next';
@@ -7,8 +7,10 @@ import { useNeutralChartPalette } from './palette';
7
7
  import {
8
8
  DEFAULT_LEGEND_POSITION,
9
9
  defaultNumericTickFormatter,
10
+ resolveChartHeight,
10
11
  sizeYAxisForContent,
11
12
  spaceForRotatedTicks,
13
+ warnOnHeightMismatch,
12
14
  withAxisDefaults,
13
15
  withChartSlotDefaults,
14
16
  withGridDefaults,
@@ -24,6 +26,11 @@ import {
24
26
  * the panel heading already names the quantity. Omitting one never suppresses
25
27
  * a label the caller DID set (`withAxisDefaults` only ever falls back onto
26
28
  * an axis without its own `label`).
29
+ *
30
+ * `minHeight` (CHART-8): a floor under an `aspect`-derived responsive height when `aspect` is
31
+ * set and `height` is not; otherwise (no `height`, no `aspect`) it sizes the chart itself. Once
32
+ * `height` is set, `height` sizes the chart and the wrapper never reserves more than that, even
33
+ * if `minHeight` is also passed and larger.
27
34
  */
28
35
  export function BarChart({
29
36
  series = [],
@@ -33,6 +40,7 @@ export function BarChart({
33
40
  yAxis,
34
41
  palette,
35
42
  minHeight,
43
+ height,
36
44
  aspect,
37
45
  grid,
38
46
  hideLegend = series.length <= 1,
@@ -45,6 +53,9 @@ export function BarChart({
45
53
  const { i18n } = useTranslation();
46
54
  const neutralPalette = useNeutralChartPalette();
47
55
 
56
+ useEffect(() => warnOnHeightMismatch('BarChart', { minHeight, height }), [minHeight, height]);
57
+ const { wrapperMinHeight, chartHeight } = resolveChartHeight({ minHeight, height, aspect });
58
+
48
59
  const labelledXAxis = withAxisDefaults(
49
60
  xAxis,
50
61
  xAxisLabel,
@@ -69,9 +80,10 @@ export function BarChart({
69
80
  );
70
81
 
71
82
  return (
72
- <Box data-testid="bar-chart-container" sx={{ width: '100%', minHeight, aspectRatio: aspect }}>
83
+ <Box data-testid="bar-chart-container" sx={{ width: '100%', minHeight: wrapperMinHeight, aspectRatio: aspect }}>
73
84
  <MuiBarChart
74
85
  {...chartProps}
86
+ height={chartHeight}
75
87
  series={series}
76
88
  xAxis={rotatedTickSpace.xAxis}
77
89
  yAxis={sizedYAxis}
@@ -1,4 +1,4 @@
1
- import React, { useId, useRef, useState } from 'react';
1
+ import React, { useEffect, useId, useRef, useState } from 'react';
2
2
  import {
3
3
  Alert,
4
4
  Box,
@@ -11,12 +11,18 @@ import {
11
11
  import { useTranslation } from 'react-i18next';
12
12
  import { useTheme } from '@mui/material/styles';
13
13
  import { exportChartPng, exportChartSvg } from './exportChart';
14
+ import { resolveChartHeight, warnOnHeightMismatch } from './chartDefaults';
14
15
 
15
16
  export const CHART_FRAME_ROOT_SX = { p: 2 };
16
17
  export const CHART_FRAME_ALERT_SX = { mt: 2 };
17
18
 
18
19
  /**
19
20
  * Chart-type-agnostic chart scaffolding. Children may be an X-Charts primitive or a bespoke SVG.
21
+ *
22
+ * `minHeight` (CHART-8): a floor under an `aspect`-derived responsive height when `aspect` is
23
+ * set and `height` is not; otherwise (no `height`, no `aspect`) it sizes the content box itself.
24
+ * Once `height` is set, `height` sizes the box and it never reserves more than that, even if
25
+ * `minHeight` is also passed and larger.
20
26
  */
21
27
  export function ChartFrame({
22
28
  title,
@@ -28,6 +34,7 @@ export function ChartFrame({
28
34
  isEmpty = false,
29
35
  emptyMessage,
30
36
  minHeight,
37
+ height,
31
38
  aspect,
32
39
  exportOptions = false,
33
40
  onExportSvg,
@@ -51,6 +58,9 @@ export function ChartFrame({
51
58
  const chartLabel = ariaLabel || title;
52
59
  const callerSx = Array.isArray(sx) ? sx : [sx];
53
60
 
61
+ useEffect(() => warnOnHeightMismatch('ChartFrame', { minHeight, height }), [minHeight, height]);
62
+ const { wrapperMinHeight, chartHeight } = resolveChartHeight({ minHeight, height, aspect });
63
+
54
64
  const runExport = async (type) => {
55
65
  setExportError(false);
56
66
  try {
@@ -103,7 +113,8 @@ export function ChartFrame({
103
113
  aria-labelledby={hasCustomAriaLabel ? undefined : titleId}
104
114
  sx={{
105
115
  width: '100%',
106
- minHeight,
116
+ minHeight: wrapperMinHeight,
117
+ height: chartHeight,
107
118
  aspectRatio: aspect,
108
119
  display: 'flex',
109
120
  alignItems: 'center',
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React, { useEffect } from 'react';
2
2
  import { Box } from '@mui/material';
3
3
  import { useTheme } from '@mui/material/styles';
4
4
  import { useTranslation } from 'react-i18next';
@@ -10,8 +10,10 @@ import { useNeutralChartPalette } from './palette';
10
10
  import {
11
11
  DEFAULT_LEGEND_POSITION,
12
12
  defaultNumericTickFormatter,
13
+ resolveChartHeight,
13
14
  sizeYAxisForContent,
14
15
  spaceForRotatedTicks,
16
+ warnOnHeightMismatch,
15
17
  withAxisDefaults,
16
18
  withChartSlotDefaults,
17
19
  withGridDefaults,
@@ -41,6 +43,11 @@ function FilledMarkElement({ color, style, ...props }) {
41
43
  * the quantity. Omitting one never suppresses a label the caller DID set
42
44
  * (`withAxisDefaults` only ever falls back onto an axis without its own
43
45
  * `label`).
46
+ *
47
+ * `minHeight` (CHART-8): a floor under an `aspect`-derived responsive height when `aspect` is
48
+ * set and `height` is not; otherwise (no `height`, no `aspect`) it sizes the chart itself. Once
49
+ * `height` is set, `height` sizes the chart and the wrapper never reserves more than that, even
50
+ * if `minHeight` is also passed and larger.
44
51
  */
45
52
  export function LineChart({
46
53
  series = [],
@@ -50,6 +57,7 @@ export function LineChart({
50
57
  yAxis,
51
58
  palette,
52
59
  minHeight,
60
+ height,
53
61
  aspect,
54
62
  grid,
55
63
  hideLegend = series.length <= 1,
@@ -63,6 +71,9 @@ export function LineChart({
63
71
  const { i18n } = useTranslation();
64
72
  const neutralPalette = useNeutralChartPalette();
65
73
 
74
+ useEffect(() => warnOnHeightMismatch('LineChart', { minHeight, height }), [minHeight, height]);
75
+ const { wrapperMinHeight, chartHeight } = resolveChartHeight({ minHeight, height, aspect });
76
+
66
77
  const labelledXAxis = withAxisDefaults(
67
78
  xAxis,
68
79
  xAxisLabel,
@@ -92,9 +103,10 @@ export function LineChart({
92
103
  );
93
104
 
94
105
  return (
95
- <Box data-testid="line-chart-container" sx={{ width: '100%', minHeight, aspectRatio: aspect }}>
106
+ <Box data-testid="line-chart-container" sx={{ width: '100%', minHeight: wrapperMinHeight, aspectRatio: aspect }}>
96
107
  <MuiLineChart
97
108
  {...chartProps}
109
+ height={chartHeight}
98
110
  series={defaultedSeries}
99
111
  xAxis={rotatedTickSpace.xAxis}
100
112
  yAxis={sizedYAxis}
@@ -1,4 +1,4 @@
1
- import React, { useMemo } from 'react';
1
+ import React, { useEffect, useMemo } from 'react';
2
2
  import { Box } from '@mui/material';
3
3
  import { useTheme } from '@mui/material/styles';
4
4
  import { useTranslation } from 'react-i18next';
@@ -8,7 +8,9 @@ import { useNeutralChartPalette } from './palette';
8
8
  import {
9
9
  DEFAULT_LEGEND_POSITION,
10
10
  defaultNumericTickFormatter,
11
+ resolveChartHeight,
11
12
  sizeYAxisForContent,
13
+ warnOnHeightMismatch,
12
14
  withAxisDefaults,
13
15
  withChartSlotDefaults,
14
16
  withGridDefaults,
@@ -151,6 +153,11 @@ export function ScatterReferenceLine({
151
153
  * Reference geometry (a computed curve, a straight line, either with an optional label) is
152
154
  * composed as `children` using `ScatterReferenceCurve`/`ScatterReferenceLine` above.
153
155
  *
156
+ * `minHeight` (CHART-8): a floor under an `aspect`-derived responsive height when `aspect` is
157
+ * set and `height` is not; otherwise (no `height`, no `aspect`) it sizes the chart itself. Once
158
+ * `height` is set, `height` sizes the chart and the wrapper never reserves more than that, even
159
+ * if `minHeight` is also passed and larger.
160
+ *
154
161
  * Tested magnitude: a few hundred marks (hram's largest cloud is ~300 points). Not verified,
155
162
  * and not implied to hold, at thousands+.
156
163
  *
@@ -171,6 +178,7 @@ export function ScatterChart({
171
178
  yAxis,
172
179
  palette,
173
180
  minHeight,
181
+ height,
174
182
  aspect,
175
183
  grid,
176
184
  hideLegend = series.length <= 1,
@@ -187,6 +195,9 @@ export function ScatterChart({
187
195
  const { i18n } = useTranslation();
188
196
  const neutralPalette = useNeutralChartPalette();
189
197
 
198
+ useEffect(() => warnOnHeightMismatch('ScatterChart', { minHeight, height }), [minHeight, height]);
199
+ const { wrapperMinHeight, chartHeight } = resolveChartHeight({ minHeight, height, aspect });
200
+
190
201
  const labelledXAxis = withAxisDefaults(
191
202
  xAxis,
192
203
  xAxisLabel,
@@ -257,9 +268,10 @@ export function ScatterChart({
257
268
  );
258
269
 
259
270
  return (
260
- <Box data-testid="scatter-chart-container" sx={{ width: '100%', minHeight, aspectRatio: aspect }}>
271
+ <Box data-testid="scatter-chart-container" sx={{ width: '100%', minHeight: wrapperMinHeight, aspectRatio: aspect }}>
261
272
  <MuiScatterChart
262
273
  {...chartProps}
274
+ height={chartHeight}
263
275
  series={orderedSeries.map((item) => ({ markerSize, ...item }))}
264
276
  xAxis={labelledXAxis}
265
277
  yAxis={sizedYAxis}
@@ -271,6 +271,49 @@ export function defaultNumericTickFormatter(locale) {
271
271
  : new Intl.NumberFormat(locale).format(value));
272
272
  }
273
273
 
274
+ /**
275
+ * CHART-8: resolves the `{minHeight, height, aspect}` trio these presets accept into what the
276
+ * wrapper reserves and what height (if any) sizes the chart itself. Three-way, not two-way --
277
+ * `aspect` changes the answer:
278
+ * - `height` set -> it sizes the chart; the wrapper never reserves more than that (a caller-set
279
+ * `minHeight` larger than `height` is capped here, closing the dead-space gap this WO exists
280
+ * to fix -- equal values, or no `minHeight` at all, pass through unchanged).
281
+ * - no `height`, `aspect` set -> unchanged from before this WO: the wrapper's own `aspectRatio`
282
+ * derives its height from its width, and `minHeight` stays exactly what its name says, a floor
283
+ * stopping it collapsing on a narrow viewport. Do not give the chart a fixed height here --
284
+ * that would remove the responsive behaviour four live call sites rely on.
285
+ * - no `height`, no `aspect` -> `minHeight` sizes the chart itself. There is no other sizing
286
+ * information to go on, and a caller in this shape meant the chart to have that height, not
287
+ * merely a wrapper floor around an unsized chart.
288
+ */
289
+ export function resolveChartHeight({ minHeight, height, aspect }) {
290
+ if (height != null) {
291
+ const wrapperMinHeight = minHeight != null && minHeight > height ? height : minHeight;
292
+ return { wrapperMinHeight, chartHeight: height };
293
+ }
294
+ if (aspect != null) {
295
+ return { wrapperMinHeight: minHeight, chartHeight: undefined };
296
+ }
297
+ return { wrapperMinHeight: minHeight, chartHeight: minHeight };
298
+ }
299
+
300
+ /**
301
+ * CHART-8: dev-only warning when a caller passes both `minHeight` and `height` and they disagree
302
+ * -- the incoherent pair this WO closes. Not a throw: a shared package throwing on a prop
303
+ * combination in production would break a consumer's page over a layout nit. Silent on the
304
+ * equal-value majority and on the legitimate `minHeight` + `aspect` (no `height`) combination.
305
+ */
306
+ export function warnOnHeightMismatch(componentName, { minHeight, height }) {
307
+ if (process.env.NODE_ENV === 'production') return;
308
+ if (minHeight == null || height == null || minHeight === height) return;
309
+ // eslint-disable-next-line no-console
310
+ console.warn(
311
+ `[ui-core-micha] <${componentName}> received both minHeight={${minHeight}} and height={${height}}; `
312
+ + 'they disagree, so height wins and the wrapper no longer reserves the extra space below the '
313
+ + 'chart. Pass only height, or drop minHeight if it should just track height.',
314
+ );
315
+ }
316
+
274
317
  export function withChartSlotDefaults(slotProps, legendPosition) {
275
318
  const position = {
276
319
  ...DEFAULT_LEGEND_POSITION,