@vaadin/form-layout 24.6.5 → 24.7.0-alpha10

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,14 +1,16 @@
1
1
  /**
2
2
  * @license
3
- * Copyright (c) 2017 - 2024 Vaadin Ltd.
3
+ * Copyright (c) 2017 - 2025 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
6
  import { html, PolymerElement } from '@polymer/polymer/polymer-element.js';
7
- import { isElementHidden } from '@vaadin/a11y-base/src/focus-utils.js';
8
7
  import { defineCustomElement } from '@vaadin/component-base/src/define.js';
9
8
  import { ElementMixin } from '@vaadin/component-base/src/element-mixin.js';
10
- import { ResizeMixin } from '@vaadin/component-base/src/resize-mixin.js';
11
- import { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
9
+ import { registerStyles, ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
10
+ import { FormLayoutMixin } from './vaadin-form-layout-mixin.js';
11
+ import { formLayoutStyles } from './vaadin-form-layout-styles.js';
12
+
13
+ registerStyles('vaadin-form-layout', formLayoutStyles, { moduleId: 'vaadin-form-layout-styles' });
12
14
 
13
15
  /**
14
16
  * `<vaadin-form-layout>` is a Web Component providing configurable responsive
@@ -99,470 +101,28 @@ import { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mix
99
101
  * Custom CSS property | Description | Default
100
102
  * ---|---|---
101
103
  * `--vaadin-form-layout-column-spacing` | Length of the spacing between columns | `2em`
104
+ * `--vaadin-form-layout-row-spacing` | Length of the spacing between rows | `1em`
105
+ * `--vaadin-form-layout-label-width` | Width of the label when labels are displayed aside | `8em`
106
+ * `--vaadin-form-layout-label-spacing` | Length of the spacing between the label and the input when labels are displayed aside | `1em`
102
107
  *
103
108
  * @customElement
104
109
  * @extends HTMLElement
110
+ * @mixes FormLayoutMixin
105
111
  * @mixes ElementMixin
106
112
  * @mixes ThemableMixin
107
- * @mixes ResizeMixin
108
113
  */
109
- class FormLayout extends ResizeMixin(ElementMixin(ThemableMixin(PolymerElement))) {
114
+ class FormLayout extends FormLayoutMixin(ThemableMixin(ElementMixin(PolymerElement))) {
115
+ static get is() {
116
+ return 'vaadin-form-layout';
117
+ }
118
+
110
119
  static get template() {
111
120
  return html`
112
- <style>
113
- :host {
114
- display: block;
115
- max-width: 100%;
116
- animation: 1ms vaadin-form-layout-appear;
117
- /* CSS API for host */
118
- --vaadin-form-item-label-width: 8em;
119
- --vaadin-form-item-label-spacing: 1em;
120
- --vaadin-form-item-row-spacing: 1em;
121
- --vaadin-form-layout-column-spacing: 2em; /* (default) */
122
- align-self: stretch;
123
- }
124
-
125
- @keyframes vaadin-form-layout-appear {
126
- to {
127
- opacity: 1 !important; /* stylelint-disable-line keyframe-declaration-no-important */
128
- }
129
- }
130
-
131
- :host([hidden]) {
132
- display: none !important;
133
- }
134
-
135
- #layout {
136
- display: flex;
137
-
138
- align-items: baseline; /* default \`stretch\` is not appropriate */
139
-
140
- flex-wrap: wrap; /* the items should wrap */
141
- }
142
-
143
- #layout ::slotted(*) {
144
- /* Items should neither grow nor shrink. */
145
- flex-grow: 0;
146
- flex-shrink: 0;
147
-
148
- /* Margins make spacing between the columns */
149
- margin-left: calc(0.5 * var(--vaadin-form-layout-column-spacing));
150
- margin-right: calc(0.5 * var(--vaadin-form-layout-column-spacing));
151
- }
152
-
153
- #layout ::slotted(br) {
154
- display: none;
155
- }
156
- </style>
157
121
  <div id="layout">
158
122
  <slot id="slot"></slot>
159
123
  </div>
160
124
  `;
161
125
  }
162
-
163
- static get is() {
164
- return 'vaadin-form-layout';
165
- }
166
-
167
- static get properties() {
168
- return {
169
- /**
170
- * @typedef FormLayoutResponsiveStep
171
- * @type {object}
172
- * @property {string} minWidth - The threshold value for this step in CSS length units.
173
- * @property {number} columns - Number of columns. Only natural numbers are valid.
174
- * @property {string} labelsPosition - Labels position option, valid values: `"aside"` (default), `"top"`.
175
- */
176
-
177
- /**
178
- * Allows specifying a responsive behavior with the number of columns
179
- * and the label position depending on the layout width.
180
- *
181
- * Format: array of objects, each object defines one responsive step
182
- * with `minWidth` CSS length, `columns` number, and optional
183
- * `labelsPosition` string of `"aside"` or `"top"`. At least one item is required.
184
- *
185
- * #### Examples
186
- *
187
- * ```javascript
188
- * formLayout.responsiveSteps = [{columns: 1}];
189
- * // The layout is always a single column, labels aside.
190
- * ```
191
- *
192
- * ```javascript
193
- * formLayout.responsiveSteps = [
194
- * {minWidth: 0, columns: 1},
195
- * {minWidth: '40em', columns: 2}
196
- * ];
197
- * // Sets two responsive steps:
198
- * // 1. When the layout width is < 40em, one column, labels aside.
199
- * // 2. Width >= 40em, two columns, labels aside.
200
- * ```
201
- *
202
- * ```javascript
203
- * formLayout.responsiveSteps = [
204
- * {minWidth: 0, columns: 1, labelsPosition: 'top'},
205
- * {minWidth: '20em', columns: 1},
206
- * {minWidth: '40em', columns: 2}
207
- * ];
208
- * // Default value. Three responsive steps:
209
- * // 1. Width < 20em, one column, labels on top.
210
- * // 2. 20em <= width < 40em, one column, labels aside.
211
- * // 3. Width >= 40em, two columns, labels aside.
212
- * ```
213
- *
214
- * @type {!Array<!FormLayoutResponsiveStep>}
215
- */
216
- responsiveSteps: {
217
- type: Array,
218
- value() {
219
- return [
220
- { minWidth: 0, columns: 1, labelsPosition: 'top' },
221
- { minWidth: '20em', columns: 1 },
222
- { minWidth: '40em', columns: 2 },
223
- ];
224
- },
225
- observer: '_responsiveStepsChanged',
226
- },
227
-
228
- /**
229
- * Current number of columns in the layout
230
- * @private
231
- */
232
- _columnCount: {
233
- type: Number,
234
- },
235
-
236
- /**
237
- * Indicates that labels are on top
238
- * @private
239
- */
240
- _labelsOnTop: {
241
- type: Boolean,
242
- },
243
- };
244
- }
245
-
246
- static get observers() {
247
- return ['_invokeUpdateLayout(_columnCount, _labelsOnTop)'];
248
- }
249
-
250
- /** @protected */
251
- ready() {
252
- // Here we create and attach a style element that we use for validating
253
- // CSS values in `responsiveSteps`. We can't add this to the `<template>`,
254
- // because Polymer will throw it away. We need to create this before
255
- // `super.ready()`, because `super.ready()` invokes property observers,
256
- // and the observer for `responsiveSteps` does CSS value validation.
257
- this._styleElement = document.createElement('style');
258
- this.appendChild(this._styleElement);
259
- // Ensure there is a child text node in the style element
260
- this._styleElement.textContent = ' ';
261
-
262
- super.ready();
263
-
264
- this.addEventListener('animationend', this.__onAnimationEnd);
265
- }
266
-
267
- /** @protected */
268
- connectedCallback() {
269
- super.connectedCallback();
270
-
271
- requestAnimationFrame(() => this._selectResponsiveStep());
272
- requestAnimationFrame(() => this._updateLayout());
273
-
274
- this._observeChildrenColspanChange();
275
- }
276
-
277
- /** @protected */
278
- disconnectedCallback() {
279
- super.disconnectedCallback();
280
-
281
- this.__mutationObserver.disconnect();
282
- this.__childObserver.disconnect();
283
- }
284
-
285
- /** @private */
286
- _observeChildrenColspanChange() {
287
- // Observe changes in form items' `colspan` attribute and update styles
288
- const mutationObserverConfig = { attributes: true };
289
-
290
- this.__mutationObserver = new MutationObserver((mutationRecord) => {
291
- mutationRecord.forEach((mutation) => {
292
- if (
293
- mutation.type === 'attributes' &&
294
- (mutation.attributeName === 'colspan' ||
295
- mutation.attributeName === 'data-colspan' ||
296
- mutation.attributeName === 'hidden')
297
- ) {
298
- this._updateLayout();
299
- }
300
- });
301
- });
302
-
303
- // Observe changes to initial children
304
- [...this.children].forEach((child) => {
305
- this.__mutationObserver.observe(child, mutationObserverConfig);
306
- });
307
-
308
- // Observe changes to lazily added nodes
309
- this.__childObserver = new MutationObserver((mutations) => {
310
- const addedNodes = [];
311
- const removedNodes = [];
312
-
313
- mutations.forEach((mutation) => {
314
- addedNodes.push(...this._getObservableNodes(mutation.addedNodes));
315
- removedNodes.push(...this._getObservableNodes(mutation.removedNodes));
316
- });
317
-
318
- addedNodes.forEach((child) => {
319
- this.__mutationObserver.observe(child, mutationObserverConfig);
320
- });
321
-
322
- if (addedNodes.length > 0 || removedNodes.length > 0) {
323
- this._updateLayout();
324
- }
325
- });
326
-
327
- this.__childObserver.observe(this, { childList: true });
328
- }
329
-
330
- /** @private */
331
- _getObservableNodes(nodeList) {
332
- const ignore = ['template', 'style', 'dom-repeat', 'dom-if'];
333
- return Array.from(nodeList).filter(
334
- (node) => node.nodeType === Node.ELEMENT_NODE && ignore.indexOf(node.localName.toLowerCase()) === -1,
335
- );
336
- }
337
-
338
- /** @private */
339
- _naturalNumberOrOne(n) {
340
- if (typeof n === 'number' && n >= 1 && n < Infinity) {
341
- return Math.floor(n);
342
- }
343
- return 1;
344
- }
345
-
346
- /** @private */
347
- _isValidCSSLength(value) {
348
- // Let us choose a CSS property for validating CSS <length> values:
349
- // - `border-spacing` accepts `<length> | inherit`, it's the best! But
350
- // it does not disallow invalid values at all in MSIE :-(
351
- // - `letter-spacing` and `word-spacing` accept
352
- // `<length> | normal | inherit`, and disallows everything else, like
353
- // `<percentage>`, `auto` and such, good enough.
354
- // - `word-spacing` is used since its shorter.
355
-
356
- // Disallow known keywords allowed as the `word-spacing` value
357
- if (value === 'inherit' || value === 'normal') {
358
- return false;
359
- }
360
-
361
- // Use the value in a stylesheet and check the parsed value. Invalid
362
- // input value results in empty parsed value.
363
- this._styleElement.firstChild.nodeValue = `#styleElement { word-spacing: ${value}; }`;
364
-
365
- if (!this._styleElement.sheet) {
366
- // Stylesheet is not ready, probably not attached to the document yet.
367
- return true;
368
- }
369
-
370
- // Safari 9 sets invalid CSS rules' value to `null`
371
- return ['', null].indexOf(this._styleElement.sheet.cssRules[0].style.getPropertyValue('word-spacing')) < 0;
372
- }
373
-
374
- /** @private */
375
- _responsiveStepsChanged(responsiveSteps, oldResponsiveSteps) {
376
- try {
377
- if (!Array.isArray(responsiveSteps)) {
378
- throw new Error('Invalid "responsiveSteps" type, an Array is required.');
379
- }
380
-
381
- if (responsiveSteps.length < 1) {
382
- throw new Error('Invalid empty "responsiveSteps" array, at least one item is required.');
383
- }
384
-
385
- responsiveSteps.forEach((step) => {
386
- if (this._naturalNumberOrOne(step.columns) !== step.columns) {
387
- throw new Error(`Invalid 'columns' value of ${step.columns}, a natural number is required.`);
388
- }
389
-
390
- if (step.minWidth !== undefined && !this._isValidCSSLength(step.minWidth)) {
391
- throw new Error(`Invalid 'minWidth' value of ${step.minWidth}, a valid CSS length required.`);
392
- }
393
-
394
- if (step.labelsPosition !== undefined && ['aside', 'top'].indexOf(step.labelsPosition) === -1) {
395
- throw new Error(
396
- `Invalid 'labelsPosition' value of ${step.labelsPosition}, 'aside' or 'top' string is required.`,
397
- );
398
- }
399
- });
400
- } catch (e) {
401
- if (oldResponsiveSteps && oldResponsiveSteps !== responsiveSteps) {
402
- console.warn(`${e.message} Using previously set 'responsiveSteps' instead.`);
403
- this.responsiveSteps = oldResponsiveSteps;
404
- } else {
405
- console.warn(`${e.message} Using default 'responsiveSteps' instead.`);
406
- this.responsiveSteps = [
407
- { minWidth: 0, columns: 1, labelsPosition: 'top' },
408
- { minWidth: '20em', columns: 1 },
409
- { minWidth: '40em', columns: 2 },
410
- ];
411
- }
412
- }
413
-
414
- this._selectResponsiveStep();
415
- }
416
-
417
- /** @private */
418
- __onAnimationEnd(e) {
419
- if (e.animationName.indexOf('vaadin-form-layout-appear') === 0) {
420
- this._selectResponsiveStep();
421
- }
422
- }
423
-
424
- /** @private */
425
- _selectResponsiveStep() {
426
- // Iterate through responsiveSteps and choose the step
427
- let selectedStep;
428
- const tmpStyleProp = 'background-position';
429
- this.responsiveSteps.forEach((step) => {
430
- // Convert minWidth to px units for comparison
431
- this.$.layout.style.setProperty(tmpStyleProp, step.minWidth);
432
- const stepMinWidthPx = parseFloat(getComputedStyle(this.$.layout).getPropertyValue(tmpStyleProp));
433
-
434
- // Compare step min-width with the host width, select the passed step
435
- if (stepMinWidthPx <= this.offsetWidth) {
436
- selectedStep = step;
437
- }
438
- });
439
- this.$.layout.style.removeProperty(tmpStyleProp);
440
-
441
- // Sometimes converting units is not possible, e.g, when element is
442
- // not connected. Then the `selectedStep` stays `undefined`.
443
- if (selectedStep) {
444
- // Apply the chosen responsive step's properties
445
- this._columnCount = selectedStep.columns;
446
- this._labelsOnTop = selectedStep.labelsPosition === 'top';
447
- }
448
- }
449
-
450
- /** @private */
451
- _invokeUpdateLayout() {
452
- this._updateLayout();
453
- }
454
-
455
- /**
456
- * Update the layout.
457
- * @protected
458
- */
459
- _updateLayout() {
460
- // Do not update layout when invisible
461
- if (isElementHidden(this)) {
462
- return;
463
- }
464
-
465
- /*
466
- The item width formula:
467
-
468
- itemWidth = colspan / columnCount * 100% - columnSpacing
469
-
470
- We have to subtract columnSpacing, because the column spacing space is taken
471
- by item margins of 1/2 * spacing on both sides
472
- */
473
-
474
- const style = getComputedStyle(this);
475
- const columnSpacing = style.getPropertyValue('--vaadin-form-layout-column-spacing');
476
-
477
- const direction = style.direction;
478
- const marginStartProp = `margin-${direction === 'ltr' ? 'left' : 'right'}`;
479
- const marginEndProp = `margin-${direction === 'ltr' ? 'right' : 'left'}`;
480
-
481
- const containerWidth = this.offsetWidth;
482
-
483
- let col = 0;
484
- Array.from(this.children)
485
- .filter((child) => child.localName === 'br' || getComputedStyle(child).display !== 'none')
486
- .forEach((child, index, children) => {
487
- if (child.localName === 'br') {
488
- // Reset column count on line break
489
- col = 0;
490
- return;
491
- }
492
-
493
- const attrColspan = child.getAttribute('colspan') || child.getAttribute('data-colspan');
494
- let colspan;
495
- colspan = this._naturalNumberOrOne(parseFloat(attrColspan));
496
-
497
- // Never span further than the number of columns
498
- colspan = Math.min(colspan, this._columnCount);
499
-
500
- const childRatio = colspan / this._columnCount;
501
-
502
- // Note: using 99.9% for 100% fixes rounding errors in MS Edge
503
- // (< v16), otherwise the items might wrap, resizing is wobbly.
504
- child.style.width = `calc(${childRatio * 99.9}% - ${1 - childRatio} * ${columnSpacing})`;
505
-
506
- if (col + colspan > this._columnCount) {
507
- // Too big to fit on this row, let's wrap it
508
- col = 0;
509
- }
510
-
511
- // At the start edge
512
- if (col === 0) {
513
- child.style.setProperty(marginStartProp, '0px');
514
- } else {
515
- child.style.removeProperty(marginStartProp);
516
- }
517
-
518
- const nextIndex = index + 1;
519
- const nextLineBreak = nextIndex < children.length && children[nextIndex].localName === 'br';
520
-
521
- // At the end edge
522
- if (col + colspan === this._columnCount) {
523
- child.style.setProperty(marginEndProp, '0px');
524
- } else if (nextLineBreak) {
525
- const colspanRatio = (this._columnCount - col - colspan) / this._columnCount;
526
- child.style.setProperty(
527
- marginEndProp,
528
- `calc(${colspanRatio * containerWidth}px + ${colspanRatio} * ${columnSpacing})`,
529
- );
530
- } else {
531
- child.style.removeProperty(marginEndProp);
532
- }
533
-
534
- // Move the column counter
535
- col = (col + colspan) % this._columnCount;
536
-
537
- if (child.localName === 'vaadin-form-item') {
538
- if (this._labelsOnTop) {
539
- if (child.getAttribute('label-position') !== 'top') {
540
- child.__useLayoutLabelPosition = true;
541
- child.setAttribute('label-position', 'top');
542
- }
543
- } else if (child.__useLayoutLabelPosition) {
544
- delete child.__useLayoutLabelPosition;
545
- child.removeAttribute('label-position');
546
- }
547
- }
548
- });
549
- }
550
-
551
- /**
552
- * @protected
553
- * @override
554
- */
555
- _onResize(contentRect) {
556
- if (contentRect.width === 0 && contentRect.height === 0) {
557
- this.$.layout.style.opacity = '0';
558
- return;
559
- }
560
-
561
- this._selectResponsiveStep();
562
- this._updateLayout();
563
-
564
- this.$.layout.style.opacity = '';
565
- }
566
126
  }
567
127
 
568
128
  defineCustomElement(FormLayout);
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright (c) 2017 - 2025 Vaadin Ltd.
4
+ * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
+ */
6
+ export * from './vaadin-form-item.js';
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @license
3
+ * Copyright (c) 2017 - 2025 Vaadin Ltd.
4
+ * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
+ */
6
+ import { html, LitElement } from 'lit';
7
+ import { defineCustomElement } from '@vaadin/component-base/src/define.js';
8
+ import { PolylitMixin } from '@vaadin/component-base/src/polylit-mixin.js';
9
+ import { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
10
+ import { FormItemMixin } from './vaadin-form-item-mixin.js';
11
+ import { formItemStyles } from './vaadin-form-layout-styles.js';
12
+
13
+ /**
14
+ * LitElement based version of `<vaadin-form-item>` web component.
15
+ *
16
+ * ## Disclaimer
17
+ *
18
+ * This component is an experiment and not yet a part of Vaadin platform.
19
+ * There is no ETA regarding specific Vaadin version where it'll land.
20
+ * Feel free to try this code in your apps as per Apache 2.0 license.
21
+ */
22
+ class FormItem extends FormItemMixin(ThemableMixin(PolylitMixin(LitElement))) {
23
+ static get is() {
24
+ return 'vaadin-form-item';
25
+ }
26
+
27
+ static get styles() {
28
+ return formItemStyles;
29
+ }
30
+
31
+ /** @protected */
32
+ render() {
33
+ return html`
34
+ <div id="label" part="label" @click="${this.__onLabelClick}">
35
+ <slot name="label" id="labelSlot" @slotchange="${this.__onLabelSlotChange}"></slot>
36
+ <span part="required-indicator" aria-hidden="true"></span>
37
+ </div>
38
+ <div id="spacing"></div>
39
+ <div id="content">
40
+ <slot id="contentSlot" @slotchange="${this.__onContentSlotChange}"></slot>
41
+ </div>
42
+ `;
43
+ }
44
+ }
45
+
46
+ defineCustomElement(FormItem);
47
+
48
+ export { FormItem };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright (c) 2017 - 2025 Vaadin Ltd.
4
+ * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
+ */
6
+ export * from './vaadin-form-layout.js';
@@ -0,0 +1,44 @@
1
+ /**
2
+ * @license
3
+ * Copyright (c) 2017 - 2025 Vaadin Ltd.
4
+ * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
+ */
6
+ import { html, LitElement } from 'lit';
7
+ import { defineCustomElement } from '@vaadin/component-base/src/define.js';
8
+ import { ElementMixin } from '@vaadin/component-base/src/element-mixin.js';
9
+ import { PolylitMixin } from '@vaadin/component-base/src/polylit-mixin.js';
10
+ import { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
11
+ import { FormLayoutMixin } from './vaadin-form-layout-mixin.js';
12
+ import { formLayoutStyles } from './vaadin-form-layout-styles.js';
13
+
14
+ /**
15
+ * LitElement based version of `<vaadin-form-layout>` web component.
16
+ *
17
+ * ## Disclaimer
18
+ *
19
+ * This component is an experiment and not yet a part of Vaadin platform.
20
+ * There is no ETA regarding specific Vaadin version where it'll land.
21
+ * Feel free to try this code in your apps as per Apache 2.0 license.
22
+ */
23
+ class FormLayout extends FormLayoutMixin(ThemableMixin(ElementMixin(PolylitMixin(LitElement)))) {
24
+ static get is() {
25
+ return 'vaadin-form-layout';
26
+ }
27
+
28
+ static get styles() {
29
+ return formLayoutStyles;
30
+ }
31
+
32
+ /** @protected */
33
+ render() {
34
+ return html`
35
+ <div id="layout">
36
+ <slot id="slot"></slot>
37
+ </div>
38
+ `;
39
+ }
40
+ }
41
+
42
+ defineCustomElement(FormLayout);
43
+
44
+ export { FormLayout };
@@ -7,10 +7,6 @@ import { css, registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themab
7
7
  registerStyles(
8
8
  'vaadin-form-item',
9
9
  css`
10
- :host {
11
- --vaadin-form-item-row-spacing: 0;
12
- }
13
-
14
10
  /* font-weight, margin-bottom, transition and line-height same as for part label in text-field */
15
11
  [part='label'] {
16
12
  color: var(--lumo-secondary-text-color);
@@ -6,6 +6,7 @@ registerStyles(
6
6
  css`
7
7
  :host {
8
8
  --vaadin-form-layout-column-spacing: var(--lumo-space-l);
9
+ --vaadin-form-layout-row-spacing: 0;
9
10
  }
10
11
  `,
11
12
  { moduleId: 'lumo-form-layout' },
@@ -0,0 +1,2 @@
1
+ import './vaadin-form-item-styles.js';
2
+ import '../../src/vaadin-lit-form-item.js';
@@ -0,0 +1,2 @@
1
+ import './vaadin-form-item-styles.js';
2
+ import '../../src/vaadin-lit-form-item.js';
@@ -0,0 +1,2 @@
1
+ import './vaadin-form-layout-styles.js';
2
+ import '../../src/vaadin-lit-form-layout.js';
@@ -0,0 +1,2 @@
1
+ import './vaadin-form-layout-styles.js';
2
+ import '../../src/vaadin-lit-form-layout.js';
@@ -0,0 +1,2 @@
1
+ import './vaadin-form-item-styles.js';
2
+ import '../../src/vaadin-lit-form-item.js';
@@ -0,0 +1,2 @@
1
+ import './vaadin-form-item-styles.js';
2
+ import '../../src/vaadin-lit-form-item.js';
@@ -0,0 +1 @@
1
+ import '../../src/vaadin-lit-form-layout.js';
@@ -0,0 +1 @@
1
+ import '../../src/vaadin-lit-form-layout.js';
@@ -0,0 +1 @@
1
+ export * from './vaadin-form-item.js';
@@ -0,0 +1,2 @@
1
+ import './theme/lumo/vaadin-lit-form-item.js';
2
+ export * from './src/vaadin-lit-form-item.js';
@@ -0,0 +1 @@
1
+ export * from './vaadin-form-layout.js';
@@ -0,0 +1,2 @@
1
+ import './theme/lumo/vaadin-lit-form-layout.js';
2
+ export * from './src/vaadin-lit-form-layout.js';