@vaadin/dialog 25.3.0-dev.3a3c2d7d2a → 25.3.0-rc1

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.
@@ -56,6 +56,16 @@
56
56
  "description": "Set to true to remove backdrop and allow click events on background elements.",
57
57
  "attribute": "modeless"
58
58
  },
59
+ {
60
+ "kind": "field",
61
+ "name": "noAutofocus",
62
+ "privacy": "public",
63
+ "type": {
64
+ "text": "boolean"
65
+ },
66
+ "description": "Set to true to prevent focus from moving into the dialog on open.\n\nThis property only works for non-modal dialogs and is ignored\nfor modal ones, where focus must always stay inside.",
67
+ "attribute": "no-autofocus"
68
+ },
59
69
  {
60
70
  "kind": "field",
61
71
  "name": "noCloseOnEsc",
@@ -83,7 +93,8 @@
83
93
  "type": {
84
94
  "text": "boolean"
85
95
  },
86
- "description": "Set to true to disable focus trapping.",
96
+ "description": "Set to true to prevent the dialog from receiving focus\non open and trapping it inside.",
97
+ "deprecated": "This property is deprecated and will be removed in Vaadin 26.",
87
98
  "attribute": "no-focus-trap"
88
99
  },
89
100
  {
@@ -151,6 +162,14 @@
151
162
  "description": "Set to true to remove backdrop and allow click events on background elements.",
152
163
  "fieldName": "modeless"
153
164
  },
165
+ {
166
+ "name": "no-autofocus",
167
+ "type": {
168
+ "text": "boolean"
169
+ },
170
+ "description": "Set to true to prevent focus from moving into the dialog on open.\n\nThis property only works for non-modal dialogs and is ignored\nfor modal ones, where focus must always stay inside.",
171
+ "fieldName": "noAutofocus"
172
+ },
154
173
  {
155
174
  "name": "no-close-on-esc",
156
175
  "type": {
@@ -172,7 +191,8 @@
172
191
  "type": {
173
192
  "text": "boolean"
174
193
  },
175
- "description": "Set to true to disable focus trapping.",
194
+ "description": "Set to true to prevent the dialog from receiving focus\non open and trapping it inside.",
195
+ "deprecated": "This property is deprecated and will be removed in Vaadin 26.",
176
196
  "fieldName": "noFocusTrap"
177
197
  },
178
198
  {
@@ -326,6 +346,20 @@
326
346
  "description": "",
327
347
  "name": "DialogOverlayMixin",
328
348
  "members": [
349
+ {
350
+ "kind": "field",
351
+ "name": "autofocus",
352
+ "privacy": "public",
353
+ "type": {
354
+ "text": "boolean"
355
+ },
356
+ "description": "Set to true to move focus into the overlay automatically on open.\n\nFocus moves to the first tabbable element in the tab order. This\ncan be the overlay itself if it has `tabindex` attribute set to `0`\non the host element or the `overlay` shadow DOM part.",
357
+ "attribute": "autofocus",
358
+ "inheritedFrom": {
359
+ "name": "OverlayFocusMixin",
360
+ "package": "@vaadin/overlay/src/vaadin-overlay-focus-mixin.js"
361
+ }
362
+ },
329
363
  {
330
364
  "kind": "method",
331
365
  "name": "bringToFront",
@@ -351,6 +385,16 @@
351
385
  "package": "@vaadin/overlay/src/vaadin-overlay-mixin.js"
352
386
  }
353
387
  },
388
+ {
389
+ "kind": "method",
390
+ "name": "containsFocus",
391
+ "description": "Returns true if the overlay contains focus, including nested shadow roots.",
392
+ "return": {
393
+ "type": {
394
+ "text": "boolean"
395
+ }
396
+ }
397
+ },
354
398
  {
355
399
  "kind": "field",
356
400
  "name": "focusTrap",
@@ -358,7 +402,7 @@
358
402
  "type": {
359
403
  "text": "boolean"
360
404
  },
361
- "description": "When true, opening the overlay moves focus to the first focusable child,\nor to the overlay part with tabindex if there are no focusable children.",
405
+ "description": "Set to true to move focus into the overlay automatically on open\nand keep it inside: Tab and Shift+Tab cycle through the overlay's\ncontent until the overlay is closed.\n\nFocus moves to the first tabbable element in the tab order. This\ncan be the overlay itself if it has `tabindex` attribute set to `0`\non the host element or the `overlay` shadow DOM part.",
362
406
  "attribute": "focus-trap",
363
407
  "inheritedFrom": {
364
408
  "name": "OverlayFocusMixin",
@@ -570,12 +614,24 @@
570
614
  }
571
615
  ],
572
616
  "attributes": [
617
+ {
618
+ "name": "autofocus",
619
+ "type": {
620
+ "text": "boolean"
621
+ },
622
+ "description": "Set to true to move focus into the overlay automatically on open.\n\nFocus moves to the first tabbable element in the tab order. This\ncan be the overlay itself if it has `tabindex` attribute set to `0`\non the host element or the `overlay` shadow DOM part.",
623
+ "fieldName": "autofocus",
624
+ "inheritedFrom": {
625
+ "name": "OverlayFocusMixin",
626
+ "package": "@vaadin/overlay/src/vaadin-overlay-focus-mixin.js"
627
+ }
628
+ },
573
629
  {
574
630
  "name": "focus-trap",
575
631
  "type": {
576
632
  "text": "boolean"
577
633
  },
578
- "description": "When true, opening the overlay moves focus to the first focusable child,\nor to the overlay part with tabindex if there are no focusable children.",
634
+ "description": "Set to true to move focus into the overlay automatically on open\nand keep it inside: Tab and Shift+Tab cycle through the overlay's\ncontent until the overlay is closed.\n\nFocus moves to the first tabbable element in the tab order. This\ncan be the overlay itself if it has `tabindex` attribute set to `0`\non the host element or the `overlay` shadow DOM part.",
579
635
  "fieldName": "focusTrap",
580
636
  "inheritedFrom": {
581
637
  "name": "OverlayFocusMixin",
@@ -758,6 +814,7 @@
758
814
  "text": "DialogRenderer | undefined"
759
815
  },
760
816
  "description": "Custom function for rendering the dialog footer.\nReceives two arguments:\n\n- `root` The root container DOM element. Append your content to it.\n- `dialog` The reference to the `<vaadin-dialog>` element.\n\nWhen `footerRenderer` is set, the attribute `has-footer` is set on the dialog.",
817
+ "deprecated": "Add footer content as children of the dialog using `slot=\"footer\"` instead",
761
818
  "attribute": "footer-renderer"
762
819
  },
763
820
  {
@@ -768,6 +825,7 @@
768
825
  "text": "DialogRenderer | undefined"
769
826
  },
770
827
  "description": "Custom function for rendering the dialog header.\nReceives two arguments:\n\n- `root` The root container DOM element. Append your content to it.\n- `dialog` The reference to the `<vaadin-dialog>` element.\n\nIf both `headerTitle` and `headerRenderer` are defined, the title\nand the elements created by the renderer will be placed next to\neach other, with the title coming first.\n\nWhen `headerRenderer` is set, the attribute `has-header` is set on the dialog.",
828
+ "deprecated": "Add header content as children of the dialog using `slot=\"header-content\"` instead",
771
829
  "attribute": "header-renderer"
772
830
  },
773
831
  {
@@ -788,12 +846,14 @@
788
846
  "text": "DialogRenderer | undefined"
789
847
  },
790
848
  "description": "Custom function for rendering the content of the dialog.\nReceives two arguments:\n\n- `root` The root container DOM element. Append your content to it.\n- `dialog` The reference to the `<vaadin-dialog>` element.",
849
+ "deprecated": "Add content elements as children of the dialog instead",
791
850
  "attribute": "renderer"
792
851
  },
793
852
  {
794
853
  "kind": "method",
795
854
  "name": "requestContentUpdate",
796
- "description": "Requests an update for the content of the dialog.\nWhile performing the update, it invokes the renderer passed in the `renderer` property,\nas well as `headerRender` and `footerRenderer` properties, if these are defined.\n\nIt is not guaranteed that the update happens immediately (synchronously) after it is requested."
855
+ "description": "Requests an update for the content of the dialog.\nWhile performing the update, it invokes the renderer passed in the `renderer` property,\nas well as `headerRender` and `footerRenderer` properties, if these are defined.\n\nIt is not guaranteed that the update happens immediately (synchronously) after it is requested.",
856
+ "deprecated": "This method is only used with renderers and will be removed in Vaadin 26"
797
857
  }
798
858
  ],
799
859
  "attributes": [
@@ -803,6 +863,7 @@
803
863
  "text": "DialogRenderer | undefined"
804
864
  },
805
865
  "description": "Custom function for rendering the dialog footer.\nReceives two arguments:\n\n- `root` The root container DOM element. Append your content to it.\n- `dialog` The reference to the `<vaadin-dialog>` element.\n\nWhen `footerRenderer` is set, the attribute `has-footer` is set on the dialog.",
866
+ "deprecated": "Add footer content as children of the dialog using `slot=\"footer\"` instead",
806
867
  "fieldName": "footerRenderer"
807
868
  },
808
869
  {
@@ -811,6 +872,7 @@
811
872
  "text": "DialogRenderer | undefined"
812
873
  },
813
874
  "description": "Custom function for rendering the dialog header.\nReceives two arguments:\n\n- `root` The root container DOM element. Append your content to it.\n- `dialog` The reference to the `<vaadin-dialog>` element.\n\nIf both `headerTitle` and `headerRenderer` are defined, the title\nand the elements created by the renderer will be placed next to\neach other, with the title coming first.\n\nWhen `headerRenderer` is set, the attribute `has-header` is set on the dialog.",
875
+ "deprecated": "Add header content as children of the dialog using `slot=\"header-content\"` instead",
814
876
  "fieldName": "headerRenderer"
815
877
  },
816
878
  {
@@ -827,6 +889,7 @@
827
889
  "text": "DialogRenderer | undefined"
828
890
  },
829
891
  "description": "Custom function for rendering the content of the dialog.\nReceives two arguments:\n\n- `root` The root container DOM element. Append your content to it.\n- `dialog` The reference to the `<vaadin-dialog>` element.",
892
+ "deprecated": "Add content elements as children of the dialog instead",
830
893
  "fieldName": "renderer"
831
894
  }
832
895
  ],
@@ -976,13 +1039,67 @@
976
1039
  }
977
1040
  ]
978
1041
  },
1042
+ {
1043
+ "kind": "javascript-module",
1044
+ "path": "src/vaadin-dialog-utils.js",
1045
+ "declarations": [
1046
+ {
1047
+ "kind": "class",
1048
+ "description": "Remembers where a pointer gesture started, to tell a click from a drag once it ends.",
1049
+ "name": "ClickTracker",
1050
+ "members": [
1051
+ {
1052
+ "kind": "method",
1053
+ "name": "isClick",
1054
+ "parameters": [
1055
+ {
1056
+ "name": "e",
1057
+ "type": {
1058
+ "text": "!MouseEvent | !TouchEvent"
1059
+ }
1060
+ }
1061
+ ],
1062
+ "description": "Returns true if the pointer hasn't moved since the gesture started.",
1063
+ "return": {
1064
+ "type": {
1065
+ "text": "boolean"
1066
+ }
1067
+ }
1068
+ },
1069
+ {
1070
+ "kind": "method",
1071
+ "name": "start",
1072
+ "parameters": [
1073
+ {
1074
+ "name": "e",
1075
+ "type": {
1076
+ "text": "!MouseEvent | !TouchEvent"
1077
+ }
1078
+ }
1079
+ ],
1080
+ "description": "Stores the position where the gesture started."
1081
+ }
1082
+ ]
1083
+ }
1084
+ ],
1085
+ "exports": [
1086
+ {
1087
+ "kind": "js",
1088
+ "name": "ClickTracker",
1089
+ "declaration": {
1090
+ "name": "ClickTracker",
1091
+ "module": "src/vaadin-dialog-utils.js"
1092
+ }
1093
+ }
1094
+ ]
1095
+ },
979
1096
  {
980
1097
  "kind": "javascript-module",
981
1098
  "path": "src/vaadin-dialog.js",
982
1099
  "declarations": [
983
1100
  {
984
1101
  "kind": "class",
985
- "description": "`<vaadin-dialog>` is a Web Component for creating customized modal dialogs.\n\n### Rendering\n\nThe content of the dialog can be populated by using the renderer callback function.\n\nThe renderer function provides `root`, `dialog` arguments.\nGenerate DOM content, append it to the `root` element and control the state\nof the host element by accessing `dialog`. Before generating new content,\nusers are able to check if there is already content in `root` for reusing it.\n\n```html\n<vaadin-dialog id=\"dialog\"></vaadin-dialog>\n```\n```js\nconst dialog = document.querySelector('#dialog');\ndialog.renderer = function(root, dialog) {\n root.textContent = \"Sample dialog\";\n};\n```\n\nRenderer is called on the opening of the dialog.\nDOM generated during the renderer call can be reused\nin the next renderer call and will be provided with the `root` argument.\nOn first call it will be empty.\n\n### Styling\n\nThe following shadow DOM parts are available for styling:\n\nPart name | Description\n-----------------|-------------------------------------------\n`backdrop` | Backdrop of the overlay\n`overlay` | The overlay container\n`content` | The overlay content\n`header` | Element wrapping title and header content\n`header-content` | Element wrapping the header content slot\n`title` | Element wrapping the title slot\n`footer` | Element wrapping the footer slot\n\nThe following state attributes are available for styling:\n\nAttribute | Description\n-----------------|--------------------------------------------\n`has-title` | Set when the element has a title\n`has-header` | Set when the element has header renderer\n`has-footer` | Set when the element has footer renderer\n`overflow` | Set to `top`, `bottom`, none or both\n\nThe following custom CSS properties are available for styling:\n\nCustom CSS property |\n:--------------------------------------------|\n|`--vaadin-dialog-background` |\n|`--vaadin-dialog-border-color` |\n|`--vaadin-dialog-border-radius` |\n|`--vaadin-dialog-border-width` |\n|`--vaadin-dialog-max-width` |\n|`--vaadin-dialog-min-width` |\n|`--vaadin-dialog-overflow-indicator-color` |\n|`--vaadin-dialog-overflow-indicator-height` |\n|`--vaadin-dialog-padding` |\n|`--vaadin-dialog-shadow` |\n|`--vaadin-dialog-text-color` |\n|`--vaadin-dialog-title-color` |\n|`--vaadin-dialog-title-font-size` |\n|`--vaadin-dialog-title-font-weight` |\n|`--vaadin-dialog-title-line-height` |\n|`--vaadin-overlay-backdrop-background` |\n\nSee [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.",
1102
+ "description": "`<vaadin-dialog>` is a Web Component for creating customized modal dialogs.\n\n```html\n<vaadin-dialog header-title=\"Title\">\n <div>Dialog content</div>\n <div slot=\"footer\">Footer</div>\n</vaadin-dialog>\n```\n\n### Slots\n\nDialog supports following slots for providing content:\n\nName | Description\n-----------------|-------------\n(none) | Default slot for the content\n`header-content` | Slot for the header content\n`footer` | Slot for the footer content\n\n#### Renderer (deprecated)\n\nThe content of the dialog can also be populated by using the renderer callback functions,\nalthough this approach is deprecated in favor of slotted content.\n\nThe renderer function provides `root`, `dialog` arguments.\nGenerate DOM content, append it to the `root` element and control the state\nof the host element by accessing `dialog`. Before generating new content,\nusers are able to check if there is already content in `root` for reusing it.\n\n```html\n<vaadin-dialog id=\"dialog\"></vaadin-dialog>\n```\n```js\nconst dialog = document.querySelector('#dialog');\ndialog.renderer = function(root, dialog) {\n root.textContent = \"Sample dialog\";\n};\n```\n\nRenderer is called on the opening of the dialog.\nDOM generated during the renderer call can be reused\nin the next renderer call and will be provided with the `root` argument.\nOn first call it will be empty.\n\n### Styling\n\nThe following shadow DOM parts are available for styling:\n\nPart name | Description\n-----------------|-------------------------------------------\n`backdrop` | Backdrop of the overlay\n`overlay` | The overlay container\n`content` | The overlay content\n`header` | Element wrapping title and header content\n`header-content` | Element wrapping the header content slot\n`title` | Element wrapping the title slot\n`footer` | Element wrapping the footer slot\n\nThe following state attributes are available for styling:\n\nAttribute | Description\n-----------------|--------------------------------------------\n`has-title` | Set when the element has a title\n`has-header` | Set when the element has header content\n`has-footer` | Set when the element has footer content\n`overflow` | Set to `top`, `bottom`, none or both\n\nThe following custom CSS properties are available for styling:\n\nCustom CSS property |\n:--------------------------------------------|\n|`--vaadin-dialog-background` |\n|`--vaadin-dialog-border-color` |\n|`--vaadin-dialog-border-radius` |\n|`--vaadin-dialog-border-width` |\n|`--vaadin-dialog-max-width` |\n|`--vaadin-dialog-min-width` |\n|`--vaadin-dialog-overflow-indicator-color` |\n|`--vaadin-dialog-overflow-indicator-height` |\n|`--vaadin-dialog-padding` |\n|`--vaadin-dialog-shadow` |\n|`--vaadin-dialog-text-color` |\n|`--vaadin-dialog-title-color` |\n|`--vaadin-dialog-title-font-size` |\n|`--vaadin-dialog-title-font-weight` |\n|`--vaadin-dialog-title-line-height` |\n|`--vaadin-dialog-toolbar-gap` |\n|`--vaadin-overlay-backdrop-background` |\n\nSee [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.",
986
1103
  "name": "Dialog",
987
1104
  "members": [
988
1105
  {
@@ -1007,6 +1124,7 @@
1007
1124
  "text": "DialogRenderer | undefined"
1008
1125
  },
1009
1126
  "description": "Custom function for rendering the dialog footer.\nReceives two arguments:\n\n- `root` The root container DOM element. Append your content to it.\n- `dialog` The reference to the `<vaadin-dialog>` element.\n\nWhen `footerRenderer` is set, the attribute `has-footer` is set on the dialog.",
1127
+ "deprecated": "Add footer content as children of the dialog using `slot=\"footer\"` instead",
1010
1128
  "attribute": "footer-renderer",
1011
1129
  "inheritedFrom": {
1012
1130
  "name": "DialogRendererMixin",
@@ -1021,6 +1139,7 @@
1021
1139
  "text": "DialogRenderer | undefined"
1022
1140
  },
1023
1141
  "description": "Custom function for rendering the dialog header.\nReceives two arguments:\n\n- `root` The root container DOM element. Append your content to it.\n- `dialog` The reference to the `<vaadin-dialog>` element.\n\nIf both `headerTitle` and `headerRenderer` are defined, the title\nand the elements created by the renderer will be placed next to\neach other, with the title coming first.\n\nWhen `headerRenderer` is set, the attribute `has-header` is set on the dialog.",
1142
+ "deprecated": "Add header content as children of the dialog using `slot=\"header-content\"` instead",
1024
1143
  "attribute": "header-renderer",
1025
1144
  "inheritedFrom": {
1026
1145
  "name": "DialogRendererMixin",
@@ -1097,6 +1216,20 @@
1097
1216
  "module": "src/vaadin-dialog-base-mixin.js"
1098
1217
  }
1099
1218
  },
1219
+ {
1220
+ "kind": "field",
1221
+ "name": "noAutofocus",
1222
+ "privacy": "public",
1223
+ "type": {
1224
+ "text": "boolean"
1225
+ },
1226
+ "description": "Set to true to prevent focus from moving into the dialog on open.\n\nThis property only works for non-modal dialogs and is ignored\nfor modal ones, where focus must always stay inside.",
1227
+ "attribute": "no-autofocus",
1228
+ "inheritedFrom": {
1229
+ "name": "DialogBaseMixin",
1230
+ "module": "src/vaadin-dialog-base-mixin.js"
1231
+ }
1232
+ },
1100
1233
  {
1101
1234
  "kind": "field",
1102
1235
  "name": "noCloseOnEsc",
@@ -1132,7 +1265,8 @@
1132
1265
  "type": {
1133
1266
  "text": "boolean"
1134
1267
  },
1135
- "description": "Set to true to disable focus trapping.",
1268
+ "description": "Set to true to prevent the dialog from receiving focus\non open and trapping it inside.",
1269
+ "deprecated": "This property is deprecated and will be removed in Vaadin 26.",
1136
1270
  "attribute": "no-focus-trap",
1137
1271
  "inheritedFrom": {
1138
1272
  "name": "DialogBaseMixin",
@@ -1176,6 +1310,7 @@
1176
1310
  "text": "DialogRenderer | undefined"
1177
1311
  },
1178
1312
  "description": "Custom function for rendering the content of the dialog.\nReceives two arguments:\n\n- `root` The root container DOM element. Append your content to it.\n- `dialog` The reference to the `<vaadin-dialog>` element.",
1313
+ "deprecated": "Add content elements as children of the dialog instead",
1179
1314
  "attribute": "renderer",
1180
1315
  "inheritedFrom": {
1181
1316
  "name": "DialogRendererMixin",
@@ -1186,6 +1321,7 @@
1186
1321
  "kind": "method",
1187
1322
  "name": "requestContentUpdate",
1188
1323
  "description": "Requests an update for the content of the dialog.\nWhile performing the update, it invokes the renderer passed in the `renderer` property,\nas well as `headerRender` and `footerRenderer` properties, if these are defined.\n\nIt is not guaranteed that the update happens immediately (synchronously) after it is requested.",
1324
+ "deprecated": "This method is only used with renderers and will be removed in Vaadin 26",
1189
1325
  "inheritedFrom": {
1190
1326
  "name": "DialogRendererMixin",
1191
1327
  "module": "src/vaadin-dialog-renderer-mixin.js"
@@ -1298,46 +1434,6 @@
1298
1434
  }
1299
1435
  }
1300
1436
  ],
1301
- "mixins": [
1302
- {
1303
- "name": "DialogSizeMixin",
1304
- "module": "src/vaadin-dialog-size-mixin.js"
1305
- },
1306
- {
1307
- "name": "DialogDraggableMixin",
1308
- "module": "src/vaadin-dialog-draggable-mixin.js"
1309
- },
1310
- {
1311
- "name": "DialogResizableMixin",
1312
- "module": "src/vaadin-dialog-resizable-mixin.js"
1313
- },
1314
- {
1315
- "name": "DialogRendererMixin",
1316
- "module": "src/vaadin-dialog-renderer-mixin.js"
1317
- },
1318
- {
1319
- "name": "DialogBaseMixin",
1320
- "module": "src/vaadin-dialog-base-mixin.js"
1321
- },
1322
- {
1323
- "name": "ThemePropertyMixin",
1324
- "package": "@vaadin/vaadin-themable-mixin/vaadin-theme-property-mixin.js"
1325
- },
1326
- {
1327
- "name": "ElementMixin",
1328
- "package": "@vaadin/component-base/src/element-mixin.js"
1329
- },
1330
- {
1331
- "name": "PolylitMixin",
1332
- "package": "@vaadin/component-base/src/polylit-mixin.js"
1333
- }
1334
- ],
1335
- "superclass": {
1336
- "name": "LitElement",
1337
- "package": "lit"
1338
- },
1339
- "tagName": "vaadin-dialog",
1340
- "customElement": true,
1341
1437
  "attributes": [
1342
1438
  {
1343
1439
  "name": "draggable",
@@ -1357,6 +1453,7 @@
1357
1453
  "text": "DialogRenderer | undefined"
1358
1454
  },
1359
1455
  "description": "Custom function for rendering the dialog footer.\nReceives two arguments:\n\n- `root` The root container DOM element. Append your content to it.\n- `dialog` The reference to the `<vaadin-dialog>` element.\n\nWhen `footerRenderer` is set, the attribute `has-footer` is set on the dialog.",
1456
+ "deprecated": "Add footer content as children of the dialog using `slot=\"footer\"` instead",
1360
1457
  "fieldName": "footerRenderer",
1361
1458
  "inheritedFrom": {
1362
1459
  "name": "DialogRendererMixin",
@@ -1369,6 +1466,7 @@
1369
1466
  "text": "DialogRenderer | undefined"
1370
1467
  },
1371
1468
  "description": "Custom function for rendering the dialog header.\nReceives two arguments:\n\n- `root` The root container DOM element. Append your content to it.\n- `dialog` The reference to the `<vaadin-dialog>` element.\n\nIf both `headerTitle` and `headerRenderer` are defined, the title\nand the elements created by the renderer will be placed next to\neach other, with the title coming first.\n\nWhen `headerRenderer` is set, the attribute `has-header` is set on the dialog.",
1469
+ "deprecated": "Add header content as children of the dialog using `slot=\"header-content\"` instead",
1372
1470
  "fieldName": "headerRenderer",
1373
1471
  "inheritedFrom": {
1374
1472
  "name": "DialogRendererMixin",
@@ -1435,6 +1533,18 @@
1435
1533
  "module": "src/vaadin-dialog-base-mixin.js"
1436
1534
  }
1437
1535
  },
1536
+ {
1537
+ "name": "no-autofocus",
1538
+ "type": {
1539
+ "text": "boolean"
1540
+ },
1541
+ "description": "Set to true to prevent focus from moving into the dialog on open.\n\nThis property only works for non-modal dialogs and is ignored\nfor modal ones, where focus must always stay inside.",
1542
+ "fieldName": "noAutofocus",
1543
+ "inheritedFrom": {
1544
+ "name": "DialogBaseMixin",
1545
+ "module": "src/vaadin-dialog-base-mixin.js"
1546
+ }
1547
+ },
1438
1548
  {
1439
1549
  "name": "no-close-on-esc",
1440
1550
  "type": {
@@ -1464,7 +1574,8 @@
1464
1574
  "type": {
1465
1575
  "text": "boolean"
1466
1576
  },
1467
- "description": "Set to true to disable focus trapping.",
1577
+ "description": "Set to true to prevent the dialog from receiving focus\non open and trapping it inside.",
1578
+ "deprecated": "This property is deprecated and will be removed in Vaadin 26.",
1468
1579
  "fieldName": "noFocusTrap",
1469
1580
  "inheritedFrom": {
1470
1581
  "name": "DialogBaseMixin",
@@ -1502,6 +1613,7 @@
1502
1613
  "text": "DialogRenderer | undefined"
1503
1614
  },
1504
1615
  "description": "Custom function for rendering the content of the dialog.\nReceives two arguments:\n\n- `root` The root container DOM element. Append your content to it.\n- `dialog` The reference to the `<vaadin-dialog>` element.",
1616
+ "deprecated": "Add content elements as children of the dialog instead",
1505
1617
  "fieldName": "renderer",
1506
1618
  "inheritedFrom": {
1507
1619
  "name": "DialogRendererMixin",
@@ -1520,6 +1632,13 @@
1520
1632
  "module": "src/vaadin-dialog-resizable-mixin.js"
1521
1633
  }
1522
1634
  },
1635
+ {
1636
+ "type": {
1637
+ "text": "string"
1638
+ },
1639
+ "description": "The theme variants to apply to the component.",
1640
+ "name": "theme"
1641
+ },
1523
1642
  {
1524
1643
  "name": "top",
1525
1644
  "type": {
@@ -1544,7 +1663,47 @@
1544
1663
  "module": "src/vaadin-dialog-size-mixin.js"
1545
1664
  }
1546
1665
  }
1547
- ]
1666
+ ],
1667
+ "mixins": [
1668
+ {
1669
+ "name": "DialogSizeMixin",
1670
+ "module": "src/vaadin-dialog-size-mixin.js"
1671
+ },
1672
+ {
1673
+ "name": "DialogDraggableMixin",
1674
+ "module": "src/vaadin-dialog-draggable-mixin.js"
1675
+ },
1676
+ {
1677
+ "name": "DialogResizableMixin",
1678
+ "module": "src/vaadin-dialog-resizable-mixin.js"
1679
+ },
1680
+ {
1681
+ "name": "DialogRendererMixin",
1682
+ "module": "src/vaadin-dialog-renderer-mixin.js"
1683
+ },
1684
+ {
1685
+ "name": "DialogBaseMixin",
1686
+ "module": "src/vaadin-dialog-base-mixin.js"
1687
+ },
1688
+ {
1689
+ "name": "ThemePropertyMixin",
1690
+ "package": "@vaadin/vaadin-themable-mixin/vaadin-theme-property-mixin.js"
1691
+ },
1692
+ {
1693
+ "name": "ElementMixin",
1694
+ "package": "@vaadin/component-base/src/element-mixin.js"
1695
+ },
1696
+ {
1697
+ "name": "PolylitMixin",
1698
+ "package": "@vaadin/component-base/src/polylit-mixin.js"
1699
+ }
1700
+ ],
1701
+ "superclass": {
1702
+ "name": "LitElement",
1703
+ "package": "lit"
1704
+ },
1705
+ "tagName": "vaadin-dialog",
1706
+ "customElement": true
1548
1707
  }
1549
1708
  ],
1550
1709
  "exports": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vaadin/dialog",
3
- "version": "25.3.0-dev.3a3c2d7d2a",
3
+ "version": "25.3.0-rc1",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -37,19 +37,20 @@
37
37
  ],
38
38
  "dependencies": {
39
39
  "@open-wc/dedupe-mixin": "^1.3.0",
40
- "@vaadin/component-base": "25.3.0-dev.3a3c2d7d2a",
41
- "@vaadin/lit-renderer": "25.3.0-dev.3a3c2d7d2a",
42
- "@vaadin/overlay": "25.3.0-dev.3a3c2d7d2a",
43
- "@vaadin/vaadin-themable-mixin": "25.3.0-dev.3a3c2d7d2a",
40
+ "@vaadin/a11y-base": "25.3.0-rc1",
41
+ "@vaadin/component-base": "25.3.0-rc1",
42
+ "@vaadin/lit-renderer": "25.3.0-rc1",
43
+ "@vaadin/overlay": "25.3.0-rc1",
44
+ "@vaadin/vaadin-themable-mixin": "25.3.0-rc1",
44
45
  "lit": "^3.0.0"
45
46
  },
46
47
  "devDependencies": {
47
- "@vaadin/a11y-base": "25.3.0-dev.3a3c2d7d2a",
48
- "@vaadin/aura": "25.3.0-dev.3a3c2d7d2a",
49
- "@vaadin/chai-plugins": "25.3.0-dev.3a3c2d7d2a",
50
- "@vaadin/test-runner-commands": "25.3.0-dev.3a3c2d7d2a",
48
+ "@vaadin/a11y-base": "25.3.0-beta3",
49
+ "@vaadin/aura": "25.3.0-rc1",
50
+ "@vaadin/chai-plugins": "25.3.0-rc1",
51
+ "@vaadin/test-runner-commands": "25.3.0-rc1",
51
52
  "@vaadin/testing-helpers": "^2.0.0",
52
- "@vaadin/vaadin-lumo-styles": "25.3.0-dev.3a3c2d7d2a",
53
+ "@vaadin/vaadin-lumo-styles": "25.3.0-rc1",
53
54
  "sinon": "^22.0.0"
54
55
  },
55
56
  "customElements": "custom-elements.json",
@@ -57,5 +58,5 @@
57
58
  "web-types.json",
58
59
  "web-types.lit.json"
59
60
  ],
60
- "gitHead": "ac506ca7800c23e05da55863c56bcedf12812d37"
61
+ "gitHead": "d4809590b2f61bd607e376ab3dec84f4bfb059a7"
61
62
  }
@@ -69,6 +69,7 @@ export class DialogFooterRendererDirective extends AbstractDialogRendererDirecti
69
69
  * @param renderer the renderer callback that returns a Lit template.
70
70
  * @param dependencies a single dependency or an array of dependencies
71
71
  * which trigger a re-render when changed.
72
+ * @deprecated Add content elements as children of the dialog instead
72
73
  */
73
74
  export declare function dialogRenderer(
74
75
  renderer: DialogLitRenderer,
@@ -100,6 +101,7 @@ export declare function dialogRenderer(
100
101
  * @param renderer the renderer callback.
101
102
  * @param dependencies a single dependency or an array of dependencies
102
103
  * which trigger a re-render when changed.
104
+ * @deprecated Add header content as children of the dialog using `slot="header-content"` instead
103
105
  */
104
106
  export declare function dialogHeaderRenderer(
105
107
  renderer: DialogLitRenderer,
@@ -131,6 +133,7 @@ export declare function dialogHeaderRenderer(
131
133
  * @param renderer the renderer callback.
132
134
  * @param dependencies a single dependency or an array of dependencies
133
135
  * which trigger a re-render when changed.
136
+ * @deprecated Add footer content as children of the dialog using `slot="footer"` instead
134
137
  */
135
138
  export declare function dialogFooterRenderer(
136
139
  renderer: DialogLitRenderer,
@@ -95,6 +95,7 @@ export class DialogFooterRendererDirective extends AbstractDialogRendererDirecti
95
95
  * @param renderer the renderer callback that returns a Lit template.
96
96
  * @param dependencies a single dependency or an array of dependencies
97
97
  * which trigger a re-render when changed.
98
+ * @deprecated Add content elements as children of the dialog instead
98
99
  */
99
100
  export const dialogRenderer = directive(DialogRendererDirective);
100
101
 
@@ -123,6 +124,7 @@ export const dialogRenderer = directive(DialogRendererDirective);
123
124
  * @param renderer the renderer callback.
124
125
  * @param dependencies a single dependency or an array of dependencies
125
126
  * which trigger a re-render when changed.
127
+ * @deprecated Add header content as children of the dialog using `slot="header-content"` instead
126
128
  */
127
129
  export const dialogHeaderRenderer = directive(DialogHeaderRendererDirective);
128
130
 
@@ -151,5 +153,6 @@ export const dialogHeaderRenderer = directive(DialogHeaderRendererDirective);
151
153
  * @param renderer the renderer callback.
152
154
  * @param dependencies a single dependency or an array of dependencies
153
155
  * which trigger a re-render when changed.
156
+ * @deprecated Add footer content as children of the dialog using `slot="footer"` instead
154
157
  */
155
158
  export const dialogFooterRenderer = directive(DialogFooterRendererDirective);
@@ -33,11 +33,24 @@ export declare class DialogBaseMixinClass {
33
33
  modeless: boolean;
34
34
 
35
35
  /**
36
- * Set to true to disable focus trapping.
36
+ * Set to true to prevent the dialog from receiving focus
37
+ * on open and trapping it inside.
38
+ *
37
39
  * @attr {boolean} no-focus-trap
40
+ * @deprecated This property is deprecated and will be removed in Vaadin 26.
38
41
  */
39
42
  noFocusTrap: boolean;
40
43
 
44
+ /**
45
+ * Set to true to prevent focus from moving into the dialog on open.
46
+ *
47
+ * This property only works for non-modal dialogs and is ignored
48
+ * for modal ones, where focus must always stay inside.
49
+ *
50
+ * @attr {boolean} no-autofocus
51
+ */
52
+ noAutofocus: boolean;
53
+
41
54
  /**
42
55
  * The `role` attribute value to be set on the dialog. Defaults to "dialog".
43
56
  *
@@ -3,6 +3,7 @@
3
3
  * Copyright (c) 2017 - 2026 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
+ import { setOrRemoveAttribute } from '@vaadin/component-base/src/dom-utils.js';
6
7
 
7
8
  export const DialogBaseMixin = (superClass) =>
8
9
  class DialogBaseMixin extends superClass {
@@ -46,14 +47,30 @@ export const DialogBaseMixin = (superClass) =>
46
47
  },
47
48
 
48
49
  /**
49
- * Set to true to disable focus trapping.
50
+ * Set to true to prevent the dialog from receiving focus
51
+ * on open and trapping it inside.
52
+ *
50
53
  * @attr {boolean} no-focus-trap
54
+ * @deprecated This property is deprecated and will be removed in Vaadin 26.
51
55
  */
52
56
  noFocusTrap: {
53
57
  type: Boolean,
54
58
  value: false,
55
59
  },
56
60
 
61
+ /**
62
+ * Set to true to prevent focus from moving into the dialog on open.
63
+ *
64
+ * This property only works for non-modal dialogs and is ignored
65
+ * for modal ones, where focus must always stay inside.
66
+ *
67
+ * @attr {boolean} no-autofocus
68
+ */
69
+ noAutofocus: {
70
+ type: Boolean,
71
+ value: false,
72
+ },
73
+
57
74
  /**
58
75
  * Set the distance of the dialog from the top of the viewport.
59
76
  * If a unitless number is provided, pixels are assumed.
@@ -134,11 +151,7 @@ export const DialogBaseMixin = (superClass) =>
134
151
  }
135
152
 
136
153
  if (props.has('modeless')) {
137
- if (!this.modeless) {
138
- this.setAttribute('aria-modal', 'true');
139
- } else {
140
- this.removeAttribute('aria-modal');
141
- }
154
+ setOrRemoveAttribute(this, 'aria-modal', !this.modeless);
142
155
  }
143
156
  }
144
157
 
@@ -198,10 +211,11 @@ export const DialogBaseMixin = (superClass) =>
198
211
  }
199
212
 
200
213
  /** @private */
201
- _bringOverlayToFront() {
202
- if (this.modeless) {
203
- this._overlayElement.bringToFront();
214
+ _bringOverlayToFront(event) {
215
+ if (!this.modeless) {
216
+ return;
204
217
  }
218
+ this._overlayElement.bringToFront(event);
205
219
  }
206
220
 
207
221
  /** @private */
@@ -3,8 +3,9 @@
3
3
  * Copyright (c) 2017 - 2026 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
+ import { isKeyboardActive } from '@vaadin/a11y-base/src/focus-utils.js';
6
7
  import { isTouch } from '@vaadin/component-base/src/browser-utils.js';
7
- import { eventInWindow, getMouseOrFirstTouchEvent } from './vaadin-dialog-utils.js';
8
+ import { ClickTracker, eventInWindow, getMouseOrFirstTouchEvent } from './vaadin-dialog-utils.js';
8
9
 
9
10
  export const DialogDraggableMixin = (superClass) =>
10
11
  class VaadinDialogDraggableMixin extends superClass {
@@ -44,6 +45,7 @@ export const DialogDraggableMixin = (superClass) =>
44
45
  super.ready();
45
46
  this._originalBounds = {};
46
47
  this._originalMouseCoords = {};
48
+ this.__dragTracker = new ClickTracker();
47
49
  this._startDrag = this._startDrag.bind(this);
48
50
  this._drag = this._drag.bind(this);
49
51
  this._stopDrag = this._stopDrag.bind(this);
@@ -86,6 +88,8 @@ export const DialogDraggableMixin = (superClass) =>
86
88
  if ((isResizerContainer && !isResizerContainerScrollbar) || isContentPart || isDraggable) {
87
89
  // Signal that we're handling this drag event, so parent dialogs won't also drag
88
90
  e.preventDefault();
91
+ // `preventDefault()` above cancels the native focus change, restored in `_stopDrag()`
92
+ this.__dragTracker.start(e);
89
93
  this._originalBounds = this.$.overlay.getBounds();
90
94
  const event = getMouseOrFirstTouchEvent(e);
91
95
  this._originalMouseCoords = { top: event.pageY, left: event.pageX };
@@ -128,7 +132,12 @@ export const DialogDraggableMixin = (superClass) =>
128
132
  }
129
133
 
130
134
  /** @private */
131
- _stopDrag() {
135
+ _stopDrag(e) {
136
+ // Focus on click, not on drag, so that moving the dialog doesn't interrupt editing
137
+ if (this.__dragTracker.isClick(e) && !this.$.overlay.containsFocus()) {
138
+ this.focus({ preventScroll: true, focusVisible: isKeyboardActive() });
139
+ }
140
+
132
141
  this.dispatchEvent(new CustomEvent('dragged', { detail: { top: this.top, left: this.left } }));
133
142
  window.removeEventListener('mouseup', this._stopDrag);
134
143
  window.removeEventListener('touchend', this._stopDrag);
@@ -44,4 +44,9 @@ export declare class DialogOverlayMixinClass {
44
44
  * Retrieves the coordinates of the overlay.
45
45
  */
46
46
  getBounds(): DialogOverlayBounds;
47
+
48
+ /**
49
+ * Returns true if the overlay contains focus, including nested shadow roots.
50
+ */
51
+ containsFocus(): boolean;
47
52
  }
@@ -3,6 +3,7 @@
3
3
  * Copyright (c) 2017 - 2026 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
+ import { getDeepActiveElement } from '@vaadin/a11y-base/src/focus-utils.js';
6
7
  import { SlotObserver } from '@vaadin/component-base/src/slot-observer.js';
7
8
  import { OverlayMixin } from '@vaadin/overlay/src/vaadin-overlay-mixin.js';
8
9
  import { setOverlayStateAttribute } from '@vaadin/overlay/src/vaadin-overlay-utils.js';
@@ -59,6 +60,15 @@ export const DialogOverlayMixin = (superClass) =>
59
60
  return this.owner;
60
61
  }
61
62
 
63
+ /**
64
+ * Returns true if the overlay contains focus, including nested shadow roots.
65
+ *
66
+ * @return {boolean}
67
+ */
68
+ containsFocus() {
69
+ return this._deepContains(getDeepActiveElement());
70
+ }
71
+
62
72
  /**
63
73
  * Override method from OverlayMixin to use slotted div as a renderer root.
64
74
  * @protected
@@ -7,6 +7,7 @@ import { html, LitElement } from 'lit';
7
7
  import { defineCustomElement } from '@vaadin/component-base/src/define.js';
8
8
  import { DirMixin } from '@vaadin/component-base/src/dir-mixin.js';
9
9
  import { PolylitMixin } from '@vaadin/component-base/src/polylit-mixin.js';
10
+ import { getOverlaysOnTop, isNestedOverlay } from '@vaadin/overlay/src/vaadin-overlay-stack-mixin.js';
10
11
  import { LumoInjectionMixin } from '@vaadin/vaadin-themable-mixin/lumo-injection-mixin.js';
11
12
  import { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
12
13
  import { dialogOverlayStyles } from './styles/vaadin-dialog-overlay-base-styles.js';
@@ -15,13 +16,12 @@ import { DialogOverlayMixin } from './vaadin-dialog-overlay-mixin.js';
15
16
  /**
16
17
  * An element used internally by `<vaadin-dialog>`. Not intended to be used separately.
17
18
  *
19
+ * @attr {string} theme - The theme variants to apply to the component.
18
20
  * @customElement vaadin-dialog-overlay
19
21
  * @extends HTMLElement
20
22
  * @private
21
23
  */
22
- export class DialogOverlay extends DialogOverlayMixin(
23
- DirMixin(ThemableMixin(PolylitMixin(LumoInjectionMixin(LitElement)))),
24
- ) {
24
+ class DialogOverlay extends DialogOverlayMixin(DirMixin(ThemableMixin(PolylitMixin(LumoInjectionMixin(LitElement))))) {
25
25
  static get is() {
26
26
  return 'vaadin-dialog-overlay';
27
27
  }
@@ -31,11 +31,11 @@ export class DialogOverlay extends DialogOverlayMixin(
31
31
  }
32
32
 
33
33
  /**
34
- * Override method from OverlayFocusMixin to use owner as focus trap root
34
+ * Override method from OverlayFocusMixin to use owner as focus root
35
35
  * @protected
36
36
  * @override
37
37
  */
38
- get _focusTrapRoot() {
38
+ get _focusRoot() {
39
39
  return this.owner;
40
40
  }
41
41
 
@@ -55,6 +55,31 @@ export class DialogOverlay extends DialogOverlayMixin(
55
55
  </div>
56
56
  `;
57
57
  }
58
+
59
+ /**
60
+ * @param {Event} event
61
+ * @protected
62
+ * @override
63
+ */
64
+ bringToFront(event) {
65
+ if (event instanceof Event) {
66
+ const path = event.composedPath();
67
+
68
+ // Do not bring overlay to front if this method is called
69
+ // on event that originates from a nested dialog content.
70
+ const isNestedDialogEvent = getOverlaysOnTop(this).some(
71
+ (overlay) => path.includes(overlay) && isNestedOverlay(this, overlay) && overlay instanceof DialogOverlay,
72
+ );
73
+
74
+ if (isNestedDialogEvent) {
75
+ return;
76
+ }
77
+ }
78
+
79
+ super.bringToFront();
80
+ }
58
81
  }
59
82
 
60
83
  defineCustomElement(DialogOverlay);
84
+
85
+ export { DialogOverlay };
@@ -17,6 +17,8 @@ export declare class DialogRendererMixinClass {
17
17
  *
18
18
  * - `root` The root container DOM element. Append your content to it.
19
19
  * - `dialog` The reference to the `<vaadin-dialog>` element.
20
+ *
21
+ * @deprecated Add content elements as children of the dialog instead
20
22
  */
21
23
  renderer: DialogRenderer | null | undefined;
22
24
 
@@ -44,6 +46,8 @@ export declare class DialogRendererMixinClass {
44
46
  * each other, with the title coming first.
45
47
  *
46
48
  * When `headerRenderer` is set, the attribute `has-header` is set on the dialog.
49
+ *
50
+ * @deprecated Add header content as children of the dialog using `slot="header-content"` instead
47
51
  */
48
52
  headerRenderer: DialogRenderer | null | undefined;
49
53
 
@@ -55,6 +59,8 @@ export declare class DialogRendererMixinClass {
55
59
  * - `dialog` The reference to the `<vaadin-dialog>` element.
56
60
  *
57
61
  * When `footerRenderer` is set, the attribute `has-footer` is set on the dialog.
62
+ *
63
+ * @deprecated Add footer content as children of the dialog using `slot="footer"` instead
58
64
  */
59
65
  footerRenderer: DialogRenderer | null | undefined;
60
66
 
@@ -63,6 +69,8 @@ export declare class DialogRendererMixinClass {
63
69
  * as well as `headerRender` and `footerRenderer` properties, if these are defined.
64
70
  *
65
71
  * It is not guaranteed that the update happens immediately (synchronously) after it is requested.
72
+ *
73
+ * @deprecated This method is only used with renderers and will be removed in Vaadin 26
66
74
  */
67
75
  requestContentUpdate(): void;
68
76
  }
@@ -15,6 +15,7 @@ export const DialogRendererMixin = (superClass) =>
15
15
  * - `root` The root container DOM element. Append your content to it.
16
16
  * - `dialog` The reference to the `<vaadin-dialog>` element.
17
17
  * @type {DialogRenderer | undefined}
18
+ * @deprecated Add content elements as children of the dialog instead
18
19
  */
19
20
  renderer: {
20
21
  type: Object,
@@ -47,6 +48,7 @@ export const DialogRendererMixin = (superClass) =>
47
48
  *
48
49
  * When `headerRenderer` is set, the attribute `has-header` is set on the dialog.
49
50
  * @type {DialogRenderer | undefined}
51
+ * @deprecated Add header content as children of the dialog using `slot="header-content"` instead
50
52
  */
51
53
  headerRenderer: {
52
54
  type: Object,
@@ -61,6 +63,7 @@ export const DialogRendererMixin = (superClass) =>
61
63
  *
62
64
  * When `footerRenderer` is set, the attribute `has-footer` is set on the dialog.
63
65
  * @type {DialogRenderer | undefined}
66
+ * @deprecated Add footer content as children of the dialog using `slot="footer"` instead
64
67
  */
65
68
  footerRenderer: {
66
69
  type: Object,
@@ -74,6 +77,8 @@ export const DialogRendererMixin = (superClass) =>
74
77
  * as well as `headerRender` and `footerRenderer` properties, if these are defined.
75
78
  *
76
79
  * It is not guaranteed that the update happens immediately (synchronously) after it is requested.
80
+ *
81
+ * @deprecated This method is only used with renderers and will be removed in Vaadin 26
77
82
  */
78
83
  requestContentUpdate() {
79
84
  if (this._overlayElement) {
@@ -3,7 +3,8 @@
3
3
  * Copyright (c) 2017 - 2026 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
- import { eventInWindow, getMouseOrFirstTouchEvent } from './vaadin-dialog-utils.js';
6
+ import { isKeyboardActive } from '@vaadin/a11y-base/src/focus-utils.js';
7
+ import { ClickTracker, eventInWindow, getMouseOrFirstTouchEvent } from './vaadin-dialog-utils.js';
7
8
  export const DialogResizableMixin = (superClass) =>
8
9
  class VaadinDialogResizableMixin extends superClass {
9
10
  static get properties() {
@@ -24,6 +25,7 @@ export const DialogResizableMixin = (superClass) =>
24
25
  super.ready();
25
26
  this._originalBounds = {};
26
27
  this._originalMouseCoords = {};
28
+ this.__resizeTracker = new ClickTracker();
27
29
  this._resizeListeners = { start: {}, resize: {}, stop: {} };
28
30
  this._addResizeListeners();
29
31
  }
@@ -35,7 +37,7 @@ export const DialogResizableMixin = (superClass) =>
35
37
  const resizer = document.createElement('div');
36
38
  this._resizeListeners.start[direction] = (e) => this._startResize(e, direction);
37
39
  this._resizeListeners.resize[direction] = (e) => this._resize(e, direction);
38
- this._resizeListeners.stop[direction] = () => this._stopResize(direction);
40
+ this._resizeListeners.stop[direction] = (e) => this._stopResize(e, direction);
39
41
  if (direction.length === 1) {
40
42
  resizer.classList.add('edge');
41
43
  }
@@ -60,6 +62,8 @@ export const DialogResizableMixin = (superClass) =>
60
62
 
61
63
  if (e.button === 0 || e.touches) {
62
64
  e.preventDefault();
65
+ // `preventDefault()` above cancels the native focus change, restored in `_stopResize()`
66
+ this.__resizeTracker.start(e);
63
67
 
64
68
  this._originalBounds = this.$.overlay.getBounds();
65
69
  const event = getMouseOrFirstTouchEvent(e);
@@ -127,10 +131,16 @@ export const DialogResizableMixin = (superClass) =>
127
131
  }
128
132
 
129
133
  /**
134
+ * @param {!MouseEvent | !TouchEvent} e
130
135
  * @param {!DialogResizableDirection} direction
131
136
  * @protected
132
137
  */
133
- _stopResize(direction) {
138
+ _stopResize(e, direction) {
139
+ // Focus on click, not on resize, so that resizing the dialog doesn't interrupt editing
140
+ if (this.__resizeTracker.isClick(e) && !this.$.overlay.containsFocus()) {
141
+ this.focus({ preventScroll: true, focusVisible: isKeyboardActive() });
142
+ }
143
+
134
144
  window.removeEventListener('mousemove', this._resizeListeners.resize[direction]);
135
145
  window.removeEventListener('touchmove', this._resizeListeners.resize[direction]);
136
146
  window.removeEventListener('mouseup', this._resizeListeners.stop[direction]);
@@ -6,6 +6,7 @@
6
6
 
7
7
  /**
8
8
  * Checks if the argument is a touch event and if so, returns a first touch.
9
+ * On `touchend`, `touches` is empty and the released point is in `changedTouches`.
9
10
  * Otherwise, if the mouse event was passed, returns it as is.
10
11
  */
11
12
  declare function getMouseOrFirstTouchEvent(e: MouseEvent | TouchEvent): MouseEvent | Touch;
@@ -18,3 +19,18 @@ export { getMouseOrFirstTouchEvent };
18
19
  declare function eventInWindow(e: MouseEvent | TouchEvent): boolean;
19
20
 
20
21
  export { eventInWindow };
22
+
23
+ /**
24
+ * Remembers where a pointer gesture started, to tell a click from a drag once it ends.
25
+ */
26
+ export declare class ClickTracker {
27
+ /**
28
+ * Stores the position where the gesture started.
29
+ */
30
+ start(e: MouseEvent | TouchEvent): void;
31
+
32
+ /**
33
+ * Returns true if the pointer hasn't moved since the gesture started.
34
+ */
35
+ isClick(e: MouseEvent | TouchEvent): boolean;
36
+ }
@@ -6,13 +6,14 @@
6
6
 
7
7
  /**
8
8
  * Checks if the argument is a touch event and if so, returns a first touch.
9
+ * On `touchend`, `touches` is empty and the released point is in `changedTouches`.
9
10
  * Otherwise, if the mouse event was passed, returns it as is.
10
11
  * @param {!MouseEvent | !TouchEvent} e
11
12
  * @return {!MouseEvent | !Touch}
12
13
  * @protected
13
14
  */
14
15
  export function getMouseOrFirstTouchEvent(e) {
15
- return e.touches ? e.touches[0] : e;
16
+ return e.touches ? e.touches[0] || e.changedTouches[0] : e;
16
17
  }
17
18
 
18
19
  /**
@@ -24,3 +25,35 @@ export function getMouseOrFirstTouchEvent(e) {
24
25
  export function eventInWindow(e) {
25
26
  return e.clientX >= 0 && e.clientX <= window.innerWidth && e.clientY >= 0 && e.clientY <= window.innerHeight;
26
27
  }
28
+
29
+ // Pointer movement in pixels above which a gesture is a drag, not a click.
30
+ // Same value as `TRACK_DISTANCE` in `@vaadin/component-base/src/gestures.js`.
31
+ const DRAG_DISTANCE = 5;
32
+
33
+ /**
34
+ * Remembers where a pointer gesture started, to tell a click from a drag once it ends.
35
+ */
36
+ export class ClickTracker {
37
+ /** @type {{ x: number, y: number }} */
38
+ #start;
39
+
40
+ /**
41
+ * Stores the position where the gesture started.
42
+ * @param {!MouseEvent | !TouchEvent} e
43
+ */
44
+ start(e) {
45
+ // Viewport coordinates, so scrolling during the gesture doesn't count as movement
46
+ const { clientX, clientY } = getMouseOrFirstTouchEvent(e);
47
+ this.#start = { x: clientX, y: clientY };
48
+ }
49
+
50
+ /**
51
+ * Returns true if the pointer hasn't moved since the gesture started.
52
+ * @param {!MouseEvent | !TouchEvent} e
53
+ * @return {boolean}
54
+ */
55
+ isClick(e) {
56
+ const { clientX, clientY } = getMouseOrFirstTouchEvent(e);
57
+ return Math.abs(clientX - this.#start.x) < DRAG_DISTANCE && Math.abs(clientY - this.#start.y) < DRAG_DISTANCE;
58
+ }
59
+ }
@@ -78,9 +78,27 @@ export type DialogEventMap = DialogCustomEventMap & HTMLElementEventMap;
78
78
  /**
79
79
  * `<vaadin-dialog>` is a Web Component for creating customized modal dialogs.
80
80
  *
81
- * ### Rendering
81
+ * ```html
82
+ * <vaadin-dialog header-title="Title">
83
+ * <div>Dialog content</div>
84
+ * <div slot="footer">Footer</div>
85
+ * </vaadin-dialog>
86
+ * ```
87
+ *
88
+ * ### Slots
89
+ *
90
+ * Dialog supports following slots for providing content:
91
+ *
92
+ * Name | Description
93
+ * -----------------|-------------
94
+ * (none) | Default slot for the content
95
+ * `header-content` | Slot for the header content
96
+ * `footer` | Slot for the footer content
97
+ *
98
+ * #### Renderer (deprecated)
82
99
  *
83
- * The content of the dialog can be populated by using the renderer callback function.
100
+ * The content of the dialog can also be populated by using the renderer callback functions,
101
+ * although this approach is deprecated in favor of slotted content.
84
102
  *
85
103
  * The renderer function provides `root`, `dialog` arguments.
86
104
  * Generate DOM content, append it to the `root` element and control the state
@@ -121,8 +139,8 @@ export type DialogEventMap = DialogCustomEventMap & HTMLElementEventMap;
121
139
  * Attribute | Description
122
140
  * -----------------|--------------------------------------------
123
141
  * `has-title` | Set when the element has a title
124
- * `has-header` | Set when the element has header renderer
125
- * `has-footer` | Set when the element has footer renderer
142
+ * `has-header` | Set when the element has header content
143
+ * `has-footer` | Set when the element has footer content
126
144
  * `overflow` | Set to `top`, `bottom`, none or both
127
145
  *
128
146
  * The following custom CSS properties are available for styling:
@@ -144,6 +162,7 @@ export type DialogEventMap = DialogCustomEventMap & HTMLElementEventMap;
144
162
  * |`--vaadin-dialog-title-font-size` |
145
163
  * |`--vaadin-dialog-title-font-weight` |
146
164
  * |`--vaadin-dialog-title-line-height` |
165
+ * |`--vaadin-dialog-toolbar-gap` |
147
166
  * |`--vaadin-overlay-backdrop-background` |
148
167
  *
149
168
  * See [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.
@@ -21,9 +21,27 @@ export { DialogOverlay } from './vaadin-dialog-overlay.js';
21
21
  /**
22
22
  * `<vaadin-dialog>` is a Web Component for creating customized modal dialogs.
23
23
  *
24
- * ### Rendering
24
+ * ```html
25
+ * <vaadin-dialog header-title="Title">
26
+ * <div>Dialog content</div>
27
+ * <div slot="footer">Footer</div>
28
+ * </vaadin-dialog>
29
+ * ```
30
+ *
31
+ * ### Slots
32
+ *
33
+ * Dialog supports following slots for providing content:
34
+ *
35
+ * Name | Description
36
+ * -----------------|-------------
37
+ * (none) | Default slot for the content
38
+ * `header-content` | Slot for the header content
39
+ * `footer` | Slot for the footer content
40
+ *
41
+ * #### Renderer (deprecated)
25
42
  *
26
- * The content of the dialog can be populated by using the renderer callback function.
43
+ * The content of the dialog can also be populated by using the renderer callback functions,
44
+ * although this approach is deprecated in favor of slotted content.
27
45
  *
28
46
  * The renderer function provides `root`, `dialog` arguments.
29
47
  * Generate DOM content, append it to the `root` element and control the state
@@ -64,8 +82,8 @@ export { DialogOverlay } from './vaadin-dialog-overlay.js';
64
82
  * Attribute | Description
65
83
  * -----------------|--------------------------------------------
66
84
  * `has-title` | Set when the element has a title
67
- * `has-header` | Set when the element has header renderer
68
- * `has-footer` | Set when the element has footer renderer
85
+ * `has-header` | Set when the element has header content
86
+ * `has-footer` | Set when the element has footer content
69
87
  * `overflow` | Set to `top`, `bottom`, none or both
70
88
  *
71
89
  * The following custom CSS properties are available for styling:
@@ -87,6 +105,7 @@ export { DialogOverlay } from './vaadin-dialog-overlay.js';
87
105
  * |`--vaadin-dialog-title-font-size` |
88
106
  * |`--vaadin-dialog-title-font-weight` |
89
107
  * |`--vaadin-dialog-title-line-height` |
108
+ * |`--vaadin-dialog-toolbar-gap` |
90
109
  * |`--vaadin-overlay-backdrop-background` |
91
110
  *
92
111
  * See [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.
@@ -98,6 +117,7 @@ export { DialogOverlay } from './vaadin-dialog-overlay.js';
98
117
  * @fires {CustomEvent} opened-changed - Fired when the `opened` property changes.
99
118
  * @fires {CustomEvent} closed - Fired when the dialog is closed.
100
119
  *
120
+ * @attr {string} theme - The theme variants to apply to the component.
101
121
  * @customElement vaadin-dialog
102
122
  * @extends HTMLElement
103
123
  */
@@ -153,7 +173,8 @@ class Dialog extends DialogSizeMixin(
153
173
  .withBackdrop="${!this.modeless}"
154
174
  ?resizable="${this.resizable}"
155
175
  restore-focus-on-close
156
- ?focus-trap="${!this.noFocusTrap}"
176
+ ?focus-trap="${!this.noFocusTrap && !this.modeless}"
177
+ ?autofocus="${this.modeless ? !this.noAutofocus && !this.noFocusTrap : !this.noFocusTrap}"
157
178
  exportparts="backdrop, overlay, header, title, header-content, content, footer"
158
179
  >
159
180
  <slot name="title" slot="title"></slot>
package/web-types.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/web-types",
3
3
  "name": "@vaadin/dialog",
4
- "version": "25.3.0-dev.3a3c2d7d2a",
4
+ "version": "25.3.0-rc1",
5
5
  "description-markup": "markdown",
6
6
  "contributions": {
7
7
  "html": {
8
8
  "elements": [
9
9
  {
10
10
  "name": "vaadin-dialog",
11
- "description": "`<vaadin-dialog>` is a Web Component for creating customized modal dialogs.\n\n### Rendering\n\nThe content of the dialog can be populated by using the renderer callback function.\n\nThe renderer function provides `root`, `dialog` arguments.\nGenerate DOM content, append it to the `root` element and control the state\nof the host element by accessing `dialog`. Before generating new content,\nusers are able to check if there is already content in `root` for reusing it.\n\n```html\n<vaadin-dialog id=\"dialog\"></vaadin-dialog>\n```\n```js\nconst dialog = document.querySelector('#dialog');\ndialog.renderer = function(root, dialog) {\n root.textContent = \"Sample dialog\";\n};\n```\n\nRenderer is called on the opening of the dialog.\nDOM generated during the renderer call can be reused\nin the next renderer call and will be provided with the `root` argument.\nOn first call it will be empty.\n\n### Styling\n\nThe following shadow DOM parts are available for styling:\n\nPart name | Description\n-----------------|-------------------------------------------\n`backdrop` | Backdrop of the overlay\n`overlay` | The overlay container\n`content` | The overlay content\n`header` | Element wrapping title and header content\n`header-content` | Element wrapping the header content slot\n`title` | Element wrapping the title slot\n`footer` | Element wrapping the footer slot\n\nThe following state attributes are available for styling:\n\nAttribute | Description\n-----------------|--------------------------------------------\n`has-title` | Set when the element has a title\n`has-header` | Set when the element has header renderer\n`has-footer` | Set when the element has footer renderer\n`overflow` | Set to `top`, `bottom`, none or both\n\nThe following custom CSS properties are available for styling:\n\nCustom CSS property |\n:--------------------------------------------|\n|`--vaadin-dialog-background` |\n|`--vaadin-dialog-border-color` |\n|`--vaadin-dialog-border-radius` |\n|`--vaadin-dialog-border-width` |\n|`--vaadin-dialog-max-width` |\n|`--vaadin-dialog-min-width` |\n|`--vaadin-dialog-overflow-indicator-color` |\n|`--vaadin-dialog-overflow-indicator-height` |\n|`--vaadin-dialog-padding` |\n|`--vaadin-dialog-shadow` |\n|`--vaadin-dialog-text-color` |\n|`--vaadin-dialog-title-color` |\n|`--vaadin-dialog-title-font-size` |\n|`--vaadin-dialog-title-font-weight` |\n|`--vaadin-dialog-title-line-height` |\n|`--vaadin-overlay-backdrop-background` |\n\nSee [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.",
11
+ "description": "`<vaadin-dialog>` is a Web Component for creating customized modal dialogs.\n\n```html\n<vaadin-dialog header-title=\"Title\">\n <div>Dialog content</div>\n <div slot=\"footer\">Footer</div>\n</vaadin-dialog>\n```\n\n### Slots\n\nDialog supports following slots for providing content:\n\nName | Description\n-----------------|-------------\n(none) | Default slot for the content\n`header-content` | Slot for the header content\n`footer` | Slot for the footer content\n\n#### Renderer (deprecated)\n\nThe content of the dialog can also be populated by using the renderer callback functions,\nalthough this approach is deprecated in favor of slotted content.\n\nThe renderer function provides `root`, `dialog` arguments.\nGenerate DOM content, append it to the `root` element and control the state\nof the host element by accessing `dialog`. Before generating new content,\nusers are able to check if there is already content in `root` for reusing it.\n\n```html\n<vaadin-dialog id=\"dialog\"></vaadin-dialog>\n```\n```js\nconst dialog = document.querySelector('#dialog');\ndialog.renderer = function(root, dialog) {\n root.textContent = \"Sample dialog\";\n};\n```\n\nRenderer is called on the opening of the dialog.\nDOM generated during the renderer call can be reused\nin the next renderer call and will be provided with the `root` argument.\nOn first call it will be empty.\n\n### Styling\n\nThe following shadow DOM parts are available for styling:\n\nPart name | Description\n-----------------|-------------------------------------------\n`backdrop` | Backdrop of the overlay\n`overlay` | The overlay container\n`content` | The overlay content\n`header` | Element wrapping title and header content\n`header-content` | Element wrapping the header content slot\n`title` | Element wrapping the title slot\n`footer` | Element wrapping the footer slot\n\nThe following state attributes are available for styling:\n\nAttribute | Description\n-----------------|--------------------------------------------\n`has-title` | Set when the element has a title\n`has-header` | Set when the element has header content\n`has-footer` | Set when the element has footer content\n`overflow` | Set to `top`, `bottom`, none or both\n\nThe following custom CSS properties are available for styling:\n\nCustom CSS property |\n:--------------------------------------------|\n|`--vaadin-dialog-background` |\n|`--vaadin-dialog-border-color` |\n|`--vaadin-dialog-border-radius` |\n|`--vaadin-dialog-border-width` |\n|`--vaadin-dialog-max-width` |\n|`--vaadin-dialog-min-width` |\n|`--vaadin-dialog-overflow-indicator-color` |\n|`--vaadin-dialog-overflow-indicator-height` |\n|`--vaadin-dialog-padding` |\n|`--vaadin-dialog-shadow` |\n|`--vaadin-dialog-text-color` |\n|`--vaadin-dialog-title-color` |\n|`--vaadin-dialog-title-font-size` |\n|`--vaadin-dialog-title-font-weight` |\n|`--vaadin-dialog-title-line-height` |\n|`--vaadin-dialog-toolbar-gap` |\n|`--vaadin-overlay-backdrop-background` |\n\nSee [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.",
12
12
  "attributes": [
13
13
  {
14
14
  "name": "draggable",
@@ -64,6 +64,15 @@
64
64
  ]
65
65
  }
66
66
  },
67
+ {
68
+ "name": "no-autofocus",
69
+ "description": "Set to true to prevent focus from moving into the dialog on open.\n\nThis property only works for non-modal dialogs and is ignored\nfor modal ones, where focus must always stay inside.",
70
+ "value": {
71
+ "type": [
72
+ "boolean"
73
+ ]
74
+ }
75
+ },
67
76
  {
68
77
  "name": "no-close-on-esc",
69
78
  "description": "Set to true to disable closing dialog on Escape press",
@@ -84,7 +93,7 @@
84
93
  },
85
94
  {
86
95
  "name": "no-focus-trap",
87
- "description": "Set to true to disable focus trapping.",
96
+ "description": "Set to true to prevent the dialog from receiving focus\non open and trapping it inside.",
88
97
  "value": {
89
98
  "type": [
90
99
  "boolean"
@@ -123,9 +132,7 @@
123
132
  "description": "The theme variants to apply to the component.",
124
133
  "value": {
125
134
  "type": [
126
- "string",
127
- "null",
128
- "undefined"
135
+ "string"
129
136
  ]
130
137
  }
131
138
  },
@@ -224,6 +231,15 @@
224
231
  ]
225
232
  }
226
233
  },
234
+ {
235
+ "name": "noAutofocus",
236
+ "description": "Set to true to prevent focus from moving into the dialog on open.\n\nThis property only works for non-modal dialogs and is ignored\nfor modal ones, where focus must always stay inside.",
237
+ "value": {
238
+ "type": [
239
+ "boolean"
240
+ ]
241
+ }
242
+ },
227
243
  {
228
244
  "name": "noCloseOnEsc",
229
245
  "description": "Set to true to disable closing dialog on Escape press",
@@ -244,7 +260,7 @@
244
260
  },
245
261
  {
246
262
  "name": "noFocusTrap",
247
- "description": "Set to true to disable focus trapping.",
263
+ "description": "Set to true to prevent the dialog from receiving focus\non open and trapping it inside.",
248
264
  "value": {
249
265
  "type": [
250
266
  "boolean"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/web-types",
3
3
  "name": "@vaadin/dialog",
4
- "version": "25.3.0-dev.3a3c2d7d2a",
4
+ "version": "25.3.0-rc1",
5
5
  "description-markup": "markdown",
6
6
  "framework": "lit",
7
7
  "framework-config": {
@@ -16,7 +16,7 @@
16
16
  "elements": [
17
17
  {
18
18
  "name": "vaadin-dialog",
19
- "description": "`<vaadin-dialog>` is a Web Component for creating customized modal dialogs.\n\n### Rendering\n\nThe content of the dialog can be populated by using the renderer callback function.\n\nThe renderer function provides `root`, `dialog` arguments.\nGenerate DOM content, append it to the `root` element and control the state\nof the host element by accessing `dialog`. Before generating new content,\nusers are able to check if there is already content in `root` for reusing it.\n\n```html\n<vaadin-dialog id=\"dialog\"></vaadin-dialog>\n```\n```js\nconst dialog = document.querySelector('#dialog');\ndialog.renderer = function(root, dialog) {\n root.textContent = \"Sample dialog\";\n};\n```\n\nRenderer is called on the opening of the dialog.\nDOM generated during the renderer call can be reused\nin the next renderer call and will be provided with the `root` argument.\nOn first call it will be empty.\n\n### Styling\n\nThe following shadow DOM parts are available for styling:\n\nPart name | Description\n-----------------|-------------------------------------------\n`backdrop` | Backdrop of the overlay\n`overlay` | The overlay container\n`content` | The overlay content\n`header` | Element wrapping title and header content\n`header-content` | Element wrapping the header content slot\n`title` | Element wrapping the title slot\n`footer` | Element wrapping the footer slot\n\nThe following state attributes are available for styling:\n\nAttribute | Description\n-----------------|--------------------------------------------\n`has-title` | Set when the element has a title\n`has-header` | Set when the element has header renderer\n`has-footer` | Set when the element has footer renderer\n`overflow` | Set to `top`, `bottom`, none or both\n\nThe following custom CSS properties are available for styling:\n\nCustom CSS property |\n:--------------------------------------------|\n|`--vaadin-dialog-background` |\n|`--vaadin-dialog-border-color` |\n|`--vaadin-dialog-border-radius` |\n|`--vaadin-dialog-border-width` |\n|`--vaadin-dialog-max-width` |\n|`--vaadin-dialog-min-width` |\n|`--vaadin-dialog-overflow-indicator-color` |\n|`--vaadin-dialog-overflow-indicator-height` |\n|`--vaadin-dialog-padding` |\n|`--vaadin-dialog-shadow` |\n|`--vaadin-dialog-text-color` |\n|`--vaadin-dialog-title-color` |\n|`--vaadin-dialog-title-font-size` |\n|`--vaadin-dialog-title-font-weight` |\n|`--vaadin-dialog-title-line-height` |\n|`--vaadin-overlay-backdrop-background` |\n\nSee [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.",
19
+ "description": "`<vaadin-dialog>` is a Web Component for creating customized modal dialogs.\n\n```html\n<vaadin-dialog header-title=\"Title\">\n <div>Dialog content</div>\n <div slot=\"footer\">Footer</div>\n</vaadin-dialog>\n```\n\n### Slots\n\nDialog supports following slots for providing content:\n\nName | Description\n-----------------|-------------\n(none) | Default slot for the content\n`header-content` | Slot for the header content\n`footer` | Slot for the footer content\n\n#### Renderer (deprecated)\n\nThe content of the dialog can also be populated by using the renderer callback functions,\nalthough this approach is deprecated in favor of slotted content.\n\nThe renderer function provides `root`, `dialog` arguments.\nGenerate DOM content, append it to the `root` element and control the state\nof the host element by accessing `dialog`. Before generating new content,\nusers are able to check if there is already content in `root` for reusing it.\n\n```html\n<vaadin-dialog id=\"dialog\"></vaadin-dialog>\n```\n```js\nconst dialog = document.querySelector('#dialog');\ndialog.renderer = function(root, dialog) {\n root.textContent = \"Sample dialog\";\n};\n```\n\nRenderer is called on the opening of the dialog.\nDOM generated during the renderer call can be reused\nin the next renderer call and will be provided with the `root` argument.\nOn first call it will be empty.\n\n### Styling\n\nThe following shadow DOM parts are available for styling:\n\nPart name | Description\n-----------------|-------------------------------------------\n`backdrop` | Backdrop of the overlay\n`overlay` | The overlay container\n`content` | The overlay content\n`header` | Element wrapping title and header content\n`header-content` | Element wrapping the header content slot\n`title` | Element wrapping the title slot\n`footer` | Element wrapping the footer slot\n\nThe following state attributes are available for styling:\n\nAttribute | Description\n-----------------|--------------------------------------------\n`has-title` | Set when the element has a title\n`has-header` | Set when the element has header content\n`has-footer` | Set when the element has footer content\n`overflow` | Set to `top`, `bottom`, none or both\n\nThe following custom CSS properties are available for styling:\n\nCustom CSS property |\n:--------------------------------------------|\n|`--vaadin-dialog-background` |\n|`--vaadin-dialog-border-color` |\n|`--vaadin-dialog-border-radius` |\n|`--vaadin-dialog-border-width` |\n|`--vaadin-dialog-max-width` |\n|`--vaadin-dialog-min-width` |\n|`--vaadin-dialog-overflow-indicator-color` |\n|`--vaadin-dialog-overflow-indicator-height` |\n|`--vaadin-dialog-padding` |\n|`--vaadin-dialog-shadow` |\n|`--vaadin-dialog-text-color` |\n|`--vaadin-dialog-title-color` |\n|`--vaadin-dialog-title-font-size` |\n|`--vaadin-dialog-title-font-weight` |\n|`--vaadin-dialog-title-line-height` |\n|`--vaadin-dialog-toolbar-gap` |\n|`--vaadin-overlay-backdrop-background` |\n\nSee [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.",
20
20
  "extension": true,
21
21
  "attributes": [
22
22
  {
@@ -75,6 +75,13 @@
75
75
  "kind": "expression"
76
76
  }
77
77
  },
78
+ {
79
+ "name": "?noAutofocus",
80
+ "description": "Set to true to prevent focus from moving into the dialog on open.\n\nThis property only works for non-modal dialogs and is ignored\nfor modal ones, where focus must always stay inside.",
81
+ "value": {
82
+ "kind": "expression"
83
+ }
84
+ },
78
85
  {
79
86
  "name": "?noCloseOnEsc",
80
87
  "description": "Set to true to disable closing dialog on Escape press",
@@ -91,7 +98,7 @@
91
98
  },
92
99
  {
93
100
  "name": "?noFocusTrap",
94
- "description": "Set to true to disable focus trapping.",
101
+ "description": "Set to true to prevent the dialog from receiving focus\non open and trapping it inside.",
95
102
  "value": {
96
103
  "kind": "expression"
97
104
  }