@vaadin/login 25.0.0-alpha9 → 25.0.0-beta2

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vaadin/login",
3
- "version": "25.0.0-alpha9",
3
+ "version": "25.0.0-beta2",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -21,9 +21,6 @@
21
21
  "type": "module",
22
22
  "files": [
23
23
  "src",
24
- "!src/styles/*-base-styles.d.ts",
25
- "!src/styles/*-base-styles.js",
26
- "theme",
27
24
  "vaadin-*.d.ts",
28
25
  "vaadin-*.js",
29
26
  "web-types.json",
@@ -37,26 +34,26 @@
37
34
  ],
38
35
  "dependencies": {
39
36
  "@open-wc/dedupe-mixin": "^1.3.0",
40
- "@vaadin/button": "25.0.0-alpha9",
41
- "@vaadin/component-base": "25.0.0-alpha9",
42
- "@vaadin/overlay": "25.0.0-alpha9",
43
- "@vaadin/password-field": "25.0.0-alpha9",
44
- "@vaadin/text-field": "25.0.0-alpha9",
45
- "@vaadin/vaadin-lumo-styles": "25.0.0-alpha9",
46
- "@vaadin/vaadin-themable-mixin": "25.0.0-alpha9",
37
+ "@vaadin/button": "25.0.0-beta2",
38
+ "@vaadin/component-base": "25.0.0-beta2",
39
+ "@vaadin/overlay": "25.0.0-beta2",
40
+ "@vaadin/password-field": "25.0.0-beta2",
41
+ "@vaadin/text-field": "25.0.0-beta2",
42
+ "@vaadin/vaadin-themable-mixin": "25.0.0-beta2",
47
43
  "lit": "^3.0.0"
48
44
  },
49
45
  "devDependencies": {
50
- "@vaadin/a11y-base": "25.0.0-alpha9",
51
- "@vaadin/chai-plugins": "25.0.0-alpha9",
52
- "@vaadin/checkbox": "25.0.0-alpha9",
53
- "@vaadin/test-runner-commands": "25.0.0-alpha9",
46
+ "@vaadin/a11y-base": "25.0.0-beta2",
47
+ "@vaadin/chai-plugins": "25.0.0-beta2",
48
+ "@vaadin/checkbox": "25.0.0-beta2",
49
+ "@vaadin/test-runner-commands": "25.0.0-beta2",
54
50
  "@vaadin/testing-helpers": "^2.0.0",
55
- "sinon": "^18.0.0"
51
+ "@vaadin/vaadin-lumo-styles": "25.0.0-beta2",
52
+ "sinon": "^21.0.0"
56
53
  },
57
54
  "web-types": [
58
55
  "web-types.json",
59
56
  "web-types.lit.json"
60
57
  ],
61
- "gitHead": "bbe4720721e0955ffc87a79b412bee38b1f0eb1e"
58
+ "gitHead": "e078f8371ae266f05c7ca1ec25686cc489c83f24"
62
59
  }
@@ -3,7 +3,7 @@
3
3
  * Copyright (c) 2018 - 2025 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
- import '@vaadin/component-base/src/style-props.js';
6
+ import '@vaadin/component-base/src/styles/style-props.js';
7
7
  import { css } from 'lit';
8
8
 
9
9
  export const loginFormWrapperStyles = css`
@@ -13,8 +13,8 @@ export const loginFormWrapperStyles = css`
13
13
  display: flex;
14
14
  box-sizing: border-box;
15
15
  flex-direction: column;
16
- gap: var(--vaadin-login-form-gap, var(--vaadin-gap-container-block));
17
- padding: var(--vaadin-login-form-padding, var(--vaadin-padding));
16
+ gap: var(--vaadin-login-form-gap, var(--vaadin-gap-l));
17
+ padding: var(--vaadin-login-form-padding, var(--vaadin-padding-l));
18
18
  max-width: 100%;
19
19
  width: var(--vaadin-login-form-width, 360px);
20
20
  }
@@ -26,11 +26,11 @@ export const loginFormWrapperStyles = css`
26
26
  ::slotted(form) {
27
27
  display: flex;
28
28
  flex-direction: column;
29
- gap: var(--vaadin-login-form-gap, var(--vaadin-gap-container-block));
29
+ gap: var(--vaadin-login-form-gap, var(--vaadin-gap-m));
30
30
  }
31
31
 
32
32
  ::slotted([slot='form-title']) {
33
- color: var(--vaadin-login-form-title-color, var(--vaadin-color));
33
+ color: var(--vaadin-login-form-title-color, var(--vaadin-text-color));
34
34
  font-size: var(--vaadin-login-form-title-font-size, 1.25rem);
35
35
  font-weight: var(--vaadin-login-form-title-font-weight, 600);
36
36
  line-height: var(--vaadin-login-form-title-line-height, inherit);
@@ -41,10 +41,10 @@ export const loginFormWrapperStyles = css`
41
41
  }
42
42
 
43
43
  [part='error-message'] {
44
- color: var(--vaadin-login-form-error-color, var(--vaadin-color));
44
+ color: var(--vaadin-login-form-error-color, var(--vaadin-text-color));
45
45
  font-size: var(--vaadin-login-form-error-font-size, inherit);
46
46
  font-weight: var(--vaadin-login-form-error-font-weight, 400);
47
- gap: var(--vaadin-login-form-error-gap, 0 var(--vaadin-gap-container-inline));
47
+ gap: var(--vaadin-login-form-error-gap, 0 var(--vaadin-gap-s));
48
48
  grid-template-columns: auto 1fr;
49
49
  line-height: var(--vaadin-login-form-error-line-height, inherit);
50
50
  }
@@ -55,7 +55,7 @@ export const loginFormWrapperStyles = css`
55
55
  display: inline-block;
56
56
  flex: none;
57
57
  height: var(--vaadin-icon-size, 1lh);
58
- mask-image: var(--_vaadin-icon-warn);
58
+ mask: var(--_vaadin-icon-warn) 50% / var(--vaadin-icon-visual-size, 100%) no-repeat;
59
59
  width: var(--vaadin-icon-size, 1lh);
60
60
  }
61
61
 
@@ -3,7 +3,7 @@
3
3
  * Copyright (c) 2018 - 2025 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
- import '@vaadin/component-base/src/style-props.js';
6
+ import '@vaadin/component-base/src/styles/style-props.js';
7
7
  import { css } from 'lit';
8
8
  import { overlayStyles } from '@vaadin/overlay/src/styles/vaadin-overlay-base-styles.js';
9
9
 
@@ -14,12 +14,9 @@ const loginOverlayWrapper = css`
14
14
  var(--vaadin-overlay-background, var(--vaadin-background-color))
15
15
  );
16
16
  border: var(--vaadin-login-overlay-border-width, var(--vaadin-overlay-border-width, 1px)) solid
17
- var(--vaadin-login-overlay-border-color, var(--vaadin-overlay-border-color, var(--vaadin-border-color)));
17
+ var(--vaadin-login-overlay-border-color, var(--vaadin-overlay-border-color, var(--vaadin-border-color-secondary)));
18
18
  border-radius: var(--vaadin-login-overlay-border-radius, var(--vaadin-radius-l));
19
- box-shadow: var(
20
- --vaadin-login-overlay-box-shadow,
21
- var(--vaadin-overlay-box-shadow, 0 8px 24px -4px rgba(0, 0, 0, 0.3))
22
- );
19
+ box-shadow: var(--vaadin-login-overlay-shadow, var(--vaadin-overlay-shadow, 0 8px 24px -4px rgba(0, 0, 0, 0.3)));
23
20
  }
24
21
 
25
22
  [part='card'] {
@@ -34,18 +31,18 @@ const loginOverlayWrapper = css`
34
31
  background: var(--vaadin-login-overlay-brand-background, var(--vaadin-background-container));
35
32
  display: flex;
36
33
  flex-direction: column;
37
- padding: var(--vaadin-login-overlay-brand-padding, var(--vaadin-padding));
34
+ padding: var(--vaadin-login-overlay-brand-padding, var(--vaadin-padding-l));
38
35
  }
39
36
 
40
37
  ::slotted([slot='title']) {
41
- color: var(--vaadin-login-overlay-title-color, var(--vaadin-color));
38
+ color: var(--vaadin-login-overlay-title-color, var(--vaadin-text-color));
42
39
  font-size: var(--vaadin-login-overlay-title-font-size, inherit);
43
40
  font-weight: var(--vaadin-login-overlay-title-font-weight, 600);
44
41
  line-height: var(--vaadin-login-overlay-title-line-height, inherit);
45
42
  }
46
43
 
47
44
  [part='description'] {
48
- color: var(--vaadin-login-overlay-description-color, var(--vaadin-color-subtle));
45
+ color: var(--vaadin-login-overlay-description-color, var(--vaadin-text-color-secondary));
49
46
  font-size: var(--vaadin-login-overlay-description-font-size, inherit);
50
47
  font-weight: var(--vaadin-login-overlay-description-font-weight, inherit);
51
48
  line-height: var(--vaadin-login-overlay-description-line-height, inherit);
@@ -8,7 +8,7 @@ import { defineCustomElement } from '@vaadin/component-base/src/define.js';
8
8
  import { PolylitMixin } from '@vaadin/component-base/src/polylit-mixin.js';
9
9
  import { LumoInjectionMixin } from '@vaadin/vaadin-themable-mixin/lumo-injection-mixin.js';
10
10
  import { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
11
- import { loginFormWrapperStyles } from './styles/vaadin-login-form-wrapper-core-styles.js';
11
+ import { loginFormWrapperStyles } from './styles/vaadin-login-form-wrapper-base-styles.js';
12
12
 
13
13
  /**
14
14
  * An element used internally by `<vaadin-login-form>`. Not intended to be used separately.
@@ -61,7 +61,7 @@ class LoginForm extends LoginFormMixin(ElementMixin(ThemableMixin(PolylitMixin(L
61
61
  return css`
62
62
  :host {
63
63
  display: block;
64
- max-width: max-content;
64
+ max-width: 100%;
65
65
  }
66
66
 
67
67
  :host([hidden]) {
@@ -69,7 +69,7 @@ export declare class LoginMixinClass {
69
69
  * and `header` sections, `header` can be added to override `title` and `description` properties
70
70
  * in `vaadin-login-overlay`):
71
71
  *
72
- * ```
72
+ * ```js
73
73
  * {
74
74
  * header: {
75
75
  * title: 'App name',
@@ -129,7 +129,7 @@ export const LoginMixin = (superClass) =>
129
129
  * and `header` sections, `header` can be added to override `title` and `description` properties
130
130
  * in `vaadin-login-overlay`):
131
131
  *
132
- * ```
132
+ * ```js
133
133
  * {
134
134
  * header: {
135
135
  * title: 'App name',
@@ -4,11 +4,10 @@
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
6
  import type { Constructor } from '@open-wc/dedupe-mixin';
7
- import type { OverlayClassMixinClass } from '@vaadin/component-base/src/overlay-class-mixin.js';
8
7
 
9
8
  export declare function LoginOverlayMixin<T extends Constructor<HTMLElement>>(
10
9
  base: T,
11
- ): Constructor<LoginOverlayMixinClass> & Constructor<OverlayClassMixinClass> & T;
10
+ ): Constructor<LoginOverlayMixinClass> & T;
12
11
 
13
12
  export declare class LoginOverlayMixinClass {
14
13
  /**
@@ -3,15 +3,13 @@
3
3
  * Copyright (c) 2018 - 2025 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
- import { OverlayClassMixin } from '@vaadin/component-base/src/overlay-class-mixin.js';
7
6
  import { TitleController } from './title-controller.js';
8
7
 
9
8
  /**
10
9
  * @polymerMixin
11
- * @mixes OverlayClassMixin
12
10
  */
13
11
  export const LoginOverlayMixin = (superClass) =>
14
- class LoginOverlayMixin extends OverlayClassMixin(superClass) {
12
+ class LoginOverlayMixin extends superClass {
15
13
  static get properties() {
16
14
  return {
17
15
  /**
@@ -51,6 +49,8 @@ export const LoginOverlayMixin = (superClass) =>
51
49
  super.firstUpdated();
52
50
 
53
51
  this.setAttribute('role', 'dialog');
52
+ this.setAttribute('aria-modal', 'true');
53
+ this.setAttribute('tabindex', '0');
54
54
 
55
55
  this.__titleController = new TitleController(this);
56
56
  this.addController(this.__titleController);
@@ -114,6 +114,11 @@ export const LoginOverlayMixin = (superClass) =>
114
114
  e.preventDefault();
115
115
  }
116
116
 
117
+ /** @private */
118
+ __handleOverlayClosed() {
119
+ this.dispatchEvent(new CustomEvent('closed'));
120
+ }
121
+
117
122
  /** @private */
118
123
  _openedChanged(opened, oldOpened) {
119
124
  if (oldOpened) {
@@ -127,4 +132,10 @@ export const LoginOverlayMixin = (superClass) =>
127
132
  document.body.style.pointerEvents = this.$.overlay._previousDocumentPointerEvents;
128
133
  }
129
134
  }
135
+
136
+ /**
137
+ * Fired when the overlay is closed.
138
+ *
139
+ * @event closed
140
+ */
130
141
  };
@@ -10,7 +10,7 @@ import { PolylitMixin } from '@vaadin/component-base/src/polylit-mixin.js';
10
10
  import { OverlayMixin } from '@vaadin/overlay/src/vaadin-overlay-mixin.js';
11
11
  import { LumoInjectionMixin } from '@vaadin/vaadin-themable-mixin/lumo-injection-mixin.js';
12
12
  import { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
13
- import { loginOverlayWrapperStyles } from './styles/vaadin-login-overlay-wrapper-core-styles.js';
13
+ import { loginOverlayWrapperStyles } from './styles/vaadin-login-overlay-wrapper-base-styles.js';
14
14
 
15
15
  /**
16
16
  * An element used internally by `<vaadin-login-overlay>`. Not intended to be used separately.
@@ -42,10 +42,11 @@ class LoginOverlayWrapper extends OverlayMixin(DirMixin(ThemableMixin(PolylitMix
42
42
  }
43
43
 
44
44
  /**
45
+ * Override method from OverlayFocusMixin to use owner as focus trap root
45
46
  * @protected
46
47
  * @override
47
48
  */
48
- get _modalRoot() {
49
+ get _focusTrapRoot() {
49
50
  return this.owner;
50
51
  }
51
52
 
@@ -53,7 +54,7 @@ class LoginOverlayWrapper extends OverlayMixin(DirMixin(ThemableMixin(PolylitMix
53
54
  render() {
54
55
  return html`
55
56
  <div id="backdrop" part="backdrop" ?hidden="${!this.withBackdrop}"></div>
56
- <div part="overlay" id="overlay" tabindex="0">
57
+ <div part="overlay" id="overlay">
57
58
  <div part="content" id="content">
58
59
  <section part="card">
59
60
  <div part="brand">
@@ -34,6 +34,11 @@ export type LoginOverlayLoginEvent = CustomEvent<{
34
34
  custom?: Record<string, unknown>;
35
35
  }>;
36
36
 
37
+ /**
38
+ * Fired when the overlay is closed.
39
+ */
40
+ export type LoginOverlayClosedEvent = CustomEvent;
41
+
37
42
  export interface LoginOverlayCustomEventMap {
38
43
  'description-changed': LoginOverlayDescriptionChangedEvent;
39
44
 
@@ -44,6 +49,8 @@ export interface LoginOverlayCustomEventMap {
44
49
  'forgot-password': Event;
45
50
 
46
51
  login: LoginOverlayLoginEvent;
52
+
53
+ closed: LoginOverlayClosedEvent;
47
54
  }
48
55
 
49
56
  export interface LoginOverlayEventMap extends HTMLElementEventMap, LoginOverlayCustomEventMap {}
@@ -81,6 +88,7 @@ export interface LoginOverlayEventMap extends HTMLElementEventMap, LoginOverlayC
81
88
  * @fires {CustomEvent} error-changed - Fired when the `error` property changes.
82
89
  * @fires {CustomEvent} forgot-password - Fired when user clicks on the "Forgot password" button.
83
90
  * @fires {CustomEvent} login - Fired when a user submits the login.
91
+ * @fires {CustomEvent} closed - Fired when the overlay is closed.
84
92
  */
85
93
  declare class LoginOverlay extends LoginFormMixin(LoginOverlayMixin(ElementMixin(ThemableMixin(HTMLElement)))) {
86
94
  addEventListener<K extends keyof LoginOverlayEventMap>(
@@ -52,6 +52,7 @@ import { LoginOverlayMixin } from './vaadin-login-overlay-mixin.js';
52
52
  * @fires {CustomEvent} error-changed - Fired when the `error` property changes.
53
53
  * @fires {CustomEvent} forgot-password - Fired when user clicks on the "Forgot password" button.
54
54
  * @fires {CustomEvent} login - Fired when a user submits the login.
55
+ * @fires {CustomEvent} closed - Fired when the overlay is closed.
55
56
  *
56
57
  * @customElement
57
58
  * @extends HTMLElement
@@ -67,13 +68,22 @@ class LoginOverlay extends LoginFormMixin(LoginOverlayMixin(ElementMixin(Themabl
67
68
 
68
69
  static get styles() {
69
70
  return css`
70
- :host {
71
- display: block;
71
+ :host([opened]),
72
+ :host([opening]),
73
+ :host([closing]) {
74
+ display: block !important;
75
+ position: absolute;
76
+ outline: none;
72
77
  }
73
78
 
79
+ :host,
74
80
  :host([hidden]) {
75
81
  display: none !important;
76
82
  }
83
+
84
+ :host(:focus-visible) ::part(overlay) {
85
+ outline: var(--vaadin-focus-ring-width) solid var(--vaadin-focus-ring-color);
86
+ }
77
87
  `;
78
88
  }
79
89
 
@@ -90,6 +100,7 @@ class LoginOverlay extends LoginFormMixin(LoginOverlayMixin(ElementMixin(Themabl
90
100
  theme="${ifDefined(this._theme)}"
91
101
  @vaadin-overlay-escape-press="${this._preventClosingLogin}"
92
102
  @vaadin-overlay-outside-click="${this._preventClosingLogin}"
103
+ @vaadin-overlay-closed="${this.__handleOverlayClosed}"
93
104
  @opened-changed="${this._onOpenedChanged}"
94
105
  exportparts="backdrop, overlay, content, card, brand, description, form-wrapper"
95
106
  >
@@ -1,2 +1,2 @@
1
- import './theme/lumo/vaadin-login-form.js';
1
+ import './src/vaadin-login-form.js';
2
2
  export * from './src/vaadin-login-form.js';
@@ -1,2 +1,2 @@
1
- import './theme/lumo/vaadin-login-overlay.js';
1
+ import './src/vaadin-login-overlay.js';
2
2
  export * from './src/vaadin-login-overlay.js';
package/web-types.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/web-types",
3
3
  "name": "@vaadin/login",
4
- "version": "25.0.0-alpha9",
4
+ "version": "25.0.0-beta2",
5
5
  "description-markup": "markdown",
6
6
  "contributions": {
7
7
  "html": {
@@ -83,7 +83,7 @@
83
83
  "properties": [
84
84
  {
85
85
  "name": "i18n",
86
- "description": "The object used to localize this component. To change the default\nlocalization, replace this with an object that provides all properties, or\njust the individual properties you want to change.\n\nThe object has the following JSON structure (by default it doesn't include `additionalInformation`\nand `header` sections, `header` can be added to override `title` and `description` properties\nin `vaadin-login-overlay`):\n\n```\n{\n header: {\n title: 'App name',\n description: 'Inspiring application description'\n },\n form: {\n title: 'Log in',\n username: 'Username',\n password: 'Password',\n submit: 'Log in',\n forgotPassword: 'Forgot password'\n },\n errorMessage: {\n title: 'Incorrect username or password',\n message: 'Check that you have entered the correct username and password and try again.',\n username: 'Username is required',\n password: 'Password is required'\n },\n additionalInformation: 'In case you need to provide some additional info for the user.'\n}\n```",
86
+ "description": "The object used to localize this component. To change the default\nlocalization, replace this with an object that provides all properties, or\njust the individual properties you want to change.\n\nThe object has the following JSON structure (by default it doesn't include `additionalInformation`\nand `header` sections, `header` can be added to override `title` and `description` properties\nin `vaadin-login-overlay`):\n\n```js\n{\n header: {\n title: 'App name',\n description: 'Inspiring application description'\n },\n form: {\n title: 'Log in',\n username: 'Username',\n password: 'Password',\n submit: 'Log in',\n forgotPassword: 'Forgot password'\n },\n errorMessage: {\n title: 'Incorrect username or password',\n message: 'Check that you have entered the correct username and password and try again.',\n username: 'Username is required',\n password: 'Password is required'\n },\n additionalInformation: 'In case you need to provide some additional info for the user.'\n}\n```",
87
87
  "value": {
88
88
  "type": [
89
89
  "LoginI18n"
@@ -229,17 +229,6 @@
229
229
  ]
230
230
  }
231
231
  },
232
- {
233
- "name": "overlay-class",
234
- "description": "A space-delimited list of CSS class names to set on the overlay element.\nThis property does not affect other CSS class names set manually via JS.\n\nNote, if the CSS class name was set with this property, clearing it will\nremove it from the overlay, even if the same class name was also added\nmanually, e.g. by using `classList.add()` in the `renderer` function.",
235
- "value": {
236
- "type": [
237
- "string",
238
- "null",
239
- "undefined"
240
- ]
241
- }
242
- },
243
232
  {
244
233
  "name": "description",
245
234
  "description": "Defines the application description",
@@ -283,7 +272,7 @@
283
272
  "properties": [
284
273
  {
285
274
  "name": "i18n",
286
- "description": "The object used to localize this component. To change the default\nlocalization, replace this with an object that provides all properties, or\njust the individual properties you want to change.\n\nThe object has the following JSON structure (by default it doesn't include `additionalInformation`\nand `header` sections, `header` can be added to override `title` and `description` properties\nin `vaadin-login-overlay`):\n\n```\n{\n header: {\n title: 'App name',\n description: 'Inspiring application description'\n },\n form: {\n title: 'Log in',\n username: 'Username',\n password: 'Password',\n submit: 'Log in',\n forgotPassword: 'Forgot password'\n },\n errorMessage: {\n title: 'Incorrect username or password',\n message: 'Check that you have entered the correct username and password and try again.',\n username: 'Username is required',\n password: 'Password is required'\n },\n additionalInformation: 'In case you need to provide some additional info for the user.'\n}\n```",
275
+ "description": "The object used to localize this component. To change the default\nlocalization, replace this with an object that provides all properties, or\njust the individual properties you want to change.\n\nThe object has the following JSON structure (by default it doesn't include `additionalInformation`\nand `header` sections, `header` can be added to override `title` and `description` properties\nin `vaadin-login-overlay`):\n\n```js\n{\n header: {\n title: 'App name',\n description: 'Inspiring application description'\n },\n form: {\n title: 'Log in',\n username: 'Username',\n password: 'Password',\n submit: 'Log in',\n forgotPassword: 'Forgot password'\n },\n errorMessage: {\n title: 'Incorrect username or password',\n message: 'Check that you have entered the correct username and password and try again.',\n username: 'Username is required',\n password: 'Password is required'\n },\n additionalInformation: 'In case you need to provide some additional info for the user.'\n}\n```",
287
276
  "value": {
288
277
  "type": [
289
278
  "LoginI18n"
@@ -347,17 +336,6 @@
347
336
  ]
348
337
  }
349
338
  },
350
- {
351
- "name": "overlayClass",
352
- "description": "A space-delimited list of CSS class names to set on the overlay element.\nThis property does not affect other CSS class names set manually via JS.\n\nNote, if the CSS class name was set with this property, clearing it will\nremove it from the overlay, even if the same class name was also added\nmanually, e.g. by using `classList.add()` in the `renderer` function.",
353
- "value": {
354
- "type": [
355
- "string",
356
- "null",
357
- "undefined"
358
- ]
359
- }
360
- },
361
339
  {
362
340
  "name": "description",
363
341
  "description": "Defines the application description",
@@ -395,6 +373,10 @@
395
373
  "name": "login",
396
374
  "description": "Fired when an user submits the login.\nThe event contains `username` and `password` values in the `detail` property."
397
375
  },
376
+ {
377
+ "name": "closed",
378
+ "description": "Fired when the overlay is closed."
379
+ },
398
380
  {
399
381
  "name": "disabled-changed",
400
382
  "description": "Fired when the `disabled` property changes."
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/web-types",
3
3
  "name": "@vaadin/login",
4
- "version": "25.0.0-alpha9",
4
+ "version": "25.0.0-beta2",
5
5
  "description-markup": "markdown",
6
6
  "framework": "lit",
7
7
  "framework-config": {
@@ -49,7 +49,7 @@
49
49
  },
50
50
  {
51
51
  "name": ".i18n",
52
- "description": "The object used to localize this component. To change the default\nlocalization, replace this with an object that provides all properties, or\njust the individual properties you want to change.\n\nThe object has the following JSON structure (by default it doesn't include `additionalInformation`\nand `header` sections, `header` can be added to override `title` and `description` properties\nin `vaadin-login-overlay`):\n\n```\n{\n header: {\n title: 'App name',\n description: 'Inspiring application description'\n },\n form: {\n title: 'Log in',\n username: 'Username',\n password: 'Password',\n submit: 'Log in',\n forgotPassword: 'Forgot password'\n },\n errorMessage: {\n title: 'Incorrect username or password',\n message: 'Check that you have entered the correct username and password and try again.',\n username: 'Username is required',\n password: 'Password is required'\n },\n additionalInformation: 'In case you need to provide some additional info for the user.'\n}\n```",
52
+ "description": "The object used to localize this component. To change the default\nlocalization, replace this with an object that provides all properties, or\njust the individual properties you want to change.\n\nThe object has the following JSON structure (by default it doesn't include `additionalInformation`\nand `header` sections, `header` can be added to override `title` and `description` properties\nin `vaadin-login-overlay`):\n\n```js\n{\n header: {\n title: 'App name',\n description: 'Inspiring application description'\n },\n form: {\n title: 'Log in',\n username: 'Username',\n password: 'Password',\n submit: 'Log in',\n forgotPassword: 'Forgot password'\n },\n errorMessage: {\n title: 'Incorrect username or password',\n message: 'Check that you have entered the correct username and password and try again.',\n username: 'Username is required',\n password: 'Password is required'\n },\n additionalInformation: 'In case you need to provide some additional info for the user.'\n}\n```",
53
53
  "value": {
54
54
  "kind": "expression"
55
55
  }
@@ -140,7 +140,7 @@
140
140
  },
141
141
  {
142
142
  "name": ".i18n",
143
- "description": "The object used to localize this component. To change the default\nlocalization, replace this with an object that provides all properties, or\njust the individual properties you want to change.\n\nThe object has the following JSON structure (by default it doesn't include `additionalInformation`\nand `header` sections, `header` can be added to override `title` and `description` properties\nin `vaadin-login-overlay`):\n\n```\n{\n header: {\n title: 'App name',\n description: 'Inspiring application description'\n },\n form: {\n title: 'Log in',\n username: 'Username',\n password: 'Password',\n submit: 'Log in',\n forgotPassword: 'Forgot password'\n },\n errorMessage: {\n title: 'Incorrect username or password',\n message: 'Check that you have entered the correct username and password and try again.',\n username: 'Username is required',\n password: 'Password is required'\n },\n additionalInformation: 'In case you need to provide some additional info for the user.'\n}\n```",
143
+ "description": "The object used to localize this component. To change the default\nlocalization, replace this with an object that provides all properties, or\njust the individual properties you want to change.\n\nThe object has the following JSON structure (by default it doesn't include `additionalInformation`\nand `header` sections, `header` can be added to override `title` and `description` properties\nin `vaadin-login-overlay`):\n\n```js\n{\n header: {\n title: 'App name',\n description: 'Inspiring application description'\n },\n form: {\n title: 'Log in',\n username: 'Username',\n password: 'Password',\n submit: 'Log in',\n forgotPassword: 'Forgot password'\n },\n errorMessage: {\n title: 'Incorrect username or password',\n message: 'Check that you have entered the correct username and password and try again.',\n username: 'Username is required',\n password: 'Password is required'\n },\n additionalInformation: 'In case you need to provide some additional info for the user.'\n}\n```",
144
144
  "value": {
145
145
  "kind": "expression"
146
146
  }
@@ -159,13 +159,6 @@
159
159
  "kind": "expression"
160
160
  }
161
161
  },
162
- {
163
- "name": ".overlayClass",
164
- "description": "A space-delimited list of CSS class names to set on the overlay element.\nThis property does not affect other CSS class names set manually via JS.\n\nNote, if the CSS class name was set with this property, clearing it will\nremove it from the overlay, even if the same class name was also added\nmanually, e.g. by using `classList.add()` in the `renderer` function.",
165
- "value": {
166
- "kind": "expression"
167
- }
168
- },
169
162
  {
170
163
  "name": ".description",
171
164
  "description": "Defines the application description",
@@ -194,6 +187,13 @@
194
187
  "kind": "expression"
195
188
  }
196
189
  },
190
+ {
191
+ "name": "@closed",
192
+ "description": "Fired when the overlay is closed.",
193
+ "value": {
194
+ "kind": "expression"
195
+ }
196
+ },
197
197
  {
198
198
  "name": "@disabled-changed",
199
199
  "description": "Fired when the `disabled` property changes.",
@@ -1,8 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright (c) 2018 - 2025 Vaadin Ltd.
4
- * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
- */
6
- import type { CSSResult } from 'lit';
7
-
8
- export const loginFormWrapperStyles: CSSResult;
@@ -1,31 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright (c) 2018 - 2025 Vaadin Ltd.
4
- * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
- */
6
- import { css } from 'lit';
7
-
8
- export const loginFormWrapperStyles = css`
9
- :host {
10
- display: flex;
11
- flex-direction: column;
12
- box-sizing: border-box;
13
- overflow: hidden;
14
- }
15
-
16
- :host([hidden]) {
17
- display: none !important;
18
- }
19
-
20
- ::slotted([slot='form-title']) {
21
- margin: 0;
22
- }
23
-
24
- [part='error-message'] {
25
- position: relative;
26
- }
27
-
28
- strong {
29
- font-weight: 600;
30
- }
31
- `;
@@ -1,8 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright (c) 2018 - 2025 Vaadin Ltd.
4
- * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
- */
6
- import type { CSSResult } from 'lit';
7
-
8
- export const loginOverlayWrapperStyles: CSSResult;
@@ -1,38 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright (c) 2018 - 2025 Vaadin Ltd.
4
- * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
- */
6
- import { css } from 'lit';
7
- import { overlayStyles } from '@vaadin/overlay/src/styles/vaadin-overlay-core-styles.js';
8
-
9
- const loginOverlayWrapper = css`
10
- [part='overlay'] {
11
- outline: none;
12
- }
13
-
14
- [part='card'] {
15
- max-width: 100%;
16
- box-sizing: border-box;
17
- overflow: hidden;
18
- display: flex;
19
- flex-direction: column;
20
- }
21
-
22
- [part='brand'] {
23
- box-sizing: border-box;
24
- overflow: hidden;
25
- flex-grow: 1;
26
- flex-shrink: 0;
27
- display: flex;
28
- flex-direction: column;
29
- justify-content: flex-end;
30
- }
31
-
32
- ::slotted([slot='title']) {
33
- color: inherit;
34
- margin: 0;
35
- }
36
- `;
37
-
38
- export const loginOverlayWrapperStyles = [overlayStyles, loginOverlayWrapper];
@@ -1,4 +0,0 @@
1
- import '@vaadin/vaadin-lumo-styles/color.js';
2
- import '@vaadin/vaadin-lumo-styles/sizing.js';
3
- import '@vaadin/vaadin-lumo-styles/spacing.js';
4
- import '@vaadin/vaadin-lumo-styles/typography.js';
@@ -1,98 +0,0 @@
1
- import '@vaadin/vaadin-lumo-styles/color.js';
2
- import '@vaadin/vaadin-lumo-styles/sizing.js';
3
- import '@vaadin/vaadin-lumo-styles/spacing.js';
4
- import '@vaadin/vaadin-lumo-styles/typography.js';
5
- import { css, registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
6
-
7
- const loginFormWrapper = css`
8
- :host {
9
- width: calc(var(--lumo-size-m) * 10);
10
- padding: var(--lumo-space-l);
11
- max-width: 100%;
12
- background: var(--lumo-base-color) linear-gradient(var(--lumo-tint-5pct), var(--lumo-tint-5pct));
13
- }
14
-
15
- ::slotted(form) {
16
- display: flex;
17
- flex-direction: column;
18
- }
19
-
20
- ::slotted([slot='form-title']) {
21
- margin-top: calc(var(--lumo-font-size-xxxl) - var(--lumo-font-size-xxl));
22
- color: var(--lumo-header-text-color);
23
- font-size: var(--lumo-font-size-xxl);
24
- font-weight: 600;
25
- line-height: var(--lumo-line-height-xs);
26
- }
27
-
28
- ::slotted([slot='submit']) {
29
- margin-top: var(--lumo-space-l);
30
- margin-bottom: var(--lumo-space-s);
31
- }
32
-
33
- ::slotted([slot='forgot-password']) {
34
- margin: var(--lumo-space-s) auto;
35
- }
36
-
37
- [part='error-message'] {
38
- background-color: var(--lumo-error-color-10pct);
39
- padding: var(--lumo-space-m);
40
- border-radius: var(--lumo-border-radius-m);
41
- margin-top: var(--lumo-space-m);
42
- margin-bottom: var(--lumo-space-s);
43
- color: var(--lumo-error-text-color);
44
- }
45
-
46
- :host(:not([dir='rtl'])) [part='error-message'] {
47
- padding-left: var(--lumo-size-m);
48
- }
49
-
50
- :host([dir='rtl']) [part='error-message'] {
51
- padding-right: var(--lumo-size-m);
52
- }
53
-
54
- [part='error-message']::before {
55
- content: var(--lumo-icons-error);
56
- font-family: lumo-icons;
57
- font-size: var(--lumo-icon-size-m);
58
- position: absolute;
59
- width: var(--lumo-size-m);
60
- height: 1em;
61
- line-height: 1;
62
- text-align: center;
63
- }
64
-
65
- :host(:not([dir='rtl'])) [part='error-message']::before {
66
- /* Visual centering */
67
- margin-left: calc(var(--lumo-size-m) * -0.95);
68
- }
69
-
70
- :host([dir='rtl']) [part='error-message']::before {
71
- /* Visual centering */
72
- margin-right: calc(var(--lumo-size-m) * -0.95);
73
- }
74
-
75
- [part='error-message-title'] {
76
- display: block;
77
- margin: 0 0 0.25em;
78
- color: inherit;
79
- line-height: var(--lumo-line-height-xs);
80
- }
81
-
82
- [part='error-message-description'] {
83
- font-size: var(--lumo-font-size-s);
84
- line-height: var(--lumo-line-height-s);
85
- margin: 0;
86
- opacity: 0.9;
87
- }
88
-
89
- [part='footer'] {
90
- font-size: var(--lumo-font-size-xs);
91
- line-height: var(--lumo-line-height-s);
92
- color: var(--lumo-secondary-text-color);
93
- }
94
- `;
95
-
96
- registerStyles('vaadin-login-form-wrapper', loginFormWrapper, {
97
- moduleId: 'lumo-login-form-wrapper',
98
- });
@@ -1,5 +0,0 @@
1
- import '@vaadin/button/theme/lumo/vaadin-button.js';
2
- import '@vaadin/text-field/theme/lumo/vaadin-text-field.js';
3
- import '@vaadin/password-field/theme/lumo/vaadin-password-field.js';
4
- import './vaadin-login-form-wrapper-styles.js';
5
- import '../../src/vaadin-login-form.js';
@@ -1,5 +0,0 @@
1
- import '@vaadin/button/theme/lumo/vaadin-button.js';
2
- import '@vaadin/text-field/theme/lumo/vaadin-text-field.js';
3
- import '@vaadin/password-field/theme/lumo/vaadin-password-field.js';
4
- import './vaadin-login-form-wrapper-styles.js';
5
- import '../../src/vaadin-login-form.js';
@@ -1,3 +0,0 @@
1
- import '@vaadin/vaadin-lumo-styles/color.js';
2
- import '@vaadin/vaadin-lumo-styles/spacing.js';
3
- import '@vaadin/vaadin-lumo-styles/typography.js';
@@ -1,173 +0,0 @@
1
- import '@vaadin/vaadin-lumo-styles/color.js';
2
- import '@vaadin/vaadin-lumo-styles/spacing.js';
3
- import '@vaadin/vaadin-lumo-styles/typography.js';
4
- import { overlay } from '@vaadin/vaadin-lumo-styles/mixins/overlay.js';
5
- import { css, registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
6
-
7
- const loginOverlayWrapper = css`
8
- :host {
9
- inset: 0;
10
- }
11
-
12
- [part='backdrop'] {
13
- background: var(--lumo-base-color) linear-gradient(var(--lumo-shade-5pct), var(--lumo-shade-5pct));
14
- }
15
-
16
- [part='overlay'] {
17
- background: none;
18
- border-radius: 0;
19
- box-shadow: none;
20
- width: 100%;
21
- height: 100%;
22
- }
23
-
24
- [part='brand'] {
25
- padding: var(--lumo-space-l) var(--lumo-space-xl) var(--lumo-space-l) var(--lumo-space-l);
26
- background-color: var(--lumo-primary-color);
27
- color: var(--lumo-primary-contrast-color);
28
- min-height: calc(var(--lumo-size-m) * 5);
29
- }
30
-
31
- ::slotted([slot='title']) {
32
- font-size: var(--lumo-font-size-xxxl);
33
- font-weight: 600;
34
- line-height: var(--lumo-line-height-xs);
35
- }
36
-
37
- [part='description'] {
38
- line-height: var(--lumo-line-height-s);
39
- color: var(--lumo-tint-70pct);
40
- margin: 0.5em 0 0;
41
- }
42
-
43
- [part='content'] {
44
- height: 100%;
45
- display: flex;
46
- align-items: center;
47
- justify-content: center;
48
- padding: 0;
49
- }
50
-
51
- [part='card'] {
52
- width: calc(var(--lumo-size-m) * 10);
53
- background: var(--lumo-base-color) linear-gradient(var(--lumo-tint-5pct), var(--lumo-tint-5pct));
54
- border-radius: var(--lumo-border-radius-l);
55
- box-shadow: var(--lumo-box-shadow-s);
56
- margin: var(--lumo-space-s);
57
- height: auto;
58
- }
59
-
60
- ::slotted(vaadin-login-form-wrapper) {
61
- min-height: 100%;
62
- max-width: 100%;
63
- }
64
-
65
- /* Small screen */
66
- @media only screen and (max-width: 500px) {
67
- [part='overlay'],
68
- [part='content'] {
69
- height: 100%;
70
- }
71
-
72
- [part='content'] {
73
- min-height: 100%;
74
- background: var(--lumo-base-color);
75
- align-items: flex-start;
76
- }
77
-
78
- [part='card'],
79
- [part='overlay'] {
80
- width: 100%;
81
- border-radius: 0;
82
- box-shadow: none;
83
- margin: 0;
84
- }
85
-
86
- /* RTL styles */
87
- :host([dir='rtl']) [part='brand'] {
88
- padding: var(--lumo-space-l) var(--lumo-space-l) var(--lumo-space-l) var(--lumo-space-xl);
89
- }
90
- }
91
-
92
- /* Landscape small screen */
93
- @media only screen and (max-height: 600px) and (min-width: 600px) and (orientation: landscape) {
94
- [part='card'] {
95
- flex-direction: row;
96
- align-items: stretch;
97
- max-width: calc(var(--lumo-size-m) * 16);
98
- width: 100%;
99
- }
100
-
101
- [part='brand'],
102
- [part='form-wrapper'] {
103
- flex: auto;
104
- flex-basis: 0;
105
- box-sizing: border-box;
106
- }
107
-
108
- [part='brand'] {
109
- justify-content: flex-start;
110
- }
111
-
112
- [part='form-wrapper'] {
113
- padding: var(--lumo-space-l);
114
- overflow: auto;
115
- }
116
-
117
- ::slotted(vaadin-login-form-wrapper) {
118
- flex: 1;
119
- padding: 2px;
120
- }
121
- }
122
-
123
- /* Landscape really small screen */
124
- @media only screen and (max-height: 500px) and (min-width: 600px) and (orientation: landscape),
125
- only screen and (max-width: 600px) and (min-width: 600px) and (orientation: landscape) {
126
- [part='content'] {
127
- height: 100vh;
128
- }
129
-
130
- [part='card'] {
131
- margin: 0;
132
- width: 100%;
133
- max-width: none;
134
- height: 100%;
135
- flex: auto;
136
- border-radius: 0;
137
- box-shadow: none;
138
- }
139
-
140
- [part='form-wrapper'] {
141
- height: 100%;
142
- overflow: auto;
143
- }
144
- }
145
-
146
- /* Handle iPhone X notch */
147
- @media only screen and (device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) {
148
- [part='card'] {
149
- padding-right: env(safe-area-inset-right);
150
- padding-left: env(safe-area-inset-left);
151
- }
152
-
153
- [part='brand'] {
154
- margin-left: calc(env(safe-area-inset-left) * -1);
155
- padding-left: calc(var(--lumo-space-l) + env(safe-area-inset-left));
156
- }
157
-
158
- /* RTL styles */
159
- :host([dir='rtl']) [part='card'] {
160
- padding-left: env(safe-area-inset-right);
161
- padding-right: env(safe-area-inset-left);
162
- }
163
-
164
- :host([dir='rtl']) [part='brand'] {
165
- margin-right: calc(env(safe-area-inset-left) * -1);
166
- padding-right: calc(var(--lumo-space-l) + env(safe-area-inset-left));
167
- }
168
- }
169
- `;
170
-
171
- registerStyles('vaadin-login-overlay-wrapper', [overlay, loginOverlayWrapper], {
172
- moduleId: 'lumo-login-overlay-wrapper',
173
- });
@@ -1,6 +0,0 @@
1
- import '@vaadin/button/theme/lumo/vaadin-button.js';
2
- import '@vaadin/text-field/theme/lumo/vaadin-text-field.js';
3
- import '@vaadin/password-field/theme/lumo/vaadin-password-field.js';
4
- import './vaadin-login-form-wrapper-styles.js';
5
- import './vaadin-login-overlay-styles.js';
6
- import '../../src/vaadin-login-overlay.js';
@@ -1,6 +0,0 @@
1
- import '@vaadin/button/theme/lumo/vaadin-button.js';
2
- import '@vaadin/text-field/theme/lumo/vaadin-text-field.js';
3
- import '@vaadin/password-field/theme/lumo/vaadin-password-field.js';
4
- import './vaadin-login-form-wrapper-styles.js';
5
- import './vaadin-login-overlay-styles.js';
6
- import '../../src/vaadin-login-overlay.js';