Skip to content

experiment: Upload base styles #9691

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions dev/upload.html
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,9 @@

<body>
<vaadin-upload target="/api/fileupload"></vaadin-upload>

<br />

<hr style="margin-block: 24px">
<vaadin-upload nodrop target="/api/fileupload"></vaadin-upload>
<hr style="margin-block: 24px">
<vaadin-radio-group label="Next file upload" theme="vertical" id="next-upload">
<vaadin-radio-button value="successful" checked label="Successful"></vaadin-radio-button>
<vaadin-radio-button value="rejected" label="Rejected"></vaadin-radio-button>
Expand Down
3 changes: 3 additions & 0 deletions packages/component-base/src/style-props.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,11 @@ addGlobalThemeStyles(
--_vaadin-icon-fullscreen: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15" /></svg>');
--_vaadin-icon-menu: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5" /></svg>');
--_vaadin-icon-minus: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M5 12h14" /></svg>');
--_vaadin-icon-play: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M5.25 5.653c0-.856.917-1.398 1.667-.986l11.54 6.347a1.125 1.125 0 0 1 0 1.972l-11.54 6.347a1.125 1.125 0 0 1-1.667-.986V5.653Z" /></svg>');
--_vaadin-icon-plus: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M12 4.5v15m7.5-7.5h-15" /></svg>');
--_vaadin-icon-refresh: url('data:image/svg+xml;utf8,<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M22 10C22 10 19.995 7.26822 18.3662 5.63824C16.7373 4.00827 14.4864 3 12 3C7.02944 3 3 7.02944 3 12C3 16.9706 7.02944 21 12 21C16.1031 21 19.5649 18.2543 20.6482 14.5M22 10V4M22 10H16" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>');
--_vaadin-icon-sort: url('data:image/svg+xml;utf8,<svg width="8" height="12" viewBox="0 0 8 12" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M7.49854 6.99951C7.92795 6.99951 8.15791 7.50528 7.87549 7.82861L4.37646 11.8296C4.17728 12.0571 3.82272 12.0571 3.62354 11.8296L0.125488 7.82861C-0.157248 7.50531 0.0719873 6.99956 0.501465 6.99951H7.49854ZM3.62354 0.17041C3.82275 -0.0573875 4.17725 -0.0573848 4.37646 0.17041L7.87549 4.17041C8.15825 4.49373 7.92806 5.00049 7.49854 5.00049L0.501465 4.99951C0.0719873 4.99946 -0.157248 4.49371 0.125488 4.17041L3.62354 0.17041Z" fill="black"/></svg>');
--_vaadin-icon-upload: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5m-13.5-9L12 3m0 0 4.5 4.5M12 3v13.5" /></svg>');
--_vaadin-icon-user: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none"><path d="M3 20C5.33579 17.5226 8.50702 16 12 16C15.493 16 18.6642 17.5226 21 20M16.5 7.5C16.5 9.98528 14.4853 12 12 12C9.51472 12 7.5 9.98528 7.5 7.5C7.5 5.01472 9.51472 3 12 3C14.4853 3 16.5 5.01472 16.5 7.5Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>');
--_vaadin-icon-warn: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /></svg>');

Expand Down
8 changes: 8 additions & 0 deletions packages/upload/src/styles/vaadin-upload-base-styles.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/**
* @license
* Copyright (c) 2000 - 2025 Vaadin Ltd.
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
*/
import type { CSSResult } from 'lit';

export const uploadStyles: CSSResult;
60 changes: 60 additions & 0 deletions packages/upload/src/styles/vaadin-upload-base-styles.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/**
* @license
* Copyright (c) 2000 - 2025 Vaadin Ltd.
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
*/
import { css } from 'lit';

export const uploadStyles = css`
:host {
background: var(--vaadin-upload-background, transparent);
border: var(
--vaadin-upload-border,
var(--vaadin-upload-border-width, 1px) solid var(--vaadin-upload-border-color, var(--vaadin-border-color))
);
border-radius: var(--vaadin-upload-border-radius, var(--vaadin-radius-m));
box-sizing: border-box;
display: flex;
flex-direction: column;
gap: var(--vaadin-upload-gap, var(--vaadin-gap-container-block));
padding: var(--vaadin-upload-padding, var(--vaadin-padding));
position: relative;
}

:host([dragover-valid]) {
--vaadin-upload-background: var(--vaadin-background-container);
--vaadin-upload-border: 1px dashed var(--vaadin-color);
);
}

:host([hidden]) {
display: none !important;
}

[hidden] {
display: none !important;
}

[part='primary-buttons'] {
align-items: center;
display: flex;
gap: var(--vaadin-gap-container-inline);
}

[part='drop-label'] {
align-items: center;
color: var(--vaadin-upload-drop-label-color, var(--vaadin-color));
display: flex;
font-size: var(--vaadin-upload-drop-label-font-size, inherit);
font-weight: var(--vaadin-upload-drop-label-font-weight, inherit);
gap: var(--vaadin-upload-drop-label-gap, var(--vaadin-gap-container-inline));
line-height: var(--vaadin-upload-drop-label-line-height, inherit);
}

:host([nodrop]) {
--vaadin-upload-border: none;
--vaadin-upload-border-radius: 0;
--vaadin-upload-padding: 0;
}

`;
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/**
* @license
* Copyright (c) 2016 - 2025 Vaadin Ltd.
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
*/
import type { CSSResult } from 'lit';

export const uploadFileStyles: CSSResult;
143 changes: 143 additions & 0 deletions packages/upload/src/styles/vaadin-upload-file-base-styles.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
/**
* @license
* Copyright (c) 2016 - 2025 Vaadin Ltd.
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
*/
import { css } from 'lit';

export const uploadFileStyles = css`
:host {
display: flex;
flex-direction: column;
gap: var(--vaadin-upload-file-gap, var(--vaadin-gap-container-block));
padding: var(--vaadin-upload-file-padding, var(--vaadin-padding));
}

[hidden] {
display: none;
}

[part='row'] {
align-items: center;
display: flex;
justify-content: space-between;
}

[part='info'] {
display: flex;
gap: var(--vaadin-gap-container-inline);
overflow: hidden;
}

[part='done-icon']:not([hidden]),
[part='warning-icon']:not([hidden]) {
display: flex;
}

[part='done-icon']::before,
[part='warning-icon']::before {
content: '';
display: inline-block;
flex: none;
height: var(--vaadin-icon-size, 1lh);
width: var(--vaadin-icon-size, 1lh);
}

[part='done-icon']::before {
background: var(--vaadin-upload-file-done-color, currentColor);
mask-image: var(--_vaadin-icon-checkmark);
}

[part='warning-icon']::before {
background: var(--vaadin-upload-file-warning-color, currentColor);
mask-image: var(--_vaadin-icon-warn);
}

[part='done-icon'][hidden] + [part='warning-icon'][hidden] ~ [part='meta'] {
padding-inline-start: calc(var(--vaadin-icon-size, 1lh) + var(--vaadin-gap-container-inline));
}

[part='meta'] {
display: flex;
flex-direction: column;
overflow: hidden;
}

[part='name'] {
color: var(--vaadin-upload-file-name-color, var(--vaadin-color));
font-size: var(--vaadin-upload-file-name-font-size, inherit);
font-weight: var(--vaadin-upload-file-name-font-weight, inherit);
line-height: var(--vaadin-upload-file-name-line-height, inherit);
overflow: hidden;
text-overflow: ellipsis;
}

[part='status'] {
color: var(--vaadin-upload-file-status-color, var(--vaadin-color-subtle));
font-size: var(--vaadin-upload-file-status-font-size, inherit);
font-weight: var(--vaadin-upload-file-status-font-weight, inherit);
line-height: var(--vaadin-upload-file-status-line-height, inherit);
}

[part='error'] {
color: var(--vaadin-upload-file-error-color, var(--vaadin-color));
font-size: var(--vaadin-upload-file-error-font-size, inherit);
font-weight: var(--vaadin-upload-file-error-font-weight, inherit);
line-height: var(--vaadin-upload-file-error-line-height, inherit);
}

[part='commands'] {
display: flex;
}

button {
background: var(--vaadin-upload-file-button-background, transparent);
border: var(
--vaadin-upload-file-button-border,
var(--vaadin-upload-file-button-border-width, 1px) solid
var(--vaadin-upload-file-button-border-color, transparent)
);
border-radius: var(--vaadin-upload-file-button-border-radius, var(--vaadin-radius-m));
color: var(--vaadin-upload-file-button-text-color, var(--vaadin-color));
cursor: var(--vaadin-clickable-cursor);
flex-shrink: 0;
font-family: var(--vaadin-upload-file-button-font-family, inherit);
font-size: var(--vaadin-upload-file-button-font-size, inherit);
font-weight: var(--vaadin-upload-file-button-font-weight, 500);
height: var(--vaadin-upload-file-button-height, auto);
line-height: var(--vaadin-upload-file-button-line-height, inherit);
padding: var(--vaadin-upload-file-button-padding, var(--vaadin-padding-container));
}

[part='start-button']::before,
[part='retry-button']::before,
[part='remove-button']::before {
background: currentColor;
content: '';
display: block;
height: var(--vaadin-icon-size, 1lh);
width: var(--vaadin-icon-size, 1lh);
}

[part='start-button']::before {
mask-image: var(--_vaadin-icon-play);
}

[part='retry-button']::before {
mask-image: var(--_vaadin-icon-refresh);
}

[part='remove-button']::before {
mask-image: var(--_vaadin-icon-cross);
}

::slotted([slot='progress']) {
margin-inline-start: calc(var(--vaadin-icon-size, 1lh) + var(--vaadin-gap-container-inline));
width: auto;
}

:host([complete]) ::slotted([slot='progress']),
:host([error]) ::slotted([slot='progress']) {
display: none;
}
`;
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/**
* @license
* Copyright (c) 2000 - 2025 Vaadin Ltd.
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
*/
import type { CSSResult } from 'lit';

export const uploadFileListStyles: CSSResult;
30 changes: 30 additions & 0 deletions packages/upload/src/styles/vaadin-upload-file-list-base-styles.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/**
* @license
* Copyright (c) 2000 - 2025 Vaadin Ltd.
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
*/
import { css } from 'lit';

export const uploadFileListStyles = css`
:host {
display: block;
}

:host([hidden]) {
display: none !important;
}

[part='list'] {
list-style-type: none;
margin: 0;
padding: 0;
}

::slotted(li:not(:last-of-type)) {
border-bottom: var(
--vaadin-upload-file-list-border,
var(--vaadin-upload-file-list-border-width, 1px) solid
var(--vaadin-upload-file-list-border-color, var(--vaadin-border-color))
);
}
`;
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/**
* @license
* Copyright (c) 2000 - 2025 Vaadin Ltd.
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
*/
import type { CSSResult } from 'lit';

export const uploadIconStyles: CSSResult;
26 changes: 26 additions & 0 deletions packages/upload/src/styles/vaadin-upload-icon-base-styles.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/**
* @license
* Copyright (c) 2000 - 2025 Vaadin Ltd.
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
*/
import { css } from 'lit';

export const uploadIconStyles = css`
:host {
display: inline-flex;
}

:host::before {
background: var(--vaadin-upload-icon-color, currentColor);
content: '';
display: inline-block;
flex: none;
height: var(--vaadin-icon-size, 1lh);
mask-image: var(--_vaadin-icon-upload);
width: var(--vaadin-icon-size, 1lh);
}

:host([hidden]) {
display: none !important;
}
`;
13 changes: 3 additions & 10 deletions packages/upload/src/vaadin-upload-icon.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@
* Copyright (c) 2016 - 2025 Vaadin Ltd.
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
*/
import { css, html, LitElement } from 'lit';
import { html, LitElement } from 'lit';
import { defineCustomElement } from '@vaadin/component-base/src/define.js';
import { LumoInjectionMixin } from '@vaadin/vaadin-themable-mixin/lumo-injection-mixin.js';
import { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
import { uploadIconStyles } from './styles/vaadin-upload-icon-base-styles.js';

/**
* An element used internally by `<vaadin-upload>`. Not intended to be used separately.
Expand All @@ -21,15 +22,7 @@ class UploadIcon extends ThemableMixin(LumoInjectionMixin(LitElement)) {
}

static get styles() {
return css`
:host {
display: inline-block;
}

:host([hidden]) {
display: none !important;
}
`;
return uploadIconStyles;
}

static get lumoInjector() {
Expand Down