Let the main panels fill the remaining space to avoid layout warnings.
Save the conversation sidebar width in pixels to keep both dividers independent.
Use explicit transition timing for emoji pickers to remove Tailwind warnings.
Center avatar initials on a subtle theme gradient.
The widget's UI language was either the inbox's fixed language or, on
"auto", the browser's. Host apps with their own language switch had no
way to tell the widget which language their user picked.
- widget.js: an optional `language` setting (LibredeskSettings or
initLibredesk) is passed to the iframe as `lang`, and
`Libredesk.setLanguage(code)` switches it later. A call made while the
iframe is still loading is sent once it reports WIDGET_LOADED.
- main.js: on inboxes set to "auto", a `lang` the host passed wins over
the browser language; a language the admin fixed for the inbox stays.
- App.vue: SET_LANGUAGE loads the strings and switches the i18n locale in
place (help center content reloads in the new language), so an open
conversation is not reset.
- Short or regional tags match a shipped translation: zh -> zh-CN,
de-AT -> de-DE.
Closes#657
Reduce the inbox form to five grouped tabs and add a responsive live preview.
Add separate light and dark branding with system theme support.
Add launcher size and logo scale controls. Ref #627
Fix realtime message ordering in the agent dashboard. Fixes#626
- handoff form no longer overwrites a JWT contact's name, email or phone.
The CRM resyncs those on every exchange, so the edit reverted anyway.
Visitors still get their submitted values saved.
- search queries dropped the cs and cp table aliases. Any saved view
filtering on conversation_statuses.name returned a 500.
- status and priority never showed as selected in the search filters.
The combobox compares strings, the store gives numbers.
- widget logout left the previous visitor's pre chat draft on screen.
- an auto hidden campaign preview was suppressed forever instead of for
the session.
- switching campaigns in the admin preview did not close the open panel.
The watcher only saw null and non null, so it now keys on campaign id.
- the Help tab blanked out when featured_ids came back as null.
- copilot panel spinner stuck when no conversation was open.
- help center theme toggle was hidden when there were no nav links and
one locale.
- help center dark mode leaked into the article panel inside the widget.
A moon button next to the language picker switches the site between light
and dark. Visitors start in light and the choice is saved in their browser.
Admins get a dark logo field, a checkbox to hide the button, and a light
or dark switch on the customize preview. Colors an admin picks for the
header and footer only apply in light mode.
Widget:
- home background stays pinned while the content scrolls, fade sits on it
- one radius and shadow scale across cards, buttons and inputs
- live search in the help tab with a "no results" state
- attachment-only messages show "Image" in the conversation preview
- launcher and panel use the same shadows as the header
Admin:
- preview column is a fixed width so zoom does not resize it, hidden on small screens
- preview matches the real widget again
- search spinner replaces the magnifier instead of covering the page
Fixes:
- deleting a proactive message did nothing, the dialog cleared the pending
id before the handler read it
- an inbox created through the API could not be saved from the form, it
jumped to the pre-chat tab with no error
Adds livechatWidgetTabs.cy.js covering the proactive message and help
center tabs.
The launcher grows a little on hover and springs back when the pointer
leaves. Also adds a black launcher logo for light backgrounds, softens
the launcher shadow, and expands the widget when help opens on an article.
Idle agents still get auto-assigned tickets. Only the manual away
statuses skip them. The amber away dot made other agents think the
idle person would not get tickets. The agent picker, widget header
and the agents report now treat idle as online.
Move the translation_group_id migration into v2.9.0 and drop the slug backfill. Existing articles each get their own group and admins link translations from the new UI. The public article page now builds its language links from the group instead of the slug, so translations with different slugs no longer 404.
Expand widget conversations with audience-specific forms, AI handoffs, message previews, and help article translations. Keep existing inbox settings compatible and reject invalid live chat configuration.
The new-conversation button always read the users label, so a visitor saw
the text meant for logged-in contacts. Pick visitors or users the same way
the home screen does. Adds tests for this and for the allow-plus-prevent
combination on the messages tab, both checked against the old code first.
The country-code length error borrowed the phone number label, so a
too-long country code read as a phone number limit. Adds a countryCode
term for it. ConversationsView also offered the new-conversation button
when prevent_multiple_conversations was set, without checking whether
visitors may start one at all, so it now follows the same rule as the
home screen and the server.