Compare commits

...
Author SHA1 Message Date
Nariman Jelveh cd81ce02b3 fix(dashboard): align the Shared and Trash rows' menu button on phones
Item rows get position: relative from jQuery UI draggable, but the Shared
and Trash rows above Home's folders aren't draggable, so their '⋯' was
positioned against the whole list and sat 3px off from every other row's.
2026-10-22 15:18:27 -07:00
Nariman Jelveh 33bfadc5fb fix(dashboard): fit two grid tiles a row in narrow Files listings
Grid view's 170px column minimum left one 330px tile per row on 360px
phones (and in a tablet's narrow listing), so barely two files fit on
screen. Narrow listings now use two equal columns, and the tile's icon
box shrinks with the tile instead of keeping its fixed 150px.
2026-10-22 15:18:27 -07:00
Nariman Jelveh 3c965a6fde fix(dashboard): stack Home's recent apps when their card is narrow
In the two-column Home on a portrait tablet (iPad Air and Pro 11 at
820-834px, or 769px windows) the Apps card is about 200px wide, and two
columns of recent apps cut every name to a letter or two. The list now
switches to one column on the card's own width; 1024px and wider keep two.
2026-10-22 15:18:27 -07:00
Nariman Jelveh 735f37ee4d fix(dashboard): show Usage amounts in full on phones
Every Usage table cell ellipsized, numbers included, so on a phone a
token count like 12,345,678 read as "12,345...". Below 480px the units
and cost columns now keep their full width and the resource name is the
one that truncates. Wider layouts are unchanged.
2026-10-22 15:18:27 -07:00
Nariman Jelveh ac258aa835 fix(dashboard): stop clipping app names' descenders on phones and small tablets
Below 768px the tile height budgeted 52px icon + 10px margin + 12px for a
label line that is 15.6px tall, so the bottoms of g, p and y were cut off
in every app name. The tile now has the full line (78px) and the row gap
gives back the 4px, so tiles sit exactly where they did.
2026-10-22 15:18:27 -07:00
Nariman Jelveh f1e595c7fd fix(dashboard): size Home's recent apps card to its apps on phones
Its 310px minimum height matches the square welcome card beside it on
wider screens. In the single-column layout the welcome card drops its
square shape but the minimum stayed, leaving a block of empty card under
a short list of recent apps.
2026-10-22 15:18:27 -07:00
Nariman Jelveh 90cdc804e4 fix(dashboard): enlarge the Files back, forward and up touch targets
They were 28px squares on touch screens. On coarse pointers they now take
36px with a matching negative margin, so the toolbar layout is unchanged.
2026-10-22 15:18:27 -07:00
Nariman Jelveh 47289324e2 fix(dashboard): give the Files row menu button a full-size touch target
On phones the row's '⋯' is 40x23, right beside a row whose tap opens the
item, so a slightly-off tap opened the file or folder instead of its
menu. In the two-row layout it now has a 44px square hit area on touch
screens.
2026-10-22 15:18:27 -07:00
Nariman Jelveh f71dd29b43 fix(dashboard): don't leave Account and Security buttons highlighted after a tap
Their hover background wasn't limited to hover-capable pointers like the
rest of the dashboard's hover styles, so on touch devices a tapped button
(Change Password, Manage Sessions, ...) stayed shaded after its dialog
closed.
2026-10-22 15:18:27 -07:00
Nariman Jelveh 1228c18872 fix(dashboard): keep every Files folder reachable in a short viewport
Trash was fixed to the bottom of the viewport, so in a landscape phone or
a short window it sat on top of Public and Videos, while Shared ran below
the column with no way to scroll to it. The folder column now scrolls,
and Trash sits at its foot in the flow: in the same spot when there is
room, after Shared when there isn't.
2026-10-22 15:18:27 -07:00
Nariman Jelveh 1c1d6e10e7 fix(dashboard): keep Home's recent apps inside their card on tablets
Each recent app was a fixed 200px inside 1fr columns, whose minimum is
that width, so in the half-width card on a landscape iPad the second
column ran past the card's edge and its name was cut off with the
ellipsis out of view. The rows now shrink with their column.
2026-10-22 15:18:27 -07:00
Nariman Jelveh a845ab7240 fix(dashboard): align Account and Security with the other tabs on phones
Below 768px their wrapper added a 16px gutter inside the content area's
own, so both tabs sat 32px in while Home, Apps and Usage (and the menu
button above them) sit at 16px. The extra padding stays for Apps, whose
content area has none.
2026-10-22 15:18:27 -07:00
Nariman Jelveh d70b4b2d9f fix(dashboard): let the Apps modals scroll in a short viewport
The Add-an-app and uninstall cards had no height cap and their overlay
centers without scrolling, so on a landscape phone with the keyboard up
(the viewport resizes for it) the request form's title and buttons sat
off-screen with no way to reach them.
2026-10-22 15:18:27 -07:00
Nariman Jelveh 619e184c14 fix(dashboard): size the touch context menu as a card on tablets
The touch menu took 90% of the viewport, which on an iPad meant a ~920px
strip with its labels far from the row they belong to. It now stops at
400px, which every phone stays under. Its height is also measured after
the width is set, so the clamp to the viewport uses the real height.
2026-10-22 15:18:27 -07:00
Nariman Jelveh 127bf3c827 fix(dashboard): keep the app feedback sheet's buttons above the home indicator
As a phone bottom sheet it sits flush with the bottom edge, so Cancel and
Send ended under the iPhone home indicator.
2026-10-22 15:18:27 -07:00
Nariman Jelveh 0800e035d5 fix(dashboard): clear the home indicator in the item properties sheet
On phones the sheet sits flush with the bottom edge, and unlike the share
sheet it mirrors, its body didn't pad for the bottom safe-area inset, so
the last details scrolled under the iPhone home indicator.
2026-10-22 15:18:27 -07:00
Nariman Jelveh 6faf713245 fix(dashboard): keep the phone Files footer and selection bar above the home indicator
The installed app runs edge to edge, so the footer's item count sat under
the iPhone home indicator. The footer now grows by the bottom safe-area
inset, and the list padding and floating action bar move up with it, as
the Apps tab and the dashboard's bottom sheets already do.
2026-10-22 15:18:27 -07:00
Nariman Jelveh 7bff6466ba fix(dashboard): let the last Files rows scroll clear of the phone selection bar
In phone select mode the list's bottom padding only cleared the footer, so
the last row stayed behind the floating action bar even fully scrolled.
2026-10-22 15:18:27 -07:00
Nariman Jelveh 776cca331b fix(dashboard): keep the Files selection bar under the drawer and sheets
The bar's visible state set z-index 99999999999999999 (clamped to the
maximum), so in phone select mode it drew over the open navigation drawer,
covering the account button, and over the share sheet it opens. Its base
z-index already clears the rows and the footer.
2026-10-22 15:18:27 -07:00
Nariman Jelveh 3afefec49f fix(dashboard): end clipped file names in the list with an ellipsis
With the name column auto-sized, which is always the case on phones and
tablets, a long name was cut off mid-letter with no sign it continued.
2026-10-22 15:18:27 -07:00
Nariman Jelveh eda88b2e4a fix(dashboard): keep a deep folder path on one row with the current folder in view
A long path wrapped the crumbs over several lines on top of the column
headers and pushed the toolbar actions off-screen; where the crumbs already
scrolled (phones), the row opened at the root, hiding the current folder.
The crumbs now scroll within their row and are scrolled to their end on
render and when the tab is shown.
2026-10-22 15:18:27 -07:00
Nariman Jelveh 8f065697f0 fix(dashboard): wrap the Files toolbar onto two rows in narrow listings
On tablets the nav buttons, crumbs and actions sat on one row wider than
the listing, so the sort, view, new-folder and upload buttons ran off the
right edge. Narrow listings now use the phone's two-row toolbar (crumbs
above, buttons below); only the menu-button clearance stays phone-only.
2026-10-22 15:18:27 -07:00
Nariman Jelveh 86236475f2 fix(dashboard): give narrow Files listings the two-row layout
The two-row rows (name, then size and date) were keyed to a phone-width
viewport, so between 481px and ~930px, where the sidebar and folder column
take their share, the fixed size and modified columns squeezed names to a
few characters. The layout now switches on the listing's own width with a
container query, which phones still meet and wide listings never do.
2026-10-22 15:18:26 -07:00
5 changed files with 251 additions and 51 deletions

No files matched your search

@@ -16,6 +16,9 @@ function isTouchPrimaryDevice () {
);
}
/** Widest the touch menu gets, so phones (90% of up to ~440px) are unaffected. */
const MAX_TOUCH_MENU_WIDTH = 400;
/** Labels of the destructive file actions, in the current language. */
const dangerLabels = () => new Set([i18n('delete'), i18n('delete_permanently')]);
@@ -103,13 +106,20 @@ export default class ContextMenuModal {
*/
positionModal (targetRect) {
const isMobile = isTouchPrimaryDevice();
const modalHeight = this.modal.offsetHeight;
const modalWidth = this.modal.offsetWidth;
const viewportHeight = window.innerHeight;
const viewportWidth = window.innerWidth;
const margin = 20; // Minimum margin from viewport edges
const width = isMobile ? viewportWidth * 0.9 : modalWidth;
// Touch: most of a phone's width, but a phone-sized card on a tablet
// rather than a strip spanning the screen. Applied before measuring
// the height, which depends on how the labels wrap at this width.
if ( isMobile ) {
this.modal.style.width = `${Math.min(viewportWidth * 0.9, MAX_TOUCH_MENU_WIDTH)}px`;
} else {
this.modal.style.width = 'auto';
}
const modalHeight = this.modal.offsetHeight;
const width = this.modal.offsetWidth;
// Center over the target horizontally, clamped to the viewport. (The
// old code hardcoded left:300px on non-touch devices — which used to
@@ -131,7 +141,6 @@ export default class ContextMenuModal {
this.modal.style.top = `${top}px`;
this.modal.style.left = `${left}px`;
this.modal.style.width = isMobile ? '90%' : 'auto';
}
/**
@@ -0,0 +1,42 @@
// @vitest-environment jsdom
import { afterEach, describe, expect, it, vi } from 'vitest';
globalThis.i18n = (key) => key;
const { default: ContextMenuModal } = await import('./ContextMenu.js');
const setTouchViewport = (width, touch = true) => {
window.innerWidth = width;
window.innerHeight = 800;
window.matchMedia = (query) => ({
matches: touch && (query === '(pointer: coarse)' || query === '(hover: none)'),
});
};
const openMenu = () => {
const menu = new ContextMenuModal();
menu.show([{ label: 'Open', action: () => {} }], { left: 100, top: 100, width: 200, height: 30 });
return document.querySelector('.context-menu-modal-dialog');
};
afterEach(() => {
vi.restoreAllMocks();
document.body.innerHTML = '';
});
describe('ContextMenuModal width', () => {
it('takes 90% of a phone screen', () => {
setTouchViewport(390);
expect(openMenu().style.width).toBe('351px');
});
it('stops at a card width on a tablet instead of spanning the screen', () => {
setTouchViewport(1024);
expect(openMenu().style.width).toBe('400px');
});
it('sizes to its content for a mouse', () => {
setTouchViewport(1024, false);
expect(openMenu().style.width).toBe('auto');
});
});
+14
View File
@@ -669,6 +669,19 @@ const TabFiles = {
if ( this.currentPath && window.is_dashboard_mode ) {
this.updateDashboardUrl(this.currentPath);
}
// Crumbs rendered while the tab was hidden had no width to scroll.
this.revealCurrentCrumb();
},
/**
* Scrolls a breadcrumb trail too long for its row to its end, so the
* current folder stays in view rather than the root.
*
* @returns {void}
*/
revealCurrentCrumb () {
const crumbs = this.$el_window?.find('.files-tab .path-breadcrumbs')[0];
if ( crumbs ) crumbs.scrollLeft = crumbs.scrollWidth;
},
/**
@@ -2376,6 +2389,7 @@ const TabFiles = {
this.updateActionButtons(isTrashFolder);
$('.path-breadcrumbs').html(this.renderPath(this.currentPath, window.user.username));
this.revealCurrentCrumb();
$('.path-breadcrumbs .dirname').each(function () {
const dirnameElement = this;
const clickedPath = dirnameElement.getAttribute("data-path");
+174 -47
View File
@@ -1515,6 +1515,10 @@ input.myapps-group-name:focus {
padding: 24px;
min-width: min(370px, calc(100vw - 32px));
max-width: min(450px, calc(100vw - 32px));
/* Scrolls rather than spilling past both edges in a short viewport
(landscape phone, on-screen keyboard up) */
max-height: calc(100% - 32px);
overflow-y: auto;
box-shadow: 0 8px 32px var(--dashboard-shadow-medium);
}
.myapps-modal h3 {
@@ -1836,6 +1840,9 @@ input.myapps-group-name:focus {
max-height: 92vh;
border-radius: 14px 14px 0 0;
transform: translateY(16px);
/* Flush with the bottom edge: keep the actions above the home
indicator. */
padding-bottom: env(safe-area-inset-bottom, 0px);
}
.app-feedback-open .app-feedback-modal {
transform: none;
@@ -2281,6 +2288,11 @@ p.myapps-add-error {
.item-props-overlay.item-props-show .item-props-modal {
transform: translateY(0);
}
/* Flush with the bottom edge, like the share sheet: clear the home
indicator. */
.item-props-body {
padding-bottom: calc(16px + env(safe-area-inset-bottom, 0px));
}
.item-props-row {
flex-direction: column;
gap: 3px;
@@ -3803,12 +3815,20 @@ body.myapps-reordering .myapps-tile {
top: 0;
width: 200px;
padding: 16px 0;
/* A short viewport (landscape phone, small window) scrolls the folders
rather than cutting the last ones off */
display: flex;
flex-direction: column;
overflow-y: auto;
}
.dashboard-section-files .directories ul {
list-style: none;
padding: 0;
margin: 0;
flex: 1 0 auto;
display: flex;
flex-direction: column;
}
.dashboard-section-files .directories li {
@@ -3846,15 +3866,16 @@ body.myapps-reordering .myapps-tile {
height: auto;
}
/* Trash sits at the column's foot (20px up, with the column's padding)
when there's room, and after Shared when there isn't. */
.dashboard-section-files .directories li[data-folder="Trash"] {
position: fixed;
bottom: 0;
margin-bottom: 20px;
width: 150px;
margin-top: auto;
margin-bottom: 4px;
height: 38px;
}
.dashboard-section-files .directory-contents {
container: files-list / inline-size;
position: relative;
width: calc(100% - 160px);
display: flex;
@@ -3881,6 +3902,7 @@ body.myapps-reordering .myapps-tile {
}
.dashboard .path-nav-buttons {
flex-shrink: 0;
padding: 4px 10px 4px 0px;
display: flex;
justify-content: center;
@@ -3898,6 +3920,16 @@ body.myapps-reordering .myapps-tile {
background-color: transparent;
}
/* 36px touch targets in the same 28px footprint (they're <img>s, so no
pseudo-element hit area) */
@media (pointer: coarse) {
.dashboard .path-btn {
width: 36px;
padding: 8px;
margin: -4px;
}
}
@media (hover: hover) {
.dashboard .path-btn:hover {
background-color: #EEE;
@@ -3924,6 +3956,16 @@ body.myapps-reordering .myapps-tile {
display: flex;
align-items: center;
margin-left: 10px;
/* A deep path scrolls inside its row (kept at its end by
revealCurrentCrumb) instead of wrapping or pushing the actions out. */
min-width: 0;
overflow-x: auto;
white-space: nowrap;
scrollbar-width: none;
}
.dashboard-section-files .header .path-breadcrumbs::-webkit-scrollbar {
display: none;
}
.dashboard-section-files .header .path-breadcrumbs:empty + .path-actions {
@@ -4103,7 +4145,7 @@ body.myapps-reordering .myapps-tile {
.dashboard-section-files .row .item-name,
.dashboard-section-files .header .columns .item-name {
/* text-overflow: ellipsis; */
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
max-width: unset;
@@ -4454,7 +4496,6 @@ body.myapps-reordering .myapps-tile {
transform: translateX(-50%) translateY(0);
opacity: 1;
visibility: visible;
z-index: 99999999999999999;
}
.dashboard-section-files .files-selection-actions.rubberband-active {
@@ -5170,9 +5211,11 @@ body.myapps-reordering .myapps-tile {
.dashboard-tab-content.myapps-tab {
padding-bottom: max(6px, env(safe-area-inset-bottom));
--myapps-tile-w: 72px;
--myapps-tile-h: 74px;
/* icon 52 + label margin 10 + one label line (~16); the row gap
gives back the 4px so the row pitch stays 104px */
--myapps-tile-h: 78px;
--myapps-gap-x: 12px;
--myapps-gap-y: 30px;
--myapps-gap-y: 26px;
--myapps-icon-size: 52px;
}
@@ -5262,41 +5305,29 @@ body.myapps-reordering .myapps-tile {
white-space: nowrap;
}
/* Mobile phone optimizations */
/* The Shared/Trash rows on Home exist for phones, where the directories
sidebar below is hidden; while the sidebar is visible they'd be redundant.
Same breakpoint as the sidebar rule so the two never both show or both hide. */
@media (min-width: 481px) {
.dashboard-section-files .files-tab .files .row.place-row {
display: none !important;
}
}
@media (max-width: 480px) {
.dashboard-content.files {
padding: 0;
}
/* Hide directories sidebar */
.dashboard-section-files .directories {
display: none;
}
/* Full width for directory contents */
.dashboard-section-files .directory-contents {
width: 100%;
border-left: none;
}
.dashboard-section-files .directory-contents .header {
margin-bottom: 12px;
}
/* Hide column headers */
/* Narrow listings (phones, and tablets or small windows once the sidebar
and folder column take their share) drop the columns for two-row rows;
the size and modified columns would otherwise squeeze names to a few
characters. */
@container files-list (max-width: 480px) {
.dashboard-section-files .header .columns {
display: none;
}
/* Two tiles a row: the 170px column minimum left a single 330px tile
per row on a 360px phone. The icon box shrinks with the tile instead
of overflowing it. Compact grid keeps its own smaller minimum. */
.dashboard-section-files .files-tab .files.files-grid-view:not(.files-grid-view-sm) {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.dashboard-section-files .files-tab .files.files-grid-view:not(.files-grid-view-sm) .row .item-icon {
width: 100%;
max-width: 150px;
height: auto;
aspect-ratio: 1;
}
/* Two-row header layout */
.dashboard-section-files .header .path {
flex-wrap: wrap;
@@ -5309,7 +5340,6 @@ body.myapps-reordering .myapps-tile {
width: 100%;
margin: 0 0 8px 0;
padding-bottom: 8px;
margin-left: 50px;
flex-wrap: nowrap;
white-space: nowrap;
overflow-x: auto;
@@ -5405,23 +5435,81 @@ body.myapps-reordering .myapps-tile {
display: none;
}
/* Hide more button (use long-press for context menu on touch) */
/* More button pinned to the row's right edge */
.dashboard-section-files .files-tab .files.files-list-view .row .item-more {
position: absolute;
right: 10px;
}
/* Adjust footer position - full width since sidebar is hidden */
/* On touch it's a 40x23 target beside a row whose tap opens the item,
so a near miss opened the item instead of the menu. The two-row rows
are tall enough for a 44px square hit area. */
@media (pointer: coarse) {
.dashboard-section-files .files-tab .files.files-list-view .row .item-more::before {
content: '';
position: absolute;
left: 50%;
top: 50%;
width: 44px;
height: 44px;
transform: translate(-50%, -50%);
}
}
}
/* Mobile phone optimizations */
/* The Shared/Trash rows on Home exist for phones, where the directories
sidebar below is hidden; while the sidebar is visible they'd be redundant.
Same breakpoint as the sidebar rule so the two never both show or both hide. */
@media (min-width: 481px) {
.dashboard-section-files .files-tab .files .row.place-row {
display: none !important;
}
}
@media (max-width: 480px) {
.dashboard-content.files {
padding: 0;
}
/* Hide directories sidebar */
.dashboard-section-files .directories {
display: none;
}
/* Full width for directory contents */
.dashboard-section-files .directory-contents {
width: 100%;
border-left: none;
}
.dashboard-section-files .directory-contents .header {
margin-bottom: 12px;
}
/* Clear the fixed menu button beside the crumbs */
.dashboard-section-files .header .path-breadcrumbs {
margin-left: 50px;
}
/* Adjust footer position - full width since sidebar is hidden. It sits
on the bottom edge, so it grows to keep its text above the home
indicator; the list and the action bar move up with it. */
.dashboard-section-files .files-footer {
left: 0;
padding: 0;
padding: 0 0 env(safe-area-inset-bottom, 0px);
height: calc(30px + env(safe-area-inset-bottom, 0px));
}
.dashboard-section-files .files {
padding-bottom: calc(30px + env(safe-area-inset-bottom, 0px));
}
/* Mobile: Floating selection actions - icon-only, full width */
.dashboard-section-files .files-selection-actions {
left: 0;
right: 0;
bottom: 38px;
bottom: calc(38px + env(safe-area-inset-bottom, 0px));
transform: translateX(0) translateY(100px);
border-radius: 0;
justify-content: center;
@@ -5432,6 +5520,11 @@ body.myapps-reordering .myapps-tile {
transform: translateX(0) translateY(0);
}
/* Room to scroll the last rows above the bar (38px up, ~64px tall) */
.dashboard-section-files .files-tab.select-mode-active .files {
padding-bottom: calc(110px + env(safe-area-inset-bottom, 0px));
}
.dashboard-section-files .selection-action-btn span {
display: none;
}
@@ -5501,6 +5594,12 @@ body.myapps-reordering .myapps-tile {
stand in for the hidden sidebar. A divider under the pair separates them
from Home's own folders; they only navigate, so select mode gives them
no checkbox and keeps their layout. */
/* Item rows get position: relative from jQuery UI draggable; place rows
aren't draggable, and their '⋯' would anchor to the list instead. */
.dashboard-section-files .files-tab .files .row.place-row {
position: relative;
}
.dashboard-section-files .files-tab .files.files-list-view .row.place-row[data-place="Trash"] {
border-bottom: 1px solid var(--dashboard-border);
border-radius: 0;
@@ -5787,14 +5886,23 @@ body.myapps-reordering .myapps-tile {
.dashboard .bento-recent-apps-container {
flex: 1;
padding: 16px 24px 24px;
container-type: inline-size;
}
.dashboard .bento-recent-apps-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 12px 20px;
}
/* One column once the card is too narrow for two readable names (the
two-column Home on a portrait tablet) */
@container (max-width: 340px) {
.dashboard .bento-recent-apps-grid {
grid-template-columns: minmax(0, 1fr);
}
}
/* Hide apps beyond 6 on smaller screens */
.dashboard .bento-recent-app:nth-child(n+7) {
display: none;
@@ -5825,6 +5933,9 @@ body.myapps-reordering .myapps-tile {
transition: transform 0.15s ease;
gap: 12px;
width: 200px;
/* Narrower columns (a tablet's half-width card) shrink the row, and the
title ellipsizes, instead of the second column spilling out of the card */
max-width: 100%;
}
.dashboard .bento-recent-app:focus-visible {
@@ -6176,6 +6287,12 @@ body.myapps-reordering .myapps-tile {
min-height: 180px;
}
/* The desktop minimum matches the square welcome card beside it; in one
column it only left the card half empty under a few apps. */
.dashboard .bento-recent {
min-height: 0;
}
.dashboard .bento-welcome-inner {
padding: 20px;
}
@@ -6503,8 +6620,10 @@ body.myapps-reordering .myapps-tile {
transition: background-color 0.15s ease, border-color 0.15s ease;
}
.dashboard-settings-card .button:hover {
background: var(--dashboard-sidebar-background);
@media (hover: hover) {
.dashboard-settings-card .button:hover {
background: var(--dashboard-sidebar-background);
}
}
.dashboard-settings-card .button:focus-visible {
@@ -6665,6 +6784,14 @@ body.myapps-reordering .myapps-tile {
padding: 0 16px;
}
/* These sit in the content area's own 16px gutter, which Apps (padded
above) doesn't have; a second gutter would inset them past the other
tabs and the menu button. */
.dashboard-section-account .dashboard-tab-content,
.dashboard-section-security .dashboard-tab-content {
padding: 0;
}
.dashboard-section-header h2 {
font-size: 22px;
}
+8
View File
@@ -5137,6 +5137,14 @@ html.dark-mode .usage-table-show-less:hover {
.driver-usage-details-content-table td:first-child {
width: 50%;
}
/* On a phone, units and cost keep every digit; the resource name is the
column that gives way. */
@media (max-width: 480px) {
.dashboard-section-usage .driver-usage-details-content-table td:not(:first-child) {
max-width: none;
}
}
.version {
font-size: 9px;
color: #343c4f;