summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenri Sara <hesara@vaadin.com>2014-06-30 14:25:53 +0300
committerHenri Sara <hesara@vaadin.com>2014-06-30 14:31:19 +0300
commit5a07aa0c35f600d8823122f47f2feb6edac390ad (patch)
tree0550dfde6f858b558300665e4d9a2821fd79f737
parentb7609b97b2ea5a45f72c22055d76d985e1611dcd (diff)
parent31800c977efcb024f197ae5d8f39265050fd9777 (diff)
downloadvaadin-framework-5a07aa0c35f600d8823122f47f2feb6edac390ad.tar.gz
vaadin-framework-5a07aa0c35f600d8823122f47f2feb6edac390ad.zip
Merge branch 'master' into 7.3 and update release notes (#14105)
Change-Id: I0c7f4ac1528dda9d1ebde724854bab84092e0c10
-rw-r--r--.classpath4
-rw-r--r--.gitignore3
-rw-r--r--README.md115
-rw-r--r--WebContent/VAADIN/themes/base/fonts/fonts.scss9
-rw-r--r--WebContent/VAADIN/themes/base/notification/notification.scss23
-rw-r--r--WebContent/VAADIN/themes/tests-responsive/styles.css9
-rw-r--r--WebContent/VAADIN/themes/tests-valo/_blueprint.scss1
-rw-r--r--WebContent/VAADIN/themes/tests-valo/_flat.scss1
-rw-r--r--WebContent/VAADIN/themes/tests-valo/styles.css7312
-rw-r--r--WebContent/VAADIN/themes/tests-valo/styles.scss14
-rw-r--r--WebContent/VAADIN/themes/valo/_valo.scss2
-rw-r--r--WebContent/VAADIN/themes/valo/components/_accordion.scss109
-rw-r--r--WebContent/VAADIN/themes/valo/components/_all.scss5
-rw-r--r--WebContent/VAADIN/themes/valo/components/_button.scss72
-rw-r--r--WebContent/VAADIN/themes/valo/components/_calendar.scss26
-rw-r--r--WebContent/VAADIN/themes/valo/components/_checkbox.scss9
-rw-r--r--WebContent/VAADIN/themes/valo/components/_colorpicker.scss16
-rw-r--r--WebContent/VAADIN/themes/valo/components/_combobox.scss79
-rw-r--r--WebContent/VAADIN/themes/valo/components/_datefield.scss48
-rw-r--r--WebContent/VAADIN/themes/valo/components/_dragwrapper.scss8
-rw-r--r--WebContent/VAADIN/themes/valo/components/_formlayout.scss33
-rw-r--r--WebContent/VAADIN/themes/valo/components/_gridlayout.scss1
-rw-r--r--WebContent/VAADIN/themes/valo/components/_label.scss46
-rw-r--r--WebContent/VAADIN/themes/valo/components/_link.scss13
-rw-r--r--WebContent/VAADIN/themes/valo/components/_menubar.scss71
-rw-r--r--WebContent/VAADIN/themes/valo/components/_optiongroup.scss81
-rw-r--r--WebContent/VAADIN/themes/valo/components/_orderedlayout.scss15
-rw-r--r--WebContent/VAADIN/themes/valo/components/_panel.scss38
-rw-r--r--WebContent/VAADIN/themes/valo/components/_popupview.scss17
-rw-r--r--WebContent/VAADIN/themes/valo/components/_progressbar.scss12
-rw-r--r--WebContent/VAADIN/themes/valo/components/_richtextarea.scss7
-rw-r--r--WebContent/VAADIN/themes/valo/components/_slider.scss12
-rw-r--r--WebContent/VAADIN/themes/valo/components/_splitpanel.scss20
-rw-r--r--WebContent/VAADIN/themes/valo/components/_table.scss170
-rw-r--r--WebContent/VAADIN/themes/valo/components/_tabsheet.scss498
-rw-r--r--WebContent/VAADIN/themes/valo/components/_textarea.scss7
-rw-r--r--WebContent/VAADIN/themes/valo/components/_textfield.scss65
-rw-r--r--WebContent/VAADIN/themes/valo/components/_tree.scss15
-rw-r--r--WebContent/VAADIN/themes/valo/components/_treetable.scss45
-rw-r--r--WebContent/VAADIN/themes/valo/components/_widget.scss12
-rw-r--r--WebContent/VAADIN/themes/valo/components/_window.scss159
-rw-r--r--WebContent/VAADIN/themes/valo/fonts/_fonts.scss24
-rw-r--r--WebContent/VAADIN/themes/valo/fonts/font-awesome/fontawesome-webfont.eotbin38205 -> 0 bytes
-rw-r--r--WebContent/VAADIN/themes/valo/fonts/font-awesome/fontawesome-webfont.svg414
-rw-r--r--WebContent/VAADIN/themes/valo/fonts/font-awesome/fontawesome-webfont.ttfbin80652 -> 0 bytes
-rw-r--r--WebContent/VAADIN/themes/valo/fonts/font-awesome/fontawesome-webfont.woffbin44432 -> 0 bytes
-rw-r--r--WebContent/VAADIN/themes/valo/optional/_common-stylenames.scss157
-rw-r--r--WebContent/VAADIN/themes/valo/optional/_valo-menu.scss179
-rw-r--r--WebContent/VAADIN/themes/valo/shared/_global.scss21
-rw-r--r--WebContent/VAADIN/themes/valo/shared/_loading-indicator.scss27
-rw-r--r--WebContent/VAADIN/themes/valo/shared/_notification.scss182
-rw-r--r--WebContent/VAADIN/themes/valo/shared/_overlay.scss57
-rw-r--r--WebContent/VAADIN/themes/valo/shared/_tooltip.scss6
-rw-r--r--WebContent/VAADIN/themes/valo/shared/_variables.scss19
-rw-r--r--WebContent/VAADIN/themes/valo/util/_anim.scss102
-rw-r--r--WebContent/VAADIN/themes/valo/util/_bevel-and-shadow.scss9
-rw-r--r--WebContent/VAADIN/themes/valo/util/_color.scss34
-rw-r--r--WebContent/VAADIN/themes/valo/util/_css3.scss20
-rw-r--r--WebContent/VAADIN/themes/valo/util/_util.scss2
-rw-r--r--WebContent/WEB-INF/web.xml30
-rw-r--r--WebContent/license.html9
-rw-r--r--WebContent/release-notes.html97
-rw-r--r--build.properties3
-rwxr-xr-xbuild/ide.xml23
-rw-r--r--buildhelpers/src/com/vaadin/buildhelpers/CompileTheme.java11
-rw-r--r--client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java44
-rw-r--r--client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ConnectorBundle.java4
-rw-r--r--client-compiler/src/com/vaadin/tools/CvalAddonsChecker.java191
-rw-r--r--client-compiler/src/com/vaadin/tools/CvalChecker.java488
-rw-r--r--client-compiler/src/com/vaadin/tools/CvalChecker.properties13
-rw-r--r--client-compiler/tests/src/com/vaadin/tools/CvalAddonsCheckerTest.java184
-rw-r--r--client-compiler/tests/src/com/vaadin/tools/CvalAddonstCheckerUseCasesTest.java217
-rw-r--r--client-compiler/tests/src/com/vaadin/tools/CvalCheckerTest.java342
-rw-r--r--client/src/com/vaadin/client/AnimationUtil.java14
-rw-r--r--client/src/com/vaadin/client/ApplicationConfiguration.java46
-rw-r--r--client/src/com/vaadin/client/ApplicationConnection.java86
-rw-r--r--client/src/com/vaadin/client/ResourceLoader.java62
-rw-r--r--client/src/com/vaadin/client/TooltipInfo.java23
-rw-r--r--client/src/com/vaadin/client/Util.java19
-rw-r--r--client/src/com/vaadin/client/VTooltip.java163
-rw-r--r--client/src/com/vaadin/client/communication/TranslatedURLReference.java38
-rw-r--r--client/src/com/vaadin/client/communication/URLReference_Serializer.java12
-rw-r--r--client/src/com/vaadin/client/debug/internal/InfoSection.java2
-rw-r--r--client/src/com/vaadin/client/extensions/ResponsiveConnector.java85
-rw-r--r--client/src/com/vaadin/client/metadata/ConnectorBundleLoader.java51
-rw-r--r--client/src/com/vaadin/client/metadata/Type.java17
-rw-r--r--client/src/com/vaadin/client/ui/AbstractComponentConnector.java18
-rw-r--r--client/src/com/vaadin/client/ui/AbstractConnector.java24
-rw-r--r--client/src/com/vaadin/client/ui/VAbstractSplitPanel.java8
-rw-r--r--client/src/com/vaadin/client/ui/VCalendarPanel.java4
-rw-r--r--client/src/com/vaadin/client/ui/VColorPickerArea.java2
-rw-r--r--client/src/com/vaadin/client/ui/VFilterSelect.java111
-rw-r--r--client/src/com/vaadin/client/ui/VGridLayout.java199
-rw-r--r--client/src/com/vaadin/client/ui/VMenuBar.java86
-rw-r--r--client/src/com/vaadin/client/ui/VNotification.java156
-rw-r--r--client/src/com/vaadin/client/ui/VOverlay.java139
-rw-r--r--client/src/com/vaadin/client/ui/VPopupView.java19
-rw-r--r--client/src/com/vaadin/client/ui/VRichTextArea.java91
-rw-r--r--client/src/com/vaadin/client/ui/VScrollTable.java23
-rw-r--r--client/src/com/vaadin/client/ui/VTabsheet.java2
-rw-r--r--client/src/com/vaadin/client/ui/VUI.java25
-rw-r--r--client/src/com/vaadin/client/ui/VWindow.java12
-rw-r--r--client/src/com/vaadin/client/ui/calendar/schedule/DateCellDayEvent.java1
-rw-r--r--client/src/com/vaadin/client/ui/checkbox/CheckBoxConnector.java22
-rw-r--r--client/src/com/vaadin/client/ui/combobox/ComboBoxConnector.java33
-rw-r--r--client/src/com/vaadin/client/ui/gridlayout/GridLayoutConnector.java11
-rw-r--r--client/src/com/vaadin/client/ui/popupview/PopupViewConnector.java29
-rw-r--r--client/src/com/vaadin/client/ui/richtextarea/RichTextAreaConnector.java27
-rw-r--r--client/src/com/vaadin/client/ui/splitpanel/AbstractSplitPanelConnector.java33
-rw-r--r--client/src/com/vaadin/client/ui/tree/TreeConnector.java3
-rw-r--r--client/src/com/vaadin/client/ui/ui/UIConnector.java288
-rw-r--r--client/src/com/vaadin/client/ui/window/WindowConnector.java27
-rw-r--r--eclipse/Development Mode (vaadin).launch7
-rw-r--r--eclipse/Super Development Mode (vaadin).launch33
-rw-r--r--gwt-files.xml17
-rw-r--r--gwt/ivy.xml30
-rwxr-xr-xscripts/install-local-maven.sh22
-rw-r--r--server/src/com/vaadin/server/AbstractClientConnector.java13
-rw-r--r--server/src/com/vaadin/server/AbstractErrorMessage.java2
-rw-r--r--server/src/com/vaadin/server/BrowserWindowOpener.java13
-rw-r--r--server/src/com/vaadin/server/FontAwesome.java3
-rw-r--r--server/src/com/vaadin/server/JsonCodec.java149
-rw-r--r--server/src/com/vaadin/server/VaadinService.java2
-rw-r--r--server/src/com/vaadin/server/VaadinServlet.java36
-rw-r--r--server/src/com/vaadin/server/communication/ClientRpcWriter.java6
-rw-r--r--server/src/com/vaadin/ui/AbstractColorPicker.java9
-rw-r--r--server/src/com/vaadin/ui/AbstractComponent.java6
-rw-r--r--server/src/com/vaadin/ui/AbstractEmbedded.java7
-rw-r--r--server/src/com/vaadin/ui/AbstractMedia.java17
-rw-r--r--server/src/com/vaadin/ui/AbstractOrderedLayout.java11
-rw-r--r--server/src/com/vaadin/ui/AbstractSplitPanel.java11
-rw-r--r--server/src/com/vaadin/ui/AbstractTextField.java11
-rw-r--r--server/src/com/vaadin/ui/Button.java13
-rw-r--r--server/src/com/vaadin/ui/CustomLayout.java11
-rw-r--r--server/src/com/vaadin/ui/DateField.java3
-rw-r--r--server/src/com/vaadin/ui/DragAndDropWrapper.java7
-rw-r--r--server/src/com/vaadin/ui/Flash.java7
-rw-r--r--server/src/com/vaadin/ui/Form.java16
-rw-r--r--server/src/com/vaadin/ui/GridLayout.java28
-rw-r--r--server/src/com/vaadin/ui/Label.java14
-rw-r--r--server/src/com/vaadin/ui/MenuBar.java7
-rw-r--r--server/src/com/vaadin/ui/Panel.java11
-rw-r--r--server/src/com/vaadin/ui/PopupDateField.java9
-rw-r--r--server/src/com/vaadin/ui/PopupView.java16
-rw-r--r--server/src/com/vaadin/ui/Slider.java13
-rw-r--r--server/src/com/vaadin/ui/TextArea.java9
-rw-r--r--server/src/com/vaadin/ui/UI.java29
-rw-r--r--server/src/com/vaadin/ui/Window.java28
-rw-r--r--server/src/com/vaadin/ui/components/colorpicker/ColorPickerGradient.java16
-rw-r--r--server/src/com/vaadin/ui/components/colorpicker/ColorPickerPopup.java23
-rw-r--r--server/src/com/vaadin/ui/components/colorpicker/ColorPickerPreview.java15
-rw-r--r--server/src/com/vaadin/ui/themes/ValoTheme.java809
-rw-r--r--server/tests/src/com/vaadin/tests/server/component/StateGetDoesNotMarkDirty.java100
-rw-r--r--shared/build.xml2
-rw-r--r--shared/ivy.xml4
-rw-r--r--shared/src/com/vaadin/shared/ui/gridlayout/GridLayoutState.java12
-rw-r--r--shared/src/com/vaadin/shared/ui/ui/UIState.java3
-rw-r--r--themes/build.xml3
-rw-r--r--uitest/src/com/vaadin/launcher/DevelopmentServerLauncher.java1
-rw-r--r--uitest/src/com/vaadin/tests/VerifyBrowserVersionTest.java2
-rw-r--r--uitest/src/com/vaadin/tests/components/LongTooltip.html324
-rw-r--r--uitest/src/com/vaadin/tests/components/abstractcomponent/PrimaryStyle.java74
-rw-r--r--uitest/src/com/vaadin/tests/components/abstractcomponent/PrimaryStyleTest.java51
-rw-r--r--uitest/src/com/vaadin/tests/components/calendar/CalendarResizeOverlappingEvents.java103
-rw-r--r--uitest/src/com/vaadin/tests/components/calendar/CalendarResizeOverlappingEventsTest.java153
-rw-r--r--uitest/src/com/vaadin/tests/components/checkbox/CheckBoxRpcCount.java62
-rw-r--r--uitest/src/com/vaadin/tests/components/checkbox/CheckBoxRpcCountTest.java63
-rw-r--r--uitest/src/com/vaadin/tests/components/combobox/ComboBoxInputPrompt.java62
-rw-r--r--uitest/src/com/vaadin/tests/components/combobox/ComboBoxInputPromptTest.java70
-rw-r--r--uitest/src/com/vaadin/tests/components/combobox/ComboBoxScrollingWithArrowsTest.java81
-rw-r--r--uitest/src/com/vaadin/tests/components/combobox/ComboBoxSetNullWhenNewItemsAllowedTest.java2
-rw-r--r--uitest/src/com/vaadin/tests/components/datefield/DateFieldReadOnly.java9
-rw-r--r--uitest/src/com/vaadin/tests/components/datefield/DateFieldReadOnlyTest.java2
-rw-r--r--uitest/src/com/vaadin/tests/components/datefield/LocaleChange.java82
-rw-r--r--uitest/src/com/vaadin/tests/components/datefield/LocaleChangeTest.java62
-rw-r--r--uitest/src/com/vaadin/tests/components/draganddropwrapper/DragAndDropWrapperTooltips.html53
-rw-r--r--uitest/src/com/vaadin/tests/components/form/FormTooltips.html148
-rw-r--r--uitest/src/com/vaadin/tests/components/form/FormTooltips.java1
-rw-r--r--uitest/src/com/vaadin/tests/components/form/FormTooltipsTest.java62
-rw-r--r--uitest/src/com/vaadin/tests/components/gridlayout/GridLayoutExpandRatio.java108
-rw-r--r--uitest/src/com/vaadin/tests/components/gridlayout/GridLayoutExpandRatioTest.java70
-rw-r--r--uitest/src/com/vaadin/tests/components/gridlayout/GridLayoutHideMiddleCells.java146
-rw-r--r--uitest/src/com/vaadin/tests/components/gridlayout/GridLayoutHideMiddleCellsTest.java19
-rw-r--r--uitest/src/com/vaadin/tests/components/gridlayout/MoveComponentFromGridLayoutToInnerLayout.html37
-rw-r--r--uitest/src/com/vaadin/tests/components/gridlayout/MoveComponentsFromGridLayoutToInnerLayout.java14
-rw-r--r--uitest/src/com/vaadin/tests/components/gridlayout/MoveComponentsFromGridLayoutToInnerLayoutTest.java22
-rw-r--r--uitest/src/com/vaadin/tests/components/javascriptcomponent/JavaScriptPreloading.java65
-rw-r--r--uitest/src/com/vaadin/tests/components/javascriptcomponent/JavaScriptPreloadingTest.java74
-rwxr-xr-xuitest/src/com/vaadin/tests/components/javascriptcomponent/js_label.js11
-rwxr-xr-xuitest/src/com/vaadin/tests/components/javascriptcomponent/wholly_different.js3
-rw-r--r--uitest/src/com/vaadin/tests/components/menubar/MenuBarToolTips.html122
-rw-r--r--uitest/src/com/vaadin/tests/components/menubar/MenuBarTooltipsNearEdge.java96
-rw-r--r--uitest/src/com/vaadin/tests/components/menubar/MenuBarTooltipsNearEdgeTest.java64
-rw-r--r--uitest/src/com/vaadin/tests/components/menubar/MenuTooltip.java88
-rw-r--r--uitest/src/com/vaadin/tests/components/menubar/MenuTooltipTest.java68
-rw-r--r--uitest/src/com/vaadin/tests/components/menubar/SpaceMenuBarNavigationTest.java17
-rw-r--r--uitest/src/com/vaadin/tests/components/orderedlayout/CaptionLeak.java53
-rw-r--r--uitest/src/com/vaadin/tests/components/orderedlayout/CaptionLeakTest.java49
-rw-r--r--uitest/src/com/vaadin/tests/components/orderedlayout/TooltipOnRequiredIndicator.java81
-rw-r--r--uitest/src/com/vaadin/tests/components/orderedlayout/TooltipOnRequiredIndicatorTest.java53
-rw-r--r--uitest/src/com/vaadin/tests/components/richtextarea/RichTextAreaRelativeHeightResize.java58
-rw-r--r--uitest/src/com/vaadin/tests/components/richtextarea/RichTextAreaRelativeHeightResizeTest.java55
-rw-r--r--uitest/src/com/vaadin/tests/components/slider/SliderTooltip.html72
-rw-r--r--uitest/src/com/vaadin/tests/components/splitpanel/SplitPanelMoveComponent.java64
-rw-r--r--uitest/src/com/vaadin/tests/components/splitpanel/SplitPanelMoveComponentTest.java55
-rw-r--r--uitest/src/com/vaadin/tests/components/table/SelectAllConstantViewport.java98
-rw-r--r--uitest/src/com/vaadin/tests/components/table/SelectAllConstantViewportTest.java61
-rw-r--r--uitest/src/com/vaadin/tests/components/table/TableItemDescriptionGeneratorTest.html24
-rw-r--r--uitest/src/com/vaadin/tests/components/table/TableWithPollingTest.java58
-rw-r--r--uitest/src/com/vaadin/tests/components/ui/TooltipConfiguration.html146
-rw-r--r--uitest/src/com/vaadin/tests/components/upload/TestFileUploadTest.java128
-rw-r--r--uitest/src/com/vaadin/tests/components/window/TooltipInWindowTest.java4
-rw-r--r--uitest/src/com/vaadin/tests/extensions/ResponsiveWidthAndHeight.java50
-rw-r--r--uitest/src/com/vaadin/tests/extensions/ResponsiveWidthAndHeightTest.java64
-rw-r--r--uitest/src/com/vaadin/tests/fieldgroup/IntegerRangeValidator.html95
-rw-r--r--uitest/src/com/vaadin/tests/layouts/GridLayoutMoveComponent.html57
-rw-r--r--uitest/src/com/vaadin/tests/layouts/GridLayoutWidthChange.html47
-rw-r--r--uitest/src/com/vaadin/tests/layouts/gridlayout/GridLayoutMoveComponent.java (renamed from uitest/src/com/vaadin/tests/layouts/GridLayoutMoveComponent.java)11
-rw-r--r--uitest/src/com/vaadin/tests/layouts/gridlayout/GridLayoutMoveComponentTest.java31
-rw-r--r--uitest/src/com/vaadin/tests/layouts/gridlayout/GridLayoutWidthChange.java (renamed from uitest/src/com/vaadin/tests/layouts/GridLayoutWidthChange.java)12
-rw-r--r--uitest/src/com/vaadin/tests/layouts/gridlayout/GridLayoutWidthChangeTest.java24
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/AbstractLayoutTests.java30
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/BaseAddReplaceMove.java109
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/BaseAddReplaceMoveTest.java43
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/BaseAlignment.java67
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/BaseAlignmentTest.java36
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/BaseCaption.java44
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/BaseCaptionTest.java35
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/BaseComponentSizing.java38
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/BaseComponentSizingTest.java45
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/BaseIcon.java51
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/BaseIconTest.java37
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutExpand.java77
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutExpandTest.java49
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutForSpacingMargin.java81
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutMarginSpacingTest.java42
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutRegErrorTest.java37
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutSizing.java40
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutSizingTest.java50
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutTestUI.java288
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/BaseRegError.java60
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridAddReplaceMove.java105
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridAddReplaceMoveTest.java27
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridAlignment.java41
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridAlignmentTest.java21
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridBaseLayoutTestUI.java107
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridCaption.java35
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridCaptionTest.java27
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridComponentSizing.java32
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridComponentSizingTest.java22
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridIcon.java42
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridIconTest.java27
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutExpand.java64
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutExpandTest.java26
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutMarginSpacing.java74
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutMarginSpacingTest.java27
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutRegError.java54
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutRegErrorTest.java27
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutSizing.java32
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutSizingTest.java27
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/GridLayoutTests.java657
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HAddReplaceMove.java32
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HAddReplaceMoveTest.java22
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HAlignment.java27
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HAlignmentTest.java21
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HCaption.java32
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HCaptionTest.java22
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HComponentSizing.java36
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HComponentSizingTest.java21
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HIcon.java37
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HIconTest.java21
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutExpand.java36
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutExpandTest.java21
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutMarginSpacing.java37
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutMarginSpacingTest.java22
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutRegError.java36
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutRegErrorTest.java21
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutSizing.java36
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutSizingTest.java22
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/HorizontalLayoutTests.java597
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/LayoutTesterApplication.java147
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/LayoutTesterApplicationTest.java132
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VAddReplaceMove.java36
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VAddReplaceMoveTest.java27
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VAlignment.java25
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VAlignmentTest.java21
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VCaption.java38
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VCaptionTest.java27
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VComponentSizing.java37
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VComponentSizingTest.java21
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VIcon.java37
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VIconTest.java21
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutExpand.java37
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutExpandTest.java27
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutMarginSpacing.java37
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutMarginSpacingTest.java22
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutRegError.java36
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutRegErrorTest.java27
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutSizing.java37
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutSizingTest.java27
-rw-r--r--uitest/src/com/vaadin/tests/layouts/layouttester/VerticalLayoutTests.java634
-rw-r--r--uitest/src/com/vaadin/tests/push/PushConfigurationStreamingTest.java22
-rw-r--r--uitest/src/com/vaadin/tests/push/ReconnectTest.java26
-rw-r--r--uitest/src/com/vaadin/tests/tb3/AbstractTB3Test.java65
-rw-r--r--uitest/src/com/vaadin/tests/tb3/MultiBrowserTest.java10
-rw-r--r--uitest/src/com/vaadin/tests/tb3/TB3Runner.java8
-rw-r--r--uitest/src/com/vaadin/tests/tb3/TooltipTest.java117
-rw-r--r--uitest/src/com/vaadin/tests/themes/ThemeChangeOnTheFly.java103
-rw-r--r--uitest/src/com/vaadin/tests/themes/ThemeChangeOnTheFlyTest.java110
-rw-r--r--uitest/src/com/vaadin/tests/themes/valo/ButtonsAndLinks.java38
-rw-r--r--uitest/src/com/vaadin/tests/themes/valo/CheckBoxes.java48
-rw-r--r--uitest/src/com/vaadin/tests/themes/valo/ComboBoxes.java38
-rw-r--r--uitest/src/com/vaadin/tests/themes/valo/CommonParts.java304
-rw-r--r--uitest/src/com/vaadin/tests/themes/valo/DateFields.java18
-rw-r--r--uitest/src/com/vaadin/tests/themes/valo/Dragging.java273
-rw-r--r--uitest/src/com/vaadin/tests/themes/valo/Forms.java22
-rw-r--r--uitest/src/com/vaadin/tests/themes/valo/MenuBars.java105
-rw-r--r--uitest/src/com/vaadin/tests/themes/valo/Panels.java2
-rw-r--r--uitest/src/com/vaadin/tests/themes/valo/PopupViews.java35
-rw-r--r--uitest/src/com/vaadin/tests/themes/valo/Sliders.java15
-rw-r--r--uitest/src/com/vaadin/tests/themes/valo/Tables.java278
-rw-r--r--uitest/src/com/vaadin/tests/themes/valo/Tabsheets.java148
-rw-r--r--uitest/src/com/vaadin/tests/themes/valo/TextFields.java73
-rw-r--r--uitest/src/com/vaadin/tests/themes/valo/ValoMenuLayout.java56
-rw-r--r--uitest/src/com/vaadin/tests/themes/valo/ValoMiscTests.java85
-rw-r--r--uitest/src/com/vaadin/tests/themes/valo/ValoThemeTest.java94
-rw-r--r--uitest/src/com/vaadin/tests/tooltip/AdjacentElementsWithTooltips.java82
-rw-r--r--uitest/src/com/vaadin/tests/tooltip/AdjacentElementsWithTooltipsTest.java75
-rw-r--r--uitest/src/com/vaadin/tests/tooltip/ButtonTooltips.java (renamed from uitest/src/com/vaadin/tests/components/button/ButtonTooltips.java)8
-rw-r--r--uitest/src/com/vaadin/tests/tooltip/ButtonTooltipsTest.java53
-rw-r--r--uitest/src/com/vaadin/tests/tooltip/DragAndDropWrapperTooltips.java (renamed from uitest/src/com/vaadin/tests/components/draganddropwrapper/DragAndDropWrapperTooltips.java)16
-rw-r--r--uitest/src/com/vaadin/tests/tooltip/DragAndDropWrapperTooltipsTest.java44
-rw-r--r--uitest/src/com/vaadin/tests/tooltip/LongTooltip.java (renamed from uitest/src/com/vaadin/tests/components/LongTooltip.java)7
-rw-r--r--uitest/src/com/vaadin/tests/tooltip/LongTooltipTest.java47
-rw-r--r--uitest/src/com/vaadin/tests/tooltip/SliderTooltip.java42
-rw-r--r--uitest/src/com/vaadin/tests/tooltip/SliderTooltipTest.java40
-rw-r--r--uitest/src/com/vaadin/tests/tooltip/StationaryTooltip.java31
-rw-r--r--uitest/src/com/vaadin/tests/tooltip/StationaryTooltipTest.java77
-rw-r--r--uitest/src/com/vaadin/tests/tooltip/TooltipAndJavascript.java48
-rw-r--r--uitest/src/com/vaadin/tests/tooltip/TooltipAndJavascriptTest.java54
-rw-r--r--uitest/src/com/vaadin/tests/tooltip/TooltipConfiguration.java (renamed from uitest/src/com/vaadin/tests/components/ui/TooltipConfiguration.java)36
-rw-r--r--uitest/src/com/vaadin/tests/tooltip/TooltipConfigurationTest.java73
-rw-r--r--uitest/src/com/vaadin/tests/tooltip/ValidatorCaptionTooltip.java62
-rw-r--r--uitest/src/com/vaadin/tests/tooltip/ValidatorCaptionTooltipTest.java46
-rw-r--r--uitest/src/com/vaadin/tests/tooltip/tooltipandjavascript.js1
-rw-r--r--uitest/src/com/vaadin/tests/widgetset/client/AbstractSuperclassForBean.java26
-rw-r--r--uitest/src/com/vaadin/tests/widgetset/client/BeanWithAbstractSuperclass.java24
-rw-r--r--uitest/src/com/vaadin/tests/widgetset/client/SerializerTestState.java2
-rw-r--r--uitest/tb3test.xml2
349 files changed, 14446 insertions, 13504 deletions
diff --git a/.classpath b/.classpath
index a6e494c5c3..62c06df6c8 100644
--- a/.classpath
+++ b/.classpath
@@ -6,6 +6,7 @@
<classpathentry kind="src" path="client/src"/>
<classpathentry kind="src" path="server/src"/>
<classpathentry kind="src" path="client-compiler/src"/>
+ <classpathentry kind="src" path="client-compiler/tests/src"/>
<classpathentry kind="src" path="uitest/src"/>
<classpathentry kind="src" path="buildhelpers/src"/>
<classpathentry kind="src" path="shared/src"/>
@@ -22,8 +23,7 @@
<classpathentry exported="true" kind="con" path="org.apache.ivyde.eclipse.cpcontainer.IVYDE_CONTAINER/?project=vaadin&amp;ivyXmlPath=push%2Fivy.xml&amp;confs=ide&amp;ivySettingsPath=%24%7Bworkspace_loc%3Avaadin%2Fivysettings.xml%7D&amp;loadSettingsOnDemand=false&amp;propertyFiles="/>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
- <classpathentry combineaccessrules="false" kind="src" path="/gwt-dev"/>
- <classpathentry combineaccessrules="false" kind="src" path="/gwt-user"/>
<classpathentry kind="con" path="org.apache.ivyde.eclipse.cpcontainer.IVYDE_CONTAINER/?project=vaadin&amp;ivyXmlPath=buildhelpers%2Fivy.xml&amp;confs=ide&amp;ivySettingsPath=%24%7Bworkspace_loc%3Avaadin%2Fivysettings.xml%7D&amp;loadSettingsOnDemand=false&amp;propertyFiles=build.properties"/>
+ <classpathentry kind="con" path="org.apache.ivyde.eclipse.cpcontainer.IVYDE_CONTAINER/?project=vaadin&amp;ivyXmlPath=gwt%2Fivy.xml&amp;confs=ide&amp;ivySettingsPath=%24%7Bworkspace_loc%3Avaadin%2Fivysettings.xml%7D&amp;loadSettingsOnDemand=false&amp;propertyFiles=%24%7Bworkspace_loc%3Avaadin%2Fbuild.properties%7D"/>
<classpathentry kind="output" path="build/classes"/>
</classpath>
diff --git a/.gitignore b/.gitignore
index 29b417971e..7aae059a3e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -40,6 +40,9 @@
/WebContent/VAADIN/themes/runo/common/img/ajax-loader-red.gif
/WebContent/VAADIN/themes/runo/common/img/ajax-loader-yellow.gif
+# /WebContent/VAADIN/themes/valo/
+/WebContent/VAADIN/themes/valo/styles.css
+
# /WebContent/VAADIN/widgetsets/
/WebContent/VAADIN/widgetsets
/WebContent/VAADIN/gwt-unitCache*
diff --git a/README.md b/README.md
index 7f9c1fdabc..4af40fcb48 100644
--- a/README.md
+++ b/README.md
@@ -11,34 +11,32 @@ for general instructions and requirements for contributing code to the Vaadin fr
Instructions on how to set up a working environment for developing the Vaadin
framework follow below.
-Cloning the project repositories
+Quick Setup
======
+1. <code>git clone https://github.com/vaadin/vaadin.git</code>
+1. Install IvyDE, including Ant Tasks, if needed (http://www.apache.org/dist/ant/ivyde/updatesite)
+1. Import the project into Eclipse
+1. Run build/ide.xml in Eclipse
-Vaadin 7 consists of three separate repositories
-* https://github.com/vaadin/vaadin.git
-* https://github.com/vaadin/gwt.git
-* https://github.com/vaadin/gwt-tools.git
-
-Start by cloning these repositories **into the same folder**:
-<pre><code>git clone https://github.com/vaadin/vaadin.git
-git clone https://github.com/vaadin/gwt.git
-git clone https://github.com/vaadin/gwt-tools.git</code></pre>
+For more details, see below
-The *vaadin* and *gwt* repositories contain project code. The *gwt-tools* project only contain dependency jars used by the other projects.
+Cloning the project repositories
+======
+The Vaadin repository can be cloned using
+<pre><code>git clone https://github.com/vaadin/vaadin.git</code></pre>
-Do not rename the repositories as the rest of this document relies on using the standard naming.
+or using your favorite Git tool
Setting up Eclipse to Develop Vaadin 7
=========
-Assuming you have cloned the repositories as described in “Cloning the project repositories” above, you can import the *vaadin* and *gwt* projects into Eclipse as follows:
Start Eclipse
-------------
-Start Eclipse and **use the root checkout folder** (the one containing the *vaadin*, *gwt* and *gwt-tools* folders) **as the workspace folder**
+Start Eclipse with the workspace you would like to use. It is usually a good idea to use the parent folder of the Git repository as the workspace folder.
Install IvyDE
---------
-You'll need the Apache Ivy plug-in for Eclipse to build the project later on, in “Compiling the Default Widget Set and Themes”.
+You'll need the Apache Ivy plug-in for Eclipse to build the project:
1. Go to *Help* -> *Install New Software...*
1. Enter `http://www.apache.org/dist/ant/ivyde/updatesite` in the "Work with:" text field
@@ -49,25 +47,35 @@ If you have installed IvyDE via the Eclipse Marketplace previously, **make sure*
1. Go to *Help* -> *Install New Software...*
1. Click the hyperlink in the "What is already installed?" sentence near the bottom right-hand corner
1. Verify that the list includes *Apache Ivy Ant Tasks*
+1. If it isn't included, follow the installation process above, but select only *Apache Ivy library* > *Apache Ivy Ant Tasks*
+
+
+Import the Project into the Workspace
+------------
+1. Do *File* -> *Import* -> *General* -> *Existing Projects into Workspace*
+![ImportProject](http://f.cl.ly/items/0G361519182v1z2T1o1O/Import.png "Import project")
+1. Select the *vaadin* folder (where you cloned the project)
+1. Ensure the *vaadin* project is checked
+1. Click “finish” to complete the import of Vaadin Framework
+
+The project should compile without further configuration. If the project does not compile without errors, choose *Ivy* -> *Resolve* from the vaadin project popup menu to ensure all dependencies have been resolved.
-If it isn't included, follow the installation process above, but select only *Apache Ivy library* > *Apache Ivy Ant Tasks*
+Note that the first compilation takes a while to finish as Ivy downloads dependencies used in the projects.
+
+Compiling the Default Widget Set and Themes
+--------
+Compile the default widget set by executing the default target in build/ide.xml in the vaadin project.
+In Eclipse this is done by opening build/ide.xml, right clicking on it and choosing *Run As* -> *Ant Build*.
+![CompileWidgetSet](http://cl.ly/image/1R43162b282e/build.png "Compiling the Widget Set")
-Set up the Workspace and define required variables for projects
+Set up extra workspace preferences
--------
+The following preferences need to be set to keep the project consistent. You need to do this especially to be able to contribute changes to the project.
+
1. Open *Window* -> *Preferences* (Windows) or *Eclipse* -> *Preferences* (Mac)
1. Go to *General* -> *Workspace*
1. Set *Text file encoding* to *UTF-8*
1. Set *New text file line delimiter* to *Unix*
-1. Go to *General* -> *Workspace* -> *Linked Resources*
-1. Add a new Path Variable **GWT_ROOT** referring to the gwt folder containing the gwt project
-![GWT_ROOT](http://f.cl.ly/items/430q0H0z3t362Z1A1n3L/LinkedResources.png "Defining GWT_ROOT")
-1. Go to *Java* -> *Build Path* -> *Classpath Variables*
-1. Add two new variables
- 1. GWT_TOOLS referring to the gwt-tools folder containing the dependency jars
- 1. JDK_HOME referring to your jdk installation directory
- ![GWT_TOOLS](http://f.cl.ly/items/1k2Z1n2v0p0y3l0X0D1G/ClasspathVars.png "Defining GWT_TOOLS")
-1. Go to Java -> Compiler
- 1. Check that the compliance level has been set to 1.6
1. Go to XML -> XML Files -> Editor
1. Ensure the settings are follows:
<pre><code>Line width: 72
@@ -78,61 +86,26 @@ Indent-using spaces: true
Indentation size: 4
</code></pre>
-Import the Projects into the Workspace
-------------
-1. Do *File* -> *Import* -> *General* -> *Existing Projects into Workspace*
-![ImportProject](http://f.cl.ly/items/0G361519182v1z2T1o1O/Import.png "Import project")
-1. Select the workspace folder as root directory
-1. Click “deselect all” and select
- 1. gwt-dev
- 2. gwt-user
-1. Click “finish” to complete the import of GWT
-1. Then repeat by doing *File* -> *Import* -> *General* -> *Existing Projects into Workspace*
-1. Select the workspace folder as root directory
-1. Click “deselect all” and select
- 1. vaadin
-1. Click “finish” to complete the import of Vaadin Framework
-
-![FinishImportProject](http://cl.ly/image/2W3S0P2c2p1t/Import2.png "Finishing Project Import")
-
-You should now have three projects in your workspace. If the vaadin project does not compile without errors, choose *Ivy* -> *Resolve* from the vaadin project popup menu. Now all projects should compile without errors (there might be warnings).
-
-Note that the first compilation takes a while to finish as Ivy downloads dependencies used in the projects.
-
-Compiling the Default Widget Set and Themes
---------
-Compile the default widget set by executing the default target in build/ide.xml in the vaadin project.
-In Eclipse this is done by opening build/ide.xml, right clicking on it and choosing *Run As* -> *Ant Build*.
-![CompileWidgetSet](http://cl.ly/image/1R43162b282e/build.png "Compiling the Widget Set")
-
Running a UI test
------
-The *vaadin* project includes an embedded Jetty which is used for running the UI tests.
-It is a standard Java application: *com.vaadin.launcher.DevelopmentServerLauncher*.
-Launch it in debug mode in Eclipse by right clicking on it and selecting *Debug As* -> *Java Application*.
+The *vaadin* project includes an embedded Jetty (*com.vaadin.launcher.DevelopmentServerLauncher*) which is used for running the UI tests.
+In Eclipse you can launch it using the included launch configuration: Right click on *eclipse/Development Server (vaadin).launch" and select *Debug As* -> *Development Server (vaadin)*.
-This launches a Jetty on port 8888 which allows you to run any UI class in the project by opening http://localhost:8888/run/&lt;UI class name&gt;?restartApplication in your browser, e.g. [http://localhost:8888/run/com.vaadin.tests.components.label.LabelModes?restartApplication](http://localhost:8888/run/com.vaadin.tests.components.label.LabelModes?restartApplication) (Add ?restartApplication to ensure).
+This launches a Jetty on port 8888 which allows you to run any UI class in the project by opening http://localhost:8888/run/&lt;UI class name&gt;?restartApplication in your browser, e.g. [http://localhost:8888/run/com.vaadin.tests.components.label.LabelModes?restartApplication](http://localhost:8888/run/com.vaadin.tests.components.label.LabelModes?restartApplication) (Use ?restartApplication to ensure the correct UI is shown).
Running JUnit tests
=====
-The JUnit tests for the projects can be run using
+The unit tests for the projects can be run using
<pre><code>ant test</code></pre>
-Running this in the *gwt* directory will run the GWT JUnit tests.
-Running it in the *vaadin* directory will run the Vaadin JUnit tests.
-
-Note that the included Vaadin TestBench (browser) tests currently requires access to a TestBench cluster, which is currently only available internally at Vaadin Ltd.
+Note that the included Vaadin TestBench (browser) tests require access to a TestBench cluster, currently only available internally at Vaadin Ltd.
Building a package
=====
-The distribution files can be built in a few steps. First build the *gwt* project by running
-<pre><code>ant</code></pre>
-in the *gwt* directory. The elemental package needs to be built separately:
-<pre><code>ant elemental</code></pre>
-Building the elemental package is not possible on Windows as it requires gcc.
+The distribution files can be built in two steps.
-Move to the *vaadin* project directory and unpack the previously built gwt jars
+1. Unpack required gwt jars into the project
<pre><code>ant -f gwt-files.xml unpack.gwt</code></pre>
-Then build the *vaadin* project by running
+2. Build the project by running
<pre><code>ant</code></pre>
-in the *vaadin* directory.
+in the project root directory (add -Dvaadin.version=1.2.3 to use a specific version number).
diff --git a/WebContent/VAADIN/themes/base/fonts/fonts.scss b/WebContent/VAADIN/themes/base/fonts/fonts.scss
index 2a882ab53d..608fe7c280 100644
--- a/WebContent/VAADIN/themes/base/fonts/fonts.scss
+++ b/WebContent/VAADIN/themes/base/fonts/fonts.scss
@@ -3,10 +3,10 @@
}
@mixin fonticons {
- @include font(FontAwesome, fontawesome-webfont);
+ @include v-font(FontAwesome, fontawesome-webfont);
}
-@mixin font($font-family, $file-name) {
+@mixin v-font($font-family, $file-name) {
@font-face {
font-family: '#{$font-family}';
src: url('#{$file-name}.eot');
@@ -23,3 +23,8 @@
display: inline-block;
}
}
+
+@mixin font($font-family, $file-name) {
+ @warn "The 'font' mixin is DEPRECATED. You should use the corresponding 'v-font' mixin instead.";
+ @include v-font($font-family, $file-name);
+}
diff --git a/WebContent/VAADIN/themes/base/notification/notification.scss b/WebContent/VAADIN/themes/base/notification/notification.scss
index aa70a167dc..0fc7801777 100644
--- a/WebContent/VAADIN/themes/base/notification/notification.scss
+++ b/WebContent/VAADIN/themes/base/notification/notification.scss
@@ -41,12 +41,31 @@
margin: 0;
}
.#{$primaryStyleName}-animate-out {
- @include animation(animate-out 400ms 1s);
+ @include animation(v-notification-animate-out 400ms);
+}
+
+.#{$primaryStyleName} {
+ &.v-position-top {
+ top: 0;
+ }
+ &.v-position-right {
+ right: 0;
+ }
+ &.v-position-bottom {
+ bottom: 0;
+ }
+ &.v-position-left {
+ left: 0;
+ }
+ &.v-position-assistive {
+ top: -9999px;
+ left: -9999px;
+ }
}
}
-@include keyframes(animate-out) {
+@include keyframes(v-notification-animate-out) {
100% {
opacity: 0;
}
diff --git a/WebContent/VAADIN/themes/tests-responsive/styles.css b/WebContent/VAADIN/themes/tests-responsive/styles.css
index 4bfc6dd768..db92a2a2fc 100644
--- a/WebContent/VAADIN/themes/tests-responsive/styles.css
+++ b/WebContent/VAADIN/themes/tests-responsive/styles.css
@@ -90,3 +90,12 @@
.description[width-range="701px-"] {
font-size: 30px;
}
+
+/* Styles for ResponsiveWidthAndHeight test. */
+.v-csslayout-width-and-height[width-range~="0-599px"][height-range~="0-499px"] {
+ background: blue;
+ color: #fff;
+}
+.v-csslayout-width-and-height[height-range~="500px-"][width-range~="600px-"] {
+ background: red;
+} \ No newline at end of file
diff --git a/WebContent/VAADIN/themes/tests-valo/_blueprint.scss b/WebContent/VAADIN/themes/tests-valo/_blueprint.scss
index a876a5a528..696da0b69e 100644
--- a/WebContent/VAADIN/themes/tests-valo/_blueprint.scss
+++ b/WebContent/VAADIN/themes/tests-valo/_blueprint.scss
@@ -6,6 +6,7 @@ $v-overlay-background-color: $v-background-color;
$valo-menu-background-color: $v-background-color;
$v-overlay-shadow: 0 0 0 1px rgba(#fff, .5);
$v-window-shadow: $v-overlay-shadow;
+$v-window-modality-curtain-background-color: $v-background-color;
$v-bevel: false;
$v-gradient: false;
$v-shadow: false;
diff --git a/WebContent/VAADIN/themes/tests-valo/_flat.scss b/WebContent/VAADIN/themes/tests-valo/_flat.scss
index d6e2857a83..5d2b8abbb7 100644
--- a/WebContent/VAADIN/themes/tests-valo/_flat.scss
+++ b/WebContent/VAADIN/themes/tests-valo/_flat.scss
@@ -2,6 +2,7 @@ $v-app-loading-text: "Flat Valo";
$v-font-family: "Roboto", sans-serif;
$v-font-weight: 400;
+$v-font-weight--header: 400;
$v-background-color: #fff;
$v-focus-color: rgb(150,190,90);
$v-luminance-threshold: 180;
diff --git a/WebContent/VAADIN/themes/tests-valo/styles.css b/WebContent/VAADIN/themes/tests-valo/styles.css
deleted file mode 100644
index 2e0c1b6143..0000000000
--- a/WebContent/VAADIN/themes/tests-valo/styles.css
+++ /dev/null
@@ -1,7312 +0,0 @@
-@charset "UTF-8";
-@-webkit-keyframes valo-anim-fade-in {
- 0% {
- opacity: 0; } }
-
-@-moz-keyframes valo-anim-fade-in {
- 0% {
- opacity: 0; } }
-
-@keyframes valo-anim-fade-in {
- 0% {
- opacity: 0; } }
-
-@-webkit-keyframes valo-anim-fade-out {
- 100% {
- opacity: 0; } }
-
-@-moz-keyframes valo-anim-fade-out {
- 100% {
- opacity: 0; } }
-
-@keyframes valo-anim-fade-out {
- 100% {
- opacity: 0; } }
-
-@-webkit-keyframes valo-anim-slide-down {
- 0% {
- -webkit-transform: translateY(-100%); } }
-
-@-moz-keyframes valo-anim-slide-down {
- 0% {
- -moz-transform: translateY(-100%); } }
-
-@keyframes valo-anim-slide-down {
- 0% {
- -webkit-transform: translateY(-100%);
- transform: translateY(-100%); } }
-
-@-webkit-keyframes valo-anim-slide-up {
- 0% {
- -webkit-transform: translateY(100%); } }
-
-@-moz-keyframes valo-anim-slide-up {
- 0% {
- -moz-transform: translateY(100%); } }
-
-@keyframes valo-anim-slide-up {
- 0% {
- -webkit-transform: translateY(100%);
- transform: translateY(100%); } }
-
-@-webkit-keyframes valo-anim-slide-left {
- 0% {
- -webkit-transform: translateX(100%); } }
-
-@-moz-keyframes valo-anim-slide-left {
- 0% {
- -moz-transform: translateX(100%); } }
-
-@keyframes valo-anim-slide-left {
- 0% {
- -webkit-transform: translateX(100%);
- transform: translateX(100%); } }
-
-@-webkit-keyframes valo-anim-slide-right {
- 0% {
- -webkit-transform: translateX(-100%); } }
-
-@-moz-keyframes valo-anim-slide-right {
- 0% {
- -moz-transform: translateX(-100%); } }
-
-@keyframes valo-anim-slide-right {
- 0% {
- -webkit-transform: translateX(-100%);
- transform: translateX(-100%); } }
-
-@font-face {
- font-family: FontAwesome;
- font-weight: normal;
- font-style: normal;
- src: url("../valo/fonts/font-awesome/fontawesome-webfont.eot");
- src: url("../valo/fonts/font-awesome/fontawesome-webfont.eot?#iefix") format("embedded-opentype"), url("../valo/fonts/font-awesome/fontawesome-webfont.woff") format("woff"), url("../valo/fonts/font-awesome/fontawesome-webfont.ttf") format("truetype"), url("../valo/fonts/font-awesome/fontawesome-webfont.svg#FontAwesome") format("svg"); }
-
-.FontAwesome {
- font-family: FontAwesome;
- font-style: normal;
- font-weight: normal;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
- display: inline-block;
- text-align: center;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none; }
-
-@font-face {
- font-family: 'Open Sans';
- src: url("../valo/fonts/open-sans/OpenSans-Light-webfont.eot");
- src: url("../valo/fonts/open-sans/OpenSans-Light-webfont.eot?#iefix") format("embedded-opentype"), url("../valo/fonts/open-sans/OpenSans-Light-webfont.woff") format("woff"), url("../valo/fonts/open-sans/OpenSans-Light-webfont.ttf") format("truetype");
- font-weight: 300;
- font-style: normal; }
-
-@font-face {
- font-family: 'Open Sans';
- src: url("../valo/fonts/open-sans/OpenSans-Regular-webfont.eot");
- src: url("../valo/fonts/open-sans/OpenSans-Regular-webfont.eot?#iefix") format("embedded-opentype"), url("../valo/fonts/open-sans/OpenSans-Regular-webfont.woff") format("woff"), url("../valo/fonts/open-sans/OpenSans-Regular-webfont.ttf") format("truetype");
- font-weight: 400;
- font-style: normal; }
-
-@font-face {
- font-family: 'Open Sans';
- src: url("../valo/fonts/open-sans/OpenSans-Semibold-webfont.eot");
- src: url("../valo/fonts/open-sans/OpenSans-Semibold-webfont.eot?#iefix") format("embedded-opentype"), url("../valo/fonts/open-sans/OpenSans-Semibold-webfont.woff") format("woff"), url("../valo/fonts/open-sans/OpenSans-Semibold-webfont.ttf") format("truetype");
- font-weight: 600;
- font-style: normal; }
-
-@-webkit-keyframes v-rotate-360 {
- to {
- -webkit-transform: rotate(360deg); } }
-
-@-moz-keyframes v-rotate-360 {
- to {
- -moz-transform: rotate(360deg); } }
-
-@-o-keyframes v-rotate-360 {
- to {
- -o-transform: rotate(360deg); } }
-
-@keyframes v-rotate-360 {
- to {
- transform: rotate(360deg); } }
-
-@-webkit-keyframes v-progress-start {
- 0% {
- width: 0%; }
-
- 100% {
- width: 50%; } }
-
-@-moz-keyframes v-progress-start {
- 0% {
- width: 0%; }
-
- 100% {
- width: 50%; } }
-
-@keyframes v-progress-start {
- 0% {
- width: 0%; }
-
- 100% {
- width: 50%; } }
-
-@-webkit-keyframes v-progress-delay {
- 0% {
- width: 50%; }
-
- 100% {
- width: 90%; } }
-
-@-moz-keyframes v-progress-delay {
- 0% {
- width: 50%; }
-
- 100% {
- width: 90%; } }
-
-@keyframes v-progress-delay {
- 0% {
- width: 50%; }
-
- 100% {
- width: 90%; } }
-
-@-webkit-keyframes v-progress-wait {
- 0% {
- width: 90%;
- height: 4px; }
-
- 3% {
- width: 91%;
- height: 7px; }
-
- 100% {
- width: 96%;
- height: 7px; } }
-
-@-moz-keyframes v-progress-wait {
- 0% {
- width: 90%;
- height: 4px; }
-
- 3% {
- width: 91%;
- height: 7px; }
-
- 100% {
- width: 96%;
- height: 7px; } }
-
-@keyframes v-progress-wait {
- 0% {
- width: 90%;
- height: 4px; }
-
- 3% {
- width: 91%;
- height: 7px; }
-
- 100% {
- width: 96%;
- height: 7px; } }
-
-@-webkit-keyframes v-progress-wait-pulse {
- 0% {
- opacity: 1; }
-
- 50% {
- opacity: .1; }
-
- 100% {
- opacity: 1; } }
-
-@-moz-keyframes v-progress-wait-pulse {
- 0% {
- opacity: 1; }
-
- 50% {
- opacity: .1; }
-
- 100% {
- opacity: 1; } }
-
-@keyframes v-progress-wait-pulse {
- 0% {
- opacity: 1; }
-
- 50% {
- opacity: .1; }
-
- 100% {
- opacity: 1; } }
-
-.v-shadow,
-.v-shadow-window {
- display: none; }
- .v-ie8 .v-shadow, .v-ie8
- .v-shadow-window {
- display: block;
- /*.center {
- position: absolute;
- top: -$v-overlay-border-width;
- right: -$v-overlay-border-width;
- bottom: -$v-overlay-border-width;
- left: -$v-overlay-border-width;
- background: darken(valo-overlay-background-color(), $v-bevel-depth);
- filter: alpha(opacity=round($v-bevel-depth/1%));
- }*/ }
- .v-ie8 .v-shadow .top, .v-ie8
- .v-shadow-window .top {
- position: absolute;
- top: -2px;
- right: 4px;
- bottom: 2px;
- left: -4px;
- background: black;
- filter: alpha(opacity=5) progid:DXImageTransform.Microsoft.blur(pixelradius=4, makeShadow=true); }
- .v-ie8 .v-shadow .top-left, .v-ie8
- .v-shadow-window .top-left {
- position: absolute;
- top: -1px;
- right: -1px;
- bottom: -1px;
- left: -1px;
- background: black;
- filter: alpha(opacity=10) progid:DXImageTransform.Microsoft.blur(pixelradius=0, makeShadow=true); }
-
-@-webkit-keyframes valo-overlay-open {
- 0% {
- -webkit-transform: translatey(-3px);
- opacity: 0; } }
-
-@-moz-keyframes valo-overlay-open {
- 0% {
- -moz-transform: translatey(-3px);
- opacity: 0; } }
-
-@keyframes valo-overlay-open {
- 0% {
- -webkit-transform: translatey(-3px);
- transform: translatey(-3px);
- opacity: 0; } }
-
-@-webkit-keyframes valo-combobox-show-status {
- 0% {
- opacity: 0;
- -webkit-transform: translatey(-100%); } }
-
-@-moz-keyframes valo-combobox-show-status {
- 0% {
- opacity: 0;
- -moz-transform: translatey(-100%); } }
-
-@keyframes valo-combobox-show-status {
- 0% {
- opacity: 0;
- -webkit-transform: translatey(-100%);
- transform: translatey(-100%); } }
-
-/*
-@mixin valo-splitpanel-style ($splitter-size: ) {
- > div > .v-splitpanel-hsplitter {
- width: ;
-
- div:after {
- @include valo-splitpanel-splitter-handle-style($horizontal: true);
- }
-
- &:after {
- left: 0;
- right: 0;
- }
- }
- .v-splitpanel-horizontal .v-splitpanel-second-container
-}
-*/
-@-webkit-keyframes valo-modal-window-indication {
- 0% {
- opacity: 0; }
-
- 100% {
- opacity: 1; } }
-
-@-moz-keyframes valo-modal-window-indication {
- 0% {
- opacity: 0; }
-
- 100% {
- opacity: 1; } }
-
-@keyframes valo-modal-window-indication {
- 0% {
- opacity: 0; }
-
- 100% {
- opacity: 1; } }
-
-.v-widget {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- display: inline-block;
- text-align: left;
- white-space: normal;
- line-height: 1.55; }
-
-.v-generated-body {
- overflow: hidden;
- margin: 0;
- padding: 0;
- border: 0; }
-
-.v-app {
- height: 100%;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0); }
-
-.v-ui {
- position: relative; }
-
-.v-ui.v-ui-embedded {
- margin-top: -1px;
- border-top: 1px solid transparent; }
-
-.v-ui:focus {
- outline: none; }
-
-.v-overlay-container {
- width: 0;
- height: 0; }
-
-input::-ms-clear {
- display: none; }
-
-.v-drag-element {
- z-index: 60000;
- position: absolute !important;
- cursor: default; }
-
-.v-clip {
- overflow: hidden; }
-
-.v-scrollable {
- overflow: auto;
- line-height: 0; }
-
-.v-ios.v-webkit .v-scrollable {
- -webkit-overflow-scrolling: touch; }
-
-.v-ios5.v-webkit .v-scrollable {
- -webkit-overflow-scrolling: none; }
-
-.v-assistive-device-only {
- position: absolute;
- top: -2000px;
- left: -2000px;
- width: 10px;
- overflow: hidden; }
-
-.v-icon {
- cursor: inherit; }
-
-.v-icon,
-.v-errorindicator,
-.v-required-field-indicator {
- display: inline-block;
- line-height: inherit; }
-
-.v-caption {
- display: inline-block;
- white-space: nowrap;
- line-height: 1.55; }
-
-.v-captiontext {
- display: inline-block;
- line-height: inherit; }
-
-div.v-layout.v-horizontal.v-widget {
- white-space: nowrap; }
-
-.v-layout.v-vertical > .v-expand,
-.v-layout.v-horizontal > .v-expand {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- width: 100%;
- height: 100%; }
-
-.v-slot,
-.v-spacing {
- display: inline-block;
- white-space: normal;
- vertical-align: top;
- line-height: 0; }
-
-.v-vertical > .v-slot:after {
- display: inline-block;
- clear: both;
- width: 0;
- height: 0;
- overflow: hidden; }
-
-.v-vertical > .v-slot,
-.v-vertical > .v-expand > .v-slot {
- display: block;
- clear: both; }
-
-.v-horizontal > .v-slot,
-.v-horizontal > .v-expand > .v-slot {
- height: 100%; }
-
-.v-vertical > .v-spacing,
-.v-vertical > .v-expand > .v-spacing {
- width: 0;
- display: block;
- clear: both; }
-
-.v-horizontal > .v-spacing,
-.v-horizontal > .v-expand > .v-spacing {
- height: 0; }
-
-.v-align-middle:before,
-.v-align-bottom:before,
-.v-expand > .v-align-middle:before,
-.v-expand > .v-align-bottom:before {
- content: "";
- display: inline-block;
- height: 100%;
- vertical-align: middle;
- width: 0;
- overflow: hidden; }
-
-.v-align-middle,
-.v-align-bottom {
- white-space: nowrap; }
-
-.v-align-middle > .v-widget,
-.v-align-bottom > .v-widget {
- display: inline-block; }
-
-.v-align-middle > .v-widget {
- vertical-align: middle; }
-
-.v-align-bottom > .v-widget {
- vertical-align: bottom; }
-
-.v-align-center {
- text-align: center; }
-
-.v-align-center > .v-widget {
- margin-left: auto;
- margin-right: auto; }
-
-.v-align-right {
- text-align: right; }
-
-.v-align-right > .v-widget {
- margin-left: auto; }
-
-.v-has-caption,
-.v-has-caption > .v-caption {
- display: inline-block; }
-
-.v-caption-on-left,
-.v-caption-on-right {
- white-space: nowrap; }
-
-.v-caption-on-top > .v-caption,
-.v-caption-on-bottom > .v-caption {
- display: block; }
-
-.v-caption-on-left > .v-caption {
- padding-right: .5em; }
-
-.v-caption-on-left > .v-widget,
-.v-caption-on-right > .v-widget {
- display: inline-block; }
-
-.v-has-caption.v-has-width > .v-widget {
- width: 100% !important; }
-
-.v-has-caption.v-has-height > .v-widget {
- height: 100% !important; }
-
-.v-gridlayout {
- position: relative;
- line-height: 0; }
-
-.v-gridlayout-slot {
- position: absolute;
- line-height: 1.55; }
-
-.v-gridlayout-spacing-on {
- overflow: hidden; }
-
-.v-gridlayout-spacing,
-.v-gridlayout-spacing-off {
- padding-left: 0;
- padding-top: 0; }
-
-.v-gridlayout-spacing-off {
- overflow: hidden; }
-
-.v-calendar-month-day-scrollable {
- overflow-y: scroll; }
-
-.v-calendar-week-wrapper {
- position: relative;
- overflow: hidden; }
-
-.v-calendar-current-time {
- position: absolute;
- left: 0;
- width: 100%;
- height: 1px;
- background: red;
- z-index: 2; }
-
-.v-calendar-event-resizetop,
-.v-calendar-event-resizebottom {
- position: absolute;
- height: 5%;
- min-height: 3px;
- width: 100%;
- z-index: 1; }
-
-.v-calendar-event-resizetop {
- cursor: row-resize;
- top: 0; }
-
-.v-calendar-event-resizebottom {
- cursor: row-resize;
- bottom: 0; }
-
-.v-calendar-header-month td:first-child {
- padding-left: 20px; }
-
-.v-calendar-month-sizedheight .v-calendar-month-day {
- height: 100px; }
-
-.v-calendar-month-sizedwidth .v-calendar-month-day {
- width: 100px; }
-
-.v-calendar-header-month-Hsized .v-calendar-header-day {
- width: 101px; }
-
-.v-calendar-header-month-Hsized td:first-child {
- padding-left: 21px; }
-
-.v-calendar-header-day-Hsized {
- width: 200px; }
-
-.v-calendar-week-numbers-Vsized .v-calendar-week-number {
- height: 100px;
- line-height: 100px; }
-
-.v-calendar-week-wrapper-Vsized {
- height: 400px;
- overflow-x: hidden !important; }
-
-.v-calendar-times-Vsized .v-calendar-time {
- height: 38px; }
-
-.v-calendar-times-Hsized .v-calendar-time {
- width: 42px; }
-
-.v-calendar-day-times-Vsized .v-datecellslot,
-.v-calendar-day-times-Vsized .v-datecellslot-even {
- height: 18px; }
-
-.v-calendar-day-times-Hsized,
-.v-calendar-day-times-Hsized .v-datecellslot,
-.v-calendar-day-times-Hsized .v-datecellslot-even {
- width: 200px; }
-
-.v-colorpicker-popup.v-window {
- min-width: 220px !important; }
-
-.v-colorpicker-gradient-container {
- overflow: visible !important; }
-
-.v-colorpicker-gradient-clicklayer {
- opacity: 0;
- filter: alpha(opacity=0); }
-
-.rgb-gradient .v-colorpicker-gradient-background {
- background: url(../valo/components/img/colorpicker/gradient2.png); }
-
-.hsv-gradient .v-colorpicker-gradient-foreground {
- background: url(../valo/components/img/colorpicker/gradient.png); }
-
-.v-colorpicker-gradient-higherbox:before {
- content: "";
- width: 11px;
- height: 11px;
- border-radius: 7px;
- border: 1px solid #fff;
- box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.3), inset 0 0 0 1px rgba(0, 0, 0, 0.3);
- position: absolute;
- bottom: -6px;
- left: -6px; }
-
-.v-colorpicker-popup .v-slider.v-slider-red:before {
- background-color: red; }
-
-.v-colorpicker-popup .v-slider.v-slider-green:before {
- background-color: green; }
-
-.v-colorpicker-popup .v-slider.v-slider-blue:before {
- background-color: blue; }
-
-.v-colorpicker-popup .v-slider.hue-slider:before {
- background: url(../valo/components/img/colorpicker/slider_hue_bg.png); }
-
-.v-colorpicker-popup input.v-textfield-dark {
- color: #fff; }
-
-.v-colorpicker-popup input.v-textfield-light {
- color: #000; }
-
-.v-colorpicker-grid {
- height: 319px; }
-
-.v-colorpicker-popup .colorselect td {
- line-height: 15px; }
-
-.v-table-header table,
-.v-table-footer table,
-.v-table-table {
- border-spacing: 0;
- border-collapse: separate;
- margin: 0;
- padding: 0;
- border: 0;
- line-height: 1.55; }
-
-.v-table-resizer,
-.v-table-sort-indicator {
- float: right; }
-
-.v-table-cell-wrapper {
- overflow: hidden; }
-
-.v-table-caption-container-align-right {
- text-align: right; }
-
-.v-table-header td,
-.v-table-footer td,
-.v-table-cell-content {
- padding: 0; }
-
-.v-table-sort-indicator {
- width: 0; }
-
-.v-tabsheet-hidetabs > .v-tabsheet-tabcontainer,
-.v-tabsheet-spacertd,
-.v-tabsheet-deco,
-.v-disabled .v-tabsheet-scroller,
-.v-tabsheet .v-disabled .v-tabsheet-caption-close {
- display: none; }
-
-.v-tabsheet-content {
- position: relative; }
-
-.v-splitpanel-vertical,
-.v-splitpanel-horizontal {
- overflow: hidden;
- white-space: nowrap; }
-
-.v-splitpanel-hsplitter {
- z-index: 100;
- cursor: e-resize;
- cursor: col-resize; }
-
-.v-splitpanel-vsplitter {
- z-index: 100;
- cursor: s-resize;
- cursor: row-resize; }
-
-.v-splitpanel-hsplitter:after,
-.v-splitpanel-vsplitter:after {
- content: "";
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0; }
-.v-splitpanel-hsplitter div,
-.v-splitpanel-vsplitter div {
- width: inherit;
- height: inherit;
- overflow: hidden;
- position: relative; }
-
-.v-splitpanel-hsplitter div:before,
-.v-splitpanel-vsplitter div:before {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- content: "";
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0; }
-
-.v-disabled [class$="splitter"] div {
- cursor: default; }
- .v-disabled [class$="splitter"] div:before {
- display: none; }
-
-.v-splitpanel-horizontal .v-splitpanel-second-container {
- position: static !important;
- display: inline-block;
- vertical-align: top; }
-.v-splitpanel-horizontal .v-splitpanel-first-container {
- display: inline-block;
- vertical-align: top; }
-
-html {
- height: auto; }
-
-.v-generated-body {
- height: auto;
- overflow: auto;
- background-color: #fafafa; }
-
-.v-app,
-.v-ui.v-scrollable {
- width: auto !important;
- height: auto !important;
- overflow: visible !important; }
-
-.tests-valo.v-app, .tests-valo.v-app-loading {
- font: 300 16px/1.55 "Open Sans", sans-serif;
- color: #464646;
- background-color: #fafafa;
- cursor: default; }
-.tests-valo .v-app-loading {
- width: 100%;
- height: 100%;
- background: #fafafa; }
- .tests-valo .v-app-loading:before {
- content: "";
- position: fixed;
- z-index: 100;
- top: 45%;
- left: 50%;
- width: 28px;
- height: 28px;
- padding: 9px;
- margin-top: -24px;
- margin-left: -24px;
- background: white url("../valo/shared/img/spinner.gif") no-repeat 50%;
- border-radius: 4px; }
- .tests-valo .v-app-loading:after {
- position: fixed;
- z-index: 100;
- top: 45%;
- padding-top: 47px;
- text-align: center;
- left: 0;
- right: 0;
- content: "Default Valo"; }
-.tests-valo .v-loading-indicator {
- position: fixed !important;
- z-index: 99999;
- left: 0;
- right: auto;
- top: 0;
- width: 50%;
- opacity: 1;
- height: 4px;
- background-color: #197de1;
- pointer-events: none;
- -webkit-transition: none;
- -moz-transition: none;
- transition: none;
- -webkit-animation: v-progress-start 1000ms 200ms both;
- -moz-animation: v-progress-start 1000ms 200ms both;
- animation: v-progress-start 1000ms 200ms both; }
- .tests-valo .v-loading-indicator[style*="none"] {
- display: block !important;
- width: 100% !important;
- opacity: 0;
- -webkit-animation: none;
- -moz-animation: none;
- animation: none;
- -webkit-transition: opacity 500ms 300ms, width 300ms;
- -moz-transition: opacity 500ms 300ms, width 300ms;
- transition: opacity 500ms 300ms, width 300ms; }
-.tests-valo .v-loading-indicator-delay {
- width: 90%;
- -webkit-animation: v-progress-delay 3.8s forwards;
- -moz-animation: v-progress-delay 3.8s forwards;
- animation: v-progress-delay 3.8s forwards; }
- .v-ff .tests-valo .v-loading-indicator-delay {
- width: 50%; }
-.tests-valo .v-loading-indicator-wait {
- width: 96%;
- -webkit-animation: v-progress-wait 5s forwards, v-progress-wait-pulse 1s 4s infinite backwards;
- -moz-animation: v-progress-wait 5s forwards, v-progress-wait-pulse 1s 4s infinite backwards;
- animation: v-progress-wait 5s forwards, v-progress-wait-pulse 1s 4s infinite backwards; }
- .v-ff .tests-valo .v-loading-indicator-wait {
- width: 90%; }
-.v-ie8 .tests-valo .v-loading-indicator,
-.v-ie8 .tests-valo .v-loading-indicator-delay,
-.v-ie8 .tests-valo .v-loading-indicator-wait, .v-ie9 .tests-valo .v-loading-indicator,
-.v-ie9 .tests-valo .v-loading-indicator-delay,
-.v-ie9 .tests-valo .v-loading-indicator-wait {
- width: 28px !important;
- height: 28px;
- padding: 9px;
- background: white url("../valo/shared/img/spinner.gif") no-repeat 50%;
- border-radius: 4px;
- top: 9px;
- right: 9px;
- left: auto;
- filter: alpha(opacity=50); }
- .v-ie8 .tests-valo .v-loading-indicator[style*="none"],
- .v-ie8 .tests-valo .v-loading-indicator-delay[style*="none"],
- .v-ie8 .tests-valo .v-loading-indicator-wait[style*="none"], .v-ie9 .tests-valo .v-loading-indicator[style*="none"],
- .v-ie9 .tests-valo .v-loading-indicator-delay[style*="none"],
- .v-ie9 .tests-valo .v-loading-indicator-wait[style*="none"] {
- display: none !important; }
-.v-ie8 .tests-valo .v-loading-indicator-wait, .v-ie9 .tests-valo .v-loading-indicator-wait {
- filter: alpha(opacity=100); }
-.tests-valo .v-scrollable:focus {
- outline: none; }
-.tests-valo img.v-icon {
- vertical-align: middle; }
-.tests-valo .v-caption {
- font-size: 14px;
- font-weight: 400;
- padding-bottom: .3em;
- padding-left: 1px; }
-.tests-valo .v-caption-on-left .v-caption,
-.tests-valo .v-caption-on-right .v-caption {
- padding-top: 0;
- padding-bottom: 0; }
-.tests-valo .v-icon + .v-captiontext,
-.tests-valo .v-icon + span {
- margin-left: 7px; }
- .tests-valo .v-icon + .v-captiontext:empty,
- .tests-valo .v-icon + span:empty {
- margin-left: 0; }
-.tests-valo .v-errorindicator {
- color: #ed473b;
- font-weight: 600;
- width: 19px;
- text-align: center; }
- .tests-valo .v-errorindicator:before {
- content: "!"; }
-.tests-valo .v-required-field-indicator {
- color: #ed473b;
- padding: 0 .2em; }
-.tests-valo select {
- font: inherit;
- font-weight: 400;
- line-height: inherit;
- color: inherit;
- padding: 5px;
- margin: 0;
- border-radius: 4px;
- border: 1px solid #cecece;
- background-color: #fafafa;
- background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);
- background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); }
- .tests-valo select:focus {
- outline: none;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
-.tests-valo button {
- font: inherit;
- font-weight: 400;
- line-height: 1.55; }
-.tests-valo a {
- cursor: pointer;
- color: #197de1;
- text-decoration: underline;
- font-weight: inherit;
- -webkit-transition: color 140ms;
- -moz-transition: color 140ms;
- transition: color 140ms; }
- .tests-valo a:hover {
- color: #4396ea; }
-.tests-valo .v-disabled {
- cursor: default !important; }
-.tests-valo .v-drag-element {
- background: #fafafa;
- color: #464646;
- box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
- border-radius: 4px;
- overflow: hidden;
- opacity: 0.5;
- filter: alpha(opacity=50); }
-.tests-valo .v-tooltip {
- background-color: #323232;
- background-color: rgba(50, 50, 50, 0.9);
- box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);
- color: white;
- padding: 5px 9px;
- border-radius: 3px;
- max-width: 35em;
- overflow: hidden !important;
- font-size: 14px; }
- .tests-valo .v-tooltip div[style*="width"] {
- width: auto !important; }
- .tests-valo .v-tooltip .v-errormessage {
- background-color: white;
- background-color: white;
- color: #ed473b;
- margin: -5px -9px;
- padding: 5px 9px;
- max-height: 10em;
- overflow: auto;
- font-weight: 400; }
- .tests-valo .v-tooltip .v-errormessage h2:only-child {
- font: inherit;
- line-height: inherit; }
- .tests-valo .v-tooltip .v-tooltip-text {
- max-height: 10em;
- overflow: auto;
- margin-top: 10px; }
- .tests-valo .v-tooltip .v-errormessage[aria-hidden="true"] + .v-tooltip-text {
- margin-top: 0; }
- .tests-valo .v-tooltip h1,
- .tests-valo .v-tooltip h2,
- .tests-valo .v-tooltip h3,
- .tests-valo .v-tooltip h4 {
- color: inherit; }
-.tests-valo .v-contextmenu {
- padding: 4px 4px;
- border-radius: 4px;
- background-color: white;
- color: #474747;
- box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.05), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.1);
- -webkit-animation: valo-overlay-open 200ms;
- -moz-animation: valo-overlay-open 200ms;
- animation: valo-overlay-open 200ms;
- -webkit-backface-visibility: hidden;
- -moz-backface-visibility: hidden;
- -ms-backface-visibility: hidden;
- backface-visibility: hidden;
- padding: 4px 4px; }
- .tests-valo .v-contextmenu table {
- border-spacing: 0; }
-.tests-valo .v-contextmenu .gwt-MenuItem {
- cursor: pointer;
- line-height: 27px;
- padding: 0 20px 0 10px;
- border-radius: 3px;
- font-weight: 400;
- white-space: nowrap;
- position: relative; }
- .tests-valo .v-contextmenu .gwt-MenuItem:active:before {
- content: "";
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- background: #0957a6;
- opacity: 0.15;
- filter: alpha(opacity=15);
- pointer-events: none;
- border-radius: inherit; }
- .tests-valo .v-contextmenu .gwt-MenuItem .v-icon {
- max-height: 27px;
- margin-right: 5px;
- min-width: 1em; }
-.tests-valo .v-contextmenu .gwt-MenuItem-selected {
- background-color: #197de1;
- background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);
- background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);
- color: #ecf2f8; }
-.tests-valo .v-absolutelayout-wrapper {
- position: absolute; }
-.tests-valo .v-absolutelayout-margin,
-.tests-valo .v-absolutelayout-canvas {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box; }
-.tests-valo .v-absolutelayout.v-has-height > div,
-.tests-valo .v-absolutelayout.v-has-height .v-absolutelayout-margin {
- height: 100%; }
-.tests-valo .v-absolutelayout.v-has-height > div,
-.tests-valo .v-absolutelayout.v-has-width .v-absolutelayout-margin {
- width: 100%; }
-.tests-valo .v-margin-top {
- padding-top: 37px; }
-.tests-valo .v-margin-right {
- padding-right: 37px; }
-.tests-valo .v-margin-bottom {
- padding-bottom: 37px; }
-.tests-valo .v-margin-left {
- padding-left: 37px; }
-.tests-valo .v-spacing {
- width: 12px;
- height: 12px; }
-.tests-valo .v-button {
- position: relative;
- text-align: center;
- white-space: nowrap;
- outline: none;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
- -webkit-touch-callout: none;
- cursor: pointer;
- height: 37px;
- padding: 0 16px;
- color: #2f2f2f;
- font-weight: 400;
- border-radius: 4px;
- border: 1px solid #cecece;
- border-top-color: #cecece;
- border-bottom-color: #c5c5c5;
- background-color: #fafafa;
- background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);
- background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);
- box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #eaeaea, 0 2px 3px rgba(0, 0, 0, 0.05);
- text-shadow: 0 1px 0 #fafafa; }
- .tests-valo .v-button:before {
- content: "";
- display: inline-block;
- width: 0;
- height: 100%;
- vertical-align: middle; }
- .tests-valo .v-button > div {
- vertical-align: middle; }
- .v-sa .tests-valo .v-button:before {
- height: 110%; }
- .v-ff .tests-valo .v-button:before {
- height: 107%; }
- .v-ie .tests-valo .v-button:before {
- margin-top: 4px; }
- .tests-valo .v-button:after {
- content: "";
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- border-radius: inherit;
- -webkit-transition: box-shadow 180ms, border 180ms;
- -moz-transition: box-shadow 180ms, border 180ms;
- transition: box-shadow 180ms, border 180ms; }
- .tests-valo .v-button:focus:after {
- -webkit-transition: none;
- -moz-transition: none;
- transition: none; }
- .tests-valo .v-button.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-button.v-disabled:after {
- display: none; }
- .tests-valo .v-button:after {
- border: inherit;
- top: -1px;
- right: -1px;
- bottom: -1px;
- left: -1px; }
- .tests-valo .v-button:hover:after {
- background-color: rgba(186, 186, 186, 0.1); }
- .tests-valo .v-button:focus:after {
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- .tests-valo .v-button:active:after {
- background-color: rgba(125, 125, 125, 0.2); }
-.tests-valo .v-checkbox,
-.tests-valo .v-radiobutton {
- position: relative;
- line-height: 19px;
- white-space: nowrap; }
- .tests-valo .v-checkbox.v-has-width label,
- .tests-valo .v-radiobutton.v-has-width label {
- white-space: normal; }
- :root .tests-valo .v-checkbox, :root
- .tests-valo .v-radiobutton {
- padding-left: 25px; }
- :root .tests-valo .v-checkbox label, :root
- .tests-valo .v-radiobutton label {
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
- -webkit-touch-callout: none;
- cursor: pointer; }
- :root .tests-valo .v-checkbox > input, :root
- .tests-valo .v-radiobutton > input {
- position: absolute;
- clip: rect(0, 0, 0, 0);
- left: .2em;
- top: .2em;
- z-index: 0;
- margin: 0; }
- :root .tests-valo .v-checkbox > input:focus ~ label:before, :root
- .tests-valo .v-radiobutton > input:focus ~ label:before {
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #eaeaea, 0 2px 3px rgba(0, 0, 0, 0.05); }
- :root .tests-valo .v-checkbox > input ~ label:before, :root .tests-valo .v-checkbox > input ~ label:after, :root
- .tests-valo .v-radiobutton > input ~ label:before, :root
- .tests-valo .v-radiobutton > input ~ label:after {
- content: "";
- display: inline-block;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- width: 19px;
- height: 19px;
- position: absolute;
- top: 0;
- left: 0;
- border-radius: 4px;
- font-size: 13px;
- text-align: center; }
- :root .tests-valo .v-checkbox > input ~ label:before, :root
- .tests-valo .v-radiobutton > input ~ label:before {
- height: 18.5px;
- padding: 0 9px;
- color: #2f2f2f;
- font-weight: 400;
- border-radius: 4px;
- border: 1px solid #cecece;
- border-top-color: #cecece;
- border-bottom-color: #c5c5c5;
- background-color: #fafafa;
- background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);
- background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);
- box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #eaeaea, 0 2px 3px rgba(0, 0, 0, 0.05);
- text-shadow: 0 1px 0 #fafafa;
- padding: 0;
- height: 19px; }
- :root .tests-valo .v-checkbox > input ~ label:before:after, :root
- .tests-valo .v-radiobutton > input ~ label:before:after {
- border: inherit;
- top: -1px;
- right: -1px;
- bottom: -1px;
- left: -1px; }
- :root .tests-valo .v-checkbox > input ~ label:before:hover:after, :root
- .tests-valo .v-radiobutton > input ~ label:before:hover:after {
- background-color: rgba(186, 186, 186, 0.1); }
- :root .tests-valo .v-checkbox > input ~ label:before:focus:after, :root
- .tests-valo .v-radiobutton > input ~ label:before:focus:after {
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- :root .tests-valo .v-checkbox > input ~ label:before:active:after, :root
- .tests-valo .v-radiobutton > input ~ label:before:active:after {
- background-color: rgba(125, 125, 125, 0.2); }
- :root .tests-valo .v-checkbox > input ~ label:after, :root
- .tests-valo .v-radiobutton > input ~ label:after {
- content: "\f00c";
- font-family: FontAwesome;
- color: transparent;
- -webkit-transition: color 100ms;
- -moz-transition: color 100ms;
- transition: color 100ms; }
- :root .tests-valo .v-checkbox > input:active ~ label:after, :root
- .tests-valo .v-radiobutton > input:active ~ label:after {
- background-color: rgba(125, 125, 125, 0.2); }
- :root .tests-valo .v-checkbox > input:checked ~ label:after, :root
- .tests-valo .v-radiobutton > input:checked ~ label:after {
- color: #197de1; }
- :root .tests-valo .v-checkbox > input[disabled] ~ label,
- :root .tests-valo .v-checkbox > input[disabled] ~ label .v-icon,
- :root .tests-valo .v-checkbox > input[disabled] ~ .v-icon, :root
- .tests-valo .v-radiobutton > input[disabled] ~ label,
- :root
- .tests-valo .v-radiobutton > input[disabled] ~ label .v-icon,
- :root
- .tests-valo .v-radiobutton > input[disabled] ~ .v-icon {
- cursor: default; }
- :root .tests-valo .v-checkbox > input[disabled] ~ label:before,
- :root .tests-valo .v-checkbox > input[disabled] ~ label:after, :root
- .tests-valo .v-radiobutton > input[disabled] ~ label:before,
- :root
- .tests-valo .v-radiobutton > input[disabled] ~ label:after {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- :root .tests-valo .v-checkbox > input[disabled]:active ~ label:after, :root
- .tests-valo .v-radiobutton > input[disabled]:active ~ label:after {
- background: transparent; }
- .tests-valo .v-checkbox > .v-icon, .tests-valo .v-checkbox > label .v-icon,
- .tests-valo .v-radiobutton > .v-icon,
- .tests-valo .v-radiobutton > label .v-icon {
- margin: 0 6px 0 3px;
- min-width: 1em;
- cursor: pointer; }
-.tests-valo .v-filterselect {
- position: relative;
- width: 185px;
- height: 37px;
- border-radius: 4px;
- white-space: nowrap; }
- .tests-valo .v-filterselect .v-filterselect-input {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- margin: 0;
- font: inherit;
- font-weight: 400;
- line-height: normal;
- height: 37px;
- border-radius: 4px;
- padding: 4px 9px;
- border: 1px solid #cecece;
- background: white;
- color: #474747;
- box-shadow: inset 0 1px 0 #f9f9f9, 0 1px 0 rgba(255, 255, 255, 0.1);
- -webkit-transition: box-shadow 180ms, border 180ms;
- -moz-transition: box-shadow 180ms, border 180ms;
- transition: box-shadow 180ms, border 180ms;
- width: 100% !important;
- height: 100%;
- padding-right: 44px;
- border-radius: inherit; }
- .tests-valo .v-filterselect .v-filterselect-input.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-filterselect .v-filterselect-input:focus {
- outline: none;
- -webkit-transition: none;
- -moz-transition: none;
- transition: none;
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f9f9f9, 0 1px 0 rgba(255, 255, 255, 0.1); }
- .tests-valo .v-filterselect .v-filterselect-input.v-textfield-prompt, .tests-valo .v-filterselect .v-filterselect-input.v-textarea-prompt {
- color: #a3a3a3; }
- .tests-valo .v-filterselect .v-icon + .v-filterselect-input {
- padding-left: 37px; }
- .tests-valo .v-filterselect img.v-icon {
- max-height: 37px;
- margin-left: 9px; }
- .tests-valo .v-filterselect span.v-icon {
- color: #474747;
- width: 37px; }
- .tests-valo .v-filterselect.v-filterselect-prompt > .v-filterselect-input {
- color: #a3a3a3; }
- .tests-valo .v-filterselect .v-filterselect-button {
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
- -webkit-touch-callout: none;
- cursor: pointer;
- position: absolute;
- top: 1px;
- right: 1px;
- bottom: 1px;
- width: 37px;
- cursor: pointer;
- border-left: 1px solid #e8e8e8;
- border-radius: 0 3px 3px 0; }
- .v-ie8 .tests-valo .v-filterselect .v-filterselect-button {
- background-color: white; }
- .tests-valo .v-filterselect .v-filterselect-button:before {
- font-family: FontAwesome;
- content: "\f078";
- color: #474747;
- color: #a3a3a3;
- -webkit-transition: color 140ms;
- -moz-transition: color 140ms;
- transition: color 140ms;
- position: absolute;
- width: 37px;
- text-align: center;
- top: 50%;
- line-height: 1;
- margin-top: -.47em; }
- .tests-valo .v-filterselect .v-filterselect-button:hover:before {
- color: #474747; }
- .tests-valo .v-filterselect .v-filterselect-button:active:after {
- content: "";
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- border-radius: inherit;
- background-color: rgba(128, 128, 128, 0.2); }
- .tests-valo .v-filterselect.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-filterselect.v-disabled .v-filterselect-button {
- cursor: default;
- pointer-events: none; }
- .tests-valo .v-filterselect.v-disabled .v-filterselect-button:active:after {
- display: none; }
- .tests-valo .v-filterselect.v-readonly .v-filterselect-input {
- background: transparent;
- box-shadow: none; }
- .tests-valo .v-filterselect.v-readonly .v-filterselect-input:focus {
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- .tests-valo .v-filterselect.v-readonly .v-filterselect-button {
- cursor: default;
- pointer-events: none; }
- .tests-valo .v-filterselect.v-readonly .v-filterselect-button:active:after {
- display: none; }
- .tests-valo .v-filterselect .v-icon {
- position: absolute;
- pointer-events: none; }
-.tests-valo .v-filterselect-suggestpopup {
- margin-top: 5px !important; }
- .tests-valo .v-filterselect-suggestpopup .v-filterselect-suggestmenu {
- padding: 4px 4px;
- border-radius: 4px;
- background-color: white;
- color: #474747;
- box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.05), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.1);
- -webkit-animation: valo-overlay-open 200ms;
- -moz-animation: valo-overlay-open 200ms;
- animation: valo-overlay-open 200ms;
- -webkit-backface-visibility: hidden;
- -moz-backface-visibility: hidden;
- -ms-backface-visibility: hidden;
- backface-visibility: hidden;
- padding: 4px 4px;
- box-sizing: border-box;
- position: relative;
- z-index: 1; }
- .tests-valo .v-filterselect-suggestpopup table,
- .tests-valo .v-filterselect-suggestpopup tbody,
- .tests-valo .v-filterselect-suggestpopup tr,
- .tests-valo .v-filterselect-suggestpopup td {
- display: block; }
- .tests-valo .v-filterselect-suggestpopup .gwt-MenuItem {
- cursor: pointer;
- line-height: 27px;
- padding: 0 20px 0 10px;
- border-radius: 3px;
- font-weight: 400;
- white-space: nowrap;
- position: relative; }
- .tests-valo .v-filterselect-suggestpopup .gwt-MenuItem:active:before {
- content: "";
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- background: #0957a6;
- opacity: 0.15;
- filter: alpha(opacity=15);
- pointer-events: none;
- border-radius: inherit; }
- .tests-valo .v-filterselect-suggestpopup .gwt-MenuItem .v-icon {
- max-height: 27px;
- margin-right: 5px;
- min-width: 1em; }
- .tests-valo .v-filterselect-suggestpopup .gwt-MenuItem-selected {
- background-color: #197de1;
- background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);
- background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);
- color: #ecf2f8; }
- .tests-valo .v-filterselect-suggestpopup .v-filterselect-status {
- position: absolute;
- right: 4px;
- background: rgba(212, 212, 212, 0.9);
- color: #3b3b3b;
- border-radius: 0 0 4px 4px;
- height: 23px;
- bottom: -23px;
- font-size: 12px;
- line-height: 23px;
- padding: 0 6px;
- cursor: default;
- pointer-events: none;
- -webkit-animation: valo-combobox-show-status 200ms 80ms backwards;
- -moz-animation: valo-combobox-show-status 200ms 80ms backwards;
- animation: valo-combobox-show-status 200ms 80ms backwards; }
- .tests-valo .v-filterselect-suggestpopup .v-filterselect-status > * {
- color: #3b3b3b;
- text-decoration: none; }
- .tests-valo .v-filterselect-suggestpopup div[class*="page"] {
- position: absolute;
- z-index: 3;
- right: 0;
- opacity: 0.2;
- filter: alpha(opacity=20);
- cursor: pointer;
- -webkit-transition: all 200ms;
- -moz-transition: all 200ms;
- transition: all 200ms;
- width: 25px;
- height: 25px;
- line-height: 25px;
- text-align: center;
- font-family: FontAwesome;
- -webkit-transform: scale(0.8);
- -moz-transform: scale(0.8);
- -ms-transform: scale(0.8);
- -o-transform: scale(0.8);
- transform: scale(0.8);
- color: #464646; }
- .tests-valo .v-filterselect-suggestpopup div[class*="page"]:hover {
- opacity: 1;
- filter: none;
- background: rgba(250, 250, 250, 0.5); }
- .tests-valo .v-filterselect-suggestpopup div[class*="page"] span {
- display: none; }
- .tests-valo .v-filterselect-suggestpopup:hover div[class*="page"] {
- -webkit-transform: scale(1);
- -moz-transform: scale(1);
- -ms-transform: scale(1);
- -o-transform: scale(1);
- transform: scale(1); }
- .tests-valo .v-filterselect-suggestpopup div[class*="prev"] {
- top: 0;
- -webkit-transform-origin: 100% 0%;
- -moz-transform-origin: 100% 0%;
- -ms-transform-origin: 100% 0%;
- -o-transform-origin: 100% 0%;
- transform-origin: 100% 0%;
- border-radius: 0 4px 0 4px; }
- .tests-valo .v-filterselect-suggestpopup div[class*="prev"]:before {
- content: "\f0d8"; }
- .tests-valo .v-filterselect-suggestpopup div[class*="next"] {
- bottom: 0;
- -webkit-transform-origin: 100% 100%;
- -moz-transform-origin: 100% 100%;
- -ms-transform-origin: 100% 100%;
- -o-transform-origin: 100% 100%;
- transform-origin: 100% 100%;
- border-radius: 4px 0 4px 0; }
- .tests-valo .v-filterselect-suggestpopup div[class*="next"]:before {
- content: "\f0d7"; }
- .tests-valo .v-filterselect-suggestpopup div[class*="-off"] {
- display: none; }
-.tests-valo .v-filterselect-no-input {
- cursor: pointer;
- text-shadow: 0 1px 0 #fafafa; }
- .tests-valo .v-filterselect-no-input .v-filterselect-input {
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- background-color: #fafafa;
- background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);
- background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);
- cursor: inherit;
- box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #eaeaea, 0 2px 3px rgba(0, 0, 0, 0.05);
- border: 1px solid #cecece;
- border-top-color: #cecece;
- border-bottom-color: #c5c5c5;
- text-shadow: inherit;
- text-overflow: ellipsis; }
- .tests-valo .v-filterselect-no-input .v-filterselect-input:focus {
- outline: none;
- -webkit-transition: none;
- -moz-transition: none;
- transition: none;
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #eaeaea, 0 2px 3px rgba(0, 0, 0, 0.05); }
- .tests-valo .v-filterselect-no-input .v-filterselect-button {
- border-left: none !important; }
- .tests-valo .v-filterselect-no-input:hover .v-filterselect-button:before {
- color: inherit; }
-.tests-valo .v-form fieldset {
- border: none;
- padding: 0;
- margin: 0;
- height: 100%; }
-.tests-valo .v-form-content {
- height: 100%;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box; }
-.tests-valo .v-formlayout-spacing > tbody > .v-formlayout-row > .v-formlayout-captioncell,
-.tests-valo .v-formlayout-spacing > tbody > .v-formlayout-row > .v-formlayout-contentcell,
-.tests-valo .v-formlayout-spacing > tbody > .v-formlayout-row > .v-formlayout-errorcell {
- padding-top: 12px; }
-.tests-valo .v-formlayout-margin-top > tbody > .v-formlayout-firstrow > .v-formlayout-captioncell,
-.tests-valo .v-formlayout-margin-top > tbody > .v-formlayout-firstrow > .v-formlayout-contentcell,
-.tests-valo .v-formlayout-margin-top > tbody > .v-formlayout-firstrow > .v-formlayout-errorcell {
- padding-top: 37px; }
-.tests-valo .v-formlayout-margin-bottom > tbody > .v-formlayout-lastrow > .v-formlayout-captioncell,
-.tests-valo .v-formlayout-margin-bottom > tbody > .v-formlayout-lastrow > .v-formlayout-contentcell,
-.tests-valo .v-formlayout-margin-bottom > tbody > .v-formlayout-lastrow > .v-formlayout-errorcell {
- padding-bottom: 37px; }
-.tests-valo .v-formlayout-margin-left > tbody > .v-formlayout-row > .v-formlayout-captioncell {
- padding-left: 37px; }
-.tests-valo .v-formlayout-margin-right > tbody > .v-formlayout-row > .v-formlayout-contentcell {
- padding-right: 37px; }
-.tests-valo .v-formlayout > table {
- border-spacing: 0;
- position: relative;
- padding: 0 12px; }
-.tests-valo .v-formlayout.v-has-width > table,
-.tests-valo .v-formlayout.v-has-width .v-formlayout-contentcell {
- width: 100%; }
-.tests-valo .v-formlayout-error-indicator {
- width: 19px; }
-.tests-valo .v-formlayout-captioncell {
- vertical-align: top;
- line-height: 36px; }
- .tests-valo .v-formlayout-captioncell .v-caption {
- padding-bottom: 0; }
-.tests-valo .v-formlayout-contentcell .v-checkbox,
-.tests-valo .v-formlayout-contentcell .v-radiobutton {
- font-weight: 400; }
-.tests-valo .v-formlayout-contentcell > .h4 {
- position: absolute;
- left: 0;
- margin-top: -0.5em;
- padding-bottom: 0.5em;
- border-bottom: 1px solid #e4e4e4;
- color: #898989; }
-.tests-valo .v-escalator {
- position: relative;
- background-color: white; }
-.tests-valo .v-escalator-scroller {
- position: absolute;
- overflow: auto;
- z-index: 20; }
-.tests-valo .v-escalator-scroller-horizontal {
- left: 0;
- /* Left position adjusted to align with frozen columns */
- right: 0;
- bottom: 0;
- overflow-y: hidden;
- -ms-overflow-y: hidden; }
-.tests-valo .v-escalator-scroller-vertical {
- right: 0;
- top: 0;
- /* this will be overridden by code, but it's a good default behavior */
- bottom: 0;
- /* this will be overridden by code, but it's a good default behavior */
- overflow-x: hidden;
- -ms-overflow-x: hidden; }
-.tests-valo .v-escalator-tablewrapper {
- position: absolute;
- overflow: hidden; }
-.tests-valo .v-escalator-tablewrapper > table {
- border-spacing: 0;
- table-layout: fixed;
- width: inherit;
- /* a decent default fallback */ }
-.tests-valo .v-escalator-header,
-.tests-valo .v-escalator-body,
-.tests-valo .v-escalator-footer {
- position: absolute;
- left: 0;
- width: inherit;
- z-index: 10; }
-.tests-valo .v-escalator-header {
- top: 0; }
-.tests-valo .v-escalator-footer {
- bottom: 0; }
-.tests-valo .v-escalator-body {
- z-index: 0;
- top: 0; }
- .tests-valo .v-escalator-body .v-escalator-row {
- position: absolute;
- top: 0;
- left: 0; }
-.tests-valo .v-escalator-row {
- display: block; }
- .v-ie8 .tests-valo .v-escalator-row {
- /* IE8 doesn't let table rows be longer than body only with display block. Moar hax. */
- float: left;
- clear: left;
- /*
- * The inline style of margin-top from the <tbody> to offset the header's dimension is,
- * for some strange reason, inherited into each contained <tr>.
- * We need to cancel it:
- */
- margin-top: 0; }
- .tests-valo .v-escalator-row > td, .tests-valo .v-escalator-row > th {
- /* IE8 likes the bgcolor here instead of on the row */
- background-color: white; }
-.tests-valo .v-escalator-row {
- width: inherit; }
-.tests-valo .v-escalator-cell {
- display: block;
- float: left;
- border: 1px solid #aaaaaa;
- padding: 2px;
- white-space: nowrap;
- -moz-box-sizing: border-box;
- box-sizing: border-box; }
-.tests-valo .v-escalator-cell.frozen {
- position: relative;
- z-index: 0; }
-.tests-valo .v-textfield {
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- margin: 0;
- font: inherit;
- font-weight: 400;
- line-height: normal;
- height: 37px;
- border-radius: 4px;
- padding: 4px 9px;
- border: 1px solid #cecece;
- background: white;
- color: #474747;
- box-shadow: inset 0 1px 0 #f9f9f9, 0 1px 0 rgba(255, 255, 255, 0.1);
- -webkit-transition: box-shadow 180ms, border 180ms;
- -moz-transition: box-shadow 180ms, border 180ms;
- transition: box-shadow 180ms, border 180ms;
- width: 185px; }
- .tests-valo .v-textfield.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-textfield:focus {
- outline: none;
- -webkit-transition: none;
- -moz-transition: none;
- transition: none;
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f9f9f9, 0 1px 0 rgba(255, 255, 255, 0.1); }
- .tests-valo .v-textfield.v-textfield-prompt, .tests-valo .v-textfield.v-textarea-prompt {
- color: #a3a3a3; }
-.tests-valo .v-textfield-readonly {
- background: transparent;
- box-shadow: none; }
- .tests-valo .v-textfield-readonly:focus {
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
-.tests-valo .v-textfield-error {
- border-color: #ed473b;
- background: #fffbfb;
- color: #6a2823; }
-.tests-valo .v-textarea {
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- margin: 0;
- font: inherit;
- font-weight: 400;
- line-height: normal;
- height: 37px;
- border-radius: 4px;
- padding: 6px;
- border: 1px solid #cecece;
- background: white;
- color: #474747;
- box-shadow: inset 0 1px 0 #f9f9f9, 0 1px 0 rgba(255, 255, 255, 0.1);
- -webkit-transition: box-shadow 180ms, border 180ms;
- -moz-transition: box-shadow 180ms, border 180ms;
- transition: box-shadow 180ms, border 180ms;
- height: auto;
- resize: none;
- width: 185px; }
- .tests-valo .v-textarea.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-textarea:focus {
- outline: none;
- -webkit-transition: none;
- -moz-transition: none;
- transition: none;
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f9f9f9, 0 1px 0 rgba(255, 255, 255, 0.1); }
- .tests-valo .v-textarea.v-textfield-prompt, .tests-valo .v-textarea.v-textarea-prompt {
- color: #a3a3a3; }
-.tests-valo .v-textarea-readonly {
- background: transparent;
- box-shadow: none; }
- .tests-valo .v-textarea-readonly:focus {
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
-.tests-valo .v-textarea-error {
- border-color: #ed473b;
- background: #fffbfb;
- color: #6a2823; }
-.tests-valo .v-datefield {
- position: relative;
- width: 185px;
- height: 37px;
- border-radius: 4px; }
- .tests-valo .v-datefield .v-datefield-textfield {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- margin: 0;
- font: inherit;
- font-weight: 400;
- line-height: normal;
- height: 37px;
- border-radius: 4px;
- padding: 4px 9px;
- border: 1px solid #cecece;
- background: white;
- color: #474747;
- box-shadow: inset 0 1px 0 #f9f9f9, 0 1px 0 rgba(255, 255, 255, 0.1);
- -webkit-transition: box-shadow 180ms, border 180ms;
- -moz-transition: box-shadow 180ms, border 180ms;
- transition: box-shadow 180ms, border 180ms;
- padding-left: 44.4px;
- width: 100%;
- height: 100%;
- border-radius: inherit; }
- .tests-valo .v-datefield .v-datefield-textfield.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-datefield .v-datefield-textfield:focus {
- outline: none;
- -webkit-transition: none;
- -moz-transition: none;
- transition: none;
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f9f9f9, 0 1px 0 rgba(255, 255, 255, 0.1); }
- .tests-valo .v-datefield .v-datefield-textfield.v-textfield-prompt, .tests-valo .v-datefield .v-datefield-textfield.v-textarea-prompt {
- color: #a3a3a3; }
- .tests-valo .v-datefield.v-datefield-prompt > .v-datefield-textfield {
- color: #a3a3a3; }
- .tests-valo .v-datefield .v-datefield-button {
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
- -webkit-touch-callout: none;
- cursor: pointer;
- -webkit-appearance: none;
- background: transparent;
- border: none;
- padding: 0;
- position: absolute;
- z-index: 10;
- top: 1px;
- bottom: 1px;
- left: 1px;
- width: 37px;
- line-height: 35px;
- text-align: center;
- cursor: pointer;
- font: inherit;
- border-right: 1px solid #e8e8e8;
- outline: none;
- margin: 0;
- border-radius: 3px 0 0 3px; }
- .tests-valo .v-datefield .v-datefield-button:before {
- font-family: FontAwesome;
- content: "\f073";
- color: #474747;
- color: #a3a3a3;
- -webkit-transition: color 140ms;
- -moz-transition: color 140ms;
- transition: color 140ms; }
- .tests-valo .v-datefield .v-datefield-button:hover:before {
- color: #474747; }
- .tests-valo .v-datefield .v-datefield-button:active:after {
- content: "";
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- background-color: rgba(128, 128, 128, 0.2);
- border-radius: inherit; }
- .tests-valo .v-datefield.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-datefield.v-disabled .v-datefield-button {
- cursor: default;
- pointer-events: none; }
- .tests-valo .v-datefield.v-disabled .v-datefield-button:active:after {
- display: none; }
- .tests-valo .v-datefield.v-readonly .v-datefield-textfield {
- background: transparent;
- box-shadow: none; }
- .tests-valo .v-datefield.v-readonly .v-datefield-textfield:focus {
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- .tests-valo .v-datefield.v-readonly .v-datefield-button {
- cursor: default;
- pointer-events: none; }
- .tests-valo .v-datefield.v-readonly .v-datefield-button:active:after {
- display: none; }
-.tests-valo .v-datefield-full {
- width: 240px; }
-.tests-valo .v-datefield-day {
- width: 185px; }
-.tests-valo .v-datefield-month {
- width: 120px; }
-.tests-valo .v-datefield-year {
- width: 104px; }
-.tests-valo .v-datefield-popup {
- padding: 4px 4px;
- border-radius: 4px;
- background-color: white;
- color: #474747;
- box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.05), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.1);
- -webkit-animation: valo-overlay-open 200ms;
- -moz-animation: valo-overlay-open 200ms;
- animation: valo-overlay-open 200ms;
- -webkit-backface-visibility: hidden;
- -moz-backface-visibility: hidden;
- -ms-backface-visibility: hidden;
- backface-visibility: hidden;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- margin-top: 5px !important;
- cursor: default;
- width: auto; }
- .tests-valo .v-datefield-popup table {
- border-collapse: collapse;
- border-spacing: 0; }
- .tests-valo .v-datefield-popup td {
- padding: 2px; }
- .tests-valo .v-datefield-popup .v-datefield-calendarpanel {
- font-size: 16px;
- text-align: center; }
- .tests-valo .v-datefield-popup .v-datefield-calendarpanel:focus {
- outline: none; }
- .tests-valo .v-datefield-popup .v-datefield-calendarpanel-day {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- width: 30px;
- height: 26px;
- border: 1px solid transparent;
- line-height: 26px;
- text-align: center;
- font-size: 14px;
- background: #fafafa;
- border-radius: 2px;
- -webkit-transition: color 200ms;
- -moz-transition: color 200ms;
- transition: color 200ms;
- display: inline-block;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- cursor: pointer; }
- .tests-valo .v-datefield-popup .v-datefield-calendarpanel-day:hover {
- color: #197de1; }
- .tests-valo .v-datefield-popup .v-datefield-calendarpanel-day-offmonth {
- color: #a0a0a0;
- background: transparent; }
- .tests-valo .v-datefield-popup .v-datefield-calendarpanel-day-today {
- color: #2f2f2f;
- font-weight: 600;
- border-color: #b6b6b6; }
- .tests-valo .v-datefield-popup .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-selected,
- .tests-valo .v-datefield-popup .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-selected:hover {
- color: #d9e5f1;
- background-color: #197de1;
- background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);
- background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);
- border: none; }
- .tests-valo .v-datefield-popup .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-focused {
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);
- position: relative; }
- .v-ie8 .tests-valo .v-datefield-popup .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-focused {
- border-color: #197de1; }
- .tests-valo .v-datefield-popup .v-datefield-calendarpanel-weekdays {
- height: 26px;
- color: rgba(133, 133, 133, 0.85); }
- .tests-valo .v-datefield-popup .v-datefield-calendarpanel-weekdays strong {
- font: inherit;
- font-size: 14px; }
- .tests-valo .v-datefield-popup .v-datefield-calendarpanel-header {
- white-space: nowrap; }
- .tests-valo .v-datefield-popup td[class$="year"] button,
- .tests-valo .v-datefield-popup td[class$="month"] button {
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- border: none;
- background: transparent;
- padding: 0;
- margin: 0;
- cursor: pointer;
- color: transparent;
- font-size: 0;
- width: 19px;
- height: 25px;
- outline: none;
- position: relative;
- vertical-align: middle; }
- .tests-valo .v-datefield-popup td[class$="year"] button:before,
- .tests-valo .v-datefield-popup td[class$="month"] button:before {
- color: #a0a0a0;
- font-size: 21px;
- line-height: 24px;
- -webkit-transition: color 200ms;
- -moz-transition: color 200ms;
- transition: color 200ms; }
- .tests-valo .v-datefield-popup td[class$="year"] button:hover,
- .tests-valo .v-datefield-popup td[class$="month"] button:hover {
- opacity: 1;
- filter: none; }
- .tests-valo .v-datefield-popup td[class$="year"] button:hover:before,
- .tests-valo .v-datefield-popup td[class$="month"] button:hover:before {
- color: #197de1; }
- .tests-valo .v-datefield-popup .v-button-prevyear:before {
- font-family: FontAwesome;
- content: "\f100"; }
- .tests-valo .v-datefield-popup .v-button-prevmonth:before {
- font-family: FontAwesome;
- content: "\f104"; }
- .tests-valo .v-datefield-popup .v-button-nextyear:before {
- font-family: FontAwesome;
- content: "\f101"; }
- .tests-valo .v-datefield-popup .v-button-nextmonth:before {
- font-family: FontAwesome;
- content: "\f105"; }
- .tests-valo .v-datefield-popup td.v-datefield-calendarpanel-month {
- width: 130px;
- color: #197de1; }
- .tests-valo .v-datefield-popup .v-datefield-year td.v-datefield-calendarpanel-month {
- width: 74px; }
- .tests-valo .v-datefield-popup .v-datefield-calendarpanel-weeknumber,
- .tests-valo .v-datefield-popup .v-datefield-calendarpanel-weekdays.v-datefield-calendarpanel-weeknumbers td:first-child {
- width: 30px;
- color: rgba(133, 133, 133, 0.85);
- font-size: 14px;
- display: inline-block;
- text-align: left; }
- .tests-valo .v-datefield-popup .v-datefield-calendarpanel-weeknumber {
- position: relative; }
- .tests-valo .v-datefield-popup .v-datefield-calendarpanel-weeknumbers .v-first:before {
- content: "";
- position: absolute;
- top: 38px;
- bottom: 0;
- left: 0;
- width: 34px;
- border-top: 1px solid #ececec;
- border-right: 1px solid #ececec;
- border-top-right-radius: 4px;
- border-bottom-left-radius: 4px;
- background: #fafafa; }
- .tests-valo .v-datefield-popup td.v-datefield-calendarpanel-time {
- width: 100%;
- font-size: 14px; }
- .tests-valo .v-datefield-popup td.v-datefield-calendarpanel-time .v-label {
- display: inline-block;
- margin: 0 0.1em;
- font-weight: 400; }
-.tests-valo .v-datefield-calendarpanel {
- font-size: 16px;
- text-align: center; }
- .tests-valo .v-datefield-calendarpanel:focus {
- outline: none; }
-.tests-valo .v-datefield-calendarpanel-day {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- width: 30px;
- height: 26px;
- border: 1px solid transparent;
- line-height: 26px;
- text-align: center;
- font-size: 14px;
- background: #fafafa;
- border-radius: 2px;
- -webkit-transition: color 200ms;
- -moz-transition: color 200ms;
- transition: color 200ms;
- display: inline-block;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- cursor: pointer; }
- .tests-valo .v-datefield-calendarpanel-day:hover {
- color: #197de1; }
-.tests-valo .v-datefield-calendarpanel-day-offmonth {
- color: #a0a0a0;
- background: transparent; }
-.tests-valo .v-datefield-calendarpanel-day-today {
- color: #2f2f2f;
- font-weight: 600;
- border-color: #b6b6b6; }
-.tests-valo .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-selected,
-.tests-valo .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-selected:hover {
- color: #d9e5f1;
- background-color: #197de1;
- background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);
- background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);
- border: none; }
-.tests-valo .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-focused {
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);
- position: relative; }
- .v-ie8 .tests-valo .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-focused {
- border-color: #197de1; }
-.tests-valo .v-datefield-calendarpanel-weekdays {
- height: 26px;
- color: rgba(133, 133, 133, 0.85); }
- .tests-valo .v-datefield-calendarpanel-weekdays strong {
- font: inherit;
- font-size: 14px; }
-.tests-valo .v-datefield-calendarpanel-header {
- white-space: nowrap; }
-.tests-valo td[class$="year"] button,
-.tests-valo td[class$="month"] button {
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- border: none;
- background: transparent;
- padding: 0;
- margin: 0;
- cursor: pointer;
- color: transparent;
- font-size: 0;
- width: 19px;
- height: 25px;
- outline: none;
- position: relative;
- vertical-align: middle; }
- .tests-valo td[class$="year"] button:before,
- .tests-valo td[class$="month"] button:before {
- color: #a0a0a0;
- font-size: 21px;
- line-height: 24px;
- -webkit-transition: color 200ms;
- -moz-transition: color 200ms;
- transition: color 200ms; }
- .tests-valo td[class$="year"] button:hover,
- .tests-valo td[class$="month"] button:hover {
- opacity: 1;
- filter: none; }
- .tests-valo td[class$="year"] button:hover:before,
- .tests-valo td[class$="month"] button:hover:before {
- color: #197de1; }
-.tests-valo .v-button-prevyear:before {
- font-family: FontAwesome;
- content: "\f100"; }
-.tests-valo .v-button-prevmonth:before {
- font-family: FontAwesome;
- content: "\f104"; }
-.tests-valo .v-button-nextyear:before {
- font-family: FontAwesome;
- content: "\f101"; }
-.tests-valo .v-button-nextmonth:before {
- font-family: FontAwesome;
- content: "\f105"; }
-.tests-valo td.v-datefield-calendarpanel-month {
- width: 130px;
- color: #197de1; }
-.tests-valo .v-datefield-year td.v-datefield-calendarpanel-month {
- width: 74px; }
-.tests-valo .v-datefield-calendarpanel-weeknumber,
-.tests-valo .v-datefield-calendarpanel-weekdays.v-datefield-calendarpanel-weeknumbers td:first-child {
- width: 30px;
- color: rgba(133, 133, 133, 0.85);
- font-size: 14px;
- display: inline-block;
- text-align: left; }
-.tests-valo .v-datefield-calendarpanel-weeknumber {
- position: relative; }
-.tests-valo .v-datefield-calendarpanel-weeknumbers .v-first:before {
- content: "";
- position: absolute;
- top: 38px;
- bottom: 0;
- left: 0;
- width: 34px;
- border-top: 1px solid #ececec;
- border-right: 1px solid #ececec;
- border-top-right-radius: 4px;
- border-bottom-left-radius: 4px;
- background: #fafafa; }
-.tests-valo td.v-datefield-calendarpanel-time {
- width: 100%;
- font-size: 14px; }
- .tests-valo td.v-datefield-calendarpanel-time .v-label {
- display: inline-block;
- margin: 0 0.1em;
- font-weight: 400; }
-.tests-valo .v-inline-datefield-calendarpanel {
- font-size: 16px;
- text-align: center; }
- .tests-valo .v-inline-datefield-calendarpanel:focus {
- outline: none; }
-.tests-valo .v-inline-datefield-calendarpanel-day {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- width: 30px;
- height: 26px;
- border: 1px solid transparent;
- line-height: 26px;
- text-align: center;
- font-size: 14px;
- background: #fafafa;
- border-radius: 2px;
- -webkit-transition: color 200ms;
- -moz-transition: color 200ms;
- transition: color 200ms;
- display: inline-block;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- cursor: pointer; }
- .tests-valo .v-inline-datefield-calendarpanel-day:hover {
- color: #197de1; }
-.tests-valo .v-inline-datefield-calendarpanel-day-offmonth {
- color: #a0a0a0;
- background: transparent; }
-.tests-valo .v-inline-datefield-calendarpanel-day-today {
- color: #2f2f2f;
- font-weight: 600;
- border-color: #b6b6b6; }
-.tests-valo .v-inline-datefield-calendarpanel-day.v-inline-datefield-calendarpanel-day-selected,
-.tests-valo .v-inline-datefield-calendarpanel-day.v-inline-datefield-calendarpanel-day-selected:hover {
- color: #d9e5f1;
- background-color: #197de1;
- background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);
- background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);
- border: none; }
-.tests-valo .v-inline-datefield-calendarpanel-day.v-inline-datefield-calendarpanel-day-focused {
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);
- position: relative; }
- .v-ie8 .tests-valo .v-inline-datefield-calendarpanel-day.v-inline-datefield-calendarpanel-day-focused {
- border-color: #197de1; }
-.tests-valo .v-inline-datefield-calendarpanel-weekdays {
- height: 26px;
- color: rgba(133, 133, 133, 0.85); }
- .tests-valo .v-inline-datefield-calendarpanel-weekdays strong {
- font: inherit;
- font-size: 14px; }
-.tests-valo .v-inline-datefield-calendarpanel-header {
- white-space: nowrap; }
-.tests-valo td[class$="year"] button,
-.tests-valo td[class$="month"] button {
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- border: none;
- background: transparent;
- padding: 0;
- margin: 0;
- cursor: pointer;
- color: transparent;
- font-size: 0;
- width: 19px;
- height: 25px;
- outline: none;
- position: relative;
- vertical-align: middle; }
- .tests-valo td[class$="year"] button:before,
- .tests-valo td[class$="month"] button:before {
- color: #a0a0a0;
- font-size: 21px;
- line-height: 24px;
- -webkit-transition: color 200ms;
- -moz-transition: color 200ms;
- transition: color 200ms; }
- .tests-valo td[class$="year"] button:hover,
- .tests-valo td[class$="month"] button:hover {
- opacity: 1;
- filter: none; }
- .tests-valo td[class$="year"] button:hover:before,
- .tests-valo td[class$="month"] button:hover:before {
- color: #197de1; }
-.tests-valo .v-button-prevyear:before {
- font-family: FontAwesome;
- content: "\f100"; }
-.tests-valo .v-button-prevmonth:before {
- font-family: FontAwesome;
- content: "\f104"; }
-.tests-valo .v-button-nextyear:before {
- font-family: FontAwesome;
- content: "\f101"; }
-.tests-valo .v-button-nextmonth:before {
- font-family: FontAwesome;
- content: "\f105"; }
-.tests-valo td.v-inline-datefield-calendarpanel-month {
- width: 130px;
- color: #197de1; }
-.tests-valo .v-datefield-year td.v-datefield-calendarpanel-month {
- width: 74px; }
-.tests-valo .v-inline-datefield-calendarpanel-weeknumber,
-.tests-valo .v-inline-datefield-calendarpanel-weekdays.v-inline-datefield-calendarpanel-weeknumbers td:first-child {
- width: 30px;
- color: rgba(133, 133, 133, 0.85);
- font-size: 14px;
- display: inline-block;
- text-align: left; }
-.tests-valo .v-inline-datefield-calendarpanel-weeknumber {
- position: relative; }
-.tests-valo .v-inline-datefield-calendarpanel-weeknumbers .v-first:before {
- content: "";
- position: absolute;
- top: 38px;
- bottom: 0;
- left: 0;
- width: 34px;
- border-top: 1px solid #ececec;
- border-right: 1px solid #ececec;
- border-top-right-radius: 4px;
- border-bottom-left-radius: 4px;
- background: #fafafa; }
-.tests-valo td.v-datefield-calendarpanel-time {
- width: 100%;
- font-size: 14px; }
- .tests-valo td.v-datefield-calendarpanel-time .v-label {
- display: inline-block;
- margin: 0 0.1em;
- font-weight: 400; }
-.tests-valo .v-inline-datefield-calendarpanel {
- position: relative;
- background: white;
- padding: 6px; }
-.tests-valo .v-margin-top {
- padding-top: 37px; }
-.tests-valo .v-margin-right {
- padding-right: 37px; }
-.tests-valo .v-margin-bottom {
- padding-bottom: 37px; }
-.tests-valo .v-margin-left {
- padding-left: 37px; }
-.tests-valo .v-spacing {
- width: 12px;
- height: 12px; }
-.tests-valo .v-gridlayout-margin-top {
- padding-top: 37px; }
-.tests-valo .v-gridlayout-margin-bottom {
- padding-bottom: 37px; }
-.tests-valo .v-gridlayout-margin-left {
- padding-left: 37px; }
-.tests-valo .v-gridlayout-margin-right {
- padding-right: 37px; }
-.tests-valo .v-gridlayout-spacing-on {
- padding-left: 12px;
- padding-top: 12px; }
-.tests-valo .v-menubar {
- position: relative;
- text-align: center;
- white-space: nowrap;
- outline: none;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
- -webkit-touch-callout: none;
- cursor: pointer;
- height: 37px;
- padding: 0 16px;
- color: #2f2f2f;
- font-weight: 400;
- cursor: default;
- border-radius: 4px;
- border: 1px solid #cecece;
- border-top-color: #cecece;
- border-bottom-color: #c5c5c5;
- background-color: #fafafa;
- background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);
- background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);
- box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #eaeaea, 0 2px 3px rgba(0, 0, 0, 0.05);
- text-shadow: 0 1px 0 #fafafa;
- padding: 0;
- text-align: left;
- overflow: hidden; }
- .tests-valo .v-menubar:focus:not(.v-disabled) {
- border-color: #197de1;
- box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #eaeaea, 0 2px 3px rgba(0, 0, 0, 0.05), 0 0 0 2px rgba(25, 125, 225, 0.5); }
- .tests-valo .v-menubar.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
-.tests-valo .v-menubar:active:after {
- background: transparent; }
-.tests-valo .v-menubar > .v-menubar-menuitem {
- position: relative;
- z-index: 1;
- display: inline-block;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- height: 37px;
- padding: 0 15px;
- color: inherit;
- font-weight: 400;
- cursor: pointer;
- border-radius: 0;
- border: 1px solid #cecece;
- border-top-color: #cecece;
- border-bottom-color: #c5c5c5;
- background-color: #fafafa;
- background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);
- background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);
- box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #eaeaea;
- background: transparent;
- border-width: 0 1px 0 0;
- height: 100%;
- vertical-align: top;
- line-height: 34px;
- text-align: center; }
- .tests-valo .v-menubar > .v-menubar-menuitem:after {
- border: inherit;
- top: -1px;
- right: -1px;
- bottom: -1px;
- left: -1px; }
- .tests-valo .v-menubar > .v-menubar-menuitem:hover:after {
- background-color: rgba(186, 186, 186, 0.1); }
- .tests-valo .v-menubar > .v-menubar-menuitem:focus:after {
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- .tests-valo .v-menubar > .v-menubar-menuitem:active:after {
- background-color: rgba(125, 125, 125, 0.2); }
- .tests-valo .v-menubar > .v-menubar-menuitem:first-child {
- border-left-width: 0;
- border-radius: 2px 0 0 2px; }
- .tests-valo .v-menubar > .v-menubar-menuitem:last-child {
- border-radius: 0 2px 2px 0;
- margin-right: -1px; }
- .tests-valo .v-menubar > .v-menubar-menuitem:first-child:last-child {
- border-radius: 2px;
- border-right-width: 0;
- margin-right: 0; }
- .tests-valo .v-menubar > .v-menubar-menuitem:before {
- content: "";
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- border-radius: inherit; }
- .tests-valo .v-menubar > .v-menubar-menuitem:hover:before {
- background-color: rgba(186, 186, 186, 0.1);
- border: none; }
- .tests-valo .v-menubar > .v-menubar-menuitem:active:before {
- background-color: rgba(125, 125, 125, 0.2); }
- .tests-valo .v-menubar > .v-menubar-menuitem .v-icon {
- margin: 0 4px 0 -4px;
- cursor: inherit; }
- .tests-valo .v-menubar > .v-menubar-menuitem[class*="-icon-only"] {
- width: 37px;
- padding: 0; }
- .tests-valo .v-menubar > .v-menubar-menuitem[class*="-icon-only"] .v-icon {
- margin: 0; }
-.tests-valo .v-menubar > .v-menubar-menuitem-checked {
- box-shadow: none;
- background-color: #ededed;
- background-image: -webkit-linear-gradient(bottom, #ededed 2%, #e9e9e9 98%);
- background-image: linear-gradient(to top,#ededed 2%, #e9e9e9 98%);
- color: #2d2d2d; }
-.tests-valo .v-disabled > .v-menubar-menuitem,
-.tests-valo .v-menubar > .v-menubar-menuitem-disabled {
- cursor: default; }
- .tests-valo .v-disabled > .v-menubar-menuitem:before,
- .tests-valo .v-menubar > .v-menubar-menuitem-disabled:before {
- display: none; }
-.tests-valo .v-menubar-menuitem-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
-.tests-valo .v-menubar > .v-menubar-menuitem-selected {
- color: #ecf2f8;
- border-radius: 0;
- border: 1px solid #1467b9;
- border-top-color: #166fbb;
- border-bottom-color: #125aaf;
- background-color: #197de1;
- background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);
- background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);
- box-shadow: inset 0 1px 0 #4595e5, inset 0 -1px 0 #166ccd;
- text-shadow: 0 -1px 0 #197de1;
- border-top-width: 0;
- border-left-width: 0;
- border-bottom-width: 0;
- z-index: 2; }
- .tests-valo .v-menubar > .v-menubar-menuitem-selected:hover:before {
- background: none; }
-.tests-valo .v-menubar .v-menubar-submenu-indicator {
- display: none; }
-.tests-valo .v-menubar-popup {
- padding: 4px 4px;
- border-radius: 4px;
- background-color: white;
- color: #474747;
- box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.05), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.1);
- -webkit-animation: valo-overlay-open 200ms;
- -moz-animation: valo-overlay-open 200ms;
- animation: valo-overlay-open 200ms;
- -webkit-backface-visibility: hidden;
- -moz-backface-visibility: hidden;
- -ms-backface-visibility: hidden;
- backface-visibility: hidden;
- padding: 4px 4px;
- margin: 5px 0 0 1px !important; }
- .tests-valo .v-menubar-popup .v-menubar-submenu {
- outline: none; }
- .tests-valo .v-menubar-popup .v-menubar-menuitem {
- display: block;
- cursor: pointer;
- line-height: 27px;
- padding: 0 20px 0 10px;
- border-radius: 3px;
- font-weight: 400;
- white-space: nowrap;
- position: relative;
- padding-left: 32px;
- padding-right: 37px;
- position: relative; }
- .tests-valo .v-menubar-popup .v-menubar-menuitem:active:before {
- content: "";
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- background: #0957a6;
- opacity: 0.15;
- filter: alpha(opacity=15);
- pointer-events: none;
- border-radius: inherit; }
- .tests-valo .v-menubar-popup .v-menubar-menuitem .v-icon {
- max-height: 27px;
- margin-right: 5px;
- min-width: 1em; }
- .tests-valo .v-menubar-popup .v-menubar-submenu-indicator {
- display: none; }
- .tests-valo .v-menubar-popup .v-menubar-submenu-indicator + .v-menubar-menuitem-caption:after {
- position: absolute;
- right: 10px;
- font-family: FontAwesome;
- content: "\f054";
- line-height: 29px; }
- .tests-valo .v-menubar-popup .v-menubar-menuitem-selected {
- background-color: #197de1;
- background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);
- background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);
- color: #ecf2f8; }
- .tests-valo .v-menubar-popup .v-menubar-separator {
- display: block;
- margin: 4px 0;
- height: 0;
- overflow: hidden;
- border-bottom: 1px solid #e8e8e8; }
- .tests-valo .v-menubar-popup [class*="checked"] .v-menubar-menuitem-caption:before {
- content: "\f00c";
- font-family: FontAwesome;
- position: absolute;
- left: 10px; }
- .tests-valo .v-menubar-popup [class*="unchecked"] .v-menubar-menuitem-caption:before {
- content: ""; }
- .tests-valo .v-menubar-popup [class*="disabled"] {
- cursor: default; }
-:root .tests-valo .v-radiobutton > input:checked ~ label:after {
- width: 7px;
- height: 7px;
- top: 6px;
- left: 6px;
- background: #197de1; }
-:root .tests-valo .v-radiobutton > input ~ label:before, :root .tests-valo .v-radiobutton > input ~ label:after {
- border-radius: 50%;
- content: ""; }
-.tests-valo .v-select-optiongroup .v-radiobutton,
-.tests-valo .v-select-optiongroup .v-checkbox {
- display: block;
- margin: 9px 16px 0 0; }
- .tests-valo .v-select-optiongroup .v-radiobutton:first-child,
- .tests-valo .v-select-optiongroup .v-checkbox:first-child {
- margin-top: 6px; }
- .tests-valo .v-select-optiongroup .v-radiobutton:last-child,
- .tests-valo .v-select-optiongroup .v-checkbox:last-child {
- margin-bottom: 6px; }
-.tests-valo .v-select-optiongroup.v-has-width label {
- white-space: normal; }
-.tests-valo .v-link {
- cursor: pointer;
- color: #197de1;
- text-decoration: underline;
- font-weight: inherit;
- -webkit-transition: color 140ms;
- -moz-transition: color 140ms;
- transition: color 140ms; }
- .tests-valo .v-link:hover {
- color: #4396ea; }
- .tests-valo .v-link a {
- cursor: inherit;
- color: inherit;
- text-decoration: inherit;
- -webkit-transition: inherit;
- -moz-transition: inherit;
- transition: inherit; }
- .tests-valo .v-link .v-icon {
- cursor: inherit; }
-.tests-valo .v-window {
- padding: 4px 4px;
- border-radius: 4px;
- background-color: white;
- color: #474747;
- box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.05), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.1);
- -webkit-animation: valo-overlay-open 200ms;
- -moz-animation: valo-overlay-open 200ms;
- animation: valo-overlay-open 200ms;
- -webkit-backface-visibility: hidden;
- -moz-backface-visibility: hidden;
- -ms-backface-visibility: hidden;
- backface-visibility: hidden;
- box-shadow: 0 4px 12px 6px rgba(0, 0, 0, 0.05), 0 2px 4px 0 rgba(0, 0, 0, 0.05), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.1);
- padding: 0;
- min-width: 148px !important;
- min-height: 37px !important;
- overflow: hidden !important;
- white-space: nowrap;
- -webkit-transition: width 200ms, height 200ms, top 200ms, left 200ms;
- -moz-transition: width 200ms, height 200ms, top 200ms, left 200ms;
- transition: width 200ms, height 200ms, top 200ms, left 200ms; }
-.tests-valo .v-window-modalitycurtain {
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- background: #fafafa;
- opacity: 0.5;
- filter: alpha(opacity=50); }
-.tests-valo .v-window-draggingCurtain {
- position: fixed !important; }
-.tests-valo .v-window-resizingCurtain + .v-window,
-.tests-valo .v-window-draggingCurtain + .v-window {
- -webkit-transition: none;
- -moz-transition: none;
- transition: none; }
-.tests-valo .v-window-outerheader {
- position: absolute;
- z-index: 2;
- top: 0;
- left: 0;
- right: 0;
- -webkit-transform: translatez(0);
- -moz-transform: translatez(0);
- -ms-transform: translatez(0);
- -o-transform: translatez(0);
- transform: translatez(0); }
- .tests-valo .v-window-outerheader:after {
- content: "";
- position: absolute;
- bottom: -1px;
- right: 0;
- left: 0;
- height: 1px;
- background: #e4e4e4; }
-.tests-valo .v-window-header {
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- cursor: move;
- line-height: 36px;
- padding-left: 12px;
- margin-right: 74px;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- color: #7e7e7e; }
-.tests-valo .v-window-closebox,
-.tests-valo .v-window-maximizebox,
-.tests-valo .v-window-restorebox {
- position: absolute;
- z-index: 2;
- top: 0;
- right: 0;
- width: 37px;
- height: 36px;
- line-height: 34px;
- text-align: center;
- cursor: pointer;
- font-family: FontAwesome;
- font-size: 21px;
- opacity: 0.4;
- filter: alpha(opacity=40);
- -webkit-transition: all 140ms;
- -moz-transition: all 140ms;
- transition: all 140ms; }
- .tests-valo .v-window-closebox:focus,
- .tests-valo .v-window-maximizebox:focus,
- .tests-valo .v-window-restorebox:focus {
- outline: none; }
- .tests-valo .v-window-closebox:hover,
- .tests-valo .v-window-maximizebox:hover,
- .tests-valo .v-window-restorebox:hover {
- opacity: 1;
- filter: none;
- color: #197de1; }
- .tests-valo .v-window-closebox:active,
- .tests-valo .v-window-maximizebox:active,
- .tests-valo .v-window-restorebox:active {
- color: inherit; }
-.tests-valo .v-window-closebox:before {
- content: "\00d7"; }
-.tests-valo .v-window-maximizebox,
-.tests-valo .v-window-restorebox {
- right: 37px; }
-.tests-valo .v-window-restorebox-disabled,
-.tests-valo .v-window-maximizebox-disabled {
- display: none; }
-.tests-valo .v-window-maximizebox:before {
- content: "+"; }
-.tests-valo .v-window-restorebox:before {
- content: "\2013"; }
-.tests-valo .v-window > .popupContent,
-.tests-valo .v-window-wrap,
-.tests-valo .v-window-contents,
-.tests-valo .v-window-contents > .v-scrollable {
- height: 100%; }
-.tests-valo .v-window-contents {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- border-radius: 4px;
- margin-top: 0 !important; }
- .tests-valo .v-window-contents > .v-scrollable {
- position: relative; }
- .tests-valo .v-window-contents > .v-scrollable > .v-margin-top {
- padding-top: 12px; }
- .tests-valo .v-window-contents > .v-scrollable > .v-margin-right {
- padding-right: 12px; }
- .tests-valo .v-window-contents > .v-scrollable > .v-margin-bottom {
- padding-bottom: 12px; }
- .tests-valo .v-window-contents > .v-scrollable > .v-margin-left {
- padding-left: 12px; }
- .tests-valo .v-window-contents > .v-scrollable > .v-formlayout .v-formlayout-margin-top > tbody > .v-formlayout-firstrow > .v-formlayout-captioncell,
- .tests-valo .v-window-contents > .v-scrollable > .v-formlayout .v-formlayout-margin-top > tbody > .v-formlayout-firstrow > .v-formlayout-contentcell,
- .tests-valo .v-window-contents > .v-scrollable > .v-formlayout .v-formlayout-margin-top > tbody > .v-formlayout-firstrow > .v-formlayout-errorcell {
- padding-top: 12px; }
- .tests-valo .v-window-contents > .v-scrollable > .v-formlayout .v-formlayout-margin-bottom > tbody > .v-formlayout-lastrow > .v-formlayout-captioncell,
- .tests-valo .v-window-contents > .v-scrollable > .v-formlayout .v-formlayout-margin-bottom > tbody > .v-formlayout-lastrow > .v-formlayout-contentcell,
- .tests-valo .v-window-contents > .v-scrollable > .v-formlayout .v-formlayout-margin-bottom > tbody > .v-formlayout-lastrow > .v-formlayout-errorcell {
- padding-bottom: 12px; }
- .tests-valo .v-window-contents > .v-scrollable > .v-formlayout .v-formlayout-margin-left > tbody > .v-formlayout-row > .v-formlayout-captioncell {
- padding-left: 12px; }
- .tests-valo .v-window-contents > .v-scrollable > .v-formlayout .v-formlayout-margin-right > tbody > .v-formlayout-row > .v-formlayout-contentcell {
- padding-right: 12px; }
- .tests-valo .v-window-contents > .v-scrollable:focus {
- outline: none; }
- .tests-valo .v-window-contents > .v-scrollable:before {
- content: "";
- position: absolute;
- z-index: 2;
- top: 0;
- height: 1px;
- background: white;
- left: 0;
- right: 0; }
- .tests-valo .v-window-contents > .v-scrollable .v-panel-captionwrap:after {
- background: #e4e4e4; }
- .tests-valo .v-window-contents > .v-scrollable .v-panel-content:before {
- background: white; }
-.tests-valo .v-window-footer {
- height: 0; }
-.tests-valo .v-window-resizebox {
- position: absolute;
- z-index: 1000;
- right: 0;
- bottom: 0;
- width: 19px;
- height: 19px;
- cursor: nwse-resize; }
- .v-ie8 .tests-valo .v-window-resizebox {
- background: #000;
- filter: alpha(opacity=0.1); }
- .v-ie8 .tests-valo .v-window-resizebox, .v-ie9 .tests-valo .v-window-resizebox {
- cursor: se-resize; }
-.tests-valo .v-window-resizebox-disabled {
- display: none; }
-.tests-valo .v-window-modalitycurtain:active ~ .v-window {
- -webkit-animation: none;
- -moz-animation: none;
- animation: none; }
-.tests-valo .v-window-bottom-toolbar {
- padding: 7px 12px;
- background-color: #fafafa;
- background-image: -webkit-linear-gradient(top, #f0f0f0 0, #fafafa 4px);
- background-image: linear-gradient(to bottom,#f0f0f0 0, #fafafa 4px);
- border-top: 1px solid #e4e4e4; }
- .tests-valo .v-window-bottom-toolbar .v-expand {
- overflow: visible; }
- .tests-valo .v-window-bottom-toolbar .v-label {
- line-height: 36px; }
- .tests-valo .v-window-bottom-toolbar .v-spacing {
- width: 6px; }
-.tests-valo .v-margin-left.v-margin-right.v-margin-bottom .v-window-bottom-toolbar {
- margin: 0 -12px -12px;
- -webkit-box-sizing: content-box;
- -moz-box-sizing: content-box;
- box-sizing: content-box; }
-.tests-valo .v-tree {
- position: relative;
- white-space: nowrap;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none; }
- .tests-valo .v-tree:focus {
- outline: none; }
-.tests-valo .v-tree-node:before {
- content: "";
- position: absolute;
- display: inline-block;
- z-index: 3;
- width: 1.9em;
- height: 28px;
- cursor: pointer; }
- .v-ie8 .tests-valo .v-tree-node:before {
- content: "+";
- position: static;
- margin-left: -1.9em;
- vertical-align: top;
- content: "\f0da";
- font-family: FontAwesome;
- text-align: center; }
-.v-ie8 .tests-valo .v-tree-node {
- padding-left: 1.9em; }
-.tests-valo .v-tree-node-caption {
- height: 28px;
- line-height: 27px;
- overflow: hidden;
- white-space: nowrap; }
- .tests-valo .v-tree-node-caption > div {
- display: inline-block;
- width: 100%;
- position: relative;
- z-index: 2; }
- .tests-valo .v-tree-node-caption > div:before {
- content: "\f0da";
- font-family: FontAwesome;
- display: inline-block;
- width: .5em;
- text-align: center;
- margin: 0 .6em 0 .8em;
- -webkit-transition: all 100ms;
- -moz-transition: all 100ms;
- transition: all 100ms; }
- .v-ie8 .tests-valo .v-tree-node-caption > div:before {
- display: none; }
- .tests-valo .v-tree-node-caption span {
- padding-right: 28px;
- cursor: pointer;
- display: inline-block;
- width: 100%; }
- .v-ie .tests-valo .v-tree-node-caption span {
- width: auto; }
- .tests-valo .v-tree-node-caption .v-icon {
- padding-right: 0;
- width: auto;
- min-width: 1em; }
- .tests-valo .v-tree-node-caption:after {
- content: "";
- display: inline-block;
- vertical-align: top;
- position: absolute;
- z-index: 1;
- left: 0;
- width: 100%;
- height: 28px;
- border-radius: 4px;
- opacity: 0;
- -webkit-transition: opacity 120ms;
- -moz-transition: opacity 120ms;
- transition: opacity 120ms; }
- .v-ie8 .tests-valo .v-tree-node-caption:after {
- content: none; }
- .v-ie8 .tests-valo .v-tree-node-caption {
- display: inline-block; }
-.tests-valo .v-tree-node-expanded > .v-tree-node-caption > div:before {
- -webkit-transform: rotate(90deg);
- -moz-transform: rotate(90deg);
- -ms-transform: rotate(90deg);
- -o-transform: rotate(90deg);
- transform: rotate(90deg);
- content: "\f0da";
- font-family: FontAwesome; }
-.v-ie8 .tests-valo .v-tree-node-expanded:before {
- content: "\f0d7";
- font-family: FontAwesome; }
-.tests-valo .v-tree-node-leaf > .v-tree-node-caption > div:before, .v-ie8 .tests-valo .v-tree-node-leaf:before {
- visibility: hidden; }
-.tests-valo .v-tree-node-focused:after {
- opacity: 1;
- border: 1px solid #197de1; }
-.v-ie8 .tests-valo .v-tree-node-focused {
- outline: 1px dotted #197de1; }
-.tests-valo .v-tree-node-selected {
- color: #ecf2f8;
- text-shadow: valo-button-text-shadow(#197de1, 25%); }
- .tests-valo .v-tree-node-selected:after {
- opacity: 1;
- background-color: #197de1;
- background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);
- background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);
- border: none; }
- .v-ie8 .tests-valo .v-tree-node-selected {
- background-color: #197de1;
- background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);
- background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); }
-.tests-valo .v-tree-node-children {
- padding-left: 19px; }
- .v-ie8 .tests-valo .v-tree-node-children {
- padding-left: 0; }
-.tests-valo .v-tree-node-drag-top:before,
-.tests-valo .v-tree-node-drag-bottom:after {
- content: "\2022";
- display: block;
- position: absolute;
- height: 2px;
- width: 100%;
- background: #197de1;
- font-size: 32px;
- line-height: 2px;
- color: #197de1;
- text-indent: -4px;
- text-shadow: 0 0 1px #fafafa, 0 0 1px #fafafa; }
-.tests-valo .v-tree-node-caption-drag-center {
- box-shadow: 0 0 0 2px #197de1;
- position: relative;
- border-radius: 4px; }
- .v-ie8 .tests-valo .v-tree-node-caption-drag-center {
- outline: 2px solid #197de1; }
-.v-ff .tests-valo .v-tree-node-drag-top:before, .v-ff .tests-valo .v-tree-node-drag-bottom:after {
- line-height: 1px; }
-.v-ie8 .tests-valo .v-tree-node-drag-top:before, .v-ie8 .tests-valo .v-tree-node-drag-bottom:after {
- line-height: 0; }
-.tests-valo .v-table {
- position: relative;
- background: #fafafa;
- color: #464646; }
-.tests-valo .v-table-header table,
-.tests-valo .v-table-footer table,
-.tests-valo .v-table-table {
- outline: 1px solid #dbdbdb; }
-.tests-valo .v-table-header-wrap,
-.tests-valo .v-table-footer-wrap,
-.tests-valo .v-table-header-drag {
- border: 1px solid #dbdbdb;
- background-color: #fafafa;
- background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);
- background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);
- white-space: nowrap;
- font-size: 14px;
- text-shadow: valo-text-shadow; }
-.tests-valo .v-table-header-wrap {
- position: relative;
- border-bottom: none; }
-.tests-valo .v-table-footer-wrap {
- border-top: none; }
-.tests-valo .v-table-footer td {
- border-left: 1px solid #dbdbdb; }
-.tests-valo .v-table-footer-container,
-.tests-valo .v-table-caption-container {
- overflow: hidden;
- line-height: 1; }
-.tests-valo .v-table-footer-container {
- padding-top: 11px;
- padding-bottom: 12px;
- float: right;
- padding-right: 13px; }
-.tests-valo [class^="v-table-header-cell"] {
- position: relative;
- display: inline-block; }
-.tests-valo .v-table-caption-container,
-.tests-valo .v-table-header-drag {
- padding-top: 12px;
- padding-bottom: 11px;
- padding-left: 12px;
- padding-right: 12px;
- border-left: 1px solid #dbdbdb; }
-.tests-valo .v-table-resizer {
- height: 37px;
- background: transparent;
- width: 7px;
- cursor: e-resize;
- cursor: col-resize;
- position: absolute;
- right: 0;
- z-index: 1; }
-.tests-valo .v-table-cell-content {
- border-left: 1px solid #dbdbdb;
- padding: 0 12px; }
- .tests-valo .v-table-cell-content:first-child {
- border-left: none;
- padding-left: 13px; }
-.tests-valo .v-table-header td:first-child .v-table-caption-container,
-.tests-valo .v-table-footer td:first-child {
- border-left-color: transparent; }
-.tests-valo .v-table-cell-wrapper {
- white-space: nowrap;
- line-height: 1;
- padding: 11px 0; }
-.tests-valo .v-table-body {
- border: 1px solid #dbdbdb; }
-.tests-valo .v-table-table {
- background-color: white; }
-.tests-valo .v-table-table td {
- border-top: 1px solid #dbdbdb; }
-.tests-valo .v-table-table tr:first-child td {
- border-top: none; }
-.tests-valo .v-table-row {
- background-color: white; }
-.tests-valo .v-table-row-odd {
- background-color: whitesmoke; }
-.tests-valo .v-table [class*="-row"].v-selected {
- background-color: #197de1;
- background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);
- background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);
- background-origin: border-box;
- color: #ecf2f8;
- text-shadow: valo-button-text-shadow(#197de1, 25%); }
- .tests-valo .v-table [class*="-row"].v-selected + .v-selected {
- background: #166ed5; }
- .tests-valo .v-table [class*="-row"].v-selected + .v-selected td {
- border-top-color: #166ed5; }
- .tests-valo .v-table [class*="-row"].v-selected .v-table-cell-content {
- border-color: transparent;
- border-left-color: #1d69b4; }
- .tests-valo .v-table [class*="-row"].v-selected .v-table-cell-content:first-child {
- border-left-color: transparent; }
-.tests-valo .v-table-header-cell-asc .v-table-sort-indicator,
-.tests-valo .v-table-header-cell-desc .v-table-sort-indicator {
- background: transparent;
- width: 19px;
- height: 37px;
- line-height: 37px;
- position: absolute;
- right: 0; }
- .tests-valo .v-table-header-cell-asc .v-table-sort-indicator + .v-table-caption-container,
- .tests-valo .v-table-header-cell-desc .v-table-sort-indicator + .v-table-caption-container {
- padding-right: 19px; }
-.tests-valo .v-table-header-cell-asc .v-table-sort-indicator:before,
-.tests-valo .v-table-header-cell-desc .v-table-sort-indicator:before {
- font-style: normal;
- font-weight: normal;
- display: inline-block; }
-.tests-valo .v-table-header-cell-asc .v-table-sort-indicator:before {
- content: '\f0dd';
- font-family: FontAwesome; }
-.tests-valo .v-table-header-cell-desc .v-table-sort-indicator:before {
- content: '\f0de';
- font-family: FontAwesome; }
-.tests-valo .v-table-focus {
- outline: 1px solid #197de1;
- outline-offset: -1px; }
-.tests-valo .v-drag-element.v-table-focus,
-.tests-valo .v-drag-element .v-table-focus {
- outline: none; }
-.tests-valo .v-table-header-drag {
- position: absolute;
- opacity: 0.9;
- filter: alpha(opacity=90);
- margin-top: -19px;
- z-index: 30000;
- line-height: 1; }
-.tests-valo .v-table-focus-slot-right {
- border-right: 2px solid rgba(25, 125, 225, 0.5); }
-.tests-valo .v-table-focus-slot-left {
- border-left: 2px solid rgba(25, 125, 225, 0.5);
- left: 0;
- right: auto;
- margin-left: 0 !important; }
-.tests-valo .v-table-column-selector {
- height: 37px;
- padding: 0 16px;
- color: #2f2f2f;
- font-weight: 400;
- border-radius: 4px;
- border: 1px solid #cecece;
- border-top-color: #cecece;
- border-bottom-color: #c5c5c5;
- background-color: #fafafa;
- background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);
- background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);
- box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #eaeaea, 0 2px 3px rgba(0, 0, 0, 0.05);
- text-shadow: 0 1px 0 #fafafa;
- position: absolute;
- z-index: 2;
- top: -9px;
- right: -9px;
- height: 19px;
- line-height: 19px;
- width: 19px;
- padding: 0;
- border-radius: 50%;
- cursor: pointer;
- text-align: center;
- opacity: 0;
- filter: alpha(opacity=0);
- -webkit-transition: opacity 200ms 1s;
- -moz-transition: opacity 200ms 1s;
- transition: opacity 200ms 1s; }
- .tests-valo .v-table-column-selector:after {
- border: inherit;
- top: -1px;
- right: -1px;
- bottom: -1px;
- left: -1px; }
- .tests-valo .v-table-column-selector:hover:after {
- background-color: rgba(186, 186, 186, 0.1); }
- .tests-valo .v-table-column-selector:focus:after {
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- .tests-valo .v-table-column-selector:active:after {
- background-color: rgba(125, 125, 125, 0.2); }
- .tests-valo .v-table-column-selector:after {
- content: "";
- position: absolute;
- top: -1px;
- right: -1px;
- bottom: -1px;
- left: -1px;
- border-radius: inherit; }
- .tests-valo .v-table-column-selector:active:after {
- background-color: rgba(125, 125, 125, 0.2); }
- .tests-valo .v-table-column-selector:before {
- font-family: FontAwesome;
- content: "\f013"; }
-.tests-valo .v-table-header-wrap:hover .v-table-column-selector {
- opacity: 1;
- filter: none;
- -webkit-transition-delay: 100ms;
- -moz-transition-delay: 100ms;
- transition-delay: 100ms; }
-.tests-valo .v-on:before,
-.tests-valo .v-off:before {
- content: "\f00c";
- font-family: FontAwesome;
- font-size: 0.9em;
- margin-right: 6px; }
-.tests-valo .v-on div,
-.tests-valo .v-off div {
- display: inline; }
-.tests-valo .v-off:before {
- visibility: hidden; }
-.tests-valo tbody.v-drag-element {
- display: block;
- overflow: visible;
- box-shadow: none;
- background: transparent;
- opacity: 1;
- filter: none; }
- .tests-valo tbody.v-drag-element tr {
- display: block;
- box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
- border-radius: 4px;
- overflow: hidden;
- opacity: 0.5;
- filter: alpha(opacity=50);
- background: white; }
-.tests-valo .v-table-body {
- position: relative;
- z-index: 1; }
-.tests-valo .v-table-scrollposition {
- position: absolute;
- top: 50%;
- width: 100%;
- height: 37px;
- line-height: 37px;
- margin: -19px 0 0 !important;
- text-align: center; }
-.tests-valo .v-table-drag .v-table-body {
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);
- border-color: #197de1; }
- .v-ie8 .tests-valo .v-table-drag .v-table-body {
- border-color: #197de1; }
- .tests-valo .v-table-drag .v-table-body .v-table-focus {
- outline: none; }
-.tests-valo .v-table-row-drag-middle td:first-child:before {
- content: "";
- display: block;
- position: absolute;
- height: 38px;
- left: 0;
- right: 0;
- background: #197de1;
- opacity: 0.2;
- filter: alpha(opacity=20); }
-.tests-valo .v-table-row-drag-top td:first-child:before,
-.tests-valo .v-table-row-drag-bottom td:first-child:after {
- content: "\2022";
- display: block;
- position: absolute;
- height: 2px;
- left: 0;
- right: 0;
- background: #197de1;
- font-size: 32px;
- line-height: 2px;
- color: #197de1;
- text-indent: -4px;
- text-shadow: 0 0 1px white, 0 0 1px white; }
-.tests-valo .v-table-row-drag-top td:first-child:before {
- margin-top: -1px; }
-.v-ff .tests-valo .v-table-row-drag-top td:first-child:before, .v-ff .tests-valo .v-table-row-drag-bottom td:first-child:after {
- line-height: 1px; }
-.v-ie .tests-valo .v-table-row-drag-top td:first-child:before, .v-ie .tests-valo .v-table-row-drag-bottom td:first-child:after {
- line-height: 0; }
-.tests-valo .v-treetable-treespacer {
- display: inline-block;
- background: transparent;
- width: 19px;
- left: 0;
- position: absolute;
- text-align: right; }
-.tests-valo .v-treetable-node-closed:before {
- content: "\f0da";
- font-family: FontAwesome; }
-.tests-valo .v-treetable-node-open:before {
- content: "\f0d7";
- font-family: FontAwesome; }
-.tests-valo .v-splitpanel-hsplitter {
- width: 1px; }
-.tests-valo .v-splitpanel-vsplitter {
- height: 1px; }
-.tests-valo .v-splitpanel-hsplitter:after {
- left: -6px;
- right: -6px; }
-.tests-valo .v-splitpanel-vsplitter:after {
- top: -6px;
- bottom: -6px; }
-.tests-valo .v-splitpanel-hsplitter div:before,
-.tests-valo .v-splitpanel-vsplitter div:before {
- height: 37px;
- padding: 0 16px;
- color: #2f2f2f;
- font-weight: 400;
- border-radius: 4px;
- border: 1px solid #cecece;
- border-top-color: #cecece;
- border-bottom-color: #c5c5c5;
- background-color: #fafafa;
- background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);
- background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);
- box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #eaeaea, none;
- text-shadow: 0 1px 0 #fafafa;
- height: auto;
- padding: 0;
- border-radius: 0; }
- .tests-valo .v-splitpanel-hsplitter div:before:after,
- .tests-valo .v-splitpanel-vsplitter div:before:after {
- border: inherit;
- top: -1px;
- right: -1px;
- bottom: -1px;
- left: -1px; }
- .tests-valo .v-splitpanel-hsplitter div:before:hover:after,
- .tests-valo .v-splitpanel-vsplitter div:before:hover:after {
- background-color: rgba(186, 186, 186, 0.1); }
- .tests-valo .v-splitpanel-hsplitter div:before:focus:after,
- .tests-valo .v-splitpanel-vsplitter div:before:focus:after {
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- .tests-valo .v-splitpanel-hsplitter div:before:active:after,
- .tests-valo .v-splitpanel-vsplitter div:before:active:after {
- background-color: rgba(125, 125, 125, 0.2); }
-.tests-valo .v-splitpanel-hsplitter div:before {
- background-color: #fafafa;
- background-image: -webkit-linear-gradient(left, #fafafa 2%, #efefef 98%);
- background-image: linear-gradient(to right,#fafafa 2%, #efefef 98%); }
-.tests-valo.v-splitpanel-horizontal .v-splitpanel-second-container {
- margin-left: 1px; }
-.tests-valo .v-progressbar-wrapper {
- border-radius: 4px;
- height: 9px;
- background-color: #dbdbdb;
- background-image: -webkit-linear-gradient(bottom, #dddddd 2%, #cfcfcf 98%);
- background-image: linear-gradient(to top,#dddddd 2%, #cfcfcf 98%);
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- min-width: 74px; }
-.tests-valo .v-progressbar-indicator {
- border-radius: 4px;
- height: inherit;
- background-color: #197de1;
- background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);
- background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);
- border: 1px solid #1467b9;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- max-width: 100%;
- min-width: 8px;
- -webkit-transition: width 160ms;
- -moz-transition: width 160ms;
- transition: width 160ms; }
-.tests-valo .v-progressbar-point .v-progressbar-indicator {
- background: transparent;
- box-shadow: none;
- border: none;
- text-align: right;
- overflow: hidden; }
- .tests-valo .v-progressbar-point .v-progressbar-indicator:before {
- content: "";
- display: inline-block;
- border-radius: 4px;
- height: inherit;
- background-color: #197de1;
- background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);
- background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);
- border: 1px solid #1467b9;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- max-width: 100%;
- width: 9px;
- vertical-align: top; }
-.tests-valo .v-slider {
- position: relative; }
- .tests-valo .v-slider:focus {
- outline: none; }
- .tests-valo .v-slider:focus .v-slider-handle:after {
- opacity: 1; }
- .v-ie8 .tests-valo .v-slider:focus .v-slider-handle:after {
- visibility: visible; }
- .tests-valo .v-slider.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
-.tests-valo .v-slider-base {
- border-radius: 4px;
- height: 9px;
- background-color: #dbdbdb;
- background-image: -webkit-linear-gradient(bottom, #dddddd 2%, #cfcfcf 98%);
- background-image: linear-gradient(to top,#dddddd 2%, #cfcfcf 98%);
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- min-width: 74px;
- height: 6px;
- margin: 16px 11px;
- white-space: nowrap;
- overflow: hidden; }
- .tests-valo .v-slider-base:before {
- content: "";
- position: absolute;
- top: 16px;
- bottom: 16px;
- left: 11px;
- width: 4px;
- border-radius: 4px;
- border-left: 1px solid #1467b9; }
- .tests-valo .v-slider-base:after {
- border-radius: 4px;
- height: inherit;
- background-color: #197de1;
- background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);
- background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);
- border: 1px solid #1467b9;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- max-width: 100%;
- content: "";
- display: inline-block;
- margin-left: -100%;
- width: 100%;
- vertical-align: top; }
- .v-ie8 .tests-valo .v-slider-base:after {
- position: relative;
- left: -11px; }
-.tests-valo .v-slider-handle {
- margin-top: -16px;
- width: .1px;
- display: inline-block;
- vertical-align: top; }
- .tests-valo .v-slider-handle:before {
- height: 37px;
- padding: 0 16px;
- color: #2f2f2f;
- font-weight: 400;
- border-radius: 4px;
- border: 1px solid #cecece;
- border-top-color: #cecece;
- border-bottom-color: #c5c5c5;
- background-color: #fafafa;
- background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);
- background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);
- box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #eaeaea, 0 2px 3px rgba(0, 0, 0, 0.05);
- text-shadow: 0 1px 0 #fafafa; }
- .tests-valo .v-slider-handle:before:after {
- border: inherit;
- top: -1px;
- right: -1px;
- bottom: -1px;
- left: -1px; }
- .tests-valo .v-slider-handle:before:hover:after {
- background-color: rgba(186, 186, 186, 0.1); }
- .tests-valo .v-slider-handle:before:focus:after {
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- .tests-valo .v-slider-handle:before:active:after {
- background-color: rgba(125, 125, 125, 0.2); }
- .tests-valo .v-slider-handle:after {
- border: 1px solid #cecece;
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);
- opacity: 0;
- -webkit-transition: opacity 200ms;
- -moz-transition: opacity 200ms;
- transition: opacity 200ms; }
- .v-ie8 .tests-valo .v-slider-handle:after {
- visibility: hidden; }
- .tests-valo .v-slider-handle:before, .tests-valo .v-slider-handle:after {
- content: "";
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- padding: 0;
- width: 22px;
- height: 22px;
- border-radius: 11px;
- position: absolute;
- z-index: 1;
- margin-top: 8px;
- margin-left: -11px; }
-.tests-valo .v-slider-feedback {
- background-color: #323232;
- background-color: rgba(50, 50, 50, 0.9);
- box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);
- color: white;
- padding: 5px 9px;
- border-radius: 3px;
- max-width: 35em;
- overflow: hidden !important;
- font-size: 14px; }
-.tests-valo .v-slider-vertical {
- padding: 11px 0;
- height: 96px; }
- .tests-valo .v-slider-vertical .v-slider-base {
- background-color: #dbdbdb;
- background-image: -webkit-linear-gradient(right, #dddddd 2%, #cfcfcf 98%);
- background-image: linear-gradient(to left,#dddddd 2%, #cfcfcf 98%);
- width: 6px;
- height: 100% !important;
- min-width: 0;
- margin: 0 16px; }
- .tests-valo .v-slider-vertical .v-slider-base:before {
- top: auto;
- bottom: 11px;
- left: 16px;
- right: 16px;
- width: auto;
- height: 4px;
- border-left: none;
- border-bottom: 1px solid #1467b9; }
- .tests-valo .v-slider-vertical .v-slider-base:after {
- height: 101%;
- margin-left: 0;
- background-color: #197de1;
- background-image: -webkit-linear-gradient(left, #1b87e3 2%, #166ed5 98%);
- background-image: linear-gradient(to right,#1b87e3 2%, #166ed5 98%); }
- .v-ie8 .tests-valo .v-slider-vertical .v-slider-base:after {
- top: 11px;
- left: 0;
- height: 130%; }
- .tests-valo .v-slider-vertical .v-slider-handle {
- width: 0;
- height: .1px;
- width: 37px;
- display: block; }
- .tests-valo .v-slider-vertical .v-slider-handle:before, .tests-valo .v-slider-vertical .v-slider-handle:after {
- width: 22px;
- height: 22px;
- margin-top: -11px;
- margin-left: -8px; }
-.tests-valo .v-tabsheet:not(.v-has-width) {
- width: auto !important; }
-.tests-valo .v-tabsheet-spacertd {
- display: none !important; }
-.tests-valo .v-tabsheet-tabcontainer {
- position: relative;
- line-height: 37px;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none; }
- .tests-valo .v-tabsheet-tabcontainer table,
- .tests-valo .v-tabsheet-tabcontainer tbody,
- .tests-valo .v-tabsheet-tabcontainer tr {
- display: inline-block;
- border-spacing: 0;
- border-collapse: collapse;
- vertical-align: top; }
- .tests-valo .v-tabsheet-tabcontainer td {
- display: inline-block;
- padding: 0; }
- .tests-valo .v-tabsheet-tabcontainer:before {
- content: "";
- position: absolute;
- height: 1px;
- background: #dbdbdb;
- bottom: 0;
- left: 0;
- right: 0; }
-.tests-valo .v-tabsheet-tabs {
- height: 37px;
- position: relative;
- white-space: nowrap;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box; }
- .tests-valo .v-tabsheet-tabs .v-caption {
- height: 37px;
- margin-left: 19px;
- padding: 0 4px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- cursor: pointer;
- text-align: center;
- line-height: 37px;
- font-size: 16px;
- font-weight: 300;
- color: #737373;
- width: auto !important;
- -webkit-transition: border-bottom 200ms, color 200ms;
- -moz-transition: border-bottom 200ms, color 200ms;
- transition: border-bottom 200ms, color 200ms; }
- .tests-valo .v-tabsheet-tabs .v-caption .v-icon {
- cursor: inherit; }
- .tests-valo .v-tabsheet-tabs .v-caption .v-icon + .v-captiontext {
- margin-left: 9px; }
- .tests-valo .v-tabsheet-tabs .v-caption:hover {
- color: #197de1; }
- .tests-valo .v-tabsheet-tabs .v-caption.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50);
- cursor: default;
- color: inherit !important;
- border-bottom: none; }
- .tests-valo .v-tabsheet-tabs td:first-child .v-caption,
- .tests-valo .v-tabsheet-tabs [aria-hidden="true"] + td .v-caption {
- margin-left: 0; }
-.tests-valo .v-tabsheet-tabitemcell:focus {
- outline: none; }
- .tests-valo .v-tabsheet-tabitemcell:focus .v-caption {
- color: #197de1;
- border-bottom: 1px solid #197de1; }
-.tests-valo .v-tabsheet-tabitem-selected .v-caption.v-caption {
- border-bottom: 2px solid #197de1;
- color: #197de1; }
-.tests-valo .v-tabsheet-caption-close {
- display: inline-block;
- font-size: 1.2em;
- line-height: 1;
- vertical-align: middle;
- padding: 2px 4px;
- margin: -2px -4px -2px 4px;
- border-radius: 2px; }
- .tests-valo .v-tabsheet-caption-close:hover {
- background: #197de1;
- color: #d9e5f1; }
- .tests-valo .v-tabsheet-caption-close:active {
- background: #1670ca;
- color: #d9e5f1; }
-.tests-valo .v-tabsheet-scroller {
- position: absolute;
- right: 0;
- top: 0;
- padding-left: 19px;
- background-color: transparent;
- background-image: -webkit-linear-gradient(right, #fafafa 70%, rgba(250, 250, 250, 0) 100%);
- background-image: linear-gradient(to left,#fafafa 70%, rgba(250, 250, 250, 0) 100%);
- pointer-events: none;
- line-height: 37px; }
- .tests-valo .v-tabsheet-scroller:after {
- content: "";
- height: 1px;
- position: absolute;
- bottom: 0;
- left: 0;
- right: 0;
- display: block;
- background-color: transparent;
- background-image: -webkit-linear-gradient(right, #dbdbdb 70%, rgba(219, 219, 219, 0) 100%);
- background-image: linear-gradient(to left,#dbdbdb 70%, rgba(219, 219, 219, 0) 100%); }
- .v-ie8 .tests-valo .v-tabsheet-scroller, .v-ie9 .tests-valo .v-tabsheet-scroller {
- background-color: #fafafa; }
- .v-ie8 .tests-valo .v-tabsheet-scroller:after, .v-ie9 .tests-valo .v-tabsheet-scroller:after {
- background-color: #dbdbdb; }
- .tests-valo .v-tabsheet-scroller button {
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- border: none;
- background: transparent;
- font: inherit;
- color: inherit;
- height: 37px;
- line-height: 37px;
- margin: 0;
- padding: 0 9px;
- outline: none;
- cursor: pointer;
- pointer-events: auto;
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-tabsheet-scroller button:hover {
- opacity: 1;
- filter: none;
- color: #197de1; }
- .tests-valo .v-tabsheet-scroller button:active {
- opacity: 0.7;
- filter: alpha(opacity=70);
- color: #197de1; }
- .tests-valo .v-tabsheet-scroller button::-moz-focus-inner {
- padding: 0;
- border: 0; }
- .tests-valo .v-tabsheet-scroller [class*="Next"] {
- padding-left: 5px; }
- .tests-valo .v-tabsheet-scroller [class*="Next"]:before {
- font-family: FontAwesome;
- content: "\f054"; }
- .tests-valo .v-tabsheet-scroller [class*="Prev"] {
- padding-right: 5px; }
- .tests-valo .v-tabsheet-scroller [class*="Prev"]:before {
- font-family: FontAwesome;
- content: "\f053"; }
- .tests-valo .v-tabsheet-scroller [class*="disabled"] {
- cursor: default;
- color: inherit !important;
- opacity: 0.1 !important;
- filter: alpha(opacity=10) !important; }
-.tests-valo .v-tabsheet-tabsheetpanel > .v-scrollable > .v-widget {
- -webkit-animation: valo-anim-fade-in 300ms;
- -moz-animation: valo-anim-fade-in 300ms;
- animation: valo-anim-fade-in 300ms; }
-.tests-valo .v-colorpicker-popup.v-window {
- min-width: 220px !important; }
-.tests-valo .v-colorpicker-popup .v-tabsheet-tabs {
- padding: 0 9px; }
-.tests-valo .v-colorpicker-popup [class$="sliders"] {
- padding: 12px; }
- .tests-valo .v-colorpicker-popup [class$="sliders"] .v-widget {
- width: 100% !important;
- vertical-align: middle; }
- .tests-valo .v-colorpicker-popup [class$="sliders"] .v-has-caption {
- white-space: nowrap;
- padding-left: 48px; }
- .tests-valo .v-colorpicker-popup [class$="sliders"] .v-caption {
- display: inline-block;
- margin-left: -48px;
- width: 48px; }
- .tests-valo .v-colorpicker-popup [class$="sliders"] .v-slot-hue-slider + .v-slot .v-has-caption {
- padding-left: 80px; }
- .tests-valo .v-colorpicker-popup [class$="sliders"] .v-slot-hue-slider + .v-slot .v-caption {
- margin-left: -80px;
- width: 80px; }
-.tests-valo .v-colorpicker-popup .v-slider-red .v-slider-base:after {
- background: red;
- border: none;
- box-shadow: none; }
-.tests-valo .v-colorpicker-popup .v-slider-green .v-slider-base:after {
- background: green;
- border: none;
- box-shadow: none; }
-.tests-valo .v-colorpicker-popup .v-slider-blue .v-slider-base:after {
- background: blue;
- border: none;
- box-shadow: none; }
-.tests-valo .v-colorpicker-popup .v-margin-bottom {
- padding-bottom: 0; }
-.tests-valo .v-colorpicker-popup .resize-button {
- width: 100% !important;
- height: auto !important;
- text-align: center;
- outline: none; }
- .tests-valo .v-colorpicker-popup .resize-button:before {
- font-family: FontAwesome;
- content: "\F141"; }
-.tests-valo .v-colorpicker-popup .resize-button-caption {
- display: none; }
-.tests-valo .v-colorpicker-popup .v-horizontallayout {
- height: auto !important;
- padding: 9px 0;
- background-color: #fafafa;
- border-top: 1px solid #ededed; }
- .tests-valo .v-colorpicker-popup .v-horizontallayout .v-expand {
- overflow: visible; }
- .tests-valo .v-colorpicker-popup .v-horizontallayout .v-button {
- width: 80% !important; }
-.tests-valo .v-colorpicker-preview {
- width: 100% !important;
- height: auto !important;
- padding: 9px; }
-.tests-valo .v-colorpicker-preview-textfield {
- height: auto !important;
- text-align: center;
- border: none; }
-.tests-valo .v-colorpicker {
- width: auto !important; }
-.tests-valo .v-colorpicker-button-color {
- position: absolute;
- top: 6px;
- right: 6px;
- bottom: 6px;
- left: 6px;
- border-radius: 3px;
- border: 1px solid rgba(0, 0, 0, 0.5);
- max-width: 23px; }
- .tests-valo .v-colorpicker-button-color + .v-button-caption:not(:empty) {
- margin-left: 19px; }
-.tests-valo .v-panel {
- background: white;
- color: #474747;
- border-radius: 4px;
- border: 1px solid #dbdbdb;
- box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); }
-.tests-valo .v-panel-caption {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- padding: 0 12px;
- line-height: 36px;
- border-bottom: 1px solid #e4e4e4;
- border-radius: 3px 3px 0 0;
- background-color: #fafafa;
- background-image: -webkit-linear-gradient(top, #fafafa 2%, #f6f6f6 98%);
- background-image: linear-gradient(to bottom,#fafafa 2%, #f6f6f6 98%);
- color: #464646;
- font-weight: 400;
- font-size: 14px;
- box-shadow: inset 0 1px 0 white;
- text-shadow: 0 1px 0 #fafafa; }
-.tests-valo .v-panel-content {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- width: 100%;
- height: 100%; }
- .tests-valo .v-panel-content > .v-margin-top {
- padding-top: 12px; }
- .tests-valo .v-panel-content > .v-margin-right {
- padding-right: 12px; }
- .tests-valo .v-panel-content > .v-margin-bottom {
- padding-bottom: 12px; }
- .tests-valo .v-panel-content > .v-margin-left {
- padding-left: 12px; }
-.tests-valo .v-accordion {
- background: white;
- color: #474747;
- border-radius: 4px;
- border: 1px solid #dbdbdb;
- box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05);
- background-color: #fafafa;
- background-image: -webkit-linear-gradient(top, #fafafa 2%, #f4f4f4 98%);
- background-image: linear-gradient(to bottom,#fafafa 2%, #f4f4f4 98%);
- overflow: hidden; }
-.tests-valo .v-accordion-item {
- position: relative;
- overflow: hidden; }
- .tests-valo .v-accordion-item:first-child {
- border-radius: 3px 3px 0 0; }
- .tests-valo .v-accordion-item:first-child .v-accordion-item-caption {
- border-radius: inherit; }
- .tests-valo .v-accordion-item:last-child {
- border-radius: 0 0 3px 3px; }
-.tests-valo .v-accordion-item-caption .v-caption {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- padding: 0 12px;
- line-height: 36px;
- border-bottom: 1px solid #e4e4e4;
- border-radius: 3px 3px 0 0;
- background-color: #fafafa;
- background-image: -webkit-linear-gradient(top, #fafafa 2%, #f6f6f6 98%);
- background-image: linear-gradient(to bottom,#fafafa 2%, #f6f6f6 98%);
- color: #464646;
- font-weight: 400;
- font-size: 14px;
- box-shadow: inset 0 1px 0 white;
- text-shadow: 0 1px 0 #fafafa;
- border-radius: inherit;
- display: block;
- background: transparent;
- border-bottom-color: #d2d2d2;
- cursor: pointer;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none; }
- .tests-valo .v-accordion-item-caption .v-caption:hover:before, .tests-valo .v-accordion-item-caption .v-caption:active:before {
- content: "";
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0; }
- .tests-valo .v-accordion-item-caption .v-caption:hover:before {
- background-color: rgba(186, 186, 186, 0.1);
- border: none; }
- .tests-valo .v-accordion-item-caption .v-caption:active:before {
- background-color: rgba(125, 125, 125, 0.2); }
-.tests-valo .v-accordion-item:last-child:not(.v-accordion-item-open) .v-caption {
- border-bottom: none; }
-.tests-valo .v-accordion-item-content {
- position: absolute;
- width: 100%;
- bottom: 0;
- right: 0;
- box-shadow: inset 0 2px 3px rgba(0, 0, 0, 0.05);
- background-color: white;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box; }
- .tests-valo .v-accordion-item-content > .v-margin-top {
- padding-top: 12px; }
- .tests-valo .v-accordion-item-content > .v-margin-right {
- padding-right: 12px; }
- .tests-valo .v-accordion-item-content > .v-margin-bottom {
- padding-bottom: 12px; }
- .tests-valo .v-accordion-item-content > .v-margin-left {
- padding-left: 12px; }
-.tests-valo .v-accordion-item-open + .v-accordion-item {
- border-top: 1px solid #dfdfdf; }
-.tests-valo .v-select-twincol {
- white-space: normal; }
- .tests-valo .v-select-twincol select {
- border: 1px solid #cecece;
- background-color: #fafafa;
- background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);
- background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); }
- .tests-valo .v-select-twincol select:focus {
- outline: none;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- .tests-valo .v-select-twincol .v-textfield,
- .tests-valo .v-select-twincol .v-nativebutton {
- width: auto !important;
- margin-top: 9px; }
- .tests-valo .v-select-twincol .v-nativebutton {
- margin-left: 9px; }
-.tests-valo .v-select-twincol-caption-left,
-.tests-valo .v-select-twincol-caption-right {
- font-size: 14px;
- font-weight: 400;
- padding-bottom: .3em;
- padding-left: 1px; }
-.tests-valo .v-select-twincol-buttons {
- white-space: nowrap;
- display: inline-block;
- vertical-align: top;
- position: relative;
- min-width: 3.5em; }
- .tests-valo .v-select-twincol-buttons .v-button {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- display: inline-block;
- text-align: left;
- white-space: normal;
- line-height: 1.55;
- position: absolute;
- left: 9px;
- right: 9px;
- top: 36px;
- padding: 0;
- text-align: center; }
- .tests-valo .v-select-twincol-buttons .v-button:first-child {
- top: 0; }
- .tests-valo .v-select-twincol-buttons .v-button-caption {
- display: none; }
- .tests-valo .v-select-twincol-buttons .v-button:focus {
- z-index: 1; }
- .tests-valo .v-select-twincol-buttons .v-button:first-child {
- border-radius: 4px 4px 0 0; }
- .tests-valo .v-select-twincol-buttons .v-button:last-child {
- border-radius: 0 0 4px 4px; }
- .tests-valo .v-select-twincol-buttons .v-button-wrap:before {
- font-family: FontAwesome;
- content: "\f053"; }
- .tests-valo .v-select-twincol-buttons .v-button:first-child .v-button-wrap:before {
- font-family: FontAwesome;
- content: "\f054"; }
-.tests-valo .v-select select {
- border: 1px solid #cecece;
- background-color: #fafafa;
- background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);
- background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); }
- .tests-valo .v-select select:focus {
- outline: none;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
-.tests-valo .v-select-select {
- display: block; }
- .tests-valo .v-select-select + .v-textfield {
- width: auto !important;
- margin-top: 9px; }
- .tests-valo .v-select-select + .v-textfield + .v-nativebutton {
- margin-top: 9px;
- margin-left: 9px; }
-.tests-valo .v-calendar-header-day {
- font-weight: 400;
- text-align: center;
- padding: 7px 0; }
-.tests-valo .v-calendar-header-week .v-calendar-back,
-.tests-valo .v-calendar-header-week .v-calendar-next {
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- background: transparent;
- border: none;
- padding: 0;
- margin: 0;
- cursor: pointer;
- outline: none;
- color: inherit;
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-calendar-header-week .v-calendar-back:focus,
- .tests-valo .v-calendar-header-week .v-calendar-next:focus {
- outline: none; }
- .tests-valo .v-calendar-header-week .v-calendar-back:hover,
- .tests-valo .v-calendar-header-week .v-calendar-next:hover {
- opacity: 1;
- filter: none; }
- .tests-valo .v-calendar-header-week .v-calendar-back:active,
- .tests-valo .v-calendar-header-week .v-calendar-next:active {
- opacity: 0.5;
- filter: alpha(opacity=50); }
-.tests-valo .v-calendar-header-week .v-calendar-back:before {
- font-family: FontAwesome;
- content: "\f053"; }
-.tests-valo .v-calendar-header-week .v-calendar-next:before {
- font-family: FontAwesome;
- content: "\f054"; }
-.tests-valo .v-calendar-month {
- outline: none;
- overflow: hidden; }
- .tests-valo .v-calendar-month td {
- vertical-align: top; }
-.tests-valo .v-calendar-week-number {
- cursor: pointer;
- width: 20px;
- text-align: center;
- font-size: 0.8em;
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-calendar-week-number:hover {
- opacity: 1;
- filter: none; }
-.tests-valo .v-calendar-month-day {
- outline: none;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- line-height: 1.2; }
-.tests-valo .v-calendar-bottom-spacer,
-.tests-valo .v-calendar-spacer,
-.tests-valo .v-calendar-bottom-spacer-empty {
- height: 19px;
- margin-bottom: 3px; }
-.tests-valo .v-calendar-bottom-spacer {
- font-size: 0.8em;
- padding: 0 5px;
- cursor: pointer; }
- .tests-valo .v-calendar-bottom-spacer:hover {
- color: #197de1; }
-.tests-valo .v-calendar-day-number {
- line-height: 25px;
- font-size: 16px;
- text-align: right;
- margin: 0 5px;
- white-space: nowrap;
- border-top: 1px solid #f2f2f2;
- cursor: pointer; }
- .tests-valo .v-calendar-day-number:hover {
- color: #197de1; }
-.tests-valo .v-calendar-month-day-today {
- background: #eef3f8; }
- .tests-valo .v-calendar-month-day-today .v-calendar-day-number {
- font-weight: 400;
- color: #197de1;
- border-top: 2px solid #197de1;
- line-height: 24px;
- margin: 0;
- padding: 0 5px; }
-.tests-valo .v-calendar-month-day-selected {
- background-color: #e3edf7; }
-.tests-valo .v-calendar-month-day-dragemphasis {
- background-color: #a8a8a8; }
-.tests-valo .v-calendar-month-day-scrollable {
- overflow-y: scroll; }
-.tests-valo .v-calendar-weekly-longevents {
- margin-left: 50px;
- border-bottom: 3px solid #e0e0e0; }
- .tests-valo .v-calendar-weekly-longevents .v-calendar-event-all-day {
- height: 22px;
- line-height: 1.6;
- margin-bottom: 3px; }
-.tests-valo .v-calendar-header-week td {
- vertical-align: middle !important; }
-.tests-valo .v-calendar-header-week .v-calendar-header-day {
- cursor: pointer; }
-.tests-valo .v-calendar-times {
- width: 50px;
- font-size: 0.77em;
- line-height: 1;
- white-space: nowrap; }
-.tests-valo .v-calendar-time {
- text-align: right;
- padding-right: 9px;
- margin-top: -6px;
- padding-bottom: 6px; }
-.tests-valo .v-calendar-day-times,
-.tests-valo .v-calendar-day-times-today {
- outline: none;
- border-right: 1px solid transparent; }
- .tests-valo .v-calendar-day-times:focus,
- .tests-valo .v-calendar-day-times-today:focus {
- outline: none; }
-.tests-valo .v-calendar .v-datecellslot,
-.tests-valo .v-calendar .v-datecellslot-even {
- border-top: 1px solid #ededed; }
- .tests-valo .v-calendar .v-datecellslot:first-child,
- .tests-valo .v-calendar .v-datecellslot-even:first-child {
- border-top-color: transparent; }
-.tests-valo .v-calendar .v-datecellslot {
- border-top-style: dotted; }
-.tests-valo .v-calendar .v-datecellslot,
-.tests-valo .v-calendar .v-datecellslot-even {
- margin-right: 5px; }
-.tests-valo .v-calendar-current-time {
- background: #197de1;
- line-height: 1px;
- pointer-events: none;
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-calendar-current-time:before {
- content: "\2022";
- color: #197de1;
- font-size: 22px;
- margin-left: -0.07em; }
-.tests-valo .v-calendar .v-daterange {
- position: relative; }
- .tests-valo .v-calendar .v-daterange:before {
- content: "";
- position: absolute;
- top: 0;
- right: 0;
- bottom: -1px;
- left: 0;
- background: #197de1;
- opacity: 0.5;
- filter: alpha(opacity=50);
- border-radius: 4px 4px 0 0; }
- .tests-valo .v-calendar .v-daterange + .v-daterange {
- border-color: transparent; }
- .tests-valo .v-calendar .v-daterange + .v-daterange:before {
- border-radius: 0; }
-.tests-valo .v-calendar-event {
- font-size: 0.85em;
- overflow: hidden;
- cursor: pointer;
- outline: none;
- border-radius: 4px; }
- .tests-valo .v-calendar-event:focus {
- outline: none; }
-.tests-valo .v-calendar-event-month {
- padding: 0 5px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- margin-bottom: 3px;
- white-space: nowrap;
- text-overflow: ellipsis;
- height: 19px;
- line-height: 19px; }
- .tests-valo .v-calendar-event-month .v-calendar-event-time {
- float: right;
- font-size: 0.9em;
- line-height: 19px;
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-calendar-event-month:before {
- content: "\25cf";
- margin-right: .2em; }
-.tests-valo .v-calendar-event-all-day {
- padding: 0 5px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- height: 19px;
- line-height: 19px;
- border-radius: 0;
- margin-left: -1px;
- white-space: nowrap; }
- .tests-valo .v-calendar-event-all-day:before {
- content: ""; }
-.tests-valo .v-calendar-event-start {
- overflow: visible;
- margin-left: 0; }
- .tests-valo .v-calendar-event-start.v-calendar-event-continued-to, .tests-valo .v-calendar-event-start.v-calendar-event-end {
- overflow: hidden;
- text-overflow: ellipsis; }
-.tests-valo .v-calendar-event-start {
- border-top-left-radius: 4px;
- border-bottom-left-radius: 4px;
- margin-left: 5px; }
-.tests-valo .v-calendar-event-end {
- border-top-right-radius: 4px;
- border-bottom-right-radius: 4px;
- margin-right: 5px; }
-.tests-valo .v-calendar-event-caption {
- font-weight: 500;
- line-height: 1.2;
- padding: 5px 0;
- position: absolute;
- overflow: hidden;
- right: 9px;
- left: 5px;
- bottom: 0;
- top: 0; }
- .tests-valo .v-calendar-event-caption span {
- font-weight: 300;
- white-space: nowrap; }
-.tests-valo .v-calendar-week-wrapper .v-calendar-event {
- overflow: visible; }
-.tests-valo .v-calendar-week-wrapper .v-calendar-event-content {
- margin-top: -1px;
- border-radius: 5px;
- border: 1px solid #fafafa;
- padding-top: 3px;
- margin-right: 5px; }
-.tests-valo .v-calendar-event-month:before {
- color: dodgerblue; }
-.tests-valo .v-calendar-event-all-day {
- background-color: #cee4fb;
- background-color: rgba(206, 228, 251, 0.8);
- color: dodgerblue; }
-.tests-valo .v-calendar-week-wrapper .v-calendar-event {
- color: dodgerblue; }
- .tests-valo .v-calendar-week-wrapper .v-calendar-event .v-calendar-event-content {
- background-color: #cee4fb;
- background-color: rgba(206, 228, 251, 0.8); }
-.tests-valo .v-calendar-event-month[class*="color2"]:before {
- color: seagreen; }
-.tests-valo .v-calendar-event-all-day[class*="color2"] {
- background-color: #d1e3d9;
- background-color: rgba(209, 227, 217, 0.8);
- color: seagreen; }
-.tests-valo .v-calendar-week-wrapper .v-calendar-event[class*="color2"] {
- color: seagreen; }
- .tests-valo .v-calendar-week-wrapper .v-calendar-event[class*="color2"] .v-calendar-event-content {
- background-color: #d1e3d9;
- background-color: rgba(209, 227, 217, 0.8); }
-.tests-valo .v-calendar-event-month[class*="color3"]:before {
- color: darkgoldenrod; }
-.tests-valo .v-calendar-event-all-day[class*="color3"] {
- background-color: #ece2ca;
- background-color: rgba(236, 226, 202, 0.8);
- color: darkgoldenrod; }
-.tests-valo .v-calendar-week-wrapper .v-calendar-event[class*="color3"] {
- color: darkgoldenrod; }
- .tests-valo .v-calendar-week-wrapper .v-calendar-event[class*="color3"] .v-calendar-event-content {
- background-color: #ece2ca;
- background-color: rgba(236, 226, 202, 0.8); }
-.tests-valo .v-calendar-event-month[class*="color4"]:before {
- color: firebrick; }
-.tests-valo .v-calendar-event-all-day[class*="color4"] {
- background-color: #ebcece;
- background-color: rgba(235, 206, 206, 0.8);
- color: firebrick; }
-.tests-valo .v-calendar-week-wrapper .v-calendar-event[class*="color4"] {
- color: firebrick; }
- .tests-valo .v-calendar-week-wrapper .v-calendar-event[class*="color4"] .v-calendar-event-content {
- background-color: #ebcece;
- background-color: rgba(235, 206, 206, 0.8); }
-.tests-valo .v-calendar-event-month[class*="color5"]:before {
- color: slateblue; }
-.tests-valo .v-calendar-event-all-day[class*="color5"] {
- background-color: #dddaf1;
- background-color: rgba(221, 218, 241, 0.8);
- color: slateblue; }
-.tests-valo .v-calendar-week-wrapper .v-calendar-event[class*="color5"] {
- color: slateblue; }
- .tests-valo .v-calendar-week-wrapper .v-calendar-event[class*="color5"] .v-calendar-event-content {
- background-color: #dddaf1;
- background-color: rgba(221, 218, 241, 0.8); }
-.tests-valo .v-calendar.v-disabled * {
- cursor: default; }
-.tests-valo .v-label-undef-w {
- white-space: nowrap; }
-.tests-valo h1, .tests-valo .h1,
-.tests-valo h2, .tests-valo .h2,
-.tests-valo h3, .tests-valo .h3 {
- line-height: 1.1;
- font-weight: 200;
- color: #131313; }
-.tests-valo h1, .tests-valo .h1 {
- font-size: 2.4em;
- margin-top: 1.4em;
- margin-bottom: 1em;
- letter-spacing: -0.03em; }
-.tests-valo h2, .tests-valo .h2 {
- font-size: 1.6em;
- margin-top: 1.6em;
- margin-bottom: 0.77em;
- letter-spacing: -0.02em; }
-.tests-valo h3, .tests-valo .h3 {
- font-size: 1.2em;
- margin-top: 1.8em;
- margin-bottom: 0.77em;
- letter-spacing: 0; }
-.tests-valo h4, .tests-valo .h4 {
- line-height: 1.1;
- font-weight: 500;
- font-size: 0.87em;
- color: #404040;
- text-transform: uppercase;
- letter-spacing: 0;
- margin-top: 2.4em;
- margin-bottom: 0.8em; }
-.tests-valo .v-csslayout > h1:first-child,
-.tests-valo .v-csslayout > h2:first-child,
-.tests-valo .v-csslayout > h3:first-child,
-.tests-valo .v-csslayout > h4
-> .h1:first-child,
-.tests-valo .v-csslayout > .h2:first-child,
-.tests-valo .v-csslayout > .h3
-> .h4:first-child {
- margin-top: 16px; }
-.tests-valo .v-verticallayout > .v-slot:first-child h1, .tests-valo .v-verticallayout > .v-slot:first-child .h1,
-.tests-valo .v-verticallayout > .v-slot:first-child h2, .tests-valo .v-verticallayout > .v-slot:first-child .h2,
-.tests-valo .v-verticallayout > .v-slot:first-child h3, .tests-valo .v-verticallayout > .v-slot:first-child .h3
-h4, .tests-valo .v-verticallayout > .v-slot:first-child .h4,
-.tests-valo .v-verticallayout > div > .v-slot:first-child h1,
-.tests-valo .v-verticallayout > div > .v-slot:first-child .h1,
-.tests-valo .v-verticallayout > div > .v-slot:first-child h2,
-.tests-valo .v-verticallayout > div > .v-slot:first-child .h2,
-.tests-valo .v-verticallayout > div > .v-slot:first-child h3,
-.tests-valo .v-verticallayout > div > .v-slot:first-child .h3
-h4,
-.tests-valo .v-verticallayout > div > .v-slot:first-child .h4 {
- margin-top: 16px; }
-.tests-valo h1.no-margin, .tests-valo .h1.no-margin,
-.tests-valo h2.no-margin, .tests-valo .h2.no-margin,
-.tests-valo h3.no-margin, .tests-valo .h3.no-margin,
-.tests-valo h4.no-margin, .tests-valo .h4.no-margin {
- margin: 0 !important; }
-.tests-valo .v-label-large {
- font-size: 1.2em; }
-.tests-valo .v-label-small {
- font-size: 0.87em; }
-.tests-valo .v-label-bold {
- font-weight: 500; }
-.tests-valo .v-label-light {
- font-weight: 200;
- color: #898989; }
-.tests-valo [draggable=true] {
- -khtml-user-drag: element;
- -webkit-user-drag: element;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none; }
-.tests-valo .v-ddwrapper {
- position: relative; }
-.tests-valo .v-ddwrapper-over:before,
-.tests-valo .v-ddwrapper-over:after {
- content: "";
- position: absolute;
- z-index: 10;
- top: -1px;
- right: -1px;
- bottom: -1px;
- left: -1px; }
-.tests-valo .v-ddwrapper-over-top:before {
- border-top-width: 2px; }
-.tests-valo .v-ddwrapper-over-right:before {
- border-right-width: 2px; }
-.tests-valo .v-ddwrapper-over-bottom:before {
- border-bottom-width: 2px; }
-.tests-valo .v-ddwrapper-over-left:before {
- border-left-width: 2px; }
-.tests-valo .no-vertical-drag-hints .v-ddwrapper-over-top:before, .tests-valo .no-vertical-drag-hints.v-ddwrapper-over-top:before {
- border-top-width: 0; }
-.tests-valo .no-vertical-drag-hints .v-ddwrapper-over-top:after, .tests-valo .no-vertical-drag-hints.v-ddwrapper-over-top:after {
- border-width: 2px;
- border-radius: 4px;
- opacity: 0.3;
- filter: alpha(opacity=30);
- background: #8abef2; }
-.tests-valo .no-vertical-drag-hints .v-ddwrapper-over-bottom:before, .tests-valo .no-vertical-drag-hints.v-ddwrapper-over-bottom:before {
- border-bottom-width: 0; }
-.tests-valo .no-vertical-drag-hints .v-ddwrapper-over-bottom:after, .tests-valo .no-vertical-drag-hints.v-ddwrapper-over-bottom:after {
- border-width: 2px;
- border-radius: 4px;
- opacity: 0.3;
- filter: alpha(opacity=30);
- background: #8abef2; }
-.tests-valo .no-horizontal-drag-hints.v-ddwrapper-over-left:before,
-.tests-valo .no-horizontal-drag-hints .v-ddwrapper-over-left:before {
- border-left-width: 0; }
-.tests-valo .no-horizontal-drag-hints.v-ddwrapper-over-left:after,
-.tests-valo .no-horizontal-drag-hints .v-ddwrapper-over-left:after {
- border-width: 2px;
- border-radius: 4px;
- opacity: 0.3;
- filter: alpha(opacity=30);
- background: #8abef2; }
-.tests-valo .no-horizontal-drag-hints.v-ddwrapper-over-right:before,
-.tests-valo .no-horizontal-drag-hints .v-ddwrapper-over-right:before {
- border-right-width: 0; }
-.tests-valo .no-horizontal-drag-hints.v-ddwrapper-over-right:after,
-.tests-valo .no-horizontal-drag-hints .v-ddwrapper-over-right:after {
- border-width: 2px;
- border-radius: 4px;
- opacity: 0.3;
- filter: alpha(opacity=30);
- background: #8abef2; }
-.tests-valo .v-ddwrapper-over-middle:after,
-.tests-valo .v-ddwrapper-over-center:after {
- border-width: 2px;
- border-radius: 4px;
- opacity: 0.3;
- filter: alpha(opacity=30);
- background: #8abef2; }
-.tests-valo .no-box-drag-hints.v-ddwrapper:after,
-.tests-valo .no-box-drag-hints .v-ddwrapper:after {
- display: none !important;
- content: none; }
-.tests-valo .v-nativebutton {
- -webkit-touch-callout: none; }
-.tests-valo .v-select select {
- border: 1px solid #cecece;
- background-color: #fafafa;
- background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);
- background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); }
- .tests-valo .v-select select:focus {
- outline: none;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
-.tests-valo .v-select-select {
- display: block; }
- .tests-valo .v-select-select + .v-textfield {
- width: auto !important;
- margin-top: 9px; }
- .tests-valo .v-select-select + .v-textfield + .v-nativebutton {
- margin-top: 9px;
- margin-left: 9px; }
-.tests-valo .v-popupview-popup {
- padding: 4px 4px;
- border-radius: 4px;
- background-color: white;
- color: #474747;
- box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.05), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.1);
- -webkit-animation: valo-overlay-open 200ms;
- -moz-animation: valo-overlay-open 200ms;
- animation: valo-overlay-open 200ms;
- -webkit-backface-visibility: hidden;
- -moz-backface-visibility: hidden;
- -ms-backface-visibility: hidden;
- backface-visibility: hidden; }
- .tests-valo .v-popupview-popup .popupContent > .v-margin-top {
- padding-top: 12px; }
- .tests-valo .v-popupview-popup .popupContent > .v-margin-right {
- padding-right: 12px; }
- .tests-valo .v-popupview-popup .popupContent > .v-margin-bottom {
- padding-bottom: 12px; }
- .tests-valo .v-popupview-popup .popupContent > .v-margin-left {
- padding-left: 12px; }
-.tests-valo .v-richtextarea {
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- margin: 0;
- font: inherit;
- font-weight: 400;
- line-height: normal;
- height: 37px;
- border-radius: 4px;
- padding: 0;
- border: 1px solid #cecece;
- background: white;
- color: #474747;
- box-shadow: inset 0 1px 0 #f9f9f9, 0 1px 0 rgba(255, 255, 255, 0.1);
- -webkit-transition: box-shadow 180ms, border 180ms;
- -moz-transition: box-shadow 180ms, border 180ms;
- transition: box-shadow 180ms, border 180ms;
- height: auto;
- overflow: hidden; }
- .tests-valo .v-richtextarea.v-textfield-prompt, .tests-valo .v-richtextarea.v-textarea-prompt {
- color: #a3a3a3; }
-.tests-valo .v-richtextarea .gwt-RichTextToolbar {
- background-color: #fafafa;
- background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);
- background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);
- box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #eaeaea;
- border-bottom: 1px solid #cecece;
- color: #464646; }
-.tests-valo .v-richtextarea .gwt-ToggleButton,
-.tests-valo .v-richtextarea .gwt-PushButton {
- display: inline-block;
- line-height: 37px;
- width: 37px;
- text-align: center;
- outline: none; }
- .tests-valo .v-richtextarea .gwt-ToggleButton:hover,
- .tests-valo .v-richtextarea .gwt-PushButton:hover {
- color: #191919; }
-.tests-valo .v-richtextarea .gwt-ToggleButton-down,
-.tests-valo .v-richtextarea .gwt-ToggleButton-down-hovering {
- background-color: #e0e0e0;
- background-image: -webkit-linear-gradient(bottom, #e0e0e0 2%, gainsboro 98%);
- background-image: linear-gradient(to top,#e0e0e0 2%, gainsboro 98%); }
-.tests-valo .v-richtextarea .gwt-RichTextToolbar-top img {
- display: none; }
-.tests-valo .v-richtextarea .gwt-RichTextToolbar-top div:before {
- font-family: FontAwesome; }
-.tests-valo .v-richtextarea .gwt-RichTextToolbar-top div[title="Toggle Bold"]:before {
- content: "\f032"; }
-.tests-valo .v-richtextarea .gwt-RichTextToolbar-top div[title="Toggle Italic"]:before {
- content: "\f033"; }
-.tests-valo .v-richtextarea .gwt-RichTextToolbar-top div[title="Toggle Underline"]:before {
- content: "\f0cd"; }
-.tests-valo .v-richtextarea .gwt-RichTextToolbar-top div[title="Toggle Subscript"]:before {
- content: "\f12c"; }
-.tests-valo .v-richtextarea .gwt-RichTextToolbar-top div[title="Toggle Superscript"]:before {
- content: "\f12b"; }
-.tests-valo .v-richtextarea .gwt-RichTextToolbar-top div[title="Left Justify"]:before {
- content: "\f036"; }
-.tests-valo .v-richtextarea .gwt-RichTextToolbar-top div[title="Center"]:before {
- content: "\f037"; }
-.tests-valo .v-richtextarea .gwt-RichTextToolbar-top div[title="Right Justify"]:before {
- content: "\f038"; }
-.tests-valo .v-richtextarea .gwt-RichTextToolbar-top div[title="Toggle Strikethrough"]:before {
- content: "\f0cc"; }
-.tests-valo .v-richtextarea .gwt-RichTextToolbar-top div[title="Indent Right"]:before {
- content: "\f03c"; }
-.tests-valo .v-richtextarea .gwt-RichTextToolbar-top div[title="Indent Left"]:before {
- content: "\f03b"; }
-.tests-valo .v-richtextarea .gwt-RichTextToolbar-top div[title="Insert Horizontal Rule"]:before {
- content: "—"; }
-.tests-valo .v-richtextarea .gwt-RichTextToolbar-top div[title="Insert Ordered List"]:before {
- content: "\f0cb"; }
-.tests-valo .v-richtextarea .gwt-RichTextToolbar-top div[title="Insert Unordered List"]:before {
- content: "\f0ca"; }
-.tests-valo .v-richtextarea .gwt-RichTextToolbar-top div[title="Insert Image"]:before {
- content: "\f03e"; }
-.tests-valo .v-richtextarea .gwt-RichTextToolbar-top div[title="Create Link"]:before {
- content: "\f0c1"; }
-.tests-valo .v-richtextarea .gwt-RichTextToolbar-top div[title="Remove Link"]:before {
- content: "\f127"; }
-.tests-valo .v-richtextarea .gwt-RichTextToolbar-top div[title="Remove Formatting"]:before {
- content: "\f12d"; }
-.tests-valo .v-richtextarea .gwt-RichTextToolbar-bottom {
- font-size: 13px;
- padding: 0 9px 9px 0; }
- .tests-valo .v-richtextarea .gwt-RichTextToolbar-bottom select {
- margin: 9px 0 0 9px; }
-.tests-valo .v-richtextarea .gwt-RichTextArea {
- background: #fff;
- border: none;
- display: block; }
-.tests-valo .v-upload .v-button {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- display: inline-block;
- text-align: left;
- white-space: normal;
- line-height: 1.55; }
-.tests-valo .v-Notification[style*=" top: 0"] {
- margin-top: 12px !important; }
-.tests-valo .v-Notification[style*="right: 0"] {
- margin-right: 12px; }
-.tests-valo .v-Notification[style*="bottom: 0"] {
- margin-bottom: 12px; }
-.tests-valo .v-Notification[style*=" left: 0"] {
- margin-left: 12px !important; }
-.tests-valo .v-Notification[style*=" top: 0"] {
- -webkit-animation: valo-anim-slide-down 600ms;
- -moz-animation: valo-anim-slide-down 600ms;
- animation: valo-anim-slide-down 600ms; }
-.tests-valo .v-Notification[style*="bottom: 0"] {
- -webkit-animation: valo-anim-slide-up 600ms;
- -moz-animation: valo-anim-slide-up 600ms;
- animation: valo-anim-slide-up 600ms; }
-.tests-valo .v-Notification[style*="right: 0"] {
- -webkit-animation: valo-anim-slide-left 600ms;
- -moz-animation: valo-anim-slide-left 600ms;
- animation: valo-anim-slide-left 600ms; }
-.tests-valo .v-Notification[style*=" left: 0"]:not(.v-Notification-system):not(.bar) {
- -webkit-animation: valo-anim-slide-right 600ms;
- -moz-animation: valo-anim-slide-right 600ms;
- animation: valo-anim-slide-right 600ms; }
-.tests-valo .v-Notification {
- border-radius: 4px;
- text-align: center;
- position: fixed !important;
- -webkit-backface-visibility: hidden;
- -moz-backface-visibility: hidden;
- -ms-backface-visibility: hidden;
- backface-visibility: hidden;
- background: white;
- box-shadow: 0px 5px 15px 0px rgba(0, 0, 0, 0.15);
- padding: 19px 22px;
- -webkit-animation: valo-anim-fade-in 120ms;
- -moz-animation: valo-anim-fade-in 120ms;
- animation: valo-anim-fade-in 120ms; }
- .tests-valo .v-Notification h1 {
- margin: 0;
- display: inline-block;
- text-align: left;
- font-weight: inherit;
- line-height: inherit;
- white-space: nowrap;
- letter-spacing: 0; }
- .tests-valo .v-Notification p {
- margin: 0;
- display: inline-block;
- vertical-align: middle;
- max-width: 30em;
- text-align: left; }
- .tests-valo .v-Notification h1 ~ p {
- margin-left: 24px; }
- .tests-valo .v-Notification .v-icon + h1 {
- margin-left: 16px; }
- .tests-valo .v-Notification[style*="opacity: 0.9;"] {
- opacity: 1 !important;
- filter: none !important; }
- .tests-valo .v-Notification h1 {
- color: #197de1;
- font-size: 19px;
- line-height: 1; }
- .tests-valo .v-Notification p {
- line-height: 1.4; }
-.tests-valo .v-Notification-system {
- left: 0 !important;
- right: 0;
- max-width: 100%;
- margin: 0 !important;
- border-radius: 0;
- box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.25);
- padding: 12px 15px;
- background-color: #444;
- font-weight: 400;
- line-height: 22px; }
- .tests-valo .v-Notification-system p {
- max-width: 50em; }
- .tests-valo .v-Notification-system h1 {
- color: #fff;
- vertical-align: middle; }
- .tests-valo .v-Notification-system p {
- color: #e6e6e6; }
- .tests-valo .v-Notification-system u {
- text-decoration: none; }
-.tests-valo .v-Notification-system.v-Notification-system {
- margin: 0 !important; }
-.tests-valo .v-Notification.tray {
- text-align: left; }
- .tests-valo .v-Notification.tray h1 + p {
- display: block;
- margin: .5em 0 0; }
-.tests-valo .v-Notification.warning {
- background: #FFF3D2; }
- .tests-valo .v-Notification.warning h1 {
- color: #AC7C00; }
- .tests-valo .v-Notification.warning p {
- color: #9D874D; }
-.tests-valo .v-Notification.error {
- background: #ed473b;
- font-weight: 400;
- box-shadow: 0px 5px 15px 0px rgba(0, 0, 0, 0.25); }
- .tests-valo .v-Notification.error h1 {
- color: white; }
- .tests-valo .v-Notification.error p {
- color: #f4e0df; }
-.tests-valo .v-Notification.bar {
- left: 0 !important;
- right: 0;
- max-width: 100%;
- margin: 0 !important;
- border-radius: 0;
- box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.25);
- padding: 12px 15px; }
- .tests-valo .v-Notification.bar p {
- max-width: 50em; }
-.tests-valo .v-Notification.closable {
- padding-right: 59px;
- overflow: hidden !important;
- cursor: pointer; }
- .tests-valo .v-Notification.closable:after {
- content: "\00d7";
- font-size: 1.5em;
- position: absolute;
- top: 50%;
- margin-top: -12px;
- right: 12px;
- width: 25px;
- height: 25px;
- line-height: 24px;
- cursor: pointer;
- color: #000;
- opacity: 0.5;
- filter: alpha(opacity=50);
- text-align: center;
- border: 1px solid black;
- border-color: rgba(0, 0, 0, 0.3);
- border-radius: 50%;
- -webkit-transition: opacity 200ms;
- -moz-transition: opacity 200ms;
- transition: opacity 200ms; }
- .tests-valo .v-Notification.closable:hover:after {
- opacity: 1;
- filter: none; }
- .tests-valo .v-Notification.closable:active:after {
- background-color: #000;
- color: #fff;
- opacity: 0.3;
- filter: alpha(opacity=30);
- -webkit-transition: none 200ms;
- -moz-transition: none 200ms;
- transition: none 200ms; }
- .tests-valo .v-Notification.closable.error:after, .tests-valo .v-Notification.closable.system:after {
- color: #fff;
- border-color: #fff;
- border-color: rgba(255, 255, 255, 0.3); }
- .tests-valo .v-Notification.closable.error:active:after, .tests-valo .v-Notification.closable.system:active:after {
- background-color: #fff;
- color: #000; }
- .tests-valo .v-Notification.closable.tray:after {
- top: 16px;
- margin-top: 0; }
-.tests-valo .v-button-primary {
- height: 37px;
- padding: 0 16px;
- color: #ecf2f8;
- font-weight: 400;
- border-radius: 4px;
- border: 1px solid #1467b9;
- border-top-color: #166fbb;
- border-bottom-color: #125aaf;
- background-color: #197de1;
- background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);
- background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);
- box-shadow: inset 0 1px 0 #4595e5, inset 0 -1px 0 #166ccd, 0 2px 3px rgba(0, 0, 0, 0.05);
- text-shadow: 0 -1px 0 #197de1;
- padding: 0 19px;
- font-weight: bold;
- min-width: 81px; }
- .tests-valo .v-button-primary:after {
- border: inherit;
- top: -1px;
- right: -1px;
- bottom: -1px;
- left: -1px; }
- .tests-valo .v-button-primary:hover:after {
- background-color: rgba(90, 163, 237, 0.1); }
- .tests-valo .v-button-primary:focus:after {
- border: inherit;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- .tests-valo .v-button-primary:active:after {
- background-color: rgba(2, 62, 122, 0.2); }
- .v-ie8 .tests-valo .v-button-primary {
- min-width: 43px; }
-.tests-valo .v-button-friendly {
- height: 37px;
- padding: 0 16px;
- color: #eaf4e9;
- font-weight: 400;
- border-radius: 4px;
- border: 1px solid #247c1a;
- border-top-color: #26831c;
- border-bottom-color: #1f7016;
- background-color: #2c9720;
- background-image: -webkit-linear-gradient(top, #2f9f22 2%, #26881b 98%);
- background-image: linear-gradient(to bottom,#2f9f22 2%, #26881b 98%);
- box-shadow: inset 0 1px 0 #42af36, inset 0 -1px 0 #26831b, 0 2px 3px rgba(0, 0, 0, 0.05);
- text-shadow: 0 -1px 0 #2c9720; }
- .tests-valo .v-button-friendly:after {
- border: inherit;
- top: -1px;
- right: -1px;
- bottom: -1px;
- left: -1px; }
- .tests-valo .v-button-friendly:hover:after {
- background-color: rgba(65, 211, 48, 0.1); }
- .tests-valo .v-button-friendly:focus:after {
- border: inherit;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- .tests-valo .v-button-friendly:active:after {
- background-color: rgba(14, 86, 6, 0.2); }
-.tests-valo .v-button-danger {
- height: 37px;
- padding: 0 16px;
- color: #f9f0ef;
- font-weight: 400;
- border-radius: 4px;
- border: 1px solid #c33a30;
- border-top-color: #c43e33;
- border-bottom-color: #b9332a;
- background-color: #ed473b;
- background-image: -webkit-linear-gradient(top, #ee4c3f 2%, #e13e33 98%);
- background-image: linear-gradient(to bottom,#ee4c3f 2%, #e13e33 98%);
- box-shadow: inset 0 1px 0 #ef7167, inset 0 -1px 0 #dd3c31, 0 2px 3px rgba(0, 0, 0, 0.05);
- text-shadow: 0 -1px 0 #ed473b; }
- .tests-valo .v-button-danger:after {
- border: inherit;
- top: -1px;
- right: -1px;
- bottom: -1px;
- left: -1px; }
- .tests-valo .v-button-danger:hover:after {
- background-color: rgba(243, 137, 129, 0.1); }
- .tests-valo .v-button-danger:focus:after {
- border: inherit;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- .tests-valo .v-button-danger:active:after {
- background-color: rgba(146, 12, 2, 0.2); }
-.tests-valo .v-button-borderless {
- border: none;
- box-shadow: none;
- background: transparent;
- color: inherit; }
-.tests-valo .v-button-link {
- border: none;
- box-shadow: none;
- background: transparent;
- color: inherit;
- cursor: pointer;
- color: #197de1;
- text-decoration: underline;
- font-weight: inherit;
- -webkit-transition: color 140ms;
- -moz-transition: color 140ms;
- transition: color 140ms; }
- .tests-valo .v-button-link:hover {
- color: #4396ea; }
-.tests-valo .v-button-small {
- height: 30px;
- padding: 0 14px;
- font-size: 13px;
- border-radius: 4px; }
- .tests-valo .v-button-small:after {
- border: inherit;
- top: -1px;
- right: -1px;
- bottom: -1px;
- left: -1px; }
-.tests-valo .v-button-large {
- height: 45px;
- padding: 0 20px;
- font-size: 20px;
- border-radius: 4px; }
- .tests-valo .v-button-large:after {
- border: inherit;
- top: -1px;
- right: -1px;
- bottom: -1px;
- left: -1px; }
-.tests-valo .v-button-icon-align-right .v-button-wrap {
- display: inline-block; }
-.tests-valo .v-button-icon-align-right .v-icon {
- float: right;
- margin-left: 13px; }
- .tests-valo .v-button-icon-align-right .v-icon + span:not(:empty) {
- margin-left: 0; }
-.tests-valo .v-button-icon-only {
- width: 37px;
- padding: 0; }
- .tests-valo .v-button-icon-only.v-button-small {
- width: 30px; }
-.tests-valo .v-link-small {
- font-size: 13px; }
-.tests-valo .v-link-large {
- font-size: 20px; }
-.tests-valo .v-tabsheet-centered-tabs .v-tabsheet-tabcontainer {
- text-align: center; }
-.tests-valo .v-tabsheet-equal-width-tabs .v-tabsheet-tabcontainer table,
-.tests-valo .v-tabsheet-equal-width-tabs .v-tabsheet-tabcontainer tbody,
-.tests-valo .v-tabsheet-equal-width-tabs .v-tabsheet-tabcontainer tr {
- width: 100%; }
-.tests-valo .v-tabsheet-equal-width-tabs .v-tabsheet-tabcontainer tr {
- display: table;
- table-layout: fixed; }
-.tests-valo .v-tabsheet-equal-width-tabs .v-tabsheet-tabcontainer td {
- display: table-cell; }
-.tests-valo .v-tabsheet-equal-width-tabs .v-tabsheet-tabcontainer .v-caption {
- margin: 0;
- display: block; }
-.tests-valo .v-tabsheet-padded-tabbar > .v-tabsheet-tabcontainer .v-tabsheet-tabs {
- padding: 0 9px; }
-.tests-valo .v-tabsheet-icons-on-top .v-tabsheet-tabs {
- height: 74px; }
- .tests-valo .v-tabsheet-icons-on-top .v-tabsheet-tabs .v-caption {
- height: 74px;
- padding-top: 37px; }
- .tests-valo .v-tabsheet-icons-on-top .v-tabsheet-tabs .v-icon {
- display: block;
- font-size: 32px;
- margin: -28px auto -9px;
- min-height: 37px; }
- .tests-valo .v-tabsheet-icons-on-top .v-tabsheet-tabs .v-icon + .v-captiontext.v-captiontext {
- margin-left: 0; }
-.tests-valo .v-tabsheet-icons-on-top .v-tabsheet-scroller {
- line-height: 74px; }
- .tests-valo .v-tabsheet-icons-on-top .v-tabsheet-scroller button[class] {
- padding: 0 9px;
- display: block; }
-.tests-valo .v-panel-borderless {
- background: transparent;
- color: inherit;
- border: none;
- box-shadow: none; }
- .tests-valo .v-panel-borderless .v-panel-caption {
- background: transparent;
- box-shadow: none;
- color: inherit;
- padding: 0;
- margin: 0 12px;
- border-bottom: none; }
-.tests-valo .v-formlayout.light > table {
- padding: 0; }
-.tests-valo .v-formlayout.light > table > tbody > .v-formlayout-row > .v-formlayout-captioncell,
-.tests-valo .v-formlayout.light > table > tbody > .v-formlayout-row > .v-formlayout-contentcell,
-.tests-valo .v-formlayout.light > table > tbody > .v-formlayout-row > .v-formlayout-errorcell {
- padding-top: 0;
- height: 37px; }
-.tests-valo .v-formlayout.light > table > tbody > .v-formlayout-row td {
- border-bottom: 1px solid #ececec; }
-.tests-valo .v-formlayout.light > table > tbody > .v-formlayout-lastrow td {
- border-bottom: none; }
-.tests-valo .v-formlayout.light > table > tbody > .v-formlayout-row > .v-formlayout-captioncell {
- color: #898989;
- text-align: right;
- padding-left: 13px;
- line-height: 37px; }
-.tests-valo .v-formlayout.light .v-formlayout-contentcell > .v-textfield,
-.tests-valo .v-formlayout.light .v-formlayout-contentcell > .v-textarea,
-.tests-valo .v-formlayout.light .v-formlayout-contentcell > .v-filterselect,
-.tests-valo .v-formlayout.light .v-formlayout-contentcell > .v-datefield,
-.tests-valo .v-formlayout.light .v-formlayout-contentcell > .v-filterselect-input,
-.tests-valo .v-formlayout.light .v-formlayout-contentcell > .v-datefield-textfield {
- width: 100%; }
-.tests-valo .v-formlayout.light .v-formlayout-contentcell > .v-textfield,
-.tests-valo .v-formlayout.light .v-formlayout-contentcell > .v-textarea,
-.tests-valo .v-formlayout.light .v-formlayout-contentcell > .v-filterselect input,
-.tests-valo .v-formlayout.light .v-formlayout-contentcell > .v-datefield input {
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- margin: 0;
- font: inherit;
- font-weight: 400;
- line-height: normal;
- height: 37px;
- border-radius: 0;
- padding: 4px 7px;
- box-shadow: none;
- -webkit-transition: box-shadow 180ms, border 180ms;
- -moz-transition: box-shadow 180ms, border 180ms;
- transition: box-shadow 180ms, border 180ms;
- background: transparent;
- border: none;
- color: inherit; }
- .tests-valo .v-formlayout.light .v-formlayout-contentcell > .v-textfield.v-disabled,
- .tests-valo .v-formlayout.light .v-formlayout-contentcell > .v-textarea.v-disabled,
- .tests-valo .v-formlayout.light .v-formlayout-contentcell > .v-filterselect input.v-disabled,
- .tests-valo .v-formlayout.light .v-formlayout-contentcell > .v-datefield input.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-formlayout.light .v-formlayout-contentcell > .v-textfield:focus,
- .tests-valo .v-formlayout.light .v-formlayout-contentcell > .v-textarea:focus,
- .tests-valo .v-formlayout.light .v-formlayout-contentcell > .v-filterselect input:focus,
- .tests-valo .v-formlayout.light .v-formlayout-contentcell > .v-datefield input:focus {
- outline: none;
- -webkit-transition: none;
- -moz-transition: none;
- transition: none;
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), none; }
-.tests-valo .v-formlayout.light .v-formlayout-contentcell > .v-textfield-prompt,
-.tests-valo .v-formlayout.light .v-formlayout-contentcell > .v-textarea-prompt,
-.tests-valo .v-formlayout.light .v-formlayout-contentcell > .v-filterselect-prompt input,
-.tests-valo .v-formlayout.light .v-formlayout-contentcell > .v-datefield-prompt input {
- color: #a3a3a3; }
-.tests-valo .v-formlayout.light .v-formlayout-contentcell > .v-textarea {
- height: auto; }
-.tests-valo .v-formlayout.light .v-richtextarea {
- margin: 5px 0; }
-.tests-valo .v-formlayout.light .v-filterselect-button,
-.tests-valo .v-formlayout.light .v-datefield-button {
- border: none; }
- .tests-valo .v-formlayout.light .v-filterselect-button:active:after,
- .tests-valo .v-formlayout.light .v-datefield-button:active:after {
- display: none; }
-.tests-valo .v-formlayout.light .v-datefield-button {
- right: 0;
- left: auto; }
-.tests-valo .v-formlayout.light .v-checkbox {
- margin-left: 7px; }
-.tests-valo .v-formlayout.light > table > tbody > .v-formlayout-row > .v-formlayout-contentcell > .h4 {
- border-bottom: none;
- color: #197de1;
- margin-top: -0.2em; }
-.tests-valo .v-textfield-borderless,
-.tests-valo .v-textarea-borderless {
- border: none;
- border-radius: 0;
- background: transparent;
- box-shadow: none; }
- .tests-valo .v-textfield-borderless:focus,
- .tests-valo .v-textarea-borderless:focus {
- box-shadow: none; }
-.tests-valo .v-textfield-small {
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- margin: 0;
- font: inherit;
- font-weight: 400;
- line-height: normal;
- height: 30px;
- border-radius: 4px;
- padding: 3px 7px;
- border: 1px solid #cecece;
- background: white;
- color: #474747;
- box-shadow: inset 0 1px 0 #f9f9f9, 0 1px 0 rgba(255, 255, 255, 0.1);
- -webkit-transition: box-shadow 180ms, border 180ms;
- -moz-transition: box-shadow 180ms, border 180ms;
- transition: box-shadow 180ms, border 180ms;
- font-size: 13px; }
- .tests-valo .v-textfield-small.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-textfield-small:focus {
- outline: none;
- -webkit-transition: none;
- -moz-transition: none;
- transition: none;
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f9f9f9, 0 1px 0 rgba(255, 255, 255, 0.1); }
- .tests-valo .v-textfield-small.v-textfield-prompt, .tests-valo .v-textfield-small.v-textarea-prompt {
- color: #a3a3a3; }
-.tests-valo .v-textfield-large {
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- margin: 0;
- font: inherit;
- font-weight: 400;
- line-height: normal;
- height: 45px;
- border-radius: 4px;
- padding: 5px 10px;
- border: 1px solid #cecece;
- background: white;
- color: #474747;
- box-shadow: inset 0 1px 0 #f9f9f9, 0 1px 0 rgba(255, 255, 255, 0.1);
- -webkit-transition: box-shadow 180ms, border 180ms;
- -moz-transition: box-shadow 180ms, border 180ms;
- transition: box-shadow 180ms, border 180ms;
- font-size: 20px; }
- .tests-valo .v-textfield-large.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-textfield-large:focus {
- outline: none;
- -webkit-transition: none;
- -moz-transition: none;
- transition: none;
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f9f9f9, 0 1px 0 rgba(255, 255, 255, 0.1); }
- .tests-valo .v-textfield-large.v-textfield-prompt, .tests-valo .v-textfield-large.v-textarea-prompt {
- color: #a3a3a3; }
-.tests-valo .v-slot-inline-icon {
- position: relative; }
-.tests-valo .v-caption-inline-icon {
- padding: 0; }
- .tests-valo .v-caption-inline-icon .v-captiontext {
- font-size: 14px;
- font-weight: 400;
- padding-bottom: .3em;
- padding-left: 1px;
- margin: 0; }
- .tests-valo .v-caption-inline-icon .v-icon {
- position: absolute;
- z-index: 10; }
- .tests-valo .v-caption-inline-icon span.v-icon {
- left: 1px;
- bottom: 1px;
- width: 37px;
- line-height: 35px;
- text-align: center;
- font-size: 16px; }
- .tests-valo .v-caption-inline-icon img.v-icon {
- left: 11px;
- bottom: 11px; }
-.tests-valo .v-textfield-inline-icon,
-.tests-valo .v-textarea-inline-icon {
- padding-left: 37px; }
-.tests-valo .v-textarea-small {
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- margin: 0;
- font: inherit;
- font-weight: 400;
- line-height: normal;
- height: 30px;
- border-radius: 4px;
- padding: 6px;
- border: 1px solid #cecece;
- background: white;
- color: #474747;
- box-shadow: inset 0 1px 0 #f9f9f9, 0 1px 0 rgba(255, 255, 255, 0.1);
- -webkit-transition: box-shadow 180ms, border 180ms;
- -moz-transition: box-shadow 180ms, border 180ms;
- transition: box-shadow 180ms, border 180ms;
- height: auto;
- resize: none;
- font-size: 13px; }
- .tests-valo .v-textarea-small.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-textarea-small:focus {
- outline: none;
- -webkit-transition: none;
- -moz-transition: none;
- transition: none;
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f9f9f9, 0 1px 0 rgba(255, 255, 255, 0.1); }
- .tests-valo .v-textarea-small.v-textfield-prompt, .tests-valo .v-textarea-small.v-textarea-prompt {
- color: #a3a3a3; }
-.tests-valo .v-textarea-large {
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- margin: 0;
- font: inherit;
- font-weight: 400;
- line-height: normal;
- height: 45px;
- border-radius: 4px;
- padding: 6px;
- border: 1px solid #cecece;
- background: white;
- color: #474747;
- box-shadow: inset 0 1px 0 #f9f9f9, 0 1px 0 rgba(255, 255, 255, 0.1);
- -webkit-transition: box-shadow 180ms, border 180ms;
- -moz-transition: box-shadow 180ms, border 180ms;
- transition: box-shadow 180ms, border 180ms;
- height: auto;
- resize: none;
- font-size: 20px; }
- .tests-valo .v-textarea-large.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-textarea-large:focus {
- outline: none;
- -webkit-transition: none;
- -moz-transition: none;
- transition: none;
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f9f9f9, 0 1px 0 rgba(255, 255, 255, 0.1); }
- .tests-valo .v-textarea-large.v-textfield-prompt, .tests-valo .v-textarea-large.v-textarea-prompt {
- color: #a3a3a3; }
-.tests-valo .v-textfield-align-right,
-.tests-valo .v-textarea-align-right {
- text-align: right; }
-.tests-valo .v-textfield-align-center,
-.tests-valo .v-textarea-align-center {
- text-align: center; }
-.tests-valo .v-filterselect-small {
- height: 30px;
- font-size: 13px; }
- .tests-valo .v-filterselect-small .v-filterselect-input {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- margin: 0;
- font: inherit;
- font-weight: 400;
- line-height: normal;
- height: 30px;
- padding: 3px 5px;
- color: #474747;
- -webkit-transition: box-shadow 180ms, border 180ms;
- -moz-transition: box-shadow 180ms, border 180ms;
- transition: box-shadow 180ms, border 180ms;
- width: 100% !important;
- height: 100%;
- padding-right: 36px;
- border-radius: inherit; }
- .tests-valo .v-filterselect-small .v-filterselect-input.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-filterselect-small .v-filterselect-input:focus {
- outline: none;
- -webkit-transition: none;
- -moz-transition: none;
- transition: none;
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- .tests-valo .v-filterselect-small .v-filterselect-input.v-textfield-prompt, .tests-valo .v-filterselect-small .v-filterselect-input.v-textarea-prompt {
- color: #a3a3a3; }
- .tests-valo .v-filterselect-small .v-icon + .v-filterselect-input {
- padding-left: 30px; }
- .tests-valo .v-filterselect-small img.v-icon {
- max-height: 30px;
- margin-left: 5px; }
- .tests-valo .v-filterselect-small span.v-icon {
- color: #474747;
- width: 30px; }
- .tests-valo .v-filterselect-small.v-filterselect-prompt > .v-filterselect-input {
- color: #a3a3a3; }
- .tests-valo .v-filterselect-small .v-filterselect-button {
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
- -webkit-touch-callout: none;
- cursor: pointer;
- position: absolute;
- top: 1px;
- right: 1px;
- bottom: 1px;
- width: 30px;
- cursor: pointer;
- border-left: 1px solid #e8e8e8;
- border-radius: 0 3px 3px 0; }
- .v-ie8 .tests-valo .v-filterselect-small .v-filterselect-button {
- background-color: white; }
- .tests-valo .v-filterselect-small .v-filterselect-button:before {
- font-family: FontAwesome;
- content: "\f078";
- color: #474747;
- color: #a3a3a3;
- -webkit-transition: color 140ms;
- -moz-transition: color 140ms;
- transition: color 140ms;
- position: absolute;
- width: 30px;
- text-align: center;
- top: 50%;
- line-height: 1;
- margin-top: -.47em; }
- .tests-valo .v-filterselect-small .v-filterselect-button:hover:before {
- color: #474747; }
- .tests-valo .v-filterselect-small .v-filterselect-button:active:after {
- content: "";
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- border-radius: inherit;
- background-color: rgba(128, 128, 128, 0.2); }
- .tests-valo .v-filterselect-small.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-filterselect-small.v-disabled .v-filterselect-button {
- cursor: default;
- pointer-events: none; }
- .tests-valo .v-filterselect-small.v-disabled .v-filterselect-button:active:after {
- display: none; }
- .tests-valo .v-filterselect-small.v-readonly .v-filterselect-input {
- background: transparent;
- box-shadow: none; }
- .tests-valo .v-filterselect-small.v-readonly .v-filterselect-input:focus {
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- .tests-valo .v-filterselect-small.v-readonly .v-filterselect-button {
- cursor: default;
- pointer-events: none; }
- .tests-valo .v-filterselect-small.v-readonly .v-filterselect-button:active:after {
- display: none; }
-.tests-valo .v-filterselect-large {
- height: 45px;
- font-size: 20px; }
- .tests-valo .v-filterselect-large .v-filterselect-input {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- margin: 0;
- font: inherit;
- font-weight: 400;
- line-height: normal;
- height: 45px;
- padding: 5px 8px;
- color: #474747;
- -webkit-transition: box-shadow 180ms, border 180ms;
- -moz-transition: box-shadow 180ms, border 180ms;
- transition: box-shadow 180ms, border 180ms;
- width: 100% !important;
- height: 100%;
- padding-right: 54px;
- border-radius: inherit; }
- .tests-valo .v-filterselect-large .v-filterselect-input.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-filterselect-large .v-filterselect-input:focus {
- outline: none;
- -webkit-transition: none;
- -moz-transition: none;
- transition: none;
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- .tests-valo .v-filterselect-large .v-filterselect-input.v-textfield-prompt, .tests-valo .v-filterselect-large .v-filterselect-input.v-textarea-prompt {
- color: #a3a3a3; }
- .tests-valo .v-filterselect-large .v-icon + .v-filterselect-input {
- padding-left: 45px; }
- .tests-valo .v-filterselect-large img.v-icon {
- max-height: 45px;
- margin-left: 8px; }
- .tests-valo .v-filterselect-large span.v-icon {
- color: #474747;
- width: 45px; }
- .tests-valo .v-filterselect-large.v-filterselect-prompt > .v-filterselect-input {
- color: #a3a3a3; }
- .tests-valo .v-filterselect-large .v-filterselect-button {
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
- -webkit-touch-callout: none;
- cursor: pointer;
- position: absolute;
- top: 1px;
- right: 1px;
- bottom: 1px;
- width: 45px;
- cursor: pointer;
- border-left: 1px solid #e8e8e8;
- border-radius: 0 3px 3px 0; }
- .v-ie8 .tests-valo .v-filterselect-large .v-filterselect-button {
- background-color: white; }
- .tests-valo .v-filterselect-large .v-filterselect-button:before {
- font-family: FontAwesome;
- content: "\f078";
- color: #474747;
- color: #a3a3a3;
- -webkit-transition: color 140ms;
- -moz-transition: color 140ms;
- transition: color 140ms;
- position: absolute;
- width: 45px;
- text-align: center;
- top: 50%;
- line-height: 1;
- margin-top: -.47em; }
- .tests-valo .v-filterselect-large .v-filterselect-button:hover:before {
- color: #474747; }
- .tests-valo .v-filterselect-large .v-filterselect-button:active:after {
- content: "";
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- border-radius: inherit;
- background-color: rgba(128, 128, 128, 0.2); }
- .tests-valo .v-filterselect-large.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-filterselect-large.v-disabled .v-filterselect-button {
- cursor: default;
- pointer-events: none; }
- .tests-valo .v-filterselect-large.v-disabled .v-filterselect-button:active:after {
- display: none; }
- .tests-valo .v-filterselect-large.v-readonly .v-filterselect-input {
- background: transparent;
- box-shadow: none; }
- .tests-valo .v-filterselect-large.v-readonly .v-filterselect-input:focus {
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- .tests-valo .v-filterselect-large.v-readonly .v-filterselect-button {
- cursor: default;
- pointer-events: none; }
- .tests-valo .v-filterselect-large.v-readonly .v-filterselect-button:active:after {
- display: none; }
-.tests-valo .v-datefield-small {
- height: 30px;
- border-radius: 4px;
- font-size: 13px; }
- .tests-valo .v-datefield-small .v-datefield-textfield {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- margin: 0;
- font: inherit;
- font-weight: 400;
- line-height: normal;
- height: 30px;
- border-radius: 4px;
- padding: 3px 7px;
- border: 1px solid #cecece;
- background: white;
- color: #474747;
- box-shadow: inset 0 1px 0 #f9f9f9, 0 1px 0 rgba(255, 255, 255, 0.1);
- -webkit-transition: box-shadow 180ms, border 180ms;
- -moz-transition: box-shadow 180ms, border 180ms;
- transition: box-shadow 180ms, border 180ms;
- padding-left: 36px;
- width: 100%;
- height: 100%;
- border-radius: inherit; }
- .tests-valo .v-datefield-small .v-datefield-textfield.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-datefield-small .v-datefield-textfield:focus {
- outline: none;
- -webkit-transition: none;
- -moz-transition: none;
- transition: none;
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f9f9f9, 0 1px 0 rgba(255, 255, 255, 0.1); }
- .tests-valo .v-datefield-small .v-datefield-textfield.v-textfield-prompt, .tests-valo .v-datefield-small .v-datefield-textfield.v-textarea-prompt {
- color: #a3a3a3; }
- .tests-valo .v-datefield-small.v-datefield-prompt > .v-datefield-textfield {
- color: #a3a3a3; }
- .tests-valo .v-datefield-small .v-datefield-button {
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
- -webkit-touch-callout: none;
- cursor: pointer;
- -webkit-appearance: none;
- background: transparent;
- border: none;
- padding: 0;
- position: absolute;
- z-index: 10;
- top: 1px;
- bottom: 1px;
- left: 1px;
- width: 30px;
- line-height: 28px;
- text-align: center;
- cursor: pointer;
- font: inherit;
- border-right: 1px solid #e8e8e8;
- outline: none;
- margin: 0;
- border-radius: 3px 0 0 3px; }
- .tests-valo .v-datefield-small .v-datefield-button:before {
- font-family: FontAwesome;
- content: "\f073";
- color: #474747;
- color: #a3a3a3;
- -webkit-transition: color 140ms;
- -moz-transition: color 140ms;
- transition: color 140ms; }
- .tests-valo .v-datefield-small .v-datefield-button:hover:before {
- color: #474747; }
- .tests-valo .v-datefield-small .v-datefield-button:active:after {
- content: "";
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- background-color: rgba(128, 128, 128, 0.2);
- border-radius: inherit; }
- .tests-valo .v-datefield-small.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-datefield-small.v-disabled .v-datefield-button {
- cursor: default;
- pointer-events: none; }
- .tests-valo .v-datefield-small.v-disabled .v-datefield-button:active:after {
- display: none; }
- .tests-valo .v-datefield-small.v-readonly .v-datefield-textfield {
- background: transparent;
- box-shadow: none; }
- .tests-valo .v-datefield-small.v-readonly .v-datefield-textfield:focus {
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- .tests-valo .v-datefield-small.v-readonly .v-datefield-button {
- cursor: default;
- pointer-events: none; }
- .tests-valo .v-datefield-small.v-readonly .v-datefield-button:active:after {
- display: none; }
-.tests-valo .v-datefield-large {
- height: 45px;
- border-radius: 4px;
- font-size: 20px; }
- .tests-valo .v-datefield-large .v-datefield-textfield {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- margin: 0;
- font: inherit;
- font-weight: 400;
- line-height: normal;
- height: 45px;
- border-radius: 4px;
- padding: 5px 10px;
- border: 1px solid #cecece;
- background: white;
- color: #474747;
- box-shadow: inset 0 1px 0 #f9f9f9, 0 1px 0 rgba(255, 255, 255, 0.1);
- -webkit-transition: box-shadow 180ms, border 180ms;
- -moz-transition: box-shadow 180ms, border 180ms;
- transition: box-shadow 180ms, border 180ms;
- padding-left: 54px;
- width: 100%;
- height: 100%;
- border-radius: inherit; }
- .tests-valo .v-datefield-large .v-datefield-textfield.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-datefield-large .v-datefield-textfield:focus {
- outline: none;
- -webkit-transition: none;
- -moz-transition: none;
- transition: none;
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f9f9f9, 0 1px 0 rgba(255, 255, 255, 0.1); }
- .tests-valo .v-datefield-large .v-datefield-textfield.v-textfield-prompt, .tests-valo .v-datefield-large .v-datefield-textfield.v-textarea-prompt {
- color: #a3a3a3; }
- .tests-valo .v-datefield-large.v-datefield-prompt > .v-datefield-textfield {
- color: #a3a3a3; }
- .tests-valo .v-datefield-large .v-datefield-button {
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
- -webkit-touch-callout: none;
- cursor: pointer;
- -webkit-appearance: none;
- background: transparent;
- border: none;
- padding: 0;
- position: absolute;
- z-index: 10;
- top: 1px;
- bottom: 1px;
- left: 1px;
- width: 45px;
- line-height: 43px;
- text-align: center;
- cursor: pointer;
- font: inherit;
- border-right: 1px solid #e8e8e8;
- outline: none;
- margin: 0;
- border-radius: 3px 0 0 3px; }
- .tests-valo .v-datefield-large .v-datefield-button:before {
- font-family: FontAwesome;
- content: "\f073";
- color: #474747;
- color: #a3a3a3;
- -webkit-transition: color 140ms;
- -moz-transition: color 140ms;
- transition: color 140ms; }
- .tests-valo .v-datefield-large .v-datefield-button:hover:before {
- color: #474747; }
- .tests-valo .v-datefield-large .v-datefield-button:active:after {
- content: "";
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- background-color: rgba(128, 128, 128, 0.2);
- border-radius: inherit; }
- .tests-valo .v-datefield-large.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-datefield-large.v-disabled .v-datefield-button {
- cursor: default;
- pointer-events: none; }
- .tests-valo .v-datefield-large.v-disabled .v-datefield-button:active:after {
- display: none; }
- .tests-valo .v-datefield-large.v-readonly .v-datefield-textfield {
- background: transparent;
- box-shadow: none; }
- .tests-valo .v-datefield-large.v-readonly .v-datefield-textfield:focus {
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- .tests-valo .v-datefield-large.v-readonly .v-datefield-button {
- cursor: default;
- pointer-events: none; }
- .tests-valo .v-datefield-large.v-readonly .v-datefield-button:active:after {
- display: none; }
-.tests-valo .v-checkbox-small {
- position: relative;
- line-height: 15px;
- white-space: nowrap;
- font-size: 13px; }
- .tests-valo .v-checkbox-small.v-has-width label {
- white-space: normal; }
- :root .tests-valo .v-checkbox-small {
- padding-left: 20px; }
- :root .tests-valo .v-checkbox-small label {
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
- -webkit-touch-callout: none;
- cursor: pointer; }
- :root .tests-valo .v-checkbox-small > input {
- position: absolute;
- clip: rect(0, 0, 0, 0);
- left: .2em;
- top: .2em;
- z-index: 0;
- margin: 0; }
- :root .tests-valo .v-checkbox-small > input:focus ~ label:before {
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #eaeaea, 0 2px 3px rgba(0, 0, 0, 0.05); }
- :root .tests-valo .v-checkbox-small > input ~ label:before, :root .tests-valo .v-checkbox-small > input ~ label:after {
- content: "";
- display: inline-block;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- width: 15px;
- height: 15px;
- position: absolute;
- top: 0;
- left: 0;
- border-radius: 4px;
- font-size: 10px;
- text-align: center; }
- :root .tests-valo .v-checkbox-small > input ~ label:before {
- height: 15px;
- padding: 0 7px;
- color: #2f2f2f;
- font-weight: 400;
- border-radius: 4px;
- border: 1px solid #cecece;
- border-top-color: #cecece;
- border-bottom-color: #c5c5c5;
- background-color: #fafafa;
- background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);
- background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);
- box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #eaeaea, 0 2px 3px rgba(0, 0, 0, 0.05);
- text-shadow: 0 1px 0 #fafafa;
- padding: 0;
- height: 15px; }
- :root .tests-valo .v-checkbox-small > input ~ label:before:after {
- border: inherit;
- top: -1px;
- right: -1px;
- bottom: -1px;
- left: -1px; }
- :root .tests-valo .v-checkbox-small > input ~ label:before:hover:after {
- background-color: rgba(186, 186, 186, 0.1); }
- :root .tests-valo .v-checkbox-small > input ~ label:before:focus:after {
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- :root .tests-valo .v-checkbox-small > input ~ label:before:active:after {
- background-color: rgba(125, 125, 125, 0.2); }
- :root .tests-valo .v-checkbox-small > input ~ label:after {
- content: "\f00c";
- font-family: FontAwesome;
- color: transparent;
- -webkit-transition: color 100ms;
- -moz-transition: color 100ms;
- transition: color 100ms; }
- :root .tests-valo .v-checkbox-small > input:active ~ label:after {
- background-color: rgba(125, 125, 125, 0.2); }
- :root .tests-valo .v-checkbox-small > input:checked ~ label:after {
- color: #197de1; }
- :root .tests-valo .v-checkbox-small > input[disabled] ~ label,
- :root .tests-valo .v-checkbox-small > input[disabled] ~ label .v-icon,
- :root .tests-valo .v-checkbox-small > input[disabled] ~ .v-icon {
- cursor: default; }
- :root .tests-valo .v-checkbox-small > input[disabled] ~ label:before,
- :root .tests-valo .v-checkbox-small > input[disabled] ~ label:after {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- :root .tests-valo .v-checkbox-small > input[disabled]:active ~ label:after {
- background: transparent; }
- .tests-valo .v-checkbox-small > .v-icon, .tests-valo .v-checkbox-small > label .v-icon {
- margin: 0 5px 0 3px;
- min-width: 1em;
- cursor: pointer; }
-.tests-valo .v-checkbox-large {
- position: relative;
- line-height: 23px;
- white-space: nowrap;
- font-size: 20px; }
- .tests-valo .v-checkbox-large.v-has-width label {
- white-space: normal; }
- :root .tests-valo .v-checkbox-large {
- padding-left: 30px; }
- :root .tests-valo .v-checkbox-large label {
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
- -webkit-touch-callout: none;
- cursor: pointer; }
- :root .tests-valo .v-checkbox-large > input {
- position: absolute;
- clip: rect(0, 0, 0, 0);
- left: .2em;
- top: .2em;
- z-index: 0;
- margin: 0; }
- :root .tests-valo .v-checkbox-large > input:focus ~ label:before {
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #eaeaea, 0 2px 3px rgba(0, 0, 0, 0.05); }
- :root .tests-valo .v-checkbox-large > input ~ label:before, :root .tests-valo .v-checkbox-large > input ~ label:after {
- content: "";
- display: inline-block;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- width: 23px;
- height: 23px;
- position: absolute;
- top: 0;
- left: 0;
- border-radius: 4px;
- font-size: 16px;
- text-align: center; }
- :root .tests-valo .v-checkbox-large > input ~ label:before {
- height: 22.5px;
- padding: 0 10px;
- color: #2f2f2f;
- font-weight: 400;
- border-radius: 4px;
- border: 1px solid #cecece;
- border-top-color: #cecece;
- border-bottom-color: #c5c5c5;
- background-color: #fafafa;
- background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);
- background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);
- box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #eaeaea, 0 2px 3px rgba(0, 0, 0, 0.05);
- text-shadow: 0 1px 0 #fafafa;
- padding: 0;
- height: 23px; }
- :root .tests-valo .v-checkbox-large > input ~ label:before:after {
- border: inherit;
- top: -1px;
- right: -1px;
- bottom: -1px;
- left: -1px; }
- :root .tests-valo .v-checkbox-large > input ~ label:before:hover:after {
- background-color: rgba(186, 186, 186, 0.1); }
- :root .tests-valo .v-checkbox-large > input ~ label:before:focus:after {
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- :root .tests-valo .v-checkbox-large > input ~ label:before:active:after {
- background-color: rgba(125, 125, 125, 0.2); }
- :root .tests-valo .v-checkbox-large > input ~ label:after {
- content: "\f00c";
- font-family: FontAwesome;
- color: transparent;
- -webkit-transition: color 100ms;
- -moz-transition: color 100ms;
- transition: color 100ms; }
- :root .tests-valo .v-checkbox-large > input:active ~ label:after {
- background-color: rgba(125, 125, 125, 0.2); }
- :root .tests-valo .v-checkbox-large > input:checked ~ label:after {
- color: #197de1; }
- :root .tests-valo .v-checkbox-large > input[disabled] ~ label,
- :root .tests-valo .v-checkbox-large > input[disabled] ~ label .v-icon,
- :root .tests-valo .v-checkbox-large > input[disabled] ~ .v-icon {
- cursor: default; }
- :root .tests-valo .v-checkbox-large > input[disabled] ~ label:before,
- :root .tests-valo .v-checkbox-large > input[disabled] ~ label:after {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- :root .tests-valo .v-checkbox-large > input[disabled]:active ~ label:after {
- background: transparent; }
- .tests-valo .v-checkbox-large > .v-icon, .tests-valo .v-checkbox-large > label .v-icon {
- margin: 0 8px 0 4px;
- min-width: 1em;
- cursor: pointer; }
-.tests-valo .v-label-spinner {
- height: 24px !important;
- width: 24px !important;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- border: 4px solid rgba(25, 125, 225, 0.2);
- border-top-color: rgba(25, 125, 225, 0.85);
- border-radius: 100%;
- -webkit-animation: v-rotate-360 500ms infinite linear;
- -moz-animation: v-rotate-360 500ms infinite linear;
- animation: v-rotate-360 500ms infinite linear;
- pointer-events: none;
- -webkit-transition: all ease-in-out 300ms;
- -moz-transition: all ease-in-out 300ms;
- transition: all ease-in-out 300ms; }
-.tests-valo .v-panel-well {
- background: whitesmoke;
- color: #454545;
- box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.05), inset 0 2px 3px rgba(0, 0, 0, 0.05);
- border-radius: 4px;
- border: 1px solid #cecece; }
- .tests-valo .v-panel-well .v-panel-caption {
- background: transparent;
- box-shadow: none; }
-.tests-valo .v-panel-borderless {
- background: transparent;
- color: inherit;
- border: none;
- box-shadow: none; }
- .tests-valo .v-panel-borderless .v-panel-caption {
- background: transparent;
- box-shadow: none;
- color: inherit;
- padding: 0;
- margin: 0 12px;
- border-bottom: none; }
-.tests-valo .v-panel-scroll-divider > .v-panel-captionwrap {
- position: relative;
- z-index: 2; }
- .tests-valo .v-panel-scroll-divider > .v-panel-captionwrap:after {
- content: "";
- position: absolute;
- bottom: -1px;
- right: 0;
- left: 0;
- height: 1px;
- background: #e4e4e4; }
-.tests-valo .v-panel-scroll-divider > .v-panel-content:before {
- content: "";
- position: absolute;
- z-index: 2;
- top: 0;
- height: 1px;
- background: #fafafa;
- left: 0;
- right: 0; }
-.tests-valo .v-csslayout-well {
- background: whitesmoke;
- color: #454545;
- box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.05), inset 0 2px 3px rgba(0, 0, 0, 0.05);
- border-radius: 4px;
- border: 1px solid #cecece; }
- .tests-valo .v-csslayout-well .v-panel-caption {
- background: transparent;
- box-shadow: none; }
- .tests-valo .v-csslayout-well > .v-margin-top {
- padding-top: 12px; }
- .tests-valo .v-csslayout-well > .v-margin-right {
- padding-right: 12px; }
- .tests-valo .v-csslayout-well > .v-margin-bottom {
- padding-bottom: 12px; }
- .tests-valo .v-csslayout-well > .v-margin-left {
- padding-left: 12px; }
-.tests-valo .v-csslayout-card {
- background: white;
- color: #474747;
- border-radius: 4px;
- border: 1px solid #dbdbdb;
- box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); }
- .tests-valo .v-csslayout-card > .v-margin-top {
- padding-top: 12px; }
- .tests-valo .v-csslayout-card > .v-margin-right {
- padding-right: 12px; }
- .tests-valo .v-csslayout-card > .v-margin-bottom {
- padding-bottom: 12px; }
- .tests-valo .v-csslayout-card > .v-margin-left {
- padding-left: 12px; }
-.tests-valo .v-splitpanel-horizontal.large .v-splitpanel-hsplitter,
-.tests-valo .v-splitpanel-vertical.large .v-splitpanel-hsplitter {
- width: 12px; }
-.tests-valo .v-splitpanel-horizontal.large .v-splitpanel-vsplitter,
-.tests-valo .v-splitpanel-vertical.large .v-splitpanel-vsplitter {
- height: 12px; }
-.tests-valo .v-splitpanel-horizontal.large .v-splitpanel-hsplitter:after,
-.tests-valo .v-splitpanel-vertical.large .v-splitpanel-hsplitter:after {
- left: 0px;
- right: 0px; }
-.tests-valo .v-splitpanel-horizontal.large .v-splitpanel-vsplitter:after,
-.tests-valo .v-splitpanel-vertical.large .v-splitpanel-vsplitter:after {
- top: 0px;
- bottom: 0px; }
-.tests-valo .v-splitpanel-horizontal.large .v-splitpanel-hsplitter div:before,
-.tests-valo .v-splitpanel-horizontal.large .v-splitpanel-vsplitter div:before,
-.tests-valo .v-splitpanel-vertical.large .v-splitpanel-hsplitter div:before,
-.tests-valo .v-splitpanel-vertical.large .v-splitpanel-vsplitter div:before {
- height: 37px;
- padding: 0 16px;
- color: #2f2f2f;
- font-weight: 400;
- border-radius: 4px;
- border: 1px solid #cecece;
- border-top-color: #cecece;
- border-bottom-color: #c5c5c5;
- background-color: #fafafa;
- background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);
- background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);
- box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #eaeaea, none;
- text-shadow: 0 1px 0 #fafafa;
- height: auto;
- padding: 0;
- border-radius: 0; }
- .tests-valo .v-splitpanel-horizontal.large .v-splitpanel-hsplitter div:before:after,
- .tests-valo .v-splitpanel-horizontal.large .v-splitpanel-vsplitter div:before:after,
- .tests-valo .v-splitpanel-vertical.large .v-splitpanel-hsplitter div:before:after,
- .tests-valo .v-splitpanel-vertical.large .v-splitpanel-vsplitter div:before:after {
- border: inherit;
- top: -1px;
- right: -1px;
- bottom: -1px;
- left: -1px; }
- .tests-valo .v-splitpanel-horizontal.large .v-splitpanel-hsplitter div:before:hover:after,
- .tests-valo .v-splitpanel-horizontal.large .v-splitpanel-vsplitter div:before:hover:after,
- .tests-valo .v-splitpanel-vertical.large .v-splitpanel-hsplitter div:before:hover:after,
- .tests-valo .v-splitpanel-vertical.large .v-splitpanel-vsplitter div:before:hover:after {
- background-color: rgba(186, 186, 186, 0.1); }
- .tests-valo .v-splitpanel-horizontal.large .v-splitpanel-hsplitter div:before:focus:after,
- .tests-valo .v-splitpanel-horizontal.large .v-splitpanel-vsplitter div:before:focus:after,
- .tests-valo .v-splitpanel-vertical.large .v-splitpanel-hsplitter div:before:focus:after,
- .tests-valo .v-splitpanel-vertical.large .v-splitpanel-vsplitter div:before:focus:after {
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- .tests-valo .v-splitpanel-horizontal.large .v-splitpanel-hsplitter div:before:active:after,
- .tests-valo .v-splitpanel-horizontal.large .v-splitpanel-vsplitter div:before:active:after,
- .tests-valo .v-splitpanel-vertical.large .v-splitpanel-hsplitter div:before:active:after,
- .tests-valo .v-splitpanel-vertical.large .v-splitpanel-vsplitter div:before:active:after {
- background-color: rgba(125, 125, 125, 0.2); }
-.tests-valo .v-splitpanel-horizontal.large .v-splitpanel-hsplitter div:before,
-.tests-valo .v-splitpanel-vertical.large .v-splitpanel-hsplitter div:before {
- background-color: #fafafa;
- background-image: -webkit-linear-gradient(left, #fafafa 2%, #efefef 98%);
- background-image: linear-gradient(to right,#fafafa 2%, #efefef 98%); }
-.tests-valo .v-splitpanel-horizontal.large .v-splitpanel-vsplitter div:after,
-.tests-valo .v-splitpanel-horizontal.large .v-splitpanel-hsplitter div:after,
-.tests-valo .v-splitpanel-vertical.large .v-splitpanel-vsplitter div:after,
-.tests-valo .v-splitpanel-vertical.large .v-splitpanel-hsplitter div:after {
- content: "";
- border: 1px solid #dfdfdf;
- border-top-color: #c5c5c5;
- border-left-color: #c5c5c5;
- position: absolute;
- top: 50%;
- left: 50%;
- width: 37px;
- height: 0;
- margin-left: -19px;
- margin-top: -1px; }
-.tests-valo .v-splitpanel-horizontal.large .v-splitpanel-hsplitter div:after,
-.tests-valo .v-splitpanel-vertical.large .v-splitpanel-hsplitter div:after {
- width: 0;
- height: 37px;
- margin-left: -1px;
- margin-top: -19px; }
-.tests-valo .v-splitpanel-horizontal.large.v-splitpanel-horizontal .v-splitpanel-second-container,
-.tests-valo .v-splitpanel-vertical.large.v-splitpanel-horizontal .v-splitpanel-second-container {
- margin-left: 12px; }
-.tests-valo .v-menubar-small {
- height: 30px;
- font-size: 13px; }
- .tests-valo .v-menubar-small .v-menubar-menuitem {
- line-height: 28px; }
- .tests-valo .v-menubar-small .v-menubar-menuitem[class*="-icon-only"] {
- width: 30px; }
-.tests-valo .v-menubar-borderless {
- border: none;
- padding: 1px;
- box-shadow: none;
- background: transparent;
- color: inherit; }
- .tests-valo .v-menubar-borderless:focus:not(.v-disabled) {
- border: none;
- box-shadow: none; }
- .tests-valo .v-menubar-borderless .v-menubar-menuitem {
- box-shadow: none;
- border: none;
- margin-right: 1px;
- border-radius: 4px;
- text-shadow: 0 -1px 0 #fafafa;
- -webkit-transition: color 140ms;
- -moz-transition: color 140ms;
- transition: color 140ms; }
- .tests-valo .v-menubar-borderless .v-menubar-menuitem:first-child, .tests-valo .v-menubar-borderless .v-menubar-menuitem:last-child {
- border-radius: inherit; }
- .tests-valo .v-menubar-borderless .v-menubar-menuitem:hover:before {
- display: none; }
- .tests-valo .v-menubar-borderless .v-menubar-menuitem:active:not(.v-menubar-menuitem-disabled):before {
- display: block; }
- .tests-valo .v-menubar-borderless .v-menubar-menuitem:hover {
- color: #197de1; }
- .tests-valo .v-menubar-borderless .v-menubar-menuitem-checked {
- border: 1px solid #cecece;
- line-height: 32px;
- color: #197de1; }
- .tests-valo .v-menubar-borderless .v-menubar-menuitem-selected {
- text-shadow: 0 -1px 0 #197de1; }
- .tests-valo .v-menubar-borderless .v-menubar-menuitem-selected:hover {
- color: #ecf2f8; }
- .tests-valo .v-menubar-borderless .v-menubar-menuitem-disabled:hover {
- color: inherit; }
-.tests-valo .v-csslayout-v-component-group {
- white-space: nowrap;
- position: relative; }
- .tests-valo .v-csslayout-v-component-group .v-widget ~ .v-widget:not(:last-child) {
- border-radius: 0; }
- .tests-valo .v-csslayout-v-component-group .v-widget:last-child {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0; }
- .tests-valo .v-csslayout-v-component-group .v-widget:first-child,
- .tests-valo .v-csslayout-v-component-group .v-caption:first-child + .v-widget {
- border-top-right-radius: 0;
- border-bottom-right-radius: 0; }
- .tests-valo .v-csslayout-v-component-group .v-widget ~ .v-widget.first.first {
- border-radius: 4px 0 0 4px; }
- .tests-valo .v-csslayout-v-component-group .v-widget ~ .v-widget.last.last {
- border-radius: 0 4px 4px 0; }
- .tests-valo .v-csslayout-v-component-group .v-widget {
- vertical-align: middle;
- margin-left: -1px; }
- .tests-valo .v-csslayout-v-component-group .v-widget:first-child {
- margin-left: 0; }
- .tests-valo .v-csslayout-v-component-group .v-widget:focus, .tests-valo .v-csslayout-v-component-group .v-widget[class*="focus"],
- .tests-valo .v-csslayout-v-component-group .v-widget [class*="focus"] {
- position: relative;
- z-index: 5; }
-.tests-valo .wrapping {
- white-space: normal !important; }
- .tests-valo .wrapping > .v-spacing + .v-slot, .tests-valo .wrapping > .v-slot:first-child {
- margin-bottom: 12px; }
- .tests-valo .wrapping > .v-slot:first-child:last-child {
- margin-bottom: 0; }
-.tests-valo .v-Notification.success,
-.tests-valo .v-Notification.failure {
- background: #fff;
- color: #555;
- border: 2px solid #2c9720; }
- .tests-valo .v-Notification.success h1,
- .tests-valo .v-Notification.failure h1 {
- color: #2c9720;
- font-weight: 400; }
- .tests-valo .v-Notification.success h1:before,
- .tests-valo .v-Notification.failure h1:before {
- font-family: FontAwesome;
- content: "\f00c";
- margin-right: .5em; }
- .tests-valo .v-Notification.success.bar,
- .tests-valo .v-Notification.failure.bar {
- margin: -2px !important; }
-.tests-valo .v-Notification.failure {
- border-color: #ed473b; }
- .tests-valo .v-Notification.failure h1 {
- color: #ed473b; }
- .tests-valo .v-Notification.failure h1:before {
- content: "\f05e"; }
-.tests-valo .v-label-success,
-.tests-valo .v-label-failure {
- background: #fff;
- color: #555;
- border: 2px solid #2c9720;
- border-radius: 4px;
- padding: 7px 19px 7px 37px;
- font-weight: 400;
- font-size: 15px; }
- .tests-valo .v-label-success:before,
- .tests-valo .v-label-failure:before {
- font-family: FontAwesome;
- content: "\f00c";
- margin-right: .5em;
- margin-left: -19px;
- color: #2c9720; }
-.tests-valo .v-label-failure {
- border-color: #ed473b; }
- .tests-valo .v-label-failure:before {
- content: "\f05e";
- color: #ed473b; }
-.tests-valo .v-panel-caption.v-horizontallayout {
- height: auto !important;
- line-height: 0; }
- .tests-valo .v-panel-caption.v-horizontallayout .v-slot {
- vertical-align: middle; }
- .tests-valo .v-panel-caption.v-horizontallayout .v-label {
- line-height: 37px; }
-.tests-valo .v-select-optiongroup-horizontal {
- white-space: nowrap; }
- .tests-valo .v-select-optiongroup-horizontal .v-radiobutton,
- .tests-valo .v-select-optiongroup-horizontal .v-checkbox {
- display: inline-block; }
- .tests-valo .v-select-optiongroup-horizontal.v-has-width {
- white-space: normal; }
- .tests-valo .v-select-optiongroup-horizontal.v-has-width label {
- white-space: nowrap; }
-.tests-valo .v-table-no-stripes .v-table-row,
-.tests-valo .v-table-no-stripes .v-table-row-odd {
- background: transparent; }
-.tests-valo .v-table-no-vertical-lines .v-table-cell-content,
-.tests-valo .v-table-no-vertical-lines [class*="row"].v-selected .v-table-cell-content {
- border-left: none;
- border-right: none;
- padding-left: 13px;
- padding-right: 13px; }
-.tests-valo .v-table-no-horizontal-lines .v-table-cell-content,
-.tests-valo .v-table-no-horizontal-lines [class*="row"].v-selected .v-table-cell-content {
- border-top: none;
- border-bottom: none; }
-.tests-valo .v-table-no-header .v-table-header-wrap {
- display: none; }
-.tests-valo .v-table-borderless .v-table-header-wrap,
-.tests-valo .v-table-borderless .v-table-footer-wrap,
-.tests-valo .v-table-borderless .v-table-header-drag,
-.tests-valo .v-table-borderless .v-table-body {
- border: none; }
-.tests-valo .v-table-borderless .v-table-header-wrap {
- border-bottom: 1px solid #dfdfdf; }
-.tests-valo .v-table-borderless .v-table-footer-wrap {
- border-top: 1px solid #dfdfdf; }
-.tests-valo .v-table-compact .v-table-header-wrap,
-.tests-valo .v-table-compact .v-table-footer-wrap,
-.tests-valo .v-table-compact .v-table-header-drag,
-.tests-valo .v-table-small .v-table-header-wrap,
-.tests-valo .v-table-small .v-table-footer-wrap,
-.tests-valo .v-table-small .v-table-header-drag {
- font-size: 14px; }
-.tests-valo .v-table-compact .v-table-footer-container,
-.tests-valo .v-table-small .v-table-footer-container {
- padding-top: 7px;
- padding-bottom: 8px;
- padding-right: 7px; }
-.tests-valo .v-table-compact .v-table-caption-container,
-.tests-valo .v-table-compact .v-table-header-drag,
-.tests-valo .v-table-small .v-table-caption-container,
-.tests-valo .v-table-small .v-table-header-drag {
- padding-top: 8px;
- padding-bottom: 7px;
- padding-left: 6px;
- padding-right: 6px; }
-.tests-valo .v-table-compact .v-table-resizer,
-.tests-valo .v-table-small .v-table-resizer {
- height: 30px; }
-.tests-valo .v-table-compact .v-table-cell-wrapper,
-.tests-valo .v-table-small .v-table-cell-wrapper {
- padding: 7px 0; }
-.tests-valo .v-table-compact .v-table-cell-content,
-.tests-valo .v-table-small .v-table-cell-content {
- padding: 0 6px; }
- .tests-valo .v-table-compact .v-table-cell-content:first-child,
- .tests-valo .v-table-small .v-table-cell-content:first-child {
- padding-left: 7px; }
-.tests-valo .v-table-compact .v-table-header-cell-asc .v-table-sort-indicator,
-.tests-valo .v-table-compact .v-table-header-cell-desc .v-table-sort-indicator,
-.tests-valo .v-table-small .v-table-header-cell-asc .v-table-sort-indicator,
-.tests-valo .v-table-small .v-table-header-cell-desc .v-table-sort-indicator {
- height: 30px;
- line-height: 30px; }
-.tests-valo .v-table-compact .v-table-header-drag,
-.tests-valo .v-table-small .v-table-header-drag {
- margin-top: -15px; }
-.tests-valo .v-table-compact .v-table-row-drag-middle td:first-child:before,
-.tests-valo .v-table-small .v-table-row-drag-middle td:first-child:before {
- height: 31px; }
-.tests-valo .v-table-small {
- font-size: 13px; }
-.tests-valo .v-accordion-borderless {
- border: none;
- border-radius: 0;
- box-shadow: none; }
- .tests-valo .v-accordion-borderless > .v-accordion-item {
- border-radius: 0; }
-.tests-valo .v-slot-valo-menu {
- position: fixed; }
-.tests-valo .valo-menu {
- position: fixed;
- height: 100%;
- overflow: auto;
- padding-bottom: 37px;
- background-color: #646464;
- background-image: -webkit-linear-gradient(right, #5c5c5c 0%, #646464 9px);
- background-image: linear-gradient(to left,#5c5c5c 0%, #646464 9px);
- color: #e0e0e0;
- font-size: 14px;
- line-height: 30px;
- border-right: 1px solid #525252; }
- .tests-valo .valo-menu .valo-menu-title,
- .tests-valo .valo-menu .valo-menu-subtitle,
- .tests-valo .valo-menu .valo-menu-item {
- display: block;
- line-height: inherit; }
- .tests-valo .valo-menu .valo-menu-title {
- line-height: 1.2;
- background-color: #197de1;
- background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);
- background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);
- color: white;
- text-shadow: 0 -1px 0 #197de1;
- padding: 12px 19px;
- font-size: 0.9em;
- border-bottom: 1px solid #1467b9;
- box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); }
- .tests-valo .valo-menu .valo-menu-title .v-menubar {
- background: transparent;
- border-color: #1467b9;
- color: inherit;
- box-shadow: none;
- text-shadow: inherit; }
- .tests-valo .valo-menu .valo-menu-title .v-menubar-menuitem {
- background: transparent;
- box-shadow: inset 0 1px 0 #4595e5, inset 0 -1px 0 #166ccd;
- text-shadow: inherit;
- font-size: 16px;
- border-color: inherit; }
- .tests-valo .valo-menu .valo-menu-subtitle {
- color: #b1b1b1;
- margin: 7px 0 7px 19px;
- border-bottom: 1px solid #5b5b5b;
- position: relative; }
- .tests-valo .valo-menu .valo-menu-subtitle .badge {
- position: absolute;
- right: 19px;
- color: #7caee0; }
- .tests-valo .valo-menu .valo-menu-item {
- outline: none;
- font-weight: 400;
- padding: 0 37px 0 19px;
- cursor: pointer;
- position: relative; }
- .tests-valo .valo-menu .valo-menu-item:before {
- content: "";
- background: #4396ea;
- position: absolute;
- left: 0;
- height: 100%;
- width: 0;
- border-radius: 0 4px 4px 0;
- -webkit-transition: width 300ms;
- -moz-transition: width 300ms;
- transition: width 300ms; }
- .tests-valo .valo-menu .valo-menu-item:hover, .tests-valo .valo-menu .valo-menu-item.selected {
- color: white; }
- .tests-valo .valo-menu .valo-menu-item.selected:before {
- width: 5px; }
-.tests-valo .valo-menu .v-checkbox {
- margin: 19px;
- font-weight: 400; }
-.tests-valo .view {
- min-height: 600px; }
-.tests-valo .v-textfield-color1 {
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- margin: 0;
- font: inherit;
- font-weight: 400;
- line-height: normal;
- height: 37px;
- border-radius: 4px;
- padding: 4px 9px;
- border: 1px solid #4b4e54;
- background: #5c5f66;
- color: #dedfe0;
- box-shadow: inset 0 1px 0 #5a5d63, 0 1px 0 rgba(255, 255, 255, 0.1);
- -webkit-transition: box-shadow 180ms, border 180ms;
- -moz-transition: box-shadow 180ms, border 180ms;
- transition: box-shadow 180ms, border 180ms; }
- .tests-valo .v-textfield-color1.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-textfield-color1:focus {
- outline: none;
- -webkit-transition: none;
- -moz-transition: none;
- transition: none;
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #5a5d63, 0 1px 0 rgba(255, 255, 255, 0.1); }
- .tests-valo .v-textfield-color1.v-textfield-prompt, .tests-valo .v-textfield-color1.v-textarea-prompt {
- color: #9a9ea6; }
-.tests-valo .v-textfield-color2 {
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- margin: 0;
- font: inherit;
- font-weight: 400;
- line-height: normal;
- height: 37px;
- border-radius: 4px;
- padding: 4px 9px;
- border: 1px solid #329b15;
- background: #3dbc1a;
- color: #daefd4;
- box-shadow: inset 0 1px 0 #3db51a, 0 1px 0 rgba(255, 255, 255, 0.1);
- -webkit-transition: box-shadow 180ms, border 180ms;
- -moz-transition: box-shadow 180ms, border 180ms;
- transition: box-shadow 180ms, border 180ms; }
- .tests-valo .v-textfield-color2.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-textfield-color2:focus {
- outline: none;
- -webkit-transition: none;
- -moz-transition: none;
- transition: none;
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #3db51a, 0 1px 0 rgba(255, 255, 255, 0.1); }
- .tests-valo .v-textfield-color2.v-textfield-prompt, .tests-valo .v-textfield-color2.v-textarea-prompt {
- color: #98ef80; }
-.tests-valo .v-textfield-color3 {
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- margin: 0;
- font: inherit;
- font-weight: 400;
- line-height: normal;
- height: 37px;
- border-radius: 4px;
- padding: 4px 9px;
- border: 1px solid #adc9c8;
- background: #d2f4f3;
- color: #285755;
- box-shadow: inset 0 1px 0 #cbf1f0, 0 1px 0 rgba(255, 255, 255, 0.1);
- -webkit-transition: box-shadow 180ms, border 180ms;
- -moz-transition: box-shadow 180ms, border 180ms;
- transition: box-shadow 180ms, border 180ms; }
- .tests-valo .v-textfield-color3.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-textfield-color3:focus {
- outline: none;
- -webkit-transition: none;
- -moz-transition: none;
- transition: none;
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #cbf1f0, 0 1px 0 rgba(255, 255, 255, 0.1); }
- .tests-valo .v-textfield-color3.v-textfield-prompt, .tests-valo .v-textfield-color3.v-textarea-prompt {
- color: #6db5b4; }
-.tests-valo .v-textarea-color1 {
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- margin: 0;
- font: inherit;
- font-weight: 400;
- line-height: normal;
- height: 37px;
- border-radius: 4px;
- padding: 6px;
- border: 1px solid #4b4e54;
- background: #5c5f66;
- color: #dedfe0;
- box-shadow: inset 0 1px 0 #5a5d63, 0 1px 0 rgba(255, 255, 255, 0.1);
- -webkit-transition: box-shadow 180ms, border 180ms;
- -moz-transition: box-shadow 180ms, border 180ms;
- transition: box-shadow 180ms, border 180ms;
- height: auto;
- resize: none; }
- .tests-valo .v-textarea-color1.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-textarea-color1:focus {
- outline: none;
- -webkit-transition: none;
- -moz-transition: none;
- transition: none;
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #5a5d63, 0 1px 0 rgba(255, 255, 255, 0.1); }
- .tests-valo .v-textarea-color1.v-textfield-prompt, .tests-valo .v-textarea-color1.v-textarea-prompt {
- color: #9a9ea6; }
-.tests-valo .v-textarea-color2 {
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- margin: 0;
- font: inherit;
- font-weight: 400;
- line-height: normal;
- height: 37px;
- border-radius: 4px;
- padding: 6px;
- border: 1px solid #329b15;
- background: #3dbc1a;
- color: #daefd4;
- box-shadow: inset 0 1px 0 #3db51a, 0 1px 0 rgba(255, 255, 255, 0.1);
- -webkit-transition: box-shadow 180ms, border 180ms;
- -moz-transition: box-shadow 180ms, border 180ms;
- transition: box-shadow 180ms, border 180ms;
- height: auto;
- resize: none; }
- .tests-valo .v-textarea-color2.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-textarea-color2:focus {
- outline: none;
- -webkit-transition: none;
- -moz-transition: none;
- transition: none;
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #3db51a, 0 1px 0 rgba(255, 255, 255, 0.1); }
- .tests-valo .v-textarea-color2.v-textfield-prompt, .tests-valo .v-textarea-color2.v-textarea-prompt {
- color: #98ef80; }
-.tests-valo .v-textarea-color3 {
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- margin: 0;
- font: inherit;
- font-weight: 400;
- line-height: normal;
- height: 37px;
- border-radius: 4px;
- padding: 6px;
- border: 1px solid #adc9c8;
- background: #d2f4f3;
- color: #285755;
- box-shadow: inset 0 1px 0 #cbf1f0, 0 1px 0 rgba(255, 255, 255, 0.1);
- -webkit-transition: box-shadow 180ms, border 180ms;
- -moz-transition: box-shadow 180ms, border 180ms;
- transition: box-shadow 180ms, border 180ms;
- height: auto;
- resize: none; }
- .tests-valo .v-textarea-color3.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-textarea-color3:focus {
- outline: none;
- -webkit-transition: none;
- -moz-transition: none;
- transition: none;
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #cbf1f0, 0 1px 0 rgba(255, 255, 255, 0.1); }
- .tests-valo .v-textarea-color3.v-textfield-prompt, .tests-valo .v-textarea-color3.v-textarea-prompt {
- color: #6db5b4; }
-.tests-valo .v-datefield-color1 {
- height: 37px;
- border-radius: 4px; }
- .tests-valo .v-datefield-color1 .v-datefield-textfield {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- margin: 0;
- font: inherit;
- font-weight: 400;
- line-height: normal;
- height: 37px;
- border-radius: 4px;
- padding: 4px 9px;
- border: 1px solid #4b4e54;
- background: #5c5f66;
- color: #dedfe0;
- box-shadow: inset 0 1px 0 #5a5d63, 0 1px 0 rgba(255, 255, 255, 0.1);
- -webkit-transition: box-shadow 180ms, border 180ms;
- -moz-transition: box-shadow 180ms, border 180ms;
- transition: box-shadow 180ms, border 180ms;
- padding-left: 44.4px;
- width: 100%;
- height: 100%;
- border-radius: inherit; }
- .tests-valo .v-datefield-color1 .v-datefield-textfield.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-datefield-color1 .v-datefield-textfield:focus {
- outline: none;
- -webkit-transition: none;
- -moz-transition: none;
- transition: none;
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #5a5d63, 0 1px 0 rgba(255, 255, 255, 0.1); }
- .tests-valo .v-datefield-color1 .v-datefield-textfield.v-textfield-prompt, .tests-valo .v-datefield-color1 .v-datefield-textfield.v-textarea-prompt {
- color: #9a9ea6; }
- .tests-valo .v-datefield-color1.v-datefield-prompt > .v-datefield-textfield {
- color: #9a9ea6; }
- .tests-valo .v-datefield-color1 .v-datefield-button {
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
- -webkit-touch-callout: none;
- cursor: pointer;
- -webkit-appearance: none;
- background: transparent;
- border: none;
- padding: 0;
- position: absolute;
- z-index: 10;
- top: 1px;
- bottom: 1px;
- left: 1px;
- width: 37px;
- line-height: 35px;
- text-align: center;
- cursor: pointer;
- font: inherit;
- border-right: 1px solid #53565d;
- outline: none;
- margin: 0;
- border-radius: 3px 0 0 3px; }
- .tests-valo .v-datefield-color1 .v-datefield-button:before {
- font-family: FontAwesome;
- content: "\f073";
- color: #dedfe0;
- color: #9d9fa3;
- -webkit-transition: color 140ms;
- -moz-transition: color 140ms;
- transition: color 140ms; }
- .tests-valo .v-datefield-color1 .v-datefield-button:hover:before {
- color: #dedfe0; }
- .tests-valo .v-datefield-color1 .v-datefield-button:active:after {
- content: "";
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- background-color: rgba(44, 47, 53, 0.2);
- border-radius: inherit; }
- .tests-valo .v-datefield-color1.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-datefield-color1.v-disabled .v-datefield-button {
- cursor: default;
- pointer-events: none; }
- .tests-valo .v-datefield-color1.v-disabled .v-datefield-button:active:after {
- display: none; }
- .tests-valo .v-datefield-color1.v-readonly .v-datefield-textfield {
- background: transparent;
- box-shadow: none; }
- .tests-valo .v-datefield-color1.v-readonly .v-datefield-textfield:focus {
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- .tests-valo .v-datefield-color1.v-readonly .v-datefield-button {
- cursor: default;
- pointer-events: none; }
- .tests-valo .v-datefield-color1.v-readonly .v-datefield-button:active:after {
- display: none; }
-.tests-valo .v-datefield-color2 {
- height: 37px;
- border-radius: 4px; }
- .tests-valo .v-datefield-color2 .v-datefield-textfield {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- margin: 0;
- font: inherit;
- font-weight: 400;
- line-height: normal;
- height: 37px;
- border-radius: 4px;
- padding: 4px 9px;
- border: 1px solid #329b15;
- background: #3dbc1a;
- color: #daefd4;
- box-shadow: inset 0 1px 0 #3db51a, 0 1px 0 rgba(255, 255, 255, 0.1);
- -webkit-transition: box-shadow 180ms, border 180ms;
- -moz-transition: box-shadow 180ms, border 180ms;
- transition: box-shadow 180ms, border 180ms;
- padding-left: 44.4px;
- width: 100%;
- height: 100%;
- border-radius: inherit; }
- .tests-valo .v-datefield-color2 .v-datefield-textfield.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-datefield-color2 .v-datefield-textfield:focus {
- outline: none;
- -webkit-transition: none;
- -moz-transition: none;
- transition: none;
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #3db51a, 0 1px 0 rgba(255, 255, 255, 0.1); }
- .tests-valo .v-datefield-color2 .v-datefield-textfield.v-textfield-prompt, .tests-valo .v-datefield-color2 .v-datefield-textfield.v-textarea-prompt {
- color: #98ef80; }
- .tests-valo .v-datefield-color2.v-datefield-prompt > .v-datefield-textfield {
- color: #98ef80; }
- .tests-valo .v-datefield-color2 .v-datefield-button {
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
- -webkit-touch-callout: none;
- cursor: pointer;
- -webkit-appearance: none;
- background: transparent;
- border: none;
- padding: 0;
- position: absolute;
- z-index: 10;
- top: 1px;
- bottom: 1px;
- left: 1px;
- width: 37px;
- line-height: 35px;
- text-align: center;
- cursor: pointer;
- font: inherit;
- border-right: 1px solid #37ab17;
- outline: none;
- margin: 0;
- border-radius: 3px 0 0 3px; }
- .tests-valo .v-datefield-color2 .v-datefield-button:before {
- font-family: FontAwesome;
- content: "\f073";
- color: #daefd4;
- color: #8bd577;
- -webkit-transition: color 140ms;
- -moz-transition: color 140ms;
- transition: color 140ms; }
- .tests-valo .v-datefield-color2 .v-datefield-button:hover:before {
- color: #daefd4; }
- .tests-valo .v-datefield-color2 .v-datefield-button:active:after {
- content: "";
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- background-color: rgba(25, 104, 3, 0.2);
- border-radius: inherit; }
- .tests-valo .v-datefield-color2.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-datefield-color2.v-disabled .v-datefield-button {
- cursor: default;
- pointer-events: none; }
- .tests-valo .v-datefield-color2.v-disabled .v-datefield-button:active:after {
- display: none; }
- .tests-valo .v-datefield-color2.v-readonly .v-datefield-textfield {
- background: transparent;
- box-shadow: none; }
- .tests-valo .v-datefield-color2.v-readonly .v-datefield-textfield:focus {
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- .tests-valo .v-datefield-color2.v-readonly .v-datefield-button {
- cursor: default;
- pointer-events: none; }
- .tests-valo .v-datefield-color2.v-readonly .v-datefield-button:active:after {
- display: none; }
-.tests-valo .v-datefield-color3 {
- height: 37px;
- border-radius: 4px; }
- .tests-valo .v-datefield-color3 .v-datefield-textfield {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- margin: 0;
- font: inherit;
- font-weight: 400;
- line-height: normal;
- height: 37px;
- border-radius: 4px;
- padding: 4px 9px;
- border: 1px solid #adc9c8;
- background: #d2f4f3;
- color: #285755;
- box-shadow: inset 0 1px 0 #cbf1f0, 0 1px 0 rgba(255, 255, 255, 0.1);
- -webkit-transition: box-shadow 180ms, border 180ms;
- -moz-transition: box-shadow 180ms, border 180ms;
- transition: box-shadow 180ms, border 180ms;
- padding-left: 44.4px;
- width: 100%;
- height: 100%;
- border-radius: inherit; }
- .tests-valo .v-datefield-color3 .v-datefield-textfield.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-datefield-color3 .v-datefield-textfield:focus {
- outline: none;
- -webkit-transition: none;
- -moz-transition: none;
- transition: none;
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #cbf1f0, 0 1px 0 rgba(255, 255, 255, 0.1); }
- .tests-valo .v-datefield-color3 .v-datefield-textfield.v-textfield-prompt, .tests-valo .v-datefield-color3 .v-datefield-textfield.v-textarea-prompt {
- color: #6db5b4; }
- .tests-valo .v-datefield-color3.v-datefield-prompt > .v-datefield-textfield {
- color: #6db5b4; }
- .tests-valo .v-datefield-color3 .v-datefield-button {
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
- -webkit-touch-callout: none;
- cursor: pointer;
- -webkit-appearance: none;
- background: transparent;
- border: none;
- padding: 0;
- position: absolute;
- z-index: 10;
- top: 1px;
- bottom: 1px;
- left: 1px;
- width: 37px;
- line-height: 35px;
- text-align: center;
- cursor: pointer;
- font: inherit;
- border-right: 1px solid #bfdedd;
- outline: none;
- margin: 0;
- border-radius: 3px 0 0 3px; }
- .tests-valo .v-datefield-color3 .v-datefield-button:before {
- font-family: FontAwesome;
- content: "\f073";
- color: #285755;
- color: #7da5a4;
- -webkit-transition: color 140ms;
- -moz-transition: color 140ms;
- transition: color 140ms; }
- .tests-valo .v-datefield-color3 .v-datefield-button:hover:before {
- color: #285755; }
- .tests-valo .v-datefield-color3 .v-datefield-button:active:after {
- content: "";
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- background-color: rgba(18, 209, 204, 0.2);
- border-radius: inherit; }
- .tests-valo .v-datefield-color3.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-datefield-color3.v-disabled .v-datefield-button {
- cursor: default;
- pointer-events: none; }
- .tests-valo .v-datefield-color3.v-disabled .v-datefield-button:active:after {
- display: none; }
- .tests-valo .v-datefield-color3.v-readonly .v-datefield-textfield {
- background: transparent;
- box-shadow: none; }
- .tests-valo .v-datefield-color3.v-readonly .v-datefield-textfield:focus {
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- .tests-valo .v-datefield-color3.v-readonly .v-datefield-button {
- cursor: default;
- pointer-events: none; }
- .tests-valo .v-datefield-color3.v-readonly .v-datefield-button:active:after {
- display: none; }
-.tests-valo .v-filterselect-color1 {
- height: 37px;
- border-radius: 4px; }
- .tests-valo .v-filterselect-color1 .v-filterselect-input {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- margin: 0;
- font: inherit;
- font-weight: 400;
- line-height: normal;
- height: 37px;
- border-radius: 4px;
- padding: 4px 9px;
- border: 1px solid #4b4e54;
- background: #5c5f66;
- color: #dedfe0;
- box-shadow: inset 0 1px 0 #5a5d63, 0 1px 0 rgba(255, 255, 255, 0.1);
- -webkit-transition: box-shadow 180ms, border 180ms;
- -moz-transition: box-shadow 180ms, border 180ms;
- transition: box-shadow 180ms, border 180ms;
- width: 100% !important;
- height: 100%;
- padding-right: 44px;
- border-radius: inherit; }
- .tests-valo .v-filterselect-color1 .v-filterselect-input.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-filterselect-color1 .v-filterselect-input:focus {
- outline: none;
- -webkit-transition: none;
- -moz-transition: none;
- transition: none;
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #5a5d63, 0 1px 0 rgba(255, 255, 255, 0.1); }
- .tests-valo .v-filterselect-color1 .v-filterselect-input.v-textfield-prompt, .tests-valo .v-filterselect-color1 .v-filterselect-input.v-textarea-prompt {
- color: #9a9ea6; }
- .tests-valo .v-filterselect-color1 .v-icon + .v-filterselect-input {
- padding-left: 37px; }
- .tests-valo .v-filterselect-color1 img.v-icon {
- max-height: 37px;
- margin-left: 9px; }
- .tests-valo .v-filterselect-color1 span.v-icon {
- color: #dedfe0;
- width: 37px; }
- .tests-valo .v-filterselect-color1.v-filterselect-prompt > .v-filterselect-input {
- color: #9a9ea6; }
- .tests-valo .v-filterselect-color1 .v-filterselect-button {
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
- -webkit-touch-callout: none;
- cursor: pointer;
- position: absolute;
- top: 1px;
- right: 1px;
- bottom: 1px;
- width: 37px;
- cursor: pointer;
- border-left: 1px solid #53565d;
- border-radius: 0 3px 3px 0; }
- .v-ie8 .tests-valo .v-filterselect-color1 .v-filterselect-button {
- background-color: #5c5f66; }
- .tests-valo .v-filterselect-color1 .v-filterselect-button:before {
- font-family: FontAwesome;
- content: "\f078";
- color: #dedfe0;
- color: #9d9fa3;
- -webkit-transition: color 140ms;
- -moz-transition: color 140ms;
- transition: color 140ms;
- position: absolute;
- width: 37px;
- text-align: center;
- top: 50%;
- line-height: 1;
- margin-top: -.47em; }
- .tests-valo .v-filterselect-color1 .v-filterselect-button:hover:before {
- color: #dedfe0; }
- .tests-valo .v-filterselect-color1 .v-filterselect-button:active:after {
- content: "";
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- border-radius: inherit;
- background-color: rgba(44, 47, 53, 0.2); }
- .tests-valo .v-filterselect-color1.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-filterselect-color1.v-disabled .v-filterselect-button {
- cursor: default;
- pointer-events: none; }
- .tests-valo .v-filterselect-color1.v-disabled .v-filterselect-button:active:after {
- display: none; }
- .tests-valo .v-filterselect-color1.v-readonly .v-filterselect-input {
- background: transparent;
- box-shadow: none; }
- .tests-valo .v-filterselect-color1.v-readonly .v-filterselect-input:focus {
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- .tests-valo .v-filterselect-color1.v-readonly .v-filterselect-button {
- cursor: default;
- pointer-events: none; }
- .tests-valo .v-filterselect-color1.v-readonly .v-filterselect-button:active:after {
- display: none; }
-.tests-valo .v-filterselect-color2 {
- height: 37px;
- border-radius: 4px; }
- .tests-valo .v-filterselect-color2 .v-filterselect-input {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- margin: 0;
- font: inherit;
- font-weight: 400;
- line-height: normal;
- height: 37px;
- border-radius: 4px;
- padding: 4px 9px;
- border: 1px solid #329b15;
- background: #3dbc1a;
- color: #daefd4;
- box-shadow: inset 0 1px 0 #3db51a, 0 1px 0 rgba(255, 255, 255, 0.1);
- -webkit-transition: box-shadow 180ms, border 180ms;
- -moz-transition: box-shadow 180ms, border 180ms;
- transition: box-shadow 180ms, border 180ms;
- width: 100% !important;
- height: 100%;
- padding-right: 44px;
- border-radius: inherit; }
- .tests-valo .v-filterselect-color2 .v-filterselect-input.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-filterselect-color2 .v-filterselect-input:focus {
- outline: none;
- -webkit-transition: none;
- -moz-transition: none;
- transition: none;
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #3db51a, 0 1px 0 rgba(255, 255, 255, 0.1); }
- .tests-valo .v-filterselect-color2 .v-filterselect-input.v-textfield-prompt, .tests-valo .v-filterselect-color2 .v-filterselect-input.v-textarea-prompt {
- color: #98ef80; }
- .tests-valo .v-filterselect-color2 .v-icon + .v-filterselect-input {
- padding-left: 37px; }
- .tests-valo .v-filterselect-color2 img.v-icon {
- max-height: 37px;
- margin-left: 9px; }
- .tests-valo .v-filterselect-color2 span.v-icon {
- color: #daefd4;
- width: 37px; }
- .tests-valo .v-filterselect-color2.v-filterselect-prompt > .v-filterselect-input {
- color: #98ef80; }
- .tests-valo .v-filterselect-color2 .v-filterselect-button {
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
- -webkit-touch-callout: none;
- cursor: pointer;
- position: absolute;
- top: 1px;
- right: 1px;
- bottom: 1px;
- width: 37px;
- cursor: pointer;
- border-left: 1px solid #37ab17;
- border-radius: 0 3px 3px 0; }
- .v-ie8 .tests-valo .v-filterselect-color2 .v-filterselect-button {
- background-color: #3dbc1a; }
- .tests-valo .v-filterselect-color2 .v-filterselect-button:before {
- font-family: FontAwesome;
- content: "\f078";
- color: #daefd4;
- color: #8bd577;
- -webkit-transition: color 140ms;
- -moz-transition: color 140ms;
- transition: color 140ms;
- position: absolute;
- width: 37px;
- text-align: center;
- top: 50%;
- line-height: 1;
- margin-top: -.47em; }
- .tests-valo .v-filterselect-color2 .v-filterselect-button:hover:before {
- color: #daefd4; }
- .tests-valo .v-filterselect-color2 .v-filterselect-button:active:after {
- content: "";
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- border-radius: inherit;
- background-color: rgba(25, 104, 3, 0.2); }
- .tests-valo .v-filterselect-color2.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-filterselect-color2.v-disabled .v-filterselect-button {
- cursor: default;
- pointer-events: none; }
- .tests-valo .v-filterselect-color2.v-disabled .v-filterselect-button:active:after {
- display: none; }
- .tests-valo .v-filterselect-color2.v-readonly .v-filterselect-input {
- background: transparent;
- box-shadow: none; }
- .tests-valo .v-filterselect-color2.v-readonly .v-filterselect-input:focus {
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- .tests-valo .v-filterselect-color2.v-readonly .v-filterselect-button {
- cursor: default;
- pointer-events: none; }
- .tests-valo .v-filterselect-color2.v-readonly .v-filterselect-button:active:after {
- display: none; }
-.tests-valo .v-filterselect-color3 {
- height: 37px;
- border-radius: 4px; }
- .tests-valo .v-filterselect-color3 .v-filterselect-input {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- -webkit-appearance: none;
- -moz-appearance: none;
- -ms-appearance: none;
- -o-appearance: none;
- appearance: none;
- margin: 0;
- font: inherit;
- font-weight: 400;
- line-height: normal;
- height: 37px;
- border-radius: 4px;
- padding: 4px 9px;
- border: 1px solid #adc9c8;
- background: #d2f4f3;
- color: #285755;
- box-shadow: inset 0 1px 0 #cbf1f0, 0 1px 0 rgba(255, 255, 255, 0.1);
- -webkit-transition: box-shadow 180ms, border 180ms;
- -moz-transition: box-shadow 180ms, border 180ms;
- transition: box-shadow 180ms, border 180ms;
- width: 100% !important;
- height: 100%;
- padding-right: 44px;
- border-radius: inherit; }
- .tests-valo .v-filterselect-color3 .v-filterselect-input.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-filterselect-color3 .v-filterselect-input:focus {
- outline: none;
- -webkit-transition: none;
- -moz-transition: none;
- transition: none;
- border-color: #197de1;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #cbf1f0, 0 1px 0 rgba(255, 255, 255, 0.1); }
- .tests-valo .v-filterselect-color3 .v-filterselect-input.v-textfield-prompt, .tests-valo .v-filterselect-color3 .v-filterselect-input.v-textarea-prompt {
- color: #6db5b4; }
- .tests-valo .v-filterselect-color3 .v-icon + .v-filterselect-input {
- padding-left: 37px; }
- .tests-valo .v-filterselect-color3 img.v-icon {
- max-height: 37px;
- margin-left: 9px; }
- .tests-valo .v-filterselect-color3 span.v-icon {
- color: #285755;
- width: 37px; }
- .tests-valo .v-filterselect-color3.v-filterselect-prompt > .v-filterselect-input {
- color: #6db5b4; }
- .tests-valo .v-filterselect-color3 .v-filterselect-button {
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
- -webkit-touch-callout: none;
- cursor: pointer;
- position: absolute;
- top: 1px;
- right: 1px;
- bottom: 1px;
- width: 37px;
- cursor: pointer;
- border-left: 1px solid #bfdedd;
- border-radius: 0 3px 3px 0; }
- .v-ie8 .tests-valo .v-filterselect-color3 .v-filterselect-button {
- background-color: #d2f4f3; }
- .tests-valo .v-filterselect-color3 .v-filterselect-button:before {
- font-family: FontAwesome;
- content: "\f078";
- color: #285755;
- color: #7da5a4;
- -webkit-transition: color 140ms;
- -moz-transition: color 140ms;
- transition: color 140ms;
- position: absolute;
- width: 37px;
- text-align: center;
- top: 50%;
- line-height: 1;
- margin-top: -.47em; }
- .tests-valo .v-filterselect-color3 .v-filterselect-button:hover:before {
- color: #285755; }
- .tests-valo .v-filterselect-color3 .v-filterselect-button:active:after {
- content: "";
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- border-radius: inherit;
- background-color: rgba(18, 209, 204, 0.2); }
- .tests-valo .v-filterselect-color3.v-disabled {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- .tests-valo .v-filterselect-color3.v-disabled .v-filterselect-button {
- cursor: default;
- pointer-events: none; }
- .tests-valo .v-filterselect-color3.v-disabled .v-filterselect-button:active:after {
- display: none; }
- .tests-valo .v-filterselect-color3.v-readonly .v-filterselect-input {
- background: transparent;
- box-shadow: none; }
- .tests-valo .v-filterselect-color3.v-readonly .v-filterselect-input:focus {
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- .tests-valo .v-filterselect-color3.v-readonly .v-filterselect-button {
- cursor: default;
- pointer-events: none; }
- .tests-valo .v-filterselect-color3.v-readonly .v-filterselect-button:active:after {
- display: none; }
-.tests-valo .v-checkbox-color1 {
- position: relative;
- line-height: 19px;
- white-space: nowrap; }
- .tests-valo .v-checkbox-color1.v-has-width label {
- white-space: normal; }
- :root .tests-valo .v-checkbox-color1 {
- padding-left: 25px; }
- :root .tests-valo .v-checkbox-color1 label {
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
- -webkit-touch-callout: none;
- cursor: pointer; }
- :root .tests-valo .v-checkbox-color1 > input {
- position: absolute;
- clip: rect(0, 0, 0, 0);
- left: .2em;
- top: .2em;
- z-index: 0;
- margin: 0; }
- :root .tests-valo .v-checkbox-color1 > input:focus ~ label:before {
- border: 1px solid #4b4e54;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #787878, inset 0 -1px 0 #4e5157, 0 2px 3px rgba(0, 0, 0, 0.05); }
- :root .tests-valo .v-checkbox-color1 > input ~ label:before, :root .tests-valo .v-checkbox-color1 > input ~ label:after {
- content: "";
- display: inline-block;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- width: 19px;
- height: 19px;
- position: absolute;
- top: 0;
- left: 0;
- border-radius: 4px;
- font-size: 13px;
- text-align: center; }
- :root .tests-valo .v-checkbox-color1 > input ~ label:before {
- height: 18.5px;
- padding: 0 9px;
- color: #efeff0;
- font-weight: 400;
- border-radius: 4px;
- border: 1px solid #4b4e54;
- border-top-color: #51545a;
- border-bottom-color: #424449;
- background-color: #5c5f66;
- background-image: -webkit-linear-gradient(top, #63666e 2%, #505359 98%);
- background-image: linear-gradient(to bottom,#63666e 2%, #505359 98%);
- box-shadow: inset 0 1px 0 #787878, inset 0 -1px 0 #4e5157, 0 2px 3px rgba(0, 0, 0, 0.05);
- text-shadow: 0 -1px 0 #5c5f66;
- padding: 0;
- height: 19px; }
- :root .tests-valo .v-checkbox-color1 > input ~ label:before:after {
- border: inherit;
- top: -1px;
- right: -1px;
- bottom: -1px;
- left: -1px; }
- :root .tests-valo .v-checkbox-color1 > input ~ label:before:hover:after {
- background-color: rgba(129, 133, 141, 0.1); }
- :root .tests-valo .v-checkbox-color1 > input ~ label:before:focus:after {
- border: inherit;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- :root .tests-valo .v-checkbox-color1 > input ~ label:before:active:after {
- background-color: rgba(44, 47, 53, 0.2); }
- :root .tests-valo .v-checkbox-color1 > input ~ label:after {
- content: "\f00c";
- font-family: FontAwesome;
- color: transparent;
- -webkit-transition: color 100ms;
- -moz-transition: color 100ms;
- transition: color 100ms; }
- :root .tests-valo .v-checkbox-color1 > input:active ~ label:after {
- background-color: rgba(44, 47, 53, 0.2); }
- :root .tests-valo .v-checkbox-color1 > input:checked ~ label:after {
- color: white; }
- :root .tests-valo .v-checkbox-color1 > input[disabled] ~ label,
- :root .tests-valo .v-checkbox-color1 > input[disabled] ~ label .v-icon,
- :root .tests-valo .v-checkbox-color1 > input[disabled] ~ .v-icon {
- cursor: default; }
- :root .tests-valo .v-checkbox-color1 > input[disabled] ~ label:before,
- :root .tests-valo .v-checkbox-color1 > input[disabled] ~ label:after {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- :root .tests-valo .v-checkbox-color1 > input[disabled]:active ~ label:after {
- background: transparent; }
- .tests-valo .v-checkbox-color1 > .v-icon, .tests-valo .v-checkbox-color1 > label .v-icon {
- margin: 0 6px 0 3px;
- min-width: 1em;
- cursor: pointer; }
-.tests-valo .v-checkbox-color2 {
- position: relative;
- line-height: 19px;
- white-space: nowrap; }
- .tests-valo .v-checkbox-color2.v-has-width label {
- white-space: normal; }
- :root .tests-valo .v-checkbox-color2 {
- padding-left: 25px; }
- :root .tests-valo .v-checkbox-color2 label {
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
- -webkit-touch-callout: none;
- cursor: pointer; }
- :root .tests-valo .v-checkbox-color2 > input {
- position: absolute;
- clip: rect(0, 0, 0, 0);
- left: .2em;
- top: .2em;
- z-index: 0;
- margin: 0; }
- :root .tests-valo .v-checkbox-color2 > input:focus ~ label:before {
- border: 1px solid #4c5e9e;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #8795c9, inset 0 -1px 0 #5062ad, 0 2px 3px rgba(0, 0, 0, 0.05); }
- :root .tests-valo .v-checkbox-color2 > input ~ label:before, :root .tests-valo .v-checkbox-color2 > input ~ label:after {
- content: "";
- display: inline-block;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- width: 19px;
- height: 19px;
- position: absolute;
- top: 0;
- left: 0;
- border-radius: 4px;
- font-size: 13px;
- text-align: center; }
- :root .tests-valo .v-checkbox-color2 > input ~ label:before {
- height: 18.5px;
- padding: 0 9px;
- color: #f1f2f6;
- font-weight: 400;
- border-radius: 4px;
- border: 1px solid #4c5e9e;
- border-top-color: #5266a2;
- border-bottom-color: #425292;
- background-color: #5d73c0;
- background-image: -webkit-linear-gradient(top, #647cc5 2%, #5164b2 98%);
- background-image: linear-gradient(to bottom,#647cc5 2%, #5164b2 98%);
- box-shadow: inset 0 1px 0 #8795c9, inset 0 -1px 0 #5062ad, 0 2px 3px rgba(0, 0, 0, 0.05);
- text-shadow: 0 -1px 0 #5d73c0;
- padding: 0;
- height: 19px; }
- :root .tests-valo .v-checkbox-color2 > input ~ label:before:after {
- border: inherit;
- top: -1px;
- right: -1px;
- bottom: -1px;
- left: -1px; }
- :root .tests-valo .v-checkbox-color2 > input ~ label:before:hover:after {
- background-color: rgba(148, 163, 213, 0.1); }
- :root .tests-valo .v-checkbox-color2 > input ~ label:before:focus:after {
- border: inherit;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- :root .tests-valo .v-checkbox-color2 > input ~ label:before:active:after {
- background-color: rgba(22, 44, 120, 0.2); }
- :root .tests-valo .v-checkbox-color2 > input ~ label:after {
- content: "\f00c";
- font-family: FontAwesome;
- color: transparent;
- -webkit-transition: color 100ms;
- -moz-transition: color 100ms;
- transition: color 100ms; }
- :root .tests-valo .v-checkbox-color2 > input:active ~ label:after {
- background-color: rgba(22, 44, 120, 0.2); }
- :root .tests-valo .v-checkbox-color2 > input:checked ~ label:after {
- color: white; }
- :root .tests-valo .v-checkbox-color2 > input[disabled] ~ label,
- :root .tests-valo .v-checkbox-color2 > input[disabled] ~ label .v-icon,
- :root .tests-valo .v-checkbox-color2 > input[disabled] ~ .v-icon {
- cursor: default; }
- :root .tests-valo .v-checkbox-color2 > input[disabled] ~ label:before,
- :root .tests-valo .v-checkbox-color2 > input[disabled] ~ label:after {
- opacity: 0.5;
- filter: alpha(opacity=50); }
- :root .tests-valo .v-checkbox-color2 > input[disabled]:active ~ label:after {
- background: transparent; }
- .tests-valo .v-checkbox-color2 > .v-icon, .tests-valo .v-checkbox-color2 > label .v-icon {
- margin: 0 6px 0 3px;
- min-width: 1em;
- cursor: pointer; }
-.tests-valo .v-slider-color1 .v-slider-handle:before {
- color: #efeff0;
- font-weight: 400;
- border: 1px solid #4b4e54;
- border-top-color: #51545a;
- border-bottom-color: #424449;
- background-color: #5c5f66;
- background-image: -webkit-linear-gradient(top, #63666e 2%, #505359 98%);
- background-image: linear-gradient(to bottom,#63666e 2%, #505359 98%);
- box-shadow: inset 0 1px 0 #787878, inset 0 -1px 0 #4e5157, 0 2px 3px rgba(0, 0, 0, 0.05);
- text-shadow: 0 -1px 0 #5c5f66; }
- .tests-valo .v-slider-color1 .v-slider-handle:before:after {
- border: inherit;
- top: -1px;
- right: -1px;
- bottom: -1px;
- left: -1px; }
- .tests-valo .v-slider-color1 .v-slider-handle:before:hover:after {
- background-color: rgba(129, 133, 141, 0.1); }
- .tests-valo .v-slider-color1 .v-slider-handle:before:focus:after {
- border: inherit;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
- .tests-valo .v-slider-color1 .v-slider-handle:before:active:after {
- background-color: rgba(44, 47, 53, 0.2); }
-.tests-valo .v-slider-color1 .v-slider-handle:after {
- border: 1px solid #4b4e54;
- border: inherit;
- box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); }
-.tests-valo .v-slider-color2 .v-slider-base {
- border-radius: 4px;
- height: 9px;
- background-color: #3a9c20;
- background-image: -webkit-linear-gradient(bottom, #3ea322 2%, #328e1b 98%);
- background-image: linear-gradient(to top,#3ea322 2%, #328e1b 98%);
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- height: 6px; }
-.tests-valo .v-slider-color2.v-slider-vertical .v-slider-base {
- background-color: #3a9c20;
- background-image: -webkit-linear-gradient(right, #3ea322 2%, #328e1b 98%);
- background-image: linear-gradient(to left,#3ea322 2%, #328e1b 98%); }
-.tests-valo .v-slider-color3 .v-slider-base:before {
- border-color: #b5b518; }
-.tests-valo .v-slider-color3 .v-slider-base:after {
- border-radius: 4px;
- height: inherit;
- background-color: #dcdc1e;
- background-image: -webkit-linear-gradient(top, #dede20 2%, #d0d019 98%);
- background-image: linear-gradient(to bottom,#dede20 2%, #d0d019 98%);
- border: 1px solid #b5b518;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- max-width: 100%; }
-.tests-valo .v-slider-color3.v-slider-vertical .v-slider-base:after {
- background-color: #dcdc1e;
- background-image: -webkit-linear-gradient(left, #dede20 2%, #d0d019 98%);
- background-image: linear-gradient(to right,#dede20 2%, #d0d019 98%); }
-.tests-valo .v-slider-no-indicator .v-slider-base:before,
-.tests-valo .v-slider-no-indicator .v-slider-base:after {
- display: none; }
-.tests-valo .v-panel-caption-color1 {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- padding: 0 12px;
- line-height: 36px;
- border-bottom: 1px solid #53565d;
- border-radius: 3px 3px 0 0;
- background-color: #5c5f66;
- background-image: -webkit-linear-gradient(top, #5d6068 2%, #595c62 98%);
- background-image: linear-gradient(to bottom,#5d6068 2%, #595c62 98%);
- color: #dedfe0;
- font-weight: 400;
- font-size: 14px;
- box-shadow: inset 0 1px 0 #727272;
- text-shadow: 0 -1px 0 #5c5f66; }
-.tests-valo .v-panel-caption-color2 {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- padding: 0 12px;
- line-height: 36px;
- border-bottom: 1px solid #37ab17;
- border-radius: 3px 3px 0 0;
- background-color: #3dbc1a;
- background-image: -webkit-linear-gradient(top, #3ebd1a 2%, #3ab818 98%);
- background-image: linear-gradient(to bottom,#3ebd1a 2%, #3ab818 98%);
- color: #daefd4;
- font-weight: 400;
- font-size: 14px;
- box-shadow: inset 0 1px 0 #50cd2d;
- text-shadow: 0 -1px 0 #3dbc1a; }
-.tests-valo .v-panel-caption-color3 {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- padding: 0 12px;
- line-height: 36px;
- border-bottom: 1px solid #e78326;
- border-radius: 3px 3px 0 0;
- background-color: #fe902a;
- background-image: -webkit-linear-gradient(top, #fe922a 2%, #fa8b28 98%);
- background-image: linear-gradient(to bottom,#fe922a 2%, #fa8b28 98%);
- color: #f6e9dd;
- font-weight: 400;
- font-size: 14px;
- box-shadow: inset 0 1px 0 #fea255;
- text-shadow: 0 -1px 0 #fe902a; }
-.tests-valo .v-splitpanel-vertical,
-.tests-valo .v-splitpanel-horizontal {
- outline: 1px dotted rgba(128, 128, 128, 0.2); }
-.tests-valo .v-slider-ticks:before {
- content: "";
- height: 15%;
- position: absolute;
- background-color: transparent;
- background-image: -webkit-linear-gradient(left, #dbdbdb 1px, transparent 1px);
- background-image: linear-gradient(to right,#dbdbdb 1px, transparent 1px);
- background-repeat: repeat-x;
- background-size: 24.9% 100%;
- left: 11px;
- right: 11px; }
-.tests-valo .v-slider-ticks.v-slider-vertical:before {
- height: auto;
- width: 15%;
- background-color: transparent;
- background-image: -webkit-linear-gradient(top, #dbdbdb 1px, transparent 1px);
- background-image: linear-gradient(to bottom,#dbdbdb 1px, transparent 1px);
- background-repeat: repeat-y;
- background-size: 100% 24.99%;
- right: auto;
- left: 0;
- top: 11px;
- bottom: 11px; }
diff --git a/WebContent/VAADIN/themes/tests-valo/styles.scss b/WebContent/VAADIN/themes/tests-valo/styles.scss
index 2c825cc245..89fc5755f4 100644
--- a/WebContent/VAADIN/themes/tests-valo/styles.scss
+++ b/WebContent/VAADIN/themes/tests-valo/styles.scss
@@ -7,8 +7,6 @@
// @import "blueprint";
-@include valo-natural-page-scrolling;
-
.tests-valo {
@include valo;
@@ -17,10 +15,6 @@
font-weight: 400;
}
- .view {
- min-height: 600px;
- }
-
$color1: hsl(220, 5%, 38%);
$color2: #5d73c0;
$color3: #3dbc1a;
@@ -104,10 +98,6 @@
@include valo-slider-indicator-style($background-color: #dcdc1e);
}
- .v-slider-no-indicator {
- @include valo-slider-no-indicator;
- }
-
.v-panel-caption-color1 {
@include valo-panel-caption-style($background-color: $color1);
@@ -130,4 +120,8 @@
.v-slider-ticks {
@include valo-slider-ticks($tick-count: 5);
}
+
+ .v-accordion-item-color1 .v-accordion-item-caption {
+ @include valo-accordion-item-caption-style($background-color: $color2);
+ }
}
diff --git a/WebContent/VAADIN/themes/valo/_valo.scss b/WebContent/VAADIN/themes/valo/_valo.scss
index 802b8cf54e..b21cf733d1 100644
--- a/WebContent/VAADIN/themes/valo/_valo.scss
+++ b/WebContent/VAADIN/themes/valo/_valo.scss
@@ -3,9 +3,9 @@
// Import all utility mixins and functions
+@import "util/bourbon/bourbon";
@import "util/lists";
@import "util/css3";
-@import "util/bourbon/bourbon";
@import "util/color";
@import "util/anim";
@import "util/gradient";
diff --git a/WebContent/VAADIN/themes/valo/components/_accordion.scss b/WebContent/VAADIN/themes/valo/components/_accordion.scss
index dbddbc3295..350c704eb4 100644
--- a/WebContent/VAADIN/themes/valo/components/_accordion.scss
+++ b/WebContent/VAADIN/themes/valo/components/_accordion.scss
@@ -1,40 +1,74 @@
-$v-accordion-content-shadow: join(inset, $v-shadow) !default;
-$v-accordion-content-shadow-opacity: $v-shadow-opacity/2 !default;
-
-
@mixin valo-accordion ($primary-stylename: v-accordion) {
.#{$primary-stylename} {
- @include valo-panel-style;
- $grad-style: valo-gradient-style($v-gradient);
- $grad-opacity: valo-gradient-opacity($v-gradient);
- @include valo-gradient($color: $v-background-color, $gradient: ($grad-style $grad-opacity/2));
- overflow: hidden;
+ @include valo-accordion-style;
}
.#{$primary-stylename}-item {
- position: relative;
- overflow: hidden;
+ @include valo-accordion-item-style;
+ }
+
+ .#{$primary-stylename}-item-caption {
+ @include valo-accordion-item-caption-style;
+ }
+
+ .#{$primary-stylename}-item-content {
+ @include valo-accordion-item-content-style;
+ }
+}
+
- @if $v-border-radius > 0 {
- $_br: $v-border-radius - first-number($v-border);
- &:first-child {
- border-radius: $_br $_br 0 0;
- .#{$primary-stylename}-item-caption {
- border-radius: inherit;
- }
+@mixin valo-accordion-style {
+ @include valo-panel-style;
+ $grad-style: valo-gradient-style($v-gradient);
+ $grad-opacity: valo-gradient-opacity($v-gradient);
+ @include valo-gradient($color: $v-background-color, $gradient: ($grad-style $grad-opacity/2));
+ overflow: hidden;
+}
+
+
+@mixin valo-accordion-item-style {
+ position: relative;
+ overflow: hidden;
+
+ @if $v-border-radius > 0 {
+ $_br: $v-border-radius - first-number($v-border);
+
+ &:first-child {
+ border-radius: $_br $_br 0 0;
+
+ .v-caption {
+ border-radius: inherit;
}
- &:last-child {
- border-radius: 0 0 $_br $_br;
+ }
+
+ &:last-child {
+ border-radius: 0 0 $_br $_br;
+
+ .v-caption {
+ border-radius: 0;
}
}
}
- .#{$primary-stylename}-item-caption .v-caption {
- @include valo-panel-caption-style;
- border-radius: inherit;
+ &:last-child:not([class*="item-open"]) .v-caption {
+ border-bottom: none;
+ }
+
+ &[class*="item-open"] + [class*="item"] {
+ border-top: valo-border($color: $v-panel-background-color, $strength: 0.7);
+ }
+}
+
+
+
+@mixin valo-accordion-item-caption-style ($background-color: null) {
+ .v-caption {
+ @include valo-panel-caption-style($background-color: $background-color or $v-background-color);
display: block;
- background: transparent;
+ @if $background-color == null {
+ background: transparent;
+ }
border-bottom-color: first-color(valo-border($color: $v-panel-background-color));
cursor: pointer;
@include user-select(none);;
@@ -60,23 +94,16 @@ $v-accordion-content-shadow-opacity: $v-shadow-opacity/2 !default;
@include valo-button-active-style;
}
}
+}
- .#{$primary-stylename}-item:last-child:not(.#{$primary-stylename}-item-open) .v-caption {
- border-bottom: none;
- }
- .#{$primary-stylename}-item-content {
- position: absolute;
- width: 100%;
- bottom: 0;
- right: 0;
- box-shadow: valo-bevel-and-shadow($shadow: $v-accordion-content-shadow, $shadow-opacity: $v-accordion-content-shadow-opacity);
- background-color: $v-panel-background-color;
- @include box-sizing(border-box);
- @include valo-panel-adjust-content-margins;
- }
-
- .#{$primary-stylename}-item-open + .#{$primary-stylename}-item {
- border-top: valo-border($color: $v-panel-background-color, $strength: 0.7);
- }
+@mixin valo-accordion-item-content-style {
+ position: absolute;
+ width: 100%;
+ bottom: 0;
+ right: 0;
+ @include box-shadow(valo-bevel-and-shadow($shadow: join(inset, $v-shadow), $shadow-opacity: $v-shadow-opacity/2));
+ background-color: $v-panel-background-color;
+ @include box-sizing(border-box);
+ @include valo-panel-adjust-content-margins;
}
diff --git a/WebContent/VAADIN/themes/valo/components/_all.scss b/WebContent/VAADIN/themes/valo/components/_all.scss
index 1509724f04..f20e8326bf 100644
--- a/WebContent/VAADIN/themes/valo/components/_all.scss
+++ b/WebContent/VAADIN/themes/valo/components/_all.scss
@@ -38,7 +38,6 @@
@import "upload";
@import "widget";
@import "window";
-@import "dragwrapper";
@mixin valo-components {
@@ -100,10 +99,6 @@
@include valo-inline-datefield;
}
- @if v-is-included(orderedlayout) {
- @include valo-orderedlayout;
- }
-
@if v-is-included(gridlayout) {
@include valo-gridlayout;
}
diff --git a/WebContent/VAADIN/themes/valo/components/_button.scss b/WebContent/VAADIN/themes/valo/components/_button.scss
index 5d61d37bd0..cea1c9fbc8 100644
--- a/WebContent/VAADIN/themes/valo/components/_button.scss
+++ b/WebContent/VAADIN/themes/valo/components/_button.scss
@@ -94,7 +94,11 @@
@if contains($states, normal) {
@if $unit-size {
height: $unit-size;
- padding: if(type-of($padding) == number, $padding, (0 round($unit-size/2.4) + round($border-radius/3)));
+ @if type-of($padding) == number or type-of($padding) == list {
+ padding: $padding;
+ } @else {
+ padding: 0 round($unit-size/2.4) + round($border-radius/3);
+ }
}
$_font-color: $font-color or valo-font-color($background-color, 0.9);
@@ -106,9 +110,9 @@
border-radius: $border-radius;
@if type-of($background-color) == color {
- @include valo-border-with-gradient($border: $border, $color: darker-of($background-color, $v-background-color), $gradient: $gradient);
+ @include valo-border-with-gradient($border: $border, $color: darkest-color($background-color, $v-background-color), $gradient: $gradient);
@include valo-gradient($background-color, $gradient);
- box-shadow: valo-bevel-and-shadow($bevel: $bevel, $shadow: $shadow, $background-color: $background-color, $gradient: $gradient);
+ @include box-shadow(valo-bevel-and-shadow($bevel: $bevel, $shadow: $shadow, $background-color: $background-color, $gradient: $gradient));
}
@if $bevel and type-of($_font-color) == color and type-of($background-color) == color {
@@ -116,7 +120,7 @@
}
@if $bevel == none and $shadow == none {
- box-shadow: none;
+ @include box-shadow(none);
}
}
@@ -155,7 +159,7 @@
@mixin valo-button-focus-style ($background-color: $v-background-color, $border-fallback: inherit, $include-box-shadow: true) {
- $focus-color: valo-focus-color();
+ $focus-color: $v-focus-color;
@if color-luminance($focus-color) + 50 < color-luminance($background-color) {
border-color: $focus-color;
@@ -200,11 +204,43 @@
-@mixin valo-button-borderless-style {
+@mixin valo-button-borderless-style ($font-color: inherit) {
border: none;
- box-shadow: none;
+ @include box-shadow(none);
background: transparent;
- color: inherit;
+ color: $font-color;
+
+ &:hover {
+ &:after {
+ background: transparent;
+ }
+
+ @if type-of($font-color) == color {
+ color: lighten($font-color, 10%);
+ }
+ }
+
+ &:active {
+ @include opacity(.7);
+
+ &:after {
+ background: transparent;
+ }
+ }
+}
+
+
+@mixin valo-button-quiet-style ($primary-stylename: v-button) {
+ visibility: hidden;
+
+ &:focus,
+ &:hover {
+ visibility: visible;
+ }
+
+ .#{$primary-stylename}-wrap {
+ visibility: visible;
+ }
}
@@ -223,3 +259,23 @@
}
}
}
+
+
+@mixin valo-button-icon-align-top-style ($primary-stylename: v-button) {
+ height: auto;
+ padding-top: ceil($v-unit-size/9);
+ padding-bottom: ceil($v-unit-size/9);
+
+ .#{$primary-stylename}-wrap {
+ display: inline-block;
+ }
+
+ .v-icon {
+ display: block;
+
+ + span:not(:empty) {
+ margin-top: ceil($v-unit-size/6);
+ margin-left: 0;
+ }
+ }
+}
diff --git a/WebContent/VAADIN/themes/valo/components/_calendar.scss b/WebContent/VAADIN/themes/valo/components/_calendar.scss
index c6c689d8d8..753291eea9 100644
--- a/WebContent/VAADIN/themes/valo/components/_calendar.scss
+++ b/WebContent/VAADIN/themes/valo/components/_calendar.scss
@@ -1,4 +1,4 @@
-$v-calendar-event-colors: dodgerblue, seagreen, darkgoldenrod, firebrick, slateblue !default;
+$v-calendar-event-colors: #00ace0, #2d9f19, #d18100, #ce3812, #2d55cd !default;
@mixin valo-calendar-global ($primary-stylename: v-calendar) {
@@ -205,7 +205,7 @@ $v-calendar-event-colors: dodgerblue, seagreen, darkgoldenrod, firebrick, slateb
cursor: pointer;
&:hover {
- color: valo-focus-color();
+ color: $v-focus-color;
}
}
@@ -219,17 +219,17 @@ $v-calendar-event-colors: dodgerblue, seagreen, darkgoldenrod, firebrick, slateb
cursor: pointer;
&:hover {
- color: valo-focus-color();
+ color: $v-focus-color;
}
}
.#{$primary-stylename}-month-day-today {
- background: blend-normal(rgba(valo-focus-color(), .05), $v-background-color);
+ background: blend-normal(rgba($v-focus-color, .05), $v-background-color);
.#{$primary-stylename}-day-number {
font-weight: $v-font-weight + 100;
- color: valo-focus-color();
- border-top: 2px solid valo-focus-color();
+ color: $v-focus-color;
+ border-top: 2px solid $v-focus-color;
line-height: round($v-unit-size/1.5) - 1px;
margin: 0;
padding: 0 round($v-unit-size/8);
@@ -275,10 +275,6 @@ $v-calendar-event-colors: dodgerblue, seagreen, darkgoldenrod, firebrick, slateb
.#{$primary-stylename}-header-week td {
vertical-align: middle !important;
-
- //&:first-child {
- // width: round($v-unit-size*1.5);
- //}
}
.#{$primary-stylename}-header-week .#{$primary-stylename}-header-day {
@@ -302,8 +298,6 @@ $v-calendar-event-colors: dodgerblue, seagreen, darkgoldenrod, firebrick, slateb
.#{$primary-stylename}-day-times,
.#{$primary-stylename}-day-times-today {
outline: none;
- //@include box-sizing(border-box);
- //padding: 0 round($v-unit-size/8);
border-right: 1px solid transparent;
&:focus {
@@ -311,7 +305,7 @@ $v-calendar-event-colors: dodgerblue, seagreen, darkgoldenrod, firebrick, slateb
}
}
- $valo-calendar-time-divider-color: darken($v-background-color, 5%);
+ $valo-calendar-time-divider-color: first-color(valo-border($color: $v-app-background-color, $strength: 0.5));
.#{$primary-stylename} .v-datecellslot,
.#{$primary-stylename} .v-datecellslot-even {
@@ -332,14 +326,14 @@ $v-calendar-event-colors: dodgerblue, seagreen, darkgoldenrod, firebrick, slateb
}
.#{$primary-stylename}-current-time {
- background: valo-focus-color();
+ background: $v-focus-color;
line-height: 1px;
pointer-events: none;
@include opacity(.5);
&:before {
content: "\2022";
- color: valo-focus-color();
+ color: $v-focus-color;
font-size: 22px;
margin-left: -0.07em;
}
@@ -472,7 +466,6 @@ $v-calendar-event-colors: dodgerblue, seagreen, darkgoldenrod, firebrick, slateb
// Event is being dragged
&[style*=" left:"] .#{$primary-stylename}-event-content {
- //box-shadow: valo-shadow();
}
}
@@ -486,7 +479,6 @@ $v-calendar-event-colors: dodgerblue, seagreen, darkgoldenrod, firebrick, slateb
border: 1px solid $v-app-background-color;
padding-top: 3px;
margin-right: round($v-unit-size/8);
- //margin-left: round($v-unit-size/8);
}
diff --git a/WebContent/VAADIN/themes/valo/components/_checkbox.scss b/WebContent/VAADIN/themes/valo/components/_checkbox.scss
index 619e799bc7..0ee703c372 100644
--- a/WebContent/VAADIN/themes/valo/components/_checkbox.scss
+++ b/WebContent/VAADIN/themes/valo/components/_checkbox.scss
@@ -1,7 +1,6 @@
@mixin valo-checkbox ($primary-stylename: v-checkbox) {
- .#{$primary-stylename},
- .v-radiobutton {
+ .#{$primary-stylename} {
@include valo-checkbox-style;
}
@@ -14,10 +13,10 @@
}
-@mixin valo-checkbox-style ($background-color: $v-background-color, $size: $v-unit-size, $selection-color: $v-selection-color) {
+@mixin valo-checkbox-style ($background-color: $v-background-color, $unit-size: $v-unit-size, $selection-color: $v-selection-color) {
// So that we can use the same 'unit-size' for all component sizes
- $size: $size/2;
+ $size: $unit-size/2;
position: relative;
line-height: round($size);
@@ -45,7 +44,7 @@
&:focus ~ label:before {
@include valo-button-focus-style($background-color: $background-color, $border-fallback: null, $include-box-shadow: false);
- box-shadow: valo-bevel-and-shadow($background-color: $background-color, $bevel: $v-bevel, $shadow: $v-shadow, $gradient: $v-gradient, $include-focus: true);
+ @include box-shadow(valo-bevel-and-shadow($background-color: $background-color, $bevel: $v-bevel, $shadow: $v-shadow, $gradient: $v-gradient, $include-focus: true));
}
& ~ label:before,
diff --git a/WebContent/VAADIN/themes/valo/components/_colorpicker.scss b/WebContent/VAADIN/themes/valo/components/_colorpicker.scss
index a8a5dde076..4509c23f15 100644
--- a/WebContent/VAADIN/themes/valo/components/_colorpicker.scss
+++ b/WebContent/VAADIN/themes/valo/components/_colorpicker.scss
@@ -1,7 +1,7 @@
@mixin valo-colorpicker-global ($primary-stylename: v-colorpicker) {
$valo-colorpicker-pathPrefix: null;
@if $v-relative-paths == false {
- $valo-colorpicker-pathPrefix: "../valo/components/img/colorpicker/";
+ $valo-colorpicker-pathPrefix: "../valo/components/";
}
.#{$primary-stylename}-popup.v-window {
@@ -17,11 +17,11 @@
}
.rgb-gradient .#{$primary-stylename}-gradient-background {
- background: url(#{$valo-colorpicker-pathPrefix}gradient2.png);
+ background: url(#{$valo-colorpicker-pathPrefix}img/colorpicker/gradient2.png);
}
.hsv-gradient .#{$primary-stylename}-gradient-foreground {
- background: url(#{$valo-colorpicker-pathPrefix}gradient.png);
+ background: url(#{$valo-colorpicker-pathPrefix}img/colorpicker/gradient.png);
}
.#{$primary-stylename}-gradient-higherbox {
@@ -31,7 +31,7 @@
height: 11px;
border-radius: 7px;
border: 1px solid #fff;
- box-shadow: 0 0 0 1px rgba(0,0,0,.3), inset 0 0 0 1px rgba(0,0,0,.3);
+ @include box-shadow(0 0 0 1px rgba(0,0,0,.3), inset 0 0 0 1px rgba(0,0,0,.3));
position: absolute;
bottom: -6px;
left: -6px;
@@ -51,7 +51,7 @@
}
.#{$primary-stylename}-popup .v-slider.hue-slider:before {
- background: url(#{$valo-colorpicker-pathPrefix}slider_hue_bg.png);
+ background: url(#{$valo-colorpicker-pathPrefix}img/colorpicker/slider_hue_bg.png);
}
.#{$primary-stylename}-popup input.v-textfield-dark {
@@ -123,19 +123,19 @@
.v-slider-red .v-slider-base:after {
background: red;
border: none;
- box-shadow: none;
+ @include box-shadow(none);
}
.v-slider-green .v-slider-base:after {
background: green;
border: none;
- box-shadow: none;
+ @include box-shadow(none);
}
.v-slider-blue .v-slider-base:after {
background: blue;
border: none;
- box-shadow: none;
+ @include box-shadow(none);
}
.v-margin-bottom {
diff --git a/WebContent/VAADIN/themes/valo/components/_combobox.scss b/WebContent/VAADIN/themes/valo/components/_combobox.scss
index 976dd7e1d4..51ec65e55f 100644
--- a/WebContent/VAADIN/themes/valo/components/_combobox.scss
+++ b/WebContent/VAADIN/themes/valo/components/_combobox.scss
@@ -12,25 +12,38 @@
}
}
+ .#{$primary-stylename}-error {
+ .#{$primary-stylename}-input {
+ @include valo-textfield-error-style;
+ }
+
+ .#{$primary-stylename}-button {
+ color: $v-error-indicator-color;
+ border-color: $v-error-indicator-color;
+ }
+ }
+
.#{$primary-stylename}-suggestpopup {
- @include valo-combobox-popup-style;
+ @include valo-combobox-popup-style($primary-stylename: $primary-stylename);
}
.#{$primary-stylename}-no-input {
cursor: pointer;
text-shadow: valo-text-shadow();
+ @if $v-border-radius != $v-textfield-border-radius {
+ border-radius: $v-border-radius;
+ }
+
.#{$primary-stylename}-input {
@include user-select(none);
@include valo-gradient;
cursor: inherit;
- box-shadow: valo-bevel-and-shadow($bevel: $v-bevel, $shadow: $v-shadow, $gradient: $v-gradient);
+ @include box-shadow(valo-bevel-and-shadow($bevel: $v-bevel, $shadow: $v-shadow, $gradient: $v-gradient));
@include valo-border-with-gradient($border: $v-border, $color: $v-background-color, $gradient: $v-gradient);
text-shadow: inherit;
text-overflow: ellipsis;
- @if $v-border-radius != $v-textfield-border-radius {
- border-radius: $v-border-radius;
- }
+ border-radius: inherit;
&:focus {
@include valo-textfield-focus-style($bevel: $v-bevel, $shadow: $v-shadow, $gradient: $v-gradient, $background-color: $v-background-color);
@@ -104,6 +117,8 @@
span.v-icon {
color: valo-font-color($background-color);
width: $unit-size;
+ line-height: 1;
+ padding-top: .12em;
}
&.#{$primary-stylename}-prompt > .#{$primary-stylename}-input {
@@ -143,17 +158,6 @@
-
-@include keyframes(valo-combobox-show-status) {
- 0% {
- opacity: 0;
- @include transform( translatey(-100%) );
- }
-}
-
-
-
-
@mixin valo-combobox-input-style (
$unit-size: $v-unit-size,
$padding: null, // Computed by default
@@ -203,10 +207,14 @@
bottom: $border-width;
width: $unit-size;
cursor: pointer;
- border-left: valo-border($color: $background-color, $border: $v-textfield-border, $strength: 0.5);
- .v-ie8 & {
- background-color: $background-color;
+ @if type-of($background-color) == color {
+ border-left: valo-border($color: $background-color, $border: $v-textfield-border, $strength: 0.5);
+ color: mix($background-color, valo-font-color($background-color));
+
+ .v-ie8 & {
+ background-color: $background-color;
+ }
}
@if $v-border-radius > 0 {
@@ -215,8 +223,8 @@
}
&:before {
- @include valo-combobox-button-icon-style($background-color);
- color: mix($background-color, valo-font-color($background-color));
+ @include valo-combobox-button-icon-style;
+
@if $v-animations-enabled {
@include transition(color 140ms);
}
@@ -228,7 +236,7 @@
margin-top: -.47em;
}
- @if $v-hover-styles-enabled {
+ @if $v-hover-styles-enabled and type-of($background-color) == color {
&:hover:before {
color: valo-font-color($background-color);
}
@@ -242,25 +250,36 @@
bottom: 0;
left: 0;
border-radius: inherit;
- @include valo-button-active-style($background-color);
+ @if type-of($background-color) == color {
+ @include valo-button-active-style($background-color);
+ }
}
}
-@mixin valo-combobox-button-icon-style ($background-color) {
+@mixin valo-combobox-button-icon-style {
font-family: FontAwesome;
content: "\f078";
- color: valo-font-color($background-color);
}
-@mixin valo-combobox-popup-style {
+@mixin valo-combobox-popup-style ($primary-stylename: v-filterselect) {
+
+ @if $v-animations-enabled {
+ @if $v-overlay-animate-in {
+ &[class*="animate-in"] {
+ @include animation($v-overlay-animate-in);
+ }
+ }
+ // No animate-out since that will currently prevent the dropdown from
+ // closing when the user selects an item
+ }
- .v-filterselect-suggestmenu {
- @include valo-selection-overlay-style;
+ .#{$primary-stylename}-suggestmenu {
+ @include valo-selection-overlay-style($animate-in: false, $animate-out: false);
box-sizing: border-box;
position: relative;
z-index: 1;
@@ -283,7 +302,7 @@
@include valo-selection-item-selected-style;
}
- .v-filterselect-status {
+ .#{$primary-stylename}-status {
position: absolute;
right: $v-border-radius;
$bg: scale-color($v-background-color, $lightness: -15%);
@@ -299,7 +318,7 @@
pointer-events: none;
@if $v-animations-enabled {
- @include animation(valo-combobox-show-status 200ms 80ms backwards);
+ @include animation(valo-anim-slide-in-down 200ms 80ms backwards);
}
> * {
diff --git a/WebContent/VAADIN/themes/valo/components/_datefield.scss b/WebContent/VAADIN/themes/valo/components/_datefield.scss
index eafd1c0428..b1f3a78af6 100644
--- a/WebContent/VAADIN/themes/valo/components/_datefield.scss
+++ b/WebContent/VAADIN/themes/valo/components/_datefield.scss
@@ -6,6 +6,17 @@
@include valo-datefield-style($primary-stylename: $primary-stylename);
}
+ .#{$primary-stylename}-error {
+ .#{$primary-stylename}-textfield {
+ @include valo-textfield-error-style;
+ }
+
+ .#{$primary-stylename}-button {
+ color: $v-error-indicator-color;
+ border-color: $v-error-indicator-color;
+ }
+ }
+
// Different widths for different resolutions
.#{$primary-stylename}-full {
width: round($v-font-size * 15);
@@ -73,7 +84,7 @@
}
.#{$primary-stylename}-button {
- @include valo-datefield-button-style($unit-size: $unit-size, $bevel: $bevel, $background-color: $background-color, $border-radius: $border-radius);
+ @include valo-datefield-button-style($unit-size: $unit-size, $bevel: $bevel, $background-color: $background-color, $border-radius: $border-radius, $border: $border);
}
&.v-disabled {
@@ -106,12 +117,15 @@
-@mixin valo-datefield-button-style ($unit-size: $v-unit-size, $bevel: $v-bevel, $background-color: $v-textfield-background-color, $border-radius: $v-border-radius) {
- $border-width: first-number($v-textfield-border);
+@mixin valo-datefield-button-style ($unit-size: $v-unit-size, $bevel: $v-bevel, $background-color: $v-textfield-background-color, $border-radius: $v-border-radius, $border: $v-textfield-border) {
+ $border-width: first-number($border) or first-number($v-textfield-border);
@include valo-tappable;
-webkit-appearance: none;
background: transparent;
- border: none;
+ @if $border {
+ // Only override border if we are actually setting some border
+ border: none;
+ }
padding: 0;
position: absolute;
z-index: 10;
@@ -123,27 +137,30 @@
text-align: center;
cursor: pointer;
font: inherit;
- border-right: valo-border($color: $background-color, $border: $v-textfield-border, $strength: 0.5);
outline: none;
margin: 0;
+ @if type-of($background-color) == color {
+ border-right: valo-border($color: $background-color, $border: $v-textfield-border, $strength: 0.5);
+ color: mix($background-color, valo-font-color($background-color));
+
+ &:hover {
+ color: valo-font-color($background-color);
+ }
+ }
+
@if $border-radius > 0 {
$br: max(0, $border-radius - $border-width);
border-radius: $br 0 0 $br;
}
&:before {
- @include valo-datefield-button-icon-style($background-color);
- color: mix($background-color, valo-font-color($background-color));
+ @include valo-datefield-button-icon-style;
@if $v-animations-enabled {
@include transition(color 140ms);
}
}
- &:hover:before {
- color: valo-font-color($background-color);
- }
-
&:active:after {
content: "";
position: absolute;
@@ -151,7 +168,9 @@
right: 0;
bottom: 0;
left: 0;
- @include valo-button-active-style($background-color);
+ @if type-of($background-color) == color {
+ @include valo-button-active-style($background-color);
+ }
border-radius: inherit;
}
}
@@ -159,10 +178,9 @@
-@mixin valo-datefield-button-icon-style ($background-color) {
+@mixin valo-datefield-button-icon-style {
font-family: FontAwesome;
content: "\f073";
- color: valo-font-color($background-color);
}
@@ -274,7 +292,7 @@
&:hover {
@include opacity(1);
&:before {
- color: valo-link-font-color();
+ color: $v-focus-color;
}
}
}
diff --git a/WebContent/VAADIN/themes/valo/components/_dragwrapper.scss b/WebContent/VAADIN/themes/valo/components/_dragwrapper.scss
index 3bc5e21f8d..7f1be69553 100644
--- a/WebContent/VAADIN/themes/valo/components/_dragwrapper.scss
+++ b/WebContent/VAADIN/themes/valo/components/_dragwrapper.scss
@@ -6,9 +6,8 @@
@include user-select(none);
}
- .v-active-drag-source {
- // Can't hide since it will hide Tables and Trees as well
- //@include opacity(0);
+ .#{$primary-stylename}.v-active-drag-source {
+ visibility: hidden;
}
.#{$primary-stylename} {
@@ -24,6 +23,7 @@
right: -1px;
bottom: -1px;
left: -1px;
+ border: 0 solid $v-focus-color;
}
.#{$primary-stylename}-over-top:before {
@@ -110,7 +110,7 @@
border-radius: $v-border-radius;
@include opacity(.3);
- $focus-color: valo-focus-color();
+ $focus-color: $v-focus-color;
@if is-dark-color($focus-color) {
background: scale-color($focus-color, $lightness: 50%);
} @else {
diff --git a/WebContent/VAADIN/themes/valo/components/_formlayout.scss b/WebContent/VAADIN/themes/valo/components/_formlayout.scss
index ceaa732f3f..33191e4a20 100644
--- a/WebContent/VAADIN/themes/valo/components/_formlayout.scss
+++ b/WebContent/VAADIN/themes/valo/components/_formlayout.scss
@@ -25,6 +25,12 @@
.v-caption {
padding-bottom: 0;
}
+
+ .v-caption-h2,
+ .v-caption-h3,
+ .v-caption-h4 {
+ height: 3em;
+ }
}
.#{$primary-stylename}-contentcell {
@@ -33,13 +39,14 @@
font-weight: $v-font-weight + 100;
}
- > .h4 {
+ > .v-label-h2,
+ > .v-label-h3,
+ > .v-label-h4 {
position: absolute;
left: 0;
margin-top: -0.5em;
padding-bottom: 0.5em;
border-bottom: valo-border($color: $v-app-background-color, $strength: 0.5);
- color: valo-font-color($v-app-background-color, .5);
}
}
@@ -138,7 +145,8 @@
> .v-textfield,
> .v-textarea,
> .v-filterselect input,
- > .v-datefield input {
+ > .v-datefield input,
+ > .v-richtextarea {
@include valo-textfield-style($unit-size: $row-height, $border-radius: 0, $border: null, $bevel: none, $shadow: none, $background-color: null);
background: transparent;
border: none;
@@ -152,7 +160,8 @@
@include valo-textfield-prompt-style;
}
- > .v-textarea {
+ > .v-textarea,
+ > .v-richtextarea {
height: auto;
}
}
@@ -179,9 +188,17 @@
margin-left: ceil($v-unit-size/6);
}
- > table > tbody > .#{$primary-stylename}-row > .#{$primary-stylename}-contentcell > .h4 {
- border-bottom: none;
- color: $v-selection-color;
- margin-top: -0.2em;
+ > table > tbody > .#{$primary-stylename}-row > .#{$primary-stylename}-contentcell {
+ > .v-label-h2,
+ > .v-label-h3,
+ > .v-label-h4 {
+ border-bottom: none;
+ color: $v-selection-color;
+ }
+
+ > .v-label-h3,
+ > .v-label-h4 {
+ margin-top: 0;
+ }
}
}
diff --git a/WebContent/VAADIN/themes/valo/components/_gridlayout.scss b/WebContent/VAADIN/themes/valo/components/_gridlayout.scss
index c8c67b363c..738b86c9e2 100644
--- a/WebContent/VAADIN/themes/valo/components/_gridlayout.scss
+++ b/WebContent/VAADIN/themes/valo/components/_gridlayout.scss
@@ -1,7 +1,6 @@
@mixin valo-gridlayout-global ($primary-stylename: v-gridlayout) {
.#{$primary-stylename} {
position: relative;
- line-height: 0;
}
.#{$primary-stylename}-slot {
position: absolute;
diff --git a/WebContent/VAADIN/themes/valo/components/_label.scss b/WebContent/VAADIN/themes/valo/components/_label.scss
index b254f097c5..502b640809 100644
--- a/WebContent/VAADIN/themes/valo/components/_label.scss
+++ b/WebContent/VAADIN/themes/valo/components/_label.scss
@@ -24,15 +24,15 @@ $v-letter-spacing--h4: 0 !default;
white-space: nowrap;
}
- h1, .h1,
- h2, .h2,
- h3, .h3 {
+ h1, .#{$primary-stylename}-h1,
+ h2, .#{$primary-stylename}-h2,
+ h3, .#{$primary-stylename}-h3 {
line-height: $v-line-height--header;
font-weight: $v-font-weight--header;
color: valo-header-color($v-app-background-color);
}
- h1, .h1 {
+ h1, .#{$primary-stylename}-h1 {
font-size: $v-font-size--h1;
margin-top: 1.4em;
margin-bottom: 1em;
@@ -40,7 +40,7 @@ $v-letter-spacing--h4: 0 !default;
letter-spacing: $v-letter-spacing--h1;
}
- h2, .h2 {
+ h2, .#{$primary-stylename}-h2 {
font-size: $v-font-size--h2;
font-family: $v-font-family--h2;
margin-top: 1.6em;
@@ -48,7 +48,7 @@ $v-letter-spacing--h4: 0 !default;
letter-spacing: $v-letter-spacing--h2;
}
- h3, .h3 {
+ h3, .#{$primary-stylename}-h3 {
font-size: $v-font-size--h3;
font-family: $v-font-family--h3;
margin-top: 1.8em;
@@ -56,7 +56,7 @@ $v-letter-spacing--h4: 0 !default;
letter-spacing: $v-letter-spacing--h3;
}
- h4, .h4 {
+ h4, .#{$primary-stylename}-h4 {
line-height: $v-line-height--header;
font-weight: $v-font-weight + 200;
font-size: $v-font-size--small;
@@ -72,10 +72,10 @@ $v-letter-spacing--h4: 0 !default;
> h2,
> h3,
> h4
- > .h1,
- > .h2,
- > .h3
- > .h4 {
+ > .#{$primary-stylename}-h1,
+ > .#{$primary-stylename}-h2,
+ > .#{$primary-stylename}-h3
+ > .#{$primary-stylename}-h4 {
&:first-child {
margin-top: $v-font-size;
}
@@ -84,18 +84,18 @@ $v-letter-spacing--h4: 0 !default;
.v-verticallayout > .v-slot:first-child,
.v-verticallayout > div > .v-slot:first-child {
- h1, .h1,
- h2, .h2,
- h3, .h3
- h4, .h4 {
+ h1, .#{$primary-stylename}-h1,
+ h2, .#{$primary-stylename}-h2,
+ h3, .#{$primary-stylename}-h3
+ h4, .#{$primary-stylename}-h4 {
margin-top: $v-font-size;
}
}
- h1, .h1,
- h2, .h2,
- h3, .h3,
- h4, .h4 {
+ h1, .#{$primary-stylename}-h1,
+ h2, .#{$primary-stylename}-h2,
+ h3, .#{$primary-stylename}-h3,
+ h4, .#{$primary-stylename}-h4 {
&.no-margin {
margin: 0 !important;
}
@@ -120,4 +120,12 @@ $v-letter-spacing--h4: 0 !default;
}
}
+ .#{$primary-stylename}-align-right {
+ text-align: right;
+ }
+
+ .#{$primary-stylename}-align-center {
+ text-align: center;
+ }
+
}
diff --git a/WebContent/VAADIN/themes/valo/components/_link.scss b/WebContent/VAADIN/themes/valo/components/_link.scss
index 73e2cb114a..129ffcca2f 100644
--- a/WebContent/VAADIN/themes/valo/components/_link.scss
+++ b/WebContent/VAADIN/themes/valo/components/_link.scss
@@ -1,4 +1,4 @@
-$v-link-font-color: null !default;
+$v-link-font-color: $v-focus-color !default;
$v-link-text-decoration: underline !default;
$v-link-cursor: pointer !default;
@@ -25,7 +25,7 @@ $v-link-cursor: pointer !default;
@mixin valo-link-style {
cursor: $v-link-cursor;
- color: valo-link-font-color();
+ color: $v-link-font-color;
text-decoration: $v-link-text-decoration;
font-weight: inherit;
@@ -34,13 +34,6 @@ $v-link-cursor: pointer !default;
}
&:hover {
- color: lighten(valo-link-font-color(), 10%);
+ color: lighten($v-link-font-color, 10%);
}
}
-
-
-
-@function valo-link-font-color ($color: null, $context: null) {
- $link-color: $color or $v-link-font-color or valo-focus-color($color: $color, $context: $context);
- @return $link-color;
-} \ No newline at end of file
diff --git a/WebContent/VAADIN/themes/valo/components/_menubar.scss b/WebContent/VAADIN/themes/valo/components/_menubar.scss
index d8d48d7f8c..75b93b646f 100644
--- a/WebContent/VAADIN/themes/valo/components/_menubar.scss
+++ b/WebContent/VAADIN/themes/valo/components/_menubar.scss
@@ -13,7 +13,7 @@
@if type-of($v-focus-style) == list {
$box-shadow: $box-shadow, $v-focus-style;
}
- box-shadow: $box-shadow;
+ @include box-shadow($box-shadow);
}
&.v-disabled {
@@ -64,6 +64,10 @@
.#{$primary-stylename}-popup {
@include valo-menubar-popup-style($primary-stylename);
+
+ &.#{$primary-stylename}-popup-animate-out {
+ @include animation(none);
+ }
}
}
@@ -77,13 +81,14 @@
z-index: 1;
display: inline-block;
@include box-sizing(border-box);
- @include valo-button-style($border-radius: 0, $shadow: null, $font-color: inherit, $cursor: pointer);
+ @include valo-button-style($states: normal, $border-radius: 0, $shadow: null, $font-color: inherit, $cursor: pointer);
background: transparent;
border-width: 0 $border-width 0 0;
height: 100%;
vertical-align: top;
line-height: $v-unit-size - $border-width*2 - 1px;
text-align: center;
+
@if $border-width == 0 {
margin-right: 1px;
}
@@ -115,9 +120,16 @@
border-radius: inherit;
}
- &:hover:before {
- @include valo-button-hover-style;
- border: none;
+ @if $v-hover-styles-enabled {
+ &:hover {
+ // IE needs some nudging to show the :before element
+ zoom: 1;
+
+ &:before {
+ @include valo-button-hover-style;
+ border: none;
+ }
+ }
}
&:active:before {
@@ -144,11 +156,7 @@
-@mixin valo-menubar-popup-style ($primary-stylename: v-menubar, $context: $v-background-color) {
-
- $copy: $v-background-color;
- $v-background-color: $context;
-
+@mixin valo-menubar-popup-style ($primary-stylename: v-menubar) {
@include valo-selection-overlay-style;
margin: ceil($v-unit-size/8) 0 0 1px !important;
@@ -203,8 +211,6 @@
[class*="disabled"] {
cursor: default;
}
-
- $v-background-color: $copy;
}
@@ -223,7 +229,7 @@
@mixin valo-menubar-menuitem-checked-style ($background-color: if(color-luminance($v-background-color) < 10, scale-color($v-background-color, $lightness: 10%, $saturation: -5%), scale-color($v-background-color, $lightness: -5%, $saturation: -5%))) {
$grad: valo-gradient-style($v-gradient) valo-gradient-opacity($v-gradient)/4;
- box-shadow: none;
+ @include box-shadow(none);
@include valo-gradient($color: $background-color, $gradient: $grad, $direction: to top);
color: valo-font-color($background-color, 0.9);
}
@@ -241,6 +247,7 @@
.#{$primary-stylename}-menuitem {
line-height: $unit-size - first-number($v-border)*2;
+ padding: 0 round($unit-size/2.5);
&[class*="-icon-only"] {
width: $unit-size;
@@ -250,22 +257,25 @@
@mixin valo-menubar-borderless-style ($primary-stylename: v-menubar) {
border: none;
+ border-radius: 0;
padding: first-number($v-border);
- box-shadow: none;
+ @include box-shadow(none);
background: transparent;
color: inherit;
- &:focus:not(.v-disabled) {
+ &:not(.v-disabled):focus {
border: none;
- box-shadow: none;
+ @include box-shadow(none);
}
.#{$primary-stylename}-menuitem {
- box-shadow: none;
+ @include box-shadow(none);
border: none;
margin-right: max(1px, first-number($v-border));
border-radius: $v-border-radius;
- text-shadow: valo-text-shadow($offset: -1px);
+ color: $v-selection-color;
+ text-shadow: valo-text-shadow($font-color: $v-selection-color, $offset: -1px);
+ padding: 0 round($v-unit-size/3);
@if $v-animations-enabled {
@include transition(color 140ms);
@@ -273,30 +283,36 @@
&:first-child,
&:last-child {
- border-radius: inherit;
+ border-radius: $v-border-radius;
}
- &:hover:before {
- display: none;
+ &:before {
+ content: none;
}
- &:active:not(.#{$primary-stylename}-menuitem-disabled):before {
- display: block;
+ &:hover {
+ color: lighten($v-selection-color, 10%);
}
- &:hover {
- color: $v-focus-color;
+ &:active {
+ color: inherit;
}
}
- .#{$primary-stylename}-menuitem-checked {
+ .#{$primary-stylename}-menuitem-checked,
+ .#{$primary-stylename}-menuitem-checked:first-child {
border: valo-border();
- line-height: $v-unit-size - first-number($v-border)*4 - 1px;
color: $v-selection-color;
+
+ .#{$primary-stylename}-menuitem-caption {
+ position: relative;
+ top: first-number($v-border)*-1;
+ }
}
.#{$primary-stylename}-menuitem-selected {
$font-color: valo-font-color($v-selection-color, 0.9);
+ color: $font-color;
text-shadow: valo-text-shadow($background-color: $v-selection-color, $font-color: $font-color);
&:hover {
@@ -304,6 +320,7 @@
}
}
+ .#{$primary-stylename}-menuitem-disabled,
.#{$primary-stylename}-menuitem-disabled:hover {
color: inherit;
}
diff --git a/WebContent/VAADIN/themes/valo/components/_optiongroup.scss b/WebContent/VAADIN/themes/valo/components/_optiongroup.scss
index bd6029700e..71c67cd9d8 100644
--- a/WebContent/VAADIN/themes/valo/components/_optiongroup.scss
+++ b/WebContent/VAADIN/themes/valo/components/_optiongroup.scss
@@ -1,47 +1,68 @@
@mixin valo-optiongroup ($primary-stylename: v-optiongroup) {
.v-radiobutton {
- :root & > input {
- &:checked ~ label:after {
- $size: ceil($v-unit-size/6);
- $offset: round($v-unit-size/6);
- width: $size;
- height: $size;
- top: $offset;
- left: $offset;
- background: $v-selection-color;
- }
-
- & ~ label:before,
- & ~ label:after {
- border-radius: 50%;
- content: "";
- }
- }
+ @include valo-radiobutton-style;
}
.v-select-optiongroup {
+ @include valo-optiongroup-style;
+ }
- .v-radiobutton,
- .v-checkbox {
- display: block;
- margin: round($v-unit-size/4) $v-font-size 0 0;
+}
+
+
+@mixin valo-radiobutton-style ($background-color: $v-background-color, $unit-size: $v-unit-size, $selection-color: $v-selection-color) {
+ @include valo-checkbox-style($background-color: $background-color, $unit-size: $unit-size, $selection-color: $selection-color);
+
+ :root & > input {
+ &:checked ~ label:after {
+ $size: ceil($unit-size/6);
+ $offset: round($unit-size/6);
+ width: $size;
+ height: $size;
+ top: $offset;
+ left: $offset;
+ background: $selection-color;
+ }
+
+ & ~ label:before,
+ & ~ label:after {
+ border-radius: 50%;
+ content: "";
+ }
+ }
+}
- &:first-child {
- margin-top: round($v-unit-size/6);
- }
- &:last-child {
- margin-bottom: round($v-unit-size/6);
- }
+
+@mixin valo-optiongroup-style ($unit-size: $v-unit-size, $font-size: $v-font-size) {
+
+ @if $unit-size != $v-unit-size {
+ .v-checkbox {
+ @include valo-checkbox-style($unit-size: $unit-size);
}
+ .v-radiobutton {
+ @include valo-radiobutton-style($unit-size: $unit-size);
+ }
+ }
+
+ .v-radiobutton,
+ .v-checkbox {
+ display: block;
+ margin: round($unit-size/4) $font-size 0 0;
- &.v-has-width label {
- white-space: normal;
+ &:first-child {
+ margin-top: round($unit-size/6);
}
+ &:last-child {
+ margin-bottom: round($unit-size/6);
+ }
}
+ &.v-has-width label {
+ white-space: normal;
+ }
}
@@ -55,7 +76,7 @@
&.v-has-width {
white-space: normal;
-
+
label {
white-space: nowrap;
}
diff --git a/WebContent/VAADIN/themes/valo/components/_orderedlayout.scss b/WebContent/VAADIN/themes/valo/components/_orderedlayout.scss
index ddaa5c363e..1173ca3dbe 100644
--- a/WebContent/VAADIN/themes/valo/components/_orderedlayout.scss
+++ b/WebContent/VAADIN/themes/valo/components/_orderedlayout.scss
@@ -9,17 +9,13 @@
@include box-sizing(border-box);
width: 100%;
height: 100%;
-
- // TODO fixes extra white space issues in some cases (can't remember what anymore), but causes some styles to clip
- //overflow: hidden;
}
.v-slot,
.v-spacing {
display: inline-block;
- white-space: normal;
+ white-space: nowrap;
vertical-align: top;
- line-height: 0;
}
// Clear any floats inside the slot, to prevent unwanted collapsing
@@ -44,14 +40,14 @@
.v-vertical > .v-spacing,
.v-vertical > .v-expand > .v-spacing {
- width: 0;
+ width: 0 !important;
display: block;
clear: both;
}
.v-horizontal > .v-spacing,
.v-horizontal > .v-expand > .v-spacing {
- height: 0;
+ height: 0 !important;
}
.v-align-middle:before,
@@ -63,7 +59,6 @@
height: 100%;
vertical-align: middle;
width: 0;
- overflow: hidden;
}
.v-align-middle,
@@ -76,12 +71,12 @@
display: inline-block;
}
- //.v-align-middle,
+ .v-align-middle,
.v-align-middle > .v-widget {
vertical-align: middle;
}
- //.v-align-bottom,
+ .v-align-bottom,
.v-align-bottom > .v-widget {
vertical-align: bottom;
}
diff --git a/WebContent/VAADIN/themes/valo/components/_panel.scss b/WebContent/VAADIN/themes/valo/components/_panel.scss
index b18e4f86d1..542c14ea64 100644
--- a/WebContent/VAADIN/themes/valo/components/_panel.scss
+++ b/WebContent/VAADIN/themes/valo/components/_panel.scss
@@ -9,6 +9,7 @@ $v-panel-border: $v-border !default;
.#{$primary-stylename}-caption {
@include valo-panel-caption-style;
+ border-radius: $v-border-radius - first-number($v-border) $v-border-radius - first-number($v-border) 0 0;
}
.#{$primary-stylename}-content {
@@ -23,15 +24,17 @@ $v-panel-border: $v-border !default;
@mixin valo-panel-style (
+ $primary-stylename: v-panel,
$background-color : $v-panel-background-color,
$shadow : $v-shadow,
- $border : $v-panel-border
+ $border : $v-panel-border,
+ $border-radius : $v-border-radius
) {
background: $background-color;
color: valo-font-color($background-color);
- border-radius: $v-border-radius;
- border: valo-border($border: $border, $color: darker-of($background-color, $v-app-background-color), $strength: 0.7);
- box-shadow: valo-bevel-and-shadow($shadow: $shadow);
+ border-radius: $border-radius;
+ border: valo-border($border: $border, $color: darkest-color($background-color, $v-app-background-color), $strength: 0.7);
+ @include box-shadow(valo-bevel-and-shadow($shadow: $shadow));
}
@@ -40,20 +43,18 @@ $v-panel-border: $v-border !default;
$background-color : $v-background-color,
$bevel : first($v-bevel),
$gradient : valo-gradient-style($v-gradient) valo-gradient-opacity($v-gradient)/4,
- $border : $v-panel-border,
- $border-radius : $v-border-radius - first-number($v-border) $v-border-radius - first-number($v-border) 0 0
+ $border : $v-panel-border
) {
@include box-sizing(border-box);
padding: 0 round($v-unit-size/3);
line-height: $v-unit-size - first-number($v-border);
$bg: $background-color;
border-bottom: valo-border($border: $border, $color: $bg, $strength: 0.5);
- border-radius: $border-radius;
@include valo-gradient($color: $bg, $gradient: $gradient);
color: valo-font-color($bg);
font-weight: $v-caption-font-weight;
font-size: $v-caption-font-size;
- box-shadow: valo-bevel-and-shadow($background-color: $bg, $bevel: $bevel, $gradient: $gradient);
+ @include box-shadow(valo-bevel-and-shadow($background-color: $bg, $bevel: $bevel, $gradient: $gradient));
text-shadow: valo-text-shadow(valo-font-color($bg), $bg, $v-bevel);
}
@@ -63,13 +64,13 @@ $v-panel-border: $v-border !default;
$bg: scale-color(adjust-color($v-background-color, $lightness: -2%), $saturation: -1.5%);
background: $bg;
color: valo-font-color($bg);
- box-shadow: valo-bevel-and-shadow($shadow: $shadow);
+ @include box-shadow(valo-bevel-and-shadow($shadow: $shadow));
border-radius: $v-border-radius;
border: valo-border();
- .v-panel-caption {
+ > div > .v-panel-caption {
background: transparent;
- box-shadow: none;
+ @include box-shadow(none);
}
}
@@ -79,11 +80,12 @@ $v-panel-border: $v-border !default;
background: transparent;
color: inherit;
border: none;
- box-shadow: none;
+ border-radius: 0;
+ @include box-shadow(none);
- .v-panel-caption {
+ > div > .v-panel-caption {
background: transparent;
- box-shadow: none;
+ @include box-shadow(none);
color: inherit;
padding: 0;
margin: 0 round($v-unit-size/3);
@@ -104,8 +106,8 @@ $v-panel-border: $v-border !default;
bottom: -$border-width;
right: 0;
left: 0;
- height: $border-width;
- background: first-color(valo-border($color: $v-app-background-color, $strength: 0.5));
+ height: 0;
+ border-top: $border-width solid first-color(valo-border($color: $v-app-background-color, $strength: 0.5));
}
}
@@ -115,8 +117,8 @@ $v-panel-border: $v-border !default;
position: absolute;
z-index: 2;
top: 0;
- height: $border-width;
- background: $v-app-background-color;
+ height: 0;
+ border-top: $border-width solid $v-app-background-color;
left: 0;
right: 0;
}
diff --git a/WebContent/VAADIN/themes/valo/components/_popupview.scss b/WebContent/VAADIN/themes/valo/components/_popupview.scss
index 1a44eb47d6..794a6997de 100644
--- a/WebContent/VAADIN/themes/valo/components/_popupview.scss
+++ b/WebContent/VAADIN/themes/valo/components/_popupview.scss
@@ -1,9 +1,24 @@
+@include keyframes(v-popupview-animate-in) {
+ 0% {
+ @include transform(scale(0));
+ }
+}
+
@mixin valo-popupview ($primary-stylename: v-popupview) {
+ .#{$primary-stylename} {
+ @include valo-link-style;
+ }
+
.#{$primary-stylename}-popup {
- @include valo-overlay-style;
+ @include valo-overlay-style($animate-in: v-popupview-animate-in 120ms, $animate-out: (valo-placeholder-animate-out 120ms, valo-anim-fade-out 120ms));
.popupContent {
@include valo-panel-adjust-content-margins;
}
}
+
+ .#{$primary-stylename}-loading {
+ margin: $v-layout-spacing-vertical $v-layout-spacing-horizontal;
+ @include valo-spinner;
+ }
}
diff --git a/WebContent/VAADIN/themes/valo/components/_progressbar.scss b/WebContent/VAADIN/themes/valo/components/_progressbar.scss
index 2c7e9925e7..f5836c7eaf 100644
--- a/WebContent/VAADIN/themes/valo/components/_progressbar.scss
+++ b/WebContent/VAADIN/themes/valo/components/_progressbar.scss
@@ -18,7 +18,7 @@ $v-progressbar-border-radius: $v-border-radius !default;
.#{$primary-stylename}-point {
.#{$primary-stylename}-indicator {
background: transparent;
- box-shadow: none;
+ @include box-shadow(none);
border: none;
text-align: right;
overflow: hidden;
@@ -33,6 +33,14 @@ $v-progressbar-border-radius: $v-border-radius !default;
}
}
+ .#{$primary-stylename}-indeterminate {
+ @include valo-spinner;
+
+ .#{$primary-stylename}-wrapper {
+ display: none;
+ }
+ }
+
}
@@ -49,7 +57,7 @@ $v-progressbar-border-radius: $v-border-radius !default;
border-radius: $v-progressbar-border-radius;
height: inherit;
@include valo-gradient($color: $background-color);
- box-shadow: valo-bevel-and-shadow($background-color: $background-color);
+ @include box-shadow(valo-bevel-and-shadow($background-color: $background-color));
@if $border {
border: valo-border($border: $border, $color: $background-color, $context: $v-app-background-color);
} @else {
diff --git a/WebContent/VAADIN/themes/valo/components/_richtextarea.scss b/WebContent/VAADIN/themes/valo/components/_richtextarea.scss
index 2e25e9c2a4..702bda2ac4 100644
--- a/WebContent/VAADIN/themes/valo/components/_richtextarea.scss
+++ b/WebContent/VAADIN/themes/valo/components/_richtextarea.scss
@@ -9,7 +9,7 @@ $valo-richtextarea-use-font-awesome: true !default;
.#{$primary-stylename} .gwt-RichTextToolbar {
@include valo-gradient($color: $v-background-color);
- box-shadow: valo-bevel-and-shadow($bevel: $v-bevel, $background-color: $v-background-color, $gradient: $v-gradient);
+ @include box-shadow(valo-bevel-and-shadow($bevel: $v-bevel, $background-color: $v-background-color, $gradient: $v-gradient));
border-bottom: valo-border();
color: valo-font-color($v-background-color);
}
@@ -90,4 +90,9 @@ $valo-richtextarea-use-font-awesome: true !default;
display: block;
}
+ .#{$primary-stylename}-readonly {
+ padding: ceil($v-unit-size/9) ceil($v-unit-size/6);
+ background: transparent;
+ }
+
}
diff --git a/WebContent/VAADIN/themes/valo/components/_slider.scss b/WebContent/VAADIN/themes/valo/components/_slider.scss
index 096f80e909..b4785a8471 100644
--- a/WebContent/VAADIN/themes/valo/components/_slider.scss
+++ b/WebContent/VAADIN/themes/valo/components/_slider.scss
@@ -50,7 +50,7 @@ $_valo-slider-base-margin-horizontal: round($v-slider-handle-width/2);
top: $_valo-slider-base-margin-vertical;
bottom: $_valo-slider-base-margin-vertical;
left: $_valo-slider-base-margin-horizontal;
- width: $v-border-radius;
+ width: $v-border-radius * 2;
border-radius: $v-border-radius;
border-left: valo-border($color: $v-selection-color, $context: $v-app-background-color);
}
@@ -70,6 +70,10 @@ $_valo-slider-base-margin-horizontal: round($v-slider-handle-width/2);
}
}
+ .v-has-width > .#{$primary-stylename}-base {
+ min-width: 0;
+ }
+
.#{$primary-stylename}-handle {
margin-top: round(($v-unit-size - $v-slider-track-size)/-2);
width: .1px; // Firefox needs a non-zero value
@@ -82,7 +86,7 @@ $_valo-slider-base-margin-horizontal: round($v-slider-handle-width/2);
&:after {
border: valo-border();
- @include valo-button-focus-style();
+ @include valo-button-focus-style($border-fallback: null);
opacity: 0;
@if $v-animations-enabled {
@include transition(opacity 200ms);
@@ -136,7 +140,7 @@ $_valo-slider-base-margin-horizontal: round($v-slider-handle-width/2);
left: $_valo-slider-base-margin-vertical;
right: $_valo-slider-base-margin-vertical;
width: auto;
- height: $v-border-radius;
+ height: $v-border-radius * 2;
border-left: none;
border-bottom: valo-border($color: $v-selection-color, $context: $v-app-background-color);
}
@@ -225,7 +229,7 @@ $_valo-slider-base-margin-horizontal: round($v-slider-handle-width/2);
&:after {
border: valo-border($color: $background-color);
- @include valo-button-focus-style($background-color: $background-color);
+ @include valo-button-focus-style($background-color: $background-color, $border-fallback: null);
}
}
}
diff --git a/WebContent/VAADIN/themes/valo/components/_splitpanel.scss b/WebContent/VAADIN/themes/valo/components/_splitpanel.scss
index 0b097f71fd..e05eb08d16 100644
--- a/WebContent/VAADIN/themes/valo/components/_splitpanel.scss
+++ b/WebContent/VAADIN/themes/valo/components/_splitpanel.scss
@@ -171,26 +171,6 @@
-/*
-@mixin valo-splitpanel-style ($splitter-size: ) {
- > div > .v-splitpanel-hsplitter {
- width: ;
-
- div:after {
- @include valo-splitpanel-splitter-handle-style($horizontal: true);
- }
-
- &:after {
- left: 0;
- right: 0;
- }
- }
- .v-splitpanel-horizontal .v-splitpanel-second-container
-}
-*/
-
-
-
@mixin valo-splitpanel-splitter-handle-style ($horizontal: false, $include-common: true) {
@if $include-common {
content: "";
diff --git a/WebContent/VAADIN/themes/valo/components/_table.scss b/WebContent/VAADIN/themes/valo/components/_table.scss
index 8b155fe525..deef084561 100644
--- a/WebContent/VAADIN/themes/valo/components/_table.scss
+++ b/WebContent/VAADIN/themes/valo/components/_table.scss
@@ -29,8 +29,8 @@ $v-table-background-color: null !default;
float: right;
}
- .#{$primary-stylename}-cell-wrapper {
- overflow: hidden;
+ .#{$primary-stylename}-caption-container-align-center {
+ text-align: center;
}
.#{$primary-stylename}-caption-container-align-right {
@@ -75,7 +75,11 @@ $v-table-background-color: null !default;
.v-table-header table,
.v-table-footer table,
.v-table-table {
- outline: $v-table-border-width solid $border-color;
+ @include box-shadow(0 0 0 $v-table-border-width $border-color);
+
+ .v-ie8 & {
+ outline: $v-table-border-width solid $border-color;
+ }
}
.#{$primary-stylename}-header-wrap,
@@ -85,7 +89,7 @@ $v-table-background-color: null !default;
@include valo-gradient($v-background-color);
white-space: nowrap;
font-size: $v-table-header-font-size;
- text-shadow: valo-text-shadow;
+ text-shadow: valo-text-shadow();
}
.#{$primary-stylename}-header-wrap {
@@ -105,55 +109,63 @@ $v-table-background-color: null !default;
.#{$primary-stylename}-footer td {
border-left: $v-table-border-width solid $border-color;
+ // Hack to overcome fixed "magic number" in VScrollTable.FooterCell (assumes 1px border)
+ @if $v-table-border-width != 1px {
+ display: inline-block;
+ margin-left: ($v-table-border-width - 1px) * -1;
+
+ &:first-child {
+ margin-left: 0;
+ }
+ }
}
.#{$primary-stylename}-footer-container,
.#{$primary-stylename}-caption-container {
overflow: hidden;
line-height: 1;
+ @include box-sizing(border-box);
}
.#{$primary-stylename}-footer-container {
$vertical-padding: round(($v-table-row-height - $v-table-header-font-size)/2);
- padding-top: $vertical-padding - $v-table-border-width;
- padding-bottom: $vertical-padding;
+ padding: $vertical-padding - $v-table-border-width $v-table-cell-padding-horizontal $vertical-padding;
float: right;
- padding-right: $v-table-cell-padding-horizontal + $v-table-border-width;
}
[class^="#{$primary-stylename}-header-cell"] {
position: relative;
- display: inline-block;
}
.#{$primary-stylename}-caption-container,
.#{$primary-stylename}-header-drag {
$vertical-padding: round(($v-table-row-height - $v-table-header-font-size)/2);
- padding-top: $vertical-padding;
- padding-bottom: $vertical-padding - $v-table-border-width;
- padding-left: $v-table-cell-padding-horizontal;
- padding-right: $v-table-cell-padding-horizontal;
+ padding: $vertical-padding $v-table-cell-padding-horizontal $vertical-padding - $v-table-border-width;
border-left: $v-table-border-width solid $border-color;
}
+ .#{$primary-stylename}-caption-container-align-right {
+ padding-right: $v-table-cell-padding-horizontal - $v-table-resizer-width;
+ }
+
.#{$primary-stylename}-resizer {
height: $v-table-row-height;
- background: transparent;
width: $v-table-resizer-width;
cursor: e-resize;
cursor: col-resize;
position: absolute;
+ top: 0;
right: 0;
z-index: 1;
}
.#{$primary-stylename}-cell-content {
border-left: $v-table-border-width solid $border-color;
- padding: 0 $v-table-cell-padding-horizontal;
+ overflow: hidden;
&:first-child {
border-left: none;
- padding-left: $v-table-cell-padding-horizontal + $v-table-border-width;
+ padding-left: $v-table-border-width;
}
}
@@ -164,10 +176,11 @@ $v-table-background-color: null !default;
.#{$primary-stylename}-cell-wrapper {
- white-space: nowrap;
line-height: 1;
$vertical-padding: round(($v-table-row-height - $v-font-size)/2);
- padding: $vertical-padding 0;
+ padding: $vertical-padding $v-table-cell-padding-horizontal;
+ @include box-sizing(border-box);
+ margin-right: 0 !important;
}
.#{$primary-stylename}-body {
@@ -176,6 +189,7 @@ $v-table-background-color: null !default;
.#{$primary-stylename}-table {
background-color: $background-color;
+ white-space: nowrap;
}
.#{$primary-stylename}-table td {
@@ -230,10 +244,6 @@ $v-table-background-color: null !default;
line-height: $v-table-row-height;
position: absolute;
right: 0;
-
- + .#{$primary-stylename}-caption-container {
- padding-right: $v-table-sort-indicator-width;
- }
}
.#{$primary-stylename}-header-cell-asc .#{$primary-stylename}-sort-indicator:before,
@@ -252,9 +262,14 @@ $v-table-background-color: null !default;
}
+ [class*="rowheader"] span.v-icon {
+ min-width: 1em;
+ }
+
+
.#{$primary-stylename}-focus {
$outline-width: max($v-table-border-width, 1px);
- outline: $outline-width solid valo-focus-color();
+ outline: $outline-width solid $v-focus-color;
outline-offset: -$outline-width;
}
@@ -272,11 +287,11 @@ $v-table-background-color: null !default;
}
.#{$primary-stylename}-focus-slot-right {
- border-right: 2px solid rgba(valo-focus-color(), .5);
+ border-right: 2px solid rgba($v-focus-color, .5);
}
.#{$primary-stylename}-focus-slot-left {
- border-left: 2px solid rgba(valo-focus-color(), .5);
+ border-left: 2px solid rgba($v-focus-color, .5);
left: 0;
right: auto;
margin-left: 0 !important;
@@ -319,6 +334,19 @@ $v-table-background-color: null !default;
}
}
+ .v-scrollable > .#{$primary-stylename} .#{$primary-stylename}-column-selector {
+ right: 0;
+ top: 0;
+ border-top: none;
+ border-right: none;
+ border-radius: 0 0 0 50%;
+
+ &:after {
+ top: 0;
+ right: 0;
+ }
+ }
+
.#{$primary-stylename}-header-wrap:hover .#{$primary-stylename}-column-selector {
@include opacity(1);
@include transition-delay(100ms);
@@ -343,7 +371,7 @@ $v-table-background-color: null !default;
tbody.v-drag-element {
display: block;
overflow: visible;
- box-shadow: none;
+ @include box-shadow(none);
background: transparent;
@include opacity(1);
@@ -382,14 +410,14 @@ $v-table-background-color: null !default;
// Drag'n'drop styles
.#{$primary-stylename}-drag .#{$primary-stylename}-body {
- box-shadow: 0 0 0 2px rgba(valo-focus-color(), .5);
+ @include box-shadow(0 0 0 2px rgba($v-focus-color, .5));
- @if color-luminance(valo-focus-color()) + 50 < color-luminance($background-color) {
- border-color: valo-focus-color();
+ @if color-luminance($v-focus-color) + 50 < color-luminance($background-color) {
+ border-color: $v-focus-color;
}
.v-ie8 & {
- border-color: valo-focus-color();
+ border-color: $v-focus-color;
}
.#{$primary-stylename}-focus {
@@ -404,7 +432,7 @@ $v-table-background-color: null !default;
height: $v-table-row-height + $v-table-border-width;
left: 0;
right: 0;
- background: valo-focus-color();
+ background: $v-focus-color;
@include opacity(.2);
}
@@ -416,10 +444,10 @@ $v-table-background-color: null !default;
height: 2px;
left: 0;
right: 0;
- background: valo-focus-color();
+ background: $v-focus-color;
font-size: $v-font-size * 2;
line-height: 2px;
- color: valo-focus-color();
+ color: $v-focus-color;
text-indent: round($v-font-size/-4);
text-shadow: 0 0 1px $background-color, 0 0 1px $background-color;
}
@@ -466,7 +494,7 @@ $v-table-background-color: null !default;
-@mixin valo-table-no-stripes ($primary-stylename: v-table) {
+@mixin valo-table-no-stripes-style ($primary-stylename: v-table) {
.#{$primary-stylename}-row,
.#{$primary-stylename}-row-odd {
background: transparent;
@@ -474,33 +502,36 @@ $v-table-background-color: null !default;
}
-
-
-@mixin valo-table-no-vertical-lines ($primary-stylename: v-table) {
- .#{$primary-stylename}-cell-content,
- [class*="row"].v-selected .#{$primary-stylename}-cell-content {
+@mixin valo-table-no-vertical-lines-style ($primary-stylename: v-table) {
+ .#{$primary-stylename}-cell-content {
border-left: none;
- border-right: none;
- padding-left: $v-table-cell-padding-horizontal + $v-table-border-width;
- padding-right: $v-table-cell-padding-horizontal + $v-table-border-width;
+ padding-left: $v-table-border-width;
+ }
+
+ &.v-treetable {
+ .#{$primary-stylename}-cell-content {
+ padding-left: $v-table-cell-padding-horizontal + $v-table-border-width;
+ }
}
}
-@mixin valo-table-no-horizontal-lines ($primary-stylename: v-table) {
- .#{$primary-stylename}-cell-content,
- [class*="row"].v-selected .#{$primary-stylename}-cell-content {
+
+@mixin valo-table-no-horizontal-lines-style ($primary-stylename: v-table) {
+ .#{$primary-stylename}-cell-content {
border-top: none;
border-bottom: none;
}
}
-@mixin valo-table-no-header ($primary-stylename: v-table) {
+
+@mixin valo-table-no-header-style ($primary-stylename: v-table) {
.#{$primary-stylename}-header-wrap {
display: none;
}
}
-@mixin valo-table-borderless ($primary-stylename: v-table) {
+
+@mixin valo-table-borderless-style ($primary-stylename: v-table) {
.#{$primary-stylename}-header-wrap,
.#{$primary-stylename}-footer-wrap,
.#{$primary-stylename}-header-drag,
@@ -521,13 +552,16 @@ $v-table-background-color: null !default;
}
}
-@mixin valo-table-compact-style (
+
+@mixin valo-table-spacing-style (
$primary-stylename: v-table,
$row-height: $v-table-row-height,
$header-font-size: $v-table-header-font-size,
$cell-padding-horizontal: $v-table-cell-padding-horizontal
) {
+ $vertical-padding: round(($row-height - $header-font-size)/2);
+
.#{$primary-stylename}-header-wrap,
.#{$primary-stylename}-footer-wrap,
.#{$primary-stylename}-header-drag {
@@ -535,36 +569,27 @@ $v-table-background-color: null !default;
}
.#{$primary-stylename}-footer-container {
- $vertical-padding: round(($row-height - $header-font-size)/2);
- padding-top: $vertical-padding - $v-table-border-width;
- padding-bottom: $vertical-padding;
- padding-right: $cell-padding-horizontal + $v-table-border-width;
+ padding: $vertical-padding - $v-table-border-width $cell-padding-horizontal + $v-table-border-width $vertical-padding;
}
.#{$primary-stylename}-caption-container,
.#{$primary-stylename}-header-drag {
- $vertical-padding: round(($row-height - $header-font-size)/2);
padding-top: $vertical-padding;
padding-bottom: $vertical-padding - $v-table-border-width;
padding-left: $cell-padding-horizontal;
padding-right: $cell-padding-horizontal;
}
+ .#{$primary-stylename}-caption-container-align-right {
+ padding-right: max(0, $cell-padding-horizontal - $v-table-resizer-width);
+ }
+
.#{$primary-stylename}-resizer {
height: $row-height;
}
.#{$primary-stylename}-cell-wrapper {
- $vertical-padding: round(($row-height - $v-font-size)/2);
- padding: $vertical-padding 0;
- }
-
- .#{$primary-stylename}-cell-content {
- padding: 0 $cell-padding-horizontal;
-
- &:first-child {
- padding-left: $cell-padding-horizontal + $v-table-border-width;
- }
+ padding: $vertical-padding $cell-padding-horizontal;
}
.#{$primary-stylename}-header-cell-asc .#{$primary-stylename}-sort-indicator,
@@ -580,4 +605,25 @@ $v-table-background-color: null !default;
.#{$primary-stylename}-row-drag-middle td:first-child:before {
height: $row-height + $v-table-border-width;
}
+
+ &.v-treetable {
+ .#{$primary-stylename}-cell-wrapper {
+ padding-left: 0;
+ padding-right: 0;
+ }
+
+ .#{$primary-stylename}-cell-content {
+ padding-left: $cell-padding-horizontal;
+ padding-right: $cell-padding-horizontal;
+
+ &:first-child {
+ padding-left: $cell-padding-horizontal + $v-table-border-width;
+ }
+ }
+
+ .#{$primary-stylename}-footer-container {
+ padding-left: $cell-padding-horizontal;
+ padding-right: $cell-padding-horizontal;
+ }
+ }
}
diff --git a/WebContent/VAADIN/themes/valo/components/_tabsheet.scss b/WebContent/VAADIN/themes/valo/components/_tabsheet.scss
index 185c6fbdc0..2e28174fa7 100644
--- a/WebContent/VAADIN/themes/valo/components/_tabsheet.scss
+++ b/WebContent/VAADIN/themes/valo/components/_tabsheet.scss
@@ -6,14 +6,43 @@ $v-tabsheet-content-animation-enabled: $v-animations-enabled !default;
@mixin valo-tabsheet-global ($primary-stylename: v-tabsheet) {
.#{$primary-stylename}-hidetabs > .#{$primary-stylename}-tabcontainer,
.#{$primary-stylename}-spacertd,
- .#{$primary-stylename}-deco,
.v-disabled .#{$primary-stylename}-scroller,
.#{$primary-stylename} .v-disabled .#{$primary-stylename}-caption-close {
display: none;
}
+ .#{$primary-stylename} {
+ overflow: visible !important;
+ position: relative;
+ }
+
+ .#{$primary-stylename}-tabcontainer {
+ table,
+ tbody,
+ tr {
+ display: inline-block;
+ border-spacing: 0;
+ border-collapse: collapse;
+ vertical-align: top;
+ }
+
+ td {
+ display: inline-block;
+ padding: 0;
+ }
+ }
+
+ .#{$primary-stylename}-tabs {
+ white-space: nowrap;
+ @include box-sizing(border-box);
+ }
+
.#{$primary-stylename}-content {
position: relative;
+
+ > div > .v-scrollable {
+ @include valo-panel-adjust-content-margins;
+ }
}
}
@@ -23,10 +52,6 @@ $v-tabsheet-content-animation-enabled: $v-animations-enabled !default;
@mixin valo-tabsheet ($primary-stylename: v-tabsheet) {
-
- $_scale: if( is-dark-color($v-background-color) , max(5%, $v-bevel-depth/2), min(-5%, -$v-bevel-depth/2) );
- $border-color: scale-color($v-background-color, $lightness: $_scale);
-
.#{$primary-stylename} {
&:not(.v-has-width) {
width: auto !important;
@@ -38,220 +63,374 @@ $v-tabsheet-content-animation-enabled: $v-animations-enabled !default;
}
.#{$primary-stylename}-tabcontainer {
- position: relative;
- line-height: $v-unit-size;
- @include user-select(none);
+ @include valo-tabsheet-tabcontainer-style($primary-stylename);
+ }
- table,
- tbody,
- tr {
- display: inline-block;
- border-spacing: 0;
- border-collapse: collapse;
- vertical-align: top;
- }
+ .#{$primary-stylename}-tabitemcell {
+ @include valo-tabsheet-tabitemcell-style($primary-stylename);
+ }
- td {
- display: inline-block;
- padding: 0;
+ .#{$primary-stylename}-scroller {
+ @include valo-tabsheet-scroller-style($primary-stylename);
+ }
+
+
+ @if $v-tabsheet-content-animation-enabled {
+ .#{$primary-stylename}-tabsheetpanel > .v-scrollable > .v-widget {
+ @include valo-anim-fade-in(300ms);
}
- &:before {
- content: "";
+ $spinner-size: round($v-unit-size/2);
+ $spinner-size: $spinner-size + $spinner-size % 2;
+
+ .#{$primary-stylename}-deco {
+ @include valo-spinner($size: $spinner-size);
+ height: 0 !important;
+ border-style: none;
+ display: block;
position: absolute;
- height: max(1px, first-number($v-border));
- background: $border-color;
- bottom: 0;
- left: 0;
- right: 0;
+ z-index: -1;
+ bottom: 50%;
+ margin-bottom: round($v-unit-size/-2) - $spinner-size/2;
+ left: 50%;
+ margin-left: $spinner-size/-2;
+ opacity: 0;
+
+ .v-ie8 & {
+ min-height: 0;
+ }
+ }
+
+ .#{$primary-stylename}-loading .#{$primary-stylename}-deco {
+ @include transition(opacity 200ms 200ms);
+ opacity: 1;
+ z-index: 1;
+ height: $spinner-size !important;
+ border-style: solid;
+
+ .v-ie8 &,
+ .v-ie9 & {
+ border-style: none;
+ }
+
+ .v-ie8 & {
+ min-height: 30px;
+ }
}
}
+}
+
+
+@mixin valo-tabsheet-tabcontainer-style ($primary-stylename: v-tabsheet) {
+ position: relative;
+ @include user-select(none);
+ @include box-sizing(border-box);
+
+ &:before {
+ content: "";
+ position: absolute;
+ height: 0;
+ // iOS panics with background color, creating black line artifacts
+ border-top: max(1px, first-number($v-border)) solid first-color(valo-border($strength: 0.5));
+ bottom: 0;
+ left: 0;
+ right: 0;
+ }
+
.#{$primary-stylename}-tabs {
- height: $v-unit-size;
position: relative;
- white-space: nowrap;
- @include box-sizing(border-box);
+ }
+}
- .v-caption {
- height: $v-unit-size;
- margin-left: round($v-unit-size/2);
- padding: 0 round($v-unit-size/10);
- @include box-sizing(border-box);
- cursor: pointer;
- text-align: center;
- line-height: $v-unit-size;
- font-size: $v-font-size;
- font-weight: $v-font-weight;
- color: valo-font-color($v-app-background-color, 0.6);
- width: auto !important;
- @if $v-animations-enabled {
- @include transition(border-bottom 200ms, color 200ms);
- }
+@mixin valo-tabsheet-tabitemcell-style ($primary-stylename: v-tabsheet) {
+ vertical-align: bottom;
- .v-icon {
- cursor: inherit;
- }
+ .#{$primary-stylename}-tabitem {
+ line-height: 0;
+ overflow: hidden;
+ }
- .v-icon + .v-captiontext {
- margin-left: round($v-unit-size/4);
- }
+ .v-caption {
+ margin-left: round($v-unit-size/2);
+ padding: 0 round($v-unit-size/10);
+ @include box-sizing(border-box);
+ cursor: pointer;
+ text-align: center;
+ line-height: $v-unit-size;
+ font-size: round($v-font-size * 0.95);
+ font-weight: $v-font-weight;
+ color: valo-font-color($v-app-background-color, 0.58);
+ width: auto !important;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ border-bottom: max(1px, first-number($v-border))*2 solid transparent;
+
+ @if $v-animations-enabled {
+ @include transition(border-bottom 200ms, color 200ms);
+ }
- &:hover {
- color: $v-selection-color;
- }
+ .v-captiontext {
+ display: inline;
+ }
- &.v-disabled {
- @include opacity($v-disabled-opacity);
- cursor: default;
- color: inherit !important;
- border-bottom: none;
- }
+ .v-icon + .v-captiontext {
+ margin-left: round($v-unit-size/4);
}
- td:first-child .v-caption,
- [aria-hidden="true"] + td .v-caption {
- margin-left: 0;
+ &:hover {
+ color: $v-selection-color;
+ }
+
+ &.v-disabled {
+ @include opacity($v-disabled-opacity);
+ cursor: default;
+ color: inherit !important;
+ border-bottom: none;
}
}
- .#{$primary-stylename}-tabitemcell:focus {
+ &:first-child .v-caption,
+ &[aria-hidden="true"] + td .v-caption {
+ margin-left: 0;
+ }
+
+ &:focus {
outline: none;
.v-caption {
color: $v-selection-color;
- border-bottom: max(1px, first-number($v-border)) solid $v-selection-color;
}
}
.#{$primary-stylename}-tabitem-selected .v-caption.v-caption {
- border-bottom: max(1px, first-number($v-border))*2 solid $v-selection-color;
+ border-bottom-color: $v-selection-color;
color: $v-selection-color;
}
.#{$primary-stylename}-caption-close {
display: inline-block;
- font-size: 1.2em;
- line-height: 1;
+ font-size: round($v-font-size * 1.1);
+ line-height: round($v-font-size * 1.1);
+ width: round($v-font-size * 1.1);
vertical-align: middle;
- padding: round($v-font-size/8) round($v-font-size/4);
- margin: round($v-font-size/-8) round($v-font-size/-4) round($v-font-size/-8) round($v-font-size/4);
+ text-align: center;
+ margin: 0 round($v-font-size/-4) 0 round($v-font-size/2);
border-radius: round($v-border-radius/2);
+ color: valo-font-color($v-app-background-color, 0.4);
&:hover {
- background: $v-selection-color;
- color: valo-font-color($v-selection-color);
+ background: rgba(#000, .03);
+ color: $v-selection-color;
}
&:active {
- background: darken($v-selection-color, 5%);
+ background: $v-selection-color;
color: valo-font-color($v-selection-color);
}
}
+}
- .#{$primary-stylename}-scroller {
+
+@mixin valo-tabsheet-scroller-style ($primary-stylename: v-tabsheet) {
+ $border-color: first-color(valo-border($strength: 0.5));
+
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ padding-left: round($v-unit-size/2);
+ @include linear-gradient(to left, $v-background-color 70%, rgba($v-background-color, 0) 100%, $fallback: transparent);
+ pointer-events: none;
+
+ &:after {
+ content: "";
+ height: first-number($v-border);
position: absolute;
+ bottom: 0;
+ left: 0;
right: 0;
- top: 0;
- padding-left: round($v-unit-size/2);
- @include linear-gradient(to left, $v-background-color 70%, rgba($v-background-color, 0) 100%, $fallback: transparent);
- pointer-events: none;
- line-height: $v-unit-size;
+ display: block;
+ @include linear-gradient(to left, $border-color 70%, rgba($border-color, 0) 100%, $fallback: transparent);
+ }
+
+ .v-ie8 &,
+ .v-ie9 & {
+ background-color: $v-background-color;
&:after {
- content: "";
- height: first-number($v-border);
- position: absolute;
- bottom: 0;
- left: 0;
- right: 0;
- display: block;
- @include linear-gradient(to left, $border-color 70%, rgba($border-color, 0) 100%, $fallback: transparent);
+ background-color: $border-color;
}
+ }
- .v-ie8 &,
- .v-ie9 & {
- background-color: $v-background-color;
+ button {
+ @include appearance(none);
+ border: none;
+ background: transparent;
+ font: inherit;
+ color: inherit;
+ height: 100%;
+ margin: 0;
+ padding: 0 round($v-unit-size/4);
+ outline: none;
+ cursor: pointer;
+ pointer-events: auto;
+ @include opacity(.5);
- &:after {
- background-color: $border-color;
- }
+ &:hover {
+ @include opacity(1);
+ color: $v-selection-color;
}
- button {
- @include appearance(none);
- border: none;
- background: transparent;
- font: inherit;
- color: inherit;
- height: $v-unit-size;
- line-height: $v-unit-size;
- margin: 0;
- padding: 0 round($v-unit-size/4);
- outline: none;
- cursor: pointer;
- pointer-events: auto;
- @include opacity(.5);
+ &:active {
+ @include opacity(.7);
+ color: $v-selection-color;
+ }
- &:hover {
- @include opacity(1);
- color: $v-selection-color;
- }
+ &::-moz-focus-inner {
+ padding: 0;
+ border: 0
+ }
+ }
+
+ [class*="Next"] {
+ padding-left: round($v-unit-size/8);
+ &:before {
+ @include valo-tabsheet-scroller-next-icon-style;
+ }
+ }
+
+ [class*="Prev"] {
+ padding-right: round($v-unit-size/8);
+ &:before {
+ @include valo-tabsheet-scroller-prev-icon-style;
+ }
+ }
+
+ [class*="disabled"] {
+ cursor: default;
+ color: inherit !important;
+ @include opacity(.1, true);
+ }
+}
+
+
+@mixin valo-tabsheet-scroller-prev-icon-style {
+ font-family: FontAwesome;
+ content: "\f053";
+}
+
+
+@mixin valo-tabsheet-scroller-next-icon-style {
+ font-family: FontAwesome;
+ content: "\f054";
+}
+
+
+
+
+
+
+
+
+@mixin valo-tabsheet-framed-style ($primary-stylename: v-tabsheet, $frame-inactive-tabs: true, $outer-frame: true, $tab-spacing: round($v-unit-size/10)) {
+ > .#{$primary-stylename}-tabcontainer {
+ .v-caption {
+ position: relative;
+ margin-left: $tab-spacing or first-number($v-border) * -1;
+ padding: 0 $v-layout-spacing-horizontal;
+ border: first-number($v-border) solid transparent;
+ line-height: $v-unit-size - first-number($v-border);
+ border-radius: $v-border-radius $v-border-radius 0 0;
+ font-weight: $v-font-weight + 100;
- &:active {
- @include opacity(.7);
- color: $v-selection-color;
+ @if $v-animations-enabled {
+ @include transition(background-color 160ms);
}
- &::-moz-focus-inner {
- padding: 0;
- border: 0
+ &:hover {
+ background-color: darken($v-app-background-color, 3%);
+ border-bottom-color: first-color(valo-border($strength: 0.5));
}
}
- [class*="Next"] {
- padding-left: round($v-unit-size/8);
- &:before {
- @include valo-tabsheet-scroller-next-icon-style;
- }
+ td:first-child .v-caption,
+ [aria-hidden="true"] + td .v-caption {
+ margin-left: 0;
}
- [class*="Prev"] {
- padding-right: round($v-unit-size/8);
- &:before {
- @include valo-tabsheet-scroller-prev-icon-style;
+ @if $frame-inactive-tabs {
+ .#{$primary-stylename}-tabitem .v-caption {
+ border-color: first-color(valo-border($strength: 0.5));
}
}
- [class*="disabled"] {
- cursor: default;
- color: inherit !important;
- @include opacity(.1 !important);
+ .#{$primary-stylename}-tabitem-selected .v-caption {
+ background: $v-panel-background-color;
+ border-color: first-color(valo-border($strength: 0.5));
+ border-bottom: none;
+ padding-bottom: first-number($v-border);
+ }
+
+ .v-caption-closable {
+ padding-right: $v-layout-spacing-horizontal + round($v-font-size * 1.1);
+ }
+
+ .#{$primary-stylename}-caption-close {
+ position: absolute;
+ top: round($v-font-size/4);
+ right: round($v-font-size/4);
+ margin: 0;
}
}
+ > .#{$primary-stylename}-content {
+ // iOS panics with black line artifacts,
+ // moving the background color to an inner element fixes it
+ > div {
+ background: $v-panel-background-color;
+ }
- @if $v-tabsheet-content-animation-enabled {
- .#{$primary-stylename}-tabsheetpanel > .v-scrollable > .v-widget {
- @include valo-anim-fade-in(300ms);
+ @if $outer-frame {
+ border: valo-border($strength: 0.5);
+ border-top: none;
}
}
+ &.padded-tabbar {
+ > .#{$primary-stylename}-tabcontainer {
+ @if $outer-frame {
+ border: valo-border($strength: 0.5);
+ border-bottom: none;
+ }
+
+ background: $v-background-color;
+ padding-top: round($v-unit-size/6);
+ }
+ }
+
+ &.icons-on-top .v-caption-closable {
+ padding-right: $v-layout-spacing-horizontal;
+ }
}
-@mixin valo-tabsheet-centered-tabs ($primary-stylename: v-tabsheet) {
- .#{$primary-stylename}-tabcontainer {
- text-align: center;
+
+
+
+
+@mixin valo-tabsheet-align-tabs-style ($primary-stylename: v-tabsheet, $align: center) {
+ > .#{$primary-stylename}-tabcontainer {
+ text-align: $align;
}
}
-@mixin valo-tabsheet-equal-width-tabs ($primary-stylename: v-tabsheet, $flex: false) {
- .#{$primary-stylename}-tabcontainer {
+@mixin valo-tabsheet-equal-width-tabs-style ($primary-stylename: v-tabsheet, $flex: false) {
+ > .#{$primary-stylename}-tabcontainer {
table,
tbody,
tr {
@@ -267,7 +446,6 @@ $v-tabsheet-content-animation-enabled: $v-animations-enabled !default;
td {
display: table-cell;
- //width: 100% !important;
}
.v-caption {
@@ -277,39 +455,30 @@ $v-tabsheet-content-animation-enabled: $v-animations-enabled !default;
}
}
-@mixin valo-tabsheet-icons-on-top ($primary-stylename: v-tabsheet) {
- .#{$primary-stylename}-tabs {
- height: $v-unit-size * 2;
-
+@mixin valo-tabsheet-icons-on-top-style ($primary-stylename: v-tabsheet) {
+ > div > .#{$primary-stylename}-tabs {
.v-caption {
- height: $v-unit-size * 2;
- padding-top: $v-unit-size;
+ padding-top: round($v-unit-size/6);
+ padding-bottom: round($v-unit-size/6);
+ line-height: 1.2;
+ }
+
+ .#{$primary-stylename}-tabitem-selected .v-caption {
+ padding-bottom: round($v-unit-size/6) + first-number($v-border);
}
.v-icon {
display: block;
- font-size: $v-font-size * 2;
- $_offset: round($v-unit-size/4);
- margin: -($v-unit-size - $_offset) auto #{-$_offset};
- min-height: $v-unit-size;
+ .v-captiontext.v-captiontext {
margin-left: 0;
}
}
}
-
- .#{$primary-stylename}-scroller {
- line-height: $v-unit-size*2;
-
- button[class] {
- padding: 0 round($v-unit-size/4);
- display: block;
- }
- }
}
-@mixin valo-tabsheet-only-selected-closable ($primary-stylename: v-tabsheet) {
+
+@mixin valo-tabsheet-only-selected-closable-style ($primary-stylename: v-tabsheet) {
> .#{$primary-stylename}-tabcontainer .#{$primary-stylename}-caption-close {
visibility: hidden;
}
@@ -319,18 +488,9 @@ $v-tabsheet-content-animation-enabled: $v-animations-enabled !default;
}
}
-@mixin valo-tabsheet-padded-tabbar ($primary-stylename: v-tabsheet) {
+
+@mixin valo-tabsheet-padded-tabbar-style ($primary-stylename: v-tabsheet) {
> .#{$primary-stylename}-tabcontainer .#{$primary-stylename}-tabs {
padding: 0 round($v-unit-size/4);
}
}
-
-@mixin valo-tabsheet-scroller-prev-icon-style {
- font-family: FontAwesome;
- content: "\f053";
-}
-
-@mixin valo-tabsheet-scroller-next-icon-style {
- font-family: FontAwesome;
- content: "\f054";
-}
diff --git a/WebContent/VAADIN/themes/valo/components/_textarea.scss b/WebContent/VAADIN/themes/valo/components/_textarea.scss
index 5db4c709fc..3b610251d3 100644
--- a/WebContent/VAADIN/themes/valo/components/_textarea.scss
+++ b/WebContent/VAADIN/themes/valo/components/_textarea.scss
@@ -50,4 +50,11 @@
//display: block; // Fixes extra white-space under the textarea element
height: auto;
resize: none;
+
+ .v-ie8 &,
+ .v-ie9 & {
+ line-height: inherit;
+ padding-top: round($unit-size/9);
+ padding-bottom: round($unit-size/9);
+ }
}
diff --git a/WebContent/VAADIN/themes/valo/components/_textfield.scss b/WebContent/VAADIN/themes/valo/components/_textfield.scss
index f28fee0d1c..c314a0c855 100644
--- a/WebContent/VAADIN/themes/valo/components/_textfield.scss
+++ b/WebContent/VAADIN/themes/valo/components/_textfield.scss
@@ -42,6 +42,13 @@ $v-textfield-disabled-opacity: $v-disabled-opacity !default;
height: $unit-size;
border-radius: $border-radius;
+ .v-ie8 &,
+ .v-ie9 & {
+ line-height: $unit-size;
+ padding-top: 0;
+ padding-bottom: 0;
+ }
+
@if type-of($padding) == number or type-of($padding) == list {
padding: $padding;
} @else {
@@ -49,20 +56,12 @@ $v-textfield-disabled-opacity: $v-disabled-opacity !default;
@if $border-radius {
$padding-width: $padding-width + ceil($border-radius/3);
}
-
$padding-height: round($unit-size/9);
-
padding: $padding-height $padding-width;
-
- // Go ask Mozilla why text alignment in text inputs is so wonky
- .v-ff & {
- // padding-top: $padding-height - 2px;
- // padding-bottom: 0;
- }
}
@if $background-color and $border {
- border: valo-border($border, darker-of($background-color, $v-app-background-color));
+ border: valo-border($border, darkest-color($background-color, $v-app-background-color));
}
@if $gradient == none {
@@ -71,8 +70,11 @@ $v-textfield-disabled-opacity: $v-disabled-opacity !default;
@include valo-gradient($color: $background-color, $gradient: $gradient)
}
- color: valo-font-color($background-color);
- box-shadow: valo-bevel-and-shadow($bevel: $bevel, $shadow: $shadow, $background-color: $background-color, $gradient: $gradient);
+ @if $background-color {
+ color: valo-font-color($background-color);
+ }
+
+ @include box-shadow(valo-bevel-and-shadow($bevel: $bevel, $shadow: $shadow, $background-color: $background-color, $gradient: $gradient));
@if $v-animations-enabled {
@include transition(box-shadow 180ms, border 180ms);
@@ -119,13 +121,13 @@ $v-textfield-disabled-opacity: $v-disabled-opacity !default;
@include transition(none);
}
- $focus-color: valo-focus-color();
+ $focus-color: $v-focus-color;
@if color-luminance($focus-color) + 50 < color-luminance($v-background-color) {
border-color: $focus-color;
}
- box-shadow: valo-bevel-and-shadow($bevel: $bevel, $shadow: $shadow, $background-color: $background-color, $gradient: $gradient, $include-focus: true);
+ @include box-shadow(valo-bevel-and-shadow($bevel: $bevel, $shadow: $shadow, $background-color: $background-color, $gradient: $gradient, $include-focus: true));
@include valo-focus-style;
}
@@ -133,7 +135,7 @@ $v-textfield-disabled-opacity: $v-disabled-opacity !default;
@mixin valo-textfield-readonly-style {
background: transparent;
- box-shadow: none;
+ @include box-shadow(none);
&:focus {
@include valo-focus-style($include-box-shadow: true);
}
@@ -163,10 +165,15 @@ $v-textfield-disabled-opacity: $v-disabled-opacity !default;
border: none;
border-radius: 0;
background: $background-color;
- box-shadow: none;
+ @include box-shadow(none);
+ @if $background-color == transparent {
+ color: inherit;
+ } @else if type-of($background-color) == color {
+ color: valo-font-color($background-color);
+ }
&:focus {
- box-shadow: none;
+ @include box-shadow(none);
}
}
@@ -174,7 +181,7 @@ $v-textfield-disabled-opacity: $v-disabled-opacity !default;
@mixin valo-textfield-error-style {
- border-color: $v-error-indicator-color;
+ border-color: $v-error-indicator-color !important;
$bg: scale-color($v-error-indicator-color, $lightness: 98%);
background: $bg;
color: valo-font-color($bg);
@@ -182,15 +189,30 @@ $v-textfield-disabled-opacity: $v-disabled-opacity !default;
-@mixin valo-textfield-inline-icon($primary-stylename: v-textfield, $stylename: inline-icon, $unit-size: $v-unit-size, $font-size: $v-font-size, $image-icon-size: 16px) {
- .v-slot-#{$stylename} {
+
+
+
+
+@mixin valo-textfield-inline-icon($primary-stylename: v-textfield, $stylenames: inline-icon, $input-selector: null, $unit-size: $v-unit-size, $font-size: $v-font-size, $image-icon-size: 16px) {
+ $slot-selector: "";
+ $caption-selector: "";
+ $text-input-selector: "";
+
+ @each $style in $stylenames {
+ $slot-selector: $slot-selector + ".v-slot-" + $style;
+ $caption-selector: $caption-selector + ".v-caption-" + $style;
+ $text-input-selector: $text-input-selector + "." + $primary-stylename + "-" + $style;
+ }
+
+ #{$slot-selector} {
position: relative;
}
- .v-caption-#{$stylename} {
+ #{$caption-selector} {
padding: 0;
.v-captiontext {
+ // Need to include to get the default padding back
@include valo-caption-style;
margin: 0;
}
@@ -218,8 +240,7 @@ $v-textfield-disabled-opacity: $v-disabled-opacity !default;
}
}
- .#{$primary-stylename}-#{$stylename},
- .v-textarea-#{$stylename} {
+ #{$text-input-selector} #{$input-selector} {
padding-left: $unit-size;
}
}
diff --git a/WebContent/VAADIN/themes/valo/components/_tree.scss b/WebContent/VAADIN/themes/valo/components/_tree.scss
index 4b9fe33c4a..9ac2f7e43d 100644
--- a/WebContent/VAADIN/themes/valo/components/_tree.scss
+++ b/WebContent/VAADIN/themes/valo/components/_tree.scss
@@ -45,6 +45,10 @@ $v-tree-expand-animation-enabled: false !default;
width: 1.9em;
height: $v-tree-row-height;
cursor: pointer;
+ // IE 9/10 need some color so that this element can receive mouse events.
+ // 'red' just happens to be the shortest color name.
+ background: red;
+ opacity: 0;
.v-ie8 & {
content: "+";
@@ -53,6 +57,7 @@ $v-tree-expand-animation-enabled: false !default;
vertical-align: top;
@include valo-tree-collapsed-icon-style;
text-align: center;
+ background: transparent;
}
}
@@ -157,7 +162,7 @@ $v-tree-expand-animation-enabled: false !default;
// This a v-tree-node-caption element
&:after {
opacity: 1;
- border: 1px solid valo-focus-color();
+ border: 1px solid $v-focus-color;
}
.v-ie8 & {
@@ -216,21 +221,21 @@ $v-tree-expand-animation-enabled: false !default;
position: absolute;
height: 2px;
width: 100%;
- background: valo-focus-color();
+ background: $v-focus-color;
font-size: $v-font-size * 2;
line-height: 2px;
- color: valo-focus-color();
+ color: $v-focus-color;
text-indent: round($v-font-size/-4);
text-shadow: 0 0 1px $v-background-color, 0 0 1px $v-background-color;
}
.#{$primary-stylename}-node-caption-drag-center {
- box-shadow: 0 0 0 2px valo-focus-color();
+ @include box-shadow(0 0 0 2px $v-focus-color);
position: relative;
border-radius: $v-border-radius;
.v-ie8 & {
- outline: 2px solid valo-focus-color();
+ outline: 2px solid $v-focus-color;
}
}
diff --git a/WebContent/VAADIN/themes/valo/components/_treetable.scss b/WebContent/VAADIN/themes/valo/components/_treetable.scss
index e8cd22fa9a..0423b37ab1 100644
--- a/WebContent/VAADIN/themes/valo/components/_treetable.scss
+++ b/WebContent/VAADIN/themes/valo/components/_treetable.scss
@@ -1,20 +1,41 @@
@mixin valo-treetable ($primary-stylename: v-treetable) {
- .v-table-cell-wrapper {
- //position: relative;
+ .#{$primary-stylename} {
+ [class*="caption-container"],
+ [class*="footer-container"],
+ [class*="cell-wrapper"] {
+ @include box-sizing(content-box);
+ padding-left: 0;
+ padding-right: 0;
+ }
+
+ [class*="caption-container"] {
+ padding-left: $v-table-cell-padding-horizontal;
+ }
+
+ [class*="caption-container-align-right"] {
+ padding-left: $v-table-cell-padding-horizontal + $v-table-resizer-width;
+ }
+
+ [class*="footer-container"] {
+ padding-right: $v-table-cell-padding-horizontal;
+ }
+
+ [class*="cell-content"] {
+ padding-left: $v-table-cell-padding-horizontal;
+ padding-right: $v-table-cell-padding-horizontal;
+
+ &:first-child {
+ padding-left: $v-table-cell-padding-horizontal + $v-table-border-width;
+ }
+ }
}
.#{$primary-stylename}-treespacer {
display: inline-block;
- background: transparent;
- width: round($v-unit-size/2);
- //left: round($v-unit-size/-8);
- left: 0;
position: absolute;
- text-align: right;
-
- &:before {
-
- }
+ width: round($v-unit-size/2);
+ margin-left: round($v-unit-size/-2) - round($v-table-cell-padding-horizontal/2);
+ text-align: center;
}
.#{$primary-stylename}-node-closed:before {
@@ -24,4 +45,4 @@
.#{$primary-stylename}-node-open:before {
@include valo-tree-expanded-icon-style($force: true);
}
-} \ No newline at end of file
+}
diff --git a/WebContent/VAADIN/themes/valo/components/_widget.scss b/WebContent/VAADIN/themes/valo/components/_widget.scss
index 20e3b2b3c9..f6c0b6462a 100644
--- a/WebContent/VAADIN/themes/valo/components/_widget.scss
+++ b/WebContent/VAADIN/themes/valo/components/_widget.scss
@@ -1,21 +1,15 @@
-//
+//
// @mixin valo-widget-style
@mixin valo-widget-style {
// Baseline expectations for all Vaadin widgets
@include box-sizing(border-box);
display: inline-block;
+ vertical-align: top;
- // Reset, since ordered layout uses text-align for horizotal alignment inside slots and
+ // Reset, since ordered layout uses text-align for horizotal alignment inside slots and
// white-space: nowrap; for horizontal layout orientation
text-align: left;
white-space: normal;
-
- // This is needed to overcome issues with line-boxes (i.e. block elements
- // with inline elements as children, whose height is less than the parent's line-height)
- // See: http://stackoverflow.com/questions/3003051/why-does-the-html5-doctype-mess-with-my-padding
- // In order to avoid specifying font-size: 0; for all component containers, we need to avoid adding
- // vertical-align: top/middle/bottom to any component by default, which will mess up the spacing.
- line-height: $v-line-height;
}
diff --git a/WebContent/VAADIN/themes/valo/components/_window.scss b/WebContent/VAADIN/themes/valo/components/_window.scss
index 050a8156d3..d866ce2584 100644
--- a/WebContent/VAADIN/themes/valo/components/_window.scss
+++ b/WebContent/VAADIN/themes/valo/components/_window.scss
@@ -1,44 +1,53 @@
$v-window-background-color: $v-panel-background-color !default;
-$v-window-border-radius: null !default;
-$v-window-shadow: 0 4px 12px 6px rgba(0,0,0, $v-shadow-opacity/100%), $v-overlay-shadow !default;
-$v-window-open-animation: null !default;
-$v-window-animations-enabled: $v-animations-enabled !default;
+$v-window-border-radius: $v-border-radius !default;
+$v-window-shadow: 0 2px 10px (v-shade 2), 0 16px 80px -6px (v-shade 3), last($v-overlay-shadow) !default;
+$v-window-animate-in: valo-placeholder-animate-in 140ms, valo-anim-fade-in 140ms !default;
+$v-window-animate-out: valo-placeholder-animate-out 100ms, valo-anim-scale-down-fade-out 100ms !default;
+$v-window-modality-curtain-background-color: #222 !default;
-@if $v-window-animations-enabled {
+@if $v-animations-enabled {
@include keyframes(valo-modal-window-indication) {
0% { opacity: 0; }
100% { opacity: 1; }
}
+
+ @include keyframes(valo-anim-scale-down-fade-out) {
+ 100% {
+ @include transform(scale(0.8));
+ opacity: 0;
+ }
+ }
}
@mixin valo-window ($primary-stylename: v-window) {
.#{$primary-stylename} {
- @include valo-overlay-style($background-color: $v-window-background-color);
-
- @if $v-window-animations-enabled and $v-window-open-animation {
- @include animation($v-window-open-animation);
- }
+ @include valo-overlay-style($background-color: $v-window-background-color, $animate-in: $v-window-animate-in, $animate-out: $v-window-animate-out);
@if $v-window-shadow {
@if $v-window-shadow == none {
- box-shadow: none;
+ @include box-shadow(none);
} @else if $v-window-shadow != $v-overlay-shadow {
- box-shadow: valo-bevel-and-shadow($shadow: $v-window-shadow);
+ @include box-shadow(valo-bevel-and-shadow($shadow: $v-window-shadow));
}
}
- border-radius: $v-window-border-radius;
- //border: first-number($v-border) solid valo-panel-border-color();
+ @if $v-window-border-radius != $v-border-radius {
+ border-radius: $v-window-border-radius;
+ }
padding: 0;
min-width: 4*$v-unit-size !important;
min-height: $v-unit-size !important;
- overflow: hidden !important;
white-space: nowrap;
+ overflow: hidden !important;
- @if $v-window-animations-enabled {
+ @if $v-animations-enabled {
@include transition(width 200ms, height 200ms, top 200ms, left 200ms);
+
+ &.#{$primary-stylename}-animate-in {
+ @include transition(none);
+ }
}
}
@@ -48,8 +57,14 @@ $v-window-animations-enabled: $v-animations-enabled !default;
right: 0;
bottom: 0;
left: 0;
- background: $v-app-background-color;
- @include opacity(.5);
+ @include radial-gradient(circle at 50% 50%, $v-window-modality-curtain-background-color, darken($v-window-modality-curtain-background-color, valo-gradient-opacity()), $fallback: $v-window-modality-curtain-background-color);
+ @include opacity(max(0.2, 0.8 - valo-gradient-opacity()/100%));
+ @include valo-anim-fade-in($duration: 400ms, $delay: 100ms);
+
+ .v-op12 & {
+ // Opera 12 has a shitbreak with the fade-in (flickers)
+ @include animation(none);
+ }
}
.#{$primary-stylename}-draggingCurtain {
@@ -78,9 +93,9 @@ $v-window-animations-enabled: $v-animations-enabled !default;
bottom: -$scroll-divider-width;
right: 0;
left: 0;
- height: $scroll-divider-width;
+ height: 0;
$_bg: $v-window-background-color;
- background: first-color(valo-border($strength: 0.5));
+ border-top: $scroll-divider-width solid first-color(valo-border($strength: 0.5));
}
}
@@ -100,19 +115,22 @@ $v-window-animations-enabled: $v-animations-enabled !default;
.#{$primary-stylename}-maximizebox,
.#{$primary-stylename}-restorebox {
position: absolute;
- z-index: 2;
+ z-index: 3;
top: 0;
right: 0;
- width: $v-unit-size;
+ @include box-sizing(border-box);
+ width: $v-unit-size - round($v-unit-size/9);
height: $v-unit-size - 1px;
+ background-color: $v-window-background-color;
line-height: $v-unit-size - 3px;
text-align: center;
cursor: pointer;
font-family: FontAwesome;
font-size: round($v-font-size * 1.3);
- @include opacity(.4);
+ color: valo-font-color($v-window-background-color, .4);
+
@if $v-animations-enabled {
- @include transition(all 140ms);
+ @include transition(color 140ms);
}
&:focus {
@@ -130,17 +148,37 @@ $v-window-animations-enabled: $v-animations-enabled !default;
}
.#{$primary-stylename}-closebox {
+ padding-right: round($v-unit-size/9);
@include valo-window-close-icon-style;
+
+ @if $v-window-border-radius > 0 {
+ border-radius: 0 $v-window-border-radius 0 $v-window-border-radius;
+ }
}
.#{$primary-stylename}-maximizebox,
.#{$primary-stylename}-restorebox {
- right: $v-unit-size;
+ right: $v-unit-size - round($v-unit-size/9);
+ padding-left: round($v-unit-size/9);
+
+ @if $v-window-border-radius > 0 {
+ border-radius: 0 0 0 $v-window-border-radius;
+
+ + .#{$primary-stylename}-closebox {
+ border-bottom-left-radius: 0;
+ }
+ }
}
.#{$primary-stylename}-restorebox-disabled,
.#{$primary-stylename}-maximizebox-disabled {
display: none;
+
+ + .#{$primary-stylename}-closebox {
+ width: $v-unit-size;
+ padding-right: 0;
+ border-bottom-left-radius: $v-window-border-radius;
+ }
}
.#{$primary-stylename}-maximizebox {
@@ -181,18 +219,18 @@ $v-window-animations-enabled: $v-animations-enabled !default;
position: absolute;
z-index: 2;
top: 0;
- height: $scroll-divider-width;
- background: $v-window-background-color;
+ height: 0;
+ border-top: $scroll-divider-width solid $v-window-background-color;
left: 0;
right: 0;
}
.v-panel-captionwrap:after {
- background: first-color(valo-border($strength: 0.5));
+ border-color: first-color(valo-border($strength: 0.5));
}
.v-panel-content:before {
- background: $v-window-background-color;
+ border-color: $v-window-background-color;
}
}
}
@@ -234,15 +272,10 @@ $v-window-animations-enabled: $v-animations-enabled !default;
}
-
-
+ .#{$primary-stylename}-top-toolbar,
.#{$primary-stylename}-bottom-toolbar {
- padding: round($v-unit-size/5) round($v-unit-size/3);
- @include linear-gradient(to bottom, darken($v-background-color, valo-gradient-opacity($v-gradient)/2) 0, $v-background-color round($v-unit-size/10), $fallback: $v-background-color);
- border-top: valo-border($strength: 0.5);
-
- .v-expand {
- overflow: visible;
+ > .v-widget {
+ vertical-align: top;
}
.v-label {
@@ -254,10 +287,58 @@ $v-window-animations-enabled: $v-animations-enabled !default;
}
}
+ .#{$primary-stylename}-top-toolbar {
+ &.v-layout {
+ padding: round($v-unit-size/5) round($v-unit-size/3);
+ position: relative;
+ z-index: 2;
+ border-top: valo-border($strength: 0.5);
+ border-bottom: valo-border($strength: 0.5);
+ background-color: $v-background-color;
+ }
+
+ &.v-menubar {
+ margin: round($v-unit-size/3) round($v-unit-size/3) round($v-unit-size/6);
+ }
+
+ &.v-menubar-borderless {
+ padding-left: round($v-unit-size/6);
+ padding-right: round($v-unit-size/6);
+ margin: round($v-unit-size/6) - first-number($v-border) 0;
+ }
+ }
+
+ .#{$primary-stylename}-bottom-toolbar.v-layout {
+ padding: round($v-unit-size/5) round($v-unit-size/3);
+ @include linear-gradient(to bottom, darken($v-background-color, valo-gradient-opacity($v-gradient)/2) 0, $v-background-color round($v-unit-size/10), $fallback: $v-background-color);
+ border-top: valo-border($strength: 0.5);
+ border-radius: 0 0 $v-border-radius $v-border-radius;
+ }
+
+ .v-margin-left.v-margin-right.v-margin-top {
+ .#{$primary-stylename}-top-toolbar {
+ &.v-layout {
+ @include box-sizing(content-box);
+ margin: round($v-unit-size/-3) round($v-unit-size/-3) 0;
+ }
+
+ &.v-menubar {
+ margin: 0;
+ }
+
+ &.v-menubar-borderless {
+ margin: round($v-unit-size/6) - round($v-unit-size/3) round($v-unit-size/6) - round($v-unit-size/3) 0;
+ padding: 0;
+ }
+ }
+ }
+
.v-margin-left.v-margin-right.v-margin-bottom {
.#{$primary-stylename}-bottom-toolbar {
- margin: 0 round($v-unit-size/-3) round($v-unit-size/-3);
- @include box-sizing(content-box);
+ &.v-layout {
+ @include box-sizing(content-box);
+ margin: 0 round($v-unit-size/-3) round($v-unit-size/-3);
+ }
}
}
diff --git a/WebContent/VAADIN/themes/valo/fonts/_fonts.scss b/WebContent/VAADIN/themes/valo/fonts/_fonts.scss
index 43a275bac8..b33e14d5d2 100644
--- a/WebContent/VAADIN/themes/valo/fonts/_fonts.scss
+++ b/WebContent/VAADIN/themes/valo/fonts/_fonts.scss
@@ -6,19 +6,19 @@
@import "lora/lora";
-@mixin valo-fonts {
- $valo-fonts-pathPrefix: null;
- @if $v-relative-paths == false {
- $valo-fonts-pathPrefix: "../valo/fonts/";
- }
-
- // Font Awesome
- @include valo-icon-font(FontAwesome, #{$valo-fonts-pathPrefix}font-awesome/fontawesome-webfont);
+$fontawesome-pathPrefix: null;
+
+@if $v-relative-paths == true {
+ $fontawesome-pathPrefix: "../../../";
}
+@mixin valo-fonts {
+ // Font Awesome icons from the Base theme
+ @include v-font(FontAwesome, "#{$fontawesome-pathPrefix}../base/fonts/fontawesome-webfont");
+}
-@mixin valo-icon-font($font-family, $file-name) {
+@mixin v-font($font-family, $file-name) {
@include font-face($font-family, $file-name);
.#{$font-family} {
@@ -34,6 +34,12 @@
}
+@mixin font($font-family, $file-name) {
+ @warn "The 'font' mixin is DEPRECATED. You should use the corresponding 'v-font' mixin instead.";
+ @include v-font($font-family, $file-name);
+}
+
+
// Include directly to avoid trapping inside a parent selector
// TODO move inside the theme main mixin once we can use Sass 3.3 (@at-root)
diff --git a/WebContent/VAADIN/themes/valo/fonts/font-awesome/fontawesome-webfont.eot b/WebContent/VAADIN/themes/valo/fonts/font-awesome/fontawesome-webfont.eot
deleted file mode 100644
index 7c79c6a6bc..0000000000
--- a/WebContent/VAADIN/themes/valo/fonts/font-awesome/fontawesome-webfont.eot
+++ /dev/null
Binary files differ
diff --git a/WebContent/VAADIN/themes/valo/fonts/font-awesome/fontawesome-webfont.svg b/WebContent/VAADIN/themes/valo/fonts/font-awesome/fontawesome-webfont.svg
deleted file mode 100644
index 45fdf33830..0000000000
--- a/WebContent/VAADIN/themes/valo/fonts/font-awesome/fontawesome-webfont.svg
+++ /dev/null
@@ -1,414 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg xmlns="http://www.w3.org/2000/svg">
-<metadata></metadata>
-<defs>
-<font id="fontawesomeregular" horiz-adv-x="1536" >
-<font-face units-per-em="1792" ascent="1536" descent="-256" />
-<missing-glyph horiz-adv-x="448" />
-<glyph unicode=" " horiz-adv-x="448" />
-<glyph unicode="&#x09;" horiz-adv-x="448" />
-<glyph unicode="&#xa0;" horiz-adv-x="448" />
-<glyph unicode="&#xa8;" horiz-adv-x="1792" />
-<glyph unicode="&#xa9;" horiz-adv-x="1792" />
-<glyph unicode="&#xae;" horiz-adv-x="1792" />
-<glyph unicode="&#xb4;" horiz-adv-x="1792" />
-<glyph unicode="&#xc6;" horiz-adv-x="1792" />
-<glyph unicode="&#x2000;" horiz-adv-x="768" />
-<glyph unicode="&#x2001;" />
-<glyph unicode="&#x2002;" horiz-adv-x="768" />
-<glyph unicode="&#x2003;" />
-<glyph unicode="&#x2004;" horiz-adv-x="512" />
-<glyph unicode="&#x2005;" horiz-adv-x="384" />
-<glyph unicode="&#x2006;" horiz-adv-x="256" />
-<glyph unicode="&#x2007;" horiz-adv-x="256" />
-<glyph unicode="&#x2008;" horiz-adv-x="192" />
-<glyph unicode="&#x2009;" horiz-adv-x="307" />
-<glyph unicode="&#x200a;" horiz-adv-x="85" />
-<glyph unicode="&#x202f;" horiz-adv-x="307" />
-<glyph unicode="&#x205f;" horiz-adv-x="384" />
-<glyph unicode="&#x2122;" horiz-adv-x="1792" />
-<glyph unicode="&#x221e;" horiz-adv-x="1792" />
-<glyph unicode="&#x2260;" horiz-adv-x="1792" />
-<glyph unicode="&#xe000;" horiz-adv-x="500" d="M0 0z" />
-<glyph unicode="&#xf000;" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" />
-<glyph unicode="&#xf001;" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf002;" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
-<glyph unicode="&#xf003;" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf004;" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" />
-<glyph unicode="&#xf005;" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" />
-<glyph unicode="&#xf006;" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
-<glyph unicode="&#xf007;" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
-<glyph unicode="&#xf008;" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf009;" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
-<glyph unicode="&#xf00a;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf00b;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf00c;" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" />
-<glyph unicode="&#xf00d;" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" />
-<glyph unicode="&#xf00e;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
-<glyph unicode="&#xf010;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " />
-<glyph unicode="&#xf011;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" />
-<glyph unicode="&#xf012;" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf013;" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" />
-<glyph unicode="&#xf014;" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf015;" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" />
-<glyph unicode="&#xf016;" horiz-adv-x="1280" d="M128 0h1024v768h-416q-40 0 -68 28t-28 68v416h-512v-1280zM768 896h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1280 864v-896q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h640q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88z " />
-<glyph unicode="&#xf017;" d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf018;" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" />
-<glyph unicode="&#xf019;" horiz-adv-x="1664" d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" />
-<glyph unicode="&#xf01a;" d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf01b;" d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf01c;" d="M1023 576h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8t-2.5 -8h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" />
-<glyph unicode="&#xf01d;" d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf01e;" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9 l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" />
-<glyph unicode="&#xf021;" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" />
-<glyph unicode="&#xf022;" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 t47 -113z" />
-<glyph unicode="&#xf023;" horiz-adv-x="1152" d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf024;" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf025;" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" />
-<glyph unicode="&#xf026;" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" />
-<glyph unicode="&#xf027;" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" />
-<glyph unicode="&#xf028;" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" />
-<glyph unicode="&#xf029;" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" />
-<glyph unicode="&#xf02a;" horiz-adv-x="1792" d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" />
-<glyph unicode="&#xf02b;" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" />
-<glyph unicode="&#xf02c;" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" />
-<glyph unicode="&#xf02d;" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
-<glyph unicode="&#xf02e;" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
-<glyph unicode="&#xf02f;" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" />
-<glyph unicode="&#xf030;" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
-<glyph unicode="&#xf031;" horiz-adv-x="1664" d="M725 977l-170 -450q73 -1 153.5 -2t119 -1.5t52.5 -0.5l29 2q-32 95 -92 241q-53 132 -92 211zM21 -128h-21l2 79q22 7 80 18q89 16 110 31q20 16 48 68l237 616l280 724h75h53l11 -21l205 -480q103 -242 124 -297q39 -102 96 -235q26 -58 65 -164q24 -67 65 -149 q22 -49 35 -57q22 -19 69 -23q47 -6 103 -27q6 -39 6 -57q0 -14 -1 -26q-80 0 -192 8q-93 8 -189 8q-79 0 -135 -2l-200 -11l-58 -2q0 45 4 78l131 28q56 13 68 23q12 12 12 27t-6 32l-47 114l-92 228l-450 2q-29 -65 -104 -274q-23 -64 -23 -84q0 -31 17 -43 q26 -21 103 -32q3 0 13.5 -2t30 -5t40.5 -6q1 -28 1 -58q0 -17 -2 -27q-66 0 -349 20l-48 -8q-81 -14 -167 -14z" />
-<glyph unicode="&#xf032;" horiz-adv-x="1408" d="M555 15q76 -32 140 -32q131 0 216 41t122 113q38 70 38 181q0 114 -41 180q-58 94 -141 126q-80 32 -247 32q-74 0 -101 -10v-144l-1 -173l3 -270q0 -15 12 -44zM541 761q43 -7 109 -7q175 0 264 65t89 224q0 112 -85 187q-84 75 -255 75q-52 0 -130 -13q0 -44 2 -77 q7 -122 6 -279l-1 -98q0 -43 1 -77zM0 -128l2 94q45 9 68 12q77 12 123 31q17 27 21 51q9 66 9 194l-2 497q-5 256 -9 404q-1 87 -11 109q-1 4 -12 12q-18 12 -69 15q-30 2 -114 13l-4 83l260 6l380 13l45 1q5 0 14 0.5t14 0.5q1 0 21.5 -0.5t40.5 -0.5h74q88 0 191 -27 q43 -13 96 -39q57 -29 102 -76q44 -47 65 -104t21 -122q0 -70 -32 -128t-95 -105q-26 -20 -150 -77q177 -41 267 -146q92 -106 92 -236q0 -76 -29 -161q-21 -62 -71 -117q-66 -72 -140 -108q-73 -36 -203 -60q-82 -15 -198 -11l-197 4q-84 2 -298 -11q-33 -3 -272 -11z" />
-<glyph unicode="&#xf033;" horiz-adv-x="1024" d="M0 -126l17 85q4 1 77 20q76 19 116 39q29 37 41 101l27 139l56 268l12 64q8 44 17 84.5t16 67t12.5 46.5t9 30.5t3.5 11.5l29 157l16 63l22 135l8 50v38q-41 22 -144 28q-28 2 -38 4l19 103l317 -14q39 -2 73 -2q66 0 214 9q33 2 68 4.5t36 2.5q-2 -19 -6 -38 q-7 -29 -13 -51q-55 -19 -109 -31q-64 -16 -101 -31q-12 -31 -24 -88q-9 -44 -13 -82q-44 -199 -66 -306l-61 -311l-38 -158l-43 -235l-12 -45q-2 -7 1 -27q64 -15 119 -21q36 -5 66 -10q-1 -29 -7 -58q-7 -31 -9 -41q-18 0 -23 -1q-24 -2 -42 -2q-9 0 -28 3q-19 4 -145 17 l-198 2q-41 1 -174 -11q-74 -7 -98 -9z" />
-<glyph unicode="&#xf034;" horiz-adv-x="1792" d="M81 1407l54 -27q20 -5 211 -5h130l19 3l115 1l215 -1h293l34 -2q14 -1 28 7t21 16l7 8l42 1q15 0 28 -1v-104.5t1 -131.5l1 -100l-1 -58q0 -32 -4 -51q-39 -15 -68 -18q-25 43 -54 128q-8 24 -15.5 62.5t-11.5 65.5t-6 29q-13 15 -27 19q-7 2 -42.5 2t-103.5 -1t-111 -1 q-34 0 -67 -5q-10 -97 -8 -136l1 -152v-332l3 -359l-1 -147q-1 -46 11 -85q49 -25 89 -32q2 0 18 -5t44 -13t43 -12q30 -8 50 -18q5 -45 5 -50q0 -10 -3 -29q-14 -1 -34 -1q-110 0 -187 10q-72 8 -238 8q-88 0 -233 -14q-48 -4 -70 -4q-2 22 -2 26l-1 26v9q21 33 79 49 q139 38 159 50q9 21 12 56q8 192 6 433l-5 428q-1 62 -0.5 118.5t0.5 102.5t-2 57t-6 15q-6 5 -14 6q-38 6 -148 6q-43 0 -100 -13.5t-73 -24.5q-13 -9 -22 -33t-22 -75t-24 -84q-6 -19 -19.5 -32t-20.5 -13q-44 27 -56 44v297v86zM1744 128q33 0 42 -18.5t-11 -44.5 l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80z" />
-<glyph unicode="&#xf035;" d="M81 1407l54 -27q20 -5 211 -5h130l19 3l115 1l446 -1h318l34 -2q14 -1 28 7t21 16l7 8l42 1q15 0 28 -1v-104.5t1 -131.5l1 -100l-1 -58q0 -32 -4 -51q-39 -15 -68 -18q-25 43 -54 128q-8 24 -15.5 62.5t-11.5 65.5t-6 29q-13 15 -27 19q-7 2 -58.5 2t-138.5 -1t-128 -1 q-94 0 -127 -5q-10 -97 -8 -136l1 -152v52l3 -359l-1 -147q-1 -46 11 -85q49 -25 89 -32q2 0 18 -5t44 -13t43 -12q30 -8 50 -18q5 -45 5 -50q0 -10 -3 -29q-14 -1 -34 -1q-110 0 -187 10q-72 8 -238 8q-82 0 -233 -13q-45 -5 -70 -5q-2 22 -2 26l-1 26v9q21 33 79 49 q139 38 159 50q9 21 12 56q6 137 6 433l-5 44q0 265 -2 278q-2 11 -6 15q-6 5 -14 6q-38 6 -148 6q-50 0 -168.5 -14t-132.5 -24q-13 -9 -22 -33t-22 -75t-24 -84q-6 -19 -19.5 -32t-20.5 -13q-44 27 -56 44v297v86zM1505 113q26 -20 26 -49t-26 -49l-162 -126 q-26 -20 -44.5 -11t-18.5 42v80h-1024v-80q0 -33 -18.5 -42t-44.5 11l-162 126q-26 20 -26 49t26 49l162 126q26 20 44.5 11t18.5 -42v-80h1024v80q0 33 18.5 42t44.5 -11z" />
-<glyph unicode="&#xf036;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf037;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf038;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf039;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf03a;" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" />
-<glyph unicode="&#xf03b;" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
-<glyph unicode="&#xf03c;" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
-<glyph unicode="&#xf03d;" horiz-adv-x="1792" d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 q39 -17 39 -59z" />
-<glyph unicode="&#xf03e;" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf040;" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" />
-<glyph unicode="&#xf041;" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" />
-<glyph unicode="&#xf042;" d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf043;" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" />
-<glyph unicode="&#xf044;" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" />
-<glyph unicode="&#xf045;" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" />
-<glyph unicode="&#xf046;" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 q24 -24 24 -57t-24 -57z" />
-<glyph unicode="&#xf047;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
-<glyph unicode="&#xf048;" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19z" />
-<glyph unicode="&#xf049;" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710 q19 19 32 13t13 -32v-710q4 11 13 19z" />
-<glyph unicode="&#xf04a;" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19z" />
-<glyph unicode="&#xf04b;" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" />
-<glyph unicode="&#xf04c;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf04d;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf04e;" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
-<glyph unicode="&#xf050;" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
-<glyph unicode="&#xf051;" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19z" />
-<glyph unicode="&#xf052;" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" />
-<glyph unicode="&#xf053;" horiz-adv-x="1152" d="M742 -37l-652 651q-37 37 -37 90.5t37 90.5l652 651q37 37 90.5 37t90.5 -37l75 -75q37 -37 37 -90.5t-37 -90.5l-486 -486l486 -485q37 -38 37 -91t-37 -90l-75 -75q-37 -37 -90.5 -37t-90.5 37z" />
-<glyph unicode="&#xf054;" horiz-adv-x="1152" d="M1099 704q0 -52 -37 -91l-652 -651q-37 -37 -90 -37t-90 37l-76 75q-37 39 -37 91q0 53 37 90l486 486l-486 485q-37 39 -37 91q0 53 37 90l76 75q36 38 90 38t90 -38l652 -651q37 -37 37 -90z" />
-<glyph unicode="&#xf055;" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf056;" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" />
-<glyph unicode="&#xf057;" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf058;" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf059;" d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf05a;" d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf05b;" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf05c;" d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf05d;" d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf05e;" d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" />
-<glyph unicode="&#xf060;" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" />
-<glyph unicode="&#xf061;" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" />
-<glyph unicode="&#xf062;" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" />
-<glyph unicode="&#xf063;" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
-<glyph unicode="&#xf064;" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" />
-<glyph unicode="&#xf065;" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf066;" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" />
-<glyph unicode="&#xf067;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf068;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf069;" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" />
-<glyph unicode="&#xf06a;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" />
-<glyph unicode="&#xf06b;" d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf06c;" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" />
-<glyph unicode="&#xf06d;" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" />
-<glyph unicode="&#xf06e;" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" />
-<glyph unicode="&#xf070;" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z " />
-<glyph unicode="&#xf071;" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" />
-<glyph unicode="&#xf072;" horiz-adv-x="1408" d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" />
-<glyph unicode="&#xf073;" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
-<glyph unicode="&#xf074;" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
-<glyph unicode="&#xf075;" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" />
-<glyph unicode="&#xf076;" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf077;" horiz-adv-x="1664" d="M1611 320q0 -53 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-486 485l-486 -485q-36 -38 -90 -38t-90 38l-75 75q-38 36 -38 90q0 53 38 91l651 651q37 37 90 37q52 0 91 -37l650 -651q38 -38 38 -91z" />
-<glyph unicode="&#xf078;" horiz-adv-x="1664" d="M1611 832q0 -53 -37 -90l-651 -651q-38 -38 -91 -38q-54 0 -90 38l-651 651q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l486 -486l486 486q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
-<glyph unicode="&#xf079;" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z " />
-<glyph unicode="&#xf07a;" horiz-adv-x="1664" d="M640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5 l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5 t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf07b;" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
-<glyph unicode="&#xf07c;" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" />
-<glyph unicode="&#xf07d;" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" />
-<glyph unicode="&#xf07e;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
-<glyph unicode="&#xf080;" horiz-adv-x="1920" d="M512 512v-384h-256v384h256zM896 1024v-896h-256v896h256zM1280 768v-640h-256v640h256zM1664 1152v-1024h-256v1024h256zM1792 32v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5z M1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf081;" d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf082;" d="M1307 618l23 219h-198v109q0 49 15.5 68.5t71.5 19.5h110v219h-175q-152 0 -218 -72t-66 -213v-131h-131v-219h131v-635h262v635h175zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960 q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf083;" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" />
-<glyph unicode="&#xf084;" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" />
-<glyph unicode="&#xf085;" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" />
-<glyph unicode="&#xf086;" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" />
-<glyph unicode="&#xf087;" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" />
-<glyph unicode="&#xf088;" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163z" />
-<glyph unicode="&#xf089;" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" />
-<glyph unicode="&#xf08a;" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 q224 0 351 -124t127 -344z" />
-<glyph unicode="&#xf08b;" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" />
-<glyph unicode="&#xf08c;" d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf08d;" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" />
-<glyph unicode="&#xf08e;" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf090;" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf091;" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf092;" d="M394 184q-8 -9 -20 3q-13 11 -4 19q8 9 20 -3q12 -11 4 -19zM352 245q9 -12 0 -19q-8 -6 -17 7t0 18q9 7 17 -6zM291 305q-5 -7 -13 -2q-10 5 -7 12q3 5 13 2q10 -5 7 -12zM322 271q-6 -7 -16 3q-9 11 -2 16q6 6 16 -3q9 -11 2 -16zM451 159q-4 -12 -19 -6q-17 4 -13 15 t19 7q16 -5 13 -16zM514 154q0 -11 -16 -11q-17 -2 -17 11q0 11 16 11q17 2 17 -11zM572 164q2 -10 -14 -14t-18 8t14 15q16 2 18 -9zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39 t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103 q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5 h-224q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf093;" horiz-adv-x="1664" d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" />
-<glyph unicode="&#xf094;" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5z" />
-<glyph unicode="&#xf095;" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5 q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174 q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" />
-<glyph unicode="&#xf096;" horiz-adv-x="1408" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf097;" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
-<glyph unicode="&#xf098;" d="M1280 343q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5 t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5q6 -2 30 -11t33 -12.5 t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf099;" horiz-adv-x="1664" d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" />
-<glyph unicode="&#xf09a;" horiz-adv-x="768" d="M511 980h257l-30 -284h-227v-824h-341v824h-170v284h170v171q0 182 86 275.5t283 93.5h227v-284h-142q-39 0 -62.5 -6.5t-34 -23.5t-13.5 -34.5t-3 -49.5v-142z" />
-<glyph unicode="&#xf09b;" d="M1536 640q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5 q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23 q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf09c;" horiz-adv-x="1664" d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 t316.5 -131.5t131.5 -316.5z" />
-<glyph unicode="&#xf09d;" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
-<glyph unicode="&#xf09e;" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 q187 -186 294 -425.5t120 -501.5z" />
-<glyph unicode="&#xf0a0;" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" />
-<glyph unicode="&#xf0a1;" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" />
-<glyph unicode="&#xf0a2;" horiz-adv-x="1664" d="M848 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM183 128h1298q-164 181 -246.5 411.5t-82.5 484.5q0 256 -320 256t-320 -256q0 -254 -82.5 -484.5t-246.5 -411.5zM1664 128q0 -52 -38 -90t-90 -38 h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q190 161 287 397.5t97 498.5q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5z" />
-<glyph unicode="&#xf0a3;" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" />
-<glyph unicode="&#xf0a4;" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" />
-<glyph unicode="&#xf0a5;" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576 q-50 0 -89 -38.5t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45 t45 -19t45 19t19 45zM1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128 q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" />
-<glyph unicode="&#xf0a6;" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" />
-<glyph unicode="&#xf0a7;" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" />
-<glyph unicode="&#xf0a8;" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf0a9;" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf0aa;" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf0ab;" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf0ac;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" />
-<glyph unicode="&#xf0ad;" horiz-adv-x="1664" d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" />
-<glyph unicode="&#xf0ae;" horiz-adv-x="1792" d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0b0;" horiz-adv-x="1408" d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" />
-<glyph unicode="&#xf0b1;" horiz-adv-x="1792" d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf0b2;" d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z " />
-<glyph unicode="&#xf0c0;" horiz-adv-x="1920" d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" />
-<glyph unicode="&#xf0c1;" horiz-adv-x="1664" d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" />
-<glyph unicode="&#xf0c2;" horiz-adv-x="1920" d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z " />
-<glyph unicode="&#xf0c3;" horiz-adv-x="1664" d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" />
-<glyph unicode="&#xf0c4;" horiz-adv-x="1792" d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
-<glyph unicode="&#xf0c5;" horiz-adv-x="1792" d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" />
-<glyph unicode="&#xf0c6;" horiz-adv-x="1408" d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 z" />
-<glyph unicode="&#xf0c7;" d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" />
-<glyph unicode="&#xf0c8;" d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf0c9;" d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0ca;" horiz-adv-x="1792" d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
-<glyph unicode="&#xf0cb;" horiz-adv-x="1792" d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5 t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
-<glyph unicode="&#xf0cc;" horiz-adv-x="1792" d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 97 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" />
-<glyph unicode="&#xf0cd;" d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" />
-<glyph unicode="&#xf0ce;" horiz-adv-x="1664" d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 z" />
-<glyph unicode="&#xf0d0;" horiz-adv-x="1664" d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
-<glyph unicode="&#xf0d1;" horiz-adv-x="1792" d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0d2;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf0d3;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" />
-<glyph unicode="&#xf0d4;" d="M678 -57q0 -38 -10 -71h-380q-95 0 -171.5 56.5t-103.5 147.5q24 45 69 77.5t100 49.5t107 24t107 7q32 0 49 -2q6 -4 30.5 -21t33 -23t31 -23t32 -25.5t27.5 -25.5t26.5 -29.5t21 -30.5t17.5 -34.5t9.5 -36t4.5 -40.5zM385 294q-234 -7 -385 -85v433q103 -118 273 -118 q32 0 70 5q-21 -61 -21 -86q0 -67 63 -149zM558 805q0 -100 -43.5 -160.5t-140.5 -60.5q-51 0 -97 26t-78 67.5t-56 93.5t-35.5 104t-11.5 99q0 96 51.5 165t144.5 69q66 0 119 -41t84 -104t47 -130t16 -128zM1536 896v-736q0 -119 -84.5 -203.5t-203.5 -84.5h-468 q39 73 39 157q0 66 -22 122.5t-55.5 93t-72 71t-72 59.5t-55.5 54.5t-22 59.5q0 36 23 68t56 61.5t65.5 64.5t55.5 93t23 131t-26.5 145.5t-75.5 118.5q-6 6 -14 11t-12.5 7.5t-10 9.5t-10.5 17h135l135 64h-437q-138 0 -244.5 -38.5t-182.5 -133.5q0 126 81 213t207 87h960 q119 0 203.5 -84.5t84.5 -203.5v-96h-256v256h-128v-256h-256v-128h256v-256h128v256h256z" />
-<glyph unicode="&#xf0d5;" horiz-adv-x="1664" d="M876 71q0 21 -4.5 40.5t-9.5 36t-17.5 34.5t-21 30.5t-26.5 29.5t-27.5 25.5t-32 25.5t-31 23t-33 23t-30.5 21q-17 2 -50 2q-54 0 -106 -7t-108 -25t-98 -46t-69 -75t-27 -107q0 -68 35.5 -121.5t93 -84t120.5 -45.5t127 -15q59 0 112.5 12.5t100.5 39t74.5 73.5 t27.5 110zM756 933q0 60 -16.5 127.5t-47 130.5t-84 104t-119.5 41q-93 0 -144 -69t-51 -165q0 -47 11.5 -99t35.5 -104t56 -93.5t78 -67.5t97 -26q97 0 140.5 60.5t43.5 160.5zM625 1408h437l-135 -79h-135q71 -45 110 -126t39 -169q0 -74 -23 -131.5t-56 -92.5t-66 -64.5 t-56 -61t-23 -67.5q0 -26 16.5 -51t43 -48t58.5 -48t64 -55.5t58.5 -66t43 -85t16.5 -106.5q0 -160 -140 -282q-152 -131 -420 -131q-59 0 -119.5 10t-122 33.5t-108.5 58t-77 89t-30 121.5q0 61 37 135q32 64 96 110.5t145 71t155 36t150 13.5q-64 83 -64 149q0 12 2 23.5 t5 19.5t8 21.5t7 21.5q-40 -5 -70 -5q-149 0 -255.5 98t-106.5 246q0 140 95 250.5t234 141.5q94 20 187 20zM1664 1152v-128h-256v-256h-128v256h-256v128h256v256h128v-256h256z" />
-<glyph unicode="&#xf0d6;" horiz-adv-x="1920" d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0d7;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0d8;" horiz-adv-x="1024" d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
-<glyph unicode="&#xf0d9;" horiz-adv-x="640" d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" />
-<glyph unicode="&#xf0da;" horiz-adv-x="640" d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" />
-<glyph unicode="&#xf0db;" horiz-adv-x="1664" d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf0dc;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
-<glyph unicode="&#xf0dd;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0de;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
-<glyph unicode="&#xf0e0;" horiz-adv-x="1792" d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" />
-<glyph unicode="&#xf0e1;" d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" />
-<glyph unicode="&#xf0e2;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" />
-<glyph unicode="&#xf0e3;" horiz-adv-x="1792" d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" />
-<glyph unicode="&#xf0e4;" horiz-adv-x="1792" d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
-<glyph unicode="&#xf0e5;" horiz-adv-x="1792" d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
-<glyph unicode="&#xf0e6;" horiz-adv-x="1792" d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" />
-<glyph unicode="&#xf0e7;" horiz-adv-x="896" d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" />
-<glyph unicode="&#xf0e8;" horiz-adv-x="1792" d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 z" />
-<glyph unicode="&#xf0e9;" horiz-adv-x="1664" d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" />
-<glyph unicode="&#xf0ea;" horiz-adv-x="1792" d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" />
-<glyph unicode="&#xf0eb;" horiz-adv-x="1024" d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" />
-<glyph unicode="&#xf0ec;" horiz-adv-x="1792" d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
-<glyph unicode="&#xf0ed;" horiz-adv-x="1920" d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
-<glyph unicode="&#xf0ee;" horiz-adv-x="1920" d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
-<glyph unicode="&#xf0f0;" horiz-adv-x="1408" d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" />
-<glyph unicode="&#xf0f1;" horiz-adv-x="1408" d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" />
-<glyph unicode="&#xf0f2;" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 t66 -158z" />
-<glyph unicode="&#xf0f3;" horiz-adv-x="1664" d="M848 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1664 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q190 161 287 397.5t97 498.5 q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5z" />
-<glyph unicode="&#xf0f4;" horiz-adv-x="1920" d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" />
-<glyph unicode="&#xf0f5;" horiz-adv-x="1408" d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0f6;" horiz-adv-x="1280" d="M1024 352v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1024 608v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM128 0h1024v768h-416q-40 0 -68 28t-28 68v416h-512v-1280z M768 896h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1280 864v-896q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h640q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88z" />
-<glyph unicode="&#xf0f7;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0f8;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0f9;" horiz-adv-x="1920" d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0fa;" horiz-adv-x="1792" d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" />
-<glyph unicode="&#xf0fb;" horiz-adv-x="1920" d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93z" />
-<glyph unicode="&#xf0fc;" horiz-adv-x="1664" d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
-<glyph unicode="&#xf0fd;" d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf0fe;" d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf100;" horiz-adv-x="1024" d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" />
-<glyph unicode="&#xf101;" horiz-adv-x="1024" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
-<glyph unicode="&#xf102;" horiz-adv-x="1152" d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
-<glyph unicode="&#xf103;" horiz-adv-x="1152" d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
-<glyph unicode="&#xf104;" horiz-adv-x="640" d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
-<glyph unicode="&#xf105;" horiz-adv-x="640" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
-<glyph unicode="&#xf106;" horiz-adv-x="1152" d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
-<glyph unicode="&#xf107;" horiz-adv-x="1152" d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
-<glyph unicode="&#xf108;" horiz-adv-x="1920" d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf109;" horiz-adv-x="1920" d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" />
-<glyph unicode="&#xf10a;" horiz-adv-x="1152" d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf10b;" horiz-adv-x="768" d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
-<glyph unicode="&#xf10c;" d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf10d;" horiz-adv-x="1664" d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" />
-<glyph unicode="&#xf10e;" horiz-adv-x="1664" d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" />
-<glyph unicode="&#xf110;" horiz-adv-x="1568" d="M496 192q0 -60 -42.5 -102t-101.5 -42q-60 0 -102 42t-42 102t42 102t102 42q59 0 101.5 -42t42.5 -102zM928 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -66 -47 -113t-113 -47t-113 47t-47 113 t47 113t113 47t113 -47t47 -113zM1360 192q0 -46 -33 -79t-79 -33t-79 33t-33 79t33 79t79 33t79 -33t33 -79zM528 1088q0 -73 -51.5 -124.5t-124.5 -51.5t-124.5 51.5t-51.5 124.5t51.5 124.5t124.5 51.5t124.5 -51.5t51.5 -124.5zM992 1280q0 -80 -56 -136t-136 -56 t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1536 640q0 -40 -28 -68t-68 -28t-68 28t-28 68t28 68t68 28t68 -28t28 -68zM1328 1088q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5z" />
-<glyph unicode="&#xf111;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf112;" horiz-adv-x="1792" d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" />
-<glyph unicode="&#xf113;" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" />
-<glyph unicode="&#xf114;" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
-<glyph unicode="&#xf115;" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " />
-<glyph unicode="&#xf116;" horiz-adv-x="1792" />
-<glyph unicode="&#xf117;" horiz-adv-x="1792" />
-<glyph unicode="&#xf118;" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf119;" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf11a;" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf11b;" horiz-adv-x="1920" d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" />
-<glyph unicode="&#xf11c;" horiz-adv-x="1920" d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" />
-<glyph unicode="&#xf11d;" horiz-adv-x="1792" d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
-<glyph unicode="&#xf11e;" horiz-adv-x="1792" d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
-<glyph unicode="&#xf120;" horiz-adv-x="1664" d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 t9 -23z" />
-<glyph unicode="&#xf121;" horiz-adv-x="1920" d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" />
-<glyph unicode="&#xf122;" horiz-adv-x="1792" d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" />
-<glyph unicode="&#xf123;" horiz-adv-x="1664" d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" />
-<glyph unicode="&#xf124;" horiz-adv-x="1408" d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" />
-<glyph unicode="&#xf125;" horiz-adv-x="1664" d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf126;" horiz-adv-x="1024" d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" />
-<glyph unicode="&#xf127;" horiz-adv-x="1664" d="M439 265l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
-<glyph unicode="&#xf128;" horiz-adv-x="1024" d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" />
-<glyph unicode="&#xf129;" horiz-adv-x="640" d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf12a;" horiz-adv-x="640" d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" />
-<glyph unicode="&#xf12b;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1534 846v-206h-514l-3 27 q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80 h126z" />
-<glyph unicode="&#xf12c;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1536 -50v-206h-514l-4 27 q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126z" />
-<glyph unicode="&#xf12d;" horiz-adv-x="1920" d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" />
-<glyph unicode="&#xf12e;" horiz-adv-x="1664" d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" />
-<glyph unicode="&#xf130;" horiz-adv-x="1152" d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" />
-<glyph unicode="&#xf131;" horiz-adv-x="1408" d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" />
-<glyph unicode="&#xf132;" horiz-adv-x="1280" d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf133;" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
-<glyph unicode="&#xf134;" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" />
-<glyph unicode="&#xf135;" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
-<glyph unicode="&#xf136;" horiz-adv-x="1792" d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" />
-<glyph unicode="&#xf137;" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf138;" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf139;" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf13a;" d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf13b;" horiz-adv-x="1408" d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" />
-<glyph unicode="&#xf13c;" horiz-adv-x="1792" d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" />
-<glyph unicode="&#xf13d;" horiz-adv-x="1792" d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf13e;" horiz-adv-x="1152" d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 v-320h736z" />
-<glyph unicode="&#xf140;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf141;" horiz-adv-x="1408" d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf142;" horiz-adv-x="384" d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf143;" d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10 t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf144;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 q16 -8 32 -8q17 0 32 9z" />
-<glyph unicode="&#xf145;" horiz-adv-x="1792" d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" />
-<glyph unicode="&#xf146;" d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
-<glyph unicode="&#xf147;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf148;" horiz-adv-x="1024" d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" />
-<glyph unicode="&#xf149;" horiz-adv-x="1024" d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" />
-<glyph unicode="&#xf14a;" d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf14b;" d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf14c;" d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf14d;" d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf14e;" d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf150;" d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf151;" d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf152;" d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf153;" horiz-adv-x="1024" d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" />
-<glyph unicode="&#xf154;" horiz-adv-x="1024" d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" />
-<glyph unicode="&#xf155;" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" />
-<glyph unicode="&#xf156;" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf157;" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" />
-<glyph unicode="&#xf158;" horiz-adv-x="1280" d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128 q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" />
-<glyph unicode="&#xf159;" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf15a;" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" />
-<glyph unicode="&#xf15b;" horiz-adv-x="1280" d="M1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h544v-544q0 -40 28 -68t68 -28h544zM1277 896h-509v509q82 -15 132 -65l312 -312q50 -50 65 -132z" />
-<glyph unicode="&#xf15c;" horiz-adv-x="1280" d="M1024 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1024 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28 t-28 68v1344q0 40 28 68t68 28h544v-544q0 -40 28 -68t68 -28h544zM1277 896h-509v509q82 -15 132 -65l312 -312q50 -50 65 -132z" />
-<glyph unicode="&#xf15d;" horiz-adv-x="1664" d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 l230 -662h70z" />
-<glyph unicode="&#xf15e;" horiz-adv-x="1664" d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 v119h121z" />
-<glyph unicode="&#xf160;" horiz-adv-x="1792" d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf161;" horiz-adv-x="1792" d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf162;" d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" />
-<glyph unicode="&#xf163;" d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" />
-<glyph unicode="&#xf164;" horiz-adv-x="1664" d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" />
-<glyph unicode="&#xf165;" horiz-adv-x="1664" d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" />
-<glyph unicode="&#xf166;" d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78l24 -69t23 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38 q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf167;" d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51 q-28 38 -28 118v175q0 80 28 117q38 51 105 51q69 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" />
-<glyph unicode="&#xf168;" horiz-adv-x="1408" d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 q25 45 64 45h241q22 0 31 -15z" />
-<glyph unicode="&#xf169;" d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf16a;" horiz-adv-x="1792" d="M1280 640q0 37 -30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54zM1792 640q0 -96 -1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58t-69.5 123 q-14 65 -21.5 147.5t-8.5 136.5t-1 150t1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150z" />
-<glyph unicode="&#xf16b;" horiz-adv-x="1792" d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" />
-<glyph unicode="&#xf16c;" horiz-adv-x="1408" d="M928 135v-151l-707 -1v151zM1169 481v-701l-1 -35v-1h-1132l-35 1h-1v736h121v-618h928v618h120zM241 393l704 -65l-13 -150l-705 65zM309 709l683 -183l-39 -146l-683 183zM472 1058l609 -360l-77 -130l-609 360zM832 1389l398 -585l-124 -85l-399 584zM1285 1536 l121 -697l-149 -26l-121 697z" />
-<glyph unicode="&#xf16d;" d="M1362 110v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5zM1078 643q0 124 -90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5 t90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5zM1362 1003v165q0 28 -20 48.5t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165q0 -29 20 -49t49 -20h174q29 0 49 20t20 49zM1536 1211v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139v1142q0 81 58 139 t139 58h1142q81 0 139 -58t58 -139z" />
-<glyph unicode="&#xf16e;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" />
-<glyph unicode="&#xf170;" d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf171;" horiz-adv-x="1408" d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" />
-<glyph unicode="&#xf172;" d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf173;" horiz-adv-x="1024" d="M390 1408h219v-388h364v-241h-364v-394q0 -136 14 -172q13 -37 52 -60q50 -31 117 -31q117 0 232 76v-242q-102 -48 -178 -65q-77 -19 -173 -19q-105 0 -186 27q-78 25 -138 75q-58 51 -79 105q-22 54 -22 161v539h-170v217q91 30 155 84q64 55 103 132q39 78 54 196z " />
-<glyph unicode="&#xf174;" d="M1123 127v181q-88 -56 -174 -56q-51 0 -88 23q-29 17 -39 45q-11 30 -11 129v295h274v181h-274v291h-164q-11 -90 -40 -147t-78 -99q-48 -40 -116 -63v-163h127v-404q0 -78 17 -121q17 -42 59 -78q43 -37 104 -57q62 -20 140 -20q67 0 129 14q57 13 134 49zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf175;" horiz-adv-x="768" d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" />
-<glyph unicode="&#xf176;" horiz-adv-x="768" d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" />
-<glyph unicode="&#xf177;" horiz-adv-x="1792" d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf178;" horiz-adv-x="1792" d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" />
-<glyph unicode="&#xf179;" horiz-adv-x="1408" d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" />
-<glyph unicode="&#xf17a;" horiz-adv-x="1664" d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" />
-<glyph unicode="&#xf17b;" horiz-adv-x="1408" d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" />
-<glyph unicode="&#xf17c;" d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18l-4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-14 -1 -7 -7l4 -2 q14 -4 18 -31q0 -3 8 2zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5 t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5 t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48 q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195 q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14 q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5 t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" />
-<glyph unicode="&#xf17d;" d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf17e;" d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" />
-<glyph unicode="&#xf180;" horiz-adv-x="1664" d="M1483 512l-587 -587q-52 -53 -127.5 -53t-128.5 53l-587 587q-53 53 -53 128t53 128l587 587q53 53 128 53t128 -53l265 -265l-398 -399l-188 188q-42 42 -99 42q-59 0 -100 -41l-120 -121q-42 -40 -42 -99q0 -58 42 -100l406 -408q30 -28 67 -37l6 -4h28q60 0 99 41 l619 619l2 -3q53 -53 53 -128t-53 -128zM1406 1138l120 -120q14 -15 14 -36t-14 -36l-730 -730q-17 -15 -37 -15v0q-4 0 -6 1q-18 2 -30 14l-407 408q-14 15 -14 36t14 35l121 120q13 15 35 15t36 -15l252 -252l574 575q15 15 36 15t36 -15z" />
-<glyph unicode="&#xf181;" d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf182;" horiz-adv-x="1280" d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
-<glyph unicode="&#xf183;" horiz-adv-x="1024" d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
-<glyph unicode="&#xf184;" d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf185;" horiz-adv-x="1792" d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" />
-<glyph unicode="&#xf186;" d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" />
-<glyph unicode="&#xf187;" horiz-adv-x="1792" d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf188;" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" />
-<glyph unicode="&#xf189;" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" />
-<glyph unicode="&#xf18a;" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" />
-<glyph unicode="&#xf18b;" d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495 q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" />
-<glyph unicode="&#xf18c;" horiz-adv-x="1408" d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5 t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56 t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -5 1 -50.5t-1 -71.5q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5 t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" />
-<glyph unicode="&#xf18d;" horiz-adv-x="1280" d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z " />
-<glyph unicode="&#xf18e;" d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf190;" d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf191;" d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf192;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5 t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf193;" horiz-adv-x="1664" d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128 q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 16 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" />
-<glyph unicode="&#xf194;" d="M1254 899q16 85 -21 132q-52 65 -187 45q-17 -3 -41 -12.5t-57.5 -30.5t-64.5 -48.5t-59.5 -70t-44.5 -91.5q80 7 113.5 -16t26.5 -99q-5 -52 -52 -143q-43 -78 -71 -99q-44 -32 -87 14q-23 24 -37.5 64.5t-19 73t-10 84t-8.5 71.5q-23 129 -34 164q-12 37 -35.5 69 t-50.5 40q-57 16 -127 -25q-54 -32 -136.5 -106t-122.5 -102v-7q16 -8 25.5 -26t21.5 -20q21 -3 54.5 8.5t58 10.5t41.5 -30q11 -18 18.5 -38.5t15 -48t12.5 -40.5q17 -46 53 -187q36 -146 57 -197q42 -99 103 -125q43 -12 85 -1.5t76 31.5q131 77 250 237 q104 139 172.5 292.5t82.5 226.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf195;" horiz-adv-x="1152" d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160 q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf196;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832 q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf197;" horiz-adv-x="1792" />
-<glyph unicode="&#xf198;" horiz-adv-x="1792" />
-<glyph unicode="&#xf199;" horiz-adv-x="1792" />
-<glyph unicode="&#xf19a;" horiz-adv-x="1792" />
-<glyph unicode="&#xf19b;" horiz-adv-x="1792" />
-<glyph unicode="&#xf19c;" horiz-adv-x="1792" />
-<glyph unicode="&#xf19d;" horiz-adv-x="1792" />
-<glyph unicode="&#xf19e;" horiz-adv-x="1792" />
-<glyph unicode="&#xf500;" horiz-adv-x="1792" />
-</font>
-</defs></svg> \ No newline at end of file
diff --git a/WebContent/VAADIN/themes/valo/fonts/font-awesome/fontawesome-webfont.ttf b/WebContent/VAADIN/themes/valo/fonts/font-awesome/fontawesome-webfont.ttf
deleted file mode 100644
index e89738de5e..0000000000
--- a/WebContent/VAADIN/themes/valo/fonts/font-awesome/fontawesome-webfont.ttf
+++ /dev/null
Binary files differ
diff --git a/WebContent/VAADIN/themes/valo/fonts/font-awesome/fontawesome-webfont.woff b/WebContent/VAADIN/themes/valo/fonts/font-awesome/fontawesome-webfont.woff
deleted file mode 100644
index 8c1748aab7..0000000000
--- a/WebContent/VAADIN/themes/valo/fonts/font-awesome/fontawesome-webfont.woff
+++ /dev/null
Binary files differ
diff --git a/WebContent/VAADIN/themes/valo/optional/_common-stylenames.scss b/WebContent/VAADIN/themes/valo/optional/_common-stylenames.scss
index 5ae20bac0d..09d29b7d9f 100644
--- a/WebContent/VAADIN/themes/valo/optional/_common-stylenames.scss
+++ b/WebContent/VAADIN/themes/valo/optional/_common-stylenames.scss
@@ -1,5 +1,5 @@
// Common styles for components
-// About 50KB of CSS output
+// About 90KB of CSS output
@import "valo-menu";
@@ -43,6 +43,14 @@
@include valo-button-borderless-style;
}
+ .v-button-borderless-colored {
+ @include valo-button-borderless-style($font-color: $v-selection-color);
+ }
+
+ .v-button-quiet {
+ @include valo-button-quiet-style;
+ }
+
.v-button-link {
@include valo-button-borderless-style;
@include valo-link-style;
@@ -60,6 +68,10 @@
@include valo-button-icon-align-right-style;
}
+ .v-button-icon-align-top {
+ @include valo-button-icon-align-top-style;
+ }
+
.v-button-icon-only {
width: $v-unit-size;
padding: 0;
@@ -67,6 +79,14 @@
&.v-button-small {
width: $v-unit-size--small;
}
+
+ &.v-button-large {
+ width: $v-unit-size--large;
+ }
+
+ .v-button-caption {
+ display: none;
+ }
}
.v-link-small {
@@ -77,20 +97,38 @@
font-size: $v-font-size--large;
}
+ .v-tabsheet-equal-width-tabs {
+ @include valo-tabsheet-equal-width-tabs-style($flex: false);
+ }
+
+ .v-tabsheet-framed {
+ @include valo-tabsheet-framed-style;
+ }
+
.v-tabsheet-centered-tabs {
- @include valo-tabsheet-centered-tabs;
+ @include valo-tabsheet-align-tabs-style($align: center);
}
- .v-tabsheet-equal-width-tabs {
- @include valo-tabsheet-equal-width-tabs($flex: false);
+ .v-tabsheet-right-aligned-tabs {
+ @include valo-tabsheet-align-tabs-style($align: right);
}
.v-tabsheet-padded-tabbar {
- @include valo-tabsheet-padded-tabbar;
+ @include valo-tabsheet-padded-tabbar-style;
}
.v-tabsheet-icons-on-top {
- @include valo-tabsheet-icons-on-top;
+ @include valo-tabsheet-icons-on-top-style;
+ }
+
+ .v-tabsheet-compact-tabbar {
+ > .v-tabsheet-tabcontainer-compact-tabbar .v-caption {
+ line-height: 1.8;
+ }
+ }
+
+ .v-tabsheet-only-selected-closable {
+ @include valo-tabsheet-only-selected-closable-style;
}
.v-panel-borderless {
@@ -102,69 +140,92 @@
}
.v-textfield-borderless,
- .v-textarea-borderless {
+ .v-textarea-borderless,
+ .v-datefield-borderless .v-datefield-textfield,
+ .v-filterselect-borderless .v-filterselect-input {
@include valo-textfield-borderless-style;
}
+ .v-datefield-borderless .v-datefield-button,
+ .v-filterselect-borderless .v-filterselect-button {
+ border: none;
+ }
+
.v-textfield-small {
- @include valo-textfield-style($unit-size: $v-unit-size--small);
+ @include valo-textfield-style($unit-size: $v-unit-size--small, $states: normal, $background-color: null, $border: null, $gradient: null, $bevel: null, $shadow: null);
font-size: $v-font-size--small;
}
.v-textfield-large {
- @include valo-textfield-style($unit-size: $v-unit-size--large);
+ @include valo-textfield-style($unit-size: $v-unit-size--large, $states: normal, $background-color: null, $border: null, $gradient: null, $bevel: null, $shadow: null);
font-size: $v-font-size--large;
}
- @include valo-textfield-inline-icon($stylename: inline-icon);
+ @include valo-textfield-inline-icon($stylenames: inline-icon);
+ @include valo-textfield-inline-icon($stylenames: inline-icon small, $unit-size: $v-unit-size--small, $font-size: $v-font-size--small);
+ @include valo-textfield-inline-icon($stylenames: inline-icon large, $unit-size: $v-unit-size--large, $font-size: $v-font-size--large);
.v-textarea-small {
- @include valo-textarea-style($unit-size: $v-unit-size--small);
+ @include valo-textarea-style($unit-size: $v-unit-size--small, $states: normal, $background-color: null, $border: null, $bevel: null, $shadow: null);
font-size: $v-font-size--small;
}
.v-textarea-large {
- @include valo-textarea-style($unit-size: $v-unit-size--large);
+ @include valo-textarea-style($unit-size: $v-unit-size--large, $states: normal, $background-color: null, $border: null, $bevel: null, $shadow: null);
font-size: $v-font-size--large;
}
.v-textfield-align-right,
- .v-textarea-align-right {
+ .v-textarea-align-right,
+ .v-datefield-align-right input,
+ .v-filterselect-align-right input {
text-align: right;
}
.v-textfield-align-center,
- .v-textarea-align-center {
+ .v-textarea-align-center,
+ .v-datefield-align-center input,
+ .v-filterselect-align-center input {
text-align: center;
}
.v-filterselect-small {
- @include valo-combobox-style($unit-size: $v-unit-size--small, $bevel: null, $shadow: null, $gradient: null, $border: null, $border-radius: null);
+ @include valo-combobox-style($unit-size: $v-unit-size--small, $bevel: null, $shadow: null, $gradient: null, $border: null, $border-radius: null, $background-color: null);
font-size: $v-font-size--small;
}
.v-filterselect-large {
- @include valo-combobox-style($unit-size: $v-unit-size--large, $bevel: null, $shadow: null, $gradient: null, $border: null, $border-radius: null);
+ @include valo-combobox-style($unit-size: $v-unit-size--large, $bevel: null, $shadow: null, $gradient: null, $border: null, $border-radius: null, $background-color: null);
font-size: $v-font-size--large;
}
.v-datefield-small {
- @include valo-datefield-style($unit-size: $v-unit-size--small);
+ @include valo-datefield-style($unit-size: $v-unit-size--small, $bevel: null, $shadow: null, $border: null, $background-color: null);
font-size: $v-font-size--small;
}
.v-datefield-large {
- @include valo-datefield-style($unit-size: $v-unit-size--large);
+ @include valo-datefield-style($unit-size: $v-unit-size--large, $bevel: null, $shadow: null, $border: null, $background-color: null);
font-size: $v-font-size--large;
}
.v-checkbox-small {
- @include valo-checkbox-style($size: $v-unit-size--small);
+ @include valo-checkbox-style($unit-size: $v-unit-size--small);
font-size: $v-font-size--small;
}
.v-checkbox-large {
- @include valo-checkbox-style($size: $v-unit-size--large);
+ @include valo-checkbox-style($unit-size: $v-unit-size--large);
+ font-size: $v-font-size--large;
+ }
+
+ .v-select-optiongroup-small {
+ @include valo-optiongroup-style($unit-size: $v-unit-size--small);
+ font-size: $v-font-size--small;
+ }
+
+ .v-select-optiongroup-large {
+ @include valo-optiongroup-style($unit-size: $v-unit-size--large);
font-size: $v-font-size--large;
}
@@ -184,12 +245,16 @@
@include valo-panel-scroll-divider-style;
}
- .v-csslayout-well {
+ .v-csslayout-well,
+ .v-verticallayout-well,
+ .v-horizontallayout-well {
@include valo-panel-well-style;
@include valo-panel-adjust-content-margins;
}
- .v-csslayout-card {
+ .v-csslayout-card,
+ .v-verticallayout-card,
+ .v-horizontallayout-card {
@include valo-panel-style;
@include valo-panel-adjust-content-margins;
}
@@ -214,6 +279,36 @@
@include valo-horizontallayout--wrapping;
}
+ .v-Notification.bar {
+ @include valo-notification-bar-style;
+ }
+
+ .v-Notification.small {
+ @include valo-notification-small-style;
+ }
+
+ .v-Notification.closable {
+ @include valo-notification-closable-style;
+
+ &.error,
+ &.system {
+ &:after {
+ color: #fff;
+ border-color: #fff;
+ border-color: rgba(255,255,255,.3);
+ }
+ &:active:after {
+ background-color: #fff;
+ color: #000;
+ }
+ }
+
+ &.tray:after {
+ top: round($v-unit-size/2.3);
+ margin-top: 0;
+ }
+ }
+
.v-Notification.success,
.v-Notification.failure {
background: #fff;
@@ -297,28 +392,28 @@
.v-table-no-stripes {
- @include valo-table-no-stripes;
+ @include valo-table-no-stripes-style;
}
.v-table-no-vertical-lines {
- @include valo-table-no-vertical-lines;
+ @include valo-table-no-vertical-lines-style;
}
.v-table-no-horizontal-lines {
- @include valo-table-no-horizontal-lines;
+ @include valo-table-no-horizontal-lines-style;
}
.v-table-no-header {
- @include valo-table-no-header;
+ @include valo-table-no-header-style;
}
.v-table-borderless {
- @include valo-table-borderless;
+ @include valo-table-borderless-style;
}
.v-table-compact,
.v-table-small {
- @include valo-table-compact-style($row-height: round($v-table-row-height * $v-scaling-factor--small), $cell-padding-horizontal: round($v-table-cell-padding-horizontal / 2));
+ @include valo-table-spacing-style($row-height: round($v-table-row-height * $v-scaling-factor--small), $cell-padding-horizontal: round($v-table-cell-padding-horizontal / 2));
}
.v-table-small {
@@ -329,13 +424,17 @@
.v-accordion-borderless {
border: none;
border-radius: 0;
- box-shadow: none;
+ @include box-shadow(none);
> .v-accordion-item {
border-radius: 0;
}
}
+ .v-slider-no-indicator {
+ @include valo-slider-no-indicator;
+ }
+
@include valo-menu;
diff --git a/WebContent/VAADIN/themes/valo/optional/_valo-menu.scss b/WebContent/VAADIN/themes/valo/optional/_valo-menu.scss
index fd230e93c8..f3377f232c 100644
--- a/WebContent/VAADIN/themes/valo/optional/_valo-menu.scss
+++ b/WebContent/VAADIN/themes/valo/optional/_valo-menu.scss
@@ -2,29 +2,42 @@ $valo-menu-background-color: null !default;
@mixin valo-menu {
- $bg-lightness: if(color-luminance($v-app-background-color) < 10, 10%, -60%);
+ $bg-lightness: if(color-luminance($v-app-background-color) < 10, 15%, -70%);
$bg: $valo-menu-background-color or scale-color($v-app-background-color, $lightness: $bg-lightness);
-
- .v-slot-valo-menu {
- position: fixed;
- }
+ $font-color: valo-font-color($bg, 0.5);
.valo-menu {
- position: fixed;
height: 100%;
- overflow: auto;
- padding-bottom: $v-unit-size;
@include linear-gradient(to left, (scale-color($bg, $lightness: valo-gradient-opacity()*-1) 0%, $bg round($v-unit-size/4)), $fallback: $bg);
- color: valo-font-color($bg);
+ color: $font-color;
font-size: round($v-font-size * 0.9);
line-height: round($v-unit-size * 0.8);
border-right: valo-border($color: $bg);
+ white-space: nowrap;
+
+ .valo-menu-part {
+ border-left: valo-border($color: $bg, $strength: 0.6);
+ height: 100%;
+ padding-bottom: $v-unit-size;
+ overflow: auto;
+
+ &:first-child {
+ border-left: none;
+ }
+ }
.valo-menu-title,
.valo-menu-subtitle,
.valo-menu-item {
display: block;
line-height: inherit;
+ white-space: nowrap;
+ position: relative;
+
+ .valo-menu-badge {
+ position: absolute;
+ right: round($v-unit-size/2);
+ }
}
.valo-menu-title {
@@ -34,21 +47,21 @@ $valo-menu-background-color: null !default;
color: $font-color;
text-shadow: valo-text-shadow($font-color: $font-color, $background-color: $v-selection-color);
padding: round($v-unit-size/3) round($v-unit-size/2);
- font-size: 0.9em;
+ font-size: round($v-font-size * 0.9);
border-bottom: valo-border($color: $v-selection-color);
- box-shadow: valo-bevel-and-shadow($shadow: $v-shadow);
+ @include box-shadow(valo-bevel-and-shadow($shadow: $v-shadow));
.v-menubar {
background: transparent;
border-color: first-color(valo-border($color: $v-selection-color));
color: inherit;
- box-shadow: none;
+ @include box-shadow(none);
text-shadow: inherit;
}
.v-menubar-menuitem {
background: transparent;
- box-shadow: valo-bevel-and-shadow($bevel: $v-bevel, $background-color: $v-selection-color, $gradient: $v-gradient);
+ @include box-shadow(valo-bevel-and-shadow($bevel: $v-bevel, $background-color: $v-selection-color, $gradient: $v-gradient));
text-shadow: inherit;
font-size: $v-font-size;
border-color: inherit;
@@ -56,15 +69,12 @@ $valo-menu-background-color: null !default;
}
.valo-menu-subtitle {
- color: valo-font-color($bg, 0.5);
+ color: valo-font-color($bg, 0.33);
margin: round($v-unit-size/5) 0 round($v-unit-size/5) round($v-unit-size/2);
- border-bottom: valo-border($color: $bg, $strength: 0.5);
- position: relative;
+ border-bottom: valo-border($color: $bg, $strength: 0.5, $border: first-number($v-border) solid v-tone);
- .badge {
- position: absolute;
- right: round($v-unit-size/2);
- color: mix(valo-font-color($bg),$v-selection-color);
+ .valo-menu-badge {
+ color: mix(valo-font-color($bg), $v-selection-color);
}
}
@@ -74,21 +84,36 @@ $valo-menu-background-color: null !default;
padding: 0 round($v-unit-size) 0 round($v-unit-size/2);
cursor: pointer;
position: relative;
+ text-shadow: valo-text-shadow($font-color: $font-color, $background-color: $bg, $offset: -2px);
+ @include transition(background-color 300ms, color 60ms);
+
+ $diff: color-luminance($bg) - color-luminance($v-selection-color);
+ $active-color: $v-selection-color;
+ @if abs($diff) < 30 {
+ $active-color: lighten($v-selection-color, 10%);
+ }
+
+ .valo-menu-item-caption {
+ vertical-align: middle;
+ display: inline-block;
+ width: 90%;
+ max-width: 15em;
+ padding-right: round($v-unit-size/2);
+ text-overflow: ellipsis;
+ overflow: hidden;
+ }
- &:before {
- content: "";
- $diff: color-luminance($bg) - color-luminance($v-selection-color);
- @if abs($diff) < 30 {
- background: lighten($v-selection-color, 10%);
- } @else {
- background: $v-selection-color;
+ &.selected {
+ background: darken($bg, 3%);
+
+ .v-icon {
+ color: $active-color;
+ }
+
+ .valo-menu-badge {
+ @include valo-gradient($color: $active-color);
+ color: valo-font-color($active-color);
}
- position: absolute;
- left: 0;
- height: 100%;
- width: 0;
- border-radius: 0 $v-border-radius $v-border-radius 0;
- @include transition(width 300ms);
}
&:hover,
@@ -96,10 +121,94 @@ $valo-menu-background-color: null !default;
color: valo-font-color($bg, 1);
}
- &.selected:before {
- width: round($v-unit-size/8);
+ // Font icons
+ span.v-icon {
+ min-width: 1em;
+ margin-right: round($v-unit-size/2);
+ text-align: center;
+ vertical-align: middle;
+
+ + span {
+ margin-left: 0;
+ }
+ }
+
+ .valo-menu-badge {
+ background: lighten($bg, 5%);
+ @include transition(background-color 300ms);
+ line-height: 1;
+ padding: round($v-unit-size/9) round($v-unit-size/6);
+ min-width: round($v-font-size/1.5);
+ text-align: center;
+ top: (round($v-unit-size * 0.8) - round($v-font-size * 0.9) - round($v-unit-size/9) * 2) / 2;
+ border-radius: $v-border-radius;
}
}
+
+ .valo-menu-part.large-icons {
+ $bg: darken($bg, 4%);
+ background-color: $bg;
+
+ .valo-menu-item {
+ font-size: $v-unit-size;
+ line-height: 1;
+ padding: round($v-unit-size/3);
+ min-width: $v-unit-size * 2;
+ max-width: $v-unit-size * 3;
+ text-align: center;
+
+ .valo-menu-item-caption {
+ display: block;
+ width: auto;
+ margin: .3em 0 0;
+ padding: 0;
+ font-size: round($v-font-size * 0.7);
+ }
+
+ .v-icon {
+ margin: 0;
+ }
+
+ span.v-icon {
+ opacity: 0.8;
+ }
+
+ &.selected {
+ background: darken($bg, 3%);
+
+ .v-icon {
+ opacity: 1;
+ }
+
+ .valo-menu-badge {
+ border-color: darken($bg, 3%);
+ }
+ }
+
+ .valo-menu-badge {
+ padding-left: round($v-unit-size/9);
+ padding-right: round($v-unit-size/9);
+ top: round($v-unit-size/5);
+ right: round($v-unit-size/5);
+ border: 2px solid $bg;
+ }
+ }
+ }
+
+ .valo-menu-logo {
+ display: block;
+ overflow: hidden;
+ width: round($v-unit-size * 1.2) !important;
+ height: round($v-unit-size * 1.2);
+ border-radius: $v-border-radius;
+ text-align: center;
+ @include valo-gradient($color: $v-selection-color);
+ color: valo-font-color($v-selection-color, 1);
+ font-size: round($v-unit-size/1.5);
+ line-height: round($v-unit-size * 1.2);
+ margin: round($v-unit-size/2) auto;
+ @include box-shadow(valo-bevel-and-shadow($shadow: $v-shadow));
+ }
}
}
diff --git a/WebContent/VAADIN/themes/valo/shared/_global.scss b/WebContent/VAADIN/themes/valo/shared/_global.scss
index 2c71f076e2..71d72b367c 100644
--- a/WebContent/VAADIN/themes/valo/shared/_global.scss
+++ b/WebContent/VAADIN/themes/valo/shared/_global.scss
@@ -28,6 +28,11 @@ $valo-global-included: false !default;
height: 100%;
// Cancel tap highlight from all elements inside the app
-webkit-tap-highlight-color: rgba(0,0,0,0);
+
+ // Prevent iOS text size adjust after orientation change, without disabling user zoom
+ -webkit-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+ -webkit-text-size-adjust: 100%;
}
.v-ui {
@@ -67,8 +72,16 @@ $valo-global-included: false !default;
.v-scrollable {
overflow: auto;
- // Fix extra whitespace in IE
- line-height: 0;
+
+ // "Unnecessary scrollbar" related fixes
+ > .v-widget {
+ // This is needed for IE
+ vertical-align: middle;
+
+ // Needed for all browsers. Can't really show anything outside the
+ // scrolling area anyway, so we can safely hide any overflow
+ overflow: hidden;
+ }
}
.v-ios.v-webkit .v-scrollable {
@@ -204,7 +217,7 @@ $valo-shared-pathPrefix: null;
padding: round($v-unit-size/4);
margin-top: round($_size/-2);
margin-left: round($_size/-2);
- background: #fff url($valo-shared-pathPrefix + "img/spinner.gif") no-repeat 50%;
+ background: #fff url(#{$valo-shared-pathPrefix}img/spinner.gif) no-repeat 50%;
border-radius: $v-border-radius;
}
@@ -234,7 +247,7 @@ $valo-shared-pathPrefix: null;
width: 28px !important;
height: 28px;
padding: round($v-unit-size/4);
- background: #fff url($valo-shared-pathPrefix + "img/spinner.gif") no-repeat 50%;
+ background: #fff url(#{$valo-shared-pathPrefix}img/spinner.gif) no-repeat 50%;
border-radius: $v-border-radius;
top: round($v-unit-size/4);
right: round($v-unit-size/4);
diff --git a/WebContent/VAADIN/themes/valo/shared/_loading-indicator.scss b/WebContent/VAADIN/themes/valo/shared/_loading-indicator.scss
index 9ad3d27e0e..56aab30d2b 100644
--- a/WebContent/VAADIN/themes/valo/shared/_loading-indicator.scss
+++ b/WebContent/VAADIN/themes/valo/shared/_loading-indicator.scss
@@ -14,19 +14,34 @@
}
-@mixin valo-spinner ($size: 24px, $thickness: 4px, $color: null, $speed: 500ms) {
- $color: $color or valo-focus-color();
+@mixin valo-spinner ($size: 24px, $thickness: 2px, $color: null, $speed: 500ms) {
+ $color: $color or $v-focus-color;
// Make size divisible by 2, so that the rotation won't jiggle
- $size: $size + $size%2;
+ $size: round($size) + round($size) % 2;
height: $size !important;
width: $size !important;
@include box-sizing(border-box);
border: $thickness solid transparentize($color, .8);
- border-top-color: transparentize($color, .15);
+ border-top-color: $color;
+ border-right-color: $color;
border-radius: 100%;
@include animation(v-rotate-360 $speed infinite linear);
pointer-events: none;
- @include transition(all ease-in-out 300ms);
+
+ // No CSS animation in IE8 and IE9
+ .v-ie8 &,
+ .v-ie9 & {
+ border: none;
+ border-radius: $v-border-radius;
+ background: #fff url(#{$valo-shared-pathPrefix}img/spinner.gif) no-repeat 50% 50%;
+ background-size: 80%;
+ }
+
+ // No background-size for IE8
+ .v-ie8 & {
+ min-width: 30px;
+ min-height: 30px;
+ }
}
@@ -45,7 +60,7 @@
-$v-loading-indicator-color: valo-focus-color() !default;
+$v-loading-indicator-color: $v-focus-color !default;
$v-loading-indicator-bar-height: ceil($v-unit-size/10) !default;
$v-loading-indicator-bar-height--wait: ceil($v-unit-size/6) !default;
diff --git a/WebContent/VAADIN/themes/valo/shared/_notification.scss b/WebContent/VAADIN/themes/valo/shared/_notification.scss
index ff470b8144..cfe4c19599 100644
--- a/WebContent/VAADIN/themes/valo/shared/_notification.scss
+++ b/WebContent/VAADIN/themes/valo/shared/_notification.scss
@@ -1,64 +1,62 @@
$v-notification-title-color: $v-focus-color !default;
-@mixin valo-notification {
-
-
-
+@mixin valo-notification ($primary-stylename: v-Notification) {
// Positional offsets
- // Can't match to "top: 0", since that would target "margin-top: 0" also, which all GWT PopupPanels have always
- .v-Notification[style*=" top: 0"] {
- margin-top: $v-layout-spacing-vertical !important;
- }
-
- .v-Notification[style*="right: 0"] {
- margin-right: $v-layout-spacing-horizontal;
- }
-
- .v-Notification[style*="bottom: 0"] {
- margin-bottom: $v-layout-spacing-vertical;
- }
+ .v-Notification {
+ &.v-position-top {
+ top: $v-layout-spacing-vertical;
+ }
- // Can't match to "left: 0", since that would target "margin-left: 0" also, which all GWT PopupPanels have always
- .v-Notification[style*=" left: 0"] {
- margin-left: $v-layout-spacing-horizontal !important;
- }
+ &.v-position-right {
+ right: $v-layout-spacing-horizontal;
+ }
+ &.v-position-bottom {
+ bottom: $v-layout-spacing-vertical;
+ }
+ &.v-position-left {
+ left: $v-layout-spacing-horizontal;
+ }
+ &.v-position-assistive {
+ top: -9999px;
+ left: -9999px;
+ }
+ }
// Custom animations for positions
- // Left/right positions override top & bottom
- // Can't match to "top: 0", since that would target "margin-top: 0" also, which all GWT PopupPanels have always
@if $v-animations-enabled {
- .v-Notification[style*=" top: 0"] {
- @include valo-anim-slide-down(600ms);
- }
- .v-Notification[style*="bottom: 0"] {
- @include valo-anim-slide-up(600ms);
- }
+ .#{$primary-stylename}-animate-in {
+ @include animation(valo-placeholder-animate-in 100ms, valo-anim-fade-in 100ms);
- .v-Notification[style*="right: 0"] {
- @include valo-anim-slide-left(600ms);
- }
+ &.v-position-left {
+ @include animation(valo-placeholder-animate-in 200ms, valo-anim-slide-in-right 200ms);
+ }
- // Can't match to "left: 0", since that would target "margin-left: 0" also, which all GWT PopupPanels have always
- .v-Notification[style*=" left: 0"]:not(.v-Notification-system):not(.bar) {
- @include valo-anim-slide-right(600ms);
+ &.v-position-right {
+ @include animation(valo-placeholder-animate-in 200ms, valo-anim-slide-in-left 200ms);
+ }
}
- }
-
-
+ .#{$primary-stylename}-animate-out {
+ @include animation(valo-placeholder-animate-out 150ms, valo-anim-fade-out 150ms);
+ &.v-position-left,
+ &.v-position-right {
+ @include animation(valo-placeholder-animate-out 120ms, valo-anim-drop-fade-out 120ms);
+ }
+ }
+ }
// Default style (a.k.a. humanized)
- .v-Notification {
+ .#{$primary-stylename} {
border-radius: $v-border-radius;
text-align: center;
position: fixed !important;
@@ -84,6 +82,8 @@ $v-notification-title-color: $v-focus-color !default;
vertical-align: middle;
max-width: 30em;
text-align: left;
+ max-height: 20em;
+ overflow: auto;
}
h1 ~ p {
@@ -96,31 +96,14 @@ $v-notification-title-color: $v-focus-color !default;
@include valo-notification-style;
- @if $v-animations-enabled {
- @include valo-anim-fade-in;
- }
-
}
-
- // System notification
-
- .v-Notification-system {
+ .#{$primary-stylename}-system {
@include valo-notification-bar-style;
@include valo-notification-system-style;
}
- // Needs a more specific selector to override positional margins
- .v-Notification-system.v-Notification-system {
- margin: 0 !important;
- }
-
-
-
-
- // Tray notification
-
- .v-Notification.tray {
+ .#{$primary-stylename}.tray {
text-align: left;
h1 {
//display: block;
@@ -133,47 +116,18 @@ $v-notification-title-color: $v-focus-color !default;
@include valo-notification-tray-style;
}
- .v-Notification.warning {
+ .#{$primary-stylename}.warning {
@include valo-notification-warning-style;
}
- .v-Notification.error {
+ .#{$primary-stylename}.error {
@include valo-notification-error-style;
}
-
- .v-Notification.bar {
- @include valo-notification-bar-style;
- }
-
- .v-Notification.closable {
- @include valo-notification-closable-style;
-
- &.error,
- &.system {
- &:after {
- color: #fff;
- border-color: #fff;
- border-color: rgba(255,255,255,.3);
- }
- &:active:after {
- background-color: #fff;
- color: #000;
- }
- }
-
- &.tray:after {
- top: round($v-unit-size/2.3);
- margin-top: 0;
- }
- }
-
}
-
-
@mixin valo-notification-closable-style {
padding-right: $v-unit-size + round($v-unit-size/1.7);
overflow: hidden !important; // Override GWT PopupPanel
@@ -217,14 +171,9 @@ $v-notification-title-color: $v-focus-color !default;
@mixin valo-notification-style {
background: valo-overlay-background-color();
- box-shadow: 0px 5px 15px 0px rgba(0,0,0,0.15);
+ @include box-shadow(0px 5px 15px 0px rgba(0,0,0,0.15));
padding: round($v-unit-size/2) round($v-unit-size/1.7);
- // Make thigns easier to read
- &[style*="opacity: 0.9;"] {
- @include opacity(1 !important);
- }
-
h1 {
color: $v-notification-title-color;
font-size: round($v-font-size * 1.2);
@@ -241,16 +190,45 @@ $v-notification-title-color: $v-focus-color !default;
max-width: 100%;
margin: 0 !important;
border-radius: 0;
- box-shadow: 0 0 20px 0 rgba(0,0,0,0.25);
+ @include box-shadow(0 0 20px 0 rgba(0,0,0,0.25));
padding: round($v-unit-size/3) round($v-unit-size/2.5);
p {
max-width: 50em;
}
+
+ &.v-position-top {
+ top: 0;
+
+ @if $v-animations-enabled {
+ &.v-Notification-animate-in {
+ @include animation(valo-placeholder-animate-in 200ms, valo-anim-slide-in-down 200ms);
+ }
+
+ &.v-Notification-animate-out {
+ @include animation(valo-placeholder-animate-out 200ms, valo-anim-slide-out-up 200ms);
+ }
+ }
+ }
+
+ &.v-position-bottom {
+ bottom: 0;
+
+ @if $v-animations-enabled {
+ &.v-Notification-animate-in {
+ @include animation(valo-placeholder-animate-in 200ms, valo-anim-slide-in-up 200ms);
+ }
+
+ &.v-Notification-animate-out {
+ @include animation(valo-placeholder-animate-out 200ms, valo-anim-slide-out-down 200ms);
+ }
+ }
+ }
}
@mixin valo-notification-system-style {
background-color: #444;
+ background-color: rgba(#444, .9);
font-weight: $v-font-weight + 100;
line-height: round($v-font-size * 1.4);
@@ -269,7 +247,6 @@ $v-notification-title-color: $v-focus-color !default;
}
}
-
@mixin valo-notification-tray-style {}
@mixin valo-notification-warning-style {
@@ -287,7 +264,7 @@ $v-notification-title-color: $v-focus-color !default;
@mixin valo-notification-error-style {
background: $v-error-indicator-color;
font-weight: $v-font-weight + 100;
- box-shadow: 0px 5px 15px 0px rgba(0,0,0,0.25);
+ @include box-shadow(0px 5px 15px 0px rgba(0,0,0,0.25));
h1 {
color: valo-font-color($v-error-indicator-color, 1);
@@ -297,3 +274,14 @@ $v-notification-title-color: $v-focus-color !default;
color: valo-font-color($v-error-indicator-color, .8);
}
}
+
+@mixin valo-notification-small-style {
+ padding: round($v-unit-size/3.3) round($v-unit-size/2.8);
+
+ h1 {
+ font-size: $v-font-size;
+ }
+ p {
+ font-size: round($v-font-size * 0.85);
+ }
+}
diff --git a/WebContent/VAADIN/themes/valo/shared/_overlay.scss b/WebContent/VAADIN/themes/valo/shared/_overlay.scss
index 6f29b1efef..a5f6e36957 100644
--- a/WebContent/VAADIN/themes/valo/shared/_overlay.scss
+++ b/WebContent/VAADIN/themes/valo/shared/_overlay.scss
@@ -9,13 +9,15 @@
$v-overlay-background-color: valo-overlay-background-color() !default;
$v-overlay-border-radius: $v-border-radius !default;
$v-overlay-border-width: first-number($v-border) !default;
-$v-overlay-open-animation: valo-overlay-open 200ms !default;
+
+$v-overlay-animate-in: valo-overlay-animate-in 120ms !default;
+$v-overlay-animate-out: valo-placeholder-animate-out 120ms, valo-anim-fade-out 120ms !default;
$v-overlay-padding: round($v-unit-size/9) !default;
$v-overlay-padding-vertical: $v-overlay-padding !default;
$v-overlay-padding-horizontal: $v-overlay-padding !default;
-$v-overlay-shadow: 0 2px 4px 0 v-shade, 0 3px 5px 0 v-shade, 0 0 0 $v-overlay-border-width (v-shade 2-color-luminance($v-background-color)/255) !default;
+$v-overlay-shadow: 0 4px 10px 0 (v-shade 2), 0 3px 5px 0 v-shade, 0 0 0 $v-overlay-border-width (v-shade (2.5 - color-luminance($v-background-color)/255 + $v-bevel-depth/100%)) !default;
$v-selection-overlay-background-color: $v-overlay-background-color !default;
$v-selection-overlay-padding: $v-overlay-padding !default;
@@ -52,7 +54,7 @@ $v-selection-item-selection-color: $v-selection-color !default;
bottom: -$shadow-offset-y + $shadow-blur - $shadow-spread;
left: $shadow-offset-x - $shadow-blur - $shadow-spread;
background: $shadow-color;
- filter: alpha(opacity=#{$shadow-color-opacity}) progid:DXImageTransform.Microsoft.blur(pixelradius=#{strip-units($shadow-blur)}, makeShadow=true);
+ filter: alpha(opacity=#{$shadow-color-opacity}) progid:DXImageTransform.Microsoft.blur(pixelradius=#{strip-units($shadow-blur)}, makeShadow=false);
}
}
@@ -69,17 +71,6 @@ $v-selection-item-selection-color: $v-selection-color !default;
.v-ie8 & {
display: block;
- // Border simulation
- /*.center {
- position: absolute;
- top: -$v-overlay-border-width;
- right: -$v-overlay-border-width;
- bottom: -$v-overlay-border-width;
- left: -$v-overlay-border-width;
- background: darken(valo-overlay-background-color(), $v-bevel-depth);
- filter: alpha(opacity=round($v-bevel-depth/1%));
- }*/
-
// Up to 8 shadows are supported
$elements: top, top-left, top-right, left, right, bottom, bottom-left, bottom-right;
$shadows: valo-bevel-and-shadow($shadow: $v-overlay-shadow);
@@ -110,7 +101,8 @@ $v-selection-item-selection-color: $v-selection-color !default;
@mixin valo-overlay-style (
$background-color: $v-overlay-background-color,
$shadow: $v-overlay-shadow,
- $open-animation: $v-overlay-open-animation
+ $animate-in: $v-overlay-animate-in,
+ $animate-out: $v-overlay-animate-out
) {
padding: $v-overlay-padding-vertical $v-overlay-padding-horizontal;
border-radius: $v-overlay-border-radius;
@@ -118,10 +110,19 @@ $v-selection-item-selection-color: $v-selection-color !default;
background-color: $background-color;
color: valo-font-color($background-color);
- box-shadow: valo-bevel-and-shadow($bevel: null, $shadow: $shadow);
+ @include box-shadow( valo-bevel-and-shadow($bevel: null, $shadow: $shadow));
- @if $v-animations-enabled and $v-overlay-open-animation {
- @include animation($open-animation);
+ @if $v-animations-enabled {
+ @if $animate-in {
+ &[class*="animate-in"] {
+ @include animation($animate-in);
+ }
+ }
+ @if $animate-out {
+ &[class*="animate-out"] {
+ @include animation($animate-out);
+ }
+ }
}
-webkit-backface-visibility: hidden;
@@ -132,22 +133,11 @@ $v-selection-item-selection-color: $v-selection-color !default;
-@if $v-animations-enabled {
- @include keyframes(valo-overlay-open) {
- 0% {
- @include transform(translatey(-3px));
- opacity: 0;
- }
- }
-}
-
-
-
-@mixin valo-selection-overlay-style ($background-color: $v-selection-overlay-background-color, $open-animation: $v-overlay-open-animation) {
- @include valo-overlay-style($background-color: $background-color, $open-animation: $open-animation);
+@mixin valo-selection-overlay-style ($background-color: $v-selection-overlay-background-color, $animate-in: $v-overlay-animate-in, $animate-out: $v-overlay-animate-out) {
+ @include valo-overlay-style($background-color: $background-color, $animate-in: $animate-in, $animate-out: $animate-out);
padding: $v-selection-overlay-padding-vertical $v-selection-overlay-padding-horizontal;
}
@@ -172,7 +162,8 @@ $v-selection-item-selection-color: $v-selection-color !default;
right: 0;
bottom: 0;
left: 0;
- background: scale-color($v-selection-item-selection-color, $lightness: -30%, $saturation: 50%);
+ $sat: if(saturation($v-selection-item-selection-color) > 0, 50%, 0%);
+ background: scale-color($v-selection-item-selection-color, $lightness: -30%, $saturation: $sat);
@include opacity(.15);
pointer-events: none;
border-radius: inherit;
@@ -209,7 +200,7 @@ $v-selection-item-selection-color: $v-selection-color !default;
@mixin valo-drag-element-style ($background-color: $v-app-background-color) {
background: $background-color;
color: valo-font-color($background-color);
- box-shadow: 0 2px 10px rgba(#000, .2);
+ @include box-shadow(0 2px 10px rgba(#000, .2));
border-radius: $v-border-radius;
overflow: hidden;
@include opacity(.5);
diff --git a/WebContent/VAADIN/themes/valo/shared/_tooltip.scss b/WebContent/VAADIN/themes/valo/shared/_tooltip.scss
index 197ef4d9d9..7b7b83ff33 100644
--- a/WebContent/VAADIN/themes/valo/shared/_tooltip.scss
+++ b/WebContent/VAADIN/themes/valo/shared/_tooltip.scss
@@ -58,15 +58,11 @@ $v-tooltip-border-radius: $v-border-radius - 1px !default;
@mixin valo-tooltip-style {
background-color: opacify($v-tooltip-background-color, 1); // For IE8
background-color: $v-tooltip-background-color;
- box-shadow: $v-tooltip-box-shadow;
+ @include box-shadow($v-tooltip-box-shadow);
color: $v-tooltip-font-color;
padding: $v-tooltip-padding-vertical $v-tooltip-padding-horizontal;
border-radius: $v-tooltip-border-radius;
max-width: 35em;
overflow: hidden !important;
font-size: $v-tooltip-font-size;
-
- @if $v-animations-enabled {
- //@include valo-anim-fade-in;
- }
}
diff --git a/WebContent/VAADIN/themes/valo/shared/_variables.scss b/WebContent/VAADIN/themes/valo/shared/_variables.scss
index b652ea720a..8adc3667d3 100644
--- a/WebContent/VAADIN/themes/valo/shared/_variables.scss
+++ b/WebContent/VAADIN/themes/valo/shared/_variables.scss
@@ -6,7 +6,7 @@
// List of components to include in the theme compilation. The list can be modified to make
// the compiled theme smaller by removing unused components from the list.
-// @variable v-included-components
+//
// @usage
// // Remove the Calendar component styles from the output
// $v-included-components: remove($v-included-components, calendar);
@@ -54,7 +54,6 @@ $v-included-components:
// Checks if a given component is included in the compilation. Used by the collection mixins that
// include all components, like valo-components and valo-components.
-// @mixin v-is-included
// @param $component-name {String} the name of the component to check
// @param $is-included {list} (Optional) the list of components which is checked
// @return {Boolean} true if the component is included in the compilation, false if not
@@ -64,14 +63,10 @@ $v-included-components:
// A static text that is shown while the application JavaScript is loaded and started
-// @variable v-app-loading-text
-// @default ""
$v-app-loading-text : "" !default;
// Base line height used for all widgets
-// @variable v-line-height
-// @default 1.55 !default
$v-line-height : 1.55 !default;
@@ -102,21 +97,20 @@ $v-border-radius : 4px
$v-gradient : v-linear 8% !default;
$v-bevel : inset 0 1px 0 v-tint, inset 0 -1px 0 v-shade !default;
-$v-bevel-depth : 25% !default;
+$v-bevel-depth : 30% !default;
$v-shadow : 0 2px 3px v-shade !default;
$v-shadow-opacity : 5% !default;
-$v-focus-color : null !default;
-$v-focus-style : 0 0 0 2px rgba(valo-focus-color(), .5) !default;
$v-focus-color : valo-focus-color() !default;
+$v-focus-style : 0 0 0 2px rgba($v-focus-color, .5) !default;
$v-animations-enabled : true !default;
$v-hover-styles-enabled : true !default;
$v-disabled-opacity : 0.5 !default;
-$v-selection-color : valo-focus-color() !default;
+$v-selection-color : $v-focus-color !default;
$v-default-field-width : $v-unit-size * 5 !default;
@@ -135,7 +129,4 @@ $valo-include-common-stylenames : true
// The Vaadin compiler parses URL paths differently than the regular Sass compiler (i.e. Vaadin modifies relative url paths).
// This boolean is used to flag which compiler is used, so that paths are correct for different resources.
// false == Ruby, true == Vaadin
-// @private
-// @variable v-relative-paths
-// @default false
-$v-relative-paths: false !default;
+$v-relative-paths: true !default;
diff --git a/WebContent/VAADIN/themes/valo/util/_anim.scss b/WebContent/VAADIN/themes/valo/util/_anim.scss
index 122998e2b6..430a6e4722 100644
--- a/WebContent/VAADIN/themes/valo/util/_anim.scss
+++ b/WebContent/VAADIN/themes/valo/util/_anim.scss
@@ -1,41 +1,93 @@
-@include keyframes(valo-anim-fade-in) {
- 0% {
- opacity: 0;
+@if $v-animations-enabled {
+
+ // 'Placeholder' animation names to trigger VOverlay animation-in and animation-out
+ @include keyframes(valo-placeholder-animate-in) {
+ 0% {
+ visibility: visible;
+ }
}
-}
+ @include keyframes(valo-placeholder-animate-out) {
+ 100% {
+ visibility: visible;
+ }
+ }
-@include keyframes(valo-anim-fade-out) {
- 100% {
- opacity: 0;
+ @include keyframes(valo-anim-fade-in) {
+ 0% {
+ opacity: 0;
+ }
}
-}
+ @include keyframes(valo-anim-fade-out) {
+ 100% {
+ opacity: 0;
+ }
+ }
-@include keyframes(valo-anim-slide-down) {
- 0% {
- @include transform( translateY(-100%) );
+ @include keyframes(valo-anim-slide-in-down) {
+ 0% {
+ @include transform( translateY(-100%) );
+ }
}
-}
-@include keyframes(valo-anim-slide-up) {
- 0% {
- @include transform( translateY(100%) );
+ @include keyframes(valo-anim-slide-in-up) {
+ 0% {
+ @include transform( translateY(100%) );
+ }
}
-}
-@include keyframes(valo-anim-slide-left) {
- 0% {
- @include transform( translateX(100%) );
+ @include keyframes(valo-anim-slide-in-left) {
+ 0% {
+ @include transform( translateX(100%) );
+ }
}
-}
-@include keyframes(valo-anim-slide-right) {
- 0% {
- @include transform( translateX(-100%) );
+ @include keyframes(valo-anim-slide-in-right) {
+ 0% {
+ @include transform( translateX(-100%) );
+ }
}
-}
+ @include keyframes(valo-anim-slide-out-down) {
+ 100% {
+ @include transform( translateY(100%) );
+ }
+ }
+
+ @include keyframes(valo-anim-slide-out-up) {
+ 100% {
+ @include transform( translateY(-100%) );
+ }
+ }
+
+ @include keyframes(valo-anim-slide-out-left) {
+ 100% {
+ @include transform( translateX(-100%) );
+ }
+ }
+
+ @include keyframes(valo-anim-slide-out-right) {
+ 100% {
+ @include transform( translateX(100%) );
+ }
+ }
+
+ @include keyframes(valo-overlay-animate-in) {
+ 0% {
+ @include transform(translatey(-4px));
+ opacity: 0;
+ }
+ }
+
+ @include keyframes(valo-anim-drop-fade-out) {
+ 100% {
+ opacity: 0;
+ @include transform(translatey(30%));
+ }
+ }
+
+}
@mixin valo-anim-fade-in ($duration: 120ms, $delay: null){
@@ -60,4 +112,4 @@
@mixin valo-anim-slide-right ($duration: 260ms, $delay: null){
@include animation(valo-anim-slide-right $duration $delay);
-} \ No newline at end of file
+}
diff --git a/WebContent/VAADIN/themes/valo/util/_bevel-and-shadow.scss b/WebContent/VAADIN/themes/valo/util/_bevel-and-shadow.scss
index b93307a1b1..bf5b9b78bd 100644
--- a/WebContent/VAADIN/themes/valo/util/_bevel-and-shadow.scss
+++ b/WebContent/VAADIN/themes/valo/util/_bevel-and-shadow.scss
@@ -161,7 +161,7 @@
$ret: join($ret, $part);
}
}
-
+
@return $ret;
}
@@ -176,8 +176,8 @@
$adjust-type: first-string($part);
$adjust-amount: first-number($part);
- $tint: rgba(#fff, $v-shadow-opacity/100% * $adjust-amount);
- $shade: rgba(#000, $v-shadow-opacity/100% * $adjust-amount);
+ $tint: rgba(#fff, min(1, $v-shadow-opacity/100% * $adjust-amount));
+ $shade: rgba(#000, min(1, $v-shadow-opacity/100% * $adjust-amount));
$color: null;
@if $adjust-type == v-tint {
@@ -220,10 +220,11 @@
$color: $background-color;
@each $b in $bevel {
+ $strength: 1;
@if type-of($b) == list {
$strength: first-number($b);
- $color: if($needle==v-tint, rgba(#fff, $v-shadow-opacity/100%*$strength), rgba(#000, $v-shadow-opacity/100%*$strength));
}
+ $color: if($needle==v-tint, rgba(#fff, $v-shadow-opacity/100%*$strength), rgba(#000, $v-shadow-opacity/100%*$strength));
}
@return 0 if($needle==v-tint, $offset, $offset*-1) 0 $color;
diff --git a/WebContent/VAADIN/themes/valo/util/_color.scss b/WebContent/VAADIN/themes/valo/util/_color.scss
index 06c182f81b..0c80d2f0d0 100644
--- a/WebContent/VAADIN/themes/valo/util/_color.scss
+++ b/WebContent/VAADIN/themes/valo/util/_color.scss
@@ -39,20 +39,23 @@ $v-luminance-threshold: 150 !default;
}
-@function darker-of($c1, $c2) {
- @if color-luminance($c1) < color-luminance($c2) {
- @return $c1;
+@function darkest-color($colors...) {
+ $darkest: first($colors);
+ @each $color in $colors {
+ @if color-luminance($color) < color-luminance($darkest) {
+ $darkest: $color;
+ }
}
- @return $c2;
+ @return $darkest;
}
// Returns a text color with enough contrast for the given background color
@function valo-font-color ($bg-color, $contrast: 0.8) {
@if $bg-color {
@if is-dark-color($bg-color) {
- @return scale_color($bg-color, $lightness: min(100%, 100% * $contrast), $saturation: max(-100%, -50% * $contrast));
+ @return scale-color($bg-color, $lightness: min(100%, 100% * $contrast), $saturation: max(-100%, -50% * $contrast));
} @else {
- @return scale_color($bg-color, $lightness: max(-100%, -100% * $contrast * 0.9), $saturation: max(-100%, -50% * $contrast));
+ @return scale-color($bg-color, $lightness: max(-100%, -100% * $contrast * 0.9), $saturation: max(-100%, -50% * $contrast));
}
}
@return null;
@@ -71,26 +74,21 @@ $v-luminance-threshold: 150 !default;
-@function valo-focus-color ($color: null, $context: null) {
- $context: $context or $v-app-background-color;
-
- $fallback: $context;
- @if is-dark-color($fallback) {
- $fallback: scale-color($fallback, $lightness: 40%, $saturation: 80%);
+@function valo-focus-color ($context: $v-app-background-color) {
+ $color: $context;
+ @if is-dark-color($context) {
+ $color: scale-color($color, $lightness: 40%, $saturation: 80%);
} @else {
- $fallback: scale-color($fallback, $lightness: -50%, $saturation: 80%);
+ $color: scale-color($color, $lightness: -50%, $saturation: 80%);
}
-
- $focus-color: $color or $v-focus-color or $fallback;
-
- @return $focus-color;
+ @return $color;
}
@mixin valo-focus-style($include-box-shadow: false) {
@if $include-box-shadow and type-of($v-focus-style) == list {
- box-shadow: $v-focus-style;
+ @include box-shadow($v-focus-style);
} @else if type-of($v-focus-style) == color {
border-color: $v-focus-style;
}
diff --git a/WebContent/VAADIN/themes/valo/util/_css3.scss b/WebContent/VAADIN/themes/valo/util/_css3.scss
index 98f1619eff..b1215d735f 100644
--- a/WebContent/VAADIN/themes/valo/util/_css3.scss
+++ b/WebContent/VAADIN/themes/valo/util/_css3.scss
@@ -1,10 +1,20 @@
-@mixin opacity ($o) {
- opacity: $o;
+@mixin opacity ($value, $important: false) {
+ $importantValue: null;
+ @if $important {
+ $importantValue: unquote("!important");
+ }
+
+ opacity: $value $importantValue;
- $value: first-number($o);
@if $value < 1 {
- filter: alpha(opacity=$value*100) remove-nth($o, 1);
+ $valueperc: $value*100;
+ filter: alpha(opacity=#{$valueperc}) #{$importantValue};
} @else {
- filter: none remove-nth($o, 1);
+ filter: none #{$importantValue};
}
}
+
+// -webkit-box-shadow still needed for Android 2.3 and 3.0, as well as iOS 5
+@mixin box-shadow ($shadows...) {
+ @include prefixer(box-shadow, $shadows, webkit spec);
+}
diff --git a/WebContent/VAADIN/themes/valo/util/_util.scss b/WebContent/VAADIN/themes/valo/util/_util.scss
index b8512a4f10..2f7b28b3ad 100644
--- a/WebContent/VAADIN/themes/valo/util/_util.scss
+++ b/WebContent/VAADIN/themes/valo/util/_util.scss
@@ -10,7 +10,7 @@
@if length($to-align) > 0 {
@each $selector in $to-align {
- & > #{unquote($selector)} {
+ & > #{$selector} {
vertical-align: $align;
}
}
diff --git a/WebContent/WEB-INF/web.xml b/WebContent/WEB-INF/web.xml
index f98b7c78d1..268fe1ea66 100644
--- a/WebContent/WEB-INF/web.xml
+++ b/WebContent/WEB-INF/web.xml
@@ -24,6 +24,10 @@
<param-name>application</param-name>
<param-value>com.vaadin.tests.components.button.Buttons</param-value>
</init-param>
+ <init-param>
+ <param-name>org.atmosphere.cpr.scanClassPath</param-name>
+ <param-value>false</param-value>
+ </init-param>
<async-supported>true</async-supported>
</servlet>
<servlet>
@@ -33,6 +37,10 @@
<param-name>UI</param-name>
<param-value>com.vaadin.tests.components.label.MarginsInLabels</param-value>
</init-param>
+ <init-param>
+ <param-name>org.atmosphere.cpr.scanClassPath</param-name>
+ <param-value>false</param-value>
+ </init-param>
<async-supported>true</async-supported>
</servlet>
<servlet>
@@ -46,6 +54,10 @@
<param-name>UI</param-name>
<param-value>com.vaadin.tests.VerifyAssertionsEnabled</param-value>
</init-param>
+ <init-param>
+ <param-name>org.atmosphere.cpr.scanClassPath</param-name>
+ <param-value>false</param-value>
+ </init-param>
<async-supported>true</async-supported>
</servlet>
@@ -58,6 +70,10 @@
<param-value>false</param-value>
</init-param>
<init-param>
+ <param-name>org.atmosphere.cpr.scanClassPath</param-name>
+ <param-value>false</param-value>
+ </init-param>
+ <init-param>
<param-name>heartbeatInterval</param-name>
<param-value>301</param-value>
</init-param>
@@ -84,6 +100,10 @@
-->
<servlet-name>VaadinApplicationRunnerWithTimeoutRedirect</servlet-name>
<servlet-class>com.vaadin.launcher.ApplicationRunnerServlet</servlet-class>
+ <init-param>
+ <param-name>org.atmosphere.cpr.scanClassPath</param-name>
+ <param-value>false</param-value>
+ </init-param>
</servlet>
<servlet>
@@ -94,6 +114,10 @@
<param-value>automatic</param-value>
</init-param>
<async-supported>true</async-supported>
+ <init-param>
+ <param-name>org.atmosphere.cpr.scanClassPath</param-name>
+ <param-value>false</param-value>
+ </init-param>
</servlet>
<!-- For testing GAE - the deployment script changes this to use GAEVaadinServlet -->
@@ -105,6 +129,10 @@
<param-value>com.vaadin.tests.integration.ServletIntegrationUI</param-value>
</init-param>
<async-supported>true</async-supported>
+ <init-param>
+ <param-name>org.atmosphere.cpr.scanClassPath</param-name>
+ <param-value>false</param-value>
+ </init-param>
</servlet>
<servlet-mapping>
<servlet-name>Embed App 1</servlet-name>
@@ -142,7 +170,7 @@
</servlet-mapping>
<servlet-mapping>
- <servlet-name>IntegrationTest</servlet-name>
+ <servlet-name>VaadinApplicationRunner</servlet-name>
<url-pattern>/VAADIN/*</url-pattern>
</servlet-mapping>
diff --git a/WebContent/license.html b/WebContent/license.html
index f432f68890..f714e4d64d 100644
--- a/WebContent/license.html
+++ b/WebContent/license.html
@@ -99,7 +99,7 @@
<!-- In vaadin-shared-deps -->
<tr>
<td>JSON</td>
- <td><a href="licenses/apache-license-version-2-0.txt">Apache License, Version 2.0</a></td>
+ <td><a href="licenses/the-json-license.txt">The JSON License</a></td>
</tr>
<!-- Used by vaadin-server -->
@@ -160,11 +160,16 @@
<td title="Custom web font">Lora</td>
<td><a href="licenses/OFL.txt">SIL OFL 1.1</a></td>
</tr>
- <!-- The extracted vaadin-sass-compiler -->
+ <!-- The extracted vaadin-sass-compiler -->
<tr>
<td>Vaadin Sass Compiler</td>
<td><a href="licenses/apache-license-version-2-0.txt">Apache License, Version 2.0</a></td>
</tr>
+ <!-- Bourbon sass library -->
+ <tr>
+ <td>Bourbon</td>
+ <td><a href="licenses/the-mit-license.txt">The MIT License</a></td>
+ </tr>
</tbody>
</table>
diff --git a/WebContent/release-notes.html b/WebContent/release-notes.html
index f44d8748b7..d9bbdea8c1 100644
--- a/WebContent/release-notes.html
+++ b/WebContent/release-notes.html
@@ -45,6 +45,8 @@
@version@</a></li>
<li><a href="#enhancements">Enhancements in Vaadin
@version-minor@</a></li>
+ <li><a href="#incompatible">Incompatible or behavior-altering changes in
+ @version-minor@</a></li>
<li><a href="#knownissues">Known issues in
@version-minor@</a></li>
<li><a href="#limitations">Limitations in
@@ -71,14 +73,6 @@
href="#changelog">change log</a> below.
</p>
- <p>
- For a list of enhancements in the last feature release, see
- <a href="#enhancements">Enhancements in Vaadin
- @version-minor@</a> and the <a
- href="http://vaadin.com/download/release/@version-minor@/@version-minor@.0/release-notes.html">Release
- Notes for Vaadin @version-minor@.0</a>.
- </p>
-
<!-- ================================================================ -->
<h3 id="changelog">Change log for Vaadin @version@</h3>
@@ -93,85 +87,46 @@
<br/>
<p>
You can also view the <a
- href="http://dev.vaadin.com/query?status=closed&resolution=fixed&milestone=Vaadin+@version@&order=id">list
+ href="http://dev.vaadin.com/query?status=closed&resolution=fixed&milestone=Vaadin+7.3.0.alpha1&milestone=Vaadin+7.3.0.alpha2&milestone=Vaadin+7.3.0.alpha3&milestone=Vaadin+7.3.0.beta1&order=id">list
of the closed issues</a> at the Vaadin developer's site.
</p>
- <h2 id="enhancements">Enhancements in Vaadin
- @version-minor@</h2>
+ <h2 id="enhancements">Enhancements in Vaadin @version-minor@</h2>
<p>The @version-minor@ includes many major and minor
enhancements. Below is a list of the most notable changes:</p>
<ul>
- <li>Valo theme &ndash; <a href="#valo">see the separate section</a>
- about the features of the new theme and how to use it</li>
+ <li>Valo is a brand new built-in theme for Vaadin. It leverages
+ the Sass CSS preprocessor heavily,
+ providing a variety of ways to customize the look and feel of your theme.
+ See <a href="https://vaadin.com/wiki/-/wiki/Main/Valo+theme+-+Getting+started">the Valo theme tutorial</a> or <a href="https://vaadin.com/book/-/page/themes.valo.html">the Valo theme section</a> in Book of Vaadin for information on how to get started.</li>
+ <li>Support for changing theme on the fly</li>
</ul>
- <!-- <p>Tools have been updated for Vaadin @version-minor@ with
- the following changes:</p>
-
- <ul>
- <li>-</li>
- </ul>-->
-
<p>
- For enchancements introduced in Vaadin 7, see the <a
- href="http://vaadin.com/download/release/7.0/7.0.0/release-notes.html">Release
- Notes for Vaadin 7.0.0</a>.
+ For enhancements introduced in Vaadin 7.2, see the <a
+ href="http://vaadin.com/download/release/7.2/7.2.0/release-notes.html">Release
+ Notes for Vaadin 7.2.0</a>.
</p>
-
- <h2 id="valo">Valo theme</h2>
-
- <p>Valo is a brand new built-in theme for Vaadin. It leverages
- the <a href="http://www.sass-lang.com">Sass CSS preprocessor</a> heavily,
- providing a variety of ways to customize the look and feel of your theme.
- Read the introductory blog post describing the features for the
- <a href="https://vaadin.com/blog/-/blogs/7-series">Vaadin 7.x series</a>.</p>
-
- <h4>Using Valo</h4>
-
- <p>The Java-based Sass compiler bundled with this Vaadin release
- does not support all the features that Valo requires at the moment.
- The compiler in the release version of Vaadin 7.3 will support Valo,
- but for this alpha release, you need to use the original Ruby-based
- compiler (or any other Sass 3.2 compatible Sass compiler). See
- instructions below.</p>
-
+
+ <h3 id="incompatible">Incompatible or behavior-altering changes in @version-minor@</h3>
<ul>
- <li>Install the command-line version of the Sass compiler by following
- the instructions in <a href="http://sass-lang.com/install">http://sass-lang.com/install</a></li>
- <li>Unpack the <code>VAADIN/themes/valo</code> folder from
- <code>vaadin-themes-7.3.0.alpha1.jar</code> and place it under your
- project's <code>VAADIN/themes</code> folder</li>
- <li>In your project's custom theme, import Valo and do any modifications
- you wish using the Sass API in Valo (i.e., variables, mixins, and functions),
- and then include the main valo mixin<br>
- <br>Example (in <code>my-theme-name.scss</code>):<br>
- <pre>// Any variables you wish to override should be done before importing Valo
-
-// Modify the base color of the theme
-$v-app-background-color: hsl(200, 50%, 50%);
-
-@import "../valo/valo";
-
-.my-theme-name {
- @include valo;
-}
-</pre>
- </li>
- <li>From the command-line, navigate to your project's
- <code>VAADIN/themes/my-theme-name</code> folder and use the following command
- to compile the theme:<br><br>
- <code>$ sass styles.scss styles.css</code></li>
+ <li>
+ <p>The shadow of all overlays (VOverlay) are now implemented with CSS box-shadow in all browsers except Internet Explorer 8 (<a href="http://dev.vaadin.com/ticket/9303">#9303</a>).
+ In IE8 the old image-based implementation is still used.
+ </p><p>
+ The image-based shadow implementation is also deprecated, so if you have any custom shadow implementations in your themes or add-ons,
+ please update them accordingly to use CSS box-shadow instead.
+ </p><p>
+ Note that the CSS-based implementation is visually not 100% identical to the old implementation. This should not cause issues except
+ if you are using screenshot-based TestBench tests or similar visual regression tests.
+ </p>
+ </li>
+ <li>The theme for the debug window is now implemented using a GWT client bundle and is no longer included in the standard theme.</li>
</ul>
-
<h3 id="knownissues">Known issues</h3>
<ul>
- <li>Reconnecting a dropped push connection sometimes fails when using
- Firefox and streaming or long polling.
- (<a href="http://dev.vaadin.com/ticket/13578">#13578</a>)
- </li>
<li>Drag'n'drop in a Table doesn't work on touch devices running
Internet Explorer (Windows Phone, Surface)
(<a href="http://dev.vaadin.com/ticket/13737">#13737</a>)
diff --git a/build.properties b/build.properties
index b524afd139..a7871ad1ef 100644
--- a/build.properties
+++ b/build.properties
@@ -5,5 +5,6 @@ vaadin.vendor=Vaadin Ltd
vaadin.url=http://vaadin.com
vaadin.java.version=1.6
vaadin.version=0.0.0.unversioned-development-build
-vaadin.sass.version=0.9.6
+vaadin.sass.version=0.9.7
+gwt.version=2.6.0.vaadin3
commons-io.version=2.4
diff --git a/build/ide.xml b/build/ide.xml
index 678fc49d5b..0775a67505 100755
--- a/build/ide.xml
+++ b/build/ide.xml
@@ -1,17 +1,8 @@
<?xml version="1.0"?>
<project xmlns:antcontrib="antlib:net.sf.antcontrib" xmlns:artifact="antlib:org.apache.maven.artifact.ant" xmlns:ivy="antlib:org.apache.ivy.ant" name="Build script for IDE users" basedir=".." default="theme-and-default-widgetset">
- <include file="${basedir}/gwt-files.xml" />
-
- <property name="gwt.dev.classes" location="${gwt.eclipse.basedir}/dev/bin" />
- <property name="gwt.user.classes" location="${gwt.eclipse.basedir}/user/bin" />
- <property name="gwt.dev.src" location="${gwt.basedir}/dev/core/src" />
- <property name="gwt.dev.super.src" location="${gwt.basedir}/dev/core/super" />
- <property name="gwt.user.src" location="${gwt.basedir}/user/src" />
- <property name="gwt.user.super.src" location="${gwt.basedir}/user/super" />
-
<property name="work.dir" location="work" />
- <echo>Using gwt files from ${gwt.user.classes} and ${gwt.dev.classes}</echo>
+ <property file="build.properties" />
<ivy:resolve log="download-only" file="client-compiler/ivy.xml" conf="ide" />
<ivy:cachepath pathid="client-compiler.deps" conf="ide" />
@@ -25,22 +16,19 @@
<ivy:cachepath pathid="uitest.deps" conf="ide" />
<ivy:resolve log="download-only" file="buildhelpers/ivy.xml" />
<ivy:cachepath pathid="buildhelpers.deps" />
+ <ivy:resolve log="download-only" file="gwt/ivy.xml" conf="ide" />
+ <ivy:cachepath pathid="gwt.deps" conf="ide" />
<path id="classpath">
<path location="bin" />
<path location="build/classes" />
- <path location="${gwt.user.classes}" />
- <path location="${gwt.user.src}" />
- <path location="${gwt.user.super.src}" />
- <path location="${gwt.dev.classes}" />
- <path location="${gwt.dev.super.src}" />
- <path location="${gwt.dev.src}" />
<path refid="client-compiler.deps" />
<path refid="server.deps" />
<path refid="shared.deps" />
<path refid="uitest.deps" />
<path refid="client.deps" />
<path refid="buildhelpers.deps" />
+ <path refid="gwt.deps" />
<path location="server/src" />
<path location="shared/src" />
<path location="uitest/src" />
@@ -65,6 +53,9 @@
<antcall target="compile-theme">
<param name="theme" value="liferay" />
</antcall>
+ <antcall target="compile-theme">
+ <param name="theme" value="valo" />
+ </antcall>
</target>
<target name="compile-theme">
diff --git a/buildhelpers/src/com/vaadin/buildhelpers/CompileTheme.java b/buildhelpers/src/com/vaadin/buildhelpers/CompileTheme.java
index 0fa4a7e8ab..d97025bdb6 100644
--- a/buildhelpers/src/com/vaadin/buildhelpers/CompileTheme.java
+++ b/buildhelpers/src/com/vaadin/buildhelpers/CompileTheme.java
@@ -73,9 +73,14 @@ public class CompileTheme {
}
// Legacy theme w/o .themename{} wrapping
try {
- processSassTheme(themeFolder, themeName, "legacy-styles", version);
- System.out.println("Compiling theme " + themeName
- + " legacy-styles successful");
+ String legacyFile = themeFolder + File.separator + themeName
+ + File.separator + "legacy-styles.scss";
+ if (new File(legacyFile).exists()) {
+ processSassTheme(themeFolder, themeName, "legacy-styles",
+ version);
+ System.out.println("Compiling theme " + themeName
+ + " legacy-styles successful");
+ }
} catch (Exception e) {
System.err.println("Compiling theme " + themeName
+ " legacy-styles failed");
diff --git a/client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java b/client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java
index cc1841ec05..5519dd1aae 100644
--- a/client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java
+++ b/client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java
@@ -1,12 +1,12 @@
/*
* Copyright 2000-2014 Vaadin Ltd.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -48,6 +48,7 @@ import com.vaadin.client.JsArrayObject;
import com.vaadin.client.ServerConnector;
import com.vaadin.client.annotations.OnStateChange;
import com.vaadin.client.metadata.ConnectorBundleLoader;
+import com.vaadin.client.metadata.ConnectorBundleLoader.CValUiInfo;
import com.vaadin.client.metadata.InvokationHandler;
import com.vaadin.client.metadata.OnStateChangeMethod;
import com.vaadin.client.metadata.ProxyHandler;
@@ -70,6 +71,9 @@ import com.vaadin.shared.communication.ClientRpc;
import com.vaadin.shared.communication.ServerRpc;
import com.vaadin.shared.ui.Connect;
import com.vaadin.shared.ui.Connect.LoadStyle;
+import com.vaadin.tools.CvalAddonsChecker;
+import com.vaadin.tools.CvalChecker;
+import com.vaadin.tools.CvalChecker.InvalidCvalException;
public class ConnectorBundleLoaderFactory extends Generator {
/**
@@ -211,6 +215,8 @@ public class ConnectorBundleLoaderFactory extends Generator {
}
+ private CvalAddonsChecker cvalChecker = new CvalAddonsChecker();
+
@Override
public String generate(TreeLogger logger, GeneratorContext context,
String typeName) throws UnableToCompleteException {
@@ -231,7 +237,6 @@ public class ConnectorBundleLoaderFactory extends Generator {
logger.log(Type.ERROR, getClass() + " failed", e);
throw new UnableToCompleteException();
}
-
}
private void generateClass(TreeLogger logger, GeneratorContext context,
@@ -243,6 +248,23 @@ public class ConnectorBundleLoaderFactory extends Generator {
return;
}
+ List<CValUiInfo> cvalInfos = null;
+ try {
+ if (cvalChecker != null) {
+ cvalInfos = cvalChecker.run();
+ // Don't run twice
+ cvalChecker = null;
+ }
+ } catch (InvalidCvalException e) {
+ System.err.println("\n\n\n\n" + CvalChecker.LINE);
+ for (String line : e.getMessage().split("\n")) {
+ System.err.println(line);
+ }
+ System.err.println(CvalChecker.LINE + "\n\n\n\n");
+ System.exit(1);
+ throw new UnableToCompleteException();
+ }
+
List<ConnectorBundle> bundles = buildBundles(logger,
context.getTypeOracle());
@@ -364,6 +386,18 @@ public class ConnectorBundleLoaderFactory extends Generator {
w.println("});");
}
+ if (cvalInfos != null && !cvalInfos.isEmpty()) {
+ w.println("{");
+ for (CValUiInfo c : cvalInfos) {
+ if ("evaluation".equals(c.type)) {
+ w.println("cvals.add(new CValUiInfo(\"" + c.product
+ + "\", \"" + c.version + "\", \"" + c.widgetset
+ + "\", null));");
+ }
+ }
+ w.println("}");
+ }
+
w.outdent();
w.println("}");
@@ -1101,7 +1135,7 @@ public class ConnectorBundleLoaderFactory extends Generator {
* {@link ServerConnector} that have a @{@link Connect} annotation. It also
* checks that multiple connectors aren't connected to the same server-side
* class.
- *
+ *
* @param logger
* the logger to which information can be logged
* @param typeOracle
diff --git a/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ConnectorBundle.java b/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ConnectorBundle.java
index 8a4ca8f795..8bbcac4ecb 100644
--- a/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ConnectorBundle.java
+++ b/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ConnectorBundle.java
@@ -253,9 +253,9 @@ public class ConnectorBundle {
needsSuperClass = needsSuperClass.getSuperclass();
}
- for (Property property : getProperties(typeAsClass)) {
- setNeedsGwtConstructor(property.getBeanType());
+ setNeedsGwtConstructor(typeAsClass);
+ for (Property property : getProperties(typeAsClass)) {
setNeedsProperty(property);
JType propertyType = property.getPropertyType();
diff --git a/client-compiler/src/com/vaadin/tools/CvalAddonsChecker.java b/client-compiler/src/com/vaadin/tools/CvalAddonsChecker.java
new file mode 100644
index 0000000000..6780b1bc75
--- /dev/null
+++ b/client-compiler/src/com/vaadin/tools/CvalAddonsChecker.java
@@ -0,0 +1,191 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.tools;
+
+import static com.vaadin.tools.CvalChecker.LINE;
+import static com.vaadin.tools.CvalChecker.computeMajorVersion;
+import static com.vaadin.tools.CvalChecker.getErrorMessage;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.jar.Attributes;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+
+import com.vaadin.client.metadata.ConnectorBundleLoader.CValUiInfo;
+import com.vaadin.tools.CvalChecker.CvalInfo;
+import com.vaadin.tools.CvalChecker.CvalServer;
+import com.vaadin.tools.CvalChecker.InvalidCvalException;
+import com.vaadin.tools.CvalChecker.UnreachableCvalServerException;
+
+/**
+ * This class is able to visit all MANIFEST.MF files present in the classpath,
+ * filter by name, and check if the user has a valid license.
+ *
+ * Manifest files should have a few attributes indicating the license type of
+ * the addon:
+ * <ul>
+ * <li>Implementation-Version: 4.x.x
+ * <li>AdVaaName: addon_name
+ * <li>AdVaaLicen: cval, agpl, empty
+ * <li>AdVaaPkg: package of the widgets in this addon
+ * </ul>
+ *
+ * The class also have a method to check just one product.
+ */
+public final class CvalAddonsChecker {
+
+ // Manifest attributes
+ public static final String VAADIN_ADDON_LICENSE = "AdVaaLicen";
+ public static final String VAADIN_ADDON_NAME = "AdVaaName";
+ public static final String VAADIN_ADDON_WIDGETSET = "Vaadin-Widgetsets";
+ public static final String VAADIN_ADDON_VERSION = "Implementation-Version";
+ public static final String VAADIN_ADDON_TITLE = "Implementation-Title";
+
+ // License types
+ public static final String VAADIN_AGPL = "agpl";
+ public static final String VAADIN_CVAL = "cval";
+
+ private CvalChecker cvalChecker = new CvalChecker();
+ private String filterPattern;
+
+ /**
+ * The constructor.
+ */
+ public CvalAddonsChecker() {
+ setLicenseProvider(new CvalServer());
+ setFilter(".*vaadin.*");
+ }
+
+ /**
+ * Visit all MANIFEST.MF files in the classpath validating licenses.
+ *
+ * Return a list of Cval licensed products in order to have enough info to
+ * generate nag messages in the UI.
+ */
+ public List<CValUiInfo> run() throws InvalidCvalException {
+ List<CValUiInfo> ret = new ArrayList<CValUiInfo>();
+ try {
+ // Visit all MANIFEST in our classpath
+ Enumeration<URL> manifests = Thread.currentThread()
+ .getContextClassLoader()
+ .getResources(JarFile.MANIFEST_NAME);
+ while (manifests.hasMoreElements()) {
+ try {
+ URL url = manifests.nextElement();
+ // Discard manifests whose name does not match the filter
+ // pattern
+ if (!url.getPath().matches(filterPattern)) {
+ continue;
+ }
+ InputStream is = url.openStream();
+ // Should never happen, but we don't want a NPE here
+ if (is == null) {
+ continue;
+ }
+ // Read manifest attributes
+ Manifest manifest = new Manifest(is);
+ Attributes attribs = manifest.getMainAttributes();
+ String license = attribs.getValue(VAADIN_ADDON_LICENSE);
+ String name = attribs.getValue(VAADIN_ADDON_NAME);
+ String vers = attribs.getValue(VAADIN_ADDON_VERSION) == null ? ""
+ : attribs.getValue(VAADIN_ADDON_VERSION);
+ String title = attribs.getValue(VAADIN_ADDON_TITLE) == null ? name
+ : attribs.getValue(VAADIN_ADDON_TITLE);
+
+ String widgetsets = attribs
+ .getValue(VAADIN_ADDON_WIDGETSET) == null ? name
+ : attribs.getValue(VAADIN_ADDON_WIDGETSET);
+
+ if (name == null || license == null) {
+ continue;
+ }
+ if (VAADIN_AGPL.equals(license)) {
+ // For agpl version we print an info message
+ printAgplLicense(title, vers);
+ } else if (VAADIN_CVAL.equals(license)) {
+ // We only check cval licensed products
+ CvalInfo info;
+ try {
+ info = cvalChecker.validateProduct(name, vers,
+ title);
+ printValidLicense(info, title, vers);
+ } catch (UnreachableCvalServerException e) {
+ info = CvalChecker.parseJson("{'product':{'name':'"
+ + name + "'}}");
+ printServerUnreachable(title, vers);
+ }
+ for (String w : widgetsets.split("[, ]+")) {
+ ret.add(new CValUiInfo(title, String
+ .valueOf(computeMajorVersion(vers)), w,
+ info.getType()));
+ }
+ }
+ } catch (IOException ignored) {
+ }
+ }
+ } catch (IOException ignored) {
+ }
+ return ret;
+ }
+
+ /**
+ * Set the filter regexp of .jar names which we have to consider.
+ *
+ * default is '.*touchkit.*'
+ */
+ public CvalAddonsChecker setFilter(String regexp) {
+ filterPattern = regexp;
+ return this;
+ }
+
+ /*
+ * Change the license provider, only used in tests.
+ */
+ protected CvalAddonsChecker setLicenseProvider(CvalServer p) {
+ cvalChecker.setLicenseProvider(p);
+ return this;
+ }
+
+ private void printAgplLicense(String name, String version) {
+ System.out.println(LINE + "\n"
+ + getErrorMessage("agpl", name, computeMajorVersion(version))
+ + "\n" + LINE);
+ }
+
+ private void printServerUnreachable(String name, String version) {
+ System.out.println(LINE
+ + "\n"
+ + getErrorMessage("unreachable", name,
+ computeMajorVersion(version)) + "\n" + LINE);
+ }
+
+ private void printValidLicense(CvalInfo info, String title, String version) {
+ String msg = info.getMessage();
+ if (msg == null) {
+ String key = "evaluation".equals(info.getType()) ? "evaluation"
+ : "valid";
+ msg = getErrorMessage(key, title, computeMajorVersion(version),
+ info.getLicensee());
+ }
+ System.out.println("\n" + LINE + "\n" + msg + "\n" + LINE + "\n");
+ }
+}
diff --git a/client-compiler/src/com/vaadin/tools/CvalChecker.java b/client-compiler/src/com/vaadin/tools/CvalChecker.java
new file mode 100644
index 0000000000..5ad44a70f8
--- /dev/null
+++ b/client-compiler/src/com/vaadin/tools/CvalChecker.java
@@ -0,0 +1,488 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.tools;
+
+import static java.lang.Integer.parseInt;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.text.MessageFormat;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.Locale;
+import java.util.ResourceBundle;
+import java.util.prefs.Preferences;
+
+import org.apache.commons.io.IOUtils;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * This class is able to validate the vaadin CVAL license.
+ *
+ * It reads the developer license file and asks the server to validate the
+ * licenseKey. If the license is invalid it throws an exception with the
+ * information about the problem and the server response.
+ */
+public final class CvalChecker {
+
+ /*
+ * Class used for binding the JSON gotten from server.
+ *
+ * It is not in a separate f le, so as it is easier to copy into any product
+ * which does not depend on vaadin core.
+ *
+ * We are using org.json in order not to use additional dependency like
+ * auto-beans, gson, etc.
+ */
+ public static class CvalInfo {
+
+ public static class Product {
+ private JSONObject o;
+
+ public Product(JSONObject o) {
+ this.o = o;
+ }
+
+ public String getName() {
+ return get(o, "name", String.class);
+ }
+
+ public Integer getVersion() {
+ return get(o, "version", Integer.class);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private static <T> T get(JSONObject o, String k, Class<T> clz) {
+ Object ret = null;
+ try {
+ if (clz == String.class) {
+ ret = o.getString(k);
+ } else if (clz == JSONObject.class) {
+ ret = o.getJSONObject(k);
+ } else if (clz == Integer.class) {
+ ret = o.getInt(k);
+ } else if (clz == Date.class) {
+ ret = new Date(o.getLong(k));
+ } else if (clz == Boolean.class) {
+ ret = o.getBoolean(k);
+ }
+ } catch (JSONException e) {
+ }
+ return (T) ret;
+ }
+
+ private static <T> T put(JSONObject o, String k, Object v) {
+ try {
+ o.put(k, v);
+ } catch (JSONException e) {
+ }
+ return null;
+ }
+
+ private JSONObject o;
+
+ private Product product;
+
+ public CvalInfo(JSONObject o) {
+ this.o = o;
+ product = new Product(get(o, "product", JSONObject.class));
+ }
+
+ public Boolean getExpired() {
+ return get(o, "expired", Boolean.class);
+ }
+
+ public Date getExpiredEpoch() {
+ return get(o, "expiredEpoch", Date.class);
+ }
+
+ public String getLicensee() {
+ return get(o, "licensee", String.class);
+ }
+
+ public String getLicenseKey() {
+ return get(o, "licenseKey", String.class);
+ }
+
+ public String getMessage() {
+ return get(o, "message", String.class);
+ }
+
+ public Product getProduct() {
+ return product;
+ }
+
+ public String getType() {
+ return get(o, "type", String.class);
+ }
+
+ public void setExpiredEpoch(Date expiredEpoch) {
+ put(o, "expiredEpoch", expiredEpoch.getTime());
+ }
+
+ public void setMessage(String msg) {
+ put(o, "message", msg);
+ }
+
+ @Override
+ public String toString() {
+ return o.toString();
+ }
+
+ public boolean isLicenseExpired() {
+ return (getExpired() != null && getExpired())
+ || (getExpiredEpoch() != null && getExpiredEpoch().before(
+ new Date()));
+ }
+
+ public boolean isValidVersion(int majorVersion) {
+ return getProduct().getVersion() == null
+ || getProduct().getVersion() >= majorVersion;
+
+ }
+
+ private boolean isValidInfo(String name, String key) {
+ return getProduct() != null && getProduct().getName() != null
+ && getLicenseKey() != null
+ && getProduct().getName().equals(name)
+ && getLicenseKey().equals(key);
+ }
+ }
+
+ /*
+ * The class with the method for getting json from server side. It is here
+ * and protected just for replacing it in tests.
+ */
+ public static class CvalServer {
+ protected String licenseUrl = LICENSE_URL_PROD;
+
+ String askServer(String productName, String productKey, int timeoutMs)
+ throws IOException {
+ String url = licenseUrl + productKey;
+ URLConnection con;
+ try {
+ // Send some additional info in the User-Agent string.
+ String ua = "Cval " + productName + " " + productKey + " "
+ + getFirstLaunch();
+ for (String prop : Arrays.asList("java.vendor.url",
+ "java.version", "os.name", "os.version", "os.arch")) {
+ ua += " " + System.getProperty(prop, "-").replace(" ", "_");
+ }
+ con = new URL(url).openConnection();
+ con.setRequestProperty("User-Agent", ua);
+ con.setConnectTimeout(timeoutMs);
+ con.setReadTimeout(timeoutMs);
+ String r = IOUtils.toString(con.getInputStream());
+ return r;
+ } catch (MalformedURLException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ /*
+ * Get the GWT firstLaunch timestamp.
+ */
+ String getFirstLaunch() {
+ try {
+ Class<?> clz = Class
+ .forName("com.google.gwt.dev.shell.CheckForUpdates");
+ return Preferences.userNodeForPackage(clz).get("firstLaunch",
+ "-");
+ } catch (ClassNotFoundException e) {
+ return "-";
+ }
+ }
+ }
+
+ /**
+ * Exception thrown when the user does not have a valid cval license.
+ */
+ public static class InvalidCvalException extends Exception {
+ private static final long serialVersionUID = 1L;
+ public final CvalInfo info;
+ public final String name;
+ public final String key;
+ public final String version;
+ public final String title;
+
+ public InvalidCvalException(String name, String version, String title,
+ String key, CvalInfo info) {
+ super(composeMessage(title, version, key, info));
+ this.info = info;
+ this.name = name;
+ this.key = key;
+ this.version = version;
+ this.title = title;
+ }
+
+ static String composeMessage(String title, String version, String key,
+ CvalInfo info) {
+ String msg = "";
+ int majorVers = computeMajorVersion(version);
+
+ if (info != null && info.getMessage() != null) {
+ msg = info.getMessage().replace("\\n", "\n");
+ } else if (info != null && info.isLicenseExpired()) {
+ String type = "evaluation".equals(info.getType()) ? "Evaluation license"
+ : "License";
+ msg = getErrorMessage("expired", title, majorVers, type);
+ } else if (key == null) {
+ msg = getErrorMessage("none", title, majorVers);
+ } else {
+ msg = getErrorMessage("invalid", title, majorVers);
+ }
+ return msg;
+ }
+ }
+
+ /**
+ * Exception thrown when the license server is unreachable
+ */
+ public static class UnreachableCvalServerException extends Exception {
+ private static final long serialVersionUID = 1L;
+ public final String name;
+
+ public UnreachableCvalServerException(String name, Exception e) {
+ super(e);
+ this.name = name;
+ }
+ }
+
+ public static final String LINE = "----------------------------------------------------------------------------------------------------------------------";
+
+ static final int GRACE_DAYS_MSECS = 2 * 24 * 60 * 60 * 1000;
+
+ private static final String LICENSE_URL_PROD = "https://tools.vaadin.com/vaadin-license-server/licenses/";
+
+ /*
+ * used in tests
+ */
+ static void cacheLicenseInfo(CvalInfo info) {
+ if (info != null) {
+ Preferences p = Preferences.userNodeForPackage(CvalInfo.class);
+ if (info.toString().length() > Preferences.MAX_VALUE_LENGTH) {
+ // This should never happen since MAX_VALUE_LENGTH is big
+ // enough.
+ // But server could eventually send a very big message, so we
+ // discard it in cache and would use hard-coded messages.
+ info.setMessage(null);
+ }
+ p.put(info.getProduct().getName(), info.toString());
+ }
+ }
+
+ /*
+ * used in tests
+ */
+ static void deleteCache(String productName) {
+ Preferences p = Preferences.userNodeForPackage(CvalInfo.class);
+ p.remove(productName);
+ }
+
+ /**
+ * Given a product name returns the name of the file with the license key.
+ *
+ * Traditionally we have delivered license keys with a name like
+ * 'vaadin.touchkit.developer.license' but our database product name is
+ * 'vaadin-touchkit' so we have to replace '-' by '.' to maintain
+ * compatibility.
+ */
+ static final String computeLicenseName(String productName) {
+ return productName.replace("-", ".") + ".developer.license";
+ }
+
+ static final int computeMajorVersion(String productVersion) {
+ return productVersion == null || productVersion.isEmpty() ? 0
+ : parseInt(productVersion.replaceFirst("[^\\d]+.*$", ""));
+ }
+
+ /*
+ * used in tests
+ */
+ static CvalInfo parseJson(String json) {
+ if (json == null) {
+ return null;
+ }
+ try {
+ JSONObject o = new JSONObject(json);
+ return new CvalInfo(o);
+ } catch (JSONException e) {
+ return null;
+ }
+ }
+
+ private CvalServer provider;
+
+ /**
+ * The constructor.
+ */
+ public CvalChecker() {
+ setLicenseProvider(new CvalServer());
+ }
+
+ /**
+ * Validate whether there is a valid license key for a product.
+ *
+ * @param productName
+ * for example vaadin-touchkit
+ * @param productVersion
+ * for instance 4.0.1
+ * @return CvalInfo Server response or cache response if server is offline
+ * @throws InvalidCvalException
+ * when there is no a valid license for the product
+ * @throws UnreachableCvalServerException
+ * when we have license key but server is unreachable
+ */
+ public CvalInfo validateProduct(String productName, String productVersion,
+ String productTitle) throws InvalidCvalException,
+ UnreachableCvalServerException {
+ String key = getDeveloperLicenseKey(productName, productVersion,
+ productTitle);
+
+ CvalInfo info = null;
+ if (key != null && !key.isEmpty()) {
+ info = getCachedLicenseInfo(productName);
+ if (info != null && !info.isValidInfo(productName, key)) {
+ deleteCache(productName);
+ info = null;
+ }
+ info = askLicenseServer(productName, key, productVersion, info);
+ if (info != null && info.isValidInfo(productName, key)
+ && info.isValidVersion(computeMajorVersion(productVersion))
+ && !info.isLicenseExpired()) {
+ return info;
+ }
+ }
+
+ throw new InvalidCvalException(productName, productVersion,
+ productTitle, key, info);
+ }
+
+ /*
+ * Change the license provider, only used in tests.
+ */
+ final CvalChecker setLicenseProvider(CvalServer p) {
+ provider = p;
+ return this;
+ }
+
+ private CvalInfo askLicenseServer(String productName, String productKey,
+ String productVersion, CvalInfo info)
+ throws UnreachableCvalServerException {
+
+ int majorVersion = computeMajorVersion(productVersion);
+
+ // If we have a valid license info here, it means that we got it from
+ // cache.
+ // We add a grace time when so as if the server is unreachable
+ // we allow the user to use the product.
+ if (info != null && info.getExpiredEpoch() != null
+ && !"evaluation".equals(info.getType())) {
+ long ts = info.getExpiredEpoch().getTime() + GRACE_DAYS_MSECS;
+ info.setExpiredEpoch(new Date(ts));
+ }
+
+ boolean validCache = info != null
+ && info.isValidInfo(productName, productKey)
+ && info.isValidVersion(majorVersion)
+ && !info.isLicenseExpired();
+
+ // if we have a validCache we set the timeout smaller
+ int timeout = validCache ? 2000 : 10000;
+
+ try {
+ CvalInfo srvinfo = parseJson(provider.askServer(productName + "-"
+ + productVersion, productKey, timeout));
+ if (srvinfo != null && srvinfo.isValidInfo(productName, productKey)
+ && srvinfo.isValidVersion(majorVersion)) {
+ // We always cache the info if it is valid although it is
+ // expired
+ cacheLicenseInfo(srvinfo);
+ info = srvinfo;
+ }
+ } catch (FileNotFoundException e) {
+ // 404
+ return null;
+ } catch (Exception e) {
+ if (info == null) {
+ throw new UnreachableCvalServerException(productName, e);
+ }
+ }
+ return info;
+ }
+
+ private CvalInfo getCachedLicenseInfo(String productName) {
+ Preferences p = Preferences.userNodeForPackage(CvalInfo.class);
+ String json = p.get(productName, "");
+ if (!json.isEmpty()) {
+ CvalInfo info = parseJson(json);
+ if (info != null) {
+ return info;
+ }
+ }
+ return null;
+ }
+
+ private String getDeveloperLicenseKey(String productName,
+ String productVersion, String productTitle)
+ throws InvalidCvalException {
+ String licenseName = computeLicenseName(productName);
+
+ String key = System.getProperty(licenseName);
+ if (key != null && !key.isEmpty()) {
+ return key;
+ }
+
+ try {
+ String dotLicenseName = "." + licenseName;
+ String userHome = "file://" + System.getProperty("user.home") + "/";
+ for (URL url : new URL[] { new URL(userHome + dotLicenseName),
+ new URL(userHome + licenseName),
+ URL.class.getResource("/" + dotLicenseName),
+ URL.class.getResource("/" + licenseName) }) {
+
+ if (url != null) {
+ try {
+ key = IOUtils.toString(url.openStream());
+ if (key != null && !(key = key.trim()).isEmpty()) {
+ return key;
+ }
+ } catch (IOException ignored) {
+ }
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ throw new InvalidCvalException(productName, productVersion,
+ productTitle, null, null);
+ }
+
+ static String getErrorMessage(String key, Object... pars) {
+ Locale loc = Locale.getDefault();
+ ResourceBundle res = ResourceBundle.getBundle(
+ CvalChecker.class.getName(), loc);
+ String msg = res.getString(key);
+ return new MessageFormat(msg, loc).format(pars);
+ }
+}
diff --git a/client-compiler/src/com/vaadin/tools/CvalChecker.properties b/client-compiler/src/com/vaadin/tools/CvalChecker.properties
new file mode 100644
index 0000000000..3f4fd52cb7
--- /dev/null
+++ b/client-compiler/src/com/vaadin/tools/CvalChecker.properties
@@ -0,0 +1,13 @@
+expired={2} for {0} {1} has expired. Get a valid license at vaadin.com/pro
+
+none=License for {0} {1} not found. Go to vaadin.com/pro for more details.
+
+invalid=License for {0} {1} is not valid. Get a valid license from vaadin.com/pro
+
+unreachable=License for {0} {1} has not been validated. Check your network connection.
+
+evaluation= > Using an evaluation license for {0} {1}.
+
+valid= > Using a valid license for {0} {1}.
+
+agpl=Using AGPL version of {0} {1}. Commercial licensing options available at vaadin.com/pro \ No newline at end of file
diff --git a/client-compiler/tests/src/com/vaadin/tools/CvalAddonsCheckerTest.java b/client-compiler/tests/src/com/vaadin/tools/CvalAddonsCheckerTest.java
new file mode 100644
index 0000000000..1fb9413ee4
--- /dev/null
+++ b/client-compiler/tests/src/com/vaadin/tools/CvalAddonsCheckerTest.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.tools;
+
+import static com.vaadin.tools.CvalAddonsChecker.VAADIN_AGPL;
+import static com.vaadin.tools.CvalAddonsChecker.VAADIN_CVAL;
+import static com.vaadin.tools.CvalChecker.GRACE_DAYS_MSECS;
+import static com.vaadin.tools.CvalChecker.computeLicenseName;
+import static com.vaadin.tools.CvalChecker.deleteCache;
+import static com.vaadin.tools.CvalCheckerTest.VALID_KEY;
+import static com.vaadin.tools.CvalCheckerTest.addLicensedJarToClasspath;
+import static com.vaadin.tools.CvalCheckerTest.cacheExists;
+import static com.vaadin.tools.CvalCheckerTest.captureSystemOut;
+import static com.vaadin.tools.CvalCheckerTest.productNameAgpl;
+import static com.vaadin.tools.CvalCheckerTest.productNameApache;
+import static com.vaadin.tools.CvalCheckerTest.productNameCval;
+import static com.vaadin.tools.CvalCheckerTest.readSystemOut;
+import static com.vaadin.tools.CvalCheckerTest.saveCache;
+import static com.vaadin.tools.CvalCheckerTest.unreachableLicenseProvider;
+import static com.vaadin.tools.CvalCheckerTest.validLicenseProvider;
+
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.vaadin.client.metadata.ConnectorBundleLoader.CValUiInfo;
+import com.vaadin.tools.CvalChecker.InvalidCvalException;
+
+/**
+ * The CvalAddonsChecker test.
+ */
+public class CvalAddonsCheckerTest {
+
+ CvalAddonsChecker addonChecker;
+ private String licenseName;
+
+ @Before
+ public void setup() {
+ addonChecker = new CvalAddonsChecker().setLicenseProvider(
+ validLicenseProvider).setFilter(".*test.*");
+ licenseName = computeLicenseName(productNameCval);
+
+ deleteCache(productNameCval);
+ System.getProperties().remove(licenseName);
+ }
+
+ @Test
+ public void testRunChecker() throws Exception {
+ // Create a product .jar with a cval license non required and add to our
+ // classpath
+ addLicensedJarToClasspath(productNameCval, VAADIN_CVAL);
+ // Remove other products in case other tests added them previously
+ addLicensedJarToClasspath(productNameAgpl, null);
+ addLicensedJarToClasspath(productNameApache, null);
+
+ // No license
+ // -> Break compilation
+ System.getProperties().remove(licenseName);
+ addonChecker.setLicenseProvider(validLicenseProvider);
+ try {
+ addonChecker.run();
+ Assert.fail();
+ } catch (InvalidCvalException expected) {
+ }
+ Assert.assertFalse(cacheExists(productNameCval));
+
+ // We have a license that has never been validated from the server and
+ // we are offline
+ // -> Show a message on compile time (“Your license for TouchKit 4 has
+ // not been validated.”)
+ System.setProperty(licenseName, VALID_KEY);
+ addonChecker.setLicenseProvider(unreachableLicenseProvider);
+ captureSystemOut();
+ addonChecker.run();
+ Assert.assertTrue(readSystemOut().contains("has not been validated"));
+ Assert.assertFalse(cacheExists(productNameCval));
+
+ // Valid license has previously been validated from the server and we
+ // are offline
+ // -> Use the cached server response
+ System.setProperty(licenseName, VALID_KEY);
+ addonChecker.setLicenseProvider(validLicenseProvider);
+ captureSystemOut();
+ addonChecker.run();
+ Assert.assertTrue(cacheExists(productNameCval));
+ addonChecker.setLicenseProvider(unreachableLicenseProvider);
+ addonChecker.run();
+
+ // Expired license and we are offline
+ // -> If it has expired less than 14 days ago, just work with no nag
+ // messages
+ System.setProperty(licenseName, VALID_KEY);
+ addonChecker.setLicenseProvider(unreachableLicenseProvider);
+ setCacheFileTs(System.currentTimeMillis() - (GRACE_DAYS_MSECS / 2),
+ "normal");
+ captureSystemOut();
+ addonChecker.run();
+
+ // Expired license and we are offline
+ // -> After 14 days, interpret it as expired license
+ setCacheFileTs(System.currentTimeMillis() - (GRACE_DAYS_MSECS * 2),
+ "normal");
+ try {
+ addonChecker.run();
+ Assert.fail();
+ } catch (InvalidCvalException expected) {
+ }
+
+ // Invalid evaluation license
+ // -> Fail compilation with a message
+ // "Your evaluation license for TouchKit 4 is not valid"
+ System.setProperty(licenseName, VALID_KEY);
+ addonChecker.setLicenseProvider(unreachableLicenseProvider);
+ setCacheFileTs(System.currentTimeMillis() - (GRACE_DAYS_MSECS / 2),
+ "evaluation");
+ try {
+ addonChecker.run();
+ Assert.fail();
+ } catch (InvalidCvalException expected) {
+ Assert.assertTrue(expected.getMessage().contains("expired"));
+ }
+
+ // Valid evaluation license
+ // -> The choice on whether to show the message is generated in
+ // widgetset
+ // compilation phase. No license checks are done in application runtime.
+ System.setProperty(licenseName, VALID_KEY);
+ addonChecker.setLicenseProvider(unreachableLicenseProvider);
+ setCacheFileTs(System.currentTimeMillis() + GRACE_DAYS_MSECS,
+ "evaluation");
+ List<CValUiInfo> uiInfo = addonChecker.run();
+ Assert.assertEquals(1, uiInfo.size());
+ Assert.assertEquals("Test " + productNameCval, uiInfo.get(0).product);
+ Assert.assertEquals("evaluation", uiInfo.get(0).type);
+
+ // Valid real license
+ // -> Work as expected
+ // -> Show info message “Using TouchKit 4 license
+ // 312-312321-321312-3-12-312-312
+ // licensed to <licensee> (1 developer license)”
+ System.setProperty(licenseName, VALID_KEY);
+ addonChecker.setLicenseProvider(validLicenseProvider);
+ captureSystemOut();
+ addonChecker.run();
+ Assert.assertTrue(readSystemOut().contains("valid"));
+ }
+
+ @Test
+ public void validateMultipleLicenses() throws Exception {
+ addLicensedJarToClasspath(productNameCval, VAADIN_CVAL);
+ addLicensedJarToClasspath(productNameAgpl, VAADIN_AGPL);
+ addLicensedJarToClasspath(productNameApache, "apache");
+
+ // We have a valid license for all products
+ System.setProperty(licenseName, VALID_KEY);
+ captureSystemOut();
+ addonChecker.run();
+ String out = readSystemOut();
+ Assert.assertTrue(out.contains("valid"));
+ Assert.assertTrue(out.contains("AGPL"));
+ Assert.assertTrue(cacheExists(productNameCval));
+ }
+
+ private void setCacheFileTs(long expireTs, String type) {
+ saveCache(productNameCval, null, false, expireTs, type);
+ }
+
+}
diff --git a/client-compiler/tests/src/com/vaadin/tools/CvalAddonstCheckerUseCasesTest.java b/client-compiler/tests/src/com/vaadin/tools/CvalAddonstCheckerUseCasesTest.java
new file mode 100644
index 0000000000..89c8fc1f81
--- /dev/null
+++ b/client-compiler/tests/src/com/vaadin/tools/CvalAddonstCheckerUseCasesTest.java
@@ -0,0 +1,217 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.tools;
+
+import static com.vaadin.tools.CvalAddonsChecker.VAADIN_AGPL;
+import static com.vaadin.tools.CvalAddonsChecker.VAADIN_CVAL;
+import static com.vaadin.tools.CvalChecker.computeLicenseName;
+import static com.vaadin.tools.CvalChecker.deleteCache;
+import static com.vaadin.tools.CvalCheckerTest.INVALID_KEY;
+import static com.vaadin.tools.CvalCheckerTest.VALID_KEY;
+import static com.vaadin.tools.CvalCheckerTest.addLicensedJarToClasspath;
+import static com.vaadin.tools.CvalCheckerTest.cachedPreferences;
+import static com.vaadin.tools.CvalCheckerTest.captureSystemOut;
+import static com.vaadin.tools.CvalCheckerTest.expiredLicenseProvider;
+import static com.vaadin.tools.CvalCheckerTest.productNameAgpl;
+import static com.vaadin.tools.CvalCheckerTest.productNameCval;
+import static com.vaadin.tools.CvalCheckerTest.readSystemOut;
+import static com.vaadin.tools.CvalCheckerTest.restoreSystemOut;
+import static com.vaadin.tools.CvalCheckerTest.saveCache;
+import static com.vaadin.tools.CvalCheckerTest.unreachableLicenseProvider;
+import static com.vaadin.tools.CvalCheckerTest.validEvaluationLicenseProvider;
+import static com.vaadin.tools.CvalCheckerTest.validLicenseProvider;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.vaadin.tools.CvalChecker.CvalServer;
+
+/**
+ * Tests for Use Cases
+ */
+public class CvalAddonstCheckerUseCasesTest {
+
+ enum License {
+ NONE, EVAL, INVALID, REAL, EVAL_EXPIRED, REAL_EXPIRED
+ };
+
+ enum Version {
+ AGPL, CVAL
+ };
+
+ enum Validated {
+ YES, NO, OLD_KEY
+ };
+
+ enum Network {
+ ON, OFF
+ };
+
+ enum Compile {
+ YES, NO
+ };
+
+ enum Cached {
+ YES, NO
+ };
+
+ enum Message {
+ AGPL("AGPL"), VALID(">.* valid"), INVALID("not valid"), NO_LICENSE(
+ "not found"), NO_VALIDATED("has not been validated"), EXPIRED(
+ "has expired"), EVALUATION("evaluation");
+
+ String msg;
+
+ Message(String s) {
+ msg = s;
+ }
+ }
+
+ @Test
+ public void testUseCases() throws Exception {
+ useCase(1, License.NONE, Version.AGPL, Validated.NO, Network.OFF,
+ Compile.YES, Cached.NO, Message.AGPL);
+
+ useCase(2, License.NONE, Version.CVAL, Validated.NO, Network.ON,
+ Compile.NO, Cached.NO, Message.NO_LICENSE);
+
+ useCase(3, License.NONE, Version.CVAL, Validated.NO, Network.OFF,
+ Compile.NO, Cached.NO, Message.NO_LICENSE);
+
+ useCase(4, License.EVAL, Version.CVAL, Validated.NO, Network.ON,
+ Compile.YES, Cached.YES, Message.EVALUATION);
+
+ useCase(5, License.INVALID, Version.CVAL, Validated.NO, Network.OFF,
+ Compile.YES, Cached.NO, Message.NO_VALIDATED);
+
+ useCase(6, License.INVALID, Version.CVAL, Validated.NO, Network.ON,
+ Compile.NO, Cached.NO, Message.INVALID);
+
+ useCase(7, License.REAL, Version.CVAL, Validated.NO, Network.ON,
+ Compile.YES, Cached.YES, Message.VALID);
+
+ useCase(8, License.REAL, Version.CVAL, Validated.NO, Network.OFF,
+ Compile.YES, Cached.NO, Message.NO_VALIDATED);
+
+ useCase(9, License.REAL, Version.CVAL, Validated.YES, Network.OFF,
+ Compile.YES, Cached.YES, Message.VALID);
+
+ useCase(10, License.EVAL_EXPIRED, Version.CVAL, Validated.NO,
+ Network.ON, Compile.NO, Cached.YES, Message.EXPIRED);
+
+ useCase(11, License.EVAL_EXPIRED, Version.CVAL, Validated.YES,
+ Network.OFF, Compile.NO, Cached.YES, Message.EXPIRED);
+
+ useCase(12, License.REAL_EXPIRED, Version.CVAL, Validated.YES,
+ Network.OFF, Compile.NO, Cached.YES, Message.EXPIRED);
+
+ useCase(13, License.REAL_EXPIRED, Version.CVAL, Validated.NO,
+ Network.ON, Compile.NO, Cached.YES, Message.EXPIRED);
+
+ useCase(14, License.INVALID, Version.CVAL, Validated.OLD_KEY,
+ Network.OFF, Compile.YES, Cached.NO, Message.NO_VALIDATED);
+ }
+
+ @Test
+ public void testMultipleLicenseUseCases() throws Exception {
+ addLicensedJarToClasspath("test.foo", VAADIN_CVAL);
+ System.setProperty(computeLicenseName("test.foo"), VALID_KEY);
+
+ useCase(15, License.REAL, Version.CVAL, Validated.YES, Network.OFF,
+ Compile.YES, Cached.YES, Message.NO_VALIDATED);
+
+ useCase(16, License.REAL, Version.CVAL, Validated.YES, Network.ON,
+ Compile.NO, Cached.YES, Message.INVALID);
+ }
+
+ private void useCase(int number, License lic, Version ver, Validated val,
+ Network net, Compile res, Cached cached, Message msg)
+ throws Exception {
+
+ if (ver == Version.AGPL) {
+ addLicensedJarToClasspath(productNameAgpl, VAADIN_AGPL);
+ addLicensedJarToClasspath(productNameCval, null);
+ } else {
+ addLicensedJarToClasspath(productNameAgpl, null);
+ addLicensedJarToClasspath(productNameCval, VAADIN_CVAL);
+ }
+
+ String licenseName = computeLicenseName(productNameCval);
+
+ if (lic == License.NONE) {
+ System.getProperties().remove(licenseName);
+ } else if (lic == License.INVALID) {
+ System.setProperty(licenseName, INVALID_KEY);
+ } else {
+ System.setProperty(licenseName, VALID_KEY);
+ }
+
+ if (val == Validated.NO) {
+ deleteCache(productNameCval);
+ } else {
+ String type = lic == License.EVAL || lic == License.EVAL_EXPIRED ? "evaluation"
+ : null;
+ Boolean expired = lic == License.EVAL_EXPIRED
+ || lic == License.REAL_EXPIRED ? true : null;
+ String key = val == Validated.OLD_KEY ? "oldkey" : null;
+ saveCache(productNameCval, key, expired, null, type);
+ }
+
+ CvalServer licenseProvider = validLicenseProvider;
+ if (net == Network.OFF) {
+ licenseProvider = unreachableLicenseProvider;
+ } else if (lic == License.EVAL_EXPIRED || lic == License.REAL_EXPIRED) {
+ licenseProvider = expiredLicenseProvider;
+ } else if (lic == License.EVAL) {
+ licenseProvider = validEvaluationLicenseProvider;
+ }
+
+ CvalAddonsChecker addonChecker = new CvalAddonsChecker();
+ addonChecker.setLicenseProvider(licenseProvider).setFilter(".*test.*");
+
+ captureSystemOut();
+
+ String testNumber = "Test #" + number + " ";
+ String message;
+ try {
+ addonChecker.run();
+ message = readSystemOut();
+ if (res == Compile.NO) {
+ Assert.fail(testNumber + "Exception not thrown:" + message);
+ }
+ } catch (Exception e) {
+ restoreSystemOut();
+ message = e.getMessage();
+ if (res == Compile.YES) {
+ Assert.fail(testNumber + "Unexpected Exception: "
+ + e.getMessage());
+ }
+ }
+
+ // System.err.println("\n> " + testNumber + " " + lic + " " + ver + " "
+ // + val + " " + net + " " + res + " " + cached + "\n" + message);
+
+ Assert.assertTrue(testNumber + "Fail:\n" + message
+ + "\nDoes not match:" + msg.msg,
+ message.matches("(?s).*" + msg.msg + ".*"));
+
+ String c = cachedPreferences(productNameCval);
+ Assert.assertTrue(testNumber + "Fail: cacheExists != "
+ + (cached == Cached.YES) + "\n " + c,
+ (c != null) == (cached == Cached.YES));
+ }
+}
diff --git a/client-compiler/tests/src/com/vaadin/tools/CvalCheckerTest.java b/client-compiler/tests/src/com/vaadin/tools/CvalCheckerTest.java
new file mode 100644
index 0000000000..51b12f4c7e
--- /dev/null
+++ b/client-compiler/tests/src/com/vaadin/tools/CvalCheckerTest.java
@@ -0,0 +1,342 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.tools;
+
+import static com.vaadin.tools.CvalAddonsChecker.VAADIN_ADDON_LICENSE;
+import static com.vaadin.tools.CvalAddonsChecker.VAADIN_ADDON_NAME;
+import static com.vaadin.tools.CvalAddonsChecker.VAADIN_ADDON_TITLE;
+import static com.vaadin.tools.CvalAddonsChecker.VAADIN_ADDON_VERSION;
+import static com.vaadin.tools.CvalChecker.GRACE_DAYS_MSECS;
+import static com.vaadin.tools.CvalChecker.cacheLicenseInfo;
+import static com.vaadin.tools.CvalChecker.deleteCache;
+import static com.vaadin.tools.CvalChecker.parseJson;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileDescriptor;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.jar.JarOutputStream;
+import java.util.jar.Manifest;
+import java.util.prefs.Preferences;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.vaadin.tools.CvalChecker.CvalInfo;
+import com.vaadin.tools.CvalChecker.CvalServer;
+import com.vaadin.tools.CvalChecker.InvalidCvalException;
+import com.vaadin.tools.CvalChecker.UnreachableCvalServerException;
+
+/**
+ * The CvalChecker test.
+ */
+public class CvalCheckerTest {
+
+ static final String productNameCval = "test.cval";
+ static final String productTitleCval = "Vaadin Test";
+ static final String productNameAgpl = "test.agpl";
+ static final String productTitleAgpl = "Vaadin Test";
+ static final String productNameApache = "test.apache";
+ static final String VALID_KEY = "valid";
+ static final String INVALID_KEY = "invalid";
+
+ static final String responseJson = "{'licenseKey':'" + VALID_KEY + "',"
+ + "'licensee':'Test User','type':'normal',"
+ + "'expiredEpoch':'1893511225000'," + "'product':{'name':'"
+ + productNameCval + "', 'version': 2}}";
+
+ private static ByteArrayOutputStream outContent;
+
+ // A provider returning a valid license if productKey is valid or null if
+ // invalid
+ static final CvalServer validLicenseProvider = new CvalServer() {
+ @Override
+ String askServer(String productName, String productKey, int timeout) {
+ return VALID_KEY.equals(productKey) ? responseJson : null;
+ }
+ };
+ // A provider returning a valid evaluation license
+ static final CvalServer validEvaluationLicenseProvider = new CvalServer() {
+ @Override
+ String askServer(String productName, String productKey, int timeout) {
+ return responseJson.replace("normal", "evaluation");
+ }
+ };
+ // A provider returning an expired license with a server message
+ static final CvalServer expiredLicenseProviderWithMessage = new CvalServer() {
+ @Override
+ String askServer(String productName, String productKey, int timeout) {
+ return responseJson
+ .replace("'expired",
+ "'message':'Custom\\\\nServer\\\\nMessage','expired':true,'expired");
+ }
+ };
+ // A provider returning an expired license with a server message
+ static final CvalServer expiredLicenseProvider = new CvalServer() {
+ @Override
+ String askServer(String productName, String productKey, int timeout) {
+ return responseJson.replace("'expired", "'expired':true,'expired");
+ }
+ };
+ // A provider returning an expired epoch license
+ static final CvalServer expiredEpochLicenseProvider = new CvalServer() {
+ @Override
+ String askServer(String productName, String productKey, int timeout) {
+ long ts = System.currentTimeMillis() - GRACE_DAYS_MSECS - 1000;
+ return responseJson.replace("1893511225000", "" + ts);
+ }
+ };
+ // A provider returning an unlimited license
+ static final CvalServer unlimitedLicenseProvider = new CvalServer() {
+ @Override
+ String askServer(String productName, String productKey, int timeout) {
+ return responseJson.replaceFirst("1893511225000", "");
+ }
+ };
+ // An unreachable provider
+ static final CvalServer unreachableLicenseProvider = new CvalServer() {
+ @Override
+ String askServer(String productName, String productKey, int timeout)
+ throws IOException {
+ // Normally there is no route for this ip in public routers, so we
+ // should get a timeout.
+ licenseUrl = "http://localhost:9999/";
+ return super.askServer(productName, productKey, 1000);
+ }
+ };
+
+ private CvalChecker licenseChecker;
+ private String licenseName;
+
+ @Before
+ public void setup() {
+ licenseChecker = new CvalChecker()
+ .setLicenseProvider(validLicenseProvider);
+ licenseName = CvalChecker.computeLicenseName(productNameCval);
+ System.getProperties().remove(licenseName);
+ deleteCache(productNameCval);
+ }
+
+ @Test
+ public void testValidateProduct() throws Exception {
+ deleteCache(productNameCval);
+
+ // If the license key in our environment is null, throw an exception
+ try {
+ licenseChecker.validateProduct(productNameCval, "2.1",
+ productTitleCval);
+ Assert.fail();
+ } catch (InvalidCvalException expected) {
+ Assert.assertEquals(productNameCval, expected.name);
+ }
+ Assert.assertFalse(cacheExists(productNameCval));
+
+ // If the license key is empty, throw an exception
+ System.setProperty(licenseName, "");
+ try {
+ licenseChecker.validateProduct(productNameCval, "2.1",
+ productTitleCval);
+ Assert.fail();
+ } catch (InvalidCvalException expected) {
+ Assert.assertEquals(productNameCval, expected.name);
+ }
+ Assert.assertFalse(cacheExists(productNameCval));
+
+ // If license key is invalid, throw an exception
+ System.setProperty(licenseName, "invalid");
+ try {
+ licenseChecker.validateProduct(productNameCval, "2.1",
+ productTitleCval);
+ Assert.fail();
+ } catch (InvalidCvalException expected) {
+ Assert.assertEquals(productNameCval, expected.name);
+ }
+ Assert.assertFalse(cacheExists(productNameCval));
+
+ // Fail if version is bigger
+ System.setProperty(licenseName, VALID_KEY);
+ try {
+ licenseChecker.validateProduct(productNameCval, "3.0",
+ productTitleCval);
+ Assert.fail();
+ } catch (InvalidCvalException expected) {
+ Assert.assertEquals(productNameCval, expected.name);
+ }
+ Assert.assertFalse(cacheExists(productNameCval));
+
+ // Success if license key and version are valid
+ System.setProperty(licenseName, VALID_KEY);
+ licenseChecker
+ .validateProduct(productNameCval, "2.1", productTitleCval);
+ Assert.assertTrue(cacheExists(productNameCval));
+
+ // Success if license and cache file are valid, although the license
+ // server is offline
+ licenseChecker.setLicenseProvider(unreachableLicenseProvider);
+ licenseChecker
+ .validateProduct(productNameCval, "2.1", productTitleCval);
+ Assert.assertTrue(cacheExists(productNameCval));
+
+ // Fail if license key changes although cache file were validated
+ // previously and it is ok, we are offline
+ try {
+ System.setProperty(licenseName, INVALID_KEY);
+ licenseChecker.validateProduct(productNameCval, "2.1",
+ productTitleCval);
+ Assert.fail();
+ } catch (InvalidCvalException expected) {
+ Assert.fail();
+ } catch (UnreachableCvalServerException expected) {
+ Assert.assertEquals(productNameCval, expected.name);
+ }
+ Assert.assertFalse(cacheExists(productNameCval));
+
+ // Fail with unreachable exception if license has never verified and
+ // server is offline
+ try {
+ System.setProperty(licenseName, VALID_KEY);
+ licenseChecker.validateProduct(productNameCval, "2.1",
+ productTitleCval);
+ Assert.fail();
+ } catch (InvalidCvalException expected) {
+ Assert.fail();
+ } catch (UnreachableCvalServerException expected) {
+ Assert.assertEquals(productNameCval, expected.name);
+ }
+ Assert.assertFalse(cacheExists(productNameCval));
+
+ // Fail when expired flag comes in the server response, although the
+ // expired is valid.
+ deleteCache(productNameCval);
+ licenseChecker.setLicenseProvider(expiredLicenseProviderWithMessage);
+ try {
+ licenseChecker.validateProduct(productNameCval, "2.1",
+ productTitleCval);
+ Assert.fail();
+ } catch (InvalidCvalException expected) {
+ Assert.assertEquals(productNameCval, expected.name);
+ // Check that we use server customized message if it comes
+ Assert.assertTrue(expected.getMessage().contains("Custom"));
+ }
+ Assert.assertTrue(cacheExists(productNameCval));
+
+ // Check an unlimited license
+ licenseChecker.setLicenseProvider(unlimitedLicenseProvider);
+ licenseChecker
+ .validateProduct(productNameCval, "2.1", productTitleCval);
+ Assert.assertTrue(cacheExists(productNameCval));
+
+ // Fail if expired flag does not come, but expired epoch is in the past
+ System.setProperty(licenseName, VALID_KEY);
+ deleteCache(productNameCval);
+ licenseChecker.setLicenseProvider(expiredEpochLicenseProvider);
+ try {
+ licenseChecker.validateProduct(productNameCval, "2.1",
+ productTitleCval);
+ Assert.fail();
+ } catch (InvalidCvalException expected) {
+ Assert.assertEquals(productNameCval, expected.name);
+ }
+ Assert.assertTrue(cacheExists(productNameCval));
+ }
+
+ /*
+ * Creates a new .jar file with a MANIFEST.MF with all vaadin license info
+ * attributes set, and add the .jar to the classpath
+ */
+ static void addLicensedJarToClasspath(String productName, String licenseType)
+ throws Exception {
+ // Create a manifest with Vaadin CVAL license
+ Manifest testManifest = new Manifest();
+ testManifest.getMainAttributes().putValue("Manifest-Version", "1.0");
+ testManifest.getMainAttributes().putValue(VAADIN_ADDON_LICENSE,
+ licenseType);
+ testManifest.getMainAttributes().putValue(VAADIN_ADDON_NAME,
+ productName);
+ testManifest.getMainAttributes().putValue(VAADIN_ADDON_TITLE,
+ "Test " + productName);
+ testManifest.getMainAttributes().putValue(VAADIN_ADDON_VERSION, "2");
+
+ // Create a temporary Jar
+ String tmpDir = System.getProperty("java.io.tmpdir");
+ File testJarFile = new File(tmpDir + "vaadin." + productName + ".jar");
+ testJarFile.deleteOnExit();
+ JarOutputStream target = new JarOutputStream(new FileOutputStream(
+ testJarFile), testManifest);
+ target.close();
+
+ // Add the new jar to our classpath (use reflection)
+ URL url = new URL("file://" + testJarFile.getAbsolutePath());
+ final Method addURL = URLClassLoader.class.getDeclaredMethod("addURL",
+ new Class[] { URL.class });
+ addURL.setAccessible(true);
+ final URLClassLoader urlClassLoader = (URLClassLoader) Thread
+ .currentThread().getContextClassLoader();
+ addURL.invoke(urlClassLoader, new Object[] { url });
+ }
+
+ static boolean cacheExists(String productName) {
+ return cachedPreferences(productName) != null;
+ }
+
+ static String cachedPreferences(String productName) {
+ // ~/Library/Preferences/com.apple.java.util.prefs.plist
+ // .java/.userPrefs/com/google/gwt/dev/shell/prefs.xml
+ // HKEY_CURRENT_USER\SOFTWARE\JavaSoft\Prefs
+ Preferences p = Preferences.userNodeForPackage(CvalInfo.class);
+ return p.get(productName, null);
+ }
+
+ static void saveCache(String productName, String key, Boolean expired,
+ Long expireTs, String type) {
+ String json = responseJson.replace(productNameCval, productName);
+ if (expired != null && expired) {
+ expireTs = System.currentTimeMillis() - GRACE_DAYS_MSECS - 1000;
+ }
+ if (expireTs != null) {
+ json = json.replace("1893511225000", "" + expireTs);
+ }
+ if (key != null) {
+ json = json.replace(VALID_KEY, key);
+ }
+ if (type != null) {
+ json = json.replace("normal", type);
+
+ }
+ cacheLicenseInfo(parseJson(json));
+ }
+
+ static void captureSystemOut() {
+ outContent = new ByteArrayOutputStream();
+ System.setOut(new PrintStream(outContent));
+ }
+
+ static String readSystemOut() {
+ restoreSystemOut();
+ return outContent.toString();
+ }
+
+ static void restoreSystemOut() {
+ System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
+ }
+}
diff --git a/client/src/com/vaadin/client/AnimationUtil.java b/client/src/com/vaadin/client/AnimationUtil.java
index 9f80d98ef2..2077cee3c0 100644
--- a/client/src/com/vaadin/client/AnimationUtil.java
+++ b/client/src/com/vaadin/client/AnimationUtil.java
@@ -15,6 +15,7 @@
*/
package com.vaadin.client;
+import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.dom.client.Style;
@@ -57,7 +58,7 @@ public class AnimationUtil {
}
/** For internal use only. May be removed or replaced in the future. */
- public static native void registerAnimationEndEventListener(Element elem,
+ public static native JavaScriptObject addAnimationEndListener(Element elem,
AnimationEndListener listener)
/*-{
var callbackFunc = $entry(function(e) {
@@ -71,10 +72,19 @@ public class AnimationUtil {
elem._vaadin_animationend_callbacks = [];
}
elem._vaadin_animationend_callbacks.push(callbackFunc);
+
+ return callbackFunc;
+ }-*/;
+
+ /** For internal use only. May be removed or replaced in the future. */
+ public static native void removeAnimationEndListener(Element elem,
+ JavaScriptObject listener)
+ /*-{
+ elem.removeEventListener(@com.vaadin.client.AnimationUtil::ANIMATION_END_EVENT_NAME, listener, false);
}-*/;
/** For internal use only. May be removed or replaced in the future. */
- public static native void unregisterAnimationEndEventListeners(Element elem)
+ public static native void removeAllAnimationEndListeners(Element elem)
/*-{
if(elem._vaadin_animationend_callbacks) {
var callbacks = elem._vaadin_animationend_callbacks;
diff --git a/client/src/com/vaadin/client/ApplicationConfiguration.java b/client/src/com/vaadin/client/ApplicationConfiguration.java
index c7ef9586c5..0d17fbd94f 100644
--- a/client/src/com/vaadin/client/ApplicationConfiguration.java
+++ b/client/src/com/vaadin/client/ApplicationConfiguration.java
@@ -51,6 +51,7 @@ import com.vaadin.client.metadata.ConnectorBundleLoader;
import com.vaadin.client.metadata.NoDataException;
import com.vaadin.client.metadata.TypeData;
import com.vaadin.client.ui.UnknownComponentConnector;
+import com.vaadin.client.ui.ui.UIConnector;
import com.vaadin.shared.ApplicationConstants;
import com.vaadin.shared.ui.ui.UIConstants;
@@ -84,7 +85,7 @@ public class ApplicationConfiguration implements EntryPoint {
return null;
} else {
return value +"";
- }
+ }
}-*/;
/**
@@ -105,7 +106,7 @@ public class ApplicationConfiguration implements EntryPoint {
} else {
// $entry not needed as function is not exported
return @java.lang.Boolean::valueOf(Z)(value);
- }
+ }
}-*/;
/**
@@ -126,7 +127,7 @@ public class ApplicationConfiguration implements EntryPoint {
} else {
// $entry not needed as function is not exported
return @java.lang.Integer::valueOf(I)(value);
- }
+ }
}-*/;
/**
@@ -222,7 +223,6 @@ public class ApplicationConfiguration implements EntryPoint {
private Map<Integer, Class<? extends ServerConnector>> classes = new HashMap<Integer, Class<? extends ServerConnector>>();
- private boolean browserDetailsSent = false;
private boolean widgetsetVersionSent = false;
private static boolean moduleLoaded = false;
@@ -286,14 +286,16 @@ public class ApplicationConfiguration implements EntryPoint {
return serviceUrl;
}
+ /**
+ * @return the theme name used when initializing the application
+ * @deprecated as of 7.3. Use {@link UIConnector#getActiveTheme()} to get the
+ * theme currently in use
+ */
+ @Deprecated
public String getThemeName() {
return getJsoConfiguration(id).getConfigString("theme");
}
- public String getThemeUri() {
- return getVaadinDirUrl() + "themes/" + getThemeName();
- }
-
/**
* Gets the URL of the VAADIN directory on the server.
*
@@ -401,11 +403,6 @@ public class ApplicationConfiguration implements EntryPoint {
communicationError = jsoConfiguration.getConfigError("comErrMsg");
authorizationError = jsoConfiguration.getConfigError("authErrMsg");
sessionExpiredError = jsoConfiguration.getConfigError("sessExpMsg");
-
- // boostrap sets initPending to false if it has sent the browser details
- if (jsoConfiguration.getConfigBoolean("initPending") == Boolean.FALSE) {
- setBrowserDetailsSent();
- }
}
/**
@@ -797,33 +794,10 @@ public class ApplicationConfiguration implements EntryPoint {
}
/**
- * Checks whether information from the web browser (e.g. uri fragment and
- * screen size) has been sent to the server.
- *
- * @return <code>true</code> if browser information has already been sent
- *
- * @see ApplicationConnection#getNativeBrowserDetailsParameters(String)
- */
- public boolean isBrowserDetailsSent() {
- return browserDetailsSent;
- }
-
- /**
- * Registers that the browser details have been sent.
- * {@link #isBrowserDetailsSent()} will return
- * <code> after this method has been invoked.
- */
- public void setBrowserDetailsSent() {
- browserDetailsSent = true;
- }
-
- /**
* Checks whether the widget set version has been sent to the server. It is
* sent in the first UIDL request.
*
* @return <code>true</code> if browser information has already been sent
- *
- * @see ApplicationConnection#getNativeBrowserDetailsParameters(String)
*/
public boolean isWidgetsetVersionSent() {
return widgetsetVersionSent;
diff --git a/client/src/com/vaadin/client/ApplicationConnection.java b/client/src/com/vaadin/client/ApplicationConnection.java
index 694fc71060..a2c1d11a7d 100644
--- a/client/src/com/vaadin/client/ApplicationConnection.java
+++ b/client/src/com/vaadin/client/ApplicationConnection.java
@@ -1,6 +1,6 @@
/*
* Copyright 2000-2014 Vaadin Ltd.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
@@ -472,6 +472,8 @@ public class ApplicationConnection implements HasHandlers {
private Heartbeat heartbeat = GWT.create(Heartbeat.class);
+ private boolean tooltipInitialized = false;
+
public static class MultiStepDuration extends Duration {
private int previousStep = elapsedMillis();
@@ -581,10 +583,19 @@ public class ApplicationConnection implements HasHandlers {
// initial UIDL provided in DOM, continue as if returned by request
handleJSONText(jsonText, -1);
+ }
- // Tooltip can't be created earlier because the necessary fields are
- // not setup to add it in the correct place in the DOM
- getVTooltip().showAssistive(new TooltipInfo(" "));
+ // Tooltip can't be created earlier because the
+ // necessary fields are not setup to add it in the
+ // correct place in the DOM
+ if (!tooltipInitialized) {
+ tooltipInitialized = true;
+ ApplicationConfiguration.runWhenDependenciesLoaded(new Command() {
+ @Override
+ public void execute() {
+ getVTooltip().initializeAssistiveTooltips();
+ }
+ });
}
}
@@ -749,31 +760,11 @@ public class ApplicationConnection implements HasHandlers {
}
private String getRepaintAllParameters() {
- // collect some client side data that will be sent to server on
- // initial uidl request
- String nativeBootstrapParameters = getNativeBrowserDetailsParameters(getConfiguration()
- .getRootPanelId());
- // TODO figure out how client and view size could be used better on
- // server. screen size can be accessed via Browser object, but other
- // values currently only via transaction listener.
String parameters = ApplicationConstants.URL_PARAMETER_REPAINT_ALL
- + "=1&" + nativeBootstrapParameters;
+ + "=1";
return parameters;
}
- /**
- * Gets the browser detail parameters that are sent by the bootstrap
- * javascript for two-request initialization.
- *
- * @param parentElementId
- * @return
- */
- private static native String getNativeBrowserDetailsParameters(
- String parentElementId)
- /*-{
- return $wnd.vaadin.getBrowserDetailsParameters(parentElementId);
- }-*/;
-
protected void repaintAll() {
makeUidlRequest(new JSONArray(), getRepaintAllParameters());
}
@@ -1432,12 +1423,19 @@ public class ApplicationConnection implements HasHandlers {
if (json.containsKey(ApplicationConstants.SERVER_SYNC_ID)) {
int syncId = json.getInt(ApplicationConstants.SERVER_SYNC_ID);
- assert (lastSeenServerSyncId == UNDEFINED_SYNC_ID || syncId == lastSeenServerSyncId + 1) : "Newly retrieved server sync id was not exactly one larger than the previous one (new: "
- + syncId + ", last seen: " + lastSeenServerSyncId + ")";
+ /*
+ * Use sync id unless explicitly set as undefined, as is done by
+ * e.g. critical server-side notifications
+ */
+ if (syncId != -1) {
+ assert (lastSeenServerSyncId == UNDEFINED_SYNC_ID || syncId == lastSeenServerSyncId + 1) : "Newly retrieved server sync id was not exactly one larger than the previous one (new: "
+ + syncId + ", last seen: " + lastSeenServerSyncId + ")";
- lastSeenServerSyncId = syncId;
+ lastSeenServerSyncId = syncId;
+ }
} else {
- VConsole.error("Server response didn't contain an id.");
+ VConsole.error("Server response didn't contain a sync id. "
+ + "Please verify that the server is up-to-date and that the response data has not been modified in transmission.");
}
// Handle redirect
@@ -2492,10 +2490,17 @@ public class ApplicationConnection implements HasHandlers {
ApplicationConfiguration.startDependencyLoading();
loader.loadScript(url, resourceLoadListener);
- // Preload all remaining
- for (int i = 0; i < dependencies.length(); i++) {
- String preloadUrl = translateVaadinUri(dependencies.get(i));
- loader.preloadResource(preloadUrl, null);
+ if (ResourceLoader.supportsInOrderScriptExecution()) {
+ for (int i = 0; i < dependencies.length(); i++) {
+ String preloadUrl = translateVaadinUri(dependencies.get(i));
+ loader.loadScript(preloadUrl, null);
+ }
+ } else {
+ // Preload all remaining
+ for (int i = 0; i < dependencies.length(); i++) {
+ String preloadUrl = translateVaadinUri(dependencies.get(i));
+ loader.preloadResource(preloadUrl, null);
+ }
}
}
@@ -2685,15 +2690,7 @@ public class ApplicationConnection implements HasHandlers {
lastInvocationTag = 0;
}
- // Include the browser detail parameters if they aren't already sent
- String extraParams;
- if (!getConfiguration().isBrowserDetailsSent()) {
- extraParams = getNativeBrowserDetailsParameters(getConfiguration()
- .getRootPanelId());
- getConfiguration().setBrowserDetailsSent();
- } else {
- extraParams = "";
- }
+ String extraParams = "";
if (!getConfiguration().isWidgetsetVersionSent()) {
if (!extraParams.isEmpty()) {
extraParams += "&";
@@ -3111,7 +3108,7 @@ public class ApplicationConnection implements HasHandlers {
return null;
}
if (uidlUri.startsWith("theme://")) {
- final String themeUri = configuration.getThemeUri();
+ final String themeUri = getThemeUri();
if (themeUri == null) {
VConsole.error("Theme not set: ThemeResource will not be found. ("
+ uidlUri + ")");
@@ -3177,7 +3174,8 @@ public class ApplicationConnection implements HasHandlers {
* @return URI to the current theme
*/
public String getThemeUri() {
- return configuration.getThemeUri();
+ return configuration.getVaadinDirUrl() + "themes/"
+ + getUIConnector().getActiveTheme();
}
/**
diff --git a/client/src/com/vaadin/client/ResourceLoader.java b/client/src/com/vaadin/client/ResourceLoader.java
index 67b878001e..e88def1a72 100644
--- a/client/src/com/vaadin/client/ResourceLoader.java
+++ b/client/src/com/vaadin/client/ResourceLoader.java
@@ -204,6 +204,26 @@ public class ResourceLoader {
*/
public void loadScript(final String scriptUrl,
final ResourceLoadListener resourceLoadListener) {
+ loadScript(scriptUrl, resourceLoadListener,
+ !supportsInOrderScriptExecution());
+ }
+
+ /**
+ * Load a script and notify a listener when the script is loaded. Calling
+ * this method when the script is currently loading or already loaded
+ * doesn't cause the script to be loaded again, but the listener will still
+ * be notified when appropriate.
+ *
+ *
+ * @param scriptUrl
+ * url of script to load
+ * @param resourceLoadListener
+ * listener to notify when script is loaded
+ * @param async
+ * What mode the script.async attribute should be set to
+ */
+ public void loadScript(final String scriptUrl,
+ final ResourceLoadListener resourceLoadListener, boolean async) {
final String url = Util.getAbsoluteUrl(scriptUrl);
ResourceLoadEvent event = new ResourceLoadEvent(this, url, false);
if (loadedResources.contains(url)) {
@@ -236,6 +256,9 @@ public class ResourceLoader {
ScriptElement scriptTag = Document.get().createScriptElement();
scriptTag.setSrc(url);
scriptTag.setType("text/javascript");
+
+ scriptTag.setPropertyBoolean("async", async);
+
addOnloadHandler(scriptTag, new ResourceLoadListener() {
@Override
public void onLoad(ResourceLoadEvent event) {
@@ -252,6 +275,17 @@ public class ResourceLoader {
}
/**
+ * The current browser supports script.async='false' for maintaining
+ * execution order for dynamically-added scripts.
+ *
+ * @return Browser supports script.async='false'
+ */
+ public static boolean supportsInOrderScriptExecution() {
+ return BrowserInfo.get().isIE()
+ && BrowserInfo.get().getBrowserMajorVersion() >= 11;
+ }
+
+ /**
* Download a resource and notify a listener when the resource is loaded
* without attempting to interpret the resource. When a resource has been
* preloaded, it will be present in the browser's cache (provided the HTTP
@@ -316,6 +350,11 @@ public class ResourceLoader {
* XHR not tested - should work, probably causes other issues
-*/
if (BrowserInfo.get().isIE()) {
+ // If ie11+ for some reason gets a preload request
+ if (BrowserInfo.get().getBrowserMajorVersion() >= 11) {
+ throw new RuntimeException(
+ "Browser doesn't support preloading with text/cache");
+ }
ScriptElement element = Document.get().createScriptElement();
element.setSrc(url);
element.setType("text/cache");
@@ -334,7 +373,20 @@ public class ResourceLoader {
}
}
- private native void addOnloadHandler(Element element,
+ /**
+ * Adds an onload listener to the given element, which should be a link or a
+ * script tag. The listener is called whenever loading is complete or an
+ * error occurred.
+ *
+ * @since
+ * @param element
+ * the element to attach a listener to
+ * @param listener
+ * the listener to call
+ * @param event
+ * the event passed to the listener
+ */
+ public static native void addOnloadHandler(Element element,
ResourceLoadListener listener, ResourceLoadEvent event)
/*-{
element.onload = $entry(function() {
@@ -349,11 +401,11 @@ public class ResourceLoader {
element.onreadystatechange = null;
listener.@com.vaadin.client.ResourceLoader.ResourceLoadListener::onError(Lcom/vaadin/client/ResourceLoader$ResourceLoadEvent;)(event);
});
- element.onreadystatechange = function() {
+ element.onreadystatechange = function() {
if ("loaded" === element.readyState || "complete" === element.readyState ) {
element.onload(arguments[0]);
}
- };
+ };
}-*/;
/**
@@ -479,12 +531,12 @@ public class ResourceLoader {
if (rules === undefined) {
rules = sheet.rules;
}
-
+
if (rules === null) {
// Style sheet loaded, but can't access length because of XSS -> assume there's something there
return 1;
}
-
+
// Return length so we can distinguish 0 (probably 404 error) from normal case.
return rules.length;
} catch (err) {
diff --git a/client/src/com/vaadin/client/TooltipInfo.java b/client/src/com/vaadin/client/TooltipInfo.java
index 67d2ad37c2..c1dd5037eb 100644
--- a/client/src/com/vaadin/client/TooltipInfo.java
+++ b/client/src/com/vaadin/client/TooltipInfo.java
@@ -15,12 +15,19 @@
*/
package com.vaadin.client;
+import com.vaadin.shared.util.SharedUtil;
+
public class TooltipInfo {
private String title;
private String errorMessageHtml;
+ // Contains the tooltip's identifier. If a tooltip's contents and this
+ // identifier haven't changed, the tooltip won't be updated in subsequent
+ // events.
+ private Object identifier;
+
public TooltipInfo() {
}
@@ -29,10 +36,23 @@ public class TooltipInfo {
}
public TooltipInfo(String tooltip, String errorMessage) {
+ this(tooltip, errorMessage, null);
+ }
+
+ public TooltipInfo(String tooltip, String errorMessage, Object identifier) {
+ setIdentifier(identifier);
setTitle(tooltip);
setErrorMessage(errorMessage);
}
+ public void setIdentifier(Object identifier) {
+ this.identifier = identifier;
+ }
+
+ public Object getIdentifier() {
+ return identifier;
+ }
+
public String getTitle() {
return title;
}
@@ -61,6 +81,7 @@ public class TooltipInfo {
}
public boolean equals(TooltipInfo other) {
- return (other != null && other.title == title && other.errorMessageHtml == errorMessageHtml);
+ return (other != null && SharedUtil.equals(other.title, title)
+ && SharedUtil.equals(other.errorMessageHtml, errorMessageHtml) && other.identifier == identifier);
}
}
diff --git a/client/src/com/vaadin/client/Util.java b/client/src/com/vaadin/client/Util.java
index e031b37422..f12a02c64f 100644
--- a/client/src/com/vaadin/client/Util.java
+++ b/client/src/com/vaadin/client/Util.java
@@ -35,6 +35,7 @@ import com.google.gwt.dom.client.Style;
import com.google.gwt.dom.client.Style.Display;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.dom.client.Touch;
+import com.google.gwt.event.dom.client.KeyEvent;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Event;
@@ -66,7 +67,23 @@ public class Util {
}-*/;
/**
- *
+ * Helper method for a bug fix #14041. For mozilla getKeyCode return 0 for
+ * space bar (because space is considered as char). If return 0 use
+ * getCharCode.
+ *
+ * @param event
+ * @return return key code
+ */
+ public static int getKeyCode(KeyEvent<?> event) {
+ int keyCode = event.getNativeEvent().getKeyCode();
+ if (keyCode == 0) {
+ keyCode = event.getNativeEvent().getCharCode();
+ }
+ return keyCode;
+ }
+
+ /**
+ *
* Returns the topmost element of from given coordinates.
*
* TODO fix crossplat issues clientX vs pageX. See quircksmode. Not critical
diff --git a/client/src/com/vaadin/client/VTooltip.java b/client/src/com/vaadin/client/VTooltip.java
index 487f577ae3..b1315a0d8b 100644
--- a/client/src/com/vaadin/client/VTooltip.java
+++ b/client/src/com/vaadin/client/VTooltip.java
@@ -22,13 +22,13 @@ import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.Style.Display;
import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.BlurHandler;
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.DomEvent;
import com.google.gwt.event.dom.client.FocusEvent;
import com.google.gwt.event.dom.client.FocusHandler;
import com.google.gwt.event.dom.client.KeyDownEvent;
import com.google.gwt.event.dom.client.KeyDownHandler;
+import com.google.gwt.event.dom.client.MouseDownEvent;
+import com.google.gwt.event.dom.client.MouseDownHandler;
import com.google.gwt.event.dom.client.MouseMoveEvent;
import com.google.gwt.event.dom.client.MouseMoveHandler;
import com.google.gwt.user.client.DOM;
@@ -108,14 +108,28 @@ public class VTooltip extends VWindowOverlay {
showTooltip();
}
+ /**
+ * Initialize the tooltip overlay for assistive devices.
+ *
+ * @param info
+ * with the content of the tooltip
+ */
+ public void initializeAssistiveTooltips() {
+ updatePosition(null, true);
+ setTooltipText(new TooltipInfo(" "));
+ showTooltip();
+ hideTooltip();
+ description.getParentElement().getStyle().clearWidth();
+ }
+
private void setTooltipText(TooltipInfo info) {
- if (info.getErrorMessage() != null) {
+ if (info.getErrorMessage() != null && !info.getErrorMessage().isEmpty()) {
em.setVisible(true);
em.updateMessage(info.getErrorMessage());
} else {
em.setVisible(false);
}
- if (info.getTitle() != null && !"".equals(info.getTitle())) {
+ if (info.getTitle() != null && !info.getTitle().isEmpty()) {
description.setInnerHTML(info.getTitle());
description.getStyle().clearDisplay();
} else {
@@ -130,13 +144,7 @@ public class VTooltip extends VWindowOverlay {
*
*/
private void showTooltip() {
- boolean hasContent = false;
- if (currentTooltipInfo.getErrorMessage() != null
- || (currentTooltipInfo.getTitle() != null && !""
- .equals(currentTooltipInfo.getTitle()))) {
- hasContent = true;
- }
- if (hasContent) {
+ if (currentTooltipInfo.hasMessage()) {
// Issue #8454: With IE7 the tooltips size is calculated based on
// the last tooltip's position, causing problems if the last one was
// in the right or bottom edge. For this reason the tooltip is moved
@@ -153,15 +161,61 @@ public class VTooltip extends VWindowOverlay {
offsetWidth = getOffsetWidth();
offsetHeight = getOffsetHeight();
}
+ int x = getFinalX(offsetWidth);
+ int y = getFinalY(offsetHeight);
- int x = tooltipEventMouseX + 10 + Window.getScrollLeft();
- int y = tooltipEventMouseY + 10 + Window.getScrollTop();
+ setPopupPosition(x, y);
+ sinkEvents(Event.ONMOUSEOVER | Event.ONMOUSEOUT);
+ }
+ /**
+ * Return the final X-coordinate of the tooltip based on cursor
+ * position, size of the tooltip, size of the page and necessary
+ * margins.
+ *
+ * @param offsetWidth
+ * @return The final X-coordinate
+ */
+ private int getFinalX(int offsetWidth) {
+ int x = 0;
+ int widthNeeded = 10 + MARGIN + offsetWidth;
+ int roomLeft = tooltipEventMouseX;
+ int roomRight = Window.getClientWidth() - roomLeft;
+ if (roomRight > widthNeeded) {
+ x = tooltipEventMouseX + 10 + Window.getScrollLeft();
+ } else {
+ x = tooltipEventMouseX + Window.getScrollLeft() - 10
+ - offsetWidth;
+ }
if (x + offsetWidth + MARGIN - Window.getScrollLeft() > Window
.getClientWidth()) {
x = Window.getClientWidth() - offsetWidth - MARGIN
+ Window.getScrollLeft();
}
+ return x;
+ }
+
+ /**
+ * Return the final Y-coordinate of the tooltip based on cursor
+ * position, size of the tooltip, size of the page and necessary
+ * margins.
+ *
+ * @param offsetHeight
+ * @return The final y-coordinate
+ *
+ */
+ private int getFinalY(int offsetHeight) {
+ int y = 0;
+ int heightNeeded = 10 + MARGIN + offsetHeight;
+ int roomAbove = tooltipEventMouseY;
+ int roomBelow = Window.getClientHeight() - roomAbove;
+
+ if (roomBelow > heightNeeded) {
+ y = tooltipEventMouseY + 10 + Window.getScrollTop();
+ } else {
+ y = tooltipEventMouseY + Window.getScrollTop() - 10
+ - offsetHeight;
+ }
if (y + offsetHeight + MARGIN - Window.getScrollTop() > Window
.getClientHeight()) {
@@ -173,8 +227,7 @@ public class VTooltip extends VWindowOverlay {
y = Window.getScrollTop();
}
}
- setPopupPosition(x, y);
- sinkEvents(Event.ONMOUSEOVER | Event.ONMOUSEOUT);
+ return y;
}
});
} else {
@@ -184,18 +237,23 @@ public class VTooltip extends VWindowOverlay {
/**
* For assistive tooltips to work correctly we must have the tooltip visible
- * and attached to the DOM well in advance.
+ * and attached to the DOM well in advance. For this reason both isShowing
+ * and isVisible return false positives. We can't override either of them as
+ * external code may depend on this behavior.
*
- * @return
+ * @return boolean
*/
- public boolean isActuallyVisible() {
- return super.isShowing() && getPopupLeft() > 0 && getPopupTop() > 0;
+ public boolean isTooltipOpen() {
+ return super.isShowing() && super.isVisible() && getPopupLeft() > 0
+ && getPopupTop() > 0;
}
private void closeNow() {
hide();
setWidth("");
closing = false;
+ justClosedTimer.schedule(getQuickOpenTimeout());
+ justClosed = true;
}
private Timer showTimer = new Timer() {
@@ -210,8 +268,6 @@ public class VTooltip extends VWindowOverlay {
@Override
public void run() {
closeNow();
- justClosedTimer.schedule(getQuickOpenTimeout());
- justClosed = true;
}
};
@@ -234,8 +290,10 @@ public class VTooltip extends VWindowOverlay {
// already about to close
return;
}
- closeTimer.schedule(getCloseTimeout());
- closing = true;
+ if (isTooltipOpen()) {
+ closeTimer.schedule(getCloseTimeout());
+ closing = true;
+ }
}
@Override
@@ -284,6 +342,8 @@ public class VTooltip extends VWindowOverlay {
if (closing) {
closeTimer.cancel();
closeNow();
+ justClosedTimer.cancel();
+ justClosed = false;
}
showTooltip();
@@ -291,7 +351,7 @@ public class VTooltip extends VWindowOverlay {
}
private class TooltipEventHandler implements MouseMoveHandler,
- ClickHandler, KeyDownHandler, FocusHandler, BlurHandler {
+ KeyDownHandler, FocusHandler, BlurHandler, MouseDownHandler {
/**
* Current element hovered
@@ -311,11 +371,9 @@ public class VTooltip extends VWindowOverlay {
* @return TooltipInfo if connector and tooltip found, null if not
*/
private TooltipInfo getTooltipFor(Element element) {
-
ApplicationConnection ac = getApplicationConnection();
ComponentConnector connector = Util.getConnectorForElement(ac,
RootPanel.get(), element);
-
// Try to find first connector with proper tooltip info
TooltipInfo info = null;
while (connector != null) {
@@ -348,8 +406,6 @@ public class VTooltip extends VWindowOverlay {
/**
* Handle hide event
*
- * @param event
- * Event causing hide
*/
private void handleHideEvent() {
hideTooltip();
@@ -361,7 +417,7 @@ public class VTooltip extends VWindowOverlay {
}
@Override
- public void onClick(ClickEvent event) {
+ public void onMouseDown(MouseDownEvent event) {
handleHideEvent();
}
@@ -402,38 +458,47 @@ public class VTooltip extends VWindowOverlay {
return;
}
+ // If the parent (sub)component already has a tooltip open and it
+ // hasn't changed, we ignore the event.
+ // TooltipInfo contains a reference to the parent component that is
+ // checked in it's equals-method.
+ if (currentElement != null && isTooltipOpen()) {
+ TooltipInfo newTooltip = getTooltipFor(element);
+ if (currentTooltipInfo != null
+ && currentTooltipInfo.equals(newTooltip)) {
+ return;
+ }
+ }
+
TooltipInfo info = getTooltipFor(element);
if (info == null) {
- if (isActuallyVisible()) {
- handleHideEvent();
- }
+ handleHideEvent();
} else {
+ if (closing) {
+ closeTimer.cancel();
+ closing = false;
+ }
+
+ if (isTooltipOpen()) {
+ closeNow();
+ }
+
setTooltipText(info);
updatePosition(event, isFocused);
- if (isActuallyVisible() && !isFocused) {
+ // Schedule timer for showing the tooltip according to if it
+ // was recently closed or not.
+ int timeout = justClosed ? getQuickOpenDelay() : getOpenDelay();
+ if (timeout == 0) {
showTooltip();
} else {
- if (isActuallyVisible()) {
- closeNow();
- }
- // Schedule timer for showing the tooltip according to if it
- // was
- // recently closed or not.
- int timeout = justClosed ? getQuickOpenDelay()
- : getOpenDelay();
- if (timeout == 0) {
- showTooltip();
- } else {
- showTimer.schedule(timeout);
- opening = true;
- }
+ showTimer.schedule(timeout);
+ opening = true;
}
}
handledByFocus = isFocused;
currentElement = element;
}
-
}
private final TooltipEventHandler tooltipEventHandler = new TooltipEventHandler();
@@ -447,7 +512,7 @@ public class VTooltip extends VWindowOverlay {
public void connectHandlersToWidget(Widget widget) {
Profiler.enter("VTooltip.connectHandlersToWidget");
widget.addDomHandler(tooltipEventHandler, MouseMoveEvent.getType());
- widget.addDomHandler(tooltipEventHandler, ClickEvent.getType());
+ widget.addDomHandler(tooltipEventHandler, MouseDownEvent.getType());
widget.addDomHandler(tooltipEventHandler, KeyDownEvent.getType());
widget.addDomHandler(tooltipEventHandler, FocusEvent.getType());
widget.addDomHandler(tooltipEventHandler, BlurEvent.getType());
diff --git a/client/src/com/vaadin/client/communication/TranslatedURLReference.java b/client/src/com/vaadin/client/communication/TranslatedURLReference.java
new file mode 100644
index 0000000000..c863b7b796
--- /dev/null
+++ b/client/src/com/vaadin/client/communication/TranslatedURLReference.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.client.communication;
+
+import com.vaadin.client.ApplicationConnection;
+import com.vaadin.shared.communication.URLReference;
+
+public class TranslatedURLReference extends URLReference {
+
+ private ApplicationConnection connection;
+
+ /**
+ * @param connection
+ * the connection to set
+ */
+ public void setConnection(ApplicationConnection connection) {
+ this.connection = connection;
+ }
+
+ @Override
+ public String getURL() {
+ return connection.translateVaadinUri(super.getURL());
+ }
+
+}
diff --git a/client/src/com/vaadin/client/communication/URLReference_Serializer.java b/client/src/com/vaadin/client/communication/URLReference_Serializer.java
index 586dd626f0..4ecdc606d2 100644
--- a/client/src/com/vaadin/client/communication/URLReference_Serializer.java
+++ b/client/src/com/vaadin/client/communication/URLReference_Serializer.java
@@ -1,12 +1,12 @@
/*
* Copyright 2000-2014 Vaadin Ltd.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -30,14 +30,16 @@ public class URLReference_Serializer implements JSONSerializer<URLReference> {
@Override
public URLReference deserialize(Type type, JSONValue jsonValue,
ApplicationConnection connection) {
- URLReference reference = GWT.create(URLReference.class);
+ TranslatedURLReference reference = GWT
+ .create(TranslatedURLReference.class);
+ reference.setConnection(connection);
JSONObject json = (JSONObject) jsonValue;
if (json.containsKey(URL_FIELD)) {
JSONValue jsonURL = json.get(URL_FIELD);
String URL = (String) JsonDecoder.decodeValue(
new Type(String.class.getName(), null), jsonURL, null,
connection);
- reference.setURL(connection.translateVaadinUri(URL));
+ reference.setURL(URL);
}
return reference;
}
diff --git a/client/src/com/vaadin/client/debug/internal/InfoSection.java b/client/src/com/vaadin/client/debug/internal/InfoSection.java
index 23b77a94db..a7a84f5f8f 100644
--- a/client/src/com/vaadin/client/debug/internal/InfoSection.java
+++ b/client/src/com/vaadin/client/debug/internal/InfoSection.java
@@ -163,7 +163,7 @@ public class InfoSection implements Section {
addVersionInfo(configuration);
addRow("Widget set", GWT.getModuleName());
- addRow("Theme", connection.getConfiguration().getThemeName());
+ addRow("Theme", connection.getUIConnector().getActiveTheme());
String communicationMethodInfo = connection
.getCommunicationMethodName();
diff --git a/client/src/com/vaadin/client/extensions/ResponsiveConnector.java b/client/src/com/vaadin/client/extensions/ResponsiveConnector.java
index 1392a1a49a..62913400db 100644
--- a/client/src/com/vaadin/client/extensions/ResponsiveConnector.java
+++ b/client/src/com/vaadin/client/extensions/ResponsiveConnector.java
@@ -208,58 +208,55 @@ public class ResponsiveConnector extends AbstractExtensionConnector implements
} else if(rule.type == 1 || !rule.type) {
// Regular selector rule
- // IE parses CSS like .class[attr="val"] into [attr="val"].class so we need to check for both
-
- // Pattern for matching [width-range] selectors
- var widths = IE? /\[width-range~?=["|'](.*)-(.*)["|']\]([\.|#]\S+)/i : /([\.|#]\S+)\[width-range~?=["|'](.*)-(.*)["|']\]/i;
-
- // Patter for matching [height-range] selectors
- var heights = IE? /\[height-range~?=["|'](.*)-(.*)["|']\]([\.|#]\S+)/i : /([\.|#]\S+)\[height-range~?=["|'](.*)-(.*)["|']\]/i;
+ // Helper function
+ var pushToCache = function(ranges, selector, min, max) {
+ // Avoid adding duplicates
+ var duplicate = false;
+ for(var l = 0, len3 = ranges.length; l < len3; l++) {
+ var bp = ranges[l];
+ if (selector == bp[0] && min == bp[1] && max == bp[2]) {
+ duplicate = true;
+ break;
+ }
+ }
+ if (!duplicate) {
+ ranges.push([selector, min, max]);
+ }
+ };
// Array of all of the separate selectors in this ruleset
var haystack = rule.selectorText.split(",");
+ // IE parses CSS like .class[attr="val"] into [attr="val"].class so we need to check for both
+ var selectorRegEx = IE ? /\[.*\]([\.|#]\S+)/ : /([\.|#]\S+?)\[.*\]/;
+
// Loop all the selectors in this ruleset
for(var k = 0, len2 = haystack.length; k < len2; k++) {
- var result;
-
- // Check for width-range matches
- if(result = haystack[k].match(widths)) {
- var selector = IE? result[3] : result[1]
- var min = IE? result[1] : result[2];
- var max = IE? result[2] : result[3];
-
- // Avoid adding duplicates
- var duplicate = false;
- for(var l = 0, len3 = widthRanges.length; l < len3; l++) {
- var bp = widthRanges[l];
- if(selector == bp[0] && min == bp[1] && max == bp[2]) {
- duplicate = true;
- break;
- }
- }
- if(!duplicate) {
- widthRanges.push([selector, min, max]);
+
+ // Split the haystack into parts.
+ var widthRange = haystack[k].match(/\[width-range.*?\]/);
+ var heightRange = haystack[k].match(/\[height-range.*?\]/);
+ var selector = haystack[k].match(selectorRegEx);
+
+ if (selector != null) {
+ selector = selector[1];
+
+ // Check for width-ranges.
+ if (widthRange != null) {
+ var minMax = widthRange[0].match(/\[width-range~?=["|'](.*?)-(.*?)["|']\]/i);
+ var min = minMax[1];
+ var max = minMax[2];
+
+ pushToCache(widthRanges, selector, min, max);
}
- }
- // Check for height-range matches
- if(result = haystack[k].match(heights)) {
- var selector = IE? result[3] : result[1]
- var min = IE? result[1] : result[2];
- var max = IE? result[2] : result[3];
-
- // Avoid adding duplicates
- var duplicate = false;
- for(var l = 0, len3 = heightRanges.length; l < len3; l++) {
- var bp = heightRanges[l];
- if(selector == bp[0] && min == bp[1] && max == bp[2]) {
- duplicate = true;
- break;
- }
- }
- if(!duplicate) {
- heightRanges.push([selector, min, max]);
+ // Check for height-ranges.
+ if (heightRange != null) {
+ var minMax = heightRange[0].match(/\[height-range~?=["|'](.*?)-(.*?)["|']\]/i);
+ var min = minMax[1];
+ var max = minMax[2];
+
+ pushToCache(heightRanges, selector, min, max);
}
}
}
diff --git a/client/src/com/vaadin/client/metadata/ConnectorBundleLoader.java b/client/src/com/vaadin/client/metadata/ConnectorBundleLoader.java
index 7d2078061e..846bfd4671 100644
--- a/client/src/com/vaadin/client/metadata/ConnectorBundleLoader.java
+++ b/client/src/com/vaadin/client/metadata/ConnectorBundleLoader.java
@@ -1,12 +1,12 @@
/*
* Copyright 2000-2014 Vaadin Ltd.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,13 +15,35 @@
*/
package com.vaadin.client.metadata;
+import java.util.ArrayList;
import java.util.List;
import com.google.gwt.core.shared.GWT;
+import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.Widget;
+import com.vaadin.client.ApplicationConfiguration;
import com.vaadin.client.FastStringMap;
import com.vaadin.client.metadata.AsyncBundleLoader.State;
+import com.vaadin.client.ui.VNotification;
+import com.vaadin.shared.Position;
public abstract class ConnectorBundleLoader {
+
+ public static class CValUiInfo {
+ public final String widgetset;
+ public final String product;
+ public final String version;
+ public final String type;
+
+ public CValUiInfo(String product, String version, String widgetset,
+ String type) {
+ this.product = product;
+ this.version = version;
+ this.widgetset = widgetset;
+ this.type = type;
+ }
+ }
+
public static final String EAGER_BUNDLE_NAME = "__eager";
public static final String DEFERRED_BUNDLE_NAME = "__deferred";
@@ -113,4 +135,27 @@ public abstract class ConnectorBundleLoader {
public abstract void init();
+ protected List<CValUiInfo> cvals = new ArrayList<CValUiInfo>();
+
+ public void cval(String typeName) {
+ if (!cvals.isEmpty()) {
+ String msg = "";
+ for (CValUiInfo c : cvals) {
+ String ns = c.widgetset.replaceFirst("\\.[^\\.]+$", "");
+ if (typeName.startsWith(ns)) {
+ cvals.remove(c);
+ msg += c.product + " " + c.version + "<br/>";
+ }
+ }
+ if (!msg.isEmpty()) {
+ // We need a widget for using VNotification, using the
+ // context-menu parent. Is there an easy way?
+ Widget w = ApplicationConfiguration.getRunningApplications()
+ .get(0).getContextMenu().getParent();
+ VNotification n = VNotification.createNotification(0, w);
+ n.setWidget(new HTML("Using Evaluation License of:<br/>" + msg));
+ n.show(Position.BOTTOM_RIGHT);
+ }
+ }
+ }
}
diff --git a/client/src/com/vaadin/client/metadata/Type.java b/client/src/com/vaadin/client/metadata/Type.java
index cc185dff96..15617ffe3c 100644
--- a/client/src/com/vaadin/client/metadata/Type.java
+++ b/client/src/com/vaadin/client/metadata/Type.java
@@ -1,12 +1,12 @@
/*
* Copyright 2000-2014 Vaadin Ltd.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -19,6 +19,7 @@ import java.util.Collection;
import com.google.gwt.core.client.JsArrayString;
import com.vaadin.client.JsArrayObject;
+import com.vaadin.client.ServerConnector;
import com.vaadin.client.communication.JSONSerializer;
public class Type {
@@ -47,7 +48,11 @@ public class Type {
public Object createInstance() throws NoDataException {
Invoker invoker = TypeDataStore.getConstructor(this);
- return invoker.invoke(null);
+ Object ret = invoker.invoke(null);
+ if (ret instanceof ServerConnector) {
+ ConnectorBundleLoader.get().cval(name);
+ }
+ return ret;
}
public Method getMethod(String name) {
@@ -57,7 +62,7 @@ public class Type {
/**
* @return
* @throws NoDataException
- *
+ *
* @deprecated As of 7.0.1, use {@link #getPropertiesAsArray()} instead for
* improved performance
*/
@@ -96,7 +101,7 @@ public class Type {
* returned string may change without notice and should not be used for any
* other purpose than identification. The signature is currently based on
* the fully qualified name of the type.
- *
+ *
* @return the unique signature of this type
*/
public String getSignature() {
diff --git a/client/src/com/vaadin/client/ui/AbstractComponentConnector.java b/client/src/com/vaadin/client/ui/AbstractComponentConnector.java
index ccf070698b..c3f14be40c 100644
--- a/client/src/com/vaadin/client/ui/AbstractComponentConnector.java
+++ b/client/src/com/vaadin/client/ui/AbstractComponentConnector.java
@@ -333,14 +333,6 @@ public abstract class AbstractComponentConnector extends AbstractConnector
AbstractComponentState state = getState();
String primaryStyleName = getWidget().getStylePrimaryName();
- if (state.primaryStyleName != null
- && !state.primaryStyleName.equals(primaryStyleName)) {
- /*
- * We overwrite the widgets primary stylename if state defines a
- * primary stylename.
- */
- getWidget().setStylePrimaryName(state.primaryStyleName);
- }
// Set the core 'v' style name for the widget
setWidgetStyleName(StyleConstants.UI_WIDGET, true);
@@ -376,6 +368,16 @@ public abstract class AbstractComponentConnector extends AbstractConnector
}
}
+
+ if (state.primaryStyleName != null
+ && !state.primaryStyleName.equals(primaryStyleName)) {
+ /*
+ * We overwrite the widgets primary stylename if state defines a
+ * primary stylename. This has to be done after updating other
+ * styles to be sure the dependent styles are updated correctly.
+ */
+ getWidget().setStylePrimaryName(state.primaryStyleName);
+ }
Profiler.leave("AbstractComponentConnector.updateWidgetStyleNames");
}
diff --git a/client/src/com/vaadin/client/ui/AbstractConnector.java b/client/src/com/vaadin/client/ui/AbstractConnector.java
index a2e0d9cd54..e93ea0f507 100644
--- a/client/src/com/vaadin/client/ui/AbstractConnector.java
+++ b/client/src/com/vaadin/client/ui/AbstractConnector.java
@@ -28,6 +28,7 @@ import com.google.gwt.event.shared.HandlerManager;
import com.google.web.bindery.event.shared.HandlerRegistration;
import com.vaadin.client.ApplicationConnection;
import com.vaadin.client.FastStringMap;
+import com.vaadin.client.FastStringSet;
import com.vaadin.client.JsArrayObject;
import com.vaadin.client.Profiler;
import com.vaadin.client.ServerConnector;
@@ -479,4 +480,27 @@ public abstract class AbstractConnector implements ServerConnector,
Set<String> reg = getState().registeredEventListeners;
return (reg != null && reg.contains(eventIdentifier));
}
+
+ /**
+ * Force the connector to recheck its state variables as the variables or
+ * their meaning might have changed.
+ *
+ * @since 7.3
+ */
+ public void forceStateChange() {
+ StateChangeEvent event = new FullStateChangeEvent(this);
+ fireEvent(event);
+ }
+
+ private static class FullStateChangeEvent extends StateChangeEvent {
+ public FullStateChangeEvent(ServerConnector connector) {
+ super(connector, FastStringSet.create());
+ }
+
+ @Override
+ public boolean hasPropertyChanged(String property) {
+ return true;
+ }
+
+ }
}
diff --git a/client/src/com/vaadin/client/ui/VAbstractSplitPanel.java b/client/src/com/vaadin/client/ui/VAbstractSplitPanel.java
index 269db23366..6ee88d51dd 100644
--- a/client/src/com/vaadin/client/ui/VAbstractSplitPanel.java
+++ b/client/src/com/vaadin/client/ui/VAbstractSplitPanel.java
@@ -511,6 +511,10 @@ public class VAbstractSplitPanel extends ComplexPanel {
firstChild = w;
}
+ public Widget getFirstWidget() {
+ return firstChild;
+ }
+
/** For internal use only. May be removed or replaced in the future. */
public void setSecondWidget(Widget w) {
if (secondChild == w) {
@@ -525,6 +529,10 @@ public class VAbstractSplitPanel extends ComplexPanel {
secondChild = w;
}
+ public Widget getSecondWidget() {
+ return secondChild;
+ }
+
@Override
public void onBrowserEvent(Event event) {
switch (DOM.eventGetType(event)) {
diff --git a/client/src/com/vaadin/client/ui/VCalendarPanel.java b/client/src/com/vaadin/client/ui/VCalendarPanel.java
index d8c96917d8..eaa2292c69 100644
--- a/client/src/com/vaadin/client/ui/VCalendarPanel.java
+++ b/client/src/com/vaadin/client/ui/VCalendarPanel.java
@@ -813,14 +813,12 @@ public class VCalendarPanel extends FocusableFlexTable implements
buildCalendarBody();
}
- if (isTimeSelectorNeeded() && time == null) {
+ if (isTimeSelectorNeeded()) {
time = new VTime();
setWidget(2, 0, time);
getFlexCellFormatter().setColSpan(2, 0, 5);
getFlexCellFormatter().setStyleName(2, 0,
parent.getStylePrimaryName() + "-calendarpanel-time");
- } else if (isTimeSelectorNeeded()) {
- time.updateTimes();
} else if (time != null) {
remove(time);
}
diff --git a/client/src/com/vaadin/client/ui/VColorPickerArea.java b/client/src/com/vaadin/client/ui/VColorPickerArea.java
index e581cf3448..23a9379c80 100644
--- a/client/src/com/vaadin/client/ui/VColorPickerArea.java
+++ b/client/src/com/vaadin/client/ui/VColorPickerArea.java
@@ -34,6 +34,7 @@ import com.google.gwt.user.client.ui.Widget;
public class VColorPickerArea extends Widget implements ClickHandler, HasHTML,
HasClickHandlers {
+ public static final String CLASSNAME = "v-colorpicker";
private String color = null;
private boolean isOpen;
@@ -47,6 +48,7 @@ public class VColorPickerArea extends Widget implements ClickHandler, HasHTML,
public VColorPickerArea() {
super();
setElement(DOM.createDiv());
+ setStyleName(CLASSNAME);
caption = new HTML();
caption.addStyleName("v-caption");
diff --git a/client/src/com/vaadin/client/ui/VFilterSelect.java b/client/src/com/vaadin/client/ui/VFilterSelect.java
index 5ffa580371..004072d04a 100644
--- a/client/src/com/vaadin/client/ui/VFilterSelect.java
+++ b/client/src/com/vaadin/client/ui/VFilterSelect.java
@@ -80,7 +80,7 @@ import com.vaadin.shared.ui.combobox.FilteringMode;
/**
* Client side implementation of the Select component.
- *
+ *
* TODO needs major refactoring (to be extensible etc)
*/
@SuppressWarnings("deprecation")
@@ -100,7 +100,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/**
* Constructor
- *
+ *
* @param uidl
* The UIDL recieved from the server
*/
@@ -149,7 +149,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/**
* Get the option key which represents the item on the server side.
- *
+ *
* @return The key of the item
*/
public String getOptionKey() {
@@ -158,7 +158,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/**
* Get the URI of the icon. Used when constructing the displayed option.
- *
+ *
* @return
*/
public String getIconUri() {
@@ -252,7 +252,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/**
* Shows the popup where the user can see the filtered options
- *
+ *
* @param currentSuggestions
* The filtered suggestions
* @param currentPage
@@ -338,7 +338,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/**
* Should the next page button be visible to the user?
- *
+ *
* @param active
*/
private void setNextButtonActive(boolean active) {
@@ -358,7 +358,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/**
* Should the previous page button be visible to the user
- *
+ *
* @param active
*/
private void setPrevButtonActive(boolean active) {
@@ -445,7 +445,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
* because otherwise the waiting flag will be reset in
* the first response and the second response will be
* ignored, causing an empty popup...
- *
+ *
* As long as the scrolling delay is suitable
* double/triple clicks will work by scrolling two or
* three pages at a time and this should not be a
@@ -480,7 +480,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/*
* (non-Javadoc)
- *
+ *
* @see
* com.google.gwt.user.client.ui.Widget#onBrowserEvent(com.google.gwt
* .user.client.Event)
@@ -517,7 +517,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
* amount of items are visible at a time and a scrollbar or buttons are
* visible to change page. If paging is turned of then all options are
* rendered into the popup menu.
- *
+ *
* @param paging
* Should the paging be turned on?
*/
@@ -540,7 +540,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/*
* (non-Javadoc)
- *
+ *
* @see
* com.google.gwt.user.client.ui.PopupPanel$PositionCallback#setPosition
* (int, int)
@@ -622,7 +622,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/**
* Was the popup just closed?
- *
+ *
* @return true if popup was just closed
*/
public boolean isJustClosed() {
@@ -633,7 +633,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/*
* (non-Javadoc)
- *
+ *
* @see
* com.google.gwt.event.logical.shared.CloseHandler#onClose(com.google
* .gwt.event.logical.shared.CloseEvent)
@@ -651,7 +651,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/**
* Updates style names in suggestion popup to help theme building.
- *
+ *
* @param uidl
* UIDL for the whole combo box
* @param componentState
@@ -731,7 +731,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/**
* Sets the suggestions rendered in the menu
- *
+ *
* @param suggestions
* The suggestions to be rendered in the menu
*/
@@ -926,7 +926,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/**
* TextBox variant used as input element for filter selects, which prevents
* selecting text when disabled.
- *
+ *
* @since 7.1.5
*/
public class FilterSelectTextBox extends TextBox {
@@ -978,7 +978,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/*
* (non-Javadoc)
- *
+ *
* @see
* com.google.gwt.user.client.ui.Widget#onBrowserEvent(com.google.gwt
* .user.client.Event)
@@ -1151,7 +1151,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/*
* (non-Javadoc)
- *
+ *
* @see
* com.google.gwt.user.client.ui.Composite#onBrowserEvent(com.google.gwt
* .user.client.Event)
@@ -1178,7 +1178,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
* It is invoked during the Constructor and should only be overridden if a
* custom TextBox shall be used. The overriding method cannot use any
* instance variables.
- *
+ *
* @since 7.1.5
* @return TextBox instance used by this VFilterSelect
*/
@@ -1191,7 +1191,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
* instance. It is invoked during the Constructor and should only be
* overridden if a custom SuggestionPopup shall be used. The overriding
* method cannot use any instance variables.
- *
+ *
* @since 7.1.5
* @return SuggestionPopup instance used by this VFilterSelect
*/
@@ -1219,7 +1219,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/**
* Does the Select have more pages?
- *
+ *
* @return true if a next page exists, else false if the current page is the
* last page
*/
@@ -1234,7 +1234,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/**
* Filters the options at a certain page. Uses the text box input as a
* filter
- *
+ *
* @param page
* The page which items are to be filtered
*/
@@ -1244,7 +1244,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/**
* Filters the options at certain page using the given filter
- *
+ *
* @param page
* The page to filter
* @param filter
@@ -1256,7 +1256,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/**
* Filters the options at certain page using the given filter
- *
+ *
* @param page
* The page to filter
* @param filter
@@ -1321,7 +1321,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/**
* Sets the text in the text box.
- *
+ *
* @param text
* the text to set in the text box
*/
@@ -1350,7 +1350,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
* shown in the text box if nothing has been entered.
* <p>
* For internal use only. May be removed or replaced in the future.
- *
+ *
* @param text
* The text the text box should contain.
*/
@@ -1365,7 +1365,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/**
* Triggered when a suggestion is selected
- *
+ *
* @param suggestion
* The suggestion that just got selected.
*/
@@ -1405,7 +1405,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/**
* Sets the icon URI of the selected item. The icon is shown on the left
* side of the item caption text. Set the URI to null to remove the icon.
- *
+ *
* @param iconUri
* The URI of the icon
*/
@@ -1478,7 +1478,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/*
* (non-Javadoc)
- *
+ *
* @see
* com.google.gwt.event.dom.client.KeyDownHandler#onKeyDown(com.google.gwt
* .event.dom.client.KeyDownEvent)
@@ -1531,7 +1531,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/**
* Triggered when a key is pressed in the text box
- *
+ *
* @param event
* The KeyDownEvent
*/
@@ -1576,7 +1576,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/**
* Triggered when a key was pressed in the suggestion popup.
- *
+ *
* @param event
* The KeyDownEvent of the key
*/
@@ -1658,7 +1658,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/**
* Triggered when a key was depressed
- *
+ *
* @param event
* The KeyUpEvent of the key depressed
*/
@@ -1701,7 +1701,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
setPromptingOff(text);
selectedOptionKey = currentSuggestion.key;
} else {
- if (focused) {
+ if (focused || readonly || !enabled) {
setPromptingOff("");
} else {
setPromptingOn();
@@ -1801,7 +1801,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/*
* (non-Javadoc)
- *
+ *
* @see
* com.google.gwt.event.dom.client.FocusHandler#onFocus(com.google.gwt.event
* .dom.client.FocusEvent)
@@ -1845,7 +1845,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/*
* (non-Javadoc)
- *
+ *
* @see
* com.google.gwt.event.dom.client.BlurHandler#onBlur(com.google.gwt.event
* .dom.client.BlurEvent)
@@ -1910,7 +1910,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/*
* (non-Javadoc)
- *
+ *
* @see com.vaadin.client.Focusable#focus()
*/
@@ -1931,22 +1931,9 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
* For internal use only. May be removed or replaced in the future.
*/
public void updateRootWidth() {
- updateRootWidth(false);
- }
-
- /**
- * Calculates the width of the select if the select has undefined width.
- * Should be called when the width changes or when the icon changes.
- * <p>
- * For internal use only. May be removed or replaced in the future.
- *
- * @param forceUpdate
- * a flag that forces a recalculation even if one would not
- * normally be done
- */
- public void updateRootWidth(boolean forceUpdate) {
ComponentConnector paintable = ConnectorMap.get(client).getConnector(
this);
+
if (paintable.isUndefinedWidth()) {
/*
@@ -1958,7 +1945,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
*/
int w = Util.getRequiredWidth(this);
- if (forceUpdate || (!initDone || currentPage + 1 < 0)
+ if ((!initDone || currentPage + 1 < 0)
&& suggestionPopupMinWidth > w) {
/*
* We want to compensate for the paddings just to preserve the
@@ -1972,11 +1959,25 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
String originalBorder = style.getBorderWidth();
style.setPaddingLeft(0, Unit.PX);
style.setBorderWidth(0, Unit.PX);
- int offset = w - Util.getRequiredWidth(this);
style.setProperty("padding", originalPadding);
style.setProperty("borderWidth", originalBorder);
- setWidth(suggestionPopupMinWidth + offset + "px");
+ // Use util.getRequiredWidth instead of getOffsetWidth here
+
+ int iconWidth = selectedItemIcon == null ? 0 : Util
+ .getRequiredWidth(selectedItemIcon);
+ int buttonWidth = popupOpener == null ? 0 : Util
+ .getRequiredWidth(popupOpener);
+
+ /*
+ * Instead of setting the width of the wrapper, set the width of
+ * the combobox. Subtract the width of the icon and the
+ * popupopener
+ */
+
+ tb.setWidth((suggestionPopupMinWidth - iconWidth - buttonWidth)
+ + "px");
+
}
/*
@@ -1994,7 +1995,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/**
* Get the width of the select in pixels where the text area and icon has
* been included.
- *
+ *
* @return The width in pixels
*/
private int getMainWidth() {
@@ -2011,7 +2012,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/**
* Handles special behavior of the mouse down event
- *
+ *
* @param event
*/
private void handleMouseDownEvent(Event event) {
diff --git a/client/src/com/vaadin/client/ui/VGridLayout.java b/client/src/com/vaadin/client/ui/VGridLayout.java
index 1c42243621..10e5c00a38 100644
--- a/client/src/com/vaadin/client/ui/VGridLayout.java
+++ b/client/src/com/vaadin/client/ui/VGridLayout.java
@@ -1,12 +1,12 @@
/*
* Copyright 2000-2014 Vaadin Ltd.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -19,6 +19,7 @@ package com.vaadin.client.ui;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
+import java.util.Set;
import com.google.gwt.dom.client.DivElement;
import com.google.gwt.dom.client.Document;
@@ -71,6 +72,8 @@ public class VGridLayout extends ComplexPanel {
/** For internal use only. May be removed or replaced in the future. */
public DivElement spacingMeasureElement;
+ public Set<Integer> explicitRowRatios;
+ public Set<Integer> explicitColRatios;
public VGridLayout() {
super();
@@ -92,7 +95,7 @@ public class VGridLayout extends ComplexPanel {
/**
* Returns the column widths measured in pixels
- *
+ *
* @return
*/
protected int[] getColumnWidths() {
@@ -101,7 +104,7 @@ public class VGridLayout extends ComplexPanel {
/**
* Returns the row heights measured in pixels
- *
+ *
* @return
*/
protected int[] getRowHeights() {
@@ -110,7 +113,7 @@ public class VGridLayout extends ComplexPanel {
/**
* Returns the spacing between the cells horizontally in pixels
- *
+ *
* @return
*/
protected int getHorizontalSpacing() {
@@ -119,7 +122,7 @@ public class VGridLayout extends ComplexPanel {
/**
* Returns the spacing between the cells vertically in pixels
- *
+ *
* @return
*/
protected int getVerticalSpacing() {
@@ -136,18 +139,20 @@ public class VGridLayout extends ComplexPanel {
void expandRows() {
if (!isUndefinedHeight()) {
- int usedSpace = minRowHeights[0];
- int verticalSpacing = getVerticalSpacing();
- for (int i = 1; i < minRowHeights.length; i++) {
- usedSpace += verticalSpacing + minRowHeights[i];
- }
+ int usedSpace = calcRowUsedSpace();
+ int[] actualExpandRatio = calcRowExpandRatio();
int availableSpace = LayoutManager.get(client).getInnerHeight(
getElement());
int excessSpace = availableSpace - usedSpace;
int distributed = 0;
if (excessSpace > 0) {
+ int expandRatioSum = 0;
+ for (int i = 0; i < rowHeights.length; i++) {
+ expandRatioSum += actualExpandRatio[i];
+ }
for (int i = 0; i < rowHeights.length; i++) {
- int ew = excessSpace * rowExpandRatioArray[i] / 1000;
+ int ew = excessSpace * actualExpandRatio[i]
+ / expandRatioSum;
rowHeights[i] = minRowHeights[i] + ew;
distributed += ew;
}
@@ -162,44 +167,52 @@ public class VGridLayout extends ComplexPanel {
}
}
- /** For internal use only. May be removed or replaced in the future. */
- public void updateHeight() {
- // Detect minimum heights & calculate spans
- detectRowHeights();
-
- // Expand
- expandRows();
-
- // Position
- layoutCellsVertically();
+ private int[] calcRowExpandRatio() {
+ int[] actualExpandRatio = new int[minRowHeights.length];
+ for (int i = 0; i < minRowHeights.length; i++) {
+ if (rowHasComponentsOrRowSpan(i)) {
+ actualExpandRatio[i] = rowExpandRatioArray[i];
+ } else {
+ // Should not do this if this has explicitly been
+ // expanded
+ if (explicitRowRatios.contains(i)) {
+ actualExpandRatio[i] = rowExpandRatioArray[i];
+ } else {
+ actualExpandRatio[i] = 0;
+ }
+ }
+ }
+ return actualExpandRatio;
}
- /** For internal use only. May be removed or replaced in the future. */
- public void updateWidth() {
- // Detect widths & calculate spans
- detectColWidths();
- // Expand
- expandColumns();
- // Position
- layoutCellsHorizontally();
-
+ private int calcRowUsedSpace() {
+ int usedSpace = minRowHeights[0];
+ int verticalSpacing = getVerticalSpacing();
+ for (int i = 1; i < minRowHeights.length; i++) {
+ if (rowHasComponentsOrRowSpan(i) || minRowHeights[i] > 0
+ || explicitRowRatios.contains(i)) {
+ usedSpace += verticalSpacing + minRowHeights[i];
+ }
+ }
+ return usedSpace;
}
void expandColumns() {
if (!isUndefinedWidth()) {
- int usedSpace = minColumnWidths[0];
- int horizontalSpacing = getHorizontalSpacing();
- for (int i = 1; i < minColumnWidths.length; i++) {
- usedSpace += horizontalSpacing + minColumnWidths[i];
- }
-
+ int usedSpace = calcColumnUsedSpace();
+ int[] actualExpandRatio = calcColumnExpandRatio();
int availableSpace = LayoutManager.get(client).getInnerWidth(
getElement());
int excessSpace = availableSpace - usedSpace;
int distributed = 0;
if (excessSpace > 0) {
+ int expandRatioSum = 0;
+ for (int i = 0; i < columnWidths.length; i++) {
+ expandRatioSum += actualExpandRatio[i];
+ }
for (int i = 0; i < columnWidths.length; i++) {
- int ew = excessSpace * colExpandRatioArray[i] / 1000;
+ int ew = excessSpace * actualExpandRatio[i]
+ / expandRatioSum;
columnWidths[i] = minColumnWidths[i] + ew;
distributed += ew;
}
@@ -214,6 +227,97 @@ public class VGridLayout extends ComplexPanel {
}
}
+ /**
+ * Calculates column expand ratio.
+ */
+ private int[] calcColumnExpandRatio() {
+ int[] actualExpandRatio = new int[minColumnWidths.length];
+ for (int i = 0; i < minColumnWidths.length; i++) {
+ if (colHasComponentsOrColSpan(i)) {
+ actualExpandRatio[i] = colExpandRatioArray[i];
+ } else {
+ // Should not do this if this has explicitly been
+ // expanded
+ if (explicitColRatios.contains(i)) {
+ actualExpandRatio[i] = colExpandRatioArray[i];
+ } else {
+ actualExpandRatio[i] = 0;
+ }
+ }
+ }
+ return actualExpandRatio;
+ }
+
+ /**
+ * Calculates column used space
+ */
+ private int calcColumnUsedSpace() {
+ int usedSpace = minColumnWidths[0];
+ int horizontalSpacing = getHorizontalSpacing();
+ for (int i = 1; i < minColumnWidths.length; i++) {
+ if (colHasComponentsOrColSpan(i) || minColumnWidths[i] > 0
+ || explicitColRatios.contains(i)) {
+ usedSpace += horizontalSpacing + minColumnWidths[i];
+ }
+ }
+ return usedSpace;
+ }
+
+ private boolean rowHasComponentsOrRowSpan(int i) {
+ for (Cell cell : widgetToCell.values()) {
+ if (cell.row == i) {
+ return true;
+ }
+ }
+ for (SpanList l : rowSpans) {
+ for (Cell cell : l.cells) {
+ if (cell.row >= i && i < cell.row + cell.rowspan) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ private boolean colHasComponentsOrColSpan(int i) {
+ for (Cell cell : widgetToCell.values()) {
+ if (cell.col == i) {
+ return true;
+ }
+ }
+ for (SpanList l : colSpans) {
+ for (Cell cell : l.cells) {
+ if (cell.col >= i && i < cell.col + cell.colspan) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /** For internal use only. May be removed or replaced in the future. */
+ public void updateHeight() {
+ // Detect minimum heights & calculate spans
+ detectRowHeights();
+
+ // Expand
+ expandRows();
+
+ // Position
+ layoutCellsVertically();
+ }
+
+ /** For internal use only. May be removed or replaced in the future. */
+ public void updateWidth() {
+ // Detect widths & calculate spans
+ detectColWidths();
+ // Expand
+ expandColumns();
+ // Position
+ layoutCellsHorizontally();
+
+ }
+
void layoutCellsVertically() {
int verticalSpacing = getVerticalSpacing();
LayoutManager layoutManager = LayoutManager.get(client);
@@ -241,7 +345,9 @@ public class VGridLayout extends ComplexPanel {
cell.layoutVertically(y, reservedMargin);
}
- y += rowHeights[row] + verticalSpacing;
+ if (rowHasComponentsOrRowSpan(row) || rowHeights[row] > 0) {
+ y += rowHeights[row] + verticalSpacing;
+ }
}
}
@@ -277,7 +383,9 @@ public class VGridLayout extends ComplexPanel {
cell.layoutHorizontally(x, reservedMargin);
}
}
- x += columnWidths[i] + horizontalSpacing;
+ if (colHasComponentsOrColSpan(i) || columnWidths[i] > 0) {
+ x += columnWidths[i] + horizontalSpacing;
+ }
}
if (isUndefinedWidth()) {
@@ -602,7 +710,6 @@ public class VGridLayout extends ComplexPanel {
- childComponentData.column1;
// Set cell height
rowspan = 1 + childComponentData.row2 - childComponentData.row1;
-
setAlignment(new AlignmentInfo(childComponentData.alignment));
}
@@ -644,7 +751,7 @@ public class VGridLayout extends ComplexPanel {
* Creates a new Cell with the given coordinates.
* <p>
* For internal use only. May be removed or replaced in the future.
- *
+ *
* @param row
* @param col
* @return
@@ -660,7 +767,7 @@ public class VGridLayout extends ComplexPanel {
* child component is also returned if "element" is part of its caption.
* <p>
* For internal use only. May be removed or replaced in the future.
- *
+ *
* @param element
* An element that is a nested sub element of the root element in
* this layout
@@ -681,13 +788,13 @@ public class VGridLayout extends ComplexPanel {
* child component is also returned if "element" is part of its caption.
* <p>
* For internal use only. May be removed or replaced in the future.
- *
+ *
* @param element
* An element that is a nested sub element of the root element in
* this layout
* @return The Paintable which the element is a part of. Null if the element
* belongs to the layout and not to a child.
- *
+ *
* @since 7.2
*/
public ComponentConnector getComponent(Element element) {
diff --git a/client/src/com/vaadin/client/ui/VMenuBar.java b/client/src/com/vaadin/client/ui/VMenuBar.java
index f17ffbefed..909b25f7fb 100644
--- a/client/src/com/vaadin/client/ui/VMenuBar.java
+++ b/client/src/com/vaadin/client/ui/VMenuBar.java
@@ -1,12 +1,12 @@
/*
* Copyright 2000-2014 Vaadin Ltd.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -243,7 +243,7 @@ public class VMenuBar extends SimpleFocusablePanel implements
/**
* This is called by the items in the menu and it communicates the
* information to the server
- *
+ *
* @param clickedItemId
* id of the item that was clicked
*/
@@ -280,7 +280,7 @@ public class VMenuBar extends SimpleFocusablePanel implements
/**
* Returns the containing element of the menu
- *
+ *
* @return
*/
@Override
@@ -290,7 +290,7 @@ public class VMenuBar extends SimpleFocusablePanel implements
/**
* Add a new item to this menu
- *
+ *
* @param html
* items text
* @param cmd
@@ -307,7 +307,7 @@ public class VMenuBar extends SimpleFocusablePanel implements
/**
* Add a new item to this menu
- *
+ *
* @param item
*/
public void addItem(CustomMenuItem item) {
@@ -332,7 +332,7 @@ public class VMenuBar extends SimpleFocusablePanel implements
/**
* Remove the given item from this menu
- *
+ *
* @param item
*/
public void removeItem(CustomMenuItem item) {
@@ -429,7 +429,7 @@ public class VMenuBar extends SimpleFocusablePanel implements
/**
* When an item is clicked
- *
+ *
* @param item
*/
public void itemClick(CustomMenuItem item) {
@@ -460,7 +460,7 @@ public class VMenuBar extends SimpleFocusablePanel implements
/**
* When the user hovers the mouse over the item
- *
+ *
* @param item
*/
public void itemOver(CustomMenuItem item) {
@@ -485,7 +485,7 @@ public class VMenuBar extends SimpleFocusablePanel implements
/**
* When the mouse is moved away from an item
- *
+ *
* @param item
*/
public void itemOut(CustomMenuItem item) {
@@ -543,7 +543,7 @@ public class VMenuBar extends SimpleFocusablePanel implements
/**
* Shows the child menu of an item. The caller must ensure that the item has
* a submenu.
- *
+ *
* @param item
*/
public void showChildMenu(CustomMenuItem item) {
@@ -665,7 +665,7 @@ public class VMenuBar extends SimpleFocusablePanel implements
/**
* Hides the submenu of an item
- *
+ *
* @param item
*/
public void hideChildMenu(CustomMenuItem item) {
@@ -729,7 +729,7 @@ public class VMenuBar extends SimpleFocusablePanel implements
/**
* Returns the parent menu of this menu, or null if this is the top-level
* menu
- *
+ *
* @return
*/
public VMenuBar getParentMenu() {
@@ -738,7 +738,7 @@ public class VMenuBar extends SimpleFocusablePanel implements
/**
* Set the parent menu of this menu
- *
+ *
* @param parent
*/
public void setParentMenu(VMenuBar parent) {
@@ -748,7 +748,7 @@ public class VMenuBar extends SimpleFocusablePanel implements
/**
* Returns the currently selected item of this menu, or null if nothing is
* selected
- *
+ *
* @return
*/
public CustomMenuItem getSelected() {
@@ -757,7 +757,7 @@ public class VMenuBar extends SimpleFocusablePanel implements
/**
* Set the currently selected item of this menu
- *
+ *
* @param item
*/
public void setSelected(CustomMenuItem item) {
@@ -774,9 +774,9 @@ public class VMenuBar extends SimpleFocusablePanel implements
}
/**
- *
+ *
* A class to hold information on menu items
- *
+ *
*/
public static class CustomMenuItem extends Widget implements HasHTML {
@@ -795,7 +795,7 @@ public class VMenuBar extends SimpleFocusablePanel implements
/**
* Default menu item {@link Widget} constructor for GWT.create().
- *
+ *
* Use {@link #setHTML(String)} and {@link #setCommand(Command)} after
* constructing a menu item.
*/
@@ -805,7 +805,7 @@ public class VMenuBar extends SimpleFocusablePanel implements
/**
* Creates a menu item {@link Widget}.
- *
+ *
* @param html
* @param cmd
* @deprecated use the default constructor and {@link #setHTML(String)}
@@ -1034,12 +1034,12 @@ public class VMenuBar extends SimpleFocusablePanel implements
return null;
}
- return new TooltipInfo(description);
+ return new TooltipInfo(description, null, this);
}
/**
* Checks if the item can be selected.
- *
+ *
* @return true if it is possible to select this item, false otherwise
*/
public boolean isSelectable() {
@@ -1157,7 +1157,14 @@ public class VMenuBar extends SimpleFocusablePanel implements
*/
@Override
public void onKeyPress(KeyPressEvent event) {
- if (handleNavigation(event.getNativeEvent().getKeyCode(),
+ // A bug fix for #14041
+ // getKeyCode and getCharCode return different values for different
+ // browsers
+ int keyCode = event.getNativeEvent().getKeyCode();
+ if (keyCode == 0) {
+ keyCode = event.getNativeEvent().getCharCode();
+ }
+ if (handleNavigation(keyCode,
event.isControlKeyDown() || event.isMetaKeyDown(),
event.isShiftKeyDown())) {
event.preventDefault();
@@ -1173,7 +1180,14 @@ public class VMenuBar extends SimpleFocusablePanel implements
*/
@Override
public void onKeyDown(KeyDownEvent event) {
- if (handleNavigation(event.getNativeEvent().getKeyCode(),
+ // A bug fix for #14041
+ // getKeyCode and getCharCode return different values for different
+ // browsers
+ int keyCode = event.getNativeEvent().getKeyCode();
+ if (keyCode == 0) {
+ keyCode = event.getNativeEvent().getCharCode();
+ }
+ if (handleNavigation(keyCode,
event.isControlKeyDown() || event.isMetaKeyDown(),
event.isShiftKeyDown())) {
event.preventDefault();
@@ -1184,7 +1198,7 @@ public class VMenuBar extends SimpleFocusablePanel implements
* Get the key that moves the selection upwards. By default it is the up
* arrow key but by overriding this you can change the key to whatever you
* want.
- *
+ *
* @return The keycode of the key
*/
protected int getNavigationUpKey() {
@@ -1195,7 +1209,7 @@ public class VMenuBar extends SimpleFocusablePanel implements
* Get the key that moves the selection downwards. By default it is the down
* arrow key but by overriding this you can change the key to whatever you
* want.
- *
+ *
* @return The keycode of the key
*/
protected int getNavigationDownKey() {
@@ -1206,7 +1220,7 @@ public class VMenuBar extends SimpleFocusablePanel implements
* Get the key that moves the selection left. By default it is the left
* arrow key but by overriding this you can change the key to whatever you
* want.
- *
+ *
* @return The keycode of the key
*/
protected int getNavigationLeftKey() {
@@ -1217,7 +1231,7 @@ public class VMenuBar extends SimpleFocusablePanel implements
* Get the key that moves the selection right. By default it is the right
* arrow key but by overriding this you can change the key to whatever you
* want.
- *
+ *
* @return The keycode of the key
*/
protected int getNavigationRightKey() {
@@ -1227,7 +1241,7 @@ public class VMenuBar extends SimpleFocusablePanel implements
/**
* Get the key that selects a menu item. By default it is the Enter key but
* by overriding this you can change the key to whatever you want.
- *
+ *
* @deprecated use {@link #isNavigationSelectKey(int)} instead
* @return
*/
@@ -1240,7 +1254,7 @@ public class VMenuBar extends SimpleFocusablePanel implements
* Checks whether key code selects a menu item. By default it is the Enter
* and Space keys but by overriding this you can change the keys to whatever
* you want.
- *
+ *
* @since 7.2
* @param keycode
* @return true if key selects menu item
@@ -1253,7 +1267,7 @@ public class VMenuBar extends SimpleFocusablePanel implements
/**
* Get the key that closes the menu. By default it is the escape key but by
* overriding this yoy can change the key to whatever you want.
- *
+ *
* @return
*/
protected int getCloseMenuKey() {
@@ -1262,7 +1276,7 @@ public class VMenuBar extends SimpleFocusablePanel implements
/**
* Handles the keyboard events handled by the MenuBar
- *
+ *
* @param event
* The keyboard event received
* @return true iff the navigation event was handled
@@ -1549,7 +1563,7 @@ public class VMenuBar extends SimpleFocusablePanel implements
/**
* Get menu item with given DOM element
- *
+ *
* @param element
* Element used in search
* @return Menu item or null if not found
@@ -1578,11 +1592,11 @@ public class VMenuBar extends SimpleFocusablePanel implements
/**
* Get menu item with given DOM element
- *
+ *
* @param element
* Element used in search
* @return Menu item or null if not found
- *
+ *
* @since 7.2
*/
public CustomMenuItem getMenuItemWithElement(Element element) {
diff --git a/client/src/com/vaadin/client/ui/VNotification.java b/client/src/com/vaadin/client/ui/VNotification.java
index 48a3ba6df4..af7e429340 100644
--- a/client/src/com/vaadin/client/ui/VNotification.java
+++ b/client/src/com/vaadin/client/ui/VNotification.java
@@ -22,8 +22,8 @@ import java.util.Iterator;
import com.google.gwt.aria.client.Roles;
import com.google.gwt.core.client.GWT;
-import com.google.gwt.dom.client.Style;
-import com.google.gwt.dom.client.Style.Unit;
+import com.google.gwt.dom.client.Element;
+import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Event;
@@ -33,6 +33,7 @@ import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
import com.vaadin.client.AnimationUtil;
+import com.vaadin.client.AnimationUtil.AnimationEndListener;
import com.vaadin.client.ApplicationConnection;
import com.vaadin.client.BrowserInfo;
import com.vaadin.client.UIDL;
@@ -53,6 +54,14 @@ public class VNotification extends VOverlay {
public static final Position BOTTOM_LEFT = Position.BOTTOM_LEFT;
public static final Position BOTTOM_RIGHT = Position.BOTTOM_RIGHT;
+ private static final String STYLENAME_POSITION_TOP = "v-position-top";
+ private static final String STYLENAME_POSITION_RIGHT = "v-position-right";
+ private static final String STYLENAME_POSITION_BOTTOM = "v-position-bottom";
+ private static final String STYLENAME_POSITION_LEFT = "v-position-left";
+ private static final String STYLENAME_POSITION_MIDDLE = "v-position-middle";
+ private static final String STYLENAME_POSITION_CENTER = "v-position-center";
+ private static final String STYLENAME_POSITION_ASSISTIVE = "v-position-assistive";
+
/**
* Position that is only accessible for assistive devices, invisible for
* visual users.
@@ -70,7 +79,7 @@ public class VNotification extends VOverlay {
private static final ArrayList<VNotification> notifications = new ArrayList<VNotification>();
private boolean infiniteDelay = false;
- private int cssTransitionDelay = -1;
+ private int hideDelay = 0;
private int x = -1;
private int y = -1;
@@ -130,10 +139,10 @@ public class VNotification extends VOverlay {
private void setDelay(int delayMsec) {
if (delayMsec < 0) {
infiniteDelay = true;
- cssTransitionDelay = 0;
+ hideDelay = 0;
} else {
infiniteDelay = false;
- cssTransitionDelay = delayMsec;
+ hideDelay = delayMsec;
}
}
@@ -231,15 +240,16 @@ public class VNotification extends VOverlay {
removeStyleDependentName(temporaryStyle);
temporaryStyle = null;
}
- if (style != null) {
+ if (style != null && style.length() > 0) {
temporaryStyle = style;
addStyleName(style);
addStyleDependentName(style);
}
+ setPosition(position);
super.show();
+ updatePositionOffsets(position);
notifications.add(this);
- setPosition(position);
positionOrSizeUpdated();
/**
* Android 4 fails to render notifications correctly without a little
@@ -252,71 +262,128 @@ public class VNotification extends VOverlay {
@Override
public void hide() {
- DOM.removeEventPreview(this);
- if (cssTransitionDelay >= 0) {
- AnimationUtil.setAnimationDelay(getElement(), cssTransitionDelay
- + "ms");
+ // Run only once
+ if (notifications.contains(this)) {
+ DOM.removeEventPreview(this);
+
+ // Still animating in, wait for it to finish before touching
+ // the animation delay (which would restart the animation-in
+ // in some browsers)
+ if (getStyleName().contains(
+ VOverlay.ADDITIONAL_CLASSNAME_ANIMATE_IN)) {
+ AnimationUtil.addAnimationEndListener(getElement(),
+ new AnimationEndListener() {
+ @Override
+ public void onAnimationEnd(NativeEvent event) {
+ if (AnimationUtil
+ .getAnimationName(event)
+ .contains(
+ VOverlay.ADDITIONAL_CLASSNAME_ANIMATE_IN)) {
+ VNotification.this.hide();
+ }
+ }
+ });
+ } else {
+ // Use a timer in browsers without CSS animation support
+ // to show the notification for the duration of the delay
+ if (BrowserInfo.get().isIE8() || BrowserInfo.get().isIE9()) {
+ new Timer() {
+ @Override
+ public void run() {
+ VNotification.super.hide();
+ }
+ }.schedule(hideDelay);
+ } else {
+ if (hideDelay > 0) {
+ AnimationUtil.setAnimationDelay(getElement(), hideDelay
+ + "ms");
+ }
+ VNotification.super.hide();
+
+ }
+ fireEvent(new HideEvent(this));
+ notifications.remove(this);
+ }
+ }
+ }
+
+ private void updatePositionOffsets(com.vaadin.shared.Position position) {
+ final Element el = getElement();
+
+ // Remove all offsets (GWT PopupPanel defaults)
+ el.getStyle().clearTop();
+ el.getStyle().clearLeft();
+
+ switch (position) {
+ case MIDDLE_LEFT:
+ case MIDDLE_RIGHT:
+ center();
+ el.getStyle().clearLeft();
+ break;
+ case TOP_CENTER:
+ case BOTTOM_CENTER:
+ center();
+ el.getStyle().clearTop();
+ break;
+ case MIDDLE_CENTER:
+ center();
+ break;
}
- super.hide();
- notifications.remove(this);
- fireEvent(new HideEvent(this));
}
public void setPosition(com.vaadin.shared.Position position) {
- final Style style = getElement().getStyle();
- style.clearTop();
- style.clearRight();
- style.clearBottom();
- style.clearLeft();
+ final Element el = getElement();
+
+ // Remove any previous positions
+ el.removeClassName(STYLENAME_POSITION_TOP);
+ el.removeClassName(STYLENAME_POSITION_RIGHT);
+ el.removeClassName(STYLENAME_POSITION_BOTTOM);
+ el.removeClassName(STYLENAME_POSITION_LEFT);
+ el.removeClassName(STYLENAME_POSITION_MIDDLE);
+ el.removeClassName(STYLENAME_POSITION_CENTER);
+ el.removeClassName(STYLENAME_POSITION_ASSISTIVE);
+
switch (position) {
case TOP_LEFT:
- style.setTop(0, Unit.PX);
- style.setLeft(0, Unit.PX);
+ el.addClassName(STYLENAME_POSITION_TOP);
+ el.addClassName(STYLENAME_POSITION_LEFT);
break;
case TOP_RIGHT:
- style.setTop(0, Unit.PX);
- style.setRight(0, Unit.PX);
+ el.addClassName(STYLENAME_POSITION_TOP);
+ el.addClassName(STYLENAME_POSITION_RIGHT);
break;
case MIDDLE_LEFT:
- center();
- style.setLeft(0, Unit.PX);
+ el.addClassName(STYLENAME_POSITION_MIDDLE);
+ el.addClassName(STYLENAME_POSITION_LEFT);
break;
case MIDDLE_RIGHT:
- center();
- style.clearLeft();
- style.setRight(0, Unit.PX);
+ el.addClassName(STYLENAME_POSITION_MIDDLE);
+ el.addClassName(STYLENAME_POSITION_RIGHT);
break;
case BOTTOM_RIGHT:
- style.setBottom(0, Unit.PX);
- style.setRight(0, Unit.PX);
+ el.addClassName(STYLENAME_POSITION_BOTTOM);
+ el.addClassName(STYLENAME_POSITION_RIGHT);
break;
case BOTTOM_LEFT:
- style.setBottom(0, Unit.PX);
- style.setLeft(0, Unit.PX);
+ el.addClassName(STYLENAME_POSITION_BOTTOM);
+ el.addClassName(STYLENAME_POSITION_LEFT);
break;
case TOP_CENTER:
- center();
- style.setTop(0, Unit.PX);
+ el.addClassName(STYLENAME_POSITION_TOP);
+ el.addClassName(STYLENAME_POSITION_CENTER);
break;
case BOTTOM_CENTER:
- center();
- style.clearTop();
- style.setBottom(0, Unit.PX);
+ el.addClassName(STYLENAME_POSITION_BOTTOM);
+ el.addClassName(STYLENAME_POSITION_CENTER);
break;
case ASSISTIVE:
- style.setTop(-2000, Unit.PX);
- style.setLeft(-2000, Unit.PX);
- break;
- default:
- case MIDDLE_CENTER:
- center();
+ el.addClassName(STYLENAME_POSITION_ASSISTIVE);
break;
}
}
@Override
public void onBrowserEvent(Event event) {
- DOM.removeEventPreview(this);
hide();
}
@@ -344,7 +411,6 @@ public class VNotification extends VOverlay {
// default
switch (type) {
case Event.ONMOUSEMOVE:
-
if (x < 0) {
x = DOM.eventGetClientX(event);
y = DOM.eventGetClientY(event);
diff --git a/client/src/com/vaadin/client/ui/VOverlay.java b/client/src/com/vaadin/client/ui/VOverlay.java
index ab493ce383..a4f62775e1 100644
--- a/client/src/com/vaadin/client/ui/VOverlay.java
+++ b/client/src/com/vaadin/client/ui/VOverlay.java
@@ -21,13 +21,13 @@ import java.util.logging.Logger;
import com.google.gwt.animation.client.Animation;
import com.google.gwt.aria.client.Roles;
+import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.IFrameElement;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.dom.client.Style;
import com.google.gwt.dom.client.Style.BorderStyle;
-import com.google.gwt.dom.client.Style.Display;
import com.google.gwt.dom.client.Style.Position;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.logical.shared.CloseEvent;
@@ -164,8 +164,8 @@ public class VOverlay extends PopupPanel implements CloseHandler<PopupPanel> {
*/
public static final String CLASSNAME_CONTAINER = "v-overlay-container";
- private static final String ADDITIONAL_CLASSNAME_ANIMATE_IN = "animate-in";
- private static final String ADDITIONAL_CLASSNAME_ANIMATE_OUT = "animate-out";
+ public static final String ADDITIONAL_CLASSNAME_ANIMATE_IN = "animate-in";
+ public static final String ADDITIONAL_CLASSNAME_ANIMATE_OUT = "animate-out";
/**
* The shadow element for this overlay.
@@ -433,9 +433,9 @@ public class VOverlay extends PopupPanel implements CloseHandler<PopupPanel> {
public void show() {
current = this;
- boolean hasAnimationIn = maybeShowWithAnimation();
+ maybeShowWithAnimation();
- if (isAnimationEnabled() && !hasAnimationIn) {
+ if (isAnimationEnabled()) {
new ResizeAnimation().run(POPUP_PANEL_ANIMATION_DURATION);
} else {
positionOrSizeUpdated(1.0);
@@ -443,6 +443,8 @@ public class VOverlay extends PopupPanel implements CloseHandler<PopupPanel> {
current = null;
}
+ private JavaScriptObject animateInListener;
+
private boolean maybeShowWithAnimation() {
boolean isAttached = isAttached() && isShowing();
super.show();
@@ -454,6 +456,7 @@ public class VOverlay extends PopupPanel implements CloseHandler<PopupPanel> {
return false;
} else {
// Check if animations are used
+ setVisible(false);
addStyleDependentName(ADDITIONAL_CLASSNAME_ANIMATE_IN);
if (isShadowEnabled()) {
shadow.addClassName(CLASSNAME_SHADOW + "-"
@@ -465,10 +468,30 @@ public class VOverlay extends PopupPanel implements CloseHandler<PopupPanel> {
if (animationName == null) {
animationName = "";
}
+ setVisible(true);
if (animationName.contains(ADDITIONAL_CLASSNAME_ANIMATE_IN)) {
- AnimationUtil.registerAnimationEndEventListener(getElement(),
- getAnimationEndListener(false));
+ // Disable GWT PopupPanel animation if used
+ setAnimationEnabled(false);
+ animateInListener = AnimationUtil.addAnimationEndListener(
+ getElement(), new AnimationEndListener() {
+ @Override
+ public void onAnimationEnd(NativeEvent event) {
+ String animationName = AnimationUtil
+ .getAnimationName(event);
+ if (animationName
+ .contains(ADDITIONAL_CLASSNAME_ANIMATE_IN)) {
+ AnimationUtil.removeAnimationEndListener(
+ getElement(), animateInListener);
+ removeStyleDependentName(ADDITIONAL_CLASSNAME_ANIMATE_IN);
+ if (isShadowEnabled()) {
+ shadow.removeClassName(CLASSNAME_SHADOW
+ + "-"
+ + ADDITIONAL_CLASSNAME_ANIMATE_IN);
+ }
+ }
+ }
+ });
return true;
} else {
removeStyleDependentName(ADDITIONAL_CLASSNAME_ANIMATE_IN);
@@ -936,64 +959,78 @@ public class VOverlay extends PopupPanel implements CloseHandler<PopupPanel> {
* @see com.google.gwt.user.client.ui.PopupPanel#hide(boolean)
*/
@Override
- public void hide(boolean autoClosed) {
+ public void hide(final boolean autoClosed) {
if (BrowserInfo.get().isIE8() || BrowserInfo.get().isIE9()) {
super.hide(autoClosed);
} else {
- // Check if animations are used
- addStyleDependentName(ADDITIONAL_CLASSNAME_ANIMATE_OUT);
- if (isShadowEnabled()) {
- shadow.addClassName(CLASSNAME_SHADOW + "-"
- + ADDITIONAL_CLASSNAME_ANIMATE_OUT);
- }
- ComputedStyle cs = new ComputedStyle(getElement());
- String animationName = AnimationUtil.getAnimationName(cs);
- if (animationName == null) {
- animationName = "";
- }
-
- if (animationName.contains(ADDITIONAL_CLASSNAME_ANIMATE_OUT)) {
- AnimationUtil.registerAnimationEndEventListener(getElement(),
- getAnimationEndListener(autoClosed));
- // No event previews should happen after the animation has
- // started
- VOverlay.this.setPreviewingAllNativeEvents(false);
+ if (getStyleName().contains(ADDITIONAL_CLASSNAME_ANIMATE_IN)) {
+ AnimationUtil.addAnimationEndListener(getElement(),
+ new AnimationEndListener() {
+ @Override
+ public void onAnimationEnd(NativeEvent event) {
+ if (AnimationUtil
+ .getAnimationName(event)
+ .contains(
+ ADDITIONAL_CLASSNAME_ANIMATE_IN)) {
+ VOverlay.this.hide(autoClosed);
+ }
+ }
+ });
} else {
- removeStyleDependentName(ADDITIONAL_CLASSNAME_ANIMATE_OUT);
+ // Check if animations are used
+ addStyleDependentName(ADDITIONAL_CLASSNAME_ANIMATE_OUT);
if (isShadowEnabled()) {
- shadow.removeClassName(CLASSNAME_SHADOW + "-"
+ shadow.addClassName(CLASSNAME_SHADOW + "-"
+ ADDITIONAL_CLASSNAME_ANIMATE_OUT);
}
- super.hide(autoClosed);
- }
- }
- }
-
- private AnimationEndListener getAnimationEndListener(
- final boolean autoClosed) {
- return new AnimationEndListener() {
+ ComputedStyle cs = new ComputedStyle(getElement());
+ String animationName = AnimationUtil.getAnimationName(cs);
+ if (animationName == null) {
+ animationName = "";
+ }
- @Override
- public void onAnimationEnd(NativeEvent event) {
- AnimationUtil
- .unregisterAnimationEndEventListeners(getElement());
- String animationName = AnimationUtil.getAnimationName(event);
- if (animationName.contains(ADDITIONAL_CLASSNAME_ANIMATE_IN)) {
- removeStyleDependentName(ADDITIONAL_CLASSNAME_ANIMATE_IN);
- if (isShadowEnabled()) {
- shadow.removeClassName(CLASSNAME_SHADOW + "-"
- + ADDITIONAL_CLASSNAME_ANIMATE_IN);
- }
- } else if (animationName
- .contains(ADDITIONAL_CLASSNAME_ANIMATE_OUT)) {
+ if (animationName.contains(ADDITIONAL_CLASSNAME_ANIMATE_OUT)) {
+ // Disable GWT PopupPanel closing animation if used
+ setAnimationEnabled(false);
+
+ AnimationUtil.addAnimationEndListener(getElement(),
+ new AnimationEndListener() {
+ @Override
+ public void onAnimationEnd(NativeEvent event) {
+ String animationName = AnimationUtil
+ .getAnimationName(event);
+ if (animationName
+ .contains(ADDITIONAL_CLASSNAME_ANIMATE_OUT)) {
+ AnimationUtil
+ .removeAllAnimationEndListeners(getElement());
+ // Remove both animation styles just in
+ // case
+ removeStyleDependentName(ADDITIONAL_CLASSNAME_ANIMATE_IN);
+ removeStyleDependentName(ADDITIONAL_CLASSNAME_ANIMATE_OUT);
+ if (isShadowEnabled()) {
+ shadow.removeClassName(CLASSNAME_SHADOW
+ + "-"
+ + ADDITIONAL_CLASSNAME_ANIMATE_IN);
+ shadow.removeClassName(CLASSNAME_SHADOW
+ + "-"
+ + ADDITIONAL_CLASSNAME_ANIMATE_OUT);
+ }
+ VOverlay.super.hide(autoClosed);
+ }
+ }
+ });
+ // No event previews should happen after the animation has
+ // started
+ VOverlay.this.setPreviewingAllNativeEvents(false);
+ } else {
removeStyleDependentName(ADDITIONAL_CLASSNAME_ANIMATE_OUT);
if (isShadowEnabled()) {
shadow.removeClassName(CLASSNAME_SHADOW + "-"
+ ADDITIONAL_CLASSNAME_ANIMATE_OUT);
}
- VOverlay.super.hide(autoClosed);
+ super.hide(autoClosed);
}
}
- };
+ }
}
} \ No newline at end of file
diff --git a/client/src/com/vaadin/client/ui/VPopupView.java b/client/src/com/vaadin/client/ui/VPopupView.java
index adf070f453..931945e546 100644
--- a/client/src/com/vaadin/client/ui/VPopupView.java
+++ b/client/src/com/vaadin/client/ui/VPopupView.java
@@ -91,6 +91,9 @@ public class VPopupView extends HTML implements Iterable<Widget> {
addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
+ preparePopup(popup);
+ showPopup(popup);
+ center();
fireEvent(new VisibilityChangeEvent(true));
}
});
@@ -111,7 +114,8 @@ public class VPopupView extends HTML implements Iterable<Widget> {
/** For internal use only. May be removed or replaced in the future. */
public void preparePopup(final CustomPopup popup) {
- popup.setVisible(false);
+ popup.setVisible(true);
+ popup.setWidget(loading);
popup.show();
}
@@ -128,8 +132,6 @@ public class VPopupView extends HTML implements Iterable<Widget> {
*/
public void showPopup(final CustomPopup popup) {
popup.setPopupPosition(0, 0);
-
- popup.setVisible(true);
}
/** For internal use only. May be removed or replaced in the future. */
@@ -270,9 +272,7 @@ public class VPopupView extends HTML implements Iterable<Widget> {
public void hide(boolean autoClosed) {
VConsole.log("Hiding popupview");
syncChildren();
- if (popupComponentWidget != null && popupComponentWidget != loading) {
- remove(popupComponentWidget);
- }
+ clearPopupComponentConnector();
hasHadMouseOver = false;
shortcutActionHandler = null;
super.hide(autoClosed);
@@ -333,15 +333,18 @@ public class VPopupView extends HTML implements Iterable<Widget> {
}
}
- @Override
- public boolean remove(Widget w) {
+ private void clearPopupComponentConnector() {
if (popupComponentConnector != null) {
popupComponentConnector.removeStateChangeHandler(this);
}
popupComponentConnector = null;
popupComponentWidget = null;
captionWrapper = null;
+ }
+ @Override
+ public boolean remove(Widget w) {
+ clearPopupComponentConnector();
return super.remove(w);
}
diff --git a/client/src/com/vaadin/client/ui/VRichTextArea.java b/client/src/com/vaadin/client/ui/VRichTextArea.java
index 52e3782f32..3f63f38067 100644
--- a/client/src/com/vaadin/client/ui/VRichTextArea.java
+++ b/client/src/com/vaadin/client/ui/VRichTextArea.java
@@ -21,10 +21,6 @@ import java.util.Map;
import java.util.Map.Entry;
import com.google.gwt.core.client.Scheduler;
-import com.google.gwt.dom.client.Element;
-import com.google.gwt.dom.client.Style.Position;
-import com.google.gwt.dom.client.Style.Unit;
-import com.google.gwt.dom.client.Style.Visibility;
import com.google.gwt.event.dom.client.BlurHandler;
import com.google.gwt.event.dom.client.KeyDownEvent;
import com.google.gwt.event.dom.client.KeyDownHandler;
@@ -32,7 +28,6 @@ import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
@@ -43,7 +38,6 @@ import com.google.gwt.user.client.ui.Widget;
import com.vaadin.client.ApplicationConnection;
import com.vaadin.client.BrowserInfo;
import com.vaadin.client.ConnectorMap;
-import com.vaadin.client.Util;
import com.vaadin.client.ui.ShortcutActionHandler.ShortcutActionHandlerOwner;
import com.vaadin.client.ui.richtextarea.VRichTextToolbar;
@@ -73,7 +67,8 @@ public class VRichTextArea extends Composite implements Field, KeyPressHandler,
/** For internal use only. May be removed or replaced in the future. */
public RichTextArea rta;
- private VRichTextToolbar formatter;
+ /** For internal use only. May be removed or replaced in the future. */
+ public VRichTextToolbar formatter;
/** For internal use only. May be removed or replaced in the future. */
public HTML html = new HTML();
@@ -82,9 +77,6 @@ public class VRichTextArea extends Composite implements Field, KeyPressHandler,
private boolean enabled = true;
- private int extraHorizontalPixels = -1;
- private int extraVerticalPixels = -1;
-
/** For internal use only. May be removed or replaced in the future. */
public int maxLength = -1;
@@ -193,92 +185,17 @@ public class VRichTextArea extends Composite implements Field, KeyPressHandler,
return readOnly;
}
- /**
- * @return space used by components paddings and borders
- */
- private int getExtraHorizontalPixels() {
- if (extraHorizontalPixels < 0) {
- detectExtraSizes();
- }
- return extraHorizontalPixels;
- }
-
- /**
- * @return space used by components paddings and borders
- */
- private int getExtraVerticalPixels() {
- if (extraVerticalPixels < 0) {
- detectExtraSizes();
- }
- return extraVerticalPixels;
- }
-
- /**
- * Detects space used by components paddings and borders.
- */
- private void detectExtraSizes() {
- Element clone = Util.cloneNode(getElement(), false);
- DOM.setElementAttribute(clone, "id", "");
- clone.getStyle().setVisibility(Visibility.HIDDEN);
- clone.getStyle().setPosition(Position.ABSOLUTE);
- // due FF3 bug set size to 10px and later subtract it from extra pixels
- clone.getStyle().setWidth(10, Unit.PX);
- clone.getStyle().setHeight(10, Unit.PX);
- DOM.appendChild(DOM.getParent(getElement()), clone);
- extraHorizontalPixels = DOM.getElementPropertyInt(clone, "offsetWidth") - 10;
- extraVerticalPixels = DOM.getElementPropertyInt(clone, "offsetHeight") - 10;
-
- DOM.removeChild(DOM.getParent(getElement()), clone);
- }
-
@Override
public void setHeight(String height) {
- if (height.endsWith("px")) {
- float h = Float
- .parseFloat(height.substring(0, height.length() - 2));
- h -= getExtraVerticalPixels();
- if (h < 0) {
- h = 0;
- }
-
- super.setHeight(h + "px");
- } else {
- super.setHeight(height);
- }
-
+ super.setHeight(height);
if (height == null || height.equals("")) {
rta.setHeight("");
- } else {
- /*
- * The formatter height will be initially calculated wrong so we
- * delay the height setting so the DOM has had time to stabilize.
- */
- Scheduler.get().scheduleDeferred(new Command() {
- @Override
- public void execute() {
- int editorHeight = getOffsetHeight()
- - getExtraVerticalPixels()
- - formatter.getOffsetHeight();
- if (editorHeight < 0) {
- editorHeight = 0;
- }
- rta.setHeight(editorHeight + "px");
- }
- });
}
}
@Override
public void setWidth(String width) {
- if (width.endsWith("px")) {
- float w = Float.parseFloat(width.substring(0, width.length() - 2));
- w -= getExtraHorizontalPixels();
- if (w < 0) {
- w = 0;
- }
-
- super.setWidth(w + "px");
- } else if (width.equals("")) {
+ if (width.equals("")) {
/*
* IE cannot calculate the width of the 100% iframe correctly if
* there is no width specified for the parent. In this case we would
diff --git a/client/src/com/vaadin/client/ui/VScrollTable.java b/client/src/com/vaadin/client/ui/VScrollTable.java
index d6eec66561..ef8be5aadc 100644
--- a/client/src/com/vaadin/client/ui/VScrollTable.java
+++ b/client/src/com/vaadin/client/ui/VScrollTable.java
@@ -1083,11 +1083,15 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
keyboardSelectionOverRowFetchInProgress = true;
}
if (selected) {
+
if (focusedRow == null
|| !selectedRowKeys.contains(focusedRow
.getKey())) {
- // The focus is no longer on a selected row,
- // move focus to first selected row
+ /*
+ * The focus is no longer on a selected row. Move
+ * focus to the selected row. (#10522)
+ */
+
setRowFocus(row);
}
}
@@ -5157,7 +5161,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
String rowDescription = uidl.getStringAttribute("rowdescr");
if (rowDescription != null && !rowDescription.equals("")) {
- tooltipInfo = new TooltipInfo(rowDescription);
+ tooltipInfo = new TooltipInfo(rowDescription, null, this);
} else {
tooltipInfo = null;
}
@@ -5430,7 +5434,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
private void setTooltip(TableCellElement td, String description) {
if (description != null && !description.equals("")) {
- TooltipInfo info = new TooltipInfo(description);
+ TooltipInfo info = new TooltipInfo(description, null, this);
cellToolTips.put(td, info);
} else {
cellToolTips.remove(td);
@@ -6689,7 +6693,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
colIndex = 0;
while (headCells.hasNext()) {
HeaderCell hc = (HeaderCell) headCells.next();
- if (!hc.isDefinedWidth()) {
+ if (!hc.isResizing && !hc.isDefinedWidth()) {
setColWidth(colIndex, hc.getWidthWithIndent() + availW
- checksum, false);
break;
@@ -7258,7 +7262,14 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
// Set new focused row
focusedRow = row;
- ensureRowIsVisible(row);
+ /*
+ * Don't scroll to the focused row when in multiselect mode.
+ * (#13341)
+ */
+
+ if (isSingleSelectMode()) {
+ ensureRowIsVisible(row);
+ }
return true;
}
diff --git a/client/src/com/vaadin/client/ui/VTabsheet.java b/client/src/com/vaadin/client/ui/VTabsheet.java
index 3f2d90b721..15d9c83c49 100644
--- a/client/src/com/vaadin/client/ui/VTabsheet.java
+++ b/client/src/com/vaadin/client/ui/VTabsheet.java
@@ -329,7 +329,7 @@ public class VTabsheet extends VTabsheetBase implements Focusable,
private boolean update(TabState tabState) {
if (tabState.description != null || tabState.componentError != null) {
setTooltipInfo(new TooltipInfo(tabState.description,
- tabState.componentError));
+ tabState.componentError, this));
} else {
setTooltipInfo(null);
}
diff --git a/client/src/com/vaadin/client/ui/VUI.java b/client/src/com/vaadin/client/ui/VUI.java
index df24c3b1c7..eae4f6319d 100644
--- a/client/src/com/vaadin/client/ui/VUI.java
+++ b/client/src/com/vaadin/client/ui/VUI.java
@@ -48,11 +48,12 @@ import com.vaadin.client.Util;
import com.vaadin.client.VConsole;
import com.vaadin.client.ui.ShortcutActionHandler.ShortcutActionHandlerOwner;
import com.vaadin.client.ui.TouchScrollDelegate.TouchScrollHandler;
+import com.vaadin.client.ui.ui.UIConnector;
import com.vaadin.shared.ApplicationConstants;
import com.vaadin.shared.ui.ui.UIConstants;
/**
- *
+ *
*/
public class VUI extends SimplePanel implements ResizeHandler,
Window.ClosingHandler, ShortcutActionHandlerOwner, Focusable,
@@ -62,9 +63,6 @@ public class VUI extends SimplePanel implements ResizeHandler,
private static int MONITOR_PARENT_TIMER_INTERVAL = 1000;
/** For internal use only. May be removed or replaced in the future. */
- public String theme;
-
- /** For internal use only. May be removed or replaced in the future. */
public String id;
/** For internal use only. May be removed or replaced in the future. */
@@ -319,19 +317,15 @@ public class VUI extends SimplePanel implements ResizeHandler,
}
}
- public String getTheme() {
- return theme;
- }
-
/**
- * Used to reload host page on theme changes.
- * <p>
- * For internal use only. May be removed or replaced in the future.
+ * @return the name of the theme in use by this UI.
+ * @deprecated as of 7.3. Use {@link UIConnector#getActiveTheme()} instead.
*/
- public static native void reloadHostPage()
- /*-{
- $wnd.location.reload();
- }-*/;
+ @Deprecated
+ public String getTheme() {
+ return ((UIConnector) ConnectorMap.get(connection).getConnector(this))
+ .getActiveTheme();
+ }
/**
* Returns true if the body is NOT generated, i.e if someone else has made
@@ -530,4 +524,5 @@ public class VUI extends SimplePanel implements ResizeHandler,
});
}
}
+
}
diff --git a/client/src/com/vaadin/client/ui/VWindow.java b/client/src/com/vaadin/client/ui/VWindow.java
index e2cc33744e..7c1a21f654 100644
--- a/client/src/com/vaadin/client/ui/VWindow.java
+++ b/client/src/com/vaadin/client/ui/VWindow.java
@@ -30,7 +30,6 @@ import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NativeEvent;
-import com.google.gwt.dom.client.Node;
import com.google.gwt.dom.client.Style;
import com.google.gwt.dom.client.Style.Display;
import com.google.gwt.dom.client.Style.Position;
@@ -201,9 +200,6 @@ public class VWindow extends VWindowOverlay implements
/** For internal use only. May be removed or replaced in the future. */
public int bringToFrontSequence = -1;
- /** For internal use only. May be removed or replaced in the future. */
- public Node windowClone;
-
private VLazyExecutor delayedContentsSizeUpdater = new VLazyExecutor(200,
new ScheduledCommand() {
@@ -1037,14 +1033,6 @@ public class VWindow extends VWindowOverlay implements
}
private void onCloseClick() {
- // Take a copy of the contents, since the server will detach all
- // children of this window, and the window will be emptied during the
- // next hierarchy update (we need to keep the contents visible for the
- // duration of a possible 'out-animation')
- // This is used by the WindowConnector in the case the window is
- // actually closed and removed from the UI
- windowClone = getElement().getFirstChild().cloneNode(true);
-
// Send the close event to the server
client.updateVariable(id, "close", true, true);
}
diff --git a/client/src/com/vaadin/client/ui/calendar/schedule/DateCellDayEvent.java b/client/src/com/vaadin/client/ui/calendar/schedule/DateCellDayEvent.java
index bbbd355a32..3b168b636c 100644
--- a/client/src/com/vaadin/client/ui/calendar/schedule/DateCellDayEvent.java
+++ b/client/src/com/vaadin/client/ui/calendar/schedule/DateCellDayEvent.java
@@ -298,6 +298,7 @@ public class DateCellDayEvent extends FocusableHTML implements
weekGrid.getCalendar().getEventResizeListener()
.eventResized(calendarEvent);
}
+ dateCell.recalculateEventWidths();
}
}
diff --git a/client/src/com/vaadin/client/ui/checkbox/CheckBoxConnector.java b/client/src/com/vaadin/client/ui/checkbox/CheckBoxConnector.java
index a72049aa90..28f6beefa6 100644
--- a/client/src/com/vaadin/client/ui/checkbox/CheckBoxConnector.java
+++ b/client/src/com/vaadin/client/ui/checkbox/CheckBoxConnector.java
@@ -144,14 +144,18 @@ public class CheckBoxConnector extends AbstractFieldConnector implements
return;
}
- getState().checked = getWidget().getValue();
-
- // Add mouse details
- MouseEventDetails details = MouseEventDetailsBuilder
- .buildMouseEventDetails(event.getNativeEvent(), getWidget()
- .getElement());
- getRpcProxy(CheckBoxServerRpc.class).setChecked(getState().checked,
- details);
-
+ // We get click events also from the label text, which do not alter the
+ // actual value. The server-side is only interested in real changes to
+ // the state.
+ if (getState().checked != getWidget().getValue()) {
+ getState().checked = getWidget().getValue();
+
+ // Add mouse details
+ MouseEventDetails details = MouseEventDetailsBuilder
+ .buildMouseEventDetails(event.getNativeEvent(), getWidget()
+ .getElement());
+ getRpcProxy(CheckBoxServerRpc.class).setChecked(getState().checked,
+ details);
+ }
}
}
diff --git a/client/src/com/vaadin/client/ui/combobox/ComboBoxConnector.java b/client/src/com/vaadin/client/ui/combobox/ComboBoxConnector.java
index c3cdb43703..78505d034c 100644
--- a/client/src/com/vaadin/client/ui/combobox/ComboBoxConnector.java
+++ b/client/src/com/vaadin/client/ui/combobox/ComboBoxConnector.java
@@ -24,7 +24,6 @@ import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.vaadin.client.ApplicationConnection;
import com.vaadin.client.Paintable;
import com.vaadin.client.UIDL;
-import com.vaadin.client.communication.StateChangeEvent;
import com.vaadin.client.ui.AbstractFieldConnector;
import com.vaadin.client.ui.SimpleManagedLayout;
import com.vaadin.client.ui.VFilterSelect;
@@ -44,10 +43,6 @@ public class ComboBoxConnector extends AbstractFieldConnector implements
// update textbox text by a changed item caption.
private boolean oldSuggestionTextMatchTheOldSelection;
- // Need to recompute the width of the combobox when styles change, see
- // #13444
- private boolean stylesChanged;
-
/*
* (non-Javadoc)
*
@@ -201,16 +196,11 @@ public class ComboBoxConnector extends AbstractFieldConnector implements
getWidget().popupOpenerClicked = false;
/*
- * if styles have changed or this is our first time we need to
- * recalculate the root width.
+ * if this is our first time we need to recalculate the root width.
*/
if (!getWidget().initDone) {
- // no need to force update since we have no existing width
- getWidget().updateRootWidth(false);
- } else if (stylesChanged) {
- // we have previously calculated a width, we must force an update
- // due to changed styles
- getWidget().updateRootWidth(true);
+
+ getWidget().updateRootWidth();
}
// Focus dependent style names are lost during the update, so we add
@@ -219,9 +209,6 @@ public class ComboBoxConnector extends AbstractFieldConnector implements
getWidget().addStyleDependentName("focus");
}
- // width has been recalculated above, clear style change flag
- stylesChanged = false;
-
getWidget().initDone = true;
}
@@ -303,8 +290,10 @@ public class ComboBoxConnector extends AbstractFieldConnector implements
* ALWAYS set the prompting style at this point, even though we
* think it has been set already...
*/
- getWidget().prompting = false;
- getWidget().setPromptingOn();
+ getWidget().setPromptingOff("");
+ if (getWidget().enabled && !getWidget().readonly) {
+ getWidget().setPromptingOn();
+ }
} else {
// we have focus in field, prompting can't be set on, instead
// just clear the input if the value has changed from something
@@ -345,12 +334,4 @@ public class ComboBoxConnector extends AbstractFieldConnector implements
getWidget().tb.setEnabled(widgetEnabled);
}
- @Override
- public void onStateChanged(StateChangeEvent event) {
- super.onStateChanged(event);
- if (event.hasPropertyChanged("styles")) {
- stylesChanged = true;
- }
- }
-
}
diff --git a/client/src/com/vaadin/client/ui/gridlayout/GridLayoutConnector.java b/client/src/com/vaadin/client/ui/gridlayout/GridLayoutConnector.java
index 67220e5c36..786bd18bf9 100644
--- a/client/src/com/vaadin/client/ui/gridlayout/GridLayoutConnector.java
+++ b/client/src/com/vaadin/client/ui/gridlayout/GridLayoutConnector.java
@@ -1,12 +1,12 @@
/*
* Copyright 2000-2014 Vaadin Ltd.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -119,9 +119,7 @@ public class GridLayoutConnector extends AbstractComponentContainerConnector
layout.rowExpandRatioArray = uidl.getIntArrayAttribute("rowExpand");
layout.updateMarginStyleNames(new MarginInfo(getState().marginsBitmask));
-
layout.updateSpacingStyleName(getState().spacing);
-
getLayoutManager().setNeedsLayout(this);
}
@@ -171,7 +169,8 @@ public class GridLayoutConnector extends AbstractComponentContainerConnector
layout.columnWidths = new int[cols];
layout.rowHeights = new int[rows];
-
+ layout.explicitRowRatios = getState().explicitRowRatios;
+ layout.explicitColRatios = getState().explicitColRatios;
layout.setSize(rows, cols);
}
diff --git a/client/src/com/vaadin/client/ui/popupview/PopupViewConnector.java b/client/src/com/vaadin/client/ui/popupview/PopupViewConnector.java
index bde5f6a051..6afceb75de 100644
--- a/client/src/com/vaadin/client/ui/popupview/PopupViewConnector.java
+++ b/client/src/com/vaadin/client/ui/popupview/PopupViewConnector.java
@@ -26,6 +26,7 @@ import com.vaadin.client.VCaptionWrapper;
import com.vaadin.client.communication.StateChangeEvent;
import com.vaadin.client.ui.AbstractHasComponentsConnector;
import com.vaadin.client.ui.PostLayoutListener;
+import com.vaadin.client.ui.VOverlay;
import com.vaadin.client.ui.VPopupView;
import com.vaadin.shared.ui.ComponentStateUtil;
import com.vaadin.shared.ui.Connect;
@@ -100,27 +101,37 @@ public class PopupViewConnector extends AbstractHasComponentsConnector
if (!getChildComponents().isEmpty()) {
getWidget().preparePopup(getWidget().popup);
getWidget().popup.setPopupConnector(getChildComponents().get(0));
- if (ComponentStateUtil.hasStyles(getState())) {
- final StringBuffer styleBuf = new StringBuffer();
- final String primaryName = getWidget().popup
- .getStylePrimaryName();
+
+ final StringBuffer styleBuf = new StringBuffer();
+ final String primaryName = getWidget().popup.getStylePrimaryName();
+ styleBuf.append(primaryName);
+
+ // Add "animate-in" class back if already present
+ boolean isAnimatingIn = getWidget().popup.getStyleName().contains(
+ VOverlay.ADDITIONAL_CLASSNAME_ANIMATE_IN);
+
+ if (isAnimatingIn) {
+ styleBuf.append(" ");
styleBuf.append(primaryName);
+ styleBuf.append("-");
+ styleBuf.append(VOverlay.ADDITIONAL_CLASSNAME_ANIMATE_IN);
+ }
+
+ if (ComponentStateUtil.hasStyles(getState())) {
for (String style : getState().styles) {
styleBuf.append(" ");
styleBuf.append(primaryName);
styleBuf.append("-");
styleBuf.append(style);
}
- getWidget().popup.setStyleName(styleBuf.toString());
- } else {
- getWidget().popup.setStyleName(getWidget().popup
- .getStylePrimaryName());
}
+
+ getWidget().popup.setStyleName(styleBuf.toString());
getWidget().showPopup(getWidget().popup);
centerAfterLayout = true;
- // The popup shouldn't be visible, try to hide it.
} else {
+ // The popup shouldn't be visible, try to hide it.
getWidget().popup.hide();
}
}
diff --git a/client/src/com/vaadin/client/ui/richtextarea/RichTextAreaConnector.java b/client/src/com/vaadin/client/ui/richtextarea/RichTextAreaConnector.java
index 6b3bf84578..5fe637447e 100644
--- a/client/src/com/vaadin/client/ui/richtextarea/RichTextAreaConnector.java
+++ b/client/src/com/vaadin/client/ui/richtextarea/RichTextAreaConnector.java
@@ -23,6 +23,7 @@ import com.vaadin.client.Paintable;
import com.vaadin.client.UIDL;
import com.vaadin.client.ui.AbstractFieldConnector;
import com.vaadin.client.ui.ShortcutActionHandler.BeforeShortcutActionListener;
+import com.vaadin.client.ui.SimpleManagedLayout;
import com.vaadin.client.ui.VRichTextArea;
import com.vaadin.shared.ui.Connect;
import com.vaadin.shared.ui.Connect.LoadStyle;
@@ -31,7 +32,7 @@ import com.vaadin.ui.RichTextArea;
@Connect(value = RichTextArea.class, loadStyle = LoadStyle.LAZY)
public class RichTextAreaConnector extends AbstractFieldConnector implements
- Paintable, BeforeShortcutActionListener {
+ Paintable, BeforeShortcutActionListener, SimpleManagedLayout {
/*
* Last value received from the server
@@ -47,6 +48,15 @@ public class RichTextAreaConnector extends AbstractFieldConnector implements
flush();
}
});
+ getLayoutManager().registerDependency(this,
+ getWidget().formatter.getElement());
+ }
+
+ @Override
+ public void onUnregister() {
+ super.onUnregister();
+ getLayoutManager().unregisterDependency(this,
+ getWidget().formatter.getElement());
}
@Override
@@ -110,4 +120,19 @@ public class RichTextAreaConnector extends AbstractFieldConnector implements
}
}
}
+
+ @Override
+ public void layout() {
+ if (!isUndefinedHeight()) {
+ int rootElementInnerHeight = getLayoutManager().getInnerHeight(
+ getWidget().getElement());
+ int formatterHeight = getLayoutManager().getOuterHeight(
+ getWidget().formatter.getElement());
+ int editorHeight = rootElementInnerHeight - formatterHeight;
+ if (editorHeight < 0) {
+ editorHeight = 0;
+ }
+ getWidget().rta.setHeight(editorHeight + "px");
+ }
+ }
}
diff --git a/client/src/com/vaadin/client/ui/splitpanel/AbstractSplitPanelConnector.java b/client/src/com/vaadin/client/ui/splitpanel/AbstractSplitPanelConnector.java
index ce8b3c8fea..6bf03ad880 100644
--- a/client/src/com/vaadin/client/ui/splitpanel/AbstractSplitPanelConnector.java
+++ b/client/src/com/vaadin/client/ui/splitpanel/AbstractSplitPanelConnector.java
@@ -161,6 +161,35 @@ public abstract class AbstractSplitPanelConnector extends
getLayoutManager().setNeedsLayout(this);
getWidget().makeScrollable();
+
+ handleSingleComponentMove();
+ }
+
+ /**
+ * Handles the case when there is only one child component and that
+ * component is moved between first <-> second. This does not trigger a
+ * hierarchy change event as the list of children contains the same
+ * component in both cases.
+ */
+ private void handleSingleComponentMove() {
+ if (getChildComponents().size() == 1) {
+ Widget stateFirstChild = null;
+ Widget stateSecondChild = null;
+ if (getState().firstChild != null) {
+ stateFirstChild = ((ComponentConnector) getState().firstChild)
+ .getWidget();
+ }
+ if (getState().secondChild != null) {
+ stateSecondChild = ((ComponentConnector) getState().secondChild)
+ .getWidget();
+ }
+
+ if (stateFirstChild == getWidget().getSecondWidget()
+ || stateSecondChild == getWidget().getFirstWidget()) {
+ handleHierarchyChange();
+ }
+ }
+
}
@Override
@@ -212,6 +241,10 @@ public abstract class AbstractSplitPanelConnector extends
@Override
public void onConnectorHierarchyChange(ConnectorHierarchyChangeEvent event) {
+ handleHierarchyChange();
+ }
+
+ private void handleHierarchyChange() {
/*
* When the connector gets detached, the state isn't updated but there's
* still a hierarchy change -> verify that the child from the state is
diff --git a/client/src/com/vaadin/client/ui/tree/TreeConnector.java b/client/src/com/vaadin/client/ui/tree/TreeConnector.java
index c57430b3b4..55224b455f 100644
--- a/client/src/com/vaadin/client/ui/tree/TreeConnector.java
+++ b/client/src/com/vaadin/client/ui/tree/TreeConnector.java
@@ -269,7 +269,8 @@ public class TreeConnector extends AbstractComponentConnector implements
String description = uidl.getStringAttribute("descr");
if (description != null) {
- tooltipMap.put(treeNode, new TooltipInfo(description));
+ tooltipMap.put(treeNode, new TooltipInfo(description, null,
+ treeNode));
}
if (uidl.getBooleanAttribute("expanded") && !treeNode.getState()) {
diff --git a/client/src/com/vaadin/client/ui/ui/UIConnector.java b/client/src/com/vaadin/client/ui/ui/UIConnector.java
index 1d2a49cbd1..8997509da6 100644
--- a/client/src/com/vaadin/client/ui/ui/UIConnector.java
+++ b/client/src/com/vaadin/client/ui/ui/UIConnector.java
@@ -1,12 +1,12 @@
/*
* Copyright 2000-2014 Vaadin Ltd.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -18,6 +18,7 @@ package com.vaadin.client.ui.ui;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import java.util.logging.Logger;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
@@ -26,8 +27,10 @@ import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.HeadElement;
import com.google.gwt.dom.client.LinkElement;
import com.google.gwt.dom.client.NativeEvent;
+import com.google.gwt.dom.client.NodeList;
import com.google.gwt.dom.client.Style;
import com.google.gwt.dom.client.Style.Position;
+import com.google.gwt.dom.client.StyleElement;
import com.google.gwt.dom.client.StyleInjector;
import com.google.gwt.event.dom.client.ScrollEvent;
import com.google.gwt.event.dom.client.ScrollHandler;
@@ -51,12 +54,17 @@ import com.vaadin.client.ComponentConnector;
import com.vaadin.client.ConnectorHierarchyChangeEvent;
import com.vaadin.client.Focusable;
import com.vaadin.client.Paintable;
+import com.vaadin.client.ResourceLoader;
+import com.vaadin.client.ResourceLoader.ResourceLoadEvent;
+import com.vaadin.client.ResourceLoader.ResourceLoadListener;
import com.vaadin.client.ServerConnector;
import com.vaadin.client.UIDL;
import com.vaadin.client.VConsole;
import com.vaadin.client.ValueMap;
+import com.vaadin.client.annotations.OnStateChange;
import com.vaadin.client.communication.StateChangeEvent;
import com.vaadin.client.communication.StateChangeEvent.StateChangeHandler;
+import com.vaadin.client.ui.AbstractConnector;
import com.vaadin.client.ui.AbstractSingleComponentContainerConnector;
import com.vaadin.client.ui.ClickEventHandler;
import com.vaadin.client.ui.ShortcutActionHandler;
@@ -66,6 +74,7 @@ import com.vaadin.client.ui.VUI;
import com.vaadin.client.ui.layout.MayScrollChildren;
import com.vaadin.client.ui.window.WindowConnector;
import com.vaadin.server.Page.Styles;
+import com.vaadin.shared.ApplicationConstants;
import com.vaadin.shared.MouseEventDetails;
import com.vaadin.shared.communication.MethodInvocation;
import com.vaadin.shared.ui.ComponentStateUtil;
@@ -80,6 +89,7 @@ import com.vaadin.shared.ui.ui.UIClientRpc;
import com.vaadin.shared.ui.ui.UIConstants;
import com.vaadin.shared.ui.ui.UIServerRpc;
import com.vaadin.shared.ui.ui.UIState;
+import com.vaadin.shared.util.SharedUtil;
import com.vaadin.ui.UI;
@Connect(value = UI.class, loadStyle = LoadStyle.EAGER)
@@ -88,6 +98,8 @@ public class UIConnector extends AbstractSingleComponentContainerConnector
private HandlerRegistration childStateChangeHandlerRegistration;
+ private String activeTheme = null;
+
private final StateChangeHandler childStateChangeHandler = new StateChangeHandler() {
@Override
public void onStateChanged(StateChangeEvent stateChangeEvent) {
@@ -197,14 +209,6 @@ public class UIConnector extends AbstractSingleComponentContainerConnector
getWidget().immediate = getState().immediate;
getWidget().resizeLazy = uidl.hasAttribute(UIConstants.RESIZE_LAZY);
- String newTheme = uidl.getStringAttribute("theme");
- if (getWidget().theme != null && !newTheme.equals(getWidget().theme)) {
- // Complete page refresh is needed due css can affect layout
- // calculations etc
- getWidget().reloadHostPage();
- } else {
- getWidget().theme = newTheme;
- }
// this also implicitly removes old styles
String styles = "";
styles += getWidget().getStylePrimaryName() + " ";
@@ -399,15 +403,12 @@ public class UIConnector extends AbstractSingleComponentContainerConnector
/**
* Reads CSS strings and resources injected by {@link Styles#inject} from
* the UIDL stream.
- *
+ *
* @param uidl
* The uidl which contains "css-resource" and "css-string" tags
*/
private void injectCSS(UIDL uidl) {
- final HeadElement head = HeadElement.as(Document.get()
- .getElementsByTagName(HeadElement.TAG).getItem(0));
-
/*
* Search the UIDL stream for CSS resources and strings to be injected.
*/
@@ -424,8 +425,7 @@ public class UIConnector extends AbstractSingleComponentContainerConnector
link.setRel("stylesheet");
link.setHref(url);
link.setType("text/css");
- head.appendChild(link);
-
+ getHead().appendChild(link);
// Check if we have CSS string to inject
} else if (cssInjectionsUidl.getTag().equals("css-string")) {
for (Iterator<?> it2 = cssInjectionsUidl.getChildIterator(); it2
@@ -437,8 +437,53 @@ public class UIConnector extends AbstractSingleComponentContainerConnector
}
}
+ /**
+ * Internal helper to get the <head> tag of the page
+ *
+ * @since
+ * @return the head element
+ */
+ private HeadElement getHead() {
+ return HeadElement.as(Document.get()
+ .getElementsByTagName(HeadElement.TAG).getItem(0));
+ }
+
+ /**
+ * Internal helper for removing any stylesheet with the given URL
+ *
+ * @since
+ * @param url
+ * the url to match with existing stylesheets
+ */
+ private void removeStylesheet(String url) {
+ NodeList<Element> linkTags = getHead().getElementsByTagName(
+ LinkElement.TAG);
+ for (int i = 0; i < linkTags.getLength(); i++) {
+ LinkElement link = LinkElement.as(linkTags.getItem(i));
+ if (!"stylesheet".equals(link.getRel())) {
+ continue;
+ }
+ if (!"text/css".equals(link.getType())) {
+ continue;
+ }
+ if (url.equals(link.getHref())) {
+ getHead().removeChild(link);
+ }
+ }
+ }
+
public void init(String rootPanelId,
ApplicationConnection applicationConnection) {
+ // Create a style tag for style injections so they don't end up in
+ // the theme tag in IE8-IE10 (we don't want to wipe them out if we
+ // change theme)
+ if (BrowserInfo.get().isIE()
+ && BrowserInfo.get().getBrowserMajorVersion() < 11) {
+ StyleElement style = Document.get().createStyleElement();
+ style.setType("text/css");
+ getHead().appendChild(style);
+ }
+
DOM.sinkEvents(getWidget().getElement(), Event.ONKEYDOWN
| Event.ONSCROLL);
@@ -448,9 +493,7 @@ public class UIConnector extends AbstractSingleComponentContainerConnector
// the user
root.getElement().setInnerHTML("");
- String themeName = applicationConnection.getConfiguration()
- .getThemeName();
- root.addStyleName(themeName);
+ activeTheme = applicationConnection.getConfiguration().getThemeName();
root.add(getWidget());
@@ -538,7 +581,7 @@ public class UIConnector extends AbstractSingleComponentContainerConnector
/**
* Checks if the given sub window is a child of this UI Connector
- *
+ *
* @deprecated Should be replaced by a more generic mechanism for getting
* non-ComponentConnector children
* @param wc
@@ -552,7 +595,7 @@ public class UIConnector extends AbstractSingleComponentContainerConnector
/**
* Return an iterator for current subwindows. This method is meant for
* testing purposes only.
- *
+ *
* @return
*/
public List<WindowConnector> getSubWindows() {
@@ -579,7 +622,7 @@ public class UIConnector extends AbstractSingleComponentContainerConnector
* public API instead of their state object directly. The page state might
* not be an independent state object but can be embedded in UI state.
* </p>
- *
+ *
* @since 7.1
* @return state object of the page
*/
@@ -643,10 +686,10 @@ public class UIConnector extends AbstractSingleComponentContainerConnector
/**
* Tries to scroll the viewport so that the given connector is in view.
- *
+ *
* @param componentConnector
* The connector which should be visible
- *
+ *
*/
public void scrollIntoView(final ComponentConnector componentConnector) {
if (componentConnector == null) {
@@ -740,7 +783,7 @@ public class UIConnector extends AbstractSingleComponentContainerConnector
/**
* Invokes the layout analyzer on the server
- *
+ *
* @since 7.1
*/
public void analyzeLayouts() {
@@ -751,7 +794,7 @@ public class UIConnector extends AbstractSingleComponentContainerConnector
* Sends a request to the server to print details to console that will help
* the developer to locate the corresponding server-side connector in the
* source code.
- *
+ *
* @since 7.1
* @param serverConnector
* the connector to locate
@@ -760,4 +803,195 @@ public class UIConnector extends AbstractSingleComponentContainerConnector
getRpcProxy(DebugWindowServerRpc.class).showServerDebugInfo(
serverConnector);
}
+
+ @OnStateChange("theme")
+ void onThemeChange() {
+ final String oldTheme = activeTheme;
+ final String newTheme = getState().theme;
+ if (SharedUtil.equals(oldTheme, newTheme)) {
+ // This should only happen on the initial load when activeTheme has
+ // been updated in init
+ return;
+ }
+
+ final String oldThemeUrl = getThemeUrl(oldTheme);
+ final String newThemeUrl = getThemeUrl(newTheme);
+ getLogger().info("Changing theme from " + oldTheme + " to " + newTheme);
+ replaceTheme(oldTheme, newTheme, oldThemeUrl, newThemeUrl);
+ }
+
+ /**
+ * Loads the new theme and removes references to the old theme
+ *
+ * @param oldTheme
+ * The name of the old theme
+ * @param newTheme
+ * The name of the new theme
+ * @param oldThemeUrl
+ * The url of the old theme
+ * @param newThemeUrl
+ * The url of the new theme
+ */
+ private void replaceTheme(final String oldTheme, final String newTheme,
+ String oldThemeUrl, final String newThemeUrl) {
+
+ LinkElement tagToReplace = null;
+
+ if (oldTheme != null) {
+ NodeList<Element> linkTags = getHead().getElementsByTagName(
+ LinkElement.TAG);
+ for (int i = 0; i < linkTags.getLength(); i++) {
+ final LinkElement link = LinkElement.as(linkTags.getItem(i));
+ if ("stylesheet".equals(link.getRel())
+ && "text/css".equals(link.getType())
+ && oldThemeUrl.equals(link.getHref())) {
+ tagToReplace = link;
+ break;
+ }
+ }
+
+ if (tagToReplace == null) {
+ getLogger()
+ .warning(
+ "Did not find the link tag for the old theme ("
+ + oldThemeUrl
+ + "), adding a new stylesheet for the new theme ("
+ + newThemeUrl + ")");
+ }
+ }
+
+ if (newTheme != null) {
+ loadTheme(newTheme, newThemeUrl, tagToReplace);
+ } else {
+ if (tagToReplace != null) {
+ tagToReplace.getParentElement().removeChild(tagToReplace);
+ }
+
+ activateTheme(null);
+ }
+
+ }
+
+ /**
+ * Loads the given theme and replaces the given link element with the new
+ * theme link element.
+ *
+ * @param newTheme
+ * The name of the new theme
+ * @param newThemeUrl
+ * The url of the new theme
+ * @param tagToReplace
+ * The link element to replace. If null, then the new link
+ * element is added at the end.
+ */
+ private void loadTheme(final String newTheme, final String newThemeUrl,
+ final LinkElement tagToReplace) {
+ LinkElement newThemeLinkElement = Document.get().createLinkElement();
+ newThemeLinkElement.setRel("stylesheet");
+ newThemeLinkElement.setType("text/css");
+ newThemeLinkElement.setHref(newThemeUrl);
+ ResourceLoader.addOnloadHandler(newThemeLinkElement,
+ new ResourceLoadListener() {
+
+ @Override
+ public void onLoad(ResourceLoadEvent event) {
+ getLogger().info(
+ "Loading of " + newTheme + " from "
+ + newThemeUrl + " completed");
+
+ if (tagToReplace != null) {
+ tagToReplace.getParentElement().removeChild(
+ tagToReplace);
+ }
+ activateTheme(newTheme);
+ }
+
+ @Override
+ public void onError(ResourceLoadEvent event) {
+ getLogger().warning(
+ "Could not load theme from "
+ + getThemeUrl(newTheme));
+ }
+ }, null);
+
+ if (tagToReplace != null) {
+ getHead().insertBefore(newThemeLinkElement, tagToReplace);
+ } else {
+ getHead().appendChild(newThemeLinkElement);
+ }
+ }
+
+ /**
+ * Activates the new theme. Assumes the theme has been loaded and taken into
+ * use in the browser.
+ *
+ * @since 7.3
+ * @param newTheme
+ */
+ private void activateTheme(String newTheme) {
+ if (activeTheme != null) {
+ getWidget().getParent().removeStyleName(activeTheme);
+ }
+
+ activeTheme = newTheme;
+
+ if (newTheme != null) {
+ getWidget().getParent().addStyleName(newTheme);
+ }
+
+ forceStateChangeRecursively(UIConnector.this);
+ getLayoutManager().forceLayout();
+ }
+
+ /**
+ * Force a full recursive recheck of every connector's state variables.
+ *
+ * @see #forceStateChange()
+ *
+ * @since 7.3
+ */
+ protected static void forceStateChangeRecursively(
+ AbstractConnector connector) {
+ connector.forceStateChange();
+
+ for (ServerConnector child : connector.getChildren()) {
+ if (child instanceof AbstractConnector) {
+ forceStateChangeRecursively((AbstractConnector) child);
+ } else {
+ getLogger().warning(
+ "Could not force state change for unknown connector type: "
+ + child.getClass().getName());
+ }
+ }
+
+ }
+
+ /**
+ * Internal helper to get the theme URL for a given theme
+ *
+ * @since
+ * @param theme
+ * the name of the theme
+ * @return The URL the theme can be loaded from
+ */
+ private String getThemeUrl(String theme) {
+ return getConnection().translateVaadinUri(
+ ApplicationConstants.VAADIN_PROTOCOL_PREFIX + "themes/" + theme
+ + "/styles" + ".css");
+ }
+
+ /**
+ * Returns the name of the theme currently in used by the UI
+ *
+ * @since
+ * @return the theme name used by this UI
+ */
+ public String getActiveTheme() {
+ return activeTheme;
+ }
+
+ private static Logger getLogger() {
+ return Logger.getLogger(UIConnector.class.getName());
+ }
+
}
diff --git a/client/src/com/vaadin/client/ui/window/WindowConnector.java b/client/src/com/vaadin/client/ui/window/WindowConnector.java
index 40185099d3..2a2f031144 100644
--- a/client/src/com/vaadin/client/ui/window/WindowConnector.java
+++ b/client/src/com/vaadin/client/ui/window/WindowConnector.java
@@ -19,6 +19,7 @@ import java.util.logging.Logger;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NativeEvent;
+import com.google.gwt.dom.client.Node;
import com.google.gwt.dom.client.Style;
import com.google.gwt.dom.client.Style.Position;
import com.google.gwt.dom.client.Style.Unit;
@@ -58,6 +59,8 @@ public class WindowConnector extends AbstractSingleComponentContainerConnector
SimpleManagedLayout, PostLayoutListener, MayScrollChildren,
WindowMoveHandler {
+ private Node windowClone;
+
private ClickEventHandler clickEventHandler = new ClickEventHandler(this) {
@Override
protected void fireClick(NativeEvent event,
@@ -193,14 +196,16 @@ public class WindowConnector extends AbstractSingleComponentContainerConnector
// We always have 1 child, unless the child is hidden
getWidget().contentPanel.setWidget(getContentWidget());
- // If the window is removed from the UI, add the copy of the contents to
- // the window (in case of an 'out-animation')
- if (getParent() == null) {
+ if (getParent() == null && windowClone != null) {
+ // If the window is removed from the UI, add the copy of the
+ // contents to the window (in case of an 'out-animation')
getWidget().getElement().removeAllChildren();
- getWidget().getElement().appendChild(getWidget().windowClone);
+ getWidget().getElement().appendChild(windowClone);
+
+ // Clean reference
+ windowClone = null;
}
- // Clean reference
- getWidget().windowClone = null;
+
}
@Override
@@ -277,6 +282,16 @@ public class WindowConnector extends AbstractSingleComponentContainerConnector
window.center();
}
window.positionOrSizeUpdated();
+
+ if (getParent() != null) {
+ // Take a copy of the contents, since the server will detach all
+ // children of this window when it's closed, and the window will be
+ // emptied during the following hierarchy update (we need to keep
+ // the contents visible for the duration of a possible
+ // 'out-animation')
+ windowClone = getWidget().getElement().getFirstChild()
+ .cloneNode(true);
+ }
}
@Override
diff --git a/eclipse/Development Mode (vaadin).launch b/eclipse/Development Mode (vaadin).launch
index e8a8ee09c1..8c828eca96 100644
--- a/eclipse/Development Mode (vaadin).launch
+++ b/eclipse/Development Mode (vaadin).launch
@@ -12,21 +12,16 @@
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/vaadin/shared/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/vaadin/client/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/vaadin/uitest/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry path=&quot;3&quot; projectName=&quot;gwt-dev&quot; type=&quot;1&quot;/&gt;&#13;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry path=&quot;3&quot; projectName=&quot;gwt-user&quot; type=&quot;1&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;GWT_TOOLS/lib/apache/tapestry-util-text-4.0.2.jar&quot; path=&quot;3&quot; type=&quot;3&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;GWT_TOOLS/lib/junit/junit-4.8.2.jar&quot; path=&quot;3&quot; type=&quot;3&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;GWT_TOOLS/lib/tomcat/servlet-api-2.5.jar&quot; path=&quot;3&quot; type=&quot;3&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;GWT_TOOLS/lib/javax/validation/validation-api-1.0.0.GA.jar&quot; path=&quot;3&quot; type=&quot;3&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;GWT_TOOLS/lib/javax/validation/validation-api-1.0.0.GA-sources.jar&quot; path=&quot;3&quot; type=&quot;3&quot;/&gt;&#13;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-dev/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-dev/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.apache.ivyde.eclipse.cpcontainer.IVYDE_CONTAINER/?project=vaadin&amp;amp;ivyXmlPath=client%2Fivy.xml&amp;amp;confs=ide&amp;amp;ivySettingsPath=%24%7Bworkspace_loc%3Avaadin%2Fivysettings.xml%7D&amp;amp;loadSettingsOnDemand=false&amp;amp;propertyFiles=&quot; javaProject=&quot;vaadin&quot; path=&quot;3&quot; type=&quot;4&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.apache.ivyde.eclipse.cpcontainer.IVYDE_CONTAINER/?project=vaadin&amp;amp;ivyXmlPath=server%2Fivy.xml&amp;amp;confs=ide&amp;amp;ivySettingsPath=%24%7Bworkspace_loc%3Avaadin%2Fivysettings.xml%7D&amp;amp;loadSettingsOnDemand=false&amp;amp;propertyFiles=&quot; javaProject=&quot;vaadin&quot; path=&quot;3&quot; type=&quot;4&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.apache.ivyde.eclipse.cpcontainer.IVYDE_CONTAINER/?project=vaadin&amp;amp;ivyXmlPath=shared%2Fivy.xml&amp;amp;confs=ide&amp;amp;ivySettingsPath=%24%7Bworkspace_loc%3Avaadin%2Fivysettings.xml%7D&amp;amp;loadSettingsOnDemand=false&amp;amp;propertyFiles=&quot; javaProject=&quot;vaadin&quot; path=&quot;3&quot; type=&quot;4&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.apache.ivyde.eclipse.cpcontainer.IVYDE_CONTAINER/?project=vaadin&amp;amp;ivyXmlPath=client-compiler%2Fivy.xml&amp;amp;confs=ide&amp;amp;ivySettingsPath=%24%7Bworkspace_loc%3Avaadin%2Fivysettings.xml%7D&amp;amp;loadSettingsOnDemand=false&amp;amp;propertyFiles=&quot; javaProject=&quot;vaadin&quot; path=&quot;3&quot; type=&quot;4&quot;/&gt;&#13;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.apache.ivyde.eclipse.cpcontainer.IVYDE_CONTAINER/?project=vaadin&amp;amp;ivyXmlPath=gwt%2Fivy.xml&amp;amp;confs=ide&amp;amp;ivySettingsPath=%24%7Bworkspace_loc%3Avaadin%2Fivysettings.xml%7D&amp;amp;loadSettingsOnDemand=false&amp;amp;propertyFiles=&quot; javaProject=&quot;vaadin&quot; path=&quot;3&quot; type=&quot;4&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.apache.ivyde.eclipse.cpcontainer.IVYDE_CONTAINER/?project=vaadin&amp;amp;ivyXmlPath=uitest%2Fivy.xml&amp;amp;confs=ide&amp;amp;ivySettingsPath=%24%7Bworkspace_loc%3Avaadin%2Fivysettings.xml%7D&amp;amp;loadSettingsOnDemand=false&amp;amp;propertyFiles=&quot; javaProject=&quot;vaadin&quot; path=&quot;3&quot; type=&quot;4&quot;/&gt;&#13;&#10;"/>
</listAttribute>
<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
diff --git a/eclipse/Super Development Mode (vaadin).launch b/eclipse/Super Development Mode (vaadin).launch
new file mode 100644
index 0000000000..147ec2ae13
--- /dev/null
+++ b/eclipse/Super Development Mode (vaadin).launch
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<stringAttribute key="bad_container_name" value="\eclipse"/>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/vaadin"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="4"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
+<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry path=&quot;3&quot; projectName=&quot;vaadin&quot; type=&quot;1&quot;/&gt;&#13;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/vaadin/shared/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/vaadin/client/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/vaadin/uitest/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;GWT_TOOLS/lib/apache/tapestry-util-text-4.0.2.jar&quot; path=&quot;3&quot; type=&quot;3&quot;/&gt;&#13;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;GWT_TOOLS/lib/junit/junit-4.8.2.jar&quot; path=&quot;3&quot; type=&quot;3&quot;/&gt;&#13;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;GWT_TOOLS/lib/tomcat/servlet-api-2.5.jar&quot; path=&quot;3&quot; type=&quot;3&quot;/&gt;&#13;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;GWT_TOOLS/lib/javax/validation/validation-api-1.0.0.GA.jar&quot; path=&quot;3&quot; type=&quot;3&quot;/&gt;&#13;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;GWT_TOOLS/lib/javax/validation/validation-api-1.0.0.GA-sources.jar&quot; path=&quot;3&quot; type=&quot;3&quot;/&gt;&#13;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.apache.ivyde.eclipse.cpcontainer.IVYDE_CONTAINER/?project=vaadin&amp;amp;ivyXmlPath=client%2Fivy.xml&amp;amp;confs=ide&amp;amp;ivySettingsPath=%24%7Bworkspace_loc%3Avaadin%2Fivysettings.xml%7D&amp;amp;loadSettingsOnDemand=false&amp;amp;propertyFiles=&quot; javaProject=&quot;vaadin&quot; path=&quot;3&quot; type=&quot;4&quot;/&gt;&#13;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.apache.ivyde.eclipse.cpcontainer.IVYDE_CONTAINER/?project=vaadin&amp;amp;ivyXmlPath=server%2Fivy.xml&amp;amp;confs=ide&amp;amp;ivySettingsPath=%24%7Bworkspace_loc%3Avaadin%2Fivysettings.xml%7D&amp;amp;loadSettingsOnDemand=false&amp;amp;propertyFiles=&quot; javaProject=&quot;vaadin&quot; path=&quot;3&quot; type=&quot;4&quot;/&gt;&#13;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.apache.ivyde.eclipse.cpcontainer.IVYDE_CONTAINER/?project=vaadin&amp;amp;ivyXmlPath=shared%2Fivy.xml&amp;amp;confs=ide&amp;amp;ivySettingsPath=%24%7Bworkspace_loc%3Avaadin%2Fivysettings.xml%7D&amp;amp;loadSettingsOnDemand=false&amp;amp;propertyFiles=&quot; javaProject=&quot;vaadin&quot; path=&quot;3&quot; type=&quot;4&quot;/&gt;&#13;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.apache.ivyde.eclipse.cpcontainer.IVYDE_CONTAINER/?project=vaadin&amp;amp;ivyXmlPath=client-compiler%2Fivy.xml&amp;amp;confs=ide&amp;amp;ivySettingsPath=%24%7Bworkspace_loc%3Avaadin%2Fivysettings.xml%7D&amp;amp;loadSettingsOnDemand=false&amp;amp;propertyFiles=&quot; javaProject=&quot;vaadin&quot; path=&quot;3&quot; type=&quot;4&quot;/&gt;&#13;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.apache.ivyde.eclipse.cpcontainer.IVYDE_CONTAINER/?project=vaadin&amp;amp;ivyXmlPath=gwt%2Fivy.xml&amp;amp;confs=ide&amp;amp;ivySettingsPath=%24%7Bworkspace_loc%3Avaadin%2Fivysettings.xml%7D&amp;amp;loadSettingsOnDemand=false&amp;amp;propertyFiles=&quot; javaProject=&quot;vaadin&quot; path=&quot;3&quot; type=&quot;4&quot;/&gt;&#13;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.apache.ivyde.eclipse.cpcontainer.IVYDE_CONTAINER/?project=vaadin&amp;amp;ivyXmlPath=uitest%2Fivy.xml&amp;amp;confs=ide&amp;amp;ivySettingsPath=%24%7Bworkspace_loc%3Avaadin%2Fivysettings.xml%7D&amp;amp;loadSettingsOnDemand=false&amp;amp;propertyFiles=&quot; javaProject=&quot;vaadin&quot; path=&quot;3&quot; type=&quot;4&quot;/&gt;&#13;&#10;"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.codeserver.CodeServer"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="com.vaadin.DefaultWidgetSet -bindAddress 0.0.0.0"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="vaadin"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx512M -XX:MaxPermSize=256M"/>
+</launchConfiguration>
diff --git a/gwt-files.xml b/gwt-files.xml
index a40d69806f..4a8486ab55 100644
--- a/gwt-files.xml
+++ b/gwt-files.xml
@@ -1,15 +1,20 @@
<?xml version="1.0"?>
-<project name="GWT files for Vaadin" basedir=".">
+<project name="GWT files for Vaadin" basedir="." xmlns:ivy="antlib:org.apache.ivy.ant">
<include file="common.xml" as="common" />
- <property name="gwt.lib.dir" location="${gwt.basedir}/build/lib" />
+ <ivy:resolve log="download-only" file="${vaadin.basedir}/gwt/ivy.xml" transitive="false" />
+ <ivy:cachepath pathid="gwt-dev.classpath" conf="gwt-dev" />
+ <ivy:cachepath pathid="gwt-user.classpath" conf="gwt-user" />
+ <ivy:cachepath pathid="gwt-elemental.classpath" conf="gwt-elemental" />
+ <ivy:cachepath pathid="gwt-codeserver.classpath" conf="gwt-codeserver" />
+
<property name="gwt.eclipse.basedir" location="${gwt.basedir}/eclipse" />
- <property name="gwt.user.jar" location="${gwt.lib.dir}/gwt-user.jar" />
- <property name="gwt.dev.jar" location="${gwt.lib.dir}/gwt-dev.jar" />
- <property name="gwt.elemental.jar" location="${gwt.lib.dir}/gwt-elemental.jar" />
- <property name="gwt.codeserver.jar" location="${gwt.lib.dir}/gwt-codeserver.jar" />
+ <property name="gwt.user.jar" refid="gwt-user.classpath" />
+ <property name="gwt.dev.jar" refid="gwt-dev.classpath" />
+ <property name="gwt.elemental.jar" refid="gwt-elemental.classpath" />
+ <property name="gwt.codeserver.jar" refid="gwt-codeserver.classpath" />
<available file="${gwt.dev.jar}" property="gwt.dev.jar.found" />
<available file="${gwt.user.jar}" property="gwt.user.jar.found" />
diff --git a/gwt/ivy.xml b/gwt/ivy.xml
new file mode 100644
index 0000000000..52d8acea92
--- /dev/null
+++ b/gwt/ivy.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ivy-module version="2.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd"
+ xmlns:m="http://ant.apache.org/ivy/maven">
+
+ <info organisation="com.vaadin" module="vaadin-gwt"
+ revision="${vaadin.version}" />
+
+ <configurations>
+ <conf name="build" />
+ <conf name="gwt-dev" />
+ <conf name="gwt-user" />
+ <conf name="gwt-codeserver" />
+ <conf name="gwt-elemental" />
+ <conf name="ide" visibility="private" />
+ </configurations>
+ <publications>
+ <artifact type="jar" ext="jar" />
+ <artifact type="source" ext="jar" m:classifier="sources" />
+ <artifact type="javadoc" ext="jar" m:classifier="javadoc" />
+ <artifact type="pom" ext="pom" />
+ </publications>
+ <dependencies>
+ <dependency org="com.vaadin.external.gwt" name="gwt-dev" rev="${gwt.version}" conf="gwt-dev,ide->default" />
+ <dependency org="com.vaadin.external.gwt" name="gwt-user" rev="${gwt.version}" conf="gwt-user,ide->default" />
+ <dependency org="com.vaadin.external.gwt" name="gwt-codeserver" rev="${gwt.version}" conf="gwt-codeserver,ide->default" />
+ <dependency org="com.vaadin.external.gwt" name="gwt-elemental" rev="${gwt.version}" conf="gwt-elemental->default" />
+ </dependencies>
+</ivy-module>
diff --git a/scripts/install-local-maven.sh b/scripts/install-local-maven.sh
index 2883258808..f36b603db9 100755
--- a/scripts/install-local-maven.sh
+++ b/scripts/install-local-maven.sh
@@ -10,31 +10,31 @@ fi
for base in *
do
- if [ ! -d $base ]
+ if [ ! -d "$base" ]
then
continue
fi
- pushd $base
- version=`ls $base-*.pom|sed "s/$base-//"|sed "s/.pom//"`
+ pushd "$base"
+ version=`ls "$base"-*.pom|sed "s/$base-//"|sed "s/.pom//"`
pomTemplate="$base-$version.pom"
if [ -e "$pomTemplate" ]
then
- id=$base-$version
- pomFile=$pomTemplate-modified
- file=$id.jar
- javadocFile=$id-javadoc.jar
- sourcesFile=$id-sources.jar
+ id="$base-$version"
+ pomFile="$pomTemplate-modified"
+ file="$id.jar"
+ javadocFile="$id-javadoc.jar"
+ sourcesFile="$id-sources.jar"
# Install using real version for easy testing
- cat $pomTemplate|sed "s/<version>7.*-SNAPSHOT</<version>$version</g" > $pomFile
+ cat "$pomTemplate"|sed "s/<version>7.*-SNAPSHOT</<version>$version</g" > "$pomFile"
echo "Installing $base $version..."
if [ -e "$javadocFile" ]
then
- mvn org.apache.maven.plugins:maven-install-plugin:2.5.1:install-file -DpomFile=$pomFile -Djavadoc=$javadocFile -Dsources=$sourcesFile -Dfile=$file
+ mvn org.apache.maven.plugins:maven-install-plugin:2.5.1:install-file -DpomFile="$pomFile" -Djavadoc="$javadocFile" -Dsources="$sourcesFile" -Dfile="$file"
else
- mvn org.apache.maven.plugins:maven-install-plugin:2.5.1:install-file -DpomFile=$pomFile -Dfile=$file
+ mvn org.apache.maven.plugins:maven-install-plugin:2.5.1:install-file -DpomFile="$pomFile" -Dfile="$file"
fi
fi
popd
diff --git a/server/src/com/vaadin/server/AbstractClientConnector.java b/server/src/com/vaadin/server/AbstractClientConnector.java
index 92c235167c..bafecdabf4 100644
--- a/server/src/com/vaadin/server/AbstractClientConnector.java
+++ b/server/src/com/vaadin/server/AbstractClientConnector.java
@@ -243,7 +243,7 @@ public abstract class AbstractClientConnector implements ClientConnector,
@Override
public JSONObject encodeState() throws JSONException {
- return LegacyCommunicationManager.encodeState(this, getState());
+ return LegacyCommunicationManager.encodeState(this, getState(false));
}
/**
@@ -292,11 +292,13 @@ public abstract class AbstractClientConnector implements ClientConnector,
Method m = class1.getDeclaredMethod("getState",
(Class[]) null);
Class<?> type = m.getReturnType();
- return type.asSubclass(SharedState.class);
+ if (!m.isSynthetic()) {
+ return type.asSubclass(SharedState.class);
+ }
} catch (NoSuchMethodException nsme) {
- // Try in superclass instead
- class1 = class1.getSuperclass();
}
+ // Try in superclass instead
+ class1 = class1.getSuperclass();
}
throw new NoSuchMethodException(getClass().getCanonicalName()
+ ".getState()");
@@ -664,7 +666,8 @@ public abstract class AbstractClientConnector implements ClientConnector,
* @see #setResource(String, Resource)
*/
protected Resource getResource(String key) {
- return ResourceReference.getResource(getState().resources.get(key));
+ return ResourceReference
+ .getResource(getState(false).resources.get(key));
}
/**
diff --git a/server/src/com/vaadin/server/AbstractErrorMessage.java b/server/src/com/vaadin/server/AbstractErrorMessage.java
index c733cc493e..b56521993a 100644
--- a/server/src/com/vaadin/server/AbstractErrorMessage.java
+++ b/server/src/com/vaadin/server/AbstractErrorMessage.java
@@ -126,7 +126,7 @@ public abstract class AbstractErrorMessage implements ErrorMessage {
StringBuilder sb = new StringBuilder();
for (ErrorMessage cause : getCauses()) {
String childMessage = cause.getFormattedHtmlMessage();
- if (null != childMessage) {
+ if (null != childMessage && !childMessage.isEmpty()) {
sb.append("<div>");
sb.append(childMessage);
sb.append("</div>\n");
diff --git a/server/src/com/vaadin/server/BrowserWindowOpener.java b/server/src/com/vaadin/server/BrowserWindowOpener.java
index df03e76bcd..44679fbfbb 100644
--- a/server/src/com/vaadin/server/BrowserWindowOpener.java
+++ b/server/src/com/vaadin/server/BrowserWindowOpener.java
@@ -147,7 +147,7 @@ public class BrowserWindowOpener extends AbstractExtension {
* @return the window target string
*/
public String getWindowName() {
- return getState().target;
+ return getState(false).target;
}
// Avoid breaking url to multiple lines
@@ -171,7 +171,7 @@ public class BrowserWindowOpener extends AbstractExtension {
* @return
*/
public String getFeatures() {
- return getState().features;
+ return getState(false).features;
}
@Override
@@ -180,6 +180,11 @@ public class BrowserWindowOpener extends AbstractExtension {
}
@Override
+ protected BrowserWindowOpenerState getState(boolean markAsDirty) {
+ return (BrowserWindowOpenerState) super.getState(markAsDirty);
+ }
+
+ @Override
public void attach() {
super.attach();
if (uiProvider != null
@@ -226,7 +231,7 @@ public class BrowserWindowOpener extends AbstractExtension {
* @see #setUriFragment(String)
*/
public String getUriFragment() {
- return getState().uriFragment;
+ return getState(false).uriFragment;
}
/**
@@ -301,7 +306,7 @@ public class BrowserWindowOpener extends AbstractExtension {
if (name == null) {
throw new IllegalArgumentException("Null not allowed");
}
- return getState().parameters.get(name);
+ return getState(false).parameters.get(name);
}
}
diff --git a/server/src/com/vaadin/server/FontAwesome.java b/server/src/com/vaadin/server/FontAwesome.java
index 71a2249dca..c99f42fac1 100644
--- a/server/src/com/vaadin/server/FontAwesome.java
+++ b/server/src/com/vaadin/server/FontAwesome.java
@@ -25,6 +25,9 @@ package com.vaadin.server;
* these icons, and all of them, so you might want to consider making a custom
* icon font - either to get other icons, or to minimize the size of the font.
* </p>
+ * <p>
+ * The Font Awesome version currently included is 4.0.3.
+ * </p>
*
* @since 7.2
* @author Vaadin Ltd
diff --git a/server/src/com/vaadin/server/JsonCodec.java b/server/src/com/vaadin/server/JsonCodec.java
index 08345714fd..93074abcdb 100644
--- a/server/src/com/vaadin/server/JsonCodec.java
+++ b/server/src/com/vaadin/server/JsonCodec.java
@@ -27,7 +27,6 @@ import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
-import java.lang.reflect.WildcardType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -435,21 +434,6 @@ public class JsonCodec implements Serializable {
return new UidlValue(decodedValue);
}
- private static boolean transportTypesCompatible(
- String encodedTransportType, String transportType) {
- if (encodedTransportType == null) {
- return false;
- }
- if (encodedTransportType.equals(transportType)) {
- return true;
- }
- if (encodedTransportType.equals(JsonConstants.VTYPE_NULL)) {
- return true;
- }
-
- return false;
- }
-
private static Map<Object, Object> decodeMap(Type targetType,
boolean restrictToInternalTypes, Object jsonMap,
ConnectorTracker connectorTracker) throws JSONException {
@@ -588,7 +572,8 @@ public class JsonCodec implements Serializable {
private static Object[] decodeObjectArray(Type targetType,
JSONArray jsonArray, ConnectorTracker connectorTracker)
throws JSONException {
- List list = decodeList(List.class, true, jsonArray, connectorTracker);
+ List<Object> list = decodeList(List.class, true, jsonArray,
+ connectorTracker);
return list.toArray(new Object[list.size()]);
}
@@ -644,80 +629,59 @@ public class JsonCodec implements Serializable {
Type valueType, ConnectorTracker connectorTracker)
throws JSONException {
- if (valueType == null) {
- throw new IllegalArgumentException("type must be defined");
- }
-
- if (valueType instanceof WildcardType) {
- throw new IllegalStateException(
- "Can not serialize type with wildcard: " + valueType);
- }
-
if (null == value) {
return ENCODE_RESULT_NULL;
}
- if (value instanceof String[]) {
- String[] array = (String[]) value;
- JSONArray jsonArray = new JSONArray();
- for (int i = 0; i < array.length; ++i) {
- jsonArray.put(array[i]);
- }
- return new EncodeResult(jsonArray);
- } else if (value instanceof String) {
- return new EncodeResult(value);
- } else if (value instanceof Boolean) {
- return new EncodeResult(value);
- } else if (value instanceof Number) {
- return new EncodeResult(value);
- } else if (value instanceof Character) {
- // Character is not a Number
- return new EncodeResult(value);
+ // Storing a single reference and only returning the EncodeResult at the
+ // end the method is much shorter in bytecode which allows inlining
+ Object toReturn;
+
+ if (value instanceof String || value instanceof Boolean
+ || value instanceof Number || value instanceof Character
+ || value instanceof JSONArray || value instanceof JSONObject) {
+ // all JSON compatible types are returned as is.
+ toReturn = value;
+ } else if (value instanceof String[]) {
+ toReturn = toJsonArray((String[]) value);
} else if (value instanceof Collection) {
- Collection<?> collection = (Collection<?>) value;
- JSONArray jsonArray = encodeCollection(valueType, collection,
- connectorTracker);
- return new EncodeResult(jsonArray);
- } else if (valueType instanceof Class<?>
- && ((Class<?>) valueType).isArray()) {
- JSONArray jsonArray = encodeArrayContents(
- ((Class<?>) valueType).getComponentType(), value,
- connectorTracker);
- return new EncodeResult(jsonArray);
- } else if (valueType instanceof GenericArrayType) {
- Type componentType = ((GenericArrayType) valueType)
- .getGenericComponentType();
- JSONArray jsonArray = encodeArrayContents(componentType, value,
+ toReturn = encodeCollection(valueType, (Collection<?>) value,
connectorTracker);
- return new EncodeResult(jsonArray);
} else if (value instanceof Map) {
- Object jsonMap = encodeMap(valueType, (Map<?, ?>) value,
- connectorTracker);
- return new EncodeResult(jsonMap);
+ toReturn = encodeMap(valueType, (Map<?, ?>) value, connectorTracker);
} else if (value instanceof Connector) {
- Connector connector = (Connector) value;
if (value instanceof Component
&& !(LegacyCommunicationManager
.isComponentVisibleToClient((Component) value))) {
+ // an encoded null is cached, return it directly.
return ENCODE_RESULT_NULL;
}
- return new EncodeResult(connector.getConnectorId());
+ // Connectors are simply serialized as ID.
+ toReturn = ((Connector) value).getConnectorId();
} else if (value instanceof Enum) {
- return encodeEnum((Enum<?>) value, connectorTracker);
- } else if (value instanceof JSONArray || value instanceof JSONObject) {
- return new EncodeResult(value);
+ toReturn = ((Enum<?>) value).name();
} else if (customSerializers.containsKey(value.getClass())) {
- JSONSerializer serializer = customSerializers.get(value.getClass());
- return new EncodeResult(serializer.serialize(value,
- connectorTracker));
+ toReturn = serializeJson(value, connectorTracker);
+ } else if (valueType instanceof GenericArrayType) {
+ toReturn = encodeArrayContents(
+ ((GenericArrayType) valueType).getGenericComponentType(),
+ value, connectorTracker);
} else if (valueType instanceof Class<?>) {
- // Any object that we do not know how to encode we encode by looping
- // through fields
- return encodeObject(value, (Class<?>) valueType,
- (JSONObject) diffState, connectorTracker);
+ if (((Class<?>) valueType).isArray()) {
+ toReturn = encodeArrayContents(
+ ((Class<?>) valueType).getComponentType(), value,
+ connectorTracker);
+ } else {
+ // encodeObject returns an EncodeResult with a diff, thus it
+ // needs to return it directly rather than assigning it to
+ // toReturn.
+ return encodeObject(value, (Class<?>) valueType,
+ (JSONObject) diffState, connectorTracker);
+ }
} else {
- throw new JSONException("Can not encode " + valueType);
+ throw new JSONException("Can not encode type " + valueType);
}
+ return new EncodeResult(toReturn);
}
public static Collection<BeanProperty> getProperties(Class<?> type)
@@ -737,6 +701,9 @@ public class JsonCodec implements Serializable {
return properties;
}
+ /*
+ * Loops through the fields of value and encodes them.
+ */
private static EncodeResult encodeObject(Object value, Class<?> valueType,
JSONObject referenceValue, ConnectorTracker connectorTracker)
throws JSONException {
@@ -812,11 +779,6 @@ public class JsonCodec implements Serializable {
}
}
- private static EncodeResult encodeEnum(Enum<?> e,
- ConnectorTracker connectorTracker) throws JSONException {
- return new EncodeResult(e.name());
- }
-
private static JSONArray encodeArrayContents(Type componentType,
Object array, ConnectorTracker connectorTracker)
throws JSONException {
@@ -830,7 +792,7 @@ public class JsonCodec implements Serializable {
}
private static JSONArray encodeCollection(Type targetType,
- Collection collection, ConnectorTracker connectorTracker)
+ Collection<?> collection, ConnectorTracker connectorTracker)
throws JSONException {
JSONArray jsonArray = new JSONArray();
for (Object o : collection) {
@@ -898,6 +860,9 @@ public class JsonCodec implements Serializable {
return new JSONArray(Arrays.asList(keys, values));
}
+ /*
+ * Encodes a connector map. Invisible connectors are skipped.
+ */
private static JSONObject encodeConnectorMap(Type valueType, Map<?, ?> map,
ConnectorTracker connectorTracker) throws JSONException {
JSONObject jsonMap = new JSONObject();
@@ -929,21 +894,27 @@ public class JsonCodec implements Serializable {
return jsonMap;
}
- /**
- * Gets the transport type for the given class. Returns null if no transport
- * type can be found.
- *
- * @param valueType
- * The type that should be transported
- * @return
- * @throws JSONException
+ /*
+ * These methods looks good to inline, but are on a cold path of the
+ * otherwise hot encode method, which needed to be shorted to allow inlining
+ * of the hot part.
*/
private static String getInternalTransportType(Type valueType) {
return typeToTransportType.get(getClassForType(valueType));
}
- private static String getCustomTransportType(Class<?> targetType) {
- return targetType.getName();
+ private static Object serializeJson(Object value,
+ ConnectorTracker connectorTracker) {
+ JSONSerializer serializer = customSerializers.get(value.getClass());
+ return serializer.serialize(value, connectorTracker);
+ }
+
+ private static JSONArray toJsonArray(String[] array) {
+ JSONArray jsonArray = new JSONArray();
+ for (int i = 0; i < array.length; ++i) {
+ jsonArray.put(array[i]);
+ }
+ return jsonArray;
}
}
diff --git a/server/src/com/vaadin/server/VaadinService.java b/server/src/com/vaadin/server/VaadinService.java
index 08bc6f5c79..e8cdcd7055 100644
--- a/server/src/com/vaadin/server/VaadinService.java
+++ b/server/src/com/vaadin/server/VaadinService.java
@@ -59,6 +59,7 @@ import com.vaadin.server.communication.HeartbeatHandler;
import com.vaadin.server.communication.PublishedFileHandler;
import com.vaadin.server.communication.SessionRequestHandler;
import com.vaadin.server.communication.UidlRequestHandler;
+import com.vaadin.shared.ApplicationConstants;
import com.vaadin.shared.JsonConstants;
import com.vaadin.shared.ui.ui.UIConstants;
import com.vaadin.ui.UI;
@@ -1590,6 +1591,7 @@ public abstract class VaadinService implements Serializable {
json.put("resources", new JSONObject());
json.put("locales", new JSONObject());
json.put("meta", meta);
+ json.put(ApplicationConstants.SERVER_SYNC_ID, -1);
returnString = json.toString();
} catch (JSONException e) {
getLogger().log(Level.WARNING,
diff --git a/server/src/com/vaadin/server/VaadinServlet.java b/server/src/com/vaadin/server/VaadinServlet.java
index 81c3f374ea..12e7c28cd8 100644
--- a/server/src/com/vaadin/server/VaadinServlet.java
+++ b/server/src/com/vaadin/server/VaadinServlet.java
@@ -547,42 +547,6 @@ public class VaadinServlet extends HttpServlet implements Constants {
return DEFAULT_THEME_NAME;
}
- private void handleServiceSecurityException(VaadinServletRequest request,
- VaadinServletResponse response) throws IOException,
- ServletException {
-
- try {
- /*
- * We might have a UI, but we don't want to leak any information in
- * this case so just use the info provided in the request.
- */
- SystemMessages ci = getService().getSystemMessages(
- request.getLocale(), request);
- if (ServletPortletHelper.isUIDLRequest(request)) {
- // send uidl redirect
- getService().writeStringResponse(
- response,
- JsonConstants.JSON_CONTENT_TYPE,
- VaadinService.createCriticalNotificationJSON(
- ci.getCommunicationErrorCaption(),
- ci.getCommunicationErrorMessage(),
- INVALID_SECURITY_KEY_MSG,
- ci.getCommunicationErrorURL()));
- } else if (ServletPortletHelper.isHeartbeatRequest(request)) {
- response.sendError(HttpServletResponse.SC_FORBIDDEN,
- "Forbidden");
- } else {
- // 'plain' http req - e.g. browser reload;
- // just go ahead redirect the browser
- response.sendRedirect(ci.getCommunicationErrorURL());
- }
- } catch (SystemMessageException ee) {
- throw new ServletException(ee);
- }
-
- log("Invalid security key received from " + request.getRemoteHost());
- }
-
/**
* Check if this is a request for a static resource and, if it is, serve the
* resource to the client.
diff --git a/server/src/com/vaadin/server/communication/ClientRpcWriter.java b/server/src/com/vaadin/server/communication/ClientRpcWriter.java
index 1090fdbab9..181bfbb882 100644
--- a/server/src/com/vaadin/server/communication/ClientRpcWriter.java
+++ b/server/src/com/vaadin/server/communication/ClientRpcWriter.java
@@ -81,9 +81,9 @@ public class ClientRpcWriter implements Serializable {
// + parameterType.getName());
// }
// }
- EncodeResult encodeResult = JsonCodec.encode(
- invocation.getParameters()[i], referenceParameter,
- parameterType, ui.getConnectorTracker());
+ EncodeResult encodeResult = JsonCodec.encode(invocation.getParameters()[i],
+ referenceParameter, parameterType,
+ ui.getConnectorTracker());
paramJson.put(encodeResult.getEncodedValue());
}
invocationJson.put(paramJson);
diff --git a/server/src/com/vaadin/ui/AbstractColorPicker.java b/server/src/com/vaadin/ui/AbstractColorPicker.java
index db4239f8a6..acf3b2c042 100644
--- a/server/src/com/vaadin/ui/AbstractColorPicker.java
+++ b/server/src/com/vaadin/ui/AbstractColorPicker.java
@@ -189,7 +189,7 @@ public abstract class AbstractColorPicker extends AbstractComponent implements
* currently selected color, e.g. #ffffff) if no other caption is available.
*/
public boolean isDefaultCaptionEnabled() {
- return getState().showDefaultCaption;
+ return getState(false).showDefaultCaption;
}
/**
@@ -358,6 +358,11 @@ public abstract class AbstractColorPicker extends AbstractComponent implements
return (ColorPickerState) super.getState();
}
+ @Override
+ protected ColorPickerState getState(boolean markAsDirty) {
+ return (ColorPickerState) super.getState(markAsDirty);
+ }
+
/**
* Sets the default styles of the component
*
@@ -462,6 +467,6 @@ public abstract class AbstractColorPicker extends AbstractComponent implements
* <code>false</code> otherwise
*/
public boolean isHtmlContentAllowed() {
- return getState().htmlContentAllowed;
+ return getState(false).htmlContentAllowed;
}
}
diff --git a/server/src/com/vaadin/ui/AbstractComponent.java b/server/src/com/vaadin/ui/AbstractComponent.java
index b6289e0b7d..9dbd9a093d 100644
--- a/server/src/com/vaadin/ui/AbstractComponent.java
+++ b/server/src/com/vaadin/ui/AbstractComponent.java
@@ -151,8 +151,8 @@ public abstract class AbstractComponent extends AbstractClientConnector
@Override
public String getStyleName() {
String s = "";
- if (ComponentStateUtil.hasStyles(getState())) {
- for (final Iterator<String> it = getState().styles.iterator(); it
+ if (ComponentStateUtil.hasStyles(getState(false))) {
+ for (final Iterator<String> it = getState(false).styles.iterator(); it
.hasNext();) {
s += it.next();
if (it.hasNext()) {
@@ -191,7 +191,7 @@ public abstract class AbstractComponent extends AbstractClientConnector
@Override
public String getPrimaryStyleName() {
- return getState().primaryStyleName;
+ return getState(false).primaryStyleName;
}
@Override
diff --git a/server/src/com/vaadin/ui/AbstractEmbedded.java b/server/src/com/vaadin/ui/AbstractEmbedded.java
index 8c574fd59e..66752aa5d7 100644
--- a/server/src/com/vaadin/ui/AbstractEmbedded.java
+++ b/server/src/com/vaadin/ui/AbstractEmbedded.java
@@ -34,6 +34,11 @@ public abstract class AbstractEmbedded extends AbstractComponent {
return (AbstractEmbeddedState) super.getState();
}
+ @Override
+ protected AbstractEmbeddedState getState(boolean markAsDirty) {
+ return (AbstractEmbeddedState) super.getState(markAsDirty);
+ }
+
/**
* Sets the object source resource. The dimensions are assumed if possible.
* The type is guessed from resource.
@@ -73,7 +78,7 @@ public abstract class AbstractEmbedded extends AbstractComponent {
* @returns Alternate text
*/
public String getAlternateText() {
- return getState().alternateText;
+ return getState(false).alternateText;
}
}
diff --git a/server/src/com/vaadin/ui/AbstractMedia.java b/server/src/com/vaadin/ui/AbstractMedia.java
index a841aa672e..0bd8c3ea77 100644
--- a/server/src/com/vaadin/ui/AbstractMedia.java
+++ b/server/src/com/vaadin/ui/AbstractMedia.java
@@ -47,6 +47,11 @@ public abstract class AbstractMedia extends AbstractComponent {
return (AbstractMediaState) super.getState();
}
+ @Override
+ protected AbstractMediaState getState(boolean markAsDirty) {
+ return (AbstractMediaState) super.getState(markAsDirty);
+ }
+
/**
* Sets a single media file as the source of the media component.
*
@@ -141,7 +146,7 @@ public abstract class AbstractMedia extends AbstractComponent {
*/
public List<Resource> getSources() {
ArrayList<Resource> sources = new ArrayList<Resource>();
- for (URLReference ref : getState().sources) {
+ for (URLReference ref : getState(false).sources) {
sources.add(((ResourceReference) ref).getResource());
}
return sources;
@@ -160,7 +165,7 @@ public abstract class AbstractMedia extends AbstractComponent {
* @return true if the browser is to show native media controls.
*/
public boolean isShowControls() {
- return getState().showControls;
+ return getState(false).showControls;
}
/**
@@ -183,7 +188,7 @@ public abstract class AbstractMedia extends AbstractComponent {
* HTML5.
*/
public String getAltText() {
- return getState().altText;
+ return getState(false).altText;
}
/**
@@ -201,7 +206,7 @@ public abstract class AbstractMedia extends AbstractComponent {
* be rendered as HTML.
*/
public boolean isHtmlContentAllowed() {
- return getState().htmlContentAllowed;
+ return getState(false).htmlContentAllowed;
}
/**
@@ -218,7 +223,7 @@ public abstract class AbstractMedia extends AbstractComponent {
* @return true if the media is set to automatically start playback.
*/
public boolean isAutoplay() {
- return getState().autoplay;
+ return getState(false).autoplay;
}
/**
@@ -234,7 +239,7 @@ public abstract class AbstractMedia extends AbstractComponent {
* @return true if the audio is muted.
*/
public boolean isMuted() {
- return getState().muted;
+ return getState(false).muted;
}
/**
diff --git a/server/src/com/vaadin/ui/AbstractOrderedLayout.java b/server/src/com/vaadin/ui/AbstractOrderedLayout.java
index 039c87333e..27880db75f 100644
--- a/server/src/com/vaadin/ui/AbstractOrderedLayout.java
+++ b/server/src/com/vaadin/ui/AbstractOrderedLayout.java
@@ -69,6 +69,11 @@ public abstract class AbstractOrderedLayout extends AbstractLayout implements
return (AbstractOrderedLayoutState) super.getState();
}
+ @Override
+ protected AbstractOrderedLayoutState getState(boolean markAsDirty) {
+ return (AbstractOrderedLayoutState) super.getState(markAsDirty);
+ }
+
/**
* Add a component into this container. The component is added to the right
* or under the previous component.
@@ -285,7 +290,7 @@ public abstract class AbstractOrderedLayout extends AbstractLayout implements
*/
@Override
public boolean isSpacing() {
- return getState().spacing;
+ return getState(false).spacing;
}
/**
@@ -335,7 +340,7 @@ public abstract class AbstractOrderedLayout extends AbstractLayout implements
* @return expand ratio of given component, 0.0f by default.
*/
public float getExpandRatio(Component component) {
- ChildComponentData childData = getState().childData.get(component);
+ ChildComponentData childData = getState(false).childData.get(component);
if (childData == null) {
throw new IllegalArgumentException(
"The given component is not a child of this layout");
@@ -413,7 +418,7 @@ public abstract class AbstractOrderedLayout extends AbstractLayout implements
*/
@Override
public MarginInfo getMargin() {
- return new MarginInfo(getState().marginsBitmask);
+ return new MarginInfo(getState(false).marginsBitmask);
}
/*
diff --git a/server/src/com/vaadin/ui/AbstractSplitPanel.java b/server/src/com/vaadin/ui/AbstractSplitPanel.java
index 3a1b7ca35a..1c69ebf87e 100644
--- a/server/src/com/vaadin/ui/AbstractSplitPanel.java
+++ b/server/src/com/vaadin/ui/AbstractSplitPanel.java
@@ -186,7 +186,7 @@ public abstract class AbstractSplitPanel extends AbstractComponentContainer {
* @return the first component of this split panel
*/
public Component getFirstComponent() {
- return (Component) getState().firstChild;
+ return (Component) getState(false).firstChild;
}
/**
@@ -196,7 +196,7 @@ public abstract class AbstractSplitPanel extends AbstractComponentContainer {
* @return the second component of this split panel
*/
public Component getSecondComponent() {
- return (Component) getState().secondChild;
+ return (Component) getState(false).secondChild;
}
/**
@@ -534,7 +534,12 @@ public abstract class AbstractSplitPanel extends AbstractComponentContainer {
return (AbstractSplitPanelState) super.getState();
}
+ @Override
+ protected AbstractSplitPanelState getState(boolean markAsDirty) {
+ return (AbstractSplitPanelState) super.getState(markAsDirty);
+ }
+
private SplitterState getSplitterState() {
- return getState().splitterState;
+ return getState(false).splitterState;
}
}
diff --git a/server/src/com/vaadin/ui/AbstractTextField.java b/server/src/com/vaadin/ui/AbstractTextField.java
index 25b34ae19f..e0318ddf2b 100644
--- a/server/src/com/vaadin/ui/AbstractTextField.java
+++ b/server/src/com/vaadin/ui/AbstractTextField.java
@@ -96,6 +96,11 @@ public abstract class AbstractTextField extends AbstractField<String> implements
}
@Override
+ protected AbstractTextFieldState getState(boolean markAsDirty) {
+ return (AbstractTextFieldState) super.getState(markAsDirty);
+ }
+
+ @Override
public void beforeClientResponse(boolean initial) {
super.beforeClientResponse(initial);
@@ -311,7 +316,7 @@ public abstract class AbstractTextField extends AbstractField<String> implements
* @return the maxLength
*/
public int getMaxLength() {
- return getState().maxLength;
+ return getState(false).maxLength;
}
/**
@@ -333,7 +338,7 @@ public abstract class AbstractTextField extends AbstractField<String> implements
* @return the number of columns in the editor.
*/
public int getColumns() {
- return getState().columns;
+ return getState(false).columns;
}
/**
@@ -358,7 +363,7 @@ public abstract class AbstractTextField extends AbstractField<String> implements
* @return the current input prompt, or null if not enabled
*/
public String getInputPrompt() {
- return getState().inputPrompt;
+ return getState(false).inputPrompt;
}
/**
diff --git a/server/src/com/vaadin/ui/Button.java b/server/src/com/vaadin/ui/Button.java
index 5a5d03a3ee..58b6f9de81 100644
--- a/server/src/com/vaadin/ui/Button.java
+++ b/server/src/com/vaadin/ui/Button.java
@@ -556,7 +556,7 @@ public class Button extends AbstractComponent implements
* @return true if the button is disabled when clicked, false otherwise
*/
public boolean isDisableOnClick() {
- return getState().disableOnClick;
+ return getState(false).disableOnClick;
}
/**
@@ -582,7 +582,7 @@ public class Button extends AbstractComponent implements
*/
@Override
public int getTabIndex() {
- return getState().tabIndex;
+ return getState(false).tabIndex;
}
/*
@@ -606,6 +606,11 @@ public class Button extends AbstractComponent implements
return (ButtonState) super.getState();
}
+ @Override
+ protected ButtonState getState(boolean markAsDirty) {
+ return (ButtonState) super.getState(markAsDirty);
+ }
+
/**
* Sets the component's icon and alt text.
*
@@ -628,7 +633,7 @@ public class Button extends AbstractComponent implements
* @return String with the alt text
*/
public String getIconAlternateText() {
- return getState().iconAltText;
+ return getState(false).iconAltText;
}
public void setIconAlternateText(String iconAltText) {
@@ -658,7 +663,7 @@ public class Button extends AbstractComponent implements
* <code>false</code> otherwise
*/
public boolean isHtmlContentAllowed() {
- return getState().htmlContentAllowed;
+ return getState(false).htmlContentAllowed;
}
}
diff --git a/server/src/com/vaadin/ui/CustomLayout.java b/server/src/com/vaadin/ui/CustomLayout.java
index fd56ed9219..7f1aa1ce46 100644
--- a/server/src/com/vaadin/ui/CustomLayout.java
+++ b/server/src/com/vaadin/ui/CustomLayout.java
@@ -124,6 +124,11 @@ public class CustomLayout extends AbstractLayout implements LegacyComponent {
return (CustomLayoutState) super.getState();
}
+ @Override
+ protected CustomLayoutState getState(boolean markAsDirty) {
+ return (CustomLayoutState) super.getState(markAsDirty);
+ }
+
/**
* Adds the component into this container to given location. If the location
* is already populated, the old component is removed.
@@ -251,12 +256,12 @@ public class CustomLayout extends AbstractLayout implements LegacyComponent {
/** Get the name of the template */
public String getTemplateName() {
- return getState().templateName;
+ return getState(false).templateName;
}
/** Get the contents of the template */
public String getTemplateContents() {
- return getState().templateContents;
+ return getState(false).templateContents;
}
/**
@@ -292,7 +297,7 @@ public class CustomLayout extends AbstractLayout implements LegacyComponent {
public void paintContent(PaintTarget target) throws PaintException {
// Workaround to make the CommunicationManager read the template file
// and send it to the client
- String templateName = getState().templateName;
+ String templateName = getState(false).templateName;
if (templateName != null && templateName.length() != 0) {
Set<Object> usedResources = ((JsonPaintTarget) target)
.getUsedResources();
diff --git a/server/src/com/vaadin/ui/DateField.java b/server/src/com/vaadin/ui/DateField.java
index 7ab7732079..e98b1e1b31 100644
--- a/server/src/com/vaadin/ui/DateField.java
+++ b/server/src/com/vaadin/ui/DateField.java
@@ -152,7 +152,8 @@ public class DateField extends AbstractField<Date> implements
private String dateOutOfRangeMessage = "Date is out of allowed range";
private DateRangeValidator currentRangeValidator;
- {
+
+ static {
variableNameForResolution.put(Resolution.SECOND, "sec");
variableNameForResolution.put(Resolution.MINUTE, "min");
variableNameForResolution.put(Resolution.HOUR, "hour");
diff --git a/server/src/com/vaadin/ui/DragAndDropWrapper.java b/server/src/com/vaadin/ui/DragAndDropWrapper.java
index cb94a774a5..3d3356b338 100644
--- a/server/src/com/vaadin/ui/DragAndDropWrapper.java
+++ b/server/src/com/vaadin/ui/DragAndDropWrapper.java
@@ -187,6 +187,10 @@ public class DragAndDropWrapper extends CustomComponent implements DropTarget,
private Set<String> sentIds = new HashSet<String>();
+ private DragAndDropWrapper() {
+ super();
+ }
+
/**
* Wraps given component in a {@link DragAndDropWrapper}.
*
@@ -194,7 +198,8 @@ public class DragAndDropWrapper extends CustomComponent implements DropTarget,
* the component to be wrapped
*/
public DragAndDropWrapper(Component root) {
- super(root);
+ this();
+ setCompositionRoot(root);
}
/**
diff --git a/server/src/com/vaadin/ui/Flash.java b/server/src/com/vaadin/ui/Flash.java
index 791202f4a9..bbbd4e3285 100644
--- a/server/src/com/vaadin/ui/Flash.java
+++ b/server/src/com/vaadin/ui/Flash.java
@@ -67,6 +67,11 @@ public class Flash extends AbstractEmbedded {
return (FlashState) super.getState();
}
+ @Override
+ protected FlashState getState(boolean markAsDirty) {
+ return (FlashState) super.getState(markAsDirty);
+ }
+
/**
* This attribute specifies the base path used to resolve relative URIs
* specified by the classid, data, and archive attributes. When absent, its
@@ -156,7 +161,7 @@ public class Flash extends AbstractEmbedded {
* @return the Value of parameter or null if not found.
*/
public String getParameter(String name) {
- return getState().embedParams != null ? getState().embedParams
+ return getState(false).embedParams != null ? getState(false).embedParams
.get(name) : null;
}
diff --git a/server/src/com/vaadin/ui/Form.java b/server/src/com/vaadin/ui/Form.java
index 5653a83cee..391ee45536 100644
--- a/server/src/com/vaadin/ui/Form.java
+++ b/server/src/com/vaadin/ui/Form.java
@@ -198,6 +198,11 @@ public class Form extends AbstractField<Object> implements Item.Editor,
return (FormState) super.getState();
}
+ @Override
+ protected FormState getState(boolean markAsDirty) {
+ return (FormState) super.getState(markAsDirty);
+ }
+
/* Documented in interface */
@Override
public void paintContent(PaintTarget target) throws PaintException {
@@ -775,7 +780,7 @@ public class Form extends AbstractField<Object> implements Item.Editor,
* @return the Layout of the form.
*/
public Layout getLayout() {
- return (Layout) getState().layout;
+ return (Layout) getState(false).layout;
}
/**
@@ -1054,8 +1059,9 @@ public class Form extends AbstractField<Object> implements Item.Editor,
* @return the Field.
*/
private Field<?> getFirstFocusableField() {
- if (getItemPropertyIds() != null) {
- for (Object id : getItemPropertyIds()) {
+ Collection<?> itemPropertyIds = getItemPropertyIds();
+ if (itemPropertyIds != null && itemPropertyIds.size() > 0) {
+ for (Object id : itemPropertyIds) {
if (id != null) {
Field<?> field = getField(id);
if (field.isEnabled() && !field.isReadOnly()) {
@@ -1065,7 +1071,7 @@ public class Form extends AbstractField<Object> implements Item.Editor,
}
// fallback: first field if none of the fields is enabled and
// writable
- Object id = getItemPropertyIds().iterator().next();
+ Object id = itemPropertyIds.iterator().next();
if (id != null) {
return getField(id);
}
@@ -1214,7 +1220,7 @@ public class Form extends AbstractField<Object> implements Item.Editor,
* is used
*/
public Layout getFooter() {
- return (Layout) getState().footer;
+ return (Layout) getState(false).footer;
}
/**
diff --git a/server/src/com/vaadin/ui/GridLayout.java b/server/src/com/vaadin/ui/GridLayout.java
index 00e50aafc4..0c097abc83 100644
--- a/server/src/com/vaadin/ui/GridLayout.java
+++ b/server/src/com/vaadin/ui/GridLayout.java
@@ -1,12 +1,12 @@
/*
* Copyright 2000-2014 Vaadin Ltd.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -141,6 +141,11 @@ public class GridLayout extends AbstractLayout implements
return (GridLayoutState) super.getState();
}
+ @Override
+ protected GridLayoutState getState(boolean markAsDirty) {
+ return (GridLayoutState) super.getState(markAsDirty);
+ }
+
/**
* <p>
* Adds a component to the grid in the specified area. The area is defined
@@ -497,7 +502,6 @@ public class GridLayout extends AbstractLayout implements
if (columnExpandRatioArray.length > 0) {
columnExpandRatioArray[0] -= realColExpandRatioSum - 1000;
}
-
target.addAttribute("colExpand", columnExpandRatioArray);
target.addAttribute("rowExpand", rowExpandRatioArray);
@@ -520,7 +524,7 @@ public class GridLayout extends AbstractLayout implements
*/
@Override
public Alignment getComponentAlignment(Component childComponent) {
- ChildComponentData childComponentData = getState().childData
+ ChildComponentData childComponentData = getState(false).childData
.get(childComponent);
if (childComponentData == null) {
throw new IllegalArgumentException(
@@ -781,7 +785,7 @@ public class GridLayout extends AbstractLayout implements
* @return the number of columns in the grid.
*/
public int getColumns() {
- return getState().columns;
+ return getState(false).columns;
}
/**
@@ -825,7 +829,7 @@ public class GridLayout extends AbstractLayout implements
* @return the number of rows in the grid.
*/
public int getRows() {
- return getState().rows;
+ return getState(false).rows;
}
/**
@@ -952,7 +956,7 @@ public class GridLayout extends AbstractLayout implements
*/
@Override
public boolean isSpacing() {
- return getState().spacing;
+ return getState(false).spacing;
}
/**
@@ -1068,6 +1072,7 @@ public class GridLayout extends AbstractLayout implements
*/
public void setColumnExpandRatio(int columnIndex, float ratio) {
columnExpandRatio.put(columnIndex, ratio);
+ getState().explicitColRatios.add(columnIndex);
markAsDirty();
}
@@ -1106,6 +1111,7 @@ public class GridLayout extends AbstractLayout implements
*/
public void setRowExpandRatio(int rowIndex, float ratio) {
rowExpandRatio.put(rowIndex, ratio);
+ getState().explicitRowRatios.add(rowIndex);
markAsDirty();
}
@@ -1133,7 +1139,7 @@ public class GridLayout extends AbstractLayout implements
* @return Component in given cell or null if empty
*/
public Component getComponent(int x, int y) {
- for (Entry<Connector, ChildComponentData> entry : getState().childData
+ for (Entry<Connector, ChildComponentData> entry : getState(false).childData
.entrySet()) {
ChildComponentData childData = entry.getValue();
if (childData.column1 <= x && x <= childData.column2
@@ -1154,7 +1160,7 @@ public class GridLayout extends AbstractLayout implements
* the grid
*/
public Area getComponentArea(Component component) {
- ChildComponentData childComponentData = getState().childData
+ ChildComponentData childComponentData = getState(false).childData
.get(component);
if (childComponentData == null) {
return null;
@@ -1225,7 +1231,7 @@ public class GridLayout extends AbstractLayout implements
*/
@Override
public MarginInfo getMargin() {
- return new MarginInfo(getState().marginsBitmask);
+ return new MarginInfo(getState(false).marginsBitmask);
}
/*
diff --git a/server/src/com/vaadin/ui/Label.java b/server/src/com/vaadin/ui/Label.java
index b4685adcea..c73840e6e9 100644
--- a/server/src/com/vaadin/ui/Label.java
+++ b/server/src/com/vaadin/ui/Label.java
@@ -155,6 +155,11 @@ public class Label extends AbstractComponent implements Property<String>,
return (LabelState) super.getState();
}
+ @Override
+ protected LabelState getState(boolean markAsDirty) {
+ return (LabelState) super.getState(markAsDirty);
+ }
+
/**
* Gets the value of the label.
* <p>
@@ -168,7 +173,7 @@ public class Label extends AbstractComponent implements Property<String>,
public String getValue() {
if (getPropertyDataSource() == null) {
// Use internal value if we are running without a data source
- return getState().text;
+ return getState(false).text;
}
return getDataSourceValue();
}
@@ -196,7 +201,7 @@ public class Label extends AbstractComponent implements Property<String>,
public void setValue(String newStringValue) {
if (getPropertyDataSource() == null) {
- LabelState state = (LabelState) getState(false);
+ LabelState state = getState(false);
String oldTextValue = state.text;
if (!SharedUtil.equals(oldTextValue, newStringValue)) {
getState().text = newStringValue;
@@ -281,7 +286,7 @@ public class Label extends AbstractComponent implements Property<String>,
* @see ContentMode
*/
public ContentMode getContentMode() {
- return getState().contentMode;
+ return getState(false).contentMode;
}
/**
@@ -412,8 +417,7 @@ public class Label extends AbstractComponent implements Property<String>,
private void updateValueFromDataSource() {
// Update the internal value from the data source
String newConvertedValue = getDataSourceValue();
- if (!SharedUtil.equals(newConvertedValue,
- ((LabelState) getState(false)).text)) {
+ if (!SharedUtil.equals(newConvertedValue, getState(false).text)) {
getState().text = newConvertedValue;
fireValueChange();
}
diff --git a/server/src/com/vaadin/ui/MenuBar.java b/server/src/com/vaadin/ui/MenuBar.java
index 17a2f8e391..6b6555c0a2 100644
--- a/server/src/com/vaadin/ui/MenuBar.java
+++ b/server/src/com/vaadin/ui/MenuBar.java
@@ -57,6 +57,11 @@ public class MenuBar extends AbstractComponent implements LegacyComponent,
return (MenuBarState) super.getState();
}
+ @Override
+ protected MenuBarState getState(boolean markAsDirty) {
+ return (MenuBarState) super.getState(markAsDirty);
+ }
+
/** Paint (serialise) the component for the client. */
@Override
public void paintContent(PaintTarget target) throws PaintException {
@@ -396,7 +401,7 @@ public class MenuBar extends AbstractComponent implements LegacyComponent,
@Override
public int getTabIndex() {
- return getState().tabIndex;
+ return getState(false).tabIndex;
}
/*
diff --git a/server/src/com/vaadin/ui/Panel.java b/server/src/com/vaadin/ui/Panel.java
index 34ff6ec112..9b1d8fd5fa 100644
--- a/server/src/com/vaadin/ui/Panel.java
+++ b/server/src/com/vaadin/ui/Panel.java
@@ -171,7 +171,7 @@ public class Panel extends AbstractSingleComponentContainer implements
*/
@Override
public int getScrollLeft() {
- return getState().scrollLeft;
+ return getState(false).scrollLeft;
}
/*
@@ -181,7 +181,7 @@ public class Panel extends AbstractSingleComponentContainer implements
*/
@Override
public int getScrollTop() {
- return getState().scrollTop;
+ return getState(false).scrollTop;
}
/*
@@ -309,7 +309,7 @@ public class Panel extends AbstractSingleComponentContainer implements
*/
@Override
public int getTabIndex() {
- return getState().tabIndex;
+ return getState(false).tabIndex;
}
/**
@@ -334,4 +334,9 @@ public class Panel extends AbstractSingleComponentContainer implements
return (PanelState) super.getState();
}
+ @Override
+ protected PanelState getState(boolean markAsDirty) {
+ return (PanelState) super.getState(markAsDirty);
+ }
+
}
diff --git a/server/src/com/vaadin/ui/PopupDateField.java b/server/src/com/vaadin/ui/PopupDateField.java
index 61aac16a97..f07ac84160 100644
--- a/server/src/com/vaadin/ui/PopupDateField.java
+++ b/server/src/com/vaadin/ui/PopupDateField.java
@@ -93,6 +93,11 @@ public class PopupDateField extends DateField {
return (PopupDateFieldState) super.getState();
}
+ @Override
+ protected PopupDateFieldState getState(boolean markAsDirty) {
+ return (PopupDateFieldState) super.getState(markAsDirty);
+ }
+
/**
* Checks whether the text field is enabled (default) or not.
*
@@ -101,7 +106,7 @@ public class PopupDateField extends DateField {
* @return <b>true</b> if the text field is enabled, <b>false</b> otherwise.
*/
public boolean isTextFieldEnabled() {
- return getState().textFieldEnabled;
+ return getState(false).textFieldEnabled;
}
/**
@@ -136,6 +141,6 @@ public class PopupDateField extends DateField {
* @return String with the description
*/
public String getAssistiveText() {
- return getState().descriptionForAssistiveDevices;
+ return getState(false).descriptionForAssistiveDevices;
}
}
diff --git a/server/src/com/vaadin/ui/PopupView.java b/server/src/com/vaadin/ui/PopupView.java
index b347576b22..90c60edc6e 100644
--- a/server/src/com/vaadin/ui/PopupView.java
+++ b/server/src/com/vaadin/ui/PopupView.java
@@ -61,6 +61,11 @@ public class PopupView extends AbstractComponent implements HasComponents {
/* Constructors */
+ private PopupView() {
+ registerRpc(rpc);
+ setHideOnMouseOut(true);
+ }
+
/**
* A simple way to create a PopupPanel. Note that the minimal representation
* may not be dynamically updated, in order to achieve this create your own
@@ -94,9 +99,7 @@ public class PopupView extends AbstractComponent implements HasComponents {
* the PopupView.Content that contains the information for this
*/
public PopupView(PopupView.Content content) {
- super();
- registerRpc(rpc);
- setHideOnMouseOut(true);
+ this();
setContent(content);
}
@@ -185,7 +188,7 @@ public class PopupView extends AbstractComponent implements HasComponents {
* @return true if the popup is hidden on mouse out, false otherwise
*/
public boolean isHideOnMouseOut() {
- return getState().hideOnMouseOut;
+ return getState(false).hideOnMouseOut;
}
/**
@@ -234,6 +237,11 @@ public class PopupView extends AbstractComponent implements HasComponents {
return (PopupViewState) super.getState();
}
+ @Override
+ protected PopupViewState getState(boolean markAsDirty) {
+ return (PopupViewState) super.getState(markAsDirty);
+ }
+
/**
* Used to deliver customized content-packages to the PopupView. These are
* dynamically loaded when they are redrawn. The user must take care that
diff --git a/server/src/com/vaadin/ui/Slider.java b/server/src/com/vaadin/ui/Slider.java
index e108c74ba2..ff6c955e47 100644
--- a/server/src/com/vaadin/ui/Slider.java
+++ b/server/src/com/vaadin/ui/Slider.java
@@ -144,13 +144,18 @@ public class Slider extends AbstractField<Double> {
return (SliderState) super.getState();
}
+ @Override
+ public SliderState getState(boolean markAsDirty) {
+ return (SliderState) super.getState(markAsDirty);
+ }
+
/**
* Gets the maximum slider value
*
* @return the largest value the slider can have
*/
public double getMax() {
- return getState().maxValue;
+ return getState(false).maxValue;
}
/**
@@ -173,7 +178,7 @@ public class Slider extends AbstractField<Double> {
* @return the smallest value the slider can have
*/
public double getMin() {
- return getState().minValue;
+ return getState(false).minValue;
}
/**
@@ -197,7 +202,7 @@ public class Slider extends AbstractField<Double> {
* {@link SliderOrientation#VERTICAL}
*/
public SliderOrientation getOrientation() {
- return getState().orientation;
+ return getState(false).orientation;
}
/**
@@ -219,7 +224,7 @@ public class Slider extends AbstractField<Double> {
* @return resolution
*/
public int getResolution() {
- return getState().resolution;
+ return getState(false).resolution;
}
/**
diff --git a/server/src/com/vaadin/ui/TextArea.java b/server/src/com/vaadin/ui/TextArea.java
index 56c97f58eb..e38be8ad3c 100644
--- a/server/src/com/vaadin/ui/TextArea.java
+++ b/server/src/com/vaadin/ui/TextArea.java
@@ -85,6 +85,11 @@ public class TextArea extends AbstractTextField {
return (TextAreaState) super.getState();
}
+ @Override
+ protected TextAreaState getState(boolean markAsDirty) {
+ return (TextAreaState) super.getState(markAsDirty);
+ }
+
/**
* Sets the number of rows in the text area.
*
@@ -104,7 +109,7 @@ public class TextArea extends AbstractTextField {
* @return number of explicitly set rows.
*/
public int getRows() {
- return getState().rows;
+ return getState(false).rows;
}
/**
@@ -125,7 +130,7 @@ public class TextArea extends AbstractTextField {
* <code>false</code> if not.
*/
public boolean isWordwrap() {
- return getState().wordwrap;
+ return getState(false).wordwrap;
}
}
diff --git a/server/src/com/vaadin/ui/UI.java b/server/src/com/vaadin/ui/UI.java
index 562b30f81d..4bde8a95b3 100644
--- a/server/src/com/vaadin/ui/UI.java
+++ b/server/src/com/vaadin/ui/UI.java
@@ -549,8 +549,6 @@ public abstract class UI extends AbstractSingleComponentContainer implements
private boolean resizeLazy = false;
- private String theme;
-
private Navigator navigator;
private PushConnection pushConnection = null;
@@ -633,7 +631,7 @@ public abstract class UI extends AbstractSingleComponentContainer implements
this.embedId = embedId;
// Actual theme - used for finding CustomLayout templates
- theme = request.getParameter("theme");
+ getState(false).theme = request.getParameter("theme");
getPage().init(request);
@@ -1135,12 +1133,31 @@ public abstract class UI extends AbstractSingleComponentContainer implements
}
/**
- * Gets the theme that was used when the UI was initialized.
+ * Gets the theme currently in use by this UI
*
* @return the theme name
*/
public String getTheme() {
- return theme;
+ return getState(false).theme;
+ }
+
+ /**
+ * Sets the theme currently in use by this UI
+ * <p>
+ * Calling this method will remove the old theme (CSS file) from the
+ * application and add the new theme.
+ * <p>
+ * Note that this method is NOT SAFE to call in a portal environment or
+ * other environment where there are multiple UIs on the same page. The old
+ * CSS file will be removed even if there are other UIs on the page which
+ * are still using it.
+ *
+ * @since
+ * @param theme
+ * The new theme name
+ */
+ public void setTheme(String theme) {
+ getState().theme = theme;
}
/**
@@ -1581,7 +1598,7 @@ public abstract class UI extends AbstractSingleComponentContainer implements
* @return the label of the container
*/
public String getOverlayContainerLabel() {
- return getState().overlayContainerLabel;
+ return getState(false).overlayContainerLabel;
}
/**
diff --git a/server/src/com/vaadin/ui/Window.java b/server/src/com/vaadin/ui/Window.java
index 149fcd536f..35583c6052 100644
--- a/server/src/com/vaadin/ui/Window.java
+++ b/server/src/com/vaadin/ui/Window.java
@@ -36,9 +36,9 @@ import com.vaadin.server.PaintTarget;
import com.vaadin.shared.Connector;
import com.vaadin.shared.MouseEventDetails;
import com.vaadin.shared.ui.window.WindowMode;
+import com.vaadin.shared.ui.window.WindowRole;
import com.vaadin.shared.ui.window.WindowServerRpc;
import com.vaadin.shared.ui.window.WindowState;
-import com.vaadin.shared.ui.window.WindowRole;
import com.vaadin.util.ReflectTools;
/**
@@ -254,7 +254,7 @@ public class Window extends Panel implements FocusNotifier, BlurNotifier,
* @since 4.0.0
*/
public int getPositionX() {
- return getState().positionX;
+ return getState(false).positionX;
}
/**
@@ -283,7 +283,7 @@ public class Window extends Panel implements FocusNotifier, BlurNotifier,
* @since 4.0.0
*/
public int getPositionY() {
- return getState().positionY;
+ return getState(false).positionY;
}
/**
@@ -661,7 +661,7 @@ public class Window extends Panel implements FocusNotifier, BlurNotifier,
* @return true if this window is modal.
*/
public boolean isModal() {
- return getState().modal;
+ return getState(false).modal;
}
/**
@@ -679,7 +679,7 @@ public class Window extends Panel implements FocusNotifier, BlurNotifier,
* @return true if window is resizable by the end-user, otherwise false.
*/
public boolean isResizable() {
- return getState().resizable;
+ return getState(false).resizable;
}
/**
@@ -688,7 +688,7 @@ public class Window extends Panel implements FocusNotifier, BlurNotifier,
* sizes are recalculated immediately.
*/
public boolean isResizeLazy() {
- return getState().resizeLazy;
+ return getState(false).resizeLazy;
}
/**
@@ -764,7 +764,7 @@ public class Window extends Panel implements FocusNotifier, BlurNotifier,
* true if the window can be dragged by the user
*/
public boolean isDraggable() {
- return getState().draggable;
+ return getState(false).draggable;
}
/**
@@ -1034,7 +1034,7 @@ public class Window extends Panel implements FocusNotifier, BlurNotifier,
* @return array of previously set components
*/
public Component[] getAssistiveDescription() {
- Connector[] contentDescription = getState().contentDescription;
+ Connector[] contentDescription = getState(false).contentDescription;
if (contentDescription == null) {
return null;
}
@@ -1068,7 +1068,7 @@ public class Window extends Panel implements FocusNotifier, BlurNotifier,
* @return The accessibility prefix
*/
public String getAssistivePrefix() {
- return getState().assistivePrefix;
+ return getState(false).assistivePrefix;
}
/**
@@ -1093,7 +1093,7 @@ public class Window extends Panel implements FocusNotifier, BlurNotifier,
* @return The accessibility postfix
*/
public String getAssistivePostfix() {
- return getState().assistivePostfix;
+ return getState(false).assistivePostfix;
}
/**
@@ -1124,7 +1124,7 @@ public class Window extends Panel implements FocusNotifier, BlurNotifier,
* @return WAI-ARIA role set for the window
*/
public WindowRole getAssistiveRole() {
- return getState().role;
+ return getState(false).role;
}
/**
@@ -1152,7 +1152,7 @@ public class Window extends Panel implements FocusNotifier, BlurNotifier,
* focus can leave the window
*/
public boolean isTabStopEnabled() {
- return getState().assistiveTabStop;
+ return getState(false).assistiveTabStop;
}
/**
@@ -1193,7 +1193,7 @@ public class Window extends Panel implements FocusNotifier, BlurNotifier,
* @return the top message
*/
public String getTabStopTopAssistiveText() {
- return getState().assistiveTabStopTopText;
+ return getState(false).assistiveTabStopTopText;
}
/**
@@ -1204,6 +1204,6 @@ public class Window extends Panel implements FocusNotifier, BlurNotifier,
* @return the bottom message
*/
public String getTabStopBottomAssistiveText() {
- return getState().assistiveTabStopBottomText;
+ return getState(false).assistiveTabStopBottomText;
}
}
diff --git a/server/src/com/vaadin/ui/components/colorpicker/ColorPickerGradient.java b/server/src/com/vaadin/ui/components/colorpicker/ColorPickerGradient.java
index 6147fcdd96..81b178e4f0 100644
--- a/server/src/com/vaadin/ui/components/colorpicker/ColorPickerGradient.java
+++ b/server/src/com/vaadin/ui/components/colorpicker/ColorPickerGradient.java
@@ -56,7 +56,7 @@ public class ColorPickerGradient extends AbstractComponent implements
};
/** The converter. */
- private final Coordinates2Color converter;
+ private Coordinates2Color converter;
/** The foreground color. */
private Color color;
@@ -67,6 +67,14 @@ public class ColorPickerGradient extends AbstractComponent implements
/** The y-coordinate. */
private int y = 0;
+ private ColorPickerGradient() {
+ registerRpc(rpc);
+ // width and height must be set here instead of in theme, otherwise
+ // coordinate calculations fail
+ getState().width = "220px";
+ getState().height = "220px";
+ }
+
/**
* Instantiates a new color picker gradient.
*
@@ -76,12 +84,8 @@ public class ColorPickerGradient extends AbstractComponent implements
* the converter
*/
public ColorPickerGradient(String id, Coordinates2Color converter) {
- registerRpc(rpc);
+ this();
addStyleName(id);
- // width and height must be set here instead of in theme, otherwise
- // coordinate calculations fail
- getState().width = "220px";
- getState().height = "220px";
this.converter = converter;
}
diff --git a/server/src/com/vaadin/ui/components/colorpicker/ColorPickerPopup.java b/server/src/com/vaadin/ui/components/colorpicker/ColorPickerPopup.java
index e7b412f7eb..b9a8c001ce 100644
--- a/server/src/com/vaadin/ui/components/colorpicker/ColorPickerPopup.java
+++ b/server/src/com/vaadin/ui/components/colorpicker/ColorPickerPopup.java
@@ -143,14 +143,7 @@ public class ColorPickerPopup extends Window implements ClickListener,
*/
private boolean updatingColors = false;
- /**
- * Instantiates a new color picker popup.
- */
- public ColorPickerPopup(Color initialColor) {
- super();
-
- selectedColor = initialColor;
-
+ private ColorPickerPopup() {
// Set the layout
layout = new VerticalLayout();
layout.setSpacing(false);
@@ -162,15 +155,21 @@ public class ColorPickerPopup extends Window implements ClickListener,
setStyleName(STYLENAME);
setResizable(false);
setImmediate(true);
+ // Create the history
+ history = new ColorPickerHistory();
+ history.addColorChangeListener(this);
+ }
+ /**
+ * Instantiates a new color picker popup.
+ */
+ public ColorPickerPopup(Color initialColor) {
+ this();
+ selectedColor = initialColor;
initContents();
}
private void initContents() {
- // Create the history
- history = new ColorPickerHistory();
- history.addColorChangeListener(this);
-
// Create the preview on the rgb tab
rgbPreview = new ColorPickerPreview(selectedColor);
rgbPreview.setWidth("240px");
diff --git a/server/src/com/vaadin/ui/components/colorpicker/ColorPickerPreview.java b/server/src/com/vaadin/ui/components/colorpicker/ColorPickerPreview.java
index ae00b267ce..21a3630de2 100644
--- a/server/src/com/vaadin/ui/components/colorpicker/ColorPickerPreview.java
+++ b/server/src/com/vaadin/ui/components/colorpicker/ColorPickerPreview.java
@@ -56,24 +56,23 @@ public class ColorPickerPreview extends CssLayout implements ColorSelector,
/** The old value. */
private String oldValue;
- /**
- * Instantiates a new color picker preview.
- */
- public ColorPickerPreview(Color color) {
+ private ColorPickerPreview() {
setStyleName("v-colorpicker-preview");
setImmediate(true);
-
- this.color = color;
-
field = new TextField();
field.setImmediate(true);
field.setSizeFull();
field.setStyleName("v-colorpicker-preview-textfield");
field.setData(this);
field.addValueChangeListener(this);
-
addComponent(field);
+ }
+ /**
+ * Instantiates a new color picker preview.
+ */
+ public ColorPickerPreview(Color color) {
+ this();
setColor(color);
}
diff --git a/server/src/com/vaadin/ui/themes/ValoTheme.java b/server/src/com/vaadin/ui/themes/ValoTheme.java
new file mode 100644
index 0000000000..51e2e283f2
--- /dev/null
+++ b/server/src/com/vaadin/ui/themes/ValoTheme.java
@@ -0,0 +1,809 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.ui.themes;
+
+import com.vaadin.ui.Notification.Type;
+import com.vaadin.ui.Table.ColumnHeaderMode;
+
+/**
+ * <p>
+ * Additional style names which can be used with the Valo theme.
+ * </p>
+ *
+ * <p>
+ * These styles are only available if the Valo theme (or any of it's variants)
+ * is built with the <code>$valo-include-common-stylenames</code> Sass variable
+ * set to <code>true</code>.
+ * </p>
+ *
+ * <p>
+ * Most of these additional style names can be included individually into your
+ * custom theme using the component specific Sass mixins, in which case you can
+ * also define the style names yourself. See the Valo theme Sass API
+ * documentation for additional information.
+ * </p>
+ *
+ * TODO link to Sass API documentation
+ *
+ * @since 7.3.0
+ * @author Vaadin Ltd
+ */
+public class ValoTheme {
+
+ public static final String THEME_NAME = "valo";
+
+ /***************************************************************************
+ *
+ * Notification styles
+ *
+ **************************************************************************/
+
+ /**
+ * Styles the notification to look like {@link Type#TRAY_NOTIFICATION},
+ * without setting the position and delay. Can be combined with any other
+ * Notification style.
+ */
+ public static final String NOTIFICATION_TRAY = "tray";
+
+ /**
+ * Styles the notification to look like {@link Type#WARNING_MESSAGE},
+ * without setting the position and delay. Can be combined with any other
+ * Notification style.
+ */
+ public static final String NOTIFICATION_WARNING = "warning";
+
+ /**
+ * Styles the notification to look like {@link Type#ERROR_MESSAGE}, without
+ * setting the position and delay. Can be combined with any other
+ * Notification style.
+ */
+ public static final String NOTIFICATION_ERROR = "error";
+
+ /**
+ * Styles the notification to look like a system notification. Can be
+ * combined with any other Notification style.
+ */
+ public static final String NOTIFICATION_SYSTEM = "system";
+
+ /**
+ * Styles the notification to span the entire width of the viewport. Can be
+ * combined with any other Notification style.
+ */
+ public static final String NOTIFICATION_BAR = "bar";
+
+ /**
+ * Smaller padding and font size for the notification. Can be combined with
+ * any other Notification style.
+ */
+ public static final String NOTIFICATION_SMALL = "small";
+
+ /**
+ * Adds a close button to the notification to imply that the user must click
+ * on the notification to dismiss it. Use in combination with an infinite
+ * delay (<code>-1</code>). Can be combined with any other Notification
+ * style.
+ */
+ public static final String NOTIFICATION_CLOSABLE = "closable";
+
+ /**
+ * Success notification style. Adds a border around the notification and an
+ * icon next to the title. Can be combined with any other Label style.
+ */
+ public static final String NOTIFICATION_SUCCESS = "success";
+
+ /**
+ * Failure notification style. Adds a border around the notification and an
+ * icon next to the title. Can be combined with any other Label style.
+ */
+ public static final String NOTIFICATION_FAILURE = "failure";
+
+ /***************************************************************************
+ *
+ * Label styles
+ *
+ **************************************************************************/
+
+ /**
+ * Header style for main application headings. Can be combined with any
+ * other Label style.
+ */
+ public static final String LABEL_H1 = "h1";
+
+ /**
+ * Header style for different sections in the application. Can be combined
+ * with any other Label style.
+ */
+ public static final String LABEL_H2 = "h2";
+
+ /**
+ * Header style for different sub-sections in the application. Can be
+ * combined with any other Label style.
+ */
+ public static final String LABEL_H3 = "h3";
+
+ /**
+ * Header style for different sub-sections in the application. Can be
+ * combined with any other Label style.
+ */
+ public static final String LABEL_H4 = "h4";
+
+ /**
+ * A utility style that can be combined with the {@link #LABEL_H1},
+ * {@link #LABEL_H2}, {@link #LABEL_H3} and {@link #LABEL_H4} styles to
+ * remove the default margins from the header.
+ */
+ public static final String LABEL_NO_MARGIN = "no-margin";
+
+ /**
+ * Small font size. Suitable for additional/supplementary UI text. Can be
+ * combined with any other Label style.
+ */
+ public static final String LABEL_SMALL = "small";
+
+ /**
+ * Large font size. Suitable for important/prominent UI text. Can be
+ * combined with any other Label style.
+ */
+ public static final String LABEL_LARGE = "large";
+
+ /**
+ * Lighter font weight. Suitable for additional/supplementary UI text. Can
+ * be combined with any other Label style.
+ */
+ public static final String LABEL_LIGHT = "light";
+
+ /**
+ * Bolder font weight. Suitable for important/prominent UI text. Can be
+ * combined with any other Label style.
+ */
+ public static final String LABEL_BOLD = "bold";
+
+ /**
+ * Success badge style. Adds a border around the label and an icon next to
+ * the text. Suitable for UI notifications that need to in the direct
+ * context of some component. Can be combined with any other Label style.
+ */
+ public static final String LABEL_SUCCESS = "success";
+
+ /**
+ * Failure badge style. Adds a border around the label and an icon next to
+ * the text. Suitable for UI notifications that need to in the direct
+ * context of some component. Can be combined with any other Label style.
+ */
+ public static final String LABEL_FAILURE = "failure";
+
+ /***************************************************************************
+ *
+ * Button styles
+ *
+ **************************************************************************/
+
+ /**
+ * Primary action button (e.g. the button that should get activated when the
+ * user presses the <code>enter</code> key in a form). Use sparingly, only
+ * one default button per view should be visible. Can be combined with any
+ * other Button style.
+ */
+ public static final String BUTTON_PRIMARY = "primary";
+
+ /**
+ * A prominent button that can be used instead of the
+ * {@link #BUTTON_PRIMARY} for primary actions when the action is considered
+ * <b>safe</b> for the user (i.e. does not cause any data loss or any other
+ * irreversible action). Can be combined with any other Button style.
+ */
+ public static final String BUTTON_FRIENDLY = "friendly";
+
+ /**
+ * A prominent button that can be used when the action is considered
+ * <b>unsafe</b> for the user (i.e. it causes data loss or some other
+ * irreversible action). Can be combined with any other Button style.
+ */
+ public static final String BUTTON_DANGER = "danger";
+
+ /**
+ * Borderless button. Can be combined with any other Button style.
+ */
+ public static final String BUTTON_BORDERLESS = "borderless";
+
+ /**
+ * Borderless button with a colored caption text. Can be combined with any
+ * other Button style.
+ */
+ public static final String BUTTON_BORDERLESS_COLORED = "borderless-colored";
+
+ /**
+ * "Quiet" button, which looks like {@link #BUTTON_BORDERLESS} until you
+ * hover over it with the mouse. Can be combined with any other Button
+ * style.
+ */
+ public static final String BUTTON_QUIET = "quiet";
+
+ /**
+ * Makes the button look like the Link component. Can be combined with any
+ * other Button style.
+ */
+ public static final String BUTTON_LINK = "link";
+
+ /**
+ * Small size button. Can be combined with any other Button style.
+ */
+ public static final String BUTTON_SMALL = "small";
+
+ /**
+ * Large size button. Can be combined with any other Button style.
+ */
+ public static final String BUTTON_LARGE = "large";
+
+ /**
+ * Align the icon to the right side of the button caption. Can be combined
+ * with any other Button style.
+ */
+ public static final String BUTTON_ICON_ALIGN_RIGHT = "icon-align-right";
+
+ /**
+ * Stack the icon on top of the button caption. Can be combined with any
+ * other Button style.
+ */
+ public static final String BUTTON_ICON_ALIGN_TOP = "icon-align-top";
+
+ /**
+ * Only show the icon in the button, and size the button to a square shape.
+ */
+ public static final String BUTTON_ICON_ONLY = "icon-only";
+
+ /***************************************************************************
+ *
+ * Link styles
+ *
+ **************************************************************************/
+
+ /**
+ * Small size link.
+ */
+ public static final String LINK_SMALL = "small";
+
+ /**
+ * Large size link.
+ */
+ public static final String LINK_LARGE = "large";
+
+ /***************************************************************************
+ *
+ * TextField styles
+ *
+ **************************************************************************/
+
+ /**
+ * Small size text field. Can be combined with any other TextField style.
+ */
+ public static final String TEXTFIELD_SMALL = "small";
+
+ /**
+ * Large size text field. Can be combined with any other TextField style.
+ */
+ public static final String TEXTFIELD_LARGE = "large";
+
+ /**
+ * Removes the border and background from the text field. Can be combined
+ * with any other TextField style.
+ */
+ public static final String TEXTFIELD_BORDERLESS = "borderless";
+
+ /**
+ * Align the text inside the field to the right. Can be combined with any
+ * other TextField style.
+ */
+ public static final String TEXTFIELD_ALIGN_RIGHT = "align-right";
+
+ /**
+ * Align the text inside the field to center. Can be combined with any other
+ * TextField style.
+ */
+ public static final String TEXTFIELD_ALIGN_CENTER = "align-center";
+
+ /**
+ * Move the default caption icon inside the text field. Can be combined with
+ * any other TextField style.
+ */
+ public static final String TEXTFIELD_INLINE_ICON = "inline-icon";
+
+ /***************************************************************************
+ *
+ * TextArea styles
+ *
+ **************************************************************************/
+
+ /**
+ * Small size text area. Can be combined with any other TextArea style.
+ */
+ public static final String TEXTAREA_SMALL = "small";
+
+ /**
+ * Large size text area. Can be combined with any other TextArea style.
+ */
+ public static final String TEXTAREA_LARGE = "large";
+
+ /**
+ * Removes the border and background from the text area. Can be combined
+ * with any other TextArea style.
+ */
+ public static final String TEXTAREA_BORDERLESS = "borderless";
+
+ /**
+ * Align the text inside the area to the right. Can be combined with any
+ * other TextArea style.
+ */
+ public static final String TEXTAREA_ALIGN_RIGHT = "align-right";
+
+ /**
+ * Align the text inside the area to center. Can be combined with any other
+ * TextArea style.
+ */
+ public static final String TEXTAREA_ALIGN_CENTER = "align-center";
+
+ /***************************************************************************
+ *
+ * DateField styles
+ *
+ **************************************************************************/
+
+ /**
+ * Small size date field. Can be combined with any other DateField style.
+ */
+ public static final String DATEFIELD_SMALL = "small";
+
+ /**
+ * Large size date field. Can be combined with any other DateField style.
+ */
+ public static final String DATEFIELD_LARGE = "large";
+
+ /**
+ * Removes the border and background from the date field. Can be combined
+ * with any other DateField style.
+ */
+ public static final String DATEFIELD_BORDERLESS = "borderless";
+
+ /**
+ * Align the text inside the field to the right. Can be combined with any
+ * other DateField style.
+ */
+ public static final String DATEFIELD_ALIGN_RIGHT = "align-right";
+
+ /**
+ * Align the text inside the field to center. Can be combined with any other
+ * DateField style.
+ */
+ public static final String DATEFIELD_ALIGN_CENTER = "align-center";
+
+ /***************************************************************************
+ *
+ * ComboBox styles
+ *
+ **************************************************************************/
+
+ /**
+ * Small size combo box. Can be combined with any other ComboBox style.
+ */
+ public static final String COMBOBOX_SMALL = "small";
+
+ /**
+ * Large size combo box. Can be combined with any other ComboBox style.
+ */
+ public static final String COMBOBOX_LARGE = "large";
+
+ /**
+ * Removes the border and background from the combo box. Can be combined
+ * with any other ComboBox style.
+ */
+ public static final String COMBOBOX_BORDERLESS = "borderless";
+
+ /**
+ * Align the text inside the combo box to the right. Can be combined with
+ * any other TextField style.
+ */
+ public static final String COMBOBOX_ALIGN_RIGHT = "align-right";
+
+ /**
+ * Align the text inside the combo box to center. Can be combined with any
+ * other TextField style.
+ */
+ public static final String COMBOBOX_ALIGN_CENTER = "align-center";
+
+ /***************************************************************************
+ *
+ * CheckBox styles
+ *
+ **************************************************************************/
+
+ /**
+ * Small size check box. Can be combined with any other CheckBox style.
+ */
+ public static final String CHECKBOX_SMALL = "small";
+
+ /**
+ * Large size check box. Can be combined with any other CheckBox style.
+ */
+ public static final String CHECKBOX_LARGE = "large";
+
+ /***************************************************************************
+ *
+ * OptionGroup styles
+ *
+ **************************************************************************/
+
+ /**
+ * Small size option group. Can be combined with any other OptionGroup
+ * style.
+ */
+ public static final String OPTIONGROUP_SMALL = "small";
+
+ /**
+ * Large size option group. Can be combined with any other OptionGroup
+ * style.
+ */
+ public static final String OPTIONGROUP_LARGE = "large";
+
+ /***************************************************************************
+ *
+ * Slider styles
+ *
+ **************************************************************************/
+
+ /**
+ * Hide the indicator bar from the slider. Can be combined with any other
+ * Slider style.
+ */
+ public static final String SLIDER_NO_INDICATOR = "no-indicator";
+
+ /***************************************************************************
+ *
+ * ProgressBar styles
+ *
+ **************************************************************************/
+
+ /**
+ * Make the progress bar indicator appear as a dot which progresses over the
+ * progress bar track (instead of a growing bar).
+ */
+ public static final String PROBRESSBAR_POINT = "point";
+
+ /***************************************************************************
+ *
+ * MenuBar styles
+ *
+ **************************************************************************/
+
+ /**
+ * Small size menu bar. Can be combined with any other MenuBar style.
+ */
+ public static final String MENUBAR_SMALL = "small";
+
+ /**
+ * Borderless menu bar. Can be combined with any other MenuBar style.
+ */
+ public static final String MENUBAR_BORDERLESS = "borderless";
+
+ /***************************************************************************
+ *
+ * Table and TreeTable styles
+ *
+ **************************************************************************/
+
+ /**
+ * Remove the alternating row colors. Can be combined with any other
+ * Table/TreeTable style.
+ */
+ public static final String TABLE_NO_STRIPES = "no-stripes";
+
+ /**
+ * See {@link #TABLE_NO_STRIPES}
+ */
+ public static final String TREETABLE_NO_STRIPES = TABLE_NO_STRIPES;
+
+ /**
+ * Remove the vertical divider lines between the table columns. Can be
+ * combined with any other Table/TreeTable style.
+ */
+ public static final String TABLE_NO_VERTICAL_LINES = "no-vertical-lines";
+
+ /**
+ * See {@link #TABLE_NO_VERTICAL_LINES}
+ */
+ public static final String TREETABLE_NO_VERTICAL_LINES = TABLE_NO_VERTICAL_LINES;
+
+ /**
+ * Remove the horizontal divider lines between the table rows. Can be
+ * combined with any other Table/TreeTable style.
+ */
+ public static final String TABLE_NO_HORIZONTAL_LINES = "no-horizontal-lines";
+
+ /**
+ * See {@link #TABLE_NO_HORIZONTAL_LINES}
+ */
+ public static final String TREETABLE_NO_HORIZONTAL_LINES = TABLE_NO_HORIZONTAL_LINES;
+
+ /**
+ * Hide the table column headers (effectively the same as
+ * {@link ColumnHeaderMode#HIDDEN}). Can be combined with any other
+ * Table/TreeTable style.
+ */
+ public static final String TABLE_NO_HEADER = "no-header";
+
+ /**
+ * See {@link #TABLE_NO_HEADER}
+ */
+ public static final String TREETABLE_NO_HEADER = TABLE_NO_HEADER;
+
+ /**
+ * Remove the outer border of the table. Can be combined with any other
+ * Table/TreeTable style.
+ */
+ public static final String TABLE_BORDERLESS = "borderless";
+
+ /**
+ * See {@link #TABLE_BORDERLESS}
+ */
+ public static final String TREETABLE_BORDERLESS = TABLE_BORDERLESS;
+
+ /**
+ * Reduce the white space inside the table cells. Can be combined with any
+ * other Table/TreeTable style.
+ */
+ public static final String TABLE_COMPACT = "compact";
+
+ /**
+ * See {@link #TABLE_COMPACT}
+ */
+ public static final String TREETABLE_COMPACT = TABLE_COMPACT;
+
+ /**
+ * Small font size and reduced the white space inside the table cells. Can
+ * be combined with any other Table/TreeTable style.
+ */
+ public static final String TABLE_SMALL = "small";
+
+ /**
+ * See {@link #TABLE_SMALL}
+ */
+ public static final String TREETABLE_SMALL = TABLE_SMALL;
+
+ /***************************************************************************
+ *
+ * DragAndDropWrapper styles
+ *
+ **************************************************************************/
+
+ /**
+ * Hide the "box drag hints" (i.e. the style which gets applied when the
+ * drag is in the middle/center area of the drag target).
+ */
+ public static final String DRAG_AND_DROP_WRAPPER_NO_BOX_DRAG_HINTS = "no-box-drag-hints";
+
+ /**
+ * Hide the "vertical drag hints" (i.e. the style which gets applied when
+ * the drag is in the top/bottom part of the drag target).
+ */
+ public static final String DRAG_AND_DROP_WRAPPER_NO_VERTICAL_DRAG_HINTS = "no-vertical-drag-hints";
+
+ /**
+ * Hide the "horizontal drag hints" (i.e. the style which gets applied when
+ * the drag is in the left/right part of the drag target).
+ */
+ public static final String DRAG_AND_DROP_WRAPPER_NO_HORIZONTAL_DRAG_HINTS = "no-horizontal-drag-hints";
+
+ /***************************************************************************
+ *
+ * Panel styles
+ *
+ **************************************************************************/
+
+ /**
+ * Remove borders and the background color of the panel. Can be combined
+ * with any other Panel style.
+ */
+ public static final String PANEL_BORDERLESS = "borderless";
+
+ /**
+ * Show a divider between the panel caption and content when the content
+ * area is scrolled. Suitable with the {@link #PANEL_BORDERLESS} style. Can
+ * be combined with any other Panel style.
+ */
+ public static final String PANEL_SCROLL_INDICATOR = "scroll-indicator";
+
+ /**
+ * Inset panel style. Can be combined with any other Panel style.
+ */
+ public static final String PANEL_WELL = "well";
+
+ /***************************************************************************
+ *
+ * SplitPanel styles
+ *
+ **************************************************************************/
+
+ /**
+ * Make the split handle wider.
+ */
+ public static final String SPLITPANEL_LARGE = "large";
+
+ /***************************************************************************
+ *
+ * TabSheet styles
+ *
+ **************************************************************************/
+
+ /**
+ * Adds a border around the whole component as well as around individual
+ * tabs in the tab bar. Can be combined with any other TabSheet style.
+ */
+ public static final String TABSHEET_FRAMED = "framed";
+
+ /**
+ * Center the tabs inside the tab bar. Works best if all the tabs fit
+ * completely in the tab bar (i.e. no tab bar scrolling). Can be combined
+ * with any other TabSheet style.
+ */
+ public static final String TABSHEET_CENTERED_TABS = "centered-tabs";
+
+ /**
+ * Give equal amount of space to all tabs in the tab bar (.i.e expand ratio
+ * == 1 for all tabs). The tab captions will be truncated if they do not fit
+ * in to the tab. Tab scrolling will be disabled when this style is applied
+ * (all tabs will be visible at the same time). Can be combined with any
+ * other TabSheet style.
+ */
+ public static final String TABSHEET_EQUAL_WIDTH_TABS = "equal-width-tabs";
+
+ /**
+ * Add a small amount of padding around the tabs in the tab bar, so that
+ * they don't touch the outer edges of the component. Can be combined with
+ * any other TabSheet style.
+ */
+ public static final String TABSHEET_PADDED_TABBAR = "padded-tabbar";
+
+ /**
+ * Reduce the whitespace around the tabs in the tab bar. Can be combined
+ * with any other TabSheet style.
+ */
+ public static final String TABSHEET_COMPACT_TABBAR = "compact-tabbar";
+
+ /**
+ * Display tab icons on top of the tab captions (by default the icons are
+ * place on the left side of the caption). Can be combined with any other
+ * TabSheet style.
+ */
+ public static final String TABSHEET_ICONS_ON_TOP = "icons-on-top";
+
+ /**
+ * Only the selected tab has the close button visible. Does not prevent
+ * closing the tab programmatically, it only hides the button from the end
+ * user. Can be combined with any other TabSheet style.
+ */
+ public static final String TABSHEET_ONLY_SELECTED_TAB_IS_CLOSABLE = "only-selected-closable";
+
+ /***************************************************************************
+ *
+ * Accordion styles
+ *
+ **************************************************************************/
+
+ /**
+ * Remove the outer border from the accordion. Can be combined with any
+ * other Accordion style.
+ */
+ public static final String ACCORDION_BORDERLESS = "borderless";
+
+ /***************************************************************************
+ *
+ * Window and related styles
+ *
+ **************************************************************************/
+
+ /**
+ * Add this style to any layout component (e.g. CssLayout, VerticalLayout or
+ * HorizontalLayout) and place it inside the root layout of the window to
+ * create a toolbar area for the window. You can then place any other
+ * components inside the toolbar layout, e.g. a MenuBar.
+ */
+ public static final String WINDOW_TOP_TOOLBAR = "v-window-top-toolbar";
+
+ /**
+ * Add this style to any layout component (e.g. CssLayout, VerticalLayout or
+ * HorizontalLayout) and place it inside the root layout of the window to
+ * create a toolbar area for the window. You can then place any other
+ * components inside the toolbar layout, e.g. a MenuBar.
+ */
+ public static final String WINDOW_BOTTOM_TOOLBAR = "v-window-bottom-toolbar";
+
+ /***************************************************************************
+ *
+ * FormLayout styles
+ *
+ **************************************************************************/
+
+ /**
+ * Removes the borders and background from any direct child field components
+ * (TextField, TextArea, DateField, ComboBox) in the layout. Reduces the
+ * spacing between the form rows adds separator lines between them.
+ */
+ public static final String FORMLAYOUT_LIGHT = "light";
+
+ /***************************************************************************
+ *
+ * Layout styles
+ *
+ **************************************************************************/
+
+ /**
+ * Make a layout look like the Panel component (resembles visually a card).
+ * Add an additional <code>v-panel-caption</code> style name to any layout
+ * inside the card layout to make it look like a Panel's caption.
+ */
+ public static final String LAYOUT_CARD = "card";
+
+ /**
+ * Make a layout look like the {@link #PANEL_WELL} style. Add an additional
+ * <code>v-panel-caption</code> style name to any layout inside the card
+ * layout to make it look like a Panel's caption.
+ */
+ public static final String LAYOUT_WELL = "well";
+
+ /***************************************************************************
+ *
+ * Valo menu styles
+ *
+ **************************************************************************/
+
+ /**
+ * Set the primary style name of a CssLayout to this, and add any number of
+ * layouts with the {@link #MENU_PART} style inside it.
+ */
+ public static final String MENU_ROOT = "valo-menu";
+
+ /**
+ * Add this style name to any layout and place it inside a layout with the
+ * {@link #MENU_ROOT} style to build a menu component. Use the additional
+ * MENU styles for individual components inside the layout.
+ */
+ public static final String MENU_PART = "valo-menu-part";
+
+ /**
+ * TODO
+ */
+ public static final String MENU_TITLE = "valo-menu-title";
+
+ /**
+ * TODO
+ */
+ public static final String MENU_SUBTITLE = "valo-menu-subtitle";
+
+ /**
+ * TODO
+ */
+ public static final String MENU_ITEM = "valo-menu-title";
+
+ /**
+ * TODO
+ */
+ public static final String MENU_BADGE = "valo-menu-badge";
+
+ /**
+ * TODO
+ */
+ public static final String MENU_LOGO = "valo-menu-logo";
+
+}
diff --git a/server/tests/src/com/vaadin/tests/server/component/StateGetDoesNotMarkDirty.java b/server/tests/src/com/vaadin/tests/server/component/StateGetDoesNotMarkDirty.java
new file mode 100644
index 0000000000..280d638707
--- /dev/null
+++ b/server/tests/src/com/vaadin/tests/server/component/StateGetDoesNotMarkDirty.java
@@ -0,0 +1,100 @@
+package com.vaadin.tests.server.component;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Locale;
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.mockito.Mockito;
+
+import com.vaadin.tests.VaadinClasses;
+import com.vaadin.ui.Component;
+import com.vaadin.ui.ConnectorTracker;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.UI;
+
+public class StateGetDoesNotMarkDirty extends TestCase {
+
+ private Set<String> excludedMethods = new HashSet<String>();
+
+ @Override
+ protected void setUp() throws Exception {
+ excludedMethods.add(Label.class.getName() + "getDataSourceValue");
+ excludedMethods.add("getConnectorId");
+ }
+
+ public void testGetDoesntMarkStateDirty() throws Exception {
+ for (Class<? extends Component> c : VaadinClasses.getComponents()) {
+ Component newInstance = construct(c);
+ prepareMockUI(newInstance);
+
+ Set<Method> methods = new HashSet<Method>();
+ methods.addAll(Arrays.asList(c.getMethods()));
+ methods.addAll(Arrays.asList(c.getDeclaredMethods()));
+ for (Method method : methods) {
+ try {
+ if (method.getName().startsWith("is")
+ || method.getName().startsWith("get")) {
+ if (method.getName().startsWith("getState")) {
+ continue;
+ }
+ if (method.getParameterTypes().length > 0) {
+ // usually getters do not have params, if they have
+ // we still wouldnt know what to put into
+ continue;
+ }
+ if (excludedMethods.contains(c.getName()
+ + method.getName())) {
+ // blacklisted method for specific classes
+ continue;
+ }
+ if (excludedMethods.contains(method.getName())) {
+ // blacklisted method for all classes
+ continue;
+ }
+ // just to make sure we can invoke it
+ method.setAccessible(true);
+ method.invoke(newInstance);
+ }
+ } catch (Exception e) {
+ System.err.println("problem with method " + c.getName()
+ + "# " + method.getName());
+ e.printStackTrace();
+ throw e;
+ }
+ }
+ }
+
+ }
+
+ private void prepareMockUI(Component newInstance) {
+ UI ui = Mockito.mock(UI.class);
+ Mockito.when(ui.getLocale()).thenReturn(Locale.ENGLISH);
+ ConnectorTracker connectorTracker = Mockito
+ .mock(ConnectorTracker.class);
+ Mockito.when(ui.getConnectorTracker()).thenReturn(connectorTracker);
+ Mockito.doThrow(new RuntimeException("getState(true) called in getter"))
+ .when(connectorTracker).markDirty(newInstance);
+
+ newInstance.setParent(ui);
+ }
+
+ private Component construct(Class<? extends Component> c) {
+ try {
+ try {
+ Constructor<? extends Component> declaredConstructor = c
+ .getDeclaredConstructor();
+ declaredConstructor.setAccessible(true);
+ return declaredConstructor.newInstance();
+ } catch (NoSuchMethodException e) {
+ return c.newInstance();
+ }
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/shared/build.xml b/shared/build.xml
index 966d250d66..197f63c027 100644
--- a/shared/build.xml
+++ b/shared/build.xml
@@ -18,7 +18,7 @@
<path id="classpath.test.custom" />
<target name="jar">
- <property name="shared.osgi.import" value="org.json;version=&quot;0.0.20080701&quot;, com.google.gwt.thirdparty.guava.common.annotations;version=&quot;10.0.1.rebased&quot;, com.google.gwt.thirdparty.guava.common.base;version=&quot;10.0.1.rebased&quot;, com.google.gwt.thirdparty.guava.common.base.internal;version=&quot;10.0.1.rebased&quot;, com.google.gwt.thirdparty.guava.common.cache;version=&quot;10.0.1.rebased&quot;, com.google.gwt.thirdparty.guava.common.collect;version=&quot;10.0.1.rebased&quot;, com.google.gwt.thirdparty.guava.common.eventbus;version=&quot;10.0.1.rebased&quot;, com.google.gwt.thirdparty.guava.common.io;version=&quot;10.0.1.rebased&quot;, com.google.gwt.thirdparty.guava.common.net;version=&quot;10.0.1.rebased&quot;, com.google.gwt.thirdparty.guava.common.primitives;version=&quot;10.0.1.rebased&quot;, com.google.gwt.thirdparty.guava.common.util.concurrent;version=&quot;10.0.1.rebased&quot;, com.google.gwt.thirdparty.streamhtmlparser;version=&quot;0.1.5.r10-rebased&quot;, com.google.gwt.thirdparty.streamhtmlparser.impl;version=&quot;0.1.5.r10-rebased&quot;, com.google.gwt.thirdparty.streamhtmlparser.util;version=&quot;0.1.5.r10-rebased&quot;, org.w3c.flute.parser;version=&quot;1.3.0.gg2&quot;, org.w3c.flute.parser.selectors;version=&quot;1.3.0.gg2&quot;, org.w3c.flute.util;version=&quot;1.3.0.gg2&quot;" />
+ <property name="shared.osgi.import" value="org.json;version=&quot;0.0.20131108.vaadin1&quot;, com.google.gwt.thirdparty.guava.common.annotations;version=&quot;16.0.1.vaadin1&quot;, com.google.gwt.thirdparty.guava.common.base;version=&quot;16.0.1.vaadin1&quot;, com.google.gwt.thirdparty.guava.common.base.internal;version=&quot;16.0.1.vaadin1&quot;, com.google.gwt.thirdparty.guava.common.cache;version=&quot;16.0.1.vaadin1&quot;, com.google.gwt.thirdparty.guava.common.collect;version=&quot;16.0.1.vaadin1&quot;, com.google.gwt.thirdparty.guava.common.eventbus;version=&quot;16.0.1.vaadin1&quot;, com.google.gwt.thirdparty.guava.common.io;version=&quot;16.0.1.vaadin1&quot;, com.google.gwt.thirdparty.guava.common.net;version=&quot;16.0.1.vaadin1&quot;, com.google.gwt.thirdparty.guava.common.primitives;version=&quot;16.0.1.vaadin1&quot;, com.google.gwt.thirdparty.guava.common.util.concurrent;version=&quot;16.0.1.vaadin1&quot;, com.google.gwt.thirdparty.streamhtmlparser;version=&quot;0.0.10.vaadin1&quot;, com.google.gwt.thirdparty.streamhtmlparser.impl;version=&quot;0.0.10.vaadin1&quot;, com.google.gwt.thirdparty.streamhtmlparser.util;version=&quot;0.0.10.vaadin1&quot;, org.w3c.flute.parser;version=&quot;1.3.0.gg2&quot;, org.w3c.flute.parser.selectors;version=&quot;1.3.0.gg2&quot;, org.w3c.flute.util;version=&quot;1.3.0.gg2&quot;" />
<delete dir="${src.filtered}" />
<!-- Update version in Version.java -->
<copy todir="${src.filtered}">
diff --git a/shared/ivy.xml b/shared/ivy.xml
index 3dfe1a51c2..2dac7adbc2 100644
--- a/shared/ivy.xml
+++ b/shared/ivy.xml
@@ -27,8 +27,8 @@
conf="build,ide,test->default" />
<dependency org="com.vaadin.external.google" name="guava"
rev="16.0.1.vaadin1" conf="build,ide,test->default" />
- <dependency org="com.vaadin.external.google" name="android-json"
- rev="0.0.20131108.vaadin1" conf="build,ide,test->default" />
+ <dependency org="com.vaadin.external.json" name="json"
+ rev="0.0.20080701" conf="build,ide,test->default" />
<dependency org="junit" name="junit" rev="4.11"
conf="test,ide -> default" />
diff --git a/shared/src/com/vaadin/shared/ui/gridlayout/GridLayoutState.java b/shared/src/com/vaadin/shared/ui/gridlayout/GridLayoutState.java
index ad0f34c862..768183cf73 100644
--- a/shared/src/com/vaadin/shared/ui/gridlayout/GridLayoutState.java
+++ b/shared/src/com/vaadin/shared/ui/gridlayout/GridLayoutState.java
@@ -1,12 +1,12 @@
/*
* Copyright 2000-2014 Vaadin Ltd.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -17,7 +17,9 @@ package com.vaadin.shared.ui.gridlayout;
import java.io.Serializable;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Map;
+import java.util.Set;
import com.vaadin.shared.Connector;
import com.vaadin.shared.ui.AbstractLayoutState;
@@ -33,6 +35,9 @@ public class GridLayoutState extends AbstractLayoutState {
public int rows = 0;
public int columns = 0;
public int marginsBitmask = 0;
+ // Set of indexes of implicitly Ratios rows and columns
+ public Set<Integer> explicitRowRatios = new HashSet<Integer>();;
+ public Set<Integer> explicitColRatios = new HashSet<Integer>();
public Map<Connector, ChildComponentData> childData = new HashMap<Connector, GridLayoutState.ChildComponentData>();
public static class ChildComponentData implements Serializable {
@@ -41,5 +46,6 @@ public class GridLayoutState extends AbstractLayoutState {
public int column2;
public int row2;
public int alignment = ALIGNMENT_DEFAULT.getBitMask();
+
}
}
diff --git a/shared/src/com/vaadin/shared/ui/ui/UIState.java b/shared/src/com/vaadin/shared/ui/ui/UIState.java
index 3c3785b7d5..abdc105ba7 100644
--- a/shared/src/com/vaadin/shared/ui/ui/UIState.java
+++ b/shared/src/com/vaadin/shared/ui/ui/UIState.java
@@ -62,6 +62,7 @@ public class UIState extends TabIndexState {
* Configuration for the push channel
*/
public PushConfigurationState pushConfiguration = new PushConfigurationState();
+ public String theme;
{
primaryStyleName = "v-ui";
// Default is 1 for legacy reasons
@@ -95,7 +96,7 @@ public class UIState extends TabIndexState {
NotificationRole role) {
this.prefix = prefix;
this.postfix = postfix;
- this.notificationRole = role;
+ notificationRole = role;
}
}
diff --git a/themes/build.xml b/themes/build.xml
index efbaaaa18f..0135f55071 100644
--- a/themes/build.xml
+++ b/themes/build.xml
@@ -40,6 +40,9 @@
<antcall target="compile-theme">
<param name="theme" value="liferay" />
</antcall>
+ <antcall target="compile-theme">
+ <param name="theme" value="valo" />
+ </antcall>
</target>
<target name="jar" depends="compile-themes">
diff --git a/uitest/src/com/vaadin/launcher/DevelopmentServerLauncher.java b/uitest/src/com/vaadin/launcher/DevelopmentServerLauncher.java
index d94518ca9c..e6e54a57a6 100644
--- a/uitest/src/com/vaadin/launcher/DevelopmentServerLauncher.java
+++ b/uitest/src/com/vaadin/launcher/DevelopmentServerLauncher.java
@@ -142,6 +142,7 @@ public class DevelopmentServerLauncher {
assignDefault(serverArgs, "webroot", "WebContent");
assignDefault(serverArgs, "httpPort", "" + serverPort);
assignDefault(serverArgs, "context", "");
+ assignDefault(serverArgs, "slowdown", "/run/APP/PUBLISHED/js_label.js");
int port = serverPort;
try {
diff --git a/uitest/src/com/vaadin/tests/VerifyBrowserVersionTest.java b/uitest/src/com/vaadin/tests/VerifyBrowserVersionTest.java
index 53317bd581..43d6a55a8b 100644
--- a/uitest/src/com/vaadin/tests/VerifyBrowserVersionTest.java
+++ b/uitest/src/com/vaadin/tests/VerifyBrowserVersionTest.java
@@ -49,7 +49,7 @@ public class VerifyBrowserVersionTest extends MultiBrowserTest {
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36");
expectedUserAgent
.put(Browser.PHANTOMJS.getDesiredCapabilities(),
- "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.7 Safari/534.34");
+ "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.7 Safari/534.34");
}
diff --git a/uitest/src/com/vaadin/tests/components/LongTooltip.html b/uitest/src/com/vaadin/tests/components/LongTooltip.html
deleted file mode 100644
index a5055741f1..0000000000
--- a/uitest/src/com/vaadin/tests/components/LongTooltip.html
+++ /dev/null
@@ -1,324 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="" />
-<title>New Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">New Test</td></tr>
-</thead><tbody>
-<!--Lower-right-->
-<tr>
- <td>open</td>
- <td>/run/com.vaadin.tests.components.LongTooltip?restartApplication</td>
- <td></td>
-</tr>
-<!--Show tooltip, which should be on screen-->
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[3]/VTextField[0]</td>
- <td>0,0</td>
-</tr>
-<!--Wait for tooltip to appear-->
-<tr>
- <td>waitForVisible</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>tooltip-lower-right-1</td>
-</tr>
-<!--Hide tooltip-->
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::/VVerticalLayout[0]/VVerticalLayout[0]/VGridLayout[0]</td>
- <td>55,43</td>
-</tr>
-<!--Wait for tooltip to disappear. Cannot for some reason use waitForNotVisible-->
-<tr>
- <td>pause</td>
- <td>500</td>
- <td></td>
-</tr>
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[3]/VTextField[0]</td>
- <td>0,0</td>
-</tr>
-<tr>
- <td>waitForVisible</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>tooltip-lower-right-2</td>
-</tr>
-<!--Hide tooltip-->
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::/VVerticalLayout[0]/VVerticalLayout[0]/VGridLayout[0]</td>
- <td>55,43</td>
-</tr>
-<!--Wait for tooltip to disappear. Cannot for some reason use waitForNotVisible-->
-<tr>
- <td>pause</td>
- <td>500</td>
- <td></td>
-</tr>
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[3]/VTextField[0]</td>
- <td>100,20</td>
-</tr>
-<tr>
- <td>waitForVisible</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>tooltip-lower-right-3</td>
-</tr>
-<!--Upper-right-->
-<tr>
- <td>open</td>
- <td>/run/com.vaadin.tests.components.LongTooltip?restartApplication</td>
- <td></td>
-</tr>
-<!--Show tooltip, which should be on screen-->
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[1]/VTextField[0]</td>
- <td>0,0</td>
-</tr>
-<!--Wait for tooltip to appear-->
-<tr>
- <td>waitForVisible</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>tooltip-upper-right-1</td>
-</tr>
-<!--Hide tooltip-->
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::/VVerticalLayout[0]/VVerticalLayout[0]/VGridLayout[0]</td>
- <td>55,43</td>
-</tr>
-<!--Wait for tooltip to disappear. Cannot for some reason use waitForNotVisible-->
-<tr>
- <td>pause</td>
- <td>500</td>
- <td></td>
-</tr>
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[1]/VTextField[0]</td>
- <td>0,0</td>
-</tr>
-<tr>
- <td>waitForVisible</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>tooltip-upper-right-2</td>
-</tr>
-<!--Hide tooltip-->
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::/VVerticalLayout[0]/VVerticalLayout[0]/VGridLayout[0]</td>
- <td>55,43</td>
-</tr>
-<!--Wait for tooltip to disappear. Cannot for some reason use waitForNotVisible-->
-<tr>
- <td>pause</td>
- <td>500</td>
- <td></td>
-</tr>
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[1]/VTextField[0]</td>
- <td>100,20</td>
-</tr>
-<tr>
- <td>waitForVisible</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>tooltip-upper-right-3</td>
-</tr>
-<!--Lower-left-->
-<tr>
- <td>open</td>
- <td>/run/com.vaadin.tests.components.LongTooltip?restartApplication</td>
- <td></td>
-</tr>
-<!--Show tooltip, which should be on screen-->
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[2]/VTextField[0]</td>
- <td>0,0</td>
-</tr>
-<!--Wait for tooltip to appear-->
-<tr>
- <td>waitForVisible</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>tooltip-lower-left-1</td>
-</tr>
-<!--Hide tooltip-->
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::/VVerticalLayout[0]/VVerticalLayout[0]/VGridLayout[0]</td>
- <td>55,43</td>
-</tr>
-<!--Wait for tooltip to disappear. Cannot for some reason use waitForNotVisible-->
-<tr>
- <td>pause</td>
- <td>500</td>
- <td></td>
-</tr>
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[2]/VTextField[0]</td>
- <td>0,0</td>
-</tr>
-<tr>
- <td>waitForVisible</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>tooltip-lower-left-2</td>
-</tr>
-<!--Hide tooltip-->
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::/VVerticalLayout[0]/VVerticalLayout[0]/VGridLayout[0]</td>
- <td>55,43</td>
-</tr>
-<!--Wait for tooltip to disappear. Cannot for some reason use waitForNotVisible-->
-<tr>
- <td>pause</td>
- <td>500</td>
- <td></td>
-</tr>
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[2]/VTextField[0]</td>
- <td>100,20</td>
-</tr>
-<tr>
- <td>waitForVisible</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>tooltip-lower-left-3</td>
-</tr>
-<!--Upper-left-->
-<tr>
- <td>open</td>
- <td>/run/com.vaadin.tests.components.LongTooltip?restartApplication</td>
- <td></td>
-</tr>
-<!--Show tooltip, which should be on screen-->
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[0]/VTextField[0]</td>
- <td>0,0</td>
-</tr>
-<!--Wait for tooltip to appear-->
-<tr>
- <td>waitForVisible</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>tooltip-upper-left-1</td>
-</tr>
-<!--Hide tooltip-->
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::/VVerticalLayout[0]/VVerticalLayout[0]/VGridLayout[0]</td>
- <td>55,43</td>
-</tr>
-<!--Wait for tooltip to disappear. Cannot for some reason use waitForNotVisible-->
-<tr>
- <td>pause</td>
- <td>500</td>
- <td></td>
-</tr>
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[0]/VTextField[0]</td>
- <td>0,0</td>
-</tr>
-<tr>
- <td>waitForVisible</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>tooltip-upper-left-2</td>
-</tr>
-<!--Hide tooltip-->
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::/VVerticalLayout[0]/VVerticalLayout[0]/VGridLayout[0]</td>
- <td>55,43</td>
-</tr>
-<!--Wait for tooltip to disappear. Cannot for some reason use waitForNotVisible-->
-<tr>
- <td>pause</td>
- <td>500</td>
- <td></td>
-</tr>
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[0]/VTextField[0]</td>
- <td>100,20</td>
-</tr>
-<tr>
- <td>waitForVisible</td>
- <td>vaadin=runcomvaadintestscomponentsLongTooltip::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>tooltip-upper-left-3</td>
-</tr>
-</tbody></table>
-</body>
-</html>
diff --git a/uitest/src/com/vaadin/tests/components/abstractcomponent/PrimaryStyle.java b/uitest/src/com/vaadin/tests/components/abstractcomponent/PrimaryStyle.java
new file mode 100644
index 0000000000..1a15e7c5ae
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/abstractcomponent/PrimaryStyle.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.abstractcomponent;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.TextField;
+
+public class PrimaryStyle extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ // Use a set of three common components as a test.
+ final Label label = new Label("Test Label");
+ label.setPrimaryStyleName("initial");
+ label.setStyleName("state");
+ addComponent(label);
+
+ final Button button = new Button("Test Button");
+ button.setPrimaryStyleName("initial");
+ button.setStyleName("state");
+ addComponent(button);
+
+ final TextField tf = new TextField("Test TextField");
+ tf.setPrimaryStyleName("initial");
+ tf.setStyleName("state");
+ addComponent(tf);
+
+ Button updateButton = new Button("Update styles",
+ new Button.ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ label.setPrimaryStyleName("updated");
+ label.setStyleName("correctly");
+
+ button.setPrimaryStyleName("updated");
+ button.setStyleName("correctly");
+
+ tf.setPrimaryStyleName("updated");
+ tf.setStyleName("correctly");
+ }
+ });
+ updateButton.setId("update-button");
+ addComponent(updateButton);
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Test that setPrimaryStyleName followed by setStyleName results in correct class names.";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 12190;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/abstractcomponent/PrimaryStyleTest.java b/uitest/src/com/vaadin/tests/components/abstractcomponent/PrimaryStyleTest.java
new file mode 100644
index 0000000000..ce99c4a3d5
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/abstractcomponent/PrimaryStyleTest.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.abstractcomponent;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
+import static org.junit.Assert.assertEquals;
+
+import java.util.List;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class PrimaryStyleTest extends MultiBrowserTest {
+
+ @Test
+ public void testStyleNames() {
+ openTestURL();
+
+ // Verify the initial class names for all three components.
+ List<WebElement> initialElements = driver.findElements(By
+ .className("initial-state"));
+ assertThat(initialElements, hasSize(3));
+
+ // Click on a button that updates the styles.
+ $(ButtonElement.class).id("update-button").click();
+
+ // Verify that the class names where updated as expected.
+ List<WebElement> updatedElements = driver.findElements(By.className("updated-correctly"));
+ assertThat(updatedElements, hasSize(initialElements.size()));
+
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/calendar/CalendarResizeOverlappingEvents.java b/uitest/src/com/vaadin/tests/components/calendar/CalendarResizeOverlappingEvents.java
new file mode 100644
index 0000000000..2025ce2ea7
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/calendar/CalendarResizeOverlappingEvents.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.calendar;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Calendar;
+import com.vaadin.ui.components.calendar.event.BasicEvent;
+import com.vaadin.ui.components.calendar.event.CalendarEvent;
+import com.vaadin.ui.components.calendar.event.CalendarEventProvider;
+
+/**
+ *
+ * @author Vaadin Ltd
+ */
+public class CalendarResizeOverlappingEvents extends AbstractTestUI {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#setup(com.vaadin.server.
+ * VaadinRequest)
+ */
+ @Override
+ protected void setup(VaadinRequest request) {
+ Calendar calendar = new Calendar(new CalendarEventProvider() {
+
+ @Override
+ public List<CalendarEvent> getEvents(Date startDate, Date endDate) {
+ DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ DateFormat dayFormat = new SimpleDateFormat("yyyy-MM-dd");
+ List<CalendarEvent> events = new ArrayList<CalendarEvent>();
+ try {
+ java.util.Calendar today = java.util.Calendar.getInstance();
+
+ String todayString = dayFormat.format(today.getTime());
+
+ Date date1 = format.parse(todayString + " 09:00:00");
+ Date date2 = format.parse(todayString + " 11:00:00");
+ Date date3 = format.parse(todayString + " 12:00:00");
+ Date date4 = format.parse(todayString + " 14:00:00");
+ Date date5 = format.parse(todayString + " 15:00:00");
+ Date date6 = format.parse(todayString + " 17:00:00");
+
+ CalendarEvent event1 = new BasicEvent("First", "", date1,
+ date2);
+ CalendarEvent event2 = new BasicEvent("Second", "", date3,
+ date4);
+ CalendarEvent event3 = new BasicEvent("Third", "", date5,
+ date6);
+
+ events.add(event1);
+ events.add(event2);
+ events.add(event3);
+ } catch (ParseException e) {
+ }
+ return events;
+ }
+ });
+ calendar.setSizeFull();
+ setContent(calendar);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTestDescription()
+ */
+ @Override
+ protected String getTestDescription() {
+ return "Verify the widths of the events are correctly recalculated when these are resized and overlapped";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTicketNumber()
+ */
+ @Override
+ protected Integer getTicketNumber() {
+ return 13961;
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/components/calendar/CalendarResizeOverlappingEventsTest.java b/uitest/src/com/vaadin/tests/components/calendar/CalendarResizeOverlappingEventsTest.java
new file mode 100644
index 0000000000..f664149cce
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/calendar/CalendarResizeOverlappingEventsTest.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.calendar;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.interactions.Actions;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+/**
+ *
+ * @author Vaadin Ltd
+ */
+public class CalendarResizeOverlappingEventsTest extends MultiBrowserTest {
+
+ private int noOverlapWidth;
+ private int oneOverlapWidth;
+ private int twoOverlapsWidth;
+
+ private WebElement firstEvent;
+ private WebElement secondEvent;
+ private WebElement thirdEvent;
+
+ private WebElement firstEventBottomResize;
+ private WebElement secondEventBottomResize;
+ private WebElement thirdEventBottomResize;
+
+ @Test
+ public void testCalendarResizeOverlappingEvents()
+ throws InterruptedException, IOException {
+
+ openTestURL();
+ initParams();
+ doTest();
+ }
+
+ private void doTest() {
+ assertWidths(noOverlapWidth, noOverlapWidth, noOverlapWidth);
+
+ dragAndDrop(firstEventBottomResize, 240);
+ assertWidths(oneOverlapWidth, oneOverlapWidth, oneOverlapWidth);
+
+ dragAndDrop(secondEventBottomResize, 240);
+ assertWidths(twoOverlapsWidth, twoOverlapsWidth, twoOverlapsWidth);
+
+ dragAndDrop(secondEventBottomResize, -240);
+ dragAndDrop(firstEventBottomResize, -240);
+ assertWidths(noOverlapWidth, noOverlapWidth, noOverlapWidth);
+
+ }
+
+ private void assertWidths(int firstEventExpectedWidth,
+ int secondEventExpectedWidth, int thirdEventExpectedWidth) {
+ int widthTolerance = 5;
+ String errorMessage = "Wrong event width after resizing, expected [%d] (+/-%d), obtained [%d]";
+
+ int actualWidth = firstEvent.getSize().getWidth();
+ int expectedWidth = firstEventExpectedWidth;
+ Assert.assertTrue(String.format(errorMessage, expectedWidth,
+ widthTolerance, actualWidth),
+ isAproximateWidth(actualWidth, expectedWidth, widthTolerance));
+
+ actualWidth = secondEvent.getSize().getWidth();
+ expectedWidth = secondEventExpectedWidth;
+ Assert.assertTrue(String.format(errorMessage, expectedWidth,
+ widthTolerance, actualWidth),
+ isAproximateWidth(actualWidth, expectedWidth, widthTolerance));
+
+ actualWidth = thirdEvent.getSize().getWidth();
+ expectedWidth = thirdEventExpectedWidth;
+ Assert.assertTrue(String.format(errorMessage, expectedWidth,
+ widthTolerance, actualWidth),
+ isAproximateWidth(actualWidth, expectedWidth, widthTolerance));
+ }
+
+ private boolean isAproximateWidth(int actualWidth, int expectedWidth,
+ int tolerance) {
+ return Math.abs(expectedWidth - actualWidth) <= tolerance;
+ }
+
+ private void dragAndDrop(WebElement element, int yOffset) {
+ /*
+ * Selenium doesn't properly drag and drop items in IE8. It tries to
+ * start dragging an element from a position above the element itself.
+ */
+ if (BrowserUtil.isIE8(getDesiredCapabilities())) {
+ Actions action = new Actions(getDriver());
+ action.moveToElement(element);
+ action.moveByOffset(0, 1);
+ action.clickAndHold();
+ action.moveByOffset(0, yOffset);
+ action.release();
+ action.build().perform();
+ } else {
+ Actions action = new Actions(getDriver());
+ action.dragAndDropBy(element, 0, yOffset);
+ action.build().perform();
+ }
+ }
+
+ private void initParams() {
+ WebElement dateSlot = getDriver().findElement(
+ By.className("v-datecellslot"));
+ int dateSlotWidth = dateSlot.getSize().getWidth();
+ noOverlapWidth = dateSlotWidth;
+ oneOverlapWidth = dateSlotWidth / 2;
+ twoOverlapsWidth = dateSlotWidth / 3;
+
+ Comparator<WebElement> startTimeComparator = new Comparator<WebElement>() {
+ @Override
+ public int compare(WebElement e1, WebElement e2) {
+ int e1Top = e1.getLocation().getY();
+ int e2Top = e2.getLocation().getY();
+ return e1Top - e2Top;
+ }
+ };
+
+ List<WebElement> eventElements = getDriver().findElements(
+ By.className("v-calendar-event-content"));
+ Collections.sort(eventElements, startTimeComparator);
+ firstEvent = eventElements.get(0);
+ secondEvent = eventElements.get(1);
+ thirdEvent = eventElements.get(2);
+
+ List<WebElement> resizeBottomElements = getDriver().findElements(
+ By.className("v-calendar-event-resizebottom"));
+ Collections.sort(resizeBottomElements, startTimeComparator);
+ firstEventBottomResize = resizeBottomElements.get(0);
+ secondEventBottomResize = resizeBottomElements.get(1);
+ thirdEventBottomResize = resizeBottomElements.get(2);
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/components/checkbox/CheckBoxRpcCount.java b/uitest/src/com/vaadin/tests/components/checkbox/CheckBoxRpcCount.java
new file mode 100644
index 0000000000..bd44e8a074
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/checkbox/CheckBoxRpcCount.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.checkbox;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.shared.MouseEventDetails;
+import com.vaadin.shared.ui.checkbox.CheckBoxServerRpc;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.CheckBox;
+import com.vaadin.ui.Label;
+
+public class CheckBoxRpcCount extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ final Label countLabel = new Label("No RPC calls made yet.");
+ countLabel.setId("count-label");
+ addComponent(countLabel);
+
+ CheckBox cb = new CheckBox("Click me to start counting...") {
+ {
+ // Register a new RPC that counts the number of invocations.
+ registerRpc(new CheckBoxServerRpc() {
+ private int rpcCount = 0;
+
+ @Override
+ public void setChecked(boolean checked,
+ MouseEventDetails mouseEventDetails) {
+ rpcCount++;
+ countLabel.setValue(rpcCount + " RPC call(s) made.");
+ }
+
+ });
+ }
+ };
+ addComponent(cb);
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Test for verifying that no extra RPC calls are made when clicking on CheckBox label.";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 8259;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/checkbox/CheckBoxRpcCountTest.java b/uitest/src/com/vaadin/tests/components/checkbox/CheckBoxRpcCountTest.java
new file mode 100644
index 0000000000..9d6640eb6d
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/checkbox/CheckBoxRpcCountTest.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.checkbox;
+
+import static org.junit.Assert.assertEquals;
+
+import com.vaadin.testbench.elements.CheckBoxElement;
+import com.vaadin.testbench.elements.LabelElement;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+import org.openqa.selenium.support.ui.ExpectedCondition;
+
+public class CheckBoxRpcCountTest extends MultiBrowserTest {
+
+ @Test
+ public void numberOfRpcCallsIsEqualToClicks() {
+ openTestURL();
+
+ CheckBoxElement checkBoxElement = $(CheckBoxElement.class).first();
+ WebElement labelElem = checkBoxElement.findElement(By.tagName("label"));
+ WebElement inputElem = checkBoxElement.findElement(By.tagName("input"));
+ final WebElement countElem = $(LabelElement.class).id("count-label");
+
+ // Click on the actual checkbox.
+ inputElem.click();
+ //Have to use waitUntil to make this test more stable.
+ waitUntilLabelIsUpdated(countElem, "1 RPC call(s) made.");
+
+ // Click on the checkbox label.
+ labelElem.click();
+ waitUntilLabelIsUpdated(countElem, "2 RPC call(s) made.");
+
+ // Again on the label.
+ labelElem.click();
+ waitUntilLabelIsUpdated(countElem, "3 RPC call(s) made.");
+ }
+
+ private void waitUntilLabelIsUpdated(final WebElement countElem, final String expectedText) {
+ waitUntil(new ExpectedCondition<Boolean>() {
+ @Override
+ public Boolean apply(WebDriver input) {
+ return countElem.getText().equals(expectedText);
+ }
+ }, 5);
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/components/combobox/ComboBoxInputPrompt.java b/uitest/src/com/vaadin/tests/components/combobox/ComboBoxInputPrompt.java
new file mode 100644
index 0000000000..082aca6989
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/combobox/ComboBoxInputPrompt.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.combobox;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.ComboBox;
+
+public class ComboBoxInputPrompt extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ final ComboBox cb1 = new ComboBox("Normal");
+ cb1.setInputPrompt("Normal input prompt");
+
+ final ComboBox cb2 = new ComboBox("Disabled");
+ cb2.setEnabled(false);
+ cb2.setInputPrompt("Disabled input prompt");
+
+ final ComboBox cb3 = new ComboBox("Read-only");
+ cb3.setReadOnly(true);
+ cb3.setInputPrompt("Read-only input prompt");
+
+ Button enableButton = new Button("Toggle enabled",
+ new Button.ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ cb2.setEnabled(!cb2.isEnabled());
+ cb3.setReadOnly(!cb3.isReadOnly());
+ }
+ });
+
+ addComponents(cb1, cb2, cb3, enableButton);
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "ComboBox should not display the input prompt if disabled or read-only.";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 10573;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/combobox/ComboBoxInputPromptTest.java b/uitest/src/com/vaadin/tests/components/combobox/ComboBoxInputPromptTest.java
new file mode 100644
index 0000000000..96151022ff
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/combobox/ComboBoxInputPromptTest.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.combobox;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.isEmptyString;
+import static org.junit.Assert.assertEquals;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.testbench.elements.ComboBoxElement;
+import com.vaadin.testbench.elements.TextFieldElement;
+import com.vaadin.tests.tb3.AbstractTB3Test;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class ComboBoxInputPromptTest extends MultiBrowserTest {
+
+ @Test
+ public void promptIsHiddenForDisabledAndReadonly() {
+ openTestURL();
+
+ ComboBoxElement normalComboBox = getComboBoxWithCaption("Normal");
+ ComboBoxElement disabledComboBox = getComboBoxWithCaption("Disabled");
+ ComboBoxElement readOnlyComboBox = getComboBoxWithCaption("Read-only");
+
+ assertThat(getInputPromptValue(normalComboBox), is("Normal input prompt"));
+ assertThat(getInputPromptValue(disabledComboBox), isEmptyString());
+ assertThat(getInputPromptValue(readOnlyComboBox), isEmptyString());
+
+ toggleDisabledAndReadonly();
+ assertThat(getInputPromptValue(disabledComboBox), is("Disabled input prompt"));
+ assertThat(getInputPromptValue(readOnlyComboBox), is("Read-only input prompt"));
+
+ toggleDisabledAndReadonly();
+ assertThat(getInputPromptValue(disabledComboBox), isEmptyString());
+ assertThat(getInputPromptValue(readOnlyComboBox), isEmptyString());
+ }
+
+ private void toggleDisabledAndReadonly() {
+ $(ButtonElement.class).first().click();
+ }
+
+ private String getInputPromptValue(ComboBoxElement comboBox) {
+ WebElement input = comboBox.findElement(By.tagName("input"));
+
+ return input.getAttribute("value");
+ }
+
+ private ComboBoxElement getComboBoxWithCaption(String caption) {
+ return $(ComboBoxElement.class).caption(caption).first();
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/combobox/ComboBoxScrollingWithArrowsTest.java b/uitest/src/com/vaadin/tests/components/combobox/ComboBoxScrollingWithArrowsTest.java
index bc03593e3f..fa6f5a3a93 100644
--- a/uitest/src/com/vaadin/tests/components/combobox/ComboBoxScrollingWithArrowsTest.java
+++ b/uitest/src/com/vaadin/tests/components/combobox/ComboBoxScrollingWithArrowsTest.java
@@ -15,16 +15,19 @@
*/
package com.vaadin.tests.components.combobox;
-import java.util.List;
-
-import org.junit.Assert;
-import org.junit.Before;
+import com.vaadin.testbench.By;
+import com.vaadin.testbench.elements.ComboBoxElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
import org.junit.Test;
import org.openqa.selenium.Keys;
+import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.ExpectedCondition;
-import com.vaadin.testbench.By;
-import com.vaadin.tests.tb3.MultiBrowserTest;
+import java.util.List;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
/**
* When pressed down key, while positioned on the last item - should show next
@@ -32,52 +35,72 @@ import com.vaadin.tests.tb3.MultiBrowserTest;
*/
public class ComboBoxScrollingWithArrowsTest extends MultiBrowserTest {
- @Before
- public void openURL() {
+ private final int PAGESIZE = 10;
+
+ @Override
+ public void setup() throws Exception {
+ super.setup();
+
openTestURL();
+ openPopup();
}
- @Test
- public void scrollDownArrowKeyTest() throws InterruptedException {
- final int ITEMS_PER_PAGE = 10;
+ private WebElement getDropDown() {
// Selenium is used instead of TestBench4, because there is no method to
// access the popup of the combobox
// The method ComboBoxElement.openPopup() opens the popup, but doesn't
// provide any way to access the popup and send keys to it.
// Ticket #13756
- WebElement dropDownComboBox = driver.findElement(By
+
+ return driver.findElement(By
.className("v-filterselect-input"));
- // opens Lookup
- dropDownComboBox.sendKeys(Keys.DOWN);
+ }
+
+ private void openPopup() {
+ ComboBoxElement cb = $(ComboBoxElement.class).first();
+ cb.openPopup();
+ }
+
+ @Test
+ public void scrollDownArrowKeyTest() throws InterruptedException {
+ WebElement dropDownComboBox = getDropDown();
+
// go to the last item and then one more
- for (int i = 0; i < ITEMS_PER_PAGE + 1; i++) {
+ for (int i = 0; i < PAGESIZE + 1; i++) {
dropDownComboBox.sendKeys(Keys.DOWN);
}
- String expected = "item " + ITEMS_PER_PAGE;// item 10
+ assertThat(getSelectedItemText(), is("item " + PAGESIZE)); //item 10
+ }
+
+ private String getSelectedItemText() {
List<WebElement> items = driver.findElements(By
.className("gwt-MenuItem-selected"));
- String actual = items.get(0).getText();
- Assert.assertEquals(expected, actual);
+ return items.get(0).getText();
}
@Test
public void scrollUpArrowKeyTest() throws InterruptedException {
- final int ITEMS_PER_PAGE = 10;
- WebElement dropDownComboBox = driver.findElement(By
- .className("v-filterselect-input"));
- // opens Lookup
- dropDownComboBox.sendKeys(Keys.DOWN);
+ WebElement dropDownComboBox = getDropDown();
+
// go to the last item and then one more
- for (int i = 0; i < ITEMS_PER_PAGE + 1; i++) {
+ for (int i = 0; i < PAGESIZE + 1; i++) {
dropDownComboBox.sendKeys(Keys.DOWN);
}
+
// move to one item up
+ waitUntilNextPageIsVisible();
dropDownComboBox.sendKeys(Keys.UP);
- String expected = "item " + (ITEMS_PER_PAGE - 1);// item 9
- List<WebElement> items = driver.findElements(By
- .className("gwt-MenuItem-selected"));
- String actual = items.get(0).getText();
- Assert.assertEquals(expected, actual);
+
+ assertThat(getSelectedItemText(), is("item " + (PAGESIZE - 1))); //item 9
+ }
+
+ private void waitUntilNextPageIsVisible() {
+ waitUntil(new ExpectedCondition<Boolean>() {
+ @Override
+ public Boolean apply(WebDriver input) {
+ return getSelectedItemText().equals("item " + PAGESIZE);
+ }
+ }, 5);
}
}
diff --git a/uitest/src/com/vaadin/tests/components/combobox/ComboBoxSetNullWhenNewItemsAllowedTest.java b/uitest/src/com/vaadin/tests/components/combobox/ComboBoxSetNullWhenNewItemsAllowedTest.java
index 54d355ab0a..7951187fa7 100644
--- a/uitest/src/com/vaadin/tests/components/combobox/ComboBoxSetNullWhenNewItemsAllowedTest.java
+++ b/uitest/src/com/vaadin/tests/components/combobox/ComboBoxSetNullWhenNewItemsAllowedTest.java
@@ -46,9 +46,11 @@ public class ComboBoxSetNullWhenNewItemsAllowedTest extends MultiBrowserTest {
assertEquals("New value", element.getAttribute("value"));
if (BrowserUtil.isPhantomJS(getDesiredCapabilities())) {
new Actions(getDriver()).sendKeys(Keys.ENTER).perform();
+ Thread.sleep(500);
} else {
element.sendKeys(Keys.RETURN);
}
+
assertEquals("", element.getAttribute("value"));
}
}
diff --git a/uitest/src/com/vaadin/tests/components/datefield/DateFieldReadOnly.java b/uitest/src/com/vaadin/tests/components/datefield/DateFieldReadOnly.java
index 392dbaf9c6..304c978381 100644
--- a/uitest/src/com/vaadin/tests/components/datefield/DateFieldReadOnly.java
+++ b/uitest/src/com/vaadin/tests/components/datefield/DateFieldReadOnly.java
@@ -3,16 +3,18 @@ package com.vaadin.tests.components.datefield;
import java.util.Calendar;
import java.util.Locale;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
import com.vaadin.tests.components.TestBase;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.DateField;
-public class DateFieldReadOnly extends TestBase {
+public class DateFieldReadOnly extends AbstractTestUI {
@Override
- protected String getDescription() {
+ protected String getTestDescription() {
return "A read-only DateField should not show the popup button and not be editable.";
}
@@ -22,7 +24,7 @@ public class DateFieldReadOnly extends TestBase {
}
@Override
- protected void setup() {
+ protected void setup(VaadinRequest request) {
final DateField timeField = new DateField("A read-only datefield");
timeField.setResolution(DateField.RESOLUTION_SEC);
timeField.setDateFormat("HH:mm:ss");
@@ -30,6 +32,7 @@ public class DateFieldReadOnly extends TestBase {
timeField.setIcon(null);
timeField.setWidth("8em");
timeField.addStyleName("timeField");
+ timeField.setLocale(new Locale("fi"));
// Set date so that testing always has same time
Calendar c = Calendar.getInstance(Locale.ENGLISH);
diff --git a/uitest/src/com/vaadin/tests/components/datefield/DateFieldReadOnlyTest.java b/uitest/src/com/vaadin/tests/components/datefield/DateFieldReadOnlyTest.java
index 96e17344ec..289a5988ee 100644
--- a/uitest/src/com/vaadin/tests/components/datefield/DateFieldReadOnlyTest.java
+++ b/uitest/src/com/vaadin/tests/components/datefield/DateFieldReadOnlyTest.java
@@ -17,7 +17,7 @@ public class DateFieldReadOnlyTest extends MultiBrowserTest {
public void readOnlyDateFieldPopupShouldNotOpen() throws IOException, InterruptedException {
openTestURL();
- compareScreen("readonly");
+ compareScreen("initial");
toggleReadOnly();
openPopup();
diff --git a/uitest/src/com/vaadin/tests/components/datefield/LocaleChange.java b/uitest/src/com/vaadin/tests/components/datefield/LocaleChange.java
new file mode 100644
index 0000000000..f69c93419b
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/datefield/LocaleChange.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.datefield;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.shared.ui.datefield.Resolution;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.DateField;
+
+public class LocaleChange extends AbstractTestUI {
+
+ private final Locale locale12hClock = Locale.US;
+ private final Locale locale24hClock = Locale.FRANCE;
+
+ private final String caption = "Switch to %s hour clock";
+ private static final Date dateValue;
+ static {
+ try {
+ dateValue = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss")
+ .parse("2014-05-22 20:00:00");
+ } catch (ParseException e) {
+ throw new ExceptionInInitializerError("Should never happen.");
+ }
+ }
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ final DateField df = new DateField();
+ df.setLocale(locale24hClock);
+ df.setResolution(Resolution.SECOND);
+ df.setValue(dateValue);
+
+ Button button = new Button(String.format(caption, "12"));
+ button.addClickListener(new ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ if (locale12hClock.equals(df.getLocale())) {
+ df.setLocale(locale24hClock);
+ event.getButton().setCaption(String.format(caption, "12"));
+ } else {
+ df.setLocale(locale12hClock);
+ event.getButton().setCaption(String.format(caption, "24"));
+ }
+ }
+ });
+
+ addComponent(df);
+ addComponent(button);
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Testing locale change from one with 24h clock to a 12h clock locale.";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 13722;
+ }
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/components/datefield/LocaleChangeTest.java b/uitest/src/com/vaadin/tests/components/datefield/LocaleChangeTest.java
new file mode 100644
index 0000000000..cf756034a1
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/datefield/LocaleChangeTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.datefield;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openqa.selenium.By;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class LocaleChangeTest extends MultiBrowserTest {
+
+ @Test
+ public void testLocaleChange() {
+ openTestURL();
+
+ // Check the initial value and that popup can be opened.
+ assertEquals("22/05/14 20:00:00", getDateValue());
+ toggleDatePopup();
+ assertPopupOpen(true);
+
+ // Close the popup and change the locale.
+ toggleDatePopup();
+ assertPopupOpen(false);
+ driver.findElement(By.className("v-button")).click(); // Locale change.
+
+ // Check that the value has changed and the popup can still be opened
+ // without problems.
+ assertEquals("5/22/14 08:00:00 PM", getDateValue());
+ toggleDatePopup();
+ assertPopupOpen(true);
+ }
+
+ private void assertPopupOpen(boolean open) {
+ assertEquals("Date popup was not " + (open ? "open" : "closed") + ".",
+ (open ? 1 : 0),
+ driver.findElements(By.className("v-datefield-popup")).size());
+ }
+
+ private void toggleDatePopup() {
+ driver.findElement(By.className("v-datefield-button")).click();
+ }
+
+ private String getDateValue() {
+ return driver.findElement(By.className("v-datefield-textfield"))
+ .getAttribute("value");
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/components/draganddropwrapper/DragAndDropWrapperTooltips.html b/uitest/src/com/vaadin/tests/components/draganddropwrapper/DragAndDropWrapperTooltips.html
deleted file mode 100644
index 3c91c8b24f..0000000000
--- a/uitest/src/com/vaadin/tests/components/draganddropwrapper/DragAndDropWrapperTooltips.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="" />
-<title>New Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">New Test</td></tr>
-</thead><tbody>
-<tr>
- <td>open</td>
- <td>/run/com.vaadin.tests.components.draganddropwrapper.DragAndDropWrapperTooltips?restartApplication</td>
- <td></td>
-</tr>
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsdraganddropwrapperDragAndDropWrapperTooltips::PID_Swrapper3/VLabel[0]</td>
- <td>0,0</td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>tooltip-initial</td>
-</tr>
-<!--Drag Block 4 between Block 1 and Block 2-->
-<tr>
- <td>drag</td>
- <td>vaadin=runcomvaadintestscomponentsdraganddropwrapperDragAndDropWrapperTooltips::PID_Swrapper4/VLabel[0]</td>
- <td>30,41</td>
-</tr>
-<tr>
- <td>drop</td>
- <td>vaadin=runcomvaadintestscomponentsdraganddropwrapperDragAndDropWrapperTooltips::PID_Swrapper2</td>
- <td>4,42</td>
-</tr>
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsdraganddropwrapperDragAndDropWrapperTooltips::PID_Swrapper1/VLabel[0]</td>
- <td>0,0</td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>tooltip-after-drag</td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/uitest/src/com/vaadin/tests/components/form/FormTooltips.html b/uitest/src/com/vaadin/tests/components/form/FormTooltips.html
deleted file mode 100644
index 5e412c3aad..0000000000
--- a/uitest/src/com/vaadin/tests/components/form/FormTooltips.html
+++ /dev/null
@@ -1,148 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="http://localhost:8888" />
-<title>FormTooltips</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">FormTooltips</td></tr>
-</thead><tbody>
-<tr>
- <td>open</td>
- <td>/run/com.vaadin.tests.components.form.FormTooltips?restartApplication</td>
- <td></td>
-</tr>
-<!--first name tooltip-->
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsformFormTooltips::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VForm[0]/VFormLayout[0]/VFormLayout$VFormLayoutTable[0]/VTextField[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>waitForElementPresent</td>
- <td>vaadin=runcomvaadintestscomponentsformFormTooltips::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsformFormTooltips::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td>Fields own tooltip</td>
-</tr>
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsformFormTooltips::</td>
- <td></td>
-</tr>
-<tr>
- <td>pause</td>
- <td>1000</td>
- <td></td>
-</tr>
-<tr>
- <td>assertElementPositionLeft</td>
- <td>vaadin=runcomvaadintestscomponentsformFormTooltips::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td>-1000</td>
-</tr>
-<!--first name caption tooltip-->
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsformFormTooltips::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VForm[0]/VFormLayout[0]/domChild[0]/domChild[1]/domChild[0]/domChild[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>waitForElementPresent</td>
- <td>vaadin=runcomvaadintestscomponentsformFormTooltips::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsformFormTooltips::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td>Fields own tooltip</td>
-</tr>
-<tr>
- <td>mouseMove</td>
- <td>vaadin=runcomvaadintestscomponentsformFormTooltips::</td>
- <td></td>
-</tr>
-<tr>
- <td>pause</td>
- <td>1000</td>
- <td></td>
-</tr>
-<tr>
- <td>assertElementPositionLeft</td>
- <td>vaadin=runcomvaadintestscomponentsformFormTooltips::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td>-1000</td>
-</tr>
-<!--Form should not have a description tooltip-->
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsformFormTooltips::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VForm[0]/domChild[0]/domChild[1]</td>
- <td></td>
-</tr>
-<tr>
- <td>pause</td>
- <td>1000</td>
- <td></td>
-</tr>
-<tr>
- <td>assertElementPositionLeft</td>
- <td>vaadin=runcomvaadintestscomponentsformFormTooltips::Root/VTooltip[0]</td>
- <td>-1000</td>
-</tr>
-<!--Form error message should not have a tooltip-->
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsformFormTooltips::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VForm[0]/domChild[0]/domChild[3]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>pause</td>
- <td>1000</td>
- <td></td>
-</tr>
-<tr>
- <td>assertElementPositionLeft</td>
- <td>vaadin=runcomvaadintestscomponentsformFormTooltips::Root/VTooltip[0]</td>
- <td>-1000</td>
-</tr>
-<!--last name should have no tooltip-->
-<tr>
- <td>mouseMove</td>
- <td>vaadin=runcomvaadintestscomponentsformFormTooltips::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VForm[0]/VFormLayout[0]/VFormLayout$VFormLayoutTable[0]/VTextField[1]</td>
- <td></td>
-</tr>
-<tr>
- <td>pause</td>
- <td>1000</td>
- <td></td>
-</tr>
-<tr>
- <td>assertElementPositionLeft</td>
- <td>vaadin=runcomvaadintestscomponentsformFormTooltips::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td>-1000</td>
-</tr>
-<!--last name caption should have no tooltip-->
-<tr>
- <td>mouseMove</td>
- <td>vaadin=runcomvaadintestscomponentsformFormTooltips::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VForm[0]/VFormLayout[0]/domChild[0]/domChild[1]/domChild[1]/domChild[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>pause</td>
- <td>1000</td>
- <td></td>
-</tr>
-<tr>
- <td>assertElementPositionLeft</td>
- <td>vaadin=runcomvaadintestscomponentsformFormTooltips::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td>-1000</td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/uitest/src/com/vaadin/tests/components/form/FormTooltips.java b/uitest/src/com/vaadin/tests/components/form/FormTooltips.java
index b70f66c710..6e823204e9 100644
--- a/uitest/src/com/vaadin/tests/components/form/FormTooltips.java
+++ b/uitest/src/com/vaadin/tests/components/form/FormTooltips.java
@@ -31,6 +31,7 @@ public class FormTooltips extends AbstractTestUI {
@Override
protected void setup(VaadinRequest request) {
final Form form = new Form();
+ form.setId("tooltipForm");
form.setDescription("Some description");
form.setItemDataSource(new BeanItem<Person>(new Person("foo", "bar",
"baz", 12, Sex.MALE, null)), Arrays.asList(new String[] {
diff --git a/uitest/src/com/vaadin/tests/components/form/FormTooltipsTest.java b/uitest/src/com/vaadin/tests/components/form/FormTooltipsTest.java
new file mode 100644
index 0000000000..cb71fef3ef
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/form/FormTooltipsTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.form;
+
+import org.junit.Test;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.testbench.By;
+import com.vaadin.testbench.elements.FormElement;
+import com.vaadin.testbench.elements.TextFieldElement;
+import com.vaadin.tests.tb3.TooltipTest;
+
+public class FormTooltipsTest extends TooltipTest {
+
+ @Test
+ public void testTooltipConfiguration() throws Exception {
+ openTestURL();
+ // first name tooltip
+
+ WebElement fieldElement = $(FormElement.class).first()
+ .$(TextFieldElement.class).first();
+ checkTooltip(fieldElement, "Fields own tooltip");
+ clearTooltip();
+ checkTooltipNotPresent();
+
+ // first name caption tooltip
+ checkTooltip(
+ $(FormElement.class).first().findElement(
+ By.className("v-caption")), "Fields own tooltip");
+
+ clearTooltip();
+ checkTooltipNotPresent();
+
+ // Form should not have a description tooltip
+ checkTooltip($(FormElement.class).first(), null);
+
+ // Form error message should not have a tooltip
+ checkTooltip(By.className("v-form-errormessage"), null);
+
+ // last name should have no tooltip
+ checkTooltip($(TextFieldElement.class).get(1), null);
+
+ // last name caption should have no tooltip
+ checkTooltip(
+ $(FormElement.class).first()
+ .findElements(By.className("v-caption")).get(1), null);
+ }
+
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/components/gridlayout/GridLayoutExpandRatio.java b/uitest/src/com/vaadin/tests/components/gridlayout/GridLayoutExpandRatio.java
new file mode 100644
index 0000000000..c20148743a
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/gridlayout/GridLayoutExpandRatio.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.gridlayout;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.GridLayout;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.Label;
+
+public class GridLayoutExpandRatio extends AbstractTestUI {
+ HorizontalLayout layout;
+ GridLayout gridLayout;
+ GridLayout gridLayout2;
+ private static final int ROWS = 5;
+ private static final int COLS = 5;
+ private Label[][] labels;
+
+ @Override
+ protected void setup(VaadinRequest request) {
+
+ labels = new Label[ROWS][COLS];
+ layout = new HorizontalLayout();
+ gridLayout = new GridLayout(ROWS, COLS);
+ layout.setImmediate(true);
+ gridLayout.setImmediate(true);
+ gridLayout2 = new GridLayout(4, 4);
+ for (int i = 0; i < ROWS; i++) {
+ for (int j = 0; j < COLS; j++) {
+ Label label = new Label("Slot " + i + " " + j);
+ label.setImmediate(true);
+ labels[i][j] = label;
+ gridLayout.addComponent(label, j, i);
+ if (!(i == 2 || j == 2)) {
+ Label label2 = new Label("Slot " + i + " " + j);
+ gridLayout2.addComponent(label2);
+ }
+ }
+ }
+ gridLayout.setHeight("500px");
+ gridLayout.setWidth("500px");
+ gridLayout.setSpacing(true);
+
+ gridLayout2.setHeight("500px");
+ gridLayout2.setWidth("500px");
+ gridLayout2.setSpacing(true);
+ addComponent(layout);
+ HorizontalLayout space = new HorizontalLayout();
+ space.setWidth("100px");
+ layout.addComponent(gridLayout);
+ layout.addComponent(space);
+ layout.addComponent(gridLayout2);
+
+ setExpandRatio();
+ addComponent(new Button("Hide/show both middle Column and row",
+ new Button.ClickListener() {
+ @Override
+ public void buttonClick(ClickEvent event) {
+ hideComponetns();
+ }
+ }));
+ }
+
+ private void hideComponetns() {
+ for (int i = 0; i < ROWS; i++) {
+ for (int j = 0; j < COLS; j++) {
+ if (i == 2 || j == 2) {
+ if (labels[i][j].isVisible()) {
+ labels[i][j].setVisible(false);
+ } else {
+ labels[i][j].setVisible(true);
+ }
+ }
+ }
+ }
+ }
+
+ private void setExpandRatio() {
+ gridLayout.setRowExpandRatio(2, 5);
+ gridLayout2.setRowExpandRatio(1, 5);
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 8855;
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "If row/column doesn't have elements but have an expand ratio set, it should be shown as a empty row/column";
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/gridlayout/GridLayoutExpandRatioTest.java b/uitest/src/com/vaadin/tests/components/gridlayout/GridLayoutExpandRatioTest.java
new file mode 100644
index 0000000000..d4d36bd10f
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/gridlayout/GridLayoutExpandRatioTest.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.gridlayout;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.testbench.elements.GridLayoutElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.ExpectedCondition;
+
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+public class GridLayoutExpandRatioTest extends MultiBrowserTest {
+ @Test
+ public void cellSizesAreCorrectlyCalculated() {
+ openTestURL();
+
+ hideMiddleRowAndColumn();
+ final List<WebElement> slots4x4 = getSlots(1);
+
+ waitUntilColumnAndRowAreHidden(slots4x4);
+ final List<WebElement> slots5x5 = getSlots(0);
+
+ for (int i = 0; i < slots5x5.size(); i++) {
+ WebElement compared = slots5x5.get(i);
+ WebElement actual = slots4x4.get(i);
+ assertEquals("Different top coordinate for element " + i,
+ compared.getCssValue("top"), actual.getCssValue("top"));
+ assertEquals("Different left coordinate for element " + i,
+ compared.getCssValue("left"), actual.getCssValue("left"));
+ }
+ }
+
+ private void waitUntilColumnAndRowAreHidden(final List<WebElement> slots4x4) {
+ waitUntil(new ExpectedCondition<Boolean>() {
+ @Override
+ public Boolean apply(WebDriver input) {
+ return getSlots(0).size() == slots4x4.size();
+ }
+ }, 5);
+ }
+
+ private List<WebElement> getSlots(int index) {
+ GridLayoutElement layout = $(GridLayoutElement.class).get(index);
+
+ return layout.findElements(By.className("v-gridlayout-slot"));
+ }
+
+ private void hideMiddleRowAndColumn() {
+ $(ButtonElement.class).first().click();
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/components/gridlayout/GridLayoutHideMiddleCells.java b/uitest/src/com/vaadin/tests/components/gridlayout/GridLayoutHideMiddleCells.java
new file mode 100644
index 0000000000..16b3742c64
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/gridlayout/GridLayoutHideMiddleCells.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.gridlayout;
+
+import java.util.Random;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.GridLayout;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.VerticalLayout;
+
+public class GridLayoutHideMiddleCells extends AbstractTestUI {
+ GridLayout gridLayout;
+ GridLayout gridLayout2;
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ final int ROWS = 5;
+ final int COLS = 5;
+
+ final Label[][] labels = new Label[ROWS][COLS];
+ VerticalLayout mainLayout = new VerticalLayout();
+ HorizontalLayout horLayout = new HorizontalLayout();
+ gridLayout = new GridLayout(ROWS, COLS);
+ gridLayout2 = new GridLayout(4, 4);
+ for (int i = 0; i < 5; i++) {
+ for (int j = 0; j < 5; j++) {
+ Label label = new Label("Slot " + i + " " + j);
+ labels[i][j] = label;
+ gridLayout.addComponent(label);
+ if (!(i == 2 || j == 2)) {
+ Label label2 = new Label("Slot " + i + " " + j);
+ gridLayout2.addComponent(label2);
+ }
+ }
+ }
+ setContent(mainLayout);
+ gridLayout.setHeight("500px");
+ gridLayout.setWidth("500px");
+ gridLayout.setSpacing(true);
+
+ addComponent(gridLayout);
+ addComponent(gridLayout2);
+ mainLayout.addComponent(horLayout);
+ gridLayout2.setHeight("500px");
+ gridLayout2.setWidth("500px");
+ gridLayout2.setSpacing(true);
+ horLayout.addComponent(gridLayout);
+ horLayout.addComponent(gridLayout2);
+
+ mainLayout.addComponent(new Button(
+ "Hide/show both middle Column and row",
+ new Button.ClickListener() {
+ @Override
+ public void buttonClick(ClickEvent event) {
+ for (int i = 0; i < ROWS; i++) {
+ for (int j = 0; j < COLS; j++) {
+ if (j == 2 || i == 2) {
+ if (labels[i][j].isVisible()) {
+ labels[i][j].setVisible(false);
+ } else {
+ labels[i][j].setVisible(true);
+ }
+ }
+ }
+ }
+ }
+ }));
+ mainLayout.addComponent(new Button("Hide/show middle Column",
+ new Button.ClickListener() {
+ @Override
+ public void buttonClick(ClickEvent event) {
+ for (int i = 0; i < ROWS; i++) {
+ if (labels[i][2].isVisible()) {
+ labels[i][2].setVisible(false);
+ } else {
+ labels[i][2].setVisible(true);
+ }
+ }
+ }
+ }));
+ mainLayout.addComponent(new Button("Hide/show middle Row",
+ new Button.ClickListener() {
+ @Override
+ public void buttonClick(ClickEvent event) {
+ for (int j = 0; j < COLS; j++) {
+ if (labels[2][j].isVisible()) {
+ labels[2][j].setVisible(false);
+ } else {
+ labels[2][j].setVisible(true);
+ }
+ }
+ }
+
+ }));
+ mainLayout.addComponent(new Button("Hide Random button",
+ new Button.ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ // TODO Auto-generated method stub
+ Random rand = new Random();
+ int i = rand.nextInt(ROWS);
+ int j = rand.nextInt(COLS);
+ if (labels[i][j].isVisible()) {
+ labels[i][j].setVisible(false);
+ } else {
+ labels[i][j].setVisible(true);
+ }
+ }
+ }));
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 8855;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTestDescription()
+ */
+ @Override
+ protected String getTestDescription() {
+ return "Changing the number of visible fields a GridLayout with spacing should not cause additional empty space on the place of invisible fields";
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/gridlayout/GridLayoutHideMiddleCellsTest.java b/uitest/src/com/vaadin/tests/components/gridlayout/GridLayoutHideMiddleCellsTest.java
new file mode 100644
index 0000000000..a5eb9b6e04
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/gridlayout/GridLayoutHideMiddleCellsTest.java
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.gridlayout;
+
+public class GridLayoutHideMiddleCellsTest extends GridLayoutExpandRatioTest {
+}
diff --git a/uitest/src/com/vaadin/tests/components/gridlayout/MoveComponentFromGridLayoutToInnerLayout.html b/uitest/src/com/vaadin/tests/components/gridlayout/MoveComponentFromGridLayoutToInnerLayout.html
deleted file mode 100644
index ed6d39f63d..0000000000
--- a/uitest/src/com/vaadin/tests/components/gridlayout/MoveComponentFromGridLayoutToInnerLayout.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="" />
-<title>New Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">New Test</td></tr>
-</thead><tbody>
-<tr>
- <td>open</td>
- <td>/run/com.vaadin.tests.components.gridlayout.MoveComponentsFromGridLayoutToInnerLayout?restartApplication</td>
- <td></td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestscomponentsgridlayoutMoveComponentsFromGridLayoutToInnerLayout::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestscomponentsgridlayoutMoveComponentsFromGridLayoutToInnerLayout::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>buttons-with-captions</td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/uitest/src/com/vaadin/tests/components/gridlayout/MoveComponentsFromGridLayoutToInnerLayout.java b/uitest/src/com/vaadin/tests/components/gridlayout/MoveComponentsFromGridLayoutToInnerLayout.java
index 0106f2e218..4f5b29c91f 100644
--- a/uitest/src/com/vaadin/tests/components/gridlayout/MoveComponentsFromGridLayoutToInnerLayout.java
+++ b/uitest/src/com/vaadin/tests/components/gridlayout/MoveComponentsFromGridLayoutToInnerLayout.java
@@ -1,20 +1,19 @@
package com.vaadin.tests.components.gridlayout;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
import com.vaadin.tests.components.TestBase;
-import com.vaadin.ui.Button;
+import com.vaadin.ui.*;
import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.ComponentContainer;
-import com.vaadin.ui.GridLayout;
-import com.vaadin.ui.VerticalLayout;
-public class MoveComponentsFromGridLayoutToInnerLayout extends TestBase {
+public class MoveComponentsFromGridLayoutToInnerLayout extends AbstractTestUI {
protected Button testButton;
private GridLayout gl;
protected ComponentContainer vl;
@Override
- protected void setup() {
+ protected void setup(VaadinRequest request) {
gl = new GridLayout();
gl.setWidth("200px");
gl.setHeight("200px");
@@ -31,6 +30,7 @@ public class MoveComponentsFromGridLayoutToInnerLayout extends TestBase {
gl.addComponent(testButton);
vl = new VerticalLayout();
+ vl.addComponent(new Label("I'm inside the inner layout"));
gl.addComponent(vl);
addComponent(gl);
@@ -48,7 +48,7 @@ public class MoveComponentsFromGridLayoutToInnerLayout extends TestBase {
}
@Override
- protected String getDescription() {
+ protected String getTestDescription() {
return "Click the first button to move it from an outer layout to an inner. Then click the second button to repaint the inner layout.";
}
diff --git a/uitest/src/com/vaadin/tests/components/gridlayout/MoveComponentsFromGridLayoutToInnerLayoutTest.java b/uitest/src/com/vaadin/tests/components/gridlayout/MoveComponentsFromGridLayoutToInnerLayoutTest.java
new file mode 100644
index 0000000000..eb4888ea1a
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/gridlayout/MoveComponentsFromGridLayoutToInnerLayoutTest.java
@@ -0,0 +1,22 @@
+package com.vaadin.tests.components.gridlayout;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.tests.tb3.AbstractTB3Test;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+import org.junit.Test;
+
+import java.io.IOException;
+
+import static org.junit.Assert.*;
+
+public class MoveComponentsFromGridLayoutToInnerLayoutTest extends MultiBrowserTest {
+
+ @Test
+ public void buttonIsMovedInsideInnerLayout() throws IOException {
+ openTestURL();
+
+ $(ButtonElement.class).first().click();
+
+ compareScreen("buttonClicked");
+ }
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/components/javascriptcomponent/JavaScriptPreloading.java b/uitest/src/com/vaadin/tests/components/javascriptcomponent/JavaScriptPreloading.java
new file mode 100644
index 0000000000..f9ef4c98cb
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/javascriptcomponent/JavaScriptPreloading.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.javascriptcomponent;
+
+import com.vaadin.annotations.JavaScript;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.shared.ui.JavaScriptComponentState;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.tests.util.Log;
+import com.vaadin.ui.AbstractJavaScriptComponent;
+
+public class JavaScriptPreloading extends AbstractTestUI {
+
+ public static class JsLabelState extends JavaScriptComponentState {
+ public String xhtml;
+ }
+
+ @JavaScript({ "js_label.js", "wholly_different.js" })
+ public class JsLabel extends AbstractJavaScriptComponent {
+
+ public JsLabel(final String xhtml) {
+ getState().xhtml = xhtml;
+ }
+
+ @Override
+ protected JsLabelState getState() {
+ return (JsLabelState) super.getState();
+ }
+ }
+
+ private final Log log = new Log(5);
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ addComponent(log);
+
+ final JsLabel c = new JsLabel("Hello World!");
+ c.setId("js-component");
+ addComponent(c);
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Loading javascript component with multiple sourcefiles should not break IE11";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return Integer.valueOf(13956);
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/javascriptcomponent/JavaScriptPreloadingTest.java b/uitest/src/com/vaadin/tests/components/javascriptcomponent/JavaScriptPreloadingTest.java
new file mode 100644
index 0000000000..a9e7a1bca7
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/javascriptcomponent/JavaScriptPreloadingTest.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.javascriptcomponent;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import java.util.List;
+
+import org.junit.Test;
+import org.openqa.selenium.Alert;
+import org.openqa.selenium.TimeoutException;
+import org.openqa.selenium.remote.DesiredCapabilities;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class JavaScriptPreloadingTest extends MultiBrowserTest {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.tb3.MultiBrowserTest#getBrowsersToTest()
+ */
+ @Override
+ public List<DesiredCapabilities> getBrowsersToTest() {
+ List<DesiredCapabilities> browsers = super.getBrowsersToTest();
+ browsers.remove(Browser.PHANTOMJS.getDesiredCapabilities());
+ return browsers;
+ }
+
+ @Test
+ public void scriptsShouldPreloadAndExecuteInCorrectOrder()
+ throws InterruptedException {
+ openTestURL();
+
+ try {
+ new WebDriverWait(driver, 10).until(ExpectedConditions
+ .alertIsPresent());
+ Alert alert = driver.switchTo().alert();
+ assertEquals("First", alert.getText());
+ alert.accept();
+
+ new WebDriverWait(driver, 10).until(ExpectedConditions
+ .alertIsPresent());
+ alert = driver.switchTo().alert();
+ assertEquals("Second", alert.getText());
+ alert.accept();
+
+ } catch (TimeoutException te) {
+ fail("@Javascript widget loading halted.");
+ }
+
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/components/javascriptcomponent/js_label.js b/uitest/src/com/vaadin/tests/components/javascriptcomponent/js_label.js
new file mode 100755
index 0000000000..c4900daa81
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/javascriptcomponent/js_label.js
@@ -0,0 +1,11 @@
+window.com_vaadin_tests_components_javascriptcomponent_JavaScriptPreloading_JsLabel = function() {
+ var e = this.getElement();
+
+ (function() {
+ e.innerHTML = "Widget executed javascript";
+ })();
+};
+
+(function() {
+ window.alert("First");
+})();
diff --git a/uitest/src/com/vaadin/tests/components/javascriptcomponent/wholly_different.js b/uitest/src/com/vaadin/tests/components/javascriptcomponent/wholly_different.js
new file mode 100755
index 0000000000..f22ef13a76
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/javascriptcomponent/wholly_different.js
@@ -0,0 +1,3 @@
+(function() {
+ window.alert("Second");
+})();
diff --git a/uitest/src/com/vaadin/tests/components/menubar/MenuBarToolTips.html b/uitest/src/com/vaadin/tests/components/menubar/MenuBarToolTips.html
deleted file mode 100644
index f7c57baf1f..0000000000
--- a/uitest/src/com/vaadin/tests/components/menubar/MenuBarToolTips.html
+++ /dev/null
@@ -1,122 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="" />
-<title>New Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">New Test</td></tr>
-</thead><tbody>
-<tr>
- <td>open</td>
- <td>/run/com.vaadin.tests.components.menubar.MenuBarToolTips?restartApplication</td>
- <td></td>
-</tr>
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarToolTips::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VMenuBar[0]#item0</td>
- <td>0,0</td>
-</tr>
-<tr>
- <td>pause</td>
- <td>1000</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarToolTips::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td>File menu</td>
-</tr>
-<tr>
- <td>mouseOut</td>
- <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarToolTips::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td></td>
-</tr>
-<tr>
- <td>mouseClick</td>
- <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarToolTips::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VMenuBar[0]#item0</td>
- <td>18,11</td>
-</tr>
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarToolTips::Root/VOverlay[0]/VMenuBar[0]#item0</td>
- <td>0,0</td>
-</tr>
-<tr>
- <td>pause</td>
- <td>1000</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarToolTips::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td>File - Foo menu</td>
-</tr>
-<tr>
- <td>mouseOut</td>
- <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarToolTips::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td></td>
-</tr>
-<tr>
- <td>mouseClick</td>
- <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarToolTips::/VVerticalLayout[0]/domChild[1]</td>
- <td>830,200</td>
-</tr>
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarToolTips::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VMenuBar[0]#item1</td>
- <td>0,0</td>
-</tr>
-<tr>
- <td>pause</td>
- <td>1000</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarToolTips::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td>Edit menu</td>
-</tr>
-<tr>
- <td>mouseOut</td>
- <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarToolTips::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td></td>
-</tr>
-<tr>
- <td>mouseClick</td>
- <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarToolTips::/VVerticalLayout[0]/domChild[1]</td>
- <td>625,184</td>
-</tr>
-<tr>
- <td>mouseClick</td>
- <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarToolTips::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VMenuBar[0]#item1</td>
- <td>9,6</td>
-</tr>
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarToolTips::Root/VOverlay[0]/VMenuBar[0]#item1</td>
- <td>0,0</td>
-</tr>
-<tr>
- <td>pause</td>
- <td>1000</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarToolTips::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td>Edit - Bar menu</td>
-</tr>
-<tr>
- <td>mouseOut</td>
- <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarToolTips::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/uitest/src/com/vaadin/tests/components/menubar/MenuBarTooltipsNearEdge.java b/uitest/src/com/vaadin/tests/components/menubar/MenuBarTooltipsNearEdge.java
new file mode 100644
index 0000000000..4e42d97925
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/menubar/MenuBarTooltipsNearEdge.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.menubar;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Alignment;
+import com.vaadin.ui.Component;
+import com.vaadin.ui.MenuBar;
+import com.vaadin.ui.MenuBar.Command;
+import com.vaadin.ui.MenuBar.MenuItem;
+import com.vaadin.ui.VerticalLayout;
+
+/**
+ * Test to see if tooltips will render in the correct locations near the edges.
+ *
+ * @author Vaadin Ltd
+ */
+public class MenuBarTooltipsNearEdge extends AbstractTestUI {
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#setup(com.vaadin.server.
+ * VaadinRequest)
+ */
+ @Override
+ protected void setup(VaadinRequest request) {
+ VerticalLayout vlayout = new VerticalLayout();
+ vlayout.setSizeFull();
+ vlayout.addComponent(buildMenu("Menu"));
+ vlayout.setComponentAlignment(vlayout.getComponent(0),
+ Alignment.BOTTOM_RIGHT);
+ setContent(vlayout);
+
+ getTooltipConfiguration().setOpenDelay(0);
+ getTooltipConfiguration().setQuickOpenDelay(0);
+ getTooltipConfiguration().setCloseTimeout(1000);
+
+ }
+
+ private Component buildMenu(String label) {
+ MenuBar menu = new MenuBar();
+ MenuItem item = menu.addItem(label, null);
+
+ item.addItem("Item 1", null).setDescription("TOOLTIP 1");
+ item.addItem("Item 2", null).setDescription("TOOLTIP 2");
+ item.addItem("Item 3", null).setDescription("TOOLTIP 3");
+ item.addItem("Item 4", null).setDescription("TOOLTIP 4");
+
+ return menu;
+ }
+
+ private Command buildCommand() {
+ Command command = new Command() {
+
+ @Override
+ public void menuSelected(MenuItem selectedItem) {
+
+ }
+ };
+ return command;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTestDescription()
+ */
+ @Override
+ protected String getTestDescription() {
+ return "Menu item tooltips should not abscure other menu items";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTicketNumber()
+ */
+ @Override
+ protected Integer getTicketNumber() {
+ return 12870;
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/components/menubar/MenuBarTooltipsNearEdgeTest.java b/uitest/src/com/vaadin/tests/components/menubar/MenuBarTooltipsNearEdgeTest.java
new file mode 100644
index 0000000000..3cfe30a991
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/menubar/MenuBarTooltipsNearEdgeTest.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.menubar;
+
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.lessThan;
+import static org.junit.Assert.assertThat;
+
+import java.util.List;
+
+import org.junit.Test;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.interactions.HasInputDevices;
+import org.openqa.selenium.interactions.Mouse;
+import org.openqa.selenium.interactions.internal.Coordinates;
+import org.openqa.selenium.internal.Locatable;
+import org.openqa.selenium.remote.DesiredCapabilities;
+
+import com.vaadin.testbench.elements.MenuBarElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+/**
+ * Test to see if tooltips will render in the correct locations near the edges.
+ *
+ * @author Vaadin Ltd
+ */
+public class MenuBarTooltipsNearEdgeTest extends MultiBrowserTest {
+
+ @Override
+ public List<DesiredCapabilities> getBrowsersToTest() {
+ // Tooltip tests work unreliably on IE due to an issue with the
+ // WebDriver (see #13854)
+ List<DesiredCapabilities> browsers = super.getBrowsersToTest();
+ browsers.remove(Browser.IE8.getDesiredCapabilities());
+ return browsers;
+ };
+
+ @Test
+ public void testTooltipLocation() {
+ openTestURL();
+ Mouse mouse = ((HasInputDevices) getDriver()).getMouse();
+ WebElement menu = $(MenuBarElement.class).first().getWrappedElement();
+ Coordinates menuLocation = ((Locatable) menu).getCoordinates();
+ mouse.click(menuLocation);
+ mouse.mouseMove(menuLocation, 5, -40);
+ WebElement tooltip = getTooltipElement();
+ assertThat(tooltip.getLocation().x, is(lessThan(menuLocation.onPage().x
+ - tooltip.getSize().getWidth())));
+
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/components/menubar/MenuTooltip.java b/uitest/src/com/vaadin/tests/components/menubar/MenuTooltip.java
new file mode 100644
index 0000000000..2c9d43290f
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/menubar/MenuTooltip.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.menubar;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Component;
+import com.vaadin.ui.MenuBar;
+import com.vaadin.ui.MenuBar.Command;
+import com.vaadin.ui.MenuBar.MenuItem;
+
+/**
+ * Test to see if tooltips on menu items obscure other items on the menu.
+ *
+ * @author Vaadin Ltd
+ */
+public class MenuTooltip extends AbstractTestUI {
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#setup(com.vaadin.server.
+ * VaadinRequest)
+ */
+ @Override
+ protected void setup(VaadinRequest request) {
+
+ addComponent(buildMenu());
+
+ getTooltipConfiguration().setOpenDelay(2000);
+
+ }
+
+ private Component buildMenu() {
+ MenuBar menu = new MenuBar();
+ MenuItem item = menu.addItem("Menu", null);
+
+ item.addItem("Item 1", null).setDescription("TOOLTIP 1");
+ item.addItem("Item 2", null).setDescription("TOOLTIP 2");
+ item.addItem("Item 3", null).setDescription("TOOLTIP 3");
+ item.addItem("Item 4", null).setDescription("TOOLTIP 4");
+
+ return menu;
+ }
+
+ private Command buildCommand() {
+ Command command = new Command() {
+
+ @Override
+ public void menuSelected(MenuItem selectedItem) {
+
+ }
+ };
+ return command;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTestDescription()
+ */
+ @Override
+ protected String getTestDescription() {
+ return "Menu item tooltips should not abscure other menu items";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTicketNumber()
+ */
+ @Override
+ protected Integer getTicketNumber() {
+ return 13914;
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/components/menubar/MenuTooltipTest.java b/uitest/src/com/vaadin/tests/components/menubar/MenuTooltipTest.java
new file mode 100644
index 0000000000..bb8f87daaa
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/menubar/MenuTooltipTest.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.menubar;
+
+import static org.hamcrest.Matchers.greaterThan;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.lessThan;
+import static org.junit.Assert.assertThat;
+
+import java.util.List;
+
+import org.junit.Test;
+import org.openqa.selenium.interactions.HasInputDevices;
+import org.openqa.selenium.interactions.Mouse;
+import org.openqa.selenium.interactions.internal.Coordinates;
+import org.openqa.selenium.remote.DesiredCapabilities;
+
+import com.vaadin.testbench.elements.MenuBarElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+/**
+ * Test to see if tooltips on menu items obscure other items on the menu.
+ *
+ * @author Vaadin Ltd
+ */
+public class MenuTooltipTest extends MultiBrowserTest {
+
+ @Override
+ public List<DesiredCapabilities> getBrowsersToTest() {
+ return getBrowsersExcludingIE();
+ }
+
+ @Test
+ public void testToolTipDelay() throws InterruptedException {
+ openTestURL();
+
+ Coordinates elementCoordinates = getCoordinates($(MenuBarElement.class).first());
+
+ Mouse mouse = ((HasInputDevices) getDriver()).getMouse();
+
+ mouse.click(elementCoordinates);
+ mouse.mouseMove(elementCoordinates, 15, 40);
+
+ sleep(1000);
+
+ assertThat(getTooltipElement().getLocation().getX(),
+ is(lessThan(-1000)));
+
+ sleep(3000);
+
+ assertThat(getTooltipElement().getLocation().getX(),
+ is(greaterThan(elementCoordinates.onPage().getX())));
+ assertThat(getTooltipElement().getText(), is("TOOLTIP 1"));
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/components/menubar/SpaceMenuBarNavigationTest.java b/uitest/src/com/vaadin/tests/components/menubar/SpaceMenuBarNavigationTest.java
index 3e0053d0d1..a32a611d9a 100644
--- a/uitest/src/com/vaadin/tests/components/menubar/SpaceMenuBarNavigationTest.java
+++ b/uitest/src/com/vaadin/tests/components/menubar/SpaceMenuBarNavigationTest.java
@@ -1,12 +1,12 @@
/*
* Copyright 2000-2014 Vaadin Ltd.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -23,10 +23,11 @@ import org.openqa.selenium.Keys;
import org.openqa.selenium.WebElement;
import com.vaadin.testbench.By;
+import com.vaadin.testbench.elements.MenuBarElement;
import com.vaadin.tests.tb3.MultiBrowserTest;
/**
- *
+ *
* @since 7.2
* @author Vaadin Ltd
*/
@@ -36,19 +37,21 @@ public class SpaceMenuBarNavigationTest extends MultiBrowserTest {
public void testEnableParentLayout() {
openTestURL();
- WebElement menu = driver.findElement(By.className("menu-bar"));
+ MenuBarElement menu = $(MenuBarElement.class).get(0);
+ menu.focus();
menu.sendKeys(Keys.ARROW_RIGHT);
- menu.sendKeys(Keys.SPACE);
+ menu.sendKeys(Keys.ENTER);
List<WebElement> captions = driver.findElements(By
.className("v-menubar-menuitem-caption"));
boolean found = false;
+
for (WebElement caption : captions) {
if ("subitem".equals(caption.getText())) {
found = true;
}
}
- Assert.assertTrue("Sub menu is not opened on SPACE key", found);
+ Assert.assertTrue("Sub menu is not opened on ENTER key", found);
menu.sendKeys(Keys.SPACE);
diff --git a/uitest/src/com/vaadin/tests/components/orderedlayout/CaptionLeak.java b/uitest/src/com/vaadin/tests/components/orderedlayout/CaptionLeak.java
index 7d347d6180..c715aa383a 100644
--- a/uitest/src/com/vaadin/tests/components/orderedlayout/CaptionLeak.java
+++ b/uitest/src/com/vaadin/tests/components/orderedlayout/CaptionLeak.java
@@ -1,13 +1,13 @@
package com.vaadin.tests.components.orderedlayout;
import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
import com.vaadin.ui.Button;
import com.vaadin.ui.ComponentContainer;
import com.vaadin.ui.CssLayout;
-import com.vaadin.ui.Label;
+import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Panel;
import com.vaadin.ui.TextField;
-import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
/**
@@ -17,23 +17,32 @@ import com.vaadin.ui.VerticalLayout;
* @since 7.1.13
* @author Vaadin Ltd
*/
-public class CaptionLeak extends UI {
-
- public static final String USAGE = "Open this UI with ?debug and count"
- + " measured non-connector elements after setting leaky and non leaky"
- + " content.";
+public class CaptionLeak extends AbstractTestUI {
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#setup(com.vaadin.server.
+ * VaadinRequest)
+ */
@Override
- public void init(VaadinRequest req) {
- final VerticalLayout root = new VerticalLayout();
- setContent(root);
- Label usage = new Label(USAGE);
+ protected void setup(VaadinRequest request) {
+ VerticalLayout root = new VerticalLayout();
+ root.setSizeFull();
+ root.setMargin(false);
+ root.setSpacing(false);
+
+ HorizontalLayout layout = new HorizontalLayout();
Panel parent = new Panel();
Button setLeakyContent = makeButton("Set leaky content", parent,
VerticalLayout.class);
Button setNonLeakyContent = makeButton("Set non leaky content", parent,
CssLayout.class);
- root.addComponents(usage, setLeakyContent, setNonLeakyContent, parent);
+ layout.addComponent(setLeakyContent);
+ layout.addComponent(setNonLeakyContent);
+ root.addComponent(layout);
+ root.addComponent(parent);
+ setContent(root);
}
private Button makeButton(String caption, final Panel parent,
@@ -59,4 +68,24 @@ public class CaptionLeak extends UI {
return btn;
}
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTestDescription()
+ */
+ @Override
+ protected String getTestDescription() {
+ return "Open this UI with ?debug and count measured non-connector elements after setting leaky and non leaky content.";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTicketNumber()
+ */
+ @Override
+ protected Integer getTicketNumber() {
+ return null;
+ }
+
}
diff --git a/uitest/src/com/vaadin/tests/components/orderedlayout/CaptionLeakTest.java b/uitest/src/com/vaadin/tests/components/orderedlayout/CaptionLeakTest.java
index 0fbd0e5f69..a95ceca22b 100644
--- a/uitest/src/com/vaadin/tests/components/orderedlayout/CaptionLeakTest.java
+++ b/uitest/src/com/vaadin/tests/components/orderedlayout/CaptionLeakTest.java
@@ -18,6 +18,7 @@ package com.vaadin.tests.components.orderedlayout;
import org.junit.Test;
import org.openqa.selenium.By;
+import com.vaadin.testbench.elements.ButtonElement;
import com.vaadin.tests.tb3.MultiBrowserTest;
public class CaptionLeakTest extends MultiBrowserTest {
@@ -26,43 +27,53 @@ public class CaptionLeakTest extends MultiBrowserTest {
public void testCaptionLeak() throws Exception {
setDebug(true);
openTestURL();
- openDebugLogTab();
+
+ openLog();
// this should be present
// 3 general non-connector elements, none accumulated on click
- getDriver()
- .findElement(
- By.xpath("//span[text() = 'Measured 3 non connector elements']"));
+ checkConnectorCount();
- getDriver().findElement(By.xpath("//button[@title = 'Clear log']"))
- .click();
- getDriver().findElement(By.id("Set leaky content")).click();
+ clearLog();
- getDriver()
- .findElement(
- By.xpath("//span[text() = 'Measured 3 non connector elements']"));
+ $(ButtonElement.class).caption("Set leaky content").first().click();
+
+ checkConnectorCount();
// nothing accumulates over clicks
- getDriver().findElement(By.xpath("//button[@title = 'Clear log']"))
- .click();
- getDriver().findElement(By.id("Set leaky content")).click();
- getDriver()
- .findElement(
- By.xpath("//span[text() = 'Measured 3 non connector elements']"));
+ clearLog();
+
+ $(ButtonElement.class).caption("Set leaky content").first().click();
+ checkConnectorCount();
}
@Test
public void testNoCaptionLeak() throws Exception {
setDebug(true);
openTestURL();
+
+ openLog();
+
+ clearLog();
+ $(ButtonElement.class).caption("Set non leaky content").first().click();
+ // this should be present
+ // 3 general non-connector elements, none accumulated on click
+ checkConnectorCount();
+ }
+
+ private void openLog() {
openDebugLogTab();
+ if (BrowserUtil.isIE8(getDesiredCapabilities())) {
+ openDebugLogTab();
+ }
+ }
+ private void clearLog() {
getDriver().findElement(By.xpath("//button[@title = 'Clear log']"))
.click();
- getDriver().findElement(By.id("Set non leaky content")).click();
+ }
- // this should be present
- // 3 general non-connector elements, none accumulated on click
+ private void checkConnectorCount() {
getDriver()
.findElement(
By.xpath("//span[text() = 'Measured 3 non connector elements']"));
diff --git a/uitest/src/com/vaadin/tests/components/orderedlayout/TooltipOnRequiredIndicator.java b/uitest/src/com/vaadin/tests/components/orderedlayout/TooltipOnRequiredIndicator.java
new file mode 100644
index 0000000000..233049b0ba
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/orderedlayout/TooltipOnRequiredIndicator.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+/**
+ *
+ */
+package com.vaadin.tests.components.orderedlayout;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.TextField;
+import com.vaadin.ui.VerticalLayout;
+
+public class TooltipOnRequiredIndicator extends AbstractTestUI {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#setup(com.vaadin.server.
+ * VaadinRequest)
+ */
+ @Override
+ protected void setup(VaadinRequest request) {
+ VerticalLayout layout = new VerticalLayout();
+
+ TextField inVertical = new TextField();
+ inVertical.setRequired(true);
+ inVertical.setRequiredError("Vertical layout tooltip");
+ inVertical.setCaption("Vertical layout caption");
+ inVertical.setId("verticalField");
+
+ layout.addComponent(inVertical);
+ addComponent(layout);
+
+ HorizontalLayout horizontalLayout = new HorizontalLayout();
+
+ TextField inHorizontal = new TextField();
+ inHorizontal.setRequired(true);
+ inHorizontal.setRequiredError("Horizontal layout tooltip");
+ inHorizontal.setCaption("Horizontal layout caption");
+ inHorizontal.setId("horizontalField");
+
+ horizontalLayout.addComponent(inHorizontal);
+ layout.addComponent(horizontalLayout);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTestDescription()
+ */
+ @Override
+ protected String getTestDescription() {
+ return "Show tooltip for caption and required indicator";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTicketNumber()
+ */
+ @Override
+ protected Integer getTicketNumber() {
+ return 10046;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/orderedlayout/TooltipOnRequiredIndicatorTest.java b/uitest/src/com/vaadin/tests/components/orderedlayout/TooltipOnRequiredIndicatorTest.java
new file mode 100644
index 0000000000..815c00bfac
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/orderedlayout/TooltipOnRequiredIndicatorTest.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.orderedlayout;
+
+import org.junit.Test;
+import org.openqa.selenium.By;
+
+import com.vaadin.testbench.elements.HorizontalLayoutElement;
+import com.vaadin.testbench.elements.VerticalLayoutElement;
+import com.vaadin.tests.tb3.TooltipTest;
+
+public class TooltipOnRequiredIndicatorTest extends TooltipTest {
+
+ @Test
+ public void testTooltipOnRequiredIndicator() throws Exception {
+ openTestURL();
+
+ // gwt-uid-* are not stable across browsers etc. so need to look them up
+
+ // caption
+ checkTooltip(
+ $(VerticalLayoutElement.class).get(1).findElement(
+ By.className("v-captiontext")),
+ "Vertical layout tooltip");
+ // required indicator
+ checkTooltip(By.className("v-required-field-indicator"),
+ "Vertical layout tooltip");
+
+ // caption
+ checkTooltip(
+ $(HorizontalLayoutElement.class).first().findElement(
+ By.className("v-captiontext")),
+ "Horizontal layout tooltip");
+ // required indicator
+ checkTooltip(
+ $(HorizontalLayoutElement.class).first().findElement(
+ By.className("v-required-field-indicator")),
+ "Horizontal layout tooltip");
+ }
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/components/richtextarea/RichTextAreaRelativeHeightResize.java b/uitest/src/com/vaadin/tests/components/richtextarea/RichTextAreaRelativeHeightResize.java
new file mode 100644
index 0000000000..870c6cb8cb
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/richtextarea/RichTextAreaRelativeHeightResize.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.richtextarea;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.RichTextArea;
+import com.vaadin.ui.VerticalLayout;
+
+public class RichTextAreaRelativeHeightResize extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ final VerticalLayout layout = new VerticalLayout();
+ layout.setSizeFull();
+ layout.setHeight("300px");
+
+ RichTextArea richTextArea = new RichTextArea();
+ richTextArea.setSizeFull();
+ layout.addComponent(richTextArea);
+
+ addComponent(layout);
+ addComponent(new Button("Increase height", new Button.ClickListener() {
+ @Override
+ public void buttonClick(ClickEvent event) {
+ layout.setHeight("400px");
+ }
+ }));
+
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Tests that a RichTextArea with dynamic height "
+ + "updates its editor elements height on resize";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 11320;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/richtextarea/RichTextAreaRelativeHeightResizeTest.java b/uitest/src/com/vaadin/tests/components/richtextarea/RichTextAreaRelativeHeightResizeTest.java
new file mode 100644
index 0000000000..5c31ce4dc7
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/richtextarea/RichTextAreaRelativeHeightResizeTest.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.richtextarea;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.vaadin.testbench.By;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class RichTextAreaRelativeHeightResizeTest extends MultiBrowserTest {
+
+ @Test
+ public void testCenteredClosingAndPostLayout() {
+ openTestURL();
+
+ int originalHeight = driver
+ .findElement(By.cssSelector(".v-richtextarea")).getSize()
+ .getHeight();
+ int originalEditorHeight = driver
+ .findElement(By.cssSelector(".v-richtextarea iframe"))
+ .getSize().getHeight();
+
+ // Increase the component height
+ driver.findElement(By.cssSelector(".v-button")).click();
+
+ int newHeight = driver.findElement(By.cssSelector(".v-richtextarea"))
+ .getSize().getHeight();
+ int newEditorHeight = driver
+ .findElement(By.cssSelector(".v-richtextarea iframe"))
+ .getSize().getHeight();
+
+ // Check that the component height changed and that the editor height
+ // changed equally as much
+ Assert.assertTrue("RichTextArea height didn't change",
+ newHeight != originalHeight);
+ Assert.assertEquals(
+ "Editor height change didn't match the Component height change",
+ newHeight - originalHeight, newEditorHeight
+ - originalEditorHeight);
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/components/slider/SliderTooltip.html b/uitest/src/com/vaadin/tests/components/slider/SliderTooltip.html
deleted file mode 100644
index 806e7d1b44..0000000000
--- a/uitest/src/com/vaadin/tests/components/slider/SliderTooltip.html
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="http://localhost:8888/" />
-<title>SliderTooltip</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">SliderTooltip</td></tr>
-</thead><tbody>
-<tr>
- <td>open</td>
- <td>/run/com.vaadin.tests.components.slider.SliderTest?debug&amp;restartApplication</td>
- <td></td>
-</tr>
-<tr>
- <td>mouseClick</td>
- <td>vaadin=runcomvaadintestscomponentssliderSliderTest::PID_Smenu#item0</td>
- <td>24,2</td>
-</tr>
-<tr>
- <td>mouseClick</td>
- <td>vaadin=runcomvaadintestscomponentssliderSliderTest::Root/VOverlay[0]/VMenuBar[0]#item1</td>
- <td>35,12</td>
-</tr>
-<tr>
- <td>mouseClick</td>
- <td>vaadin=runcomvaadintestscomponentssliderSliderTest::Root/VOverlay[1]/VMenuBar[0]#item1</td>
- <td>74,3</td>
-</tr>
-<tr>
- <td>mouseClick</td>
- <td>vaadin=runcomvaadintestscomponentssliderSliderTest::Root/VOverlay[2]/VMenuBar[0]#item2</td>
- <td>30,6</td>
-</tr>
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestscomponentssliderSliderTest::PID_StestComponent/domChild[2]/domChild[0]</td>
- <td>0,0</td>
-</tr>
-<tr>
- <td>waitForElementPresent</td>
- <td>vaadin=runcomvaadintestscomponentssliderSliderTest::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentssliderSliderTest::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td>This is a semi-long text that might wrap.</td>
-</tr>
-<tr>
- <td>mouseClick</td>
- <td>vaadin=runcomvaadintestscomponentssliderSliderTest::/VVerticalLayout[0]/ChildComponentContainer[0]/VLabel[0]</td>
- <td>40,16</td>
-</tr>
-<tr>
- <td>pause</td>
- <td></td>
- <td>1000</td>
-</tr>
-<tr>
- <td>assertElementPositionLeft</td>
- <td>vaadin=runcomvaadintestscomponentssliderSliderTest::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td>-1000</td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/uitest/src/com/vaadin/tests/components/splitpanel/SplitPanelMoveComponent.java b/uitest/src/com/vaadin/tests/components/splitpanel/SplitPanelMoveComponent.java
new file mode 100644
index 0000000000..b788b568c2
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/splitpanel/SplitPanelMoveComponent.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.splitpanel;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.HorizontalSplitPanel;
+
+public class SplitPanelMoveComponent extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ final HorizontalSplitPanel split = new HorizontalSplitPanel();
+ split.setHeight("200px");
+ final Button targetComponent = new Button(
+ "Button in splitpanel. Click to move to the other side");
+ split.setFirstComponent(targetComponent);
+
+ targetComponent.addClickListener(new ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ if (split.getFirstComponent() != null) {
+ split.setFirstComponent(null);
+ split.setSecondComponent(targetComponent);
+ } else {
+ split.setSecondComponent(null);
+ split.setFirstComponent(targetComponent);
+
+ }
+ }
+
+ });
+
+ addComponent(split);
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Fail to swap components in HorizontalSplitPanel";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 11920;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/splitpanel/SplitPanelMoveComponentTest.java b/uitest/src/com/vaadin/tests/components/splitpanel/SplitPanelMoveComponentTest.java
new file mode 100644
index 0000000000..1bf5212185
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/splitpanel/SplitPanelMoveComponentTest.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.splitpanel;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class SplitPanelMoveComponentTest extends MultiBrowserTest {
+
+ private static final String BUTTON_TEXT = "Button in splitpanel. Click to move to the other side";
+
+ @Test
+ public void moveComponent() {
+ openTestURL();
+ Assert.assertEquals(BUTTON_TEXT, getFirstChild().getText());
+ getFirstChild().click();
+ Assert.assertEquals(BUTTON_TEXT, getSecondChild().getText());
+ getSecondChild().click();
+ Assert.assertEquals(BUTTON_TEXT, getFirstChild().getText());
+ }
+
+ private WebElement getFirstChild() {
+ WebElement container = getDriver()
+ .findElement(
+ By.xpath("//div[contains(@class,'v-splitpanel-first-container')]"));
+ return container.findElement(By
+ .xpath("//div[contains(@class, 'v-button')]"));
+ }
+
+ private WebElement getSecondChild() {
+ WebElement container = getDriver()
+ .findElement(
+ By.xpath("//div[contains(@class,'v-splitpanel-second-container')]"));
+ return container.findElement(By
+ .xpath("//div[contains(@class, 'v-button')]"));
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/table/SelectAllConstantViewport.java b/uitest/src/com/vaadin/tests/components/table/SelectAllConstantViewport.java
new file mode 100644
index 0000000000..5a406eac48
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/table/SelectAllConstantViewport.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.table;
+
+import com.vaadin.data.Property.ValueChangeListener;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUIWithLog;
+import com.vaadin.ui.CheckBox;
+import com.vaadin.ui.CssLayout;
+import com.vaadin.ui.Table;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class SelectAllConstantViewport extends AbstractTestUIWithLog {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#setup(com.vaadin.server.
+ * VaadinRequest)
+ */
+ @Override
+ protected void setup(VaadinRequest request) {
+
+ final Table table = new Table();
+ table.addContainerProperty("", Integer.class, null);
+ table.setSizeFull();
+ table.setMultiSelect(true);
+ table.setNullSelectionAllowed(true);
+ table.setSelectable(true);
+
+ CheckBox selectAllCheckbox = new CheckBox("Select All");
+ selectAllCheckbox.addValueChangeListener(new ValueChangeListener() {
+ @Override
+ public void valueChange(
+ com.vaadin.data.Property.ValueChangeEvent event) {
+ Object checked = event.getProperty().getValue();
+ if (checked instanceof Boolean) {
+ if (((Boolean) checked).booleanValue()) {
+ table.setValue(table.getItemIds());
+ } else {
+ table.setValue(null);
+ }
+ }
+ }
+ });
+
+ for (int i = 0; i < 200; i++) {
+ table.addItem(new Object[] { new Integer(i) }, new Integer(i));
+ }
+
+ table.setCurrentPageFirstItemIndex(185);
+
+ final CssLayout layout = new CssLayout();
+ layout.addComponent(selectAllCheckbox);
+ layout.addComponent(table);
+ layout.setSizeFull();
+ addComponent(layout);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTestDescription()
+ */
+ @Override
+ protected String getTestDescription() {
+
+ return "The scroll position of a table with many items should remain constant if all items are selected.";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTicketNumber()
+ */
+ @Override
+ protected Integer getTicketNumber() {
+ return 13341;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/table/SelectAllConstantViewportTest.java b/uitest/src/com/vaadin/tests/components/table/SelectAllConstantViewportTest.java
new file mode 100644
index 0000000000..0e7a7c08a4
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/table/SelectAllConstantViewportTest.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.table;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import java.io.IOException;
+
+import org.junit.Test;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.ExpectedCondition;
+
+import com.vaadin.testbench.By;
+import com.vaadin.testbench.elements.CheckBoxElement;
+import com.vaadin.testbench.elements.TableElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class SelectAllConstantViewportTest extends MultiBrowserTest {
+
+ @Test
+ public void testViewportUnchanged() throws IOException {
+ openTestURL();
+
+ CheckBoxElement checkbox = $(CheckBoxElement.class).first();
+
+ WebElement row = $(TableElement.class).first().getCell(190, 0);
+ final WebElement scrollPositionDisplay = getDriver().findElement(
+ By.className("v-table-scrollposition"));
+ waitUntilNot(new ExpectedCondition<Boolean>() {
+
+ @Override
+ public Boolean apply(WebDriver input) {
+ return scrollPositionDisplay.isDisplayed();
+ }
+ }, 10);
+
+ int rowLocation = row.getLocation().getY();
+
+ // use click x,y with non-zero offset to actually toggle the checkbox. (#13763)
+ checkbox.click(5, 5);
+ int newRowLocation = row.getLocation().getY();
+
+ assertThat(newRowLocation, is(rowLocation));
+
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/components/table/TableItemDescriptionGeneratorTest.html b/uitest/src/com/vaadin/tests/components/table/TableItemDescriptionGeneratorTest.html
index 2df9fb678c..4c2dec9784 100644
--- a/uitest/src/com/vaadin/tests/components/table/TableItemDescriptionGeneratorTest.html
+++ b/uitest/src/com/vaadin/tests/components/table/TableItemDescriptionGeneratorTest.html
@@ -46,7 +46,7 @@
<tr>
<td>assertElementPositionLeft</td>
<td>vaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]</td>
- <td>-1000</td>
+ <td>-5000</td>
</tr>
<!--Button tooltip-->
<tr>
@@ -77,7 +77,7 @@
<tr>
<td>assertElementPositionLeft</td>
<td>vaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]</td>
- <td>-1000</td>
+ <td>-5000</td>
</tr>
<!--TextField tooltip-->
<tr>
@@ -108,7 +108,7 @@
<tr>
<td>assertElementPositionLeft</td>
<td>vaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]</td>
- <td>-1000</td>
+ <td>-5000</td>
</tr>
<!--Cell and row tooltips-->
<tr>
@@ -145,7 +145,7 @@
<tr>
<td>assertElementPositionLeft</td>
<td>vaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]</td>
- <td>-1000</td>
+ <td>-5000</td>
</tr>
<!--Button tooltip-->
<tr>
@@ -176,7 +176,7 @@
<tr>
<td>assertElementPositionLeft</td>
<td>vaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]</td>
- <td>-1000</td>
+ <td>-5000</td>
</tr>
<!--TextField tooltip-->
<tr>
@@ -207,7 +207,7 @@
<tr>
<td>assertElementPositionLeft</td>
<td>vaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]</td>
- <td>-1000</td>
+ <td>-5000</td>
</tr>
<!--Row and Component tooltips-->
<tr>
@@ -249,7 +249,7 @@
<tr>
<td>assertElementPositionLeft</td>
<td>vaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]</td>
- <td>-1000</td>
+ <td>-5000</td>
</tr>
<!--Button tooltip-->
<tr>
@@ -280,7 +280,7 @@
<tr>
<td>assertElementPositionLeft</td>
<td>vaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]</td>
- <td>-1000</td>
+ <td>-5000</td>
</tr>
<!--TextField tooltip-->
<tr>
@@ -311,7 +311,7 @@
<tr>
<td>assertElementPositionLeft</td>
<td>vaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]</td>
- <td>-1000</td>
+ <td>-5000</td>
</tr>
<!--Row tooltips-->
<tr>
@@ -348,7 +348,7 @@
<tr>
<td>assertElementPositionLeft</td>
<td>vaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]</td>
- <td>-1000</td>
+ <td>-5000</td>
</tr>
<!--Button tooltip-->
<tr>
@@ -379,7 +379,7 @@
<tr>
<td>assertElementPositionLeft</td>
<td>vaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]</td>
- <td>-1000</td>
+ <td>-5000</td>
</tr>
<!--TextField tooltip-->
<tr>
@@ -410,7 +410,7 @@
<tr>
<td>assertElementPositionLeft</td>
<td>vaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]</td>
- <td>-1000</td>
+ <td>-5000</td>
</tr>
</tbody></table>
diff --git a/uitest/src/com/vaadin/tests/components/table/TableWithPollingTest.java b/uitest/src/com/vaadin/tests/components/table/TableWithPollingTest.java
index 6aae1e27fc..3e12333a6d 100644
--- a/uitest/src/com/vaadin/tests/components/table/TableWithPollingTest.java
+++ b/uitest/src/com/vaadin/tests/components/table/TableWithPollingTest.java
@@ -24,6 +24,7 @@ import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.remote.DesiredCapabilities;
+import com.vaadin.testbench.elements.TableElement;
import com.vaadin.tests.tb3.MultiBrowserTest;
public class TableWithPollingTest extends MultiBrowserTest {
@@ -32,25 +33,54 @@ public class TableWithPollingTest extends MultiBrowserTest {
public void testColumnResizing() throws Exception {
openTestURL();
- WebElement headerCell = driver.findElement(By
- .xpath("(//td[contains(@class, 'v-table-header-cell')])[1]"));
- WebElement bodyCell = driver.findElement(By
- .xpath("(//td[contains(@class, 'v-table-cell-content')])[1]"));
- WebElement resizer = driver.findElement(By
- .xpath("(//div[contains(@class, 'v-table-resizer')])[1]"));
+ int offset = -20;
+ int headerCellWidth = getHeaderCell(0).getSize().width;
+ int bodyCellWidth = getBodyCell(0).getSize().width;
- final int offset = 50;
- final int headerCellWidth = headerCell.getSize().width;
- final int bodyCellWidth = bodyCell.getSize().width;
+ resizeColumn(0, offset);
- new Actions(driver).clickAndHold(resizer).moveByOffset(offset, 0)
- .perform();
+ assertHeaderCellWidth(0, headerCellWidth + offset);
+ assertBodyCellWidth(0, bodyCellWidth + offset);
+
+ offset = 50;
+ headerCellWidth = getHeaderCell(1).getSize().width;
+ bodyCellWidth = getBodyCell(1).getSize().width;
+
+ resizeColumn(1, offset);
+
+ assertHeaderCellWidth(1, headerCellWidth + offset);
+ assertBodyCellWidth(1, bodyCellWidth + offset);
+
+ }
+
+ private WebElement getHeaderCell(int column) {
+ return $(TableElement.class).get(0).getHeaderCell(column);
+ }
+
+ private WebElement getBodyCell(int column) {
+ return $(TableElement.class).get(0).getCell(0, column);
+ }
+
+ private WebElement getColumnResizer(int column) {
+ return getHeaderCell(column).findElement(
+ By.className("v-table-resizer"));
+ }
+
+ private void resizeColumn(int column, int by) throws InterruptedException {
+ new Actions(driver).clickAndHold(getColumnResizer(column))
+ .moveByOffset(by, 0).perform();
sleep(2000);
new Actions(driver).release().perform();
+ }
+
+ private void assertHeaderCellWidth(int column, int width)
+ throws AssertionError {
+ Assert.assertEquals(width, getHeaderCell(column).getSize().width);
+ }
- Assert.assertEquals(headerCellWidth + offset,
- headerCell.getSize().width);
- Assert.assertEquals(bodyCellWidth + offset, bodyCell.getSize().width);
+ private void assertBodyCellWidth(int column, int width)
+ throws AssertionError {
+ Assert.assertEquals(width, getBodyCell(column).getSize().width);
}
@Override
diff --git a/uitest/src/com/vaadin/tests/components/ui/TooltipConfiguration.html b/uitest/src/com/vaadin/tests/components/ui/TooltipConfiguration.html
deleted file mode 100644
index 338e4a2c5b..0000000000
--- a/uitest/src/com/vaadin/tests/components/ui/TooltipConfiguration.html
+++ /dev/null
@@ -1,146 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="http://localhost:8888/" />
-<title>TooltipConfiguration</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">TooltipConfiguration</td></tr>
-</thead><tbody>
-<tr>
- <td>open</td>
- <td>/run/com.vaadin.tests.components.ui.TooltipConfiguration?restartApplication</td>
- <td></td>
-</tr>
-<!--Short close delay-->
-<tr>
- <td>type</td>
- <td>vaadin=runcomvaadintestscomponentsuiTooltipConfiguration::PID_SClose timeout</td>
- <td>0</td>
-</tr>
-<tr>
- <td>mouseMoveAt</td>
- <td>vaadin=runcomvaadintestscomponentsuiTooltipConfiguration::PID_SshortTooltip</td>
- <td>0,0</td>
-</tr>
-<tr>
- <td>waitForElementPresent</td>
- <td>vaadin=runcomvaadintestscomponentsuiTooltipConfiguration::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsuiTooltipConfiguration::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td>This is a short tooltip</td>
-</tr>
-<tr>
- <td>mouseClick</td>
- <td>vaadin=runcomvaadintestscomponentsuiTooltipConfiguration::</td>
- <td></td>
-</tr>
-<tr>
- <td>assertElementPositionLeft</td>
- <td>vaadin=runcomvaadintestscomponentsuiTooltipConfiguration::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td>-1000</td>
-</tr>
-<!--Long close delay-->
-<tr>
- <td>type</td>
- <td>vaadin=runcomvaadintestscomponentsuiTooltipConfiguration::PID_SClose timeout</td>
- <td>3000</td>
-</tr>
-<tr>
- <td>mouseMoveAt</td>
- <td>vaadin=runcomvaadintestscomponentsuiTooltipConfiguration::</td>
- <td>0,0</td>
-</tr>
-<tr>
- <td>mouseMoveAt</td>
- <td>vaadin=runcomvaadintestscomponentsuiTooltipConfiguration::PID_SshortTooltip</td>
- <td>0,0</td>
-</tr>
-<tr>
- <td>waitForElementPresent</td>
- <td>vaadin=runcomvaadintestscomponentsuiTooltipConfiguration::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestscomponentsuiTooltipConfiguration::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td>This is a short tooltip</td>
-</tr>
-<tr>
- <td>mouseClick</td>
- <td>vaadin=runcomvaadintestscomponentsuiTooltipConfiguration::</td>
- <td></td>
-</tr>
-<tr>
- <td>assertElementPresent</td>
- <td>vaadin=runcomvaadintestscomponentsuiTooltipConfiguration::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td></td>
-</tr>
-<tr>
- <td>mouseClick</td>
- <td>vaadin=runcomvaadintestscomponentsuiTooltipConfiguration::PID_SClose timeout</td>
- <td>60,9</td>
-</tr>
-<tr>
- <td>type</td>
- <td>vaadin=runcomvaadintestscomponentsuiTooltipConfiguration::PID_SClose timeout</td>
- <td>0</td>
-</tr>
-<!--Max width 500-->
-<tr>
- <td>mouseMoveAt</td>
- <td>vaadin=runcomvaadintestscomponentsuiTooltipConfiguration::PID_SlongTooltip</td>
- <td>0,0</td>
-</tr>
-<tr>
- <td>waitForElementPresent</td>
- <td>vaadin=runcomvaadintestscomponentsuiTooltipConfiguration::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertElementWidth</td>
- <td>vaadin=runcomvaadintestscomponentsuiTooltipConfiguration::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td>500</td>
-</tr>
-<tr>
- <td>mouseClick</td>
- <td>vaadin=runcomvaadintestscomponentsuiTooltipConfiguration::</td>
- <td></td>
-</tr>
-<!--Max width 100-->
-<tr>
- <td>type</td>
- <td>vaadin=runcomvaadintestscomponentsuiTooltipConfiguration::PID_SMax width</td>
- <td>100</td>
-</tr>
-<tr>
- <td>mouseMoveAt</td>
- <td>vaadin=runcomvaadintestscomponentsuiTooltipConfiguration::</td>
- <td>0,0</td>
-</tr>
-<tr>
- <td>mouseMoveAt</td>
- <td>vaadin=runcomvaadintestscomponentsuiTooltipConfiguration::PID_SlongTooltip</td>
- <td>0,0</td>
-</tr>
-<tr>
- <td>waitForElementPresent</td>
- <td>vaadin=runcomvaadintestscomponentsuiTooltipConfiguration::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertElementWidth</td>
- <td>vaadin=runcomvaadintestscomponentsuiTooltipConfiguration::Root/VTooltip[0]/FlowPanel[0]/domChild[1]</td>
- <td>100</td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/uitest/src/com/vaadin/tests/components/upload/TestFileUploadTest.java b/uitest/src/com/vaadin/tests/components/upload/TestFileUploadTest.java
new file mode 100644
index 0000000000..1887427a72
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/upload/TestFileUploadTest.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.upload;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.math.BigInteger;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.internal.WrapsElement;
+import org.openqa.selenium.remote.DesiredCapabilities;
+import org.openqa.selenium.remote.LocalFileDetector;
+import org.openqa.selenium.remote.RemoteWebElement;
+
+import com.vaadin.testbench.elements.UploadElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class TestFileUploadTest extends MultiBrowserTest {
+
+ @Override
+ public List<DesiredCapabilities> getBrowsersToTest() {
+ // PhantomJS fails to upload files for unknown reasons
+ List<DesiredCapabilities> b = super.getBrowsersToTest();
+ b.remove(Browser.PHANTOMJS.getDesiredCapabilities());
+ return b;
+ }
+
+ @Test
+ public void testUploadAnyFile() throws Exception {
+ openTestURL();
+
+ File tempFile = createTempFile();
+ fillPathToUploadInput(tempFile.getPath());
+
+ getSubmitButton().click();
+
+ String expected = String.format(
+ "1. Upload finished. Name: %s, Size: %s, md5: %s",
+ tempFile.getName(), getTempFileContents().length(),
+ md5(getTempFileContents()));
+
+ String actual = getLogRow(0);
+ Assert.assertEquals("Upload log row does not match expected", expected,
+ actual);
+ }
+
+ private String md5(String string) throws NoSuchAlgorithmException {
+ byte[] digest = MessageDigest.getInstance("MD5").digest(
+ string.getBytes());
+ BigInteger bigInt = new BigInteger(1, digest);
+ String hashtext = bigInt.toString(16);
+ return hashtext;
+ }
+
+ /**
+ * @return The generated temp file handle
+ * @throws IOException
+ */
+ private File createTempFile() throws IOException {
+ File tempFile = File.createTempFile("TestFileUpload", ".txt");
+ BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
+ writer.write(getTempFileContents());
+ writer.close();
+ tempFile.deleteOnExit();
+ return tempFile;
+ }
+
+ private String getTempFileContents() {
+ return "This is a test file!\nRow 2\nRow3";
+ }
+
+ private void fillPathToUploadInput(String tempFileName) throws Exception {
+ // create a valid path in upload input element. Instead of selecting a
+ // file by some file browsing dialog, we use the local path directly.
+ WebElement input = getInput();
+ setLocalFileDetector(input);
+ input.sendKeys(tempFileName);
+ }
+
+ private WebElement getSubmitButton() {
+ UploadElement upload = $(UploadElement.class).first();
+ WebElement submitButton = upload.findElement(By.className("v-button"));
+ return submitButton;
+ }
+
+ private WebElement getInput() {
+ return getDriver().findElement(By.className("gwt-FileUpload"));
+ }
+
+ private void setLocalFileDetector(WebElement element) throws Exception {
+ if (getClass().isAnnotationPresent(RunLocally.class)) {
+ return;
+ }
+
+ if (element instanceof WrapsElement) {
+ element = ((WrapsElement) element).getWrappedElement();
+ }
+ if (element instanceof RemoteWebElement) {
+ ((RemoteWebElement) element)
+ .setFileDetector(new LocalFileDetector());
+ } else {
+ throw new IllegalArgumentException(
+ "Expected argument of type RemoteWebElement, received "
+ + element.getClass().getName());
+ }
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/components/window/TooltipInWindowTest.java b/uitest/src/com/vaadin/tests/components/window/TooltipInWindowTest.java
index 06fb659d4a..412fd3049d 100644
--- a/uitest/src/com/vaadin/tests/components/window/TooltipInWindowTest.java
+++ b/uitest/src/com/vaadin/tests/components/window/TooltipInWindowTest.java
@@ -74,10 +74,6 @@ public class TooltipInWindowTest extends MultiBrowserTest {
}
- private WebElement getTooltipElement() {
- return getDriver().findElement(By.className("v-tooltip-text"));
- }
-
private WebElement getTooltipContainerElement() {
return getDriver().findElement(By.className("v-tooltip"));
}
diff --git a/uitest/src/com/vaadin/tests/extensions/ResponsiveWidthAndHeight.java b/uitest/src/com/vaadin/tests/extensions/ResponsiveWidthAndHeight.java
new file mode 100644
index 0000000000..1c3acbec8d
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/extensions/ResponsiveWidthAndHeight.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.tests.extensions;
+
+import com.vaadin.annotations.Theme;
+import com.vaadin.server.Responsive;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.CssLayout;
+import com.vaadin.ui.Label;
+
+@Theme("tests-responsive")
+public class ResponsiveWidthAndHeight extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ CssLayout layout = new CssLayout();
+ layout.addStyleName("width-and-height");
+ layout.setSizeFull();
+ setContent(layout);
+ Responsive.makeResponsive(layout);
+
+ layout.addComponent(new Label(
+ "Resize the browser window in both dimensions to see the background color change."));
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "The CssLayout with both width-range and height-range defined";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 13587;
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/extensions/ResponsiveWidthAndHeightTest.java b/uitest/src/com/vaadin/tests/extensions/ResponsiveWidthAndHeightTest.java
new file mode 100644
index 0000000000..8086457c24
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/extensions/ResponsiveWidthAndHeightTest.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.tests.extensions;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import com.vaadin.testbench.By;
+import com.vaadin.testbench.elements.CssLayoutElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class ResponsiveWidthAndHeightTest extends MultiBrowserTest {
+
+ @Before
+ public void setUp() throws Exception {
+ // We need this in order to ensure that the initial width-range is
+ // width: 600px- and height: 500px-
+ testBench().resizeViewPortTo(1024, 768);
+ }
+
+ @Test
+ public void testWidthAndHeightRanges() throws Exception {
+ openTestURL();
+
+ // IE sometimes has trouble waiting long enough.
+ new WebDriverWait(getDriver(), 30).until(ExpectedConditions
+ .presenceOfElementLocated(By
+ .cssSelector(".v-csslayout-width-and-height")));
+
+ // Verify both width-range and height-range.
+ assertEquals("600px-",
+ $(CssLayoutElement.class).first().getAttribute("width-range"));
+ assertEquals("500px-",
+ $(CssLayoutElement.class).first().getAttribute("height-range"));
+
+ // Resize
+ testBench().resizeViewPortTo(550, 450);
+
+ // Verify updated width-range and height-range.
+ assertEquals("0-599px",
+ $(CssLayoutElement.class).first().getAttribute("width-range"));
+ assertEquals("0-499px",
+ $(CssLayoutElement.class).first().getAttribute("height-range"));
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/fieldgroup/IntegerRangeValidator.html b/uitest/src/com/vaadin/tests/fieldgroup/IntegerRangeValidator.html
deleted file mode 100644
index 48d48ede80..0000000000
--- a/uitest/src/com/vaadin/tests/fieldgroup/IntegerRangeValidator.html
+++ /dev/null
@@ -1,95 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="" />
-<title>IntegerRangeValidator</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">IntegerRangeValidator</td></tr>
-</thead><tbody>
-<tr>
- <td>open</td>
- <td>/run/com.vaadin.tests.fieldgroup.BasicPersonForm?restartApplication</td>
- <td></td>
-</tr>
-<!--64123 -> age-->
-<tr>
- <td>mouseClick</td>
- <td>vaadin=runcomvaadintestsfieldgroupBasicPersonForm::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[5]/VTextField[0]</td>
- <td>64,20</td>
-</tr>
-<tr>
- <td>enterCharacter</td>
- <td>vaadin=runcomvaadintestsfieldgroupBasicPersonForm::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[5]/VTextField[0]</td>
- <td>64123</td>
-</tr>
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestsfieldgroupBasicPersonForm::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[5]/VTextField[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>waitForElementPresent</td>
- <td>vaadin=runcomvaadintestsfieldgroupBasicPersonForm::Root/VTooltip[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestsfieldgroupBasicPersonForm::Root/VTooltip[0]/FlowPanel[0]/VErrorMessage[0]/HTML[0]</td>
- <td>Must be between 0 and 150, 64123 is not</td>
-</tr>
-<tr>
- <td>assertCSSClass</td>
- <td>vaadin=runcomvaadintestsfieldgroupBasicPersonForm::/VVerticalLayout[0]/VVerticalLayout[0]/domChild[5]/domChild[0]/domChild[1]</td>
- <td>v-errorindicator</td>
-</tr>
-<!--Hide tooltip-->
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestsfieldgroupBasicPersonForm::/VVerticalLayout[0]/VVerticalLayout[0]</td>
- <td></td>
-</tr>
-<!--10 -> age-->
-<tr>
- <td>enterCharacter</td>
- <td>vaadin=runcomvaadintestsfieldgroupBasicPersonForm::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[5]/VTextField[0]</td>
- <td>10</td>
-</tr>
-<tr>
- <td>assertElementNotPresent</td>
- <td>vaadin=runcomvaadintestsfieldgroupBasicPersonForm::/VVerticalLayout[0]/VVerticalLayout[0]/domChild[5]/domChild[0]/domChild[1]</td>
- <td>v-errorindicator</td>
-</tr>
-<!---1-->
-<tr>
- <td>mouseClick</td>
- <td>vaadin=runcomvaadintestsfieldgroupBasicPersonForm::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[5]/VTextField[0]</td>
- <td>69,11</td>
-</tr>
-<tr>
- <td>enterCharacter</td>
- <td>vaadin=runcomvaadintestsfieldgroupBasicPersonForm::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[5]/VTextField[0]</td>
- <td>-1</td>
-</tr>
-<tr>
- <td>assertCSSClass</td>
- <td>vaadin=runcomvaadintestsfieldgroupBasicPersonForm::/VVerticalLayout[0]/VVerticalLayout[0]/domChild[5]/domChild[0]/domChild[1]</td>
- <td>v-errorindicator</td>
-</tr>
-<tr>
- <td>showTooltip</td>
- <td>vaadin=runcomvaadintestsfieldgroupBasicPersonForm::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[5]/VTextField[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestsfieldgroupBasicPersonForm::Root/VTooltip[0]/FlowPanel[0]/VErrorMessage[0]/HTML[0]</td>
- <td>Must be between 0 and 150, -1 is not</td>
-</tr>
-</tbody></table>
-</body>
-</html>
diff --git a/uitest/src/com/vaadin/tests/layouts/GridLayoutMoveComponent.html b/uitest/src/com/vaadin/tests/layouts/GridLayoutMoveComponent.html
deleted file mode 100644
index 77a17263f8..0000000000
--- a/uitest/src/com/vaadin/tests/layouts/GridLayoutMoveComponent.html
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="" />
-<title>New Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">New Test</td></tr>
-</thead><tbody>
-<tr>
- <td>open</td>
- <td>/run/com.vaadin.tests.layouts.GridLayoutMoveComponent?restartApplication</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>all-left</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutsGridLayoutMoveComponent::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>label-right</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutsGridLayoutMoveComponent::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>label-button-right</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutsGridLayoutMoveComponent::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[3]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td>label-button-textfield-right</td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/uitest/src/com/vaadin/tests/layouts/GridLayoutWidthChange.html b/uitest/src/com/vaadin/tests/layouts/GridLayoutWidthChange.html
deleted file mode 100644
index f01a1a7026..0000000000
--- a/uitest/src/com/vaadin/tests/layouts/GridLayoutWidthChange.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="" />
-<title>GridLayoutWidthChange</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">GridLayoutWidthChange</td></tr>
-</thead><tbody>
-<tr>
- <td>open</td>
- <td>/run/com.vaadin.tests.layouts.GridLayoutWidthChange</td>
- <td></td>
-</tr>
-<tr>
- <td>waitForVaadin</td>
- <td></td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td></td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestslayoutsGridLayoutWidthChange::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>waitForVaadin</td>
- <td></td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/uitest/src/com/vaadin/tests/layouts/GridLayoutMoveComponent.java b/uitest/src/com/vaadin/tests/layouts/gridlayout/GridLayoutMoveComponent.java
index efd1277653..cd86fbcf3c 100644
--- a/uitest/src/com/vaadin/tests/layouts/GridLayoutMoveComponent.java
+++ b/uitest/src/com/vaadin/tests/layouts/gridlayout/GridLayoutMoveComponent.java
@@ -1,5 +1,7 @@
-package com.vaadin.tests.layouts;
+package com.vaadin.tests.layouts.gridlayout;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
import com.vaadin.tests.components.TestBase;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
@@ -7,10 +9,10 @@ import com.vaadin.ui.GridLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.TextField;
-public class GridLayoutMoveComponent extends TestBase {
+public class GridLayoutMoveComponent extends AbstractTestUI {
@Override
- protected void setup() {
+ protected void setup(VaadinRequest request) {
final GridLayout grid = new GridLayout(2, 3);
grid.setCaption("Fixed size grid");
grid.setWidth("300px");
@@ -51,13 +53,14 @@ public class GridLayoutMoveComponent extends TestBase {
@Override
public void buttonClick(ClickEvent event) {
grid.removeComponent(tf);
+ grid.addComponent(new Label("I'm on left"), 0, 2);
grid.addComponent(tf, 1, 2);
}
}));
}
@Override
- protected String getDescription() {
+ protected String getTestDescription() {
return "Click the buttons below the GridLayout to move the components to the right. Should definitely work no matter what.";
}
diff --git a/uitest/src/com/vaadin/tests/layouts/gridlayout/GridLayoutMoveComponentTest.java b/uitest/src/com/vaadin/tests/layouts/gridlayout/GridLayoutMoveComponentTest.java
new file mode 100644
index 0000000000..0fab64989a
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/gridlayout/GridLayoutMoveComponentTest.java
@@ -0,0 +1,31 @@
+package com.vaadin.tests.layouts.gridlayout;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+import org.junit.Test;
+
+import java.io.IOException;
+
+public class GridLayoutMoveComponentTest extends MultiBrowserTest {
+
+ @Test
+ public void componentsShouldMoveRight() throws IOException {
+ openTestURL();
+
+ compareScreen("all-left");
+
+ clickButtonWithCaption("Shift label right");
+ compareScreen("label-right");
+
+ clickButtonWithCaption("Shift button right");
+ compareScreen("label-button-right");
+
+ clickButtonWithCaption("Shift text field right");
+ compareScreen("label-button-textfield-right");
+ }
+
+ private void clickButtonWithCaption(String caption) {
+ $(ButtonElement.class).caption(caption).first().click();
+ }
+
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/layouts/GridLayoutWidthChange.java b/uitest/src/com/vaadin/tests/layouts/gridlayout/GridLayoutWidthChange.java
index c0e6b27c7d..96091bdab5 100644
--- a/uitest/src/com/vaadin/tests/layouts/GridLayoutWidthChange.java
+++ b/uitest/src/com/vaadin/tests/layouts/gridlayout/GridLayoutWidthChange.java
@@ -1,5 +1,7 @@
-package com.vaadin.tests.layouts;
+package com.vaadin.tests.layouts.gridlayout;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
import com.vaadin.tests.components.TestBase;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
@@ -9,7 +11,7 @@ import com.vaadin.ui.NativeButton;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
-public class GridLayoutWidthChange extends TestBase {
+public class GridLayoutWidthChange extends AbstractTestUI {
private GridLayout generateLayout() {
VerticalLayout fields1 = new VerticalLayout();
@@ -34,7 +36,7 @@ public class GridLayoutWidthChange extends TestBase {
}
@Override
- protected void setup() {
+ protected void setup(VaadinRequest request) {
final GridLayout layout1 = generateLayout();
final CustomComponent cc = new CustomComponent(layout1);
cc.setWidth("500px");
@@ -45,7 +47,7 @@ public class GridLayoutWidthChange extends TestBase {
@Override
public void buttonClick(ClickEvent event) {
- cc.setWidth((cc.getWidth() - 10) + "px");
+ cc.setWidth((cc.getWidth() - 100) + "px");
}
});
@@ -53,7 +55,7 @@ public class GridLayoutWidthChange extends TestBase {
}
@Override
- protected String getDescription() {
+ protected String getTestDescription() {
return "A 100% wide GridLayout is wrapped inside a CustomComponent. When the width of the CustomComponent is reduced, the size of the GridLayout should be reduced accordingly. The Buttons should stay in place vertically and just move closer to each other horizontally.";
}
diff --git a/uitest/src/com/vaadin/tests/layouts/gridlayout/GridLayoutWidthChangeTest.java b/uitest/src/com/vaadin/tests/layouts/gridlayout/GridLayoutWidthChangeTest.java
new file mode 100644
index 0000000000..52ea5f4f8e
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/gridlayout/GridLayoutWidthChangeTest.java
@@ -0,0 +1,24 @@
+package com.vaadin.tests.layouts.gridlayout;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.tests.tb3.AbstractTB3Test;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+import org.junit.Test;
+
+import java.io.IOException;
+
+import static org.junit.Assert.*;
+
+public class GridLayoutWidthChangeTest extends MultiBrowserTest {
+
+ @Test
+ public void layoutIsReduced() throws IOException {
+ openTestURL();
+
+ compareScreen("initial");
+
+ $(ButtonElement.class).caption("Reduce GridLayout parent width").first().click();
+
+ compareScreen("buttonMoved");
+ }
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/AbstractLayoutTests.java b/uitest/src/com/vaadin/tests/layouts/layouttester/AbstractLayoutTests.java
deleted file mode 100644
index c96d542a4c..0000000000
--- a/uitest/src/com/vaadin/tests/layouts/layouttester/AbstractLayoutTests.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.vaadin.tests.layouts.layouttester;
-
-import com.vaadin.ui.Layout;
-
-public abstract class AbstractLayoutTests {
-
- protected static final String FOLDER_16_PNG = "../icons/runo/16/folder.png";
- protected static final String CALENDAR_32_PNG = "../runo/icons/32/calendar.png";
- protected static final String LOCK_16_PNG = "../runo/icons/16/lock.png";
- protected static final String GLOBE_16_PNG = "../runo/icons/16/globe.png";
-
- abstract protected Layout getCaptionsTests();
-
- abstract protected Layout getIconsTests();
-
- abstract protected Layout getRequiredErrorIndicatorsTests();
-
- abstract protected Layout getAlignmentTests();
-
- abstract protected Layout getExpandRatiosTests();
-
- abstract protected Layout getMarginSpacingTests();
-
- abstract protected Layout getComponentAddReplaceMoveTests();
-
- abstract protected Layout getComponentSizingTests();
-
- abstract protected Layout getLayoutSizingTests();
-
-}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/BaseAddReplaceMove.java b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseAddReplaceMove.java
new file mode 100644
index 0000000000..7ea8739cf4
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseAddReplaceMove.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.shared.ui.label.ContentMode;
+import com.vaadin.ui.AbstractComponent;
+import com.vaadin.ui.AbstractLayout;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.Table;
+import com.vaadin.ui.TextField;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class BaseAddReplaceMove extends BaseLayoutTestUI {
+
+ /**
+ * @param layoutClass
+ */
+ public BaseAddReplaceMove(Class<? extends AbstractLayout> layoutClass) {
+ super(layoutClass);
+ }
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ init();
+ buildLayout();
+ super.setup(request);
+ }
+
+ private void buildLayout() {
+ // Set undefined height to avoid expanding
+ l2.setHeight(null);
+ // extra layout from which components will be moved
+ final HorizontalLayout source = new HorizontalLayout();
+ source.addComponent(new Label("OTHER LABEL 1"));
+ source.addComponent(new Label("OTHER LABEL 2"));
+
+ final AbstractComponent c1 = new Label("<b>LABEL</b>", ContentMode.HTML);
+ final AbstractComponent c2 = new Label("<b>LABEL</b>", ContentMode.HTML);
+ final AbstractComponent c3 = new Table("TABLE");
+ c3.setHeight("100px");
+ c3.setWidth("100%");
+
+ final Button btnAdd = new Button("Test add");
+ final Button btnReplace = new Button("Test replace");
+ final Button btnMove = new Button("Test move");
+ final Button btnRemove = new Button("Test remove");
+
+ l1.addComponent(btnAdd);
+ l1.addComponent(btnReplace);
+ l1.addComponent(btnMove);
+ l1.addComponent(btnRemove);
+
+ btnAdd.addClickListener(new ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ l2.addComponent(new TextField());
+ }
+ });
+ btnReplace.addClickListener(new ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ l2.replaceComponent(c1, c3);
+ }
+ });
+ btnMove.addClickListener(new ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ l2.moveComponentsFrom(source);
+ }
+ });
+ btnRemove.addClickListener(new ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ l2.removeComponent(c1);
+ l2.removeComponent(c2);
+ }
+ });
+
+ l2.addComponent(c1);
+ l2.addComponent(c2);
+ l2.addComponent(c3);
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/BaseAddReplaceMoveTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseAddReplaceMoveTest.java
new file mode 100644
index 0000000000..73dc39009d
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseAddReplaceMoveTest.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.junit.Test;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public abstract class BaseAddReplaceMoveTest extends MultiBrowserTest {
+ @Test
+ public void LayoutAlignment() throws IOException, InterruptedException {
+ openTestURL();
+ sleep(500);
+ compareScreen("initial");
+ String[] states = { "add", "replace", "move", "remove" };
+ List<ButtonElement> buttons = $(ButtonElement.class).all();
+ int index = 0;
+ // go through all buttons click them and see result
+ for (ButtonElement btn : buttons) {
+ btn.click();
+ sleep(500);
+ compareScreen(states[index]);
+ index++;
+ }
+ }
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/BaseAlignment.java b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseAlignment.java
new file mode 100644
index 0000000000..bfdc53bf7c
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseAlignment.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.ui.AbstractOrderedLayout;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+abstract public class BaseAlignment extends BaseLayoutTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ // create two columns of components with different
+ // alignment. Used to test alignment in layouts
+ init();
+ buildLayout();
+ super.setup(request);
+ }
+
+ public BaseAlignment(Class<? extends AbstractOrderedLayout> layoutClass) {
+ super(layoutClass);
+ }
+
+ /**
+ * Build Layout for test
+ */
+ private void buildLayout() {
+ for (int i = 0; i < components.length; i++) {
+ AbstractOrderedLayout layout = null;
+ try {
+ layout = (AbstractOrderedLayout) layoutClass.newInstance();
+ } catch (InstantiationException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ layout.setHeight("300px");
+ layout.setWidth("200px");
+ layout.addComponent(components[i]);
+ layout.setComponentAlignment(components[i], alignments[i]);
+ if (i < components.length / 2) {
+ l1.addComponent(layout);
+ } else {
+ l2.addComponent(layout);
+ }
+ }
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/BaseAlignmentTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseAlignmentTest.java
new file mode 100644
index 0000000000..9dd90a4031
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseAlignmentTest.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester;
+
+import java.io.IOException;
+
+import org.junit.Test;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public abstract class BaseAlignmentTest extends MultiBrowserTest {
+
+ @Test
+ public void layoutAlignment() throws IOException {
+ openTestURL();
+ compareScreen("alignment");
+ }
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/BaseCaption.java b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseCaption.java
new file mode 100644
index 0000000000..37ce77e745
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseCaption.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.ui.AbstractLayout;
+import com.vaadin.ui.ComboBox;
+import com.vaadin.ui.TabSheet;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class BaseCaption extends BaseLayoutTestUI {
+
+ /**
+ * @param layoutClass
+ */
+ public BaseCaption(Class<? extends AbstractLayout> layoutClass) {
+ super(layoutClass);
+ }
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ init();
+ l1.addComponent(createLabelsFields(ComboBox.class, true, ""));
+ l2.addComponent(createLabelsFields(TabSheet.class, false, ""));
+ super.setup(request);
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/BaseCaptionTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseCaptionTest.java
new file mode 100644
index 0000000000..ed20657e2a
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseCaptionTest.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester;
+
+import java.io.IOException;
+
+import org.junit.Test;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public abstract class BaseCaptionTest extends MultiBrowserTest {
+ @Test
+ public void LayoutCaption() throws IOException, InterruptedException {
+ openTestURL();
+ compareScreen("caption");
+ }
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/BaseComponentSizing.java b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseComponentSizing.java
new file mode 100644
index 0000000000..d9377c6a8b
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseComponentSizing.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.ui.AbstractLayout;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class BaseComponentSizing extends BaseLayoutTestUI {
+
+ public BaseComponentSizing(Class<? extends AbstractLayout> layoutClass) {
+ super(layoutClass);
+ }
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ init();
+ getLayoutForLayoutSizing("component");
+ super.setup(request);
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/BaseComponentSizingTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseComponentSizingTest.java
new file mode 100644
index 0000000000..252cfcd359
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseComponentSizingTest.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.junit.Test;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public abstract class BaseComponentSizingTest extends MultiBrowserTest {
+ @Test
+ public void ComponentSizing() throws IOException, InterruptedException {
+ openTestURL();
+ sleep(500);
+ compareScreen("initial");
+ String[] states = { "setSize350px", "setSize_-1px", "setSize75Percent",
+ "setSize100Percent" };
+ List<ButtonElement> buttons = $(ButtonElement.class).all();
+ int index = 0;
+ // go through all buttons click them and see result
+ for (ButtonElement btn : buttons) {
+ btn.click();
+ sleep(500);
+ compareScreen(states[index]);
+ index++;
+ }
+ }
+
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/BaseIcon.java b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseIcon.java
new file mode 100644
index 0000000000..34ec7928ff
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseIcon.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.ui.AbstractLayout;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.ComboBox;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.Link;
+import com.vaadin.ui.TabSheet;
+import com.vaadin.ui.TextField;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class BaseIcon extends BaseLayoutTestUI {
+ /**
+ * @param layoutClass
+ */
+ public BaseIcon(Class<? extends AbstractLayout> layoutClass) {
+ super(layoutClass);
+ }
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ init();
+ l1.addComponent(createLabelsFields(TextField.class, true, ""));
+ l1.addComponent(createLabelsFields(Label.class, true, ""));
+ l1.addComponent(createLabelsFields(Button.class, true, ""));
+ l2.addComponent(createLabelsFields(ComboBox.class, true, ""));
+ l2.addComponent(createLabelsFields(Link.class, true, ""));
+ l2.addComponent(createLabelsFields(TabSheet.class, true, ""));
+ super.setup(request);
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/BaseIconTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseIconTest.java
new file mode 100644
index 0000000000..9322672eae
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseIconTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester;
+
+import java.io.IOException;
+
+import org.junit.Test;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public abstract class BaseIconTest extends MultiBrowserTest {
+
+ @Test
+ public void LayoutIcon() throws IOException {
+ openTestURL();
+ compareScreen("icon");
+ }
+
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutExpand.java b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutExpand.java
new file mode 100644
index 0000000000..f21db94f80
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutExpand.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.ui.AbstractComponent;
+import com.vaadin.ui.AbstractLayout;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Table;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class BaseLayoutExpand extends BaseLayoutTestUI {
+
+ public BaseLayoutExpand(Class<? extends AbstractLayout> layoutClass) {
+ super(layoutClass);
+ }
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ init();
+ buildLayout();
+ super.setup(request);
+ }
+
+ private void buildLayout() {
+ class ExpandButton extends Button {
+ final private AbstractComponent c1;
+ private AbstractComponent c2;
+ private float expandComp1;
+ private float expandComp2;
+
+ public ExpandButton(final AbstractComponent c1,
+ final AbstractComponent c2, float e1, float e2) {
+ super();
+ this.c1 = c1;
+ this.c2 = c2;
+ expandComp1 = e1;
+ expandComp2 = e2;
+ setCaption("Expand ratio: " + e1 * 100 + " /" + e2 * 100);
+ addClickListener(new ClickListener() {
+ @Override
+ public void buttonClick(ClickEvent event) {
+ l2.setExpandRatio(c1, expandComp1);
+ l2.setExpandRatio(c2, expandComp2);
+ }
+ });
+ }
+ }
+ Table t1 = getTestTable();
+ Table t2 = getTestTable();
+ t1.setSizeFull();
+ t2.setSizeFull();
+ l2.addComponent(t1);
+ l2.addComponent(t2);
+
+ l1.addComponent(new ExpandButton(t1, t2, 1.0f, 0.0f));
+ l1.addComponent(new ExpandButton(t1, t2, 0.5f, 0.50f));
+ l1.addComponent(new ExpandButton(t1, t2, .25f, 0.75f));
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutExpandTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutExpandTest.java
new file mode 100644
index 0000000000..08f5aed808
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutExpandTest.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.junit.Test;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public abstract class BaseLayoutExpandTest extends MultiBrowserTest {
+
+ @Test
+ public void LayoutExpand() throws IOException, InterruptedException {
+ openTestURL();
+ sleep(500);
+ compareScreen("initial");
+ String[] states = { "expand_100_0", "expand_50_50", "expand_25_75" };
+ List<ButtonElement> buttons = $(ButtonElement.class).all();
+ int index = 0;
+ // go through all buttons click them and see result
+ for (ButtonElement btn : buttons) {
+ btn.click();
+ sleep(500);
+ compareScreen(states[index]);
+ index++;
+ }
+ }
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutForSpacingMargin.java b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutForSpacingMargin.java
new file mode 100644
index 0000000000..e98573d170
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutForSpacingMargin.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.shared.ui.label.ContentMode;
+import com.vaadin.ui.AbstractLayout;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.Table;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class BaseLayoutForSpacingMargin extends BaseLayoutTestUI {
+ /**
+ * @param layoutClass
+ */
+ public BaseLayoutForSpacingMargin(
+ Class<? extends AbstractLayout> layoutClass) {
+ super(layoutClass);
+ }
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ init();
+ buildLayout();
+ super.setup(request);
+ }
+
+ private void buildLayout() {
+ Table t1 = getTestTable();
+ Table t2 = getTestTable();
+ t1.setSizeFull();
+ t2.setSizeFull();
+ l2.addComponent(t1);
+ l2.setMargin(false);
+ l2.setSpacing(false);
+ // Must add something around the hr to avoid the margins collapsing
+ l2.addComponent(new Label(
+ "<div style='height: 1px'></div><hr /><div style='height: 1px'></div>",
+ ContentMode.HTML));
+ l2.addComponent(t2);
+ final Button btn1 = new Button("Toggle margin on/off");
+ btn1.addClickListener(new ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ boolean margin = l2.getMargin().hasLeft();
+ l2.setMargin(!margin);
+
+ }
+ });
+ final Button btn2 = new Button("Toggle spacing on/off");
+ btn2.addClickListener(new ClickListener() {
+ @Override
+ public void buttonClick(ClickEvent event) {
+ l2.setSpacing(!l2.isSpacing());
+ }
+ });
+ l1.addComponent(btn1);
+ l1.addComponent(btn2);
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutMarginSpacingTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutMarginSpacingTest.java
new file mode 100644
index 0000000000..46edfec986
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutMarginSpacingTest.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester;
+
+import java.io.IOException;
+
+import org.junit.Test;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public abstract class BaseLayoutMarginSpacingTest extends MultiBrowserTest {
+
+ @Test
+ public void LayoutMarginSpacing() throws IOException, InterruptedException {
+ openTestURL();
+ sleep(500);
+ compareScreen("initial");
+ String[] states = { "marginOnSpaceOff", "marginOnfSpaceOn" };
+ ButtonElement marginBtn = $(ButtonElement.class).get(0);
+ ButtonElement spaceBtn = $(ButtonElement.class).get(1);
+ marginBtn.click();
+ sleep(1000);
+ compareScreen(states[0]);
+ spaceBtn.click();
+ sleep(1000);
+ compareScreen(states[1]);
+ }
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutRegErrorTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutRegErrorTest.java
new file mode 100644
index 0000000000..61d6f8a362
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutRegErrorTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester;
+
+import java.io.IOException;
+
+import org.junit.Test;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public abstract class BaseLayoutRegErrorTest extends MultiBrowserTest {
+
+ @Test
+ public void LayoutRegError() throws IOException {
+ openTestURL();
+ compareScreen("RegError");
+ }
+
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutSizing.java b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutSizing.java
new file mode 100644
index 0000000000..edc0b275d1
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutSizing.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.ui.AbstractLayout;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class BaseLayoutSizing extends BaseLayoutTestUI {
+ /**
+ * @param layoutClass
+ */
+ public BaseLayoutSizing(Class<? extends AbstractLayout> layoutClass) {
+ super(layoutClass);
+ }
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ init();
+ getLayoutForLayoutSizing("layout");
+ super.setup(request);
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutSizingTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutSizingTest.java
new file mode 100644
index 0000000000..e97353c989
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutSizingTest.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.junit.Test;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public abstract class BaseLayoutSizingTest extends MultiBrowserTest {
+ @Test
+ public void LayoutSizing() throws IOException, InterruptedException {
+ openTestURL();
+ sleep(500);
+ compareScreen("initial");
+ String[] states = { "setSize350px", "setSize_-1px", "setSize75Percent",
+ "setSize100Percent" };
+ List<ButtonElement> buttons = $(ButtonElement.class).all();
+ int index = 0;
+ // go through all buttons click them and see result
+ for (ButtonElement btn : buttons) {
+ btn.click();
+ sleep(500);
+ compareScreen(states[index]);
+ index++;
+ }
+ }
+
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutTestUI.java b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutTestUI.java
new file mode 100644
index 0000000000..02fcb677cd
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseLayoutTestUI.java
@@ -0,0 +1,288 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester;
+
+import com.vaadin.server.Resource;
+import com.vaadin.server.ThemeResource;
+import com.vaadin.server.UserError;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.shared.ui.label.ContentMode;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.AbstractComponent;
+import com.vaadin.ui.AbstractLayout;
+import com.vaadin.ui.AbstractOrderedLayout;
+import com.vaadin.ui.Alignment;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.Component;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.TabSheet;
+import com.vaadin.ui.Table;
+import com.vaadin.ui.TextField;
+import com.vaadin.ui.VerticalLayout;
+
+/**
+ *
+ * Base class for Layout tests.
+ */
+public abstract class BaseLayoutTestUI extends AbstractTestUI {
+ protected static final String FOLDER_16_PNG = "../icons/runo/16/folder.png";
+ protected static final String CALENDAR_32_PNG = "../runo/icons/16/calendar.png";
+ protected static final String LOCK_16_PNG = "../runo/icons/16/lock.png";
+ protected static final String GLOBE_16_PNG = "../runo/icons/16/globe.png";
+ public Alignment[] alignments = new Alignment[] { Alignment.TOP_CENTER,
+ Alignment.TOP_LEFT, Alignment.TOP_RIGHT, Alignment.BOTTOM_CENTER,
+ Alignment.BOTTOM_LEFT, Alignment.BOTTOM_RIGHT,
+ Alignment.MIDDLE_CENTER, Alignment.MIDDLE_LEFT,
+ Alignment.MIDDLE_RIGHT };
+
+ public final String[] CAPTIONS = new String[] { "",
+ "VeryLongOneWordCaption",
+ "Very long caption of 50 approximately symbols aaaaaaaaaaaa aaaaaa aaa " };
+ Resource[] ICONS = new Resource[] { new ThemeResource(CALENDAR_32_PNG),
+ new ThemeResource(LOCK_16_PNG), new ThemeResource(GLOBE_16_PNG) };
+ public AbstractComponent[] components = new AbstractComponent[alignments.length];
+
+ protected AbstractOrderedLayout l1;
+ protected AbstractOrderedLayout l2;
+ protected Class<? extends AbstractLayout> layoutClass;
+ protected VerticalLayout mainLayout = new VerticalLayout();
+
+ public BaseLayoutTestUI(Class<? extends AbstractLayout> layoutClass) {
+ super();
+ fillComponents();
+ this.layoutClass = layoutClass;
+
+ }
+
+ protected void init() {
+ try {
+ l1 = (AbstractOrderedLayout) layoutClass.newInstance();
+ l2 = (AbstractOrderedLayout) layoutClass.newInstance();
+ } catch (InstantiationException e1) {
+ // TODO Auto-generated catch block
+ e1.printStackTrace();
+ } catch (IllegalAccessException e1) {
+ // TODO Auto-generated catch block
+ e1.printStackTrace();
+ }
+ if (layoutClass.equals(HorizontalLayout.class)) {
+ setLayoutMeasures(l1, l2, "600px", "400px");
+ } else if (layoutClass.equals(VerticalLayout.class)) {
+ setLayoutMeasures(l1, l2, "400px", "400px");
+ } else {
+ setDefaultForVertical(l1, l2);
+ }
+ }
+
+ private void fillComponents() {
+ for (int i = 0; i < components.length; i++) {
+ String name = "Field" + i;
+ TextField field = new TextField();
+ field.setValue(name);
+ components[i] = field;
+ }
+ }
+
+ protected AbstractLayout createLabelsFields(
+ Class<? extends AbstractComponent> compType) {
+ return createLabelsFields(compType, false, null);
+ }
+
+ protected void getLayoutForLayoutSizing(final String compType) {
+
+ l2.setSpacing(false);
+ l2.setMargin(false);
+
+ final AbstractComponent c1 = getTestTable();
+ c1.setSizeFull();
+ final AbstractComponent c2 = getTestTable();
+ c2.setSizeFull();
+
+ class SetSizeButton extends Button {
+ SetSizeButton(final String size) {
+ super();
+ setCaption("Set size " + size);
+ addClickListener(new ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ if (compType == "layout") {
+ l2.setHeight(size);
+ l2.setWidth(size);
+ } else if (compType == "component") {
+ c2.setHeight(size);
+ c2.setWidth(size);
+ } else {
+ }
+
+ }
+ });
+ }
+
+ }
+ Button btn1 = new SetSizeButton("350px");
+ Button btn2 = new SetSizeButton("-1px");
+ Button btn3 = new SetSizeButton("75%");
+ Button btn4 = new SetSizeButton("100%");
+
+ l1.addComponent(btn1);
+ l1.addComponent(btn2);
+ l1.addComponent(btn3);
+ l1.addComponent(btn4);
+ l2.addComponent(c1);
+ l2.addComponent(new Label(
+ "<div style='height: 1px'></div><hr /><div style='height: 1px'></div>",
+ ContentMode.HTML));
+ l2.addComponent(c2);
+ l2.setExpandRatio(c1, 0.5f);
+ l2.setExpandRatio(c2, 0.5f);
+
+ btn2.addClickListener(new ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ Label newLabel = new Label("--- NEW LABEL ---");
+ newLabel.setSizeUndefined();
+ l2.addComponent(newLabel);
+
+ }
+ });
+ }
+
+ protected Table getTestTable() {
+ Table t = new Table();
+ t.setPageLength(5);
+ t.addContainerProperty("test", String.class, null);
+ t.addItem(new Object[] { "qwertyuiop asdfghjköäxccvbnm,m,." }, 1);
+ t.addItem(new Object[] { "YGVYTCTCTRXRXRXRX" }, 2);
+ return t;
+ }
+
+ protected AbstractLayout createLabelsFields(
+ Class<? extends AbstractComponent> compType, boolean useIcon,
+ String ErrorMessage) {
+ AbstractLayout mainLayout = new VerticalLayout();
+ AbstractLayout curLayout = null;
+ try {
+ curLayout = layoutClass.newInstance();
+ } catch (InstantiationException e1) {
+ // TODO Auto-generated catch block
+ e1.printStackTrace();
+ } catch (IllegalAccessException e1) {
+ // TODO Auto-generated catch block
+ e1.printStackTrace();
+ }
+ final Component[] components = new Component[CAPTIONS.length];
+
+ for (int i = 0; i < components.length; i++) {
+ AbstractComponent comp = null;
+ try {
+ comp = compType.newInstance();
+ } catch (InstantiationException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ components[i] = comp;
+ comp.setCaption(CAPTIONS[i]);
+ if (useIcon) {
+ comp.setIcon(ICONS[i]);
+ }
+ if (ErrorMessage != null) {
+ if (ErrorMessage.length() == 0) {
+ comp.setComponentError(new UserError(null));
+ } else {
+ comp.setComponentError(new UserError(ErrorMessage));
+ }
+ }
+ // if component is a tab sheet add two tabs for it
+ if (comp instanceof TabSheet) {
+ comp.setSizeUndefined();
+ TabSheet tab = (TabSheet) comp;
+ tab.addTab(new UndefWideLabel("TAB1"), "TAB1",
+ new ThemeResource(GLOBE_16_PNG));
+ tab.addTab(new UndefWideLabel("TAB2"), "TAB2", null);
+ }
+ curLayout.addComponent(comp);
+ mainLayout.addComponent(curLayout);
+ }
+ return mainLayout;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#setup(com.vaadin.server.
+ * VaadinRequest)
+ */
+ @Override
+ protected void setup(VaadinRequest request) {
+ mainLayout.addComponent(l1);
+ mainLayout.addComponent(l2);
+ addComponent(mainLayout);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTestDescription()
+ */
+ @Override
+ protected String getTestDescription() {
+ return null;
+ }
+
+ protected void setLayoutMeasures(AbstractOrderedLayout l1,
+ AbstractOrderedLayout l2, String w, String h) {
+ l1.setWidth(w);
+ l1.setHeight(h);
+ l2.setWidth(h);
+ l2.setHeight(w);
+ }
+
+ protected void setDefaultForVertical(AbstractOrderedLayout l1,
+ AbstractOrderedLayout l2) {
+ l1.setWidth("800px");
+ l1.setHeight("600px");
+ l2.setWidth("800px");
+ l2.setHeight("600px");
+ }
+
+ protected void setDefaultForHorizontal(AbstractOrderedLayout l1,
+ AbstractOrderedLayout l2) {
+ l1.setWidth("600px");
+ l1.setHeight("600px");
+ l2.setWidth("600px");
+ l2.setHeight("600px");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTicketNumber()
+ */
+ @Override
+ protected Integer getTicketNumber() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/BaseRegError.java b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseRegError.java
new file mode 100644
index 0000000000..df4053b533
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/BaseRegError.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.ui.AbstractLayout;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.CheckBox;
+import com.vaadin.ui.ComboBox;
+import com.vaadin.ui.DateField;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.NativeSelect;
+import com.vaadin.ui.TabSheet;
+import com.vaadin.ui.TextField;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class BaseRegError extends BaseLayoutTestUI {
+
+ public BaseRegError(Class<? extends AbstractLayout> layoutClass) {
+ super(layoutClass);
+ }
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ init();
+ buildLayout();
+ super.setup(request);
+ }
+
+ private void buildLayout() {
+
+ l1.addComponent(createLabelsFields(Label.class, true, ""));
+ l1.addComponent(createLabelsFields(Button.class, true, ""));
+ l1.addComponent(createLabelsFields(TabSheet.class, true, ""));
+ l1.addComponent(createLabelsFields(TextField.class, true, ""));
+
+ l2.addComponent(createLabelsFields(ComboBox.class, true, ""));
+ l2.addComponent(createLabelsFields(DateField.class, true, ""));
+ l2.addComponent(createLabelsFields(NativeSelect.class, true, ""));
+ l2.addComponent(createLabelsFields(CheckBox.class, true, ""));
+
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridAddReplaceMove.java b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridAddReplaceMove.java
new file mode 100644
index 0000000000..2771af01c6
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridAddReplaceMove.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.GridLayout;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.shared.ui.label.ContentMode;
+import com.vaadin.ui.AbstractComponent;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.Table;
+import com.vaadin.ui.TextField;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+
+public class GridAddReplaceMove extends GridBaseLayoutTestUI {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#setup(com.vaadin.server.
+ * VaadinRequest)
+ */
+ @Override
+ protected void setup(VaadinRequest request) {
+ buildLayout();
+ super.setup(request);
+ }
+
+ private void buildLayout() {
+
+ final HorizontalLayout source = new HorizontalLayout();
+ source.addComponent(new Label("OTHER LABEL 1"));
+ source.addComponent(new Label("OTHER LABEL 2"));
+
+ final AbstractComponent c1 = new Label("<b>LABEL</b>", ContentMode.HTML);
+ final AbstractComponent c2 = new Label("<b>LABEL</b>", ContentMode.HTML);
+ final AbstractComponent c3 = new Table("TABLE");
+ c3.setHeight("100px");
+ c3.setWidth("100%");
+
+ final Button btnAdd = new Button("Test add");
+ final Button btnReplace = new Button("Test replace");
+ final Button btnMove = new Button("Test move");
+ final Button btnRemove = new Button("Test remove");
+
+ layout.addComponent(btnAdd);
+ layout.addComponent(btnReplace);
+ layout.addComponent(btnMove);
+ layout.addComponent(btnRemove);
+
+ btnAdd.addClickListener(new ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ layout.addComponent(new TextField());
+ }
+ });
+ btnReplace.addClickListener(new ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ layout.replaceComponent(c1, c3);
+ }
+ });
+ btnMove.addClickListener(new ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ layout.moveComponentsFrom(source);
+ }
+ });
+ btnRemove.addClickListener(new ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ layout.removeComponent(c1);
+ layout.removeComponent(c2);
+ }
+ });
+
+ layout.addComponent(c1);
+ layout.addComponent(c2);
+ layout.addComponent(c3);
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridAddReplaceMoveTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridAddReplaceMoveTest.java
new file mode 100644
index 0000000000..f83a6ccf67
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridAddReplaceMoveTest.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.GridLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseAddReplaceMoveTest;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class GridAddReplaceMoveTest extends BaseAddReplaceMoveTest {
+
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridAlignment.java b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridAlignment.java
new file mode 100644
index 0000000000..e061532690
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridAlignment.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.GridLayout;
+
+import com.vaadin.server.VaadinRequest;
+
+public class GridAlignment extends GridBaseLayoutTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ buildLayout();
+ super.setup(request);
+ }
+
+ /**
+ * Build Layout for test
+ */
+ private void buildLayout() {
+ layout.setColumns(3);
+ layout.setRows(3);
+ // layout.setHeight("600px");
+ // layout.setWidth("900px");
+ for (int i = 0; i < components.length; i++) {
+ layout.addComponent(components[i]);
+ layout.setComponentAlignment(components[i], alignments[i]);
+ }
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridAlignmentTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridAlignmentTest.java
new file mode 100644
index 0000000000..cdc040930b
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridAlignmentTest.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.GridLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseAlignmentTest;
+
+public class GridAlignmentTest extends BaseAlignmentTest {
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridBaseLayoutTestUI.java b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridBaseLayoutTestUI.java
new file mode 100644
index 0000000000..d79c52ccda
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridBaseLayoutTestUI.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.GridLayout;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.shared.ui.label.ContentMode;
+import com.vaadin.tests.layouts.layouttester.BaseLayoutTestUI;
+import com.vaadin.ui.AbstractComponent;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.GridLayout;
+import com.vaadin.ui.Label;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public abstract class GridBaseLayoutTestUI extends BaseLayoutTestUI {
+ protected GridLayout layout = new GridLayout();
+
+ /**
+ * @param layoutClass
+ */
+ public GridBaseLayoutTestUI() {
+ super(GridLayout.class);
+ }
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ layout.setMargin(true);
+ layout.setSizeFull();
+ getUI().setContent(layout);
+ }
+
+ @Override
+ protected void getLayoutForLayoutSizing(final String compType) {
+
+ layout.setSpacing(false);
+ layout.setMargin(false);
+
+ final AbstractComponent c1 = getTestTable();
+ c1.setSizeFull();
+ final AbstractComponent c2 = getTestTable();
+ c2.setSizeFull();
+
+ class SetSizeButton extends Button {
+ SetSizeButton(final String size) {
+ super();
+ setCaption("Set size " + size);
+ addClickListener(new ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ if (compType == "layout") {
+ layout.setHeight(size);
+ layout.setWidth(size);
+ } else if (compType == "component") {
+ c2.setHeight(size);
+ c2.setWidth(size);
+ } else {
+ }
+
+ }
+ });
+ }
+
+ }
+ Button btn1 = new SetSizeButton("550px");
+ Button btn2 = new SetSizeButton("-1px");
+ Button btn3 = new SetSizeButton("75%");
+ Button btn4 = new SetSizeButton("100%");
+
+ layout.addComponent(btn1);
+ layout.addComponent(btn2);
+ layout.addComponent(btn3);
+ layout.addComponent(btn4);
+ layout.addComponent(c1);
+ layout.addComponent(new Label(
+ "<div style='height: 1px'></div><hr /><div style='height: 1px'></div>",
+ ContentMode.HTML));
+ layout.addComponent(c2);
+ btn2.addClickListener(new ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ Label newLabel = new Label("--- NEW LABEL ---");
+ newLabel.setSizeUndefined();
+ layout.addComponent(newLabel);
+ }
+ });
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridCaption.java b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridCaption.java
new file mode 100644
index 0000000000..7b1c3d9a65
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridCaption.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.GridLayout;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.ComboBox;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.TabSheet;
+
+public class GridCaption extends GridBaseLayoutTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ layout.addComponent(createLabelsFields(Button.class, true, ""));
+ layout.addComponent(createLabelsFields(Label.class, true, ""));
+ layout.addComponent(createLabelsFields(ComboBox.class, true, ""));
+ layout.addComponent(createLabelsFields(TabSheet.class, false, ""));
+ super.setup(request);
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridCaptionTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridCaptionTest.java
new file mode 100644
index 0000000000..ab8046ebf3
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridCaptionTest.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.GridLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseCaptionTest;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class GridCaptionTest extends BaseCaptionTest {
+
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridComponentSizing.java b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridComponentSizing.java
new file mode 100644
index 0000000000..bebccfbf9d
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridComponentSizing.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.GridLayout;
+
+import com.vaadin.server.VaadinRequest;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class GridComponentSizing extends GridBaseLayoutTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ getLayoutForLayoutSizing("component");
+ super.setup(request);
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridComponentSizingTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridComponentSizingTest.java
new file mode 100644
index 0000000000..6572bd2a50
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridComponentSizingTest.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.GridLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseComponentSizingTest;
+
+public class GridComponentSizingTest extends BaseComponentSizingTest {
+
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridIcon.java b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridIcon.java
new file mode 100644
index 0000000000..863a4f2c1d
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridIcon.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.GridLayout;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.ComboBox;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.Link;
+import com.vaadin.ui.TabSheet;
+import com.vaadin.ui.TextField;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class GridIcon extends GridBaseLayoutTestUI {
+ @Override
+ protected void setup(VaadinRequest request) {
+ layout.addComponent(createLabelsFields(TextField.class, true, ""));
+ layout.addComponent(createLabelsFields(Label.class, true, ""));
+ layout.addComponent(createLabelsFields(Button.class, true, ""));
+ layout.addComponent(createLabelsFields(ComboBox.class, true, ""));
+ layout.addComponent(createLabelsFields(Link.class, true, ""));
+ layout.addComponent(createLabelsFields(TabSheet.class, true, ""));
+ super.setup(request);
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridIconTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridIconTest.java
new file mode 100644
index 0000000000..25a0faa88e
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridIconTest.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.GridLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseIconTest;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class GridIconTest extends BaseIconTest {
+
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutExpand.java b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutExpand.java
new file mode 100644
index 0000000000..b3a84cdc26
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutExpand.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.GridLayout;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Table;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class GridLayoutExpand extends GridBaseLayoutTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ buildLayout();
+ super.setup(request);
+ }
+
+ private void buildLayout() {
+ class ExpandButton extends Button {
+
+ public ExpandButton(final int i1, final int i2, final float e1,
+ final float e2) {
+ super();
+ setCaption("Expand ratio: " + e1 * 100 + " /" + e2 * 100);
+ addClickListener(new ClickListener() {
+ @Override
+ public void buttonClick(ClickEvent event) {
+ layout.setColumnExpandRatio(i1, e1);
+ layout.setColumnExpandRatio(i2, e2);
+ }
+ });
+ }
+ }
+ Table t1 = getTestTable();
+ Table t2 = getTestTable();
+ t1.setSizeFull();
+ t2.setSizeFull();
+ layout.setColumns(4);
+ layout.setRows(4);
+ layout.addComponent(new ExpandButton(1, 2, 1.0f, 0.0f), 0, 0);
+ layout.addComponent(new ExpandButton(1, 2, 0.5f, 0.50f), 0, 1);
+ layout.addComponent(new ExpandButton(1, 2, .25f, 0.75f), 0, 2);
+
+ layout.addComponent(t1, 1, 1);
+ layout.addComponent(t2, 2, 1);
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutExpandTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutExpandTest.java
new file mode 100644
index 0000000000..2a49af52a9
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutExpandTest.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.GridLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseLayoutExpandTest;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class GridLayoutExpandTest extends BaseLayoutExpandTest {
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutMarginSpacing.java b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutMarginSpacing.java
new file mode 100644
index 0000000000..78a67bdf82
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutMarginSpacing.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.GridLayout;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.shared.ui.label.ContentMode;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.Table;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class GridLayoutMarginSpacing extends GridBaseLayoutTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ buildLayout();
+ super.setup(request);
+ }
+
+ private void buildLayout() {
+ Table t1 = getTestTable();
+ Table t2 = getTestTable();
+ t1.setSizeFull();
+ t2.setSizeFull();
+
+ final Button btn1 = new Button("Toggle margin on/off");
+ btn1.addClickListener(new ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ boolean margin = layout.getMargin().hasLeft();
+ layout.setMargin(!margin);
+
+ }
+ });
+ final Button btn2 = new Button("Toggle spacing on/off");
+ btn2.addClickListener(new ClickListener() {
+ @Override
+ public void buttonClick(ClickEvent event) {
+ layout.setSpacing(!layout.isSpacing());
+ }
+ });
+ layout.addComponent(btn1);
+ layout.addComponent(btn2);
+
+ layout.addComponent(t1);
+ layout.setMargin(false);
+ layout.setSpacing(false);
+ // Must add something around the hr to avoid the margins collapsing
+ layout.addComponent(new Label(
+ "<div style='height: 1px'></div><hr /><div style='height: 1px'></div>",
+ ContentMode.HTML));
+ layout.addComponent(t2);
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutMarginSpacingTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutMarginSpacingTest.java
new file mode 100644
index 0000000000..516f3b088b
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutMarginSpacingTest.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.GridLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseLayoutMarginSpacingTest;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class GridLayoutMarginSpacingTest extends BaseLayoutMarginSpacingTest {
+
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutRegError.java b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutRegError.java
new file mode 100644
index 0000000000..5b4dd2a947
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutRegError.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.GridLayout;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.CheckBox;
+import com.vaadin.ui.ComboBox;
+import com.vaadin.ui.DateField;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.NativeSelect;
+import com.vaadin.ui.TabSheet;
+import com.vaadin.ui.TextField;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class GridLayoutRegError extends GridBaseLayoutTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ buildLayout();
+ super.setup(request);
+ }
+
+ private void buildLayout() {
+
+ layout.addComponent(createLabelsFields(Label.class, true, ""));
+ layout.addComponent(createLabelsFields(Button.class, true, ""));
+ layout.addComponent(createLabelsFields(TabSheet.class, true, ""));
+ layout.addComponent(createLabelsFields(TextField.class, true, ""));
+
+ layout.addComponent(createLabelsFields(ComboBox.class, true, ""));
+ layout.addComponent(createLabelsFields(DateField.class, true, ""));
+ layout.addComponent(createLabelsFields(NativeSelect.class, true, ""));
+ layout.addComponent(createLabelsFields(CheckBox.class, true, ""));
+
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutRegErrorTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutRegErrorTest.java
new file mode 100644
index 0000000000..e377a7b0c4
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutRegErrorTest.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.GridLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseLayoutRegErrorTest;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class GridLayoutRegErrorTest extends BaseLayoutRegErrorTest {
+
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutSizing.java b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutSizing.java
new file mode 100644
index 0000000000..8358f91997
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutSizing.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.GridLayout;
+
+import com.vaadin.server.VaadinRequest;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class GridLayoutSizing extends GridBaseLayoutTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ getLayoutForLayoutSizing("layout");
+ super.setup(request);
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutSizingTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutSizingTest.java
new file mode 100644
index 0000000000..c8a48cd70c
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayout/GridLayoutSizingTest.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.GridLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseLayoutSizingTest;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class GridLayoutSizingTest extends BaseLayoutSizingTest {
+
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayoutTests.java b/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayoutTests.java
deleted file mode 100644
index f55867c464..0000000000
--- a/uitest/src/com/vaadin/tests/layouts/layouttester/GridLayoutTests.java
+++ /dev/null
@@ -1,657 +0,0 @@
-package com.vaadin.tests.layouts.layouttester;
-
-import java.util.Date;
-
-import com.vaadin.server.LegacyApplication;
-import com.vaadin.server.Resource;
-import com.vaadin.server.SystemError;
-import com.vaadin.server.ThemeResource;
-import com.vaadin.server.UserError;
-import com.vaadin.ui.AbstractComponent;
-import com.vaadin.ui.AbstractField;
-import com.vaadin.ui.AbstractOrderedLayout;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.CheckBox;
-import com.vaadin.ui.DateField;
-import com.vaadin.ui.GridLayout;
-import com.vaadin.ui.HorizontalLayout;
-import com.vaadin.ui.InlineDateField;
-import com.vaadin.ui.Label;
-import com.vaadin.ui.Layout;
-import com.vaadin.ui.Link;
-import com.vaadin.ui.NativeSelect;
-import com.vaadin.ui.Panel;
-import com.vaadin.ui.TabSheet;
-import com.vaadin.ui.Table;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.themes.Reindeer;
-
-public class GridLayoutTests extends AbstractLayoutTests {
-
- private AbstractComponent rc1, col1, col2, col3, row1, row2, row3, x3, x22;
-
- public GridLayoutTests(LegacyApplication application) {
- super();
- }
-
- @Override
- protected Layout getAlignmentTests() {
- HorizontalLayout hlo = new HorizontalLayout();
- hlo.setSpacing(true);
- GridLayout glo = getTestGrid();
- glo.addStyleName(Reindeer.LAYOUT_WHITE);
- Alignment[] alignments = new Alignment[] { Alignment.BOTTOM_LEFT,
- Alignment.BOTTOM_CENTER, Alignment.BOTTOM_RIGHT,
- Alignment.MIDDLE_LEFT, Alignment.MIDDLE_CENTER,
- Alignment.MIDDLE_RIGHT, Alignment.TOP_LEFT,
- Alignment.TOP_CENTER, Alignment.TOP_RIGHT };
-
- glo.replaceComponent(col1, col1 = new TextField());
- glo.replaceComponent(col2, col2 = new TextField());
- glo.replaceComponent(col3, col3 = new TextField());
- ((TextField) col1).setValue("BOTTOM_RIGHT");
- ((TextField) col2).setValue("BOTTOM_LEFT");
- ((TextField) col3).setValue("BOTTOM_CENTER");
- glo.setComponentAlignment(col2, alignments[0]);
- glo.setComponentAlignment(col3, alignments[1]);
- glo.setComponentAlignment(col1, alignments[2]);
-
- glo.setComponentAlignment(row1, alignments[3]);
- glo.setComponentAlignment(row2, alignments[4]);
- glo.setComponentAlignment(row3, alignments[5]);
- hlo.addComponent(glo);
- glo = getTestGrid();
- glo.replaceComponent(row1, row1 = new DateField());
- glo.replaceComponent(row2, row2 = new DateField());
- glo.replaceComponent(row3, row3 = new DateField());
- ((DateField) row1).setResolution(DateField.RESOLUTION_SEC);
- ((DateField) row2).setResolution(DateField.RESOLUTION_SEC);
- ((DateField) row3).setResolution(DateField.RESOLUTION_SEC);
- glo.setComponentAlignment(col2, alignments[6]);
- glo.setComponentAlignment(col3, alignments[7]);
- glo.setComponentAlignment(col1, alignments[8]);
- hlo.addComponent(glo);
- return hlo;
- }
-
- @Override
- protected Layout getCaptionsTests() {
- GridLayout glo = getTestGrid();
- glo.setWidth("600px");
- String[] captions = new String[] {
- "",
- "abcdefghijklmnopq",
- "abc def hij klm nop qrs tuv xyz qaz wsx edc rfv tgb yhn ujm mko nji bhu vgy cft cde" };
- glo.replaceComponent(col1, col1 = new TextField());
- glo.replaceComponent(col2, col2 = new TextField());
- glo.replaceComponent(col3, col3 = new TextField());
-
- col1.setCaption(captions[0]);
- col2.setCaption(captions[1]);
- col3.setCaption(captions[2]);
- col3.setIcon(new ThemeResource(LOCK_16_PNG));
-
- glo.replaceComponent(row1, row1 = new Label());
- glo.replaceComponent(row2, row2 = new Label());
- glo.replaceComponent(row3, row3 = new Label());
-
- row1.setCaption(captions[0]);
- row2.setCaption(captions[1]);
- row3.setCaption(captions[2]);
-
- glo.replaceComponent(x3, x3 = getTestTabsheet());
- glo.replaceComponent(x22, x22 = getTestTable());
- x22.setComponentError(new UserError("component error, user error"));
-
- x3.setCaption(captions[1]);
- x22.setCaption(captions[2]);
-
- return glo;
- }
-
- @Override
- protected Layout getComponentAddReplaceMoveTests() {
- final GridLayout glo = getTestGrid();
- glo.setHeight("350px");
- Layout baseLayout = getBaseLayout();
- final Button button1 = new Button("Test add");
- final Button button2 = new Button("Test replace");
- final Button button3 = new Button("Test move");
- final Button button4 = new Button("Test remove comp 1,1");
- final Button button5 = new Button("Test remove row 0");
- final Button button6 = new Button("Test remove comp row3");
-
- button1.setId("testButton1");
- button2.setId("testButton2");
- button3.setId("testButton3");
- button4.setId("testButton4");
- button5.setId("testButton5");
- button6.setId("testButton6");
-
- baseLayout.addComponent(button1);
- baseLayout.addComponent(button2);
- baseLayout.addComponent(button3);
- baseLayout.addComponent(button4);
- baseLayout.addComponent(button5);
- baseLayout.addComponent(button6);
- baseLayout.addComponent(glo);
- button1.setEnabled(true);
- button2.setEnabled(false);
- button3.setEnabled(false);
- button4.setEnabled(false);
- button5.setEnabled(false);
- button6.setEnabled(false);
-
- final HorizontalLayout source = new HorizontalLayout();
- source.addComponent(new Label("MOVE LABEL 1"));
- source.addComponent(new Label("MOVE LABEL 2"));
-
- final AbstractComponent cc1 = getTestTabsheet();
- cc1.setCaption("ADDED COMPONENT");
-
- final AbstractComponent cc2 = getTestTabsheet();
- cc2.setCaption("REPLACEMENT COMPONENT");
-
- button1.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- glo.addComponent(cc1);
- button1.setEnabled(false);
- button2.setEnabled(true);
- }
- });
- button2.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- glo.replaceComponent(x22, cc2);
- button2.setEnabled(false);
- button3.setEnabled(true);
- }
- });
- button3.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- glo.moveComponentsFrom(source);
- button3.setEnabled(false);
- button4.setEnabled(true);
- }
- });
- button4.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- glo.removeComponent(1, 1);
- button4.setEnabled(false);
- button5.setEnabled(true);
- }
- });
-
- button5.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- glo.removeRow(0);
- button5.setEnabled(false);
- button6.setEnabled(true);
- }
- });
- button6.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- glo.removeComponent(row3);
- button6.setEnabled(false);
- }
- });
-
- return baseLayout;
- }
-
- @Override
- protected Layout getComponentSizingTests() {
- final GridLayout glo = getTestGrid();
- glo.setHeight("350px");
- Layout baseLayout = getBaseLayout();
- final Button button1 = new Button("full size, 3x1");
- final Button button2 = new Button("200 px width, 3x1");
- final Button button3 = new Button("200 px width, table");
- final Button button4 = new Button("undefined size+add, table");
-
- glo.replaceComponent(x22, x22 = getTestTable());
- button1.setId("testButton1");
- button2.setId("testButton2");
- button3.setId("testButton3");
- button4.setId("testButton4");
-
- baseLayout.addComponent(button1);
- baseLayout.addComponent(button2);
- baseLayout.addComponent(button3);
- baseLayout.addComponent(button4);
- baseLayout.addComponent(glo);
- button1.setEnabled(true);
- button2.setEnabled(false);
- button3.setEnabled(false);
- button4.setEnabled(false);
-
- button1.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- x3.setSizeFull();
- button1.setEnabled(false);
- button2.setEnabled(true);
- }
- });
- button2.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- x3.setWidth("200px");
- button2.setEnabled(false);
- button3.setEnabled(true);
- }
- });
- button3.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- x22.setWidth("200px");
- button3.setEnabled(false);
- button4.setEnabled(true);
- }
- });
- button4.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- x22.setSizeUndefined();
- ((Table) x22).addItem(new Object[] { "NEW ROW1" }, 3);
- ((Table) x22).addItem(new Object[] { "NEW ROW2" }, 4);
- button4.setEnabled(false);
- }
- });
-
- return baseLayout;
- }
-
- @Override
- protected Layout getExpandRatiosTests() {
- final GridLayout glo = getTestGrid();
- Layout baseLayout = getBaseLayout();
- final Button button1 = new Button("set col 3 expand 1");
- final Button button2 = new Button("set all cols expand 0.25");
- final Button button3 = new Button("set row 0 expand 0.5");
- final Button button4 = new Button("set row 3 expand 0.2");
- button1.setId("testButton1");
- button2.setId("testButton2");
- button3.setId("testButton3");
- button4.setId("testButton4");
-
- glo.setHeight("400px");
- glo.replaceComponent(x22, x22 = getTestTable());
-
- baseLayout.addComponent(button1);
- baseLayout.addComponent(button2);
- baseLayout.addComponent(button3);
- baseLayout.addComponent(button4);
- baseLayout.addComponent(glo);
- button1.setEnabled(true);
- button2.setEnabled(false);
- button3.setEnabled(false);
- button4.setEnabled(false);
-
- button1.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- glo.setColumnExpandRatio(3, 1);
- button1.setEnabled(false);
- button2.setEnabled(true);
- }
- });
- button2.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- glo.setColumnExpandRatio(0, 0.25f);
- glo.setColumnExpandRatio(1, 0.25f);
- glo.setColumnExpandRatio(2, 0.25f);
- glo.setColumnExpandRatio(3, 0.25f);
- button2.setEnabled(false);
- button3.setEnabled(true);
- }
- });
- button3.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- glo.setRowExpandRatio(0, 0.5f);
- button3.setEnabled(false);
- button4.setEnabled(true);
- }
- });
- button4.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- glo.setRowExpandRatio(3, 0.3f);
- button4.setEnabled(false);
- }
- });
-
- return baseLayout;
- }
-
- @Override
- protected Layout getIconsTests() {
- GridLayout glo = getTestGrid();
- glo.setWidth("600px");
- Resource[] icons = new Resource[] { new ThemeResource(CALENDAR_32_PNG),
- new ThemeResource(LOCK_16_PNG) };
-
- glo.replaceComponent(col1, col1 = new TextField("TEXTFIELD"));
- glo.replaceComponent(col2, col2 = new Label("LABEL"));
- glo.replaceComponent(col3, col3 = new Link("LINK", null));
-
- col1.setIcon(icons[0]);
- col2.setIcon(icons[1]);
- col3.setIcon(icons[0]);
- rc1.setIcon(icons[1]);
- col3.setCaption("long test caption bewucbwuebco or bmort b cbwecubw wbeucwe asdasd asdasda asdasd");
- col3.setComponentError(new UserError("component error, user error"));
-
- glo.replaceComponent(row1, row1 = new DateField());
- glo.replaceComponent(row2, row2 = new NativeSelect());
- glo.replaceComponent(row3, row3 = getTestTabsheet());
-
- row1.setIcon(icons[1]);
- row2.setIcon(icons[0]);
- row3.setIcon(icons[1]);
-
- glo.replaceComponent(x3, x3 = new CheckBox("CHECKBOX"));
- VerticalLayout pl = new VerticalLayout();
- pl.setMargin(true);
- glo.replaceComponent(x22, x22 = new Panel("PANEL", pl));
- x22.setIcon(new ThemeResource(CALENDAR_32_PNG));
-
- x3.setIcon(icons[0]);
- x22.setIcon(icons[1]);
-
- return glo;
- }
-
- @Override
- protected Layout getLayoutSizingTests() {
- final GridLayout glo = getTestGrid();
- Layout baseLayout = getBaseLayout();
- baseLayout.setWidth("500px");
- baseLayout.setHeight("500px");
- final Button button1 = new Button("Set fixed height 350px");
- final Button button2 = new Button(
- "Set undefined size and add component");
- final Button button3 = new Button("Set fixed width and height 75%");
- final Button button4 = new Button("Set size full");
-
- button1.setId("testButton1");
- button2.setId("testButton2");
- button3.setId("testButton3");
- button4.setId("testButton4");
-
- glo.replaceComponent(x22, x22 = getTestTable());
-
- baseLayout.addComponent(button1);
- baseLayout.addComponent(button2);
- baseLayout.addComponent(button3);
- baseLayout.addComponent(button4);
- baseLayout.addComponent(glo);
- // Don't expand the buttons
- ((AbstractOrderedLayout) baseLayout).setExpandRatio(glo, 1);
-
- button1.setEnabled(true);
- button2.setEnabled(false);
- button3.setEnabled(false);
- button4.setEnabled(false);
-
- button1.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- glo.setHeight("350px");
- button1.setEnabled(false);
- button2.setEnabled(true);
- }
- });
- button2.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- glo.setSizeUndefined();
- glo.addComponent(new Label("--- NEW LABEL ---"));
- button2.setEnabled(false);
- button3.setEnabled(true);
- }
- });
- button3.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- glo.setWidth("75%");
- glo.setHeight("75%");
- button3.setEnabled(false);
- button4.setEnabled(true);
- }
- });
- button4.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- glo.setSizeFull();
- button4.setEnabled(false);
- }
- });
-
- return baseLayout;
- }
-
- @Override
- protected Layout getMarginSpacingTests() {
- final GridLayout glo = getTestGrid();
- Layout baseLayout = getBaseLayout();
- baseLayout.setWidth("500px");
- baseLayout.setHeight("500px");
- final Button button1 = new Button("Set margin on");
- final Button button2 = new Button("Set spacing on");
- final Button button3 = new Button("Set margin off");
- final Button button4 = new Button("Set spacing off");
-
- button1.setId("testButton1");
- button2.setId("testButton2");
- button3.setId("testButton3");
- button4.setId("testButton4");
-
- baseLayout.addComponent(button1);
- baseLayout.addComponent(button2);
- baseLayout.addComponent(button3);
- baseLayout.addComponent(button4);
- button1.setEnabled(true);
- button2.setEnabled(false);
- button3.setEnabled(false);
- button4.setEnabled(false);
-
- baseLayout.addComponent(glo);
-
- // Don't expand the buttons
- ((AbstractOrderedLayout) baseLayout).setExpandRatio(glo, 1);
-
- button1.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- glo.setMargin(true);
- button1.setEnabled(false);
- button2.setEnabled(true);
- }
- });
- button2.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- glo.setSpacing(true);
- button2.setEnabled(false);
- button3.setEnabled(true);
- }
- });
- button3.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- glo.setMargin(false);
- button3.setEnabled(false);
- button4.setEnabled(true);
- }
- });
- button4.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- glo.setSpacing(false);
- button4.setEnabled(false);
- }
- });
-
- return baseLayout;
- }
-
- @Override
- protected Layout getRequiredErrorIndicatorsTests() {
- GridLayout glo = getTestGrid();
- glo.setWidth("600px");
- Resource[] icons = new Resource[] { new ThemeResource(CALENDAR_32_PNG),
- new ThemeResource(LOCK_16_PNG) };
-
- glo.replaceComponent(col1, col1 = new TextField("TEXTFIELD"));
- glo.replaceComponent(col2, col2 = new Label("LABEL"));
- // Make sure it doesn't shrink to 0px
- col2.setWidth(null);
- glo.replaceComponent(col3, col3 = new Link("LINK", null));
-
- col1.setIcon(icons[0]);
- col1.setComponentError(new UserError("component error, user error"));
- col2.setComponentError(new SystemError("component error, system error"));
- col3.setComponentError(new UserError("component error, user error"));
-
- glo.replaceComponent(row1, row1 = new DateField());
- glo.replaceComponent(row2, row2 = new NativeSelect());
- glo.replaceComponent(row3, row3 = getTestTabsheet());
-
- ((AbstractField<?>) col1).setRequired(true);
- ((AbstractField<?>) col1).setValidationVisible(true);
- ((AbstractField<?>) col1).setRequiredError("required error");
-
- ((AbstractField<?>) row1).setRequired(true);
- ((AbstractField<?>) row1).setValidationVisible(true);
- ((AbstractField<?>) row1).setRequiredError("required error");
-
- ((AbstractField<?>) row2).setRequired(true);
- ((AbstractField<?>) row2).setValidationVisible(true);
- ((AbstractField<?>) row2).setRequiredError("required error");
- row2.setComponentError(new UserError("component error, user error"));
-
- row3.setComponentError(new UserError("component error, user error"));
- row3.setIcon(icons[1]);
- row3.setCaption("long test caption bewucbwuebco or bmort b cbwecubw wbeucwe asdasd asdasda asdasd");
-
- glo.replaceComponent(x3, x3 = new CheckBox("CHECKBOX"));
- VerticalLayout pl = new VerticalLayout();
- pl.setMargin(true);
- glo.replaceComponent(x22, x22 = new Panel("PANEL", pl));
-
- x3.setComponentError(new UserError("component error, user error"));
- x22.setComponentError(new UserError("component error, user error"));
- x22.setIcon(icons[0]);
-
- return glo;
- }
-
- private GridLayout getTestGrid() {
- // Create a 4 by 4 grid layout.
- GridLayout grid = new GridLayout(4, 4);
- // Fill out the first row using the cursor.
- grid.addComponent(rc1 = new Button("R/C 1"));
-
- grid.addComponent(col1 = new Button("Col " + (grid.getCursorX() + 1)));
- grid.addComponent(col2 = new Button("Col " + (grid.getCursorX() + 1)));
- grid.addComponent(col3 = new Button("Col " + (grid.getCursorX() + 1)));
-
- // Fill out the first column using coordinates.
-
- grid.addComponent(row1 = new Button("Row " + 1), 0, 1);
- grid.addComponent(row2 = new Button("Row " + 2), 0, 2);
- grid.addComponent(row3 = new Button("Row " + 3), 0, 3);
-
- // Add some components of various shapes.
- grid.addComponent(x3 = new Button("3x1 button"), 1, 1, 3, 1);
- grid.addComponent(new Label("1x2 cell"), 1, 2, 1, 3);
- x22 = new InlineDateField("A 2x2 date field");
- ((InlineDateField) x22).setResolution(DateField.RESOLUTION_DAY);
- ((InlineDateField) x22).setValue(new Date(128028960000l));
- grid.addComponent(x22, 2, 2, 3, 3);
- grid.setWidth("450px");
- grid.setHeight("450px");
- return grid;
- }
-
- private VerticalLayout getBaseLayout() {
- VerticalLayout vlo = new VerticalLayout();
- vlo.setSizeUndefined();
- return vlo;
- }
-
- private AbstractComponent getTestTabsheet() {
- TabSheet tabsheet = new TabSheet();
- tabsheet.setSizeUndefined();
- tabsheet.addTab(new UndefWideLabel("TAB1"), "TAB1", new ThemeResource(
- GLOBE_16_PNG));
- tabsheet.addTab(new UndefWideLabel("TAB2"), "TAB2", null);
- return tabsheet;
- }
-
- private Table getTestTable() {
- Table t = new Table();
- t.setSizeUndefined();
- t.setPageLength(5);
- t.addContainerProperty("test", String.class, null);
- t.addItem(new Object[] { "qwertyuiop asdfghjklzxccvbnm,m,." }, 1);
- t.addItem(new Object[] { "YGVYTCTCTRXRXRXRX" }, 2);
- return t;
- }
-
-}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HAddReplaceMove.java b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HAddReplaceMove.java
new file mode 100644
index 0000000000..1c0e992a86
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HAddReplaceMove.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.HLayout;
+
+import com.vaadin.annotations.Theme;
+import com.vaadin.tests.layouts.layouttester.BaseAddReplaceMove;
+import com.vaadin.ui.HorizontalLayout;
+
+
+public class HAddReplaceMove extends BaseAddReplaceMove {
+
+ /**
+ * @param layoutClass
+ */
+ public HAddReplaceMove() {
+ super(HorizontalLayout.class);
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HAddReplaceMoveTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HAddReplaceMoveTest.java
new file mode 100644
index 0000000000..367664069d
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HAddReplaceMoveTest.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.HLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseAddReplaceMoveTest;
+
+public class HAddReplaceMoveTest extends BaseAddReplaceMoveTest {
+
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HAlignment.java b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HAlignment.java
new file mode 100644
index 0000000000..9864fcaa41
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HAlignment.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.HLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseAlignment;
+import com.vaadin.ui.HorizontalLayout;
+
+public class HAlignment extends BaseAlignment {
+
+ public HAlignment() {
+ super(HorizontalLayout.class);
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HAlignmentTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HAlignmentTest.java
new file mode 100644
index 0000000000..055ad8e607
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HAlignmentTest.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.HLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseAlignmentTest;
+
+public class HAlignmentTest extends BaseAlignmentTest {
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HCaption.java b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HCaption.java
new file mode 100644
index 0000000000..bb974a8c68
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HCaption.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.HLayout;
+
+import com.vaadin.annotations.Theme;
+import com.vaadin.tests.layouts.layouttester.BaseCaption;
+import com.vaadin.ui.HorizontalLayout;
+
+
+public class HCaption extends BaseCaption {
+
+ /**
+ * @param layoutClass
+ */
+ public HCaption() {
+ super(HorizontalLayout.class);
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HCaptionTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HCaptionTest.java
new file mode 100644
index 0000000000..c10da9eefe
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HCaptionTest.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.HLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseCaptionTest;
+
+public class HCaptionTest extends BaseCaptionTest {
+
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HComponentSizing.java b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HComponentSizing.java
new file mode 100644
index 0000000000..b042c018eb
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HComponentSizing.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.HLayout;
+
+import com.vaadin.annotations.Theme;
+import com.vaadin.tests.layouts.layouttester.BaseComponentSizing;
+import com.vaadin.ui.HorizontalLayout;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+
+public class HComponentSizing extends BaseComponentSizing {
+
+ /**
+ * @param layoutClass
+ */
+ public HComponentSizing() {
+ super(HorizontalLayout.class);
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HComponentSizingTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HComponentSizingTest.java
new file mode 100644
index 0000000000..86aa330901
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HComponentSizingTest.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.HLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseComponentSizingTest;
+
+public class HComponentSizingTest extends BaseComponentSizingTest {
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HIcon.java b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HIcon.java
new file mode 100644
index 0000000000..cb4eb321b9
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HIcon.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.HLayout;
+
+import com.vaadin.annotations.Theme;
+import com.vaadin.tests.layouts.layouttester.BaseIcon;
+import com.vaadin.ui.HorizontalLayout;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+
+public class HIcon extends BaseIcon {
+
+ /**
+ * @param layoutClass
+ */
+ public HIcon() {
+ super(HorizontalLayout.class);
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HIconTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HIconTest.java
new file mode 100644
index 0000000000..e01e1d1726
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HIconTest.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.HLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseIconTest;
+
+public class HIconTest extends BaseIconTest {
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutExpand.java b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutExpand.java
new file mode 100644
index 0000000000..273ca07bc4
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutExpand.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.HLayout;
+
+import com.vaadin.annotations.Theme;
+import com.vaadin.tests.layouts.layouttester.BaseLayoutExpand;
+import com.vaadin.ui.HorizontalLayout;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+
+public class HLayoutExpand extends BaseLayoutExpand {
+
+ /**
+ * @param layoutClass
+ */
+ public HLayoutExpand() {
+ super(HorizontalLayout.class);
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutExpandTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutExpandTest.java
new file mode 100644
index 0000000000..f24abba9d2
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutExpandTest.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.HLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseLayoutExpandTest;
+
+public class HLayoutExpandTest extends BaseLayoutExpandTest {
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutMarginSpacing.java b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutMarginSpacing.java
new file mode 100644
index 0000000000..9fea380155
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutMarginSpacing.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.HLayout;
+
+import com.vaadin.annotations.Theme;
+import com.vaadin.tests.layouts.layouttester.BaseLayoutForSpacingMargin;
+import com.vaadin.ui.HorizontalLayout;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+
+public class HLayoutMarginSpacing extends BaseLayoutForSpacingMargin {
+
+ /**
+ * @param layoutClass
+ */
+ public HLayoutMarginSpacing() {
+ super(HorizontalLayout.class);
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutMarginSpacingTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutMarginSpacingTest.java
new file mode 100644
index 0000000000..1abae12ce6
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutMarginSpacingTest.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.HLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseLayoutMarginSpacingTest;
+
+public class HLayoutMarginSpacingTest extends BaseLayoutMarginSpacingTest {
+
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutRegError.java b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutRegError.java
new file mode 100644
index 0000000000..3c7134a061
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutRegError.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.HLayout;
+
+import com.vaadin.annotations.Theme;
+import com.vaadin.tests.layouts.layouttester.BaseRegError;
+import com.vaadin.ui.HorizontalLayout;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+
+public class HLayoutRegError extends BaseRegError {
+
+ /**
+ * @param layoutClass
+ */
+ public HLayoutRegError() {
+ super(HorizontalLayout.class);
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutRegErrorTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutRegErrorTest.java
new file mode 100644
index 0000000000..673c08d4fa
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutRegErrorTest.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.HLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseLayoutRegErrorTest;
+
+public class HLayoutRegErrorTest extends BaseLayoutRegErrorTest {
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutSizing.java b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutSizing.java
new file mode 100644
index 0000000000..350037b05c
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutSizing.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.HLayout;
+
+import com.vaadin.annotations.Theme;
+import com.vaadin.tests.layouts.layouttester.BaseComponentSizing;
+import com.vaadin.ui.HorizontalLayout;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+
+public class HLayoutSizing extends BaseComponentSizing {
+
+ /**
+ * @param layoutClass
+ */
+ public HLayoutSizing() {
+ super(HorizontalLayout.class);
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutSizingTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutSizingTest.java
new file mode 100644
index 0000000000..5f4d52a5d5
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/HLayout/HLayoutSizingTest.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.HLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseLayoutSizingTest;
+
+public class HLayoutSizingTest extends BaseLayoutSizingTest {
+
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/HorizontalLayoutTests.java b/uitest/src/com/vaadin/tests/layouts/layouttester/HorizontalLayoutTests.java
deleted file mode 100644
index afa53c012e..0000000000
--- a/uitest/src/com/vaadin/tests/layouts/layouttester/HorizontalLayoutTests.java
+++ /dev/null
@@ -1,597 +0,0 @@
-package com.vaadin.tests.layouts.layouttester;
-
-import com.vaadin.server.LegacyApplication;
-import com.vaadin.server.Resource;
-import com.vaadin.server.SystemError;
-import com.vaadin.server.ThemeResource;
-import com.vaadin.server.UserError;
-import com.vaadin.shared.ui.label.ContentMode;
-import com.vaadin.ui.AbstractComponent;
-import com.vaadin.ui.AbstractField;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.CheckBox;
-import com.vaadin.ui.DateField;
-import com.vaadin.ui.HorizontalLayout;
-import com.vaadin.ui.Label;
-import com.vaadin.ui.Layout;
-import com.vaadin.ui.Link;
-import com.vaadin.ui.Select;
-import com.vaadin.ui.TabSheet;
-import com.vaadin.ui.Table;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.themes.Reindeer;
-
-public class HorizontalLayoutTests extends AbstractLayoutTests {
-
- public HorizontalLayoutTests(LegacyApplication application) {
- super();
- }
-
- @Override
- protected Layout getAlignmentTests() {
- Layout baseLayout = getBaseLayout();
- HorizontalLayout vlo = getTestLaytout();
- AbstractComponent[] components = new AbstractComponent[9];
- String[] styles = { Reindeer.LAYOUT_BLUE, Reindeer.LAYOUT_WHITE };
- Alignment[] alignments = new Alignment[] { Alignment.BOTTOM_LEFT,
- Alignment.BOTTOM_CENTER, Alignment.BOTTOM_RIGHT,
- Alignment.MIDDLE_LEFT, Alignment.MIDDLE_CENTER,
- Alignment.MIDDLE_RIGHT, Alignment.TOP_LEFT,
- Alignment.TOP_CENTER, Alignment.TOP_RIGHT };
-
- vlo.addStyleName(Reindeer.LAYOUT_WHITE);
- baseLayout.addComponent(vlo);
- int index = 0;
- for (int i = 0; i < components.length; i++) {
- if (i > 0 && i % 3 == 0) {
- vlo = getTestLaytout();
- vlo.addStyleName(styles[index++]);
- baseLayout.addComponent(vlo);
- }
- components[i] = new TextField();
- ((TextField) components[i]).setValue("FIELD " + i);
- vlo.addComponent(components[i]);
- vlo.setComponentAlignment(components[i], alignments[i]);
- }
- return baseLayout;
- }
-
- @Override
- protected Layout getCaptionsTests() {
- Layout baseLayout = getBaseLayout();
- AbstractComponent component = null;
-
- String[] captions = new String[] {
- "",
- "abcdefghijklmnopq",
- "abc def hij klm nop qrs tuv xyz qaz wsx edc rfv tgb yhn ujm mko nji bhu vgy cft cde" };
-
- HorizontalLayout vlo = getTestLaytout();
- for (int i = 0; i < captions.length; i++) {
- component = new TextField();
- ((TextField) component).setValue("FIELD " + i);
- component.setCaption(captions[i]);
- vlo.addComponent(component);
- }
- baseLayout.addComponent(vlo);
- vlo = getTestLaytout();
- for (int i = 0; i < captions.length; i++) {
- component = new Label();
- ((Label) component).setValue("Label " + i);
- component.setCaption(captions[i]);
- vlo.addComponent(component);
- }
- baseLayout.addComponent(vlo);
- vlo = getTestLaytout();
- for (int i = 0; i < captions.length; i++) {
- component = new Select();
- component.setCaption(captions[i]);
- component.setIcon(new ThemeResource(LOCK_16_PNG));
- vlo.addComponent(component);
- }
- baseLayout.addComponent(vlo);
- vlo = getTestLaytout();
- for (int i = 0; i < captions.length; i++) {
- component = getTestTabsheet();
- component.setCaption(captions[i]);
- component.setComponentError(new UserError(""));
- vlo.addComponent(component);
- }
- baseLayout.addComponent(vlo);
- return baseLayout;
- }
-
- @Override
- protected Layout getComponentAddReplaceMoveTests() {
- final HorizontalLayout vlo = getTestLaytout();
- Layout baseLayout = getBaseLayout();
- final HorizontalLayout source = new HorizontalLayout();
- source.addComponent(new Label("OTHER LABEL 1"));
- source.addComponent(new Label("OTHER LABEL 2"));
-
- final AbstractComponent c1 = new Button("BUTTON");
- final AbstractComponent c2 = new Label("<b>LABEL</b>", ContentMode.HTML);
- final AbstractComponent c3 = new Table("TABLE");
- c3.setHeight("100px");
- c3.setWidth("100%");
-
- final Button addButton = new Button("Test add");
- final Button replaceButton = new Button("Test replace");
- final Button moveButton = new Button("Test move");
- final Button removeButton = new Button("Test remove");
- addButton.setId("testButton1");
- replaceButton.setId("testButton2");
- moveButton.setId("testButton3");
- removeButton.setId("testButton4");
- replaceButton.setEnabled(false);
- moveButton.setEnabled(false);
- removeButton.setEnabled(false);
-
- addButton.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo.addComponent(new TextField());
- addButton.setEnabled(false);
- replaceButton.setEnabled(true);
- }
- });
- replaceButton.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo.replaceComponent(c1, c3);
- replaceButton.setEnabled(false);
- moveButton.setEnabled(true);
- }
- });
- moveButton.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo.moveComponentsFrom(source);
- moveButton.setEnabled(false);
- removeButton.setEnabled(true);
- }
- });
- removeButton.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo.removeComponent(c1);
- vlo.removeComponent(c2);
- removeButton.setEnabled(false);
- }
- });
-
- baseLayout.addComponent(addButton);
- baseLayout.addComponent(replaceButton);
- baseLayout.addComponent(moveButton);
- baseLayout.addComponent(removeButton);
-
- vlo.addComponent(c1);
- vlo.addComponent(c2);
- vlo.addComponent(c3);
- baseLayout.addComponent(vlo);
-
- return baseLayout;
- }
-
- @Override
- protected Layout getComponentSizingTests() {
- final HorizontalLayout vlo = getTestLaytout();
- Layout baseLayout = getBaseLayout();
-
- final AbstractComponent c = getTestTable();
-
- final Button biggerButton = new Button("full size");
- final Button smallerButton = new Button("200 px width");
- final Button originalButton = new Button("undefined size+add");
-
- biggerButton.setId("testButton1");
- smallerButton.setId("testButton2");
- originalButton.setId("testButton3");
-
- baseLayout.addComponent(biggerButton);
- baseLayout.addComponent(smallerButton);
- baseLayout.addComponent(originalButton);
- vlo.addComponent(c);
- baseLayout.addComponent(vlo);
-
- biggerButton.setEnabled(true);
- smallerButton.setEnabled(false);
- originalButton.setEnabled(false);
-
- biggerButton.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- c.setSizeFull();
- biggerButton.setEnabled(false);
- smallerButton.setEnabled(true);
- }
- });
- smallerButton.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- c.setWidth("200px");
- smallerButton.setEnabled(false);
- originalButton.setEnabled(true);
- }
- });
- originalButton.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- originalButton.setEnabled(false);
- c.setSizeUndefined();
- ((Table) c)
- .addItem(
- new Object[] { "VYVTCTC VYVYV ECECCE NIDSD SDMPOM" },
- 3);
- }
- });
-
- return baseLayout;
- }
-
- @Override
- protected Layout getLayoutSizingTests() {
- final HorizontalLayout vlo = getTestLaytout();
- vlo.setSpacing(false);
- vlo.setMargin(false);
- Layout baseLayout = getBaseLayout();
- final AbstractComponent c1 = getTestTable();
- c1.setSizeFull();
- final AbstractComponent c2 = getTestTable();
- c2.setSizeFull();
-
- final Button button1 = new Button("Set fixed height 350px");
- final Button button2 = new Button(
- "Set undefined size and add component");
- final Button button3 = new Button("Set fixed width and height 75%");
- final Button button4 = new Button("Set size full");
-
- button1.setId("testButton1");
- button2.setId("testButton2");
- button3.setId("testButton3");
- button4.setId("testButton4");
-
- baseLayout.addComponent(button1);
- baseLayout.addComponent(button2);
- baseLayout.addComponent(button3);
- baseLayout.addComponent(button4);
- button1.setEnabled(true);
- button2.setEnabled(false);
- button3.setEnabled(false);
- button4.setEnabled(false);
-
- vlo.addComponent(c1);
- vlo.addComponent(c2);
- vlo.setExpandRatio(c1, 0.5f);
- vlo.setExpandRatio(c2, 0.5f);
-
- baseLayout.addComponent(vlo);
-
- button1.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo.setHeight("350px");
- button1.setEnabled(false);
- button2.setEnabled(true);
- }
- });
- button2.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo.setSizeUndefined();
- Label label = new Label("--- NEW LABEL ---");
- label.setWidth(null);
- vlo.addComponent(label);
- button2.setEnabled(false);
- button3.setEnabled(true);
- }
- });
- button3.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo.setWidth("75%");
- vlo.setHeight("75%");
- button3.setEnabled(false);
- button4.setEnabled(true);
- }
- });
- button4.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo.setSizeFull();
- button4.setEnabled(false);
- }
- });
-
- return baseLayout;
- }
-
- @Override
- protected Layout getExpandRatiosTests() {
- final HorizontalLayout vlo = getTestLaytout();
- Layout baseLayout = getBaseLayout();
- final AbstractComponent c1 = getTestTable();
- c1.setSizeFull();
- final AbstractComponent c2 = getTestTable();
- c2.setSizeFull();
-
- final Button button1 = new Button("Expand to 1/undefined");
- final Button button2 = new Button("Expand to 0.5/0.5");
- final Button button3 = new Button("Expand to 0.75/0.25");
- button1.setId("testButton1");
- button2.setId("testButton2");
- button3.setId("testButton3");
-
- baseLayout.addComponent(button1);
- baseLayout.addComponent(button2);
- baseLayout.addComponent(button3);
- button1.setEnabled(true);
- button2.setEnabled(false);
- button3.setEnabled(false);
-
- vlo.addComponent(c1);
- vlo.addComponent(c2);
- baseLayout.addComponent(vlo);
-
- button1.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo.setExpandRatio(c1, 1.0f);
- button1.setEnabled(false);
- button2.setEnabled(true);
- }
- });
- button2.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo.setExpandRatio(c1, 0.5f);
- vlo.setExpandRatio(c2, 0.5f);
- button2.setEnabled(false);
- button3.setEnabled(true);
- }
- });
- button3.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo.setExpandRatio(c1, 0.75f);
- vlo.setExpandRatio(c2, 0.25f);
- button3.setEnabled(false);
- }
- });
- return baseLayout;
- }
-
- @Override
- protected Layout getIconsTests() {
- HorizontalLayout vlo = getTestLaytout();
- AbstractComponent[] components = new AbstractComponent[2];
- Layout baseLayout = getBaseLayout();
- Resource[] icons = new Resource[] { new ThemeResource(CALENDAR_32_PNG),
- new ThemeResource(LOCK_16_PNG) };
-
- for (int i = 0; i < components.length; i++) {
- components[i] = new TextField();
- ((TextField) components[i]).setValue("FIELD " + i);
- components[i].setIcon(icons[i]);
- components[i]
- .setCaption("long test caption bewucbwuebco or bmort b cbwecubw wbeucwe asdasd asdasda asdasd");
- vlo.addComponent(components[i]);
- }
- for (int i = 0; i < components.length; i++) {
- components[i] = new Label();
- ((Label) components[i]).setValue("Label " + i);
- components[i].setIcon(icons[i]);
- vlo.addComponent(components[i]);
- }
- baseLayout.addComponent(vlo);
- vlo = getTestLaytout();
- for (int i = 0; i < components.length; i++) {
- components[i] = new Select();
- components[i].setIcon(icons[i]);
- vlo.addComponent(components[i]);
- }
- for (int i = 0; i < components.length; i++) {
- components[i] = new Button();
- components[i].setComponentError(new UserError(
- "component error, user error"));
- components[i].setIcon(icons[i]);
- vlo.addComponent(components[i]);
- }
- for (int i = 0; i < components.length; i++) {
- components[i] = new Link("Link", null);
- components[i].setIcon(icons[i]);
- vlo.addComponent(components[i]);
- }
- baseLayout.addComponent(vlo);
- return baseLayout;
- }
-
- @Override
- protected Layout getMarginSpacingTests() {
- final HorizontalLayout vlo = getTestLaytout();
- vlo.setSpacing(false);
- vlo.setMargin(false);
- Layout baseLayout = getBaseLayout();
- final AbstractComponent c1 = getTestTable();
- c1.setSizeFull();
- final AbstractComponent c2 = getTestTable();
- c2.setSizeFull();
-
- final Button button1 = new Button("Set margin on");
- final Button button2 = new Button("Set spacing on");
- final Button button3 = new Button("Set margin off");
- final Button button4 = new Button("Set spacing off");
- button1.setId("testButton1");
- button2.setId("testButton2");
- button3.setId("testButton3");
- button4.setId("testButton4");
-
- baseLayout.addComponent(button1);
- baseLayout.addComponent(button2);
- baseLayout.addComponent(button3);
- baseLayout.addComponent(button4);
- button1.setEnabled(true);
- button2.setEnabled(false);
- button3.setEnabled(false);
- button4.setEnabled(false);
-
- vlo.addComponent(c1);
- vlo.addComponent(c2);
- vlo.setExpandRatio(c1, 0.5f);
- vlo.setExpandRatio(c2, 0.5f);
- baseLayout.addComponent(vlo);
-
- button1.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo.setMargin(true);
- button1.setEnabled(false);
- button2.setEnabled(true);
- }
- });
- button2.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo.setSpacing(true);
- button2.setEnabled(false);
- button3.setEnabled(true);
- }
- });
- button3.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo.setMargin(false);
- button3.setEnabled(false);
- button4.setEnabled(true);
- }
- });
- button4.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo.setSpacing(false);
- button4.setEnabled(false);
- }
- });
-
- return baseLayout;
- }
-
- @Override
- protected Layout getRequiredErrorIndicatorsTests() {
- HorizontalLayout vlo = getTestLaytout();
- Layout baseLayout = getBaseLayout();
- AbstractComponent[] components = new AbstractComponent[4];
- components[0] = new Label("LABEL");
- components[0].setSizeUndefined();
- components[1] = new Button("BUTTON");
- components[2] = getTestTable();
- components[3] = getTestTabsheet();
- components[3].setIcon(new ThemeResource(LOCK_16_PNG));
-
- AbstractField<?>[] fields = new AbstractField<?>[5];
- fields[0] = new TextField();
- fields[0].setRequired(true);
- fields[0].setValidationVisible(true);
- fields[0].setRequiredError("required error");
-
- fields[1] = new TextField();
- ((TextField) fields[1]).setValue("TEXTFIELD2");
- fields[1]
- .setComponentError(new UserError("component error, user error"));
-
- fields[2] = new Select();
- fields[2].setComponentError(new SystemError(
- "component error, system error"));
- fields[3] = new DateField();
- fields[3].setComponentError(new SystemError(
- "component error, system error"));
-
- fields[4] = new CheckBox();
- fields[4]
- .setComponentError(new UserError("component error, user error"));
-
- for (int i = 0; i < components.length; i++) {
- components[i].setComponentError(new UserError(
- "component error, user error"));
- vlo.addComponent(components[i]);
- }
- baseLayout.addComponent(vlo);
- vlo = getTestLaytout();
- for (int i = 0; i < fields.length; i++) {
- vlo.addComponent(fields[i]);
- }
- baseLayout.addComponent(vlo);
- return baseLayout;
- }
-
- private VerticalLayout getBaseLayout() {
- VerticalLayout vlo = new VerticalLayout();
- vlo.setSizeUndefined();
- return vlo;
- }
-
- private HorizontalLayout getTestLaytout() {
- HorizontalLayout vlo = new HorizontalLayout();
- vlo.setHeight("100px");
- vlo.setWidth("750px");
- return vlo;
- }
-
- private AbstractComponent getTestTabsheet() {
- TabSheet tabsheet = new TabSheet();
- tabsheet.setSizeUndefined();
- tabsheet.addTab(new UndefWideLabel("TAB1"), "TAB1", new ThemeResource(
- GLOBE_16_PNG));
- tabsheet.addTab(new UndefWideLabel("TAB2"), "TAB2", null);
- return tabsheet;
- }
-
- private Table getTestTable() {
- Table t = new Table();
- t.setSizeUndefined();
- t.setPageLength(5);
- t.addContainerProperty("test", String.class, null);
- t.addItem(new Object[] { "qwertyuiop asdfghjkl zxccvbnm,m,." }, 1);
- t.addItem(new Object[] { "YGVYTCTCTRXRXRXRX" }, 2);
- return t;
- }
-}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/LayoutTesterApplication.java b/uitest/src/com/vaadin/tests/layouts/layouttester/LayoutTesterApplication.java
deleted file mode 100644
index 5b68e04144..0000000000
--- a/uitest/src/com/vaadin/tests/layouts/layouttester/LayoutTesterApplication.java
+++ /dev/null
@@ -1,147 +0,0 @@
-package com.vaadin.tests.layouts.layouttester;
-
-import java.lang.reflect.Method;
-
-import com.vaadin.data.Property;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.tests.components.AbstractTestCase;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.GridLayout;
-import com.vaadin.ui.HorizontalLayout;
-import com.vaadin.ui.Layout;
-import com.vaadin.ui.LegacyWindow;
-import com.vaadin.ui.NativeSelect;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.themes.Reindeer;
-
-@SuppressWarnings("serial")
-public class LayoutTesterApplication extends AbstractTestCase {
- Button nextButton = new Button("Next");
- private int layoutIndex = -1;
-
- static final String[] layoutGetters = new String[] { "getCaptionsTests",
- "getIconsTests", "getRequiredErrorIndicatorsTests",
- "getAlignmentTests", "getExpandRatiosTests",
- "getMarginSpacingTests", "getComponentAddReplaceMoveTests",
- "getComponentSizingTests", "getLayoutSizingTests" };
- public static final String NEXT_BUTTON_ID = "nextButton";
- private static final String LAYOUT_SELECT_ID = "layoutSelect";
-
- private LegacyWindow mainWindow;
- private NativeSelect layoutSelector;
-
- @Override
- public void init() {
- nextButton.setId(NEXT_BUTTON_ID);
- mainWindow = new LegacyWindow("LayoutTesterApplication");
- setMainWindow(mainWindow);
- nextLayout();
-
- nextButton.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = -1577298910202253538L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- nextLayout();
- }
- });
- }
-
- private void nextLayout() {
- try {
- mainWindow.removeAllComponents();
- HorizontalLayout vlo = new HorizontalLayout();
- vlo.setSpacing(true);
- ++layoutIndex;
- if (layoutIndex >= layoutGetters.length) {
- layoutIndex = 0;
- }
- mainWindow.addComponent(vlo);
- vlo.addComponent(nextButton);
- vlo.addComponent(getLayoutTypeSelect());
- vlo.addComponent(new UndefWideLabel(getLayoutGetterMethod(
- layoutGetters[layoutIndex]).getName()));
-
- Layout lo = null;
- if (layoutSelector.getValue() == VerticalLayout.class) {
- lo = getVerticalTestLayout(layoutIndex);
- } else if (layoutSelector.getValue() == HorizontalLayout.class) {
- lo = getHorizontalTestLayout(layoutIndex);
- } else if (layoutSelector.getValue() == GridLayout.class) {
- lo = getGridTestLayout(layoutIndex);
- }
- if (lo != null) {
- lo.addStyleName(Reindeer.LAYOUT_BLUE);
- mainWindow.addComponent(lo);
- }
- } catch (Exception e) {
- e.printStackTrace();
- throw new RuntimeException(e);
- }
- }
-
- private Method getLayoutGetterMethod(String method) {
- try {
- return AbstractLayoutTests.class.getDeclaredMethod(method);
- } catch (SecurityException e) {
- e.printStackTrace();
- throw new RuntimeException(e);
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
- throw new RuntimeException(e);
- }
- }
-
- public Layout getVerticalTestLayout(int index) throws Exception {
- VerticalLayoutTests vlotest = new VerticalLayoutTests(this);
- return (Layout) getLayoutGetterMethod(layoutGetters[index]).invoke(
- vlotest, (Object[]) null);
- }
-
- public Layout getHorizontalTestLayout(int index) throws Exception {
- HorizontalLayoutTests hlotest = new HorizontalLayoutTests(this);
- return (Layout) getLayoutGetterMethod(layoutGetters[index]).invoke(
- hlotest, (Object[]) null);
- }
-
- public Layout getGridTestLayout(int index) throws Exception {
- GridLayoutTests hlotest = new GridLayoutTests(this);
- return (Layout) getLayoutGetterMethod(layoutGetters[index]).invoke(
- hlotest, (Object[]) null);
- }
-
- private NativeSelect getLayoutTypeSelect() {
- if (layoutSelector == null) {
- layoutSelector = new NativeSelect();
- layoutSelector.setId(LAYOUT_SELECT_ID);
- layoutSelector.addItem(VerticalLayout.class);
- layoutSelector.addItem(HorizontalLayout.class);
- layoutSelector.addItem(GridLayout.class);
- layoutSelector.setNullSelectionAllowed(false);
- layoutSelector.setImmediate(true);
- layoutSelector.select(VerticalLayout.class);
- layoutSelector.addListener(new Property.ValueChangeListener() {
- private static final long serialVersionUID = -605319614765838359L;
-
- @Override
- public void valueChange(ValueChangeEvent event) {
- layoutIndex = -1;
- nextLayout();
- }
- });
- }
- return layoutSelector;
- }
-
- @Override
- protected String getDescription() {
- return "Test application for VerticalLayout, HorizontalLayout, and GridLayout";
- }
-
- @Override
- protected Integer getTicketNumber() {
- return 5334;
- }
-
-}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/LayoutTesterApplicationTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/LayoutTesterApplicationTest.java
deleted file mode 100644
index 5d8a6e0e7a..0000000000
--- a/uitest/src/com/vaadin/tests/layouts/layouttester/LayoutTesterApplicationTest.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright 2000-2014 Vaadin Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.vaadin.tests.layouts.layouttester;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.junit.Test;
-import org.openqa.selenium.By;
-import org.openqa.selenium.remote.DesiredCapabilities;
-import org.openqa.selenium.support.ui.Select;
-
-import com.vaadin.tests.tb3.MultiBrowserTest;
-import com.vaadin.ui.GridLayout;
-import com.vaadin.ui.HorizontalLayout;
-import com.vaadin.ui.VerticalLayout;
-
-public class LayoutTesterApplicationTest extends MultiBrowserTest {
-
- @Override
- protected DesiredCapabilities getDesiredCapabilities() {
- DesiredCapabilities cap = new DesiredCapabilities(
- super.getDesiredCapabilities());
- cap.setCapability("nativeEvents", false);
-
- return cap;
- }
-
- Map<String, Integer> numberOfSubTests = new HashMap<String, Integer>();
- private Set<String> tableOrIconsTests = new HashSet<String>();
-
- {
- numberOfSubTests.put("getExpandRatiosTests", 3);
- numberOfSubTests.put("getLayoutSizingTests", 4);
- numberOfSubTests.put("getComponentAddReplaceMoveTests", 4);
- numberOfSubTests.put("getMarginSpacingTests", 4);
- numberOfSubTests.put("getComponentSizingTests", 3);
-
- tableOrIconsTests.add("getComponentSizingTests");
- tableOrIconsTests.add("getExpandRatiosTests");
- tableOrIconsTests.add("getLayoutSizingTests");
- tableOrIconsTests.add("getMarginSpacingTests");
- tableOrIconsTests.add("getIconsTests");
-
- }
-
- @Test
- public void verticalLayout() throws Exception {
- openTestURL();
- runTest(VerticalLayout.class);
- }
-
- @Test
- public void horizontalLayout() throws Exception {
- openTestURL();
- runTest(HorizontalLayout.class);
- }
-
- @Test
- public void gridLayout() throws Exception {
- numberOfSubTests.put("getComponentAddReplaceMoveTests", 6);
- numberOfSubTests.put("getComponentSizingTests", 4);
- numberOfSubTests.put("getExpandRatiosTests", 4);
-
- openTestURL();
- runTest(GridLayout.class);
- }
-
- private void runTest(Class<?> layoutClass) throws Exception {
- new Select(vaadinElementById("layoutSelect").findElement(
- By.xpath("select")))
- .selectByVisibleText(layoutClass.toString());
-
- for (String subTest : LayoutTesterApplication.layoutGetters) {
- compareScreen(subTest);
- Integer subTests = numberOfSubTests.get(subTest);
- if (subTests != null) {
- for (int i = 1; i <= subTests; i++) {
- clickAndCompareScreen(subTest, "testButton" + i);
- }
- }
-
- hitButton("nextButton");
- }
-
- }
-
- /**
- * Clicks the button with the given id and compares the result to a
- * screenshot named 'screenshotPrefix'-buttonCaption.
- *
- * @param screenshotPrefix
- * @param buttonId
- * @throws Exception
- */
- private void clickAndCompareScreen(String screenshotPrefix, String buttonId)
- throws Exception {
- hitButton(buttonId);
-
- if (needsDelayToStabilize(screenshotPrefix)) {
- // Table does some extra layout phase and TestBench does not always
- // take this into account, grabbing screenshots before the layout
- // phase is done (see #12866).
- sleep(500);
- }
- compareScreen(screenshotPrefix + "-"
- + sanitize(driver.findElement(By.id(buttonId)).getText()));
- }
-
- private boolean needsDelayToStabilize(String screenshotPrefix) {
- return tableOrIconsTests.contains(screenshotPrefix);
- }
-
- private String sanitize(String text) {
- return text.replace("%", "pct").replaceAll("[^a-zA-Z0-9]", "-");
- }
-}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VAddReplaceMove.java b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VAddReplaceMove.java
new file mode 100644
index 0000000000..a0ef960f57
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VAddReplaceMove.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.VLayout;
+
+import com.vaadin.annotations.Theme;
+import com.vaadin.tests.layouts.layouttester.BaseAddReplaceMove;
+import com.vaadin.ui.VerticalLayout;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+
+public class VAddReplaceMove extends BaseAddReplaceMove {
+
+ /**
+ * @param layoutClass
+ */
+ public VAddReplaceMove() {
+ super(VerticalLayout.class);
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VAddReplaceMoveTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VAddReplaceMoveTest.java
new file mode 100644
index 0000000000..70f7237c96
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VAddReplaceMoveTest.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.VLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseAddReplaceMoveTest;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class VAddReplaceMoveTest extends BaseAddReplaceMoveTest {
+
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VAlignment.java b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VAlignment.java
new file mode 100644
index 0000000000..9872b4bfd7
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VAlignment.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.VLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseAlignment;
+import com.vaadin.ui.VerticalLayout;
+
+public class VAlignment extends BaseAlignment {
+ public VAlignment() {
+ super(VerticalLayout.class);
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VAlignmentTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VAlignmentTest.java
new file mode 100644
index 0000000000..f49787754c
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VAlignmentTest.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.VLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseAlignmentTest;
+
+public class VAlignmentTest extends BaseAlignmentTest {
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VCaption.java b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VCaption.java
new file mode 100644
index 0000000000..b2f50961cb
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VCaption.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.VLayout;
+
+import com.vaadin.annotations.Theme;
+import com.vaadin.tests.layouts.layouttester.BaseCaption;
+import com.vaadin.ui.VerticalLayout;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+
+public class VCaption extends BaseCaption {
+
+ /**
+ * @param layoutClass
+ */
+ public VCaption() {
+ super(VerticalLayout.class);
+ // TODO Auto-generated constructor stub
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VCaptionTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VCaptionTest.java
new file mode 100644
index 0000000000..942736b286
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VCaptionTest.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.VLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseCaptionTest;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class VCaptionTest extends BaseCaptionTest {
+
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VComponentSizing.java b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VComponentSizing.java
new file mode 100644
index 0000000000..67fcb85652
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VComponentSizing.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.VLayout;
+
+import com.vaadin.annotations.Theme;
+import com.vaadin.tests.layouts.layouttester.BaseComponentSizing;
+import com.vaadin.ui.VerticalLayout;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+
+public class VComponentSizing extends BaseComponentSizing {
+
+ /**
+ * @param layoutClass
+ */
+ public VComponentSizing() {
+ super(VerticalLayout.class);
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VComponentSizingTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VComponentSizingTest.java
new file mode 100644
index 0000000000..bef10a6a58
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VComponentSizingTest.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.VLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseComponentSizingTest;
+
+public class VComponentSizingTest extends BaseComponentSizingTest {
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VIcon.java b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VIcon.java
new file mode 100644
index 0000000000..1420be4907
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VIcon.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.VLayout;
+
+import com.vaadin.annotations.Theme;
+import com.vaadin.tests.layouts.layouttester.BaseIcon;
+import com.vaadin.ui.VerticalLayout;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+
+public class VIcon extends BaseIcon {
+
+ /**
+ * @param layoutClass
+ */
+ public VIcon() {
+ super(VerticalLayout.class);
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VIconTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VIconTest.java
new file mode 100644
index 0000000000..221bf2e2db
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VIconTest.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.VLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseIconTest;
+
+public class VIconTest extends BaseIconTest {
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutExpand.java b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutExpand.java
new file mode 100644
index 0000000000..15a31b16f0
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutExpand.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.VLayout;
+
+import com.vaadin.annotations.Theme;
+import com.vaadin.tests.layouts.layouttester.BaseLayoutExpand;
+import com.vaadin.ui.VerticalLayout;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+
+public class VLayoutExpand extends BaseLayoutExpand {
+
+ /**
+ * @param layoutClass
+ */
+ public VLayoutExpand() {
+ super(VerticalLayout.class);
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutExpandTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutExpandTest.java
new file mode 100644
index 0000000000..57bb134be7
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutExpandTest.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.VLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseLayoutExpandTest;
+
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class VLayoutExpandTest extends BaseLayoutExpandTest {
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutMarginSpacing.java b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutMarginSpacing.java
new file mode 100644
index 0000000000..d6d9040bae
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutMarginSpacing.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.VLayout;
+
+import com.vaadin.annotations.Theme;
+import com.vaadin.tests.layouts.layouttester.BaseLayoutForSpacingMargin;
+import com.vaadin.ui.VerticalLayout;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+
+public class VLayoutMarginSpacing extends BaseLayoutForSpacingMargin {
+
+ /**
+ * @param layoutClass
+ */
+ public VLayoutMarginSpacing() {
+ super(VerticalLayout.class);
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutMarginSpacingTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutMarginSpacingTest.java
new file mode 100644
index 0000000000..89ffdf792f
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutMarginSpacingTest.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.VLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseLayoutMarginSpacingTest;
+
+public class VLayoutMarginSpacingTest extends BaseLayoutMarginSpacingTest {
+
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutRegError.java b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutRegError.java
new file mode 100644
index 0000000000..72fd35b842
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutRegError.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.VLayout;
+
+import com.vaadin.annotations.Theme;
+import com.vaadin.tests.layouts.layouttester.BaseRegError;
+import com.vaadin.ui.VerticalLayout;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+
+public class VLayoutRegError extends BaseRegError {
+
+ /**
+ * @param layoutClass
+ */
+ public VLayoutRegError() {
+ super(VerticalLayout.class);
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutRegErrorTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutRegErrorTest.java
new file mode 100644
index 0000000000..e3e5914e3a
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutRegErrorTest.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.VLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseLayoutRegErrorTest;
+
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class VLayoutRegErrorTest extends BaseLayoutRegErrorTest {
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutSizing.java b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutSizing.java
new file mode 100644
index 0000000000..ea6464cfb7
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutSizing.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.VLayout;
+
+import com.vaadin.annotations.Theme;
+import com.vaadin.tests.layouts.layouttester.BaseComponentSizing;
+import com.vaadin.ui.VerticalLayout;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+
+public class VLayoutSizing extends BaseComponentSizing {
+
+ /**
+ * @param layoutClass
+ */
+ public VLayoutSizing() {
+ super(VerticalLayout.class);
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutSizingTest.java b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutSizingTest.java
new file mode 100644
index 0000000000..372eb9cba4
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/layouts/layouttester/VLayout/VLayoutSizingTest.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.layouts.layouttester.VLayout;
+
+import com.vaadin.tests.layouts.layouttester.BaseLayoutSizingTest;
+
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class VLayoutSizingTest extends BaseLayoutSizingTest {
+}
diff --git a/uitest/src/com/vaadin/tests/layouts/layouttester/VerticalLayoutTests.java b/uitest/src/com/vaadin/tests/layouts/layouttester/VerticalLayoutTests.java
deleted file mode 100644
index df9be8ffd0..0000000000
--- a/uitest/src/com/vaadin/tests/layouts/layouttester/VerticalLayoutTests.java
+++ /dev/null
@@ -1,634 +0,0 @@
-package com.vaadin.tests.layouts.layouttester;
-
-import com.vaadin.server.LegacyApplication;
-import com.vaadin.server.Resource;
-import com.vaadin.server.SystemError;
-import com.vaadin.server.ThemeResource;
-import com.vaadin.server.UserError;
-import com.vaadin.shared.ui.label.ContentMode;
-import com.vaadin.ui.AbstractComponent;
-import com.vaadin.ui.AbstractField;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.CheckBox;
-import com.vaadin.ui.DateField;
-import com.vaadin.ui.HorizontalLayout;
-import com.vaadin.ui.Label;
-import com.vaadin.ui.Layout;
-import com.vaadin.ui.Link;
-import com.vaadin.ui.NativeSelect;
-import com.vaadin.ui.Select;
-import com.vaadin.ui.TabSheet;
-import com.vaadin.ui.Table;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.VerticalLayout;
-
-public class VerticalLayoutTests extends AbstractLayoutTests {
-
- public VerticalLayoutTests(LegacyApplication application) {
- super();
- }
-
- @Override
- protected Layout getAlignmentTests() {
- Layout baseLayout = getBaseLayout();
- ((HorizontalLayout) baseLayout).setSpacing(true);
- VerticalLayout vlo = getTestLaytout();
- AbstractComponent[] components = new AbstractComponent[9];
- Alignment[] alignments = new Alignment[] { Alignment.BOTTOM_CENTER,
- Alignment.BOTTOM_LEFT, Alignment.BOTTOM_RIGHT,
- Alignment.MIDDLE_CENTER, Alignment.MIDDLE_LEFT,
- Alignment.MIDDLE_RIGHT, Alignment.TOP_CENTER,
- Alignment.TOP_LEFT, Alignment.TOP_RIGHT };
-
- for (int i = 0; i < components.length / 2; i++) {
- components[i] = new TextField();
- ((TextField) components[i]).setValue("FIELD " + i);
- vlo.addComponent(components[i]);
- vlo.setComponentAlignment(components[i], alignments[i]);
- vlo.addComponent(new Label("<hr />", ContentMode.HTML));
- }
- baseLayout.addComponent(vlo);
- vlo = getTestLaytout();
- for (int i = components.length / 2; i < components.length; i++) {
- components[i] = new TextField();
- ((TextField) components[i]).setValue("FIELD " + i);
- vlo.addComponent(components[i]);
- vlo.setComponentAlignment(components[i], alignments[i]);
- vlo.addComponent(new Label("<hr />", ContentMode.HTML));
- }
- baseLayout.addComponent(vlo);
- return baseLayout;
- }
-
- @Override
- protected Layout getCaptionsTests() {
- Layout baseLayout = getBaseLayout();
- VerticalLayout vlo = getTestLaytout();
- AbstractComponent component = null;
-
- String[] captions = new String[] {
- "",
- "abcdefghijklmnopq",
- "abc def hij klm nop qrs tuv xyz qaz wsx edc rfv tgb yhn ujm mko nji bhu vgy cft cde" };
-
- for (int i = 0; i < captions.length; i++) {
- component = new TextField();
- ((TextField) component).setValue("FIELD " + i);
- component.setCaption(captions[i]);
- vlo.addComponent(component);
- }
- for (int i = 0; i < captions.length; i++) {
- component = new Label();
- ((Label) component).setValue("Label " + i);
- component.setCaption(captions[i]);
- vlo.addComponent(component);
- }
- baseLayout.addComponent(vlo);
- vlo = getTestLaytout();
- for (int i = 0; i < captions.length; i++) {
- component = new Select();
- component.setCaption(captions[i]);
- component.setIcon(new ThemeResource(LOCK_16_PNG));
- vlo.addComponent(component);
- }
- for (int i = 0; i < captions.length; i++) {
- component = getTestTabsheet();
- component.setCaption(captions[i]);
- component.setComponentError(new UserError(""));
- vlo.addComponent(component);
- }
- baseLayout.addComponent(vlo);
- return baseLayout;
- }
-
- @Override
- protected Layout getComponentAddReplaceMoveTests() {
- Layout baseLayout = getBaseLayout();
- final VerticalLayout vlo = getTestLaytout();
- final VerticalLayout vlo2 = getTestLaytout();
-
- // Set undefined height to avoid expanding
- vlo2.setHeight(null);
-
- final HorizontalLayout source = new HorizontalLayout();
- source.addComponent(new Label("OTHER LABEL 1"));
- source.addComponent(new Label("OTHER LABEL 2"));
-
- final AbstractComponent c1 = new Button("BUTTON");
- final AbstractComponent c2 = new Label("<b>LABEL</b>", ContentMode.HTML);
- final AbstractComponent c3 = new Table("TABLE");
- c3.setHeight("100px");
- c3.setWidth("100%");
-
- final Button addButton = new Button("Test add");
- final Button replaceButton = new Button("Test replace");
- final Button moveButton = new Button("Test move");
- final Button removeButton = new Button("Test remove");
- addButton.setId("testButton1");
- replaceButton.setId("testButton2");
- moveButton.setId("testButton3");
- removeButton.setId("testButton4");
-
- replaceButton.setEnabled(false);
- moveButton.setEnabled(false);
- removeButton.setEnabled(false);
-
- addButton.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo2.addComponent(new TextField());
- addButton.setEnabled(false);
- replaceButton.setEnabled(true);
- }
- });
- replaceButton.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo2.replaceComponent(c1, c3);
- replaceButton.setEnabled(false);
- moveButton.setEnabled(true);
- }
- });
- moveButton.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo2.moveComponentsFrom(source);
- moveButton.setEnabled(false);
- removeButton.setEnabled(true);
- }
- });
- removeButton.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo2.removeComponent(c1);
- vlo2.removeComponent(c2);
- removeButton.setEnabled(false);
- }
- });
-
- vlo.addComponent(addButton);
- vlo.addComponent(replaceButton);
- vlo.addComponent(moveButton);
- vlo.addComponent(removeButton);
-
- baseLayout.addComponent(vlo);
- vlo2.addComponent(c1);
- vlo2.addComponent(c2);
- vlo2.addComponent(c3);
- baseLayout.addComponent(vlo2);
- return baseLayout;
- }
-
- @Override
- protected Layout getComponentSizingTests() {
- Layout baseLayout = getBaseLayout();
- final VerticalLayout vlo = getTestLaytout();
-
- final AbstractComponent c = getTestTable();
-
- final Button biggerButton = new Button("full size");
- final Button smallerButton = new Button("200 px width");
- final Button originalButton = new Button("undefined size and add");
- biggerButton.setId("testButton1");
- smallerButton.setId("testButton2");
- originalButton.setId("testButton3");
- vlo.addComponent(biggerButton);
- vlo.addComponent(smallerButton);
- vlo.addComponent(originalButton);
- baseLayout.addComponent(vlo);
- final VerticalLayout vlo2 = getTestLaytout();
- vlo2.addComponent(c);
- baseLayout.addComponent(vlo2);
-
- biggerButton.setEnabled(true);
- smallerButton.setEnabled(false);
- originalButton.setEnabled(false);
-
- biggerButton.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- c.setSizeFull();
- biggerButton.setEnabled(false);
- smallerButton.setEnabled(true);
- }
- });
- smallerButton.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- c.setWidth("200px");
- smallerButton.setEnabled(false);
- originalButton.setEnabled(true);
- }
- });
- originalButton.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- originalButton.setEnabled(false);
- c.setSizeUndefined();
- ((Table) c)
- .addItem(
- new Object[] { "VYVTCTC VYVYV ECECCE NIDSD SDMPOM" },
- 3);
- }
- });
-
- return baseLayout;
- }
-
- @Override
- protected Layout getLayoutSizingTests() {
- Layout baseLayout = getBaseLayout();
- final VerticalLayout vlo = getTestLaytout();
-
- vlo.setSpacing(false);
- vlo.setMargin(false);
-
- final AbstractComponent c1 = getTestTable();
- c1.setSizeFull();
- final AbstractComponent c2 = getTestTable();
- c2.setSizeFull();
-
- final Button button1 = new Button("Set fixed height 350px");
- final Button button2 = new Button(
- "Set undefined size and add component");
- final Button button3 = new Button("Set fixed width and height 75%");
- final Button button4 = new Button("Set size full");
-
- button1.setId("testButton1");
- button2.setId("testButton2");
- button3.setId("testButton3");
- button4.setId("testButton4");
-
- vlo.addComponent(button1);
- vlo.addComponent(button2);
- vlo.addComponent(button3);
- vlo.addComponent(button4);
- baseLayout.addComponent(vlo);
- final VerticalLayout vlo2 = getTestLaytout();
-
- button1.setEnabled(true);
- button2.setEnabled(false);
- button3.setEnabled(false);
- button4.setEnabled(false);
-
- vlo2.addComponent(c1);
- vlo2.addComponent(new Label(
- "<div style='height: 1px'></div><hr /><div style='height: 1px'></div>",
- ContentMode.HTML));
- vlo2.addComponent(c2);
- vlo2.setExpandRatio(c1, 0.5f);
- vlo2.setExpandRatio(c2, 0.5f);
- baseLayout.addComponent(vlo2);
-
- button1.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo2.setHeight("350px");
- button1.setEnabled(false);
- button2.setEnabled(true);
- }
- });
- button2.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo2.setSizeUndefined();
- Label newLabel = new Label("--- NEW LABEL ---");
- newLabel.setSizeUndefined();
- vlo2.addComponent(newLabel);
- button2.setEnabled(false);
- button3.setEnabled(true);
- }
- });
- button3.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo2.setWidth("75%");
- vlo2.setHeight("75%");
- button3.setEnabled(false);
- button4.setEnabled(true);
- }
- });
- button4.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo2.setSizeFull();
- button4.setEnabled(false);
- }
- });
-
- return baseLayout;
- }
-
- @Override
- protected Layout getExpandRatiosTests() {
- Layout baseLayout = getBaseLayout();
- final VerticalLayout vlo = getTestLaytout();
-
- final AbstractComponent c1 = getTestTable();
- c1.setSizeFull();
- final AbstractComponent c2 = getTestTable();
- c2.setSizeFull();
-
- final Button button1 = new Button("Expand to 1/undefined");
- button1.setId("testButton1");
- final Button button2 = new Button("Expand to 0.5/0.5");
- button2.setId("testButton2");
- final Button button3 = new Button("Expand to 0.75/0.25");
- button3.setId("testButton3");
-
- vlo.addComponent(button1);
- vlo.addComponent(button2);
- vlo.addComponent(button3);
- button1.setEnabled(true);
- button2.setEnabled(false);
- button3.setEnabled(false);
-
- baseLayout.addComponent(vlo);
- final VerticalLayout vlo2 = getTestLaytout();
-
- vlo2.addComponent(c1);
- vlo2.addComponent(c2);
- baseLayout.addComponent(vlo2);
-
- button1.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo2.setExpandRatio(c1, 1.0f);
- button1.setEnabled(false);
- button2.setEnabled(true);
- }
- });
- button2.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo2.setExpandRatio(c1, 0.5f);
- vlo2.setExpandRatio(c2, 0.5f);
- button2.setEnabled(false);
- button3.setEnabled(true);
- }
- });
- button3.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo2.setExpandRatio(c1, 0.75f);
- vlo2.setExpandRatio(c2, 0.25f);
- button3.setEnabled(false);
- }
- });
- return baseLayout;
- }
-
- @Override
- protected Layout getIconsTests() {
- Layout baseLayout = getBaseLayout();
- VerticalLayout vlo = getTestLaytout();
- AbstractComponent[] components = new AbstractComponent[2];
-
- Resource[] icons = new Resource[] { new ThemeResource(CALENDAR_32_PNG),
- new ThemeResource(LOCK_16_PNG) };
-
- for (int i = 0; i < components.length; i++) {
- components[i] = new TextField();
- ((TextField) components[i]).setValue("FIELD " + i);
- components[i].setIcon(icons[i]);
- components[i]
- .setCaption("long test caption bewucbwuebco or bmort b cbwecubw wbeucwe asdasd asdasda asdasd");
- vlo.addComponent(components[i]);
- }
-
- for (int i = 0; i < components.length; i++) {
- components[i] = new Label();
- ((Label) components[i]).setValue("Label " + i);
- components[i].setIcon(icons[i]);
- vlo.addComponent(components[i]);
- }
-
- for (int i = 0; i < components.length; i++) {
- components[i] = new Select();
- components[i].setIcon(icons[i]);
- vlo.addComponent(components[i]);
- }
- baseLayout.addComponent(vlo);
- final VerticalLayout vlo2 = getTestLaytout();
- for (int i = 0; i < components.length; i++) {
- components[i] = new Button();
- components[i].setComponentError(new UserError(
- "component error, user error"));
- components[i].setIcon(icons[i]);
- vlo2.addComponent(components[i]);
- }
-
- for (int i = 0; i < components.length; i++) {
- components[i] = new Link("Link", null);
- components[i].setIcon(icons[i]);
- vlo2.addComponent(components[i]);
- }
- baseLayout.addComponent(vlo2);
- return baseLayout;
- }
-
- @Override
- protected Layout getMarginSpacingTests() {
- Layout baseLayout = getBaseLayout();
- final VerticalLayout vlo = getTestLaytout();
- vlo.setSpacing(false);
- vlo.setMargin(false);
-
- final AbstractComponent c1 = getTestTable();
- c1.setSizeFull();
- final AbstractComponent c2 = getTestTable();
- c2.setSizeFull();
-
- final Button button1 = new Button("Set margin on");
- final Button button2 = new Button("Set spacing on");
- final Button button3 = new Button("Set margin off");
- final Button button4 = new Button("Set spacing off");
- button1.setId("testButton1");
- button2.setId("testButton2");
- button3.setId("testButton3");
- button4.setId("testButton4");
-
- vlo.addComponent(button1);
- vlo.addComponent(button2);
- vlo.addComponent(button3);
- vlo.addComponent(button4);
- button1.setEnabled(true);
- button2.setEnabled(false);
- button3.setEnabled(false);
- button4.setEnabled(false);
-
- baseLayout.addComponent(vlo);
- final VerticalLayout vlo2 = getTestLaytout();
-
- vlo2.addComponent(c1);
- // Must add something around the hr to avoid the margins collapsing
- vlo2.addComponent(new Label(
- "<div style='height: 1px'></div><hr /><div style='height: 1px'></div>",
- ContentMode.HTML));
- vlo2.addComponent(c2);
- vlo2.setExpandRatio(c1, 0.5f);
- vlo2.setExpandRatio(c2, 0.5f);
- baseLayout.addComponent(vlo2);
-
- button1.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo2.setMargin(true);
- button1.setEnabled(false);
- button2.setEnabled(true);
- }
- });
- button2.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo2.setSpacing(true);
- button2.setEnabled(false);
- button3.setEnabled(true);
- }
- });
- button3.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo2.setMargin(false);
- button3.setEnabled(false);
- button4.setEnabled(true);
- }
- });
- button4.addListener(new Button.ClickListener() {
- private static final long serialVersionUID = 7716267156088629379L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- vlo2.setSpacing(false);
- button4.setEnabled(false);
- }
- });
-
- return baseLayout;
- }
-
- @Override
- protected Layout getRequiredErrorIndicatorsTests() {
- Layout baseLayout = getBaseLayout();
- VerticalLayout vlo = getTestLaytout();
- AbstractComponent[] components = new AbstractComponent[4];
- components[0] = new Label("LABEL");
- components[0].setSizeUndefined();
- components[1] = new Button("BUTTON");
- components[2] = getTestTable();
- components[3] = getTestTabsheet();
- components[3].setIcon(new ThemeResource(LOCK_16_PNG));
-
- AbstractField<?>[] fields = new AbstractField<?>[6];
- fields[0] = new TextField();
- fields[0].setRequired(true);
- fields[0].setValidationVisible(true);
- fields[0].setRequiredError("required error");
-
- fields[1] = new TextField();
- ((TextField) fields[1]).setValue("TEXTFIELD2");
- fields[1]
- .setComponentError(new UserError("component error, user error"));
-
- fields[2] = new Select();
- fields[2].setComponentError(new SystemError(
- "component error, system error"));
- fields[3] = new DateField();
- fields[3].setComponentError(new SystemError(
- "component error, system error"));
-
- fields[4] = new CheckBox();
- fields[4]
- .setComponentError(new UserError("component error, user error"));
-
- fields[5] = new NativeSelect();
- fields[5].setRequired(true);
- fields[5].setValidationVisible(true);
- fields[5].setRequiredError("required error");
- fields[5]
- .setComponentError(new UserError("component error, user error"));
- fields[5].setIcon(new ThemeResource(CALENDAR_32_PNG));
-
- for (int i = 0; i < components.length; i++) {
- components[i].setComponentError(new UserError(
- "component error, user error"));
- vlo.addComponent(components[i]);
- }
- baseLayout.addComponent(vlo);
- final VerticalLayout vlo2 = getTestLaytout();
- for (int i = 0; i < fields.length; i++) {
- vlo2.addComponent(fields[i]);
- }
-
- baseLayout.addComponent(vlo2);
- return baseLayout;
- }
-
- private HorizontalLayout getBaseLayout() {
- HorizontalLayout hlo = new HorizontalLayout();
- hlo.setSizeUndefined();
- return hlo;
- }
-
- private VerticalLayout getTestLaytout() {
- VerticalLayout vlo = new VerticalLayout();
- vlo.setHeight("500px");
- vlo.setWidth("400px");
- return vlo;
- }
-
- private AbstractComponent getTestTabsheet() {
- TabSheet tabsheet = new TabSheet();
- tabsheet.setSizeUndefined();
- tabsheet.addTab(new UndefWideLabel("TAB1"), "TAB1", new ThemeResource(
- GLOBE_16_PNG));
- tabsheet.addTab(new UndefWideLabel("TAB2"), "TAB2", null);
- return tabsheet;
- }
-
- private Table getTestTable() {
- Table t = new Table();
- t.setSizeUndefined();
- t.setPageLength(5);
- t.addContainerProperty("test", String.class, null);
- t.addItem(new Object[] { "qwertyuiop asdfghjköäxccvbnm,m,." }, 1);
- t.addItem(new Object[] { "YGVYTCTCTRXRXRXRX" }, 2);
- return t;
- }
-}
diff --git a/uitest/src/com/vaadin/tests/push/PushConfigurationStreamingTest.java b/uitest/src/com/vaadin/tests/push/PushConfigurationStreamingTest.java
index 8dc960c9ac..0861e618a2 100644
--- a/uitest/src/com/vaadin/tests/push/PushConfigurationStreamingTest.java
+++ b/uitest/src/com/vaadin/tests/push/PushConfigurationStreamingTest.java
@@ -27,33 +27,19 @@ import org.openqa.selenium.support.ui.Select;
public class PushConfigurationStreamingTest extends PushConfigurationTest {
- @Override
- public List<DesiredCapabilities> getBrowsersToTest() {
- List<DesiredCapabilities> browsers = super.getBrowsersToTest();
-
- browsers.remove(Browser.IE8.getDesiredCapabilities());
-
- return browsers;
- }
-
@Test
public void testStreaming() throws InterruptedException {
openDebugLogTab();
new Select(getTransportSelect()).selectByVisibleText("STREAMING");
- new Select(getPushModeSelect()).selectByVisibleText("AUTOMATIC");
-
assertThat(getStatusText(),
containsString("fallbackTransport: long-polling"));
assertThat(getStatusText(), containsString("transport: streaming"));
- waitForServerCounterToUpdate();
+ clearDebugMessages();
+ new Select(getPushModeSelect()).selectByVisibleText("AUTOMATIC");
- // Use debug console to verify we used the correct transport type
- assertThat(
- driver.getPageSource(),
- not(containsString("Push connection established using websocket")));
- assertThat(driver.getPageSource(),
- containsString("Push connection established using streaming"));
+ waitForDebugMessage("Push connection established using streaming", 10);
+ waitForServerCounterToUpdate();
}
}
diff --git a/uitest/src/com/vaadin/tests/push/ReconnectTest.java b/uitest/src/com/vaadin/tests/push/ReconnectTest.java
index 5ad2e7a127..6a632f2667 100644
--- a/uitest/src/com/vaadin/tests/push/ReconnectTest.java
+++ b/uitest/src/com/vaadin/tests/push/ReconnectTest.java
@@ -83,32 +83,6 @@ public abstract class ReconnectTest extends MultiBrowserTestWithProxy {
waitForDebugMessage("Reopening push connection");
}
- private void clearDebugMessages() {
- driver.findElement(
- By.xpath("//button[@class='v-debugwindow-button' and @title='Clear log']"))
- .click();
- }
-
- private boolean hasDebugMessage(String message) {
- return getDebugMessage(message) != null;
- }
-
- private WebElement getDebugMessage(String message) {
- return driver.findElement(By.xpath(String.format(
- "//span[@class='v-debugwindow-message' and text()='%s']",
- message)));
- }
-
- private void waitForDebugMessage(final String expectedMessage) {
- waitUntil(new ExpectedCondition<Boolean>() {
-
- @Override
- public Boolean apply(WebDriver input) {
- return hasDebugMessage(expectedMessage);
- }
- }, 30);
- }
-
private void connectAndVerifyConnectionEstablished() throws JSchException {
connectProxy();
waitUntilServerCounterChanges();
diff --git a/uitest/src/com/vaadin/tests/tb3/AbstractTB3Test.java b/uitest/src/com/vaadin/tests/tb3/AbstractTB3Test.java
index 3745d60fd8..e5cceca6b8 100644
--- a/uitest/src/com/vaadin/tests/tb3/AbstractTB3Test.java
+++ b/uitest/src/com/vaadin/tests/tb3/AbstractTB3Test.java
@@ -16,6 +16,8 @@
package com.vaadin.tests.tb3;
+import static com.vaadin.tests.tb3.TB3Runner.localWebDriverIsUsed;
+
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -35,6 +37,8 @@ import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.HasInputDevices;
import org.openqa.selenium.interactions.Keyboard;
import org.openqa.selenium.interactions.Mouse;
+import org.openqa.selenium.interactions.internal.Coordinates;
+import org.openqa.selenium.internal.Locatable;
import org.openqa.selenium.remote.BrowserType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
@@ -46,6 +50,7 @@ import com.thoughtworks.selenium.webdriven.WebDriverBackedSelenium;
import com.vaadin.server.LegacyApplication;
import com.vaadin.server.UIProvider;
import com.vaadin.testbench.TestBench;
+import com.vaadin.testbench.TestBenchElement;
import com.vaadin.testbench.TestBenchTestCase;
import com.vaadin.tests.components.AbstractTestUIWithLog;
import com.vaadin.tests.tb3.MultiBrowserTest.Browser;
@@ -126,7 +131,7 @@ public abstract class AbstractTB3Test extends TestBenchTestCase {
} else {
capabilities = getDesiredCapabilities();
- if (System.getProperty("useLocalWebDriver") != null) {
+ if (localWebDriverIsUsed()) {
setupLocalDriver(capabilities);
} else {
WebDriver dr = TestBench.createDriver(new RemoteWebDriver(
@@ -151,6 +156,45 @@ public abstract class AbstractTB3Test extends TestBenchTestCase {
}
+ protected WebElement getTooltipElement() {
+ return getDriver().findElement(
+ com.vaadin.testbench.By.className("v-tooltip-text"));
+ }
+
+ protected Coordinates getCoordinates(TestBenchElement element) {
+ return ((Locatable) element.getWrappedElement()).getCoordinates();
+ }
+
+ private boolean hasDebugMessage(String message) {
+ return getDebugMessage(message) != null;
+ }
+
+ private WebElement getDebugMessage(String message) {
+ return driver.findElement(By.xpath(String.format(
+ "//span[@class='v-debugwindow-message' and text()='%s']",
+ message)));
+ }
+
+ protected void waitForDebugMessage(final String expectedMessage) {
+ waitForDebugMessage(expectedMessage, 30);
+ }
+
+ protected void waitForDebugMessage(final String expectedMessage, int timeout) {
+ waitUntil(new ExpectedCondition<Boolean>() {
+
+ @Override
+ public Boolean apply(WebDriver input) {
+ return hasDebugMessage(expectedMessage);
+ }
+ }, timeout);
+ }
+
+ protected void clearDebugMessages() {
+ driver.findElement(
+ By.xpath("//button[@class='v-debugwindow-button' and @title='Clear log']"))
+ .click();
+ }
+
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface RunLocally {
@@ -171,7 +215,22 @@ public abstract class AbstractTB3Test extends TestBenchTestCase {
* {@link #isPush()}.
*/
protected void openTestURL() {
- driver.get(getTestUrl());
+ openTestURL("");
+ }
+
+ /**
+ * Opens the given test (defined by {@link #getTestUrl()}, optionally with
+ * debug window and/or push (depending on {@link #isDebug()} and
+ * {@link #isPush()}.
+ */
+ protected void openTestURL(String extraParameters) {
+ String url = getTestUrl();
+ if (url.contains("?")) {
+ url = url + "&" + extraParameters;
+ } else {
+ url = url + "?" + extraParameters;
+ }
+ driver.get(url);
}
/**
@@ -778,7 +837,7 @@ public abstract class AbstractTB3Test extends TestBenchTestCase {
*/
public static DesiredCapabilities phantomJS(int version) {
DesiredCapabilities c = DesiredCapabilities.phantomjs();
- c.setPlatform(Platform.XP);
+ c.setPlatform(Platform.LINUX);
c.setVersion("" + version);
return c;
}
diff --git a/uitest/src/com/vaadin/tests/tb3/MultiBrowserTest.java b/uitest/src/com/vaadin/tests/tb3/MultiBrowserTest.java
index 74073af217..ccbb6ca872 100644
--- a/uitest/src/com/vaadin/tests/tb3/MultiBrowserTest.java
+++ b/uitest/src/com/vaadin/tests/tb3/MultiBrowserTest.java
@@ -40,6 +40,16 @@ import org.openqa.selenium.remote.DesiredCapabilities;
*/
public abstract class MultiBrowserTest extends PrivateTB3Configuration {
+ protected List<DesiredCapabilities> getBrowsersExcludingIE() {
+ List<DesiredCapabilities> browsers = new ArrayList<DesiredCapabilities>(getAllBrowsers());
+ browsers.remove(Browser.IE8.getDesiredCapabilities());
+ browsers.remove(Browser.IE9.getDesiredCapabilities());
+ browsers.remove(Browser.IE10.getDesiredCapabilities());
+ browsers.remove(Browser.IE11.getDesiredCapabilities());
+
+ return browsers;
+ }
+
public enum Browser {
FIREFOX(BrowserUtil.firefox(24)), CHROME(BrowserUtil.chrome(33)), SAFARI(
BrowserUtil.safari(7)), IE8(BrowserUtil.ie(8)), IE9(BrowserUtil
diff --git a/uitest/src/com/vaadin/tests/tb3/TB3Runner.java b/uitest/src/com/vaadin/tests/tb3/TB3Runner.java
index 69880008ff..4d29e479e2 100644
--- a/uitest/src/com/vaadin/tests/tb3/TB3Runner.java
+++ b/uitest/src/com/vaadin/tests/tb3/TB3Runner.java
@@ -61,7 +61,7 @@ public class TB3Runner extends BlockJUnit4ClassRunner {
private static final ExecutorService service;
static {
- if (System.getProperty("useLocalWebDriver") != null) {
+ if (localWebDriverIsUsed()) {
MAX_CONCURRENT_TESTS = 10;
} else {
MAX_CONCURRENT_TESTS = 50;
@@ -69,6 +69,12 @@ public class TB3Runner extends BlockJUnit4ClassRunner {
service = Executors.newFixedThreadPool(MAX_CONCURRENT_TESTS);
}
+ protected static boolean localWebDriverIsUsed() {
+ String useLocalWebDriver = System.getProperty("useLocalWebDriver");
+
+ return useLocalWebDriver != null && useLocalWebDriver.toLowerCase().equals("true");
+ }
+
public TB3Runner(Class<?> klass) throws InitializationError {
super(klass);
setScheduler(new ParallelScheduler(service));
diff --git a/uitest/src/com/vaadin/tests/tb3/TooltipTest.java b/uitest/src/com/vaadin/tests/tb3/TooltipTest.java
new file mode 100644
index 0000000000..86ea44287a
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tb3/TooltipTest.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.tests.tb3;
+
+import java.util.List;
+import java.util.NoSuchElementException;
+
+import org.junit.Assert;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.interactions.Actions;
+import org.openqa.selenium.remote.DesiredCapabilities;
+
+import com.vaadin.testbench.By;
+
+/**
+ * Base class for TestBench 3+ tests that use tooltips. This class contains
+ * utility methods for testing tooltip use.
+ *
+ * @author Vaadin Ltd
+ */
+public abstract class TooltipTest extends MultiBrowserTest {
+
+ protected void clearTooltip() throws Exception {
+ moveToRoot();
+ Thread.sleep(500);
+ checkTooltipNotPresent();
+ }
+
+ protected void checkTooltip(String locator, String value) throws Exception {
+ checkTooltip(By.vaadin(locator), value);
+ }
+
+ protected void checkTooltip(org.openqa.selenium.By by, String value)
+ throws Exception {
+ checkTooltip(getDriver().findElement(by), value);
+ }
+
+ protected void checkTooltip(WebElement element, String value)
+ throws Exception {
+ testBenchElement(element).showTooltip();
+ if (null != value) {
+ checkTooltip(value);
+ } else {
+ checkTooltipNotPresent();
+ }
+ }
+
+ protected void checkTooltip(String value) throws Exception {
+ WebElement body = findElement(By.cssSelector("body"));
+ WebElement tooltip = getTooltip();
+ Assert.assertEquals(value, tooltip.getText());
+ Assert.assertTrue("Tooltip overflowed to the left", tooltip
+ .getLocation().getX() >= 0);
+ Assert.assertTrue("Tooltip overflowed up",
+ tooltip.getLocation().getY() >= 0);
+ Assert.assertTrue("Tooltip overflowed to the right", tooltip
+ .getLocation().getX() + tooltip.getSize().getWidth() < body
+ .getSize().getWidth());
+ Assert.assertTrue("Tooltip overflowed down", tooltip.getLocation()
+ .getY() + tooltip.getSize().getHeight() < body.getSize()
+ .getHeight());
+
+ }
+
+ protected void moveToRoot() {
+ WebElement uiRoot = getDriver().findElement(By.vaadin("Root"));
+ moveMouseToTopLeft(uiRoot);
+ }
+
+ protected WebElement getTooltip() throws InterruptedException {
+ org.openqa.selenium.By tooltipBy = By.vaadin("Root/VTooltip[0]");
+ return getDriver().findElement(tooltipBy);
+ }
+
+ protected void checkTooltipNotPresent() throws Exception {
+ try {
+ WebElement tooltip = getTooltip();
+ if (!"".equals(tooltip.getText())
+ || tooltip.getLocation().getX() > -999) {
+ Assert.fail("Found tooltip that shouldn't be visible: "
+ + tooltip.getText() + " at " + tooltip.getLocation());
+ }
+ } catch (NoSuchElementException e) {
+ Assert.fail("Tooltip element was removed completely, causing extra events to accessibility tools");
+ }
+ }
+
+ protected void moveMouseToTopLeft(WebElement element) {
+ moveMouseTo(element, 0, 0);
+ }
+
+ protected void moveMouseTo(WebElement element, int offsetX, int offsetY) {
+ new Actions(getDriver()).moveToElement(element, offsetX, offsetY)
+ .perform();
+ }
+
+ @Override
+ public List<DesiredCapabilities> getBrowsersToTest() {
+ // TODO Once we figure out how to get mouse hovering work with the IE
+ // webdriver, exclude them from these tests (#13854)
+ return getBrowsersExcludingIE();
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/themes/ThemeChangeOnTheFly.java b/uitest/src/com/vaadin/tests/themes/ThemeChangeOnTheFly.java
new file mode 100644
index 0000000000..8989d88164
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/themes/ThemeChangeOnTheFly.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.themes;
+
+import com.vaadin.annotations.Theme;
+import com.vaadin.server.ThemeResource;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUIWithLog;
+import com.vaadin.tests.util.PersonContainer;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.GridLayout;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.Image;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.Table;
+
+@Theme("reindeer")
+public class ThemeChangeOnTheFly extends AbstractTestUIWithLog {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ Button inject = new Button("Inject blue background");
+ inject.addClickListener(new ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ getPage().getStyles().add(
+ ".v-app { background: blue !important;}");
+
+ }
+ });
+ addComponent(inject);
+
+ GridLayout gl = new GridLayout(2, 4);
+ gl.setCaption("Change theme by clicking a button");
+ for (final String theme : new String[] { "reindeer", "runo",
+ "chameleon", "base", null }) {
+ Button b = new Button(theme);
+ b.setId(theme + "");
+ b.addClickListener(new ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ getUI().setTheme(theme);
+ }
+ });
+ gl.addComponent(b);
+ }
+
+ Table t = new Table();
+ PersonContainer pc = PersonContainer.createWithTestData();
+ pc.addNestedContainerBean("address");
+ t.setContainerDataSource(pc);
+ gl.addComponent(t, 0, 3, 1, 3);
+ gl.setRowExpandRatio(3, 1);
+
+ gl.setWidth("500px");
+ gl.setHeight("800px");
+
+ HorizontalLayout images = new HorizontalLayout();
+ images.setSpacing(true);
+
+ Label l = new Label("Chameleon theme image in caption");
+ l.setIcon(new ThemeResource("img/magnifier.png"));
+ images.addComponent(l);
+ Image image = new Image("Runo theme image", new ThemeResource(
+ "icons/64/ok.png"));
+ images.addComponent(image);
+ image = new Image("Reindeer theme image", new ThemeResource(
+ "button/img/left-focus.png"));
+ images.addComponent(image);
+ addComponent(images);
+ addComponent(gl);
+
+ getLayout().setSpacing(true);
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Test that you can change theme on the fly";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 2874;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/themes/ThemeChangeOnTheFlyTest.java b/uitest/src/com/vaadin/tests/themes/ThemeChangeOnTheFlyTest.java
new file mode 100644
index 0000000000..681a7d762b
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/themes/ThemeChangeOnTheFlyTest.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.themes;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.remote.DesiredCapabilities;
+import org.openqa.selenium.support.ui.ExpectedCondition;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class ThemeChangeOnTheFlyTest extends MultiBrowserTest {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.tb3.MultiBrowserTest#getBrowsersToTest()
+ */
+ @Override
+ public List<DesiredCapabilities> getBrowsersToTest() {
+ // Seems like stylesheet onload is not fired on PhantomJS
+ List<DesiredCapabilities> l = super.getBrowsersToTest();
+ l.remove(Browser.PHANTOMJS.getDesiredCapabilities());
+ return l;
+ }
+
+ @Test
+ public void injectedStyleAndThemeChange() throws IOException {
+ openTestURL();
+ $(ButtonElement.class).caption("Inject blue background").first()
+ .click();
+ changeTheme("runo");
+ compareScreen("runo-blue-background");
+ }
+
+ @Test
+ public void reindeerToOthers() throws IOException {
+ openTestURL();
+ compareScreen("reindeer");
+
+ changeThemeAndCompare("runo");
+ changeThemeAndCompare("chameleon");
+ changeThemeAndCompare("base");
+
+ }
+
+ @Test
+ public void runoToReindeer() throws IOException {
+ openTestURL("theme=runo");
+ compareScreen("runo");
+ changeThemeAndCompare("reindeer");
+ }
+
+ @Test
+ public void reindeerToNullToReindeer() throws IOException {
+ openTestURL();
+
+ changeThemeAndCompare("null");
+ changeThemeAndCompare("reindeer");
+ }
+
+ private void changeThemeAndCompare(String theme) throws IOException {
+ changeTheme(theme);
+ compareScreen(theme);
+ }
+
+ private void changeTheme(String theme) {
+ $(ButtonElement.class).id(theme).click();
+ if (theme.equals("null")) {
+ waitForThemeToChange("");
+ } else {
+ waitForThemeToChange(theme);
+ }
+ }
+
+ private void waitForThemeToChange(final String theme) {
+
+ final WebElement rootDiv = findElement(By
+ .xpath("//div[contains(@class,'v-app')]"));
+ waitUntil(new ExpectedCondition<Boolean>() {
+
+ @Override
+ public Boolean apply(WebDriver input) {
+ String rootClass = rootDiv.getAttribute("class").trim();
+ String expected = "v-app " + theme;
+ expected = expected.trim();
+ return rootClass.equals(expected);
+ }
+ }, 30);
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/themes/valo/ButtonsAndLinks.java b/uitest/src/com/vaadin/tests/themes/valo/ButtonsAndLinks.java
index 8f7b7c6a00..ce08d9ba08 100644
--- a/uitest/src/com/vaadin/tests/themes/valo/ButtonsAndLinks.java
+++ b/uitest/src/com/vaadin/tests/themes/valo/ButtonsAndLinks.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 Vaadin Ltd.
+ * Copyright 2000-2014 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
@@ -66,26 +66,6 @@ public class ButtonsAndLinks extends VerticalLayout implements View {
button.addStyleName("danger");
row.addComponent(button);
- // button = new Button("Custom");
- // button.addStyleName("color2");
- // row.addComponent(button);
- //
- // button = new Button("User Color");
- // button.addStyleName("color3");
- // row.addComponent(button);
- //
- // button = new Button("Themed");
- // button.addStyleName("color4");
- // row.addComponent(button);
- //
- // button = new Button("Alternate");
- // button.addStyleName("color5");
- // row.addComponent(button);
- //
- // button = new Button("Other");
- // button.addStyleName("color6");
- // row.addComponent(button);
-
button = new Button("Small");
button.addStyleName("small");
button.setIcon(TestIcon.get());
@@ -93,7 +73,11 @@ public class ButtonsAndLinks extends VerticalLayout implements View {
button = new Button("Large");
button.addStyleName("large");
- button.addStyleName("icon-align-right");
+ button.setIcon(TestIcon.get());
+ row.addComponent(button);
+
+ button = new Button("Top");
+ button.addStyleName("icon-align-top");
button.setIcon(TestIcon.get());
row.addComponent(button);
@@ -120,6 +104,16 @@ public class ButtonsAndLinks extends VerticalLayout implements View {
button.addStyleName("borderless");
row.addComponent(button);
+ button = new Button("Borderless, colored");
+ button.setIcon(TestIcon.get());
+ button.addStyleName("borderless-colored");
+ row.addComponent(button);
+
+ button = new Button("Quiet");
+ button.setIcon(TestIcon.get());
+ button.addStyleName("quiet");
+ row.addComponent(button);
+
button = new Button("Link style");
button.setIcon(TestIcon.get());
button.addStyleName("link");
diff --git a/uitest/src/com/vaadin/tests/themes/valo/CheckBoxes.java b/uitest/src/com/vaadin/tests/themes/valo/CheckBoxes.java
index 65575c764b..a2daeff2f8 100644
--- a/uitest/src/com/vaadin/tests/themes/valo/CheckBoxes.java
+++ b/uitest/src/com/vaadin/tests/themes/valo/CheckBoxes.java
@@ -112,6 +112,54 @@ public class CheckBoxes extends VerticalLayout implements View {
options.setItemIcon("Option Three", TestIcon.get(true));
row.addComponent(options);
+ options = new OptionGroup("Choose one, small");
+ options.addStyleName("small");
+ options.setMultiSelect(false);
+ options.addItem("Option One");
+ options.addItem("Option Two");
+ options.addItem("Option Three");
+ options.select("Option One");
+ options.setItemIcon("Option One", TestIcon.get());
+ options.setItemIcon("Option Two", TestIcon.get());
+ options.setItemIcon("Option Three", TestIcon.get(true));
+ row.addComponent(options);
+
+ options = new OptionGroup("Choose many, small");
+ options.addStyleName("small");
+ options.setMultiSelect(true);
+ options.addItem("Option One");
+ options.addItem("Option Two");
+ options.addItem("Option Three");
+ options.select("Option One");
+ options.setItemIcon("Option One", TestIcon.get());
+ options.setItemIcon("Option Two", TestIcon.get());
+ options.setItemIcon("Option Three", TestIcon.get(true));
+ row.addComponent(options);
+
+ options = new OptionGroup("Choose one, large");
+ options.addStyleName("large");
+ options.setMultiSelect(false);
+ options.addItem("Option One");
+ options.addItem("Option Two");
+ options.addItem("Option Three");
+ options.select("Option One");
+ options.setItemIcon("Option One", TestIcon.get());
+ options.setItemIcon("Option Two", TestIcon.get());
+ options.setItemIcon("Option Three", TestIcon.get(true));
+ row.addComponent(options);
+
+ options = new OptionGroup("Choose many, large");
+ options.addStyleName("large");
+ options.setMultiSelect(true);
+ options.addItem("Option One");
+ options.addItem("Option Two");
+ options.addItem("Option Three");
+ options.select("Option One");
+ options.setItemIcon("Option One", TestIcon.get());
+ options.setItemIcon("Option Two", TestIcon.get());
+ options.setItemIcon("Option Three", TestIcon.get(true));
+ row.addComponent(options);
+
options = new OptionGroup("Horizontal items");
options.addStyleName("horizontal");
options.addItem("Option One");
diff --git a/uitest/src/com/vaadin/tests/themes/valo/ComboBoxes.java b/uitest/src/com/vaadin/tests/themes/valo/ComboBoxes.java
index 6c1253c841..cafdfe37e0 100644
--- a/uitest/src/com/vaadin/tests/themes/valo/ComboBoxes.java
+++ b/uitest/src/com/vaadin/tests/themes/valo/ComboBoxes.java
@@ -19,6 +19,7 @@ import com.vaadin.data.Container;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.server.ThemeResource;
+import com.vaadin.server.UserError;
import com.vaadin.ui.Button;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.CssLayout;
@@ -88,6 +89,27 @@ public class ComboBoxes extends VerticalLayout implements View {
combo.select("Option One");
row.addComponent(combo);
+ combo = new ComboBox("Error");
+ combo.setInputPrompt("You can type here");
+ combo.addItem("Option One");
+ combo.addItem("Option Two");
+ combo.addItem("Option Three");
+ combo.setNullSelectionAllowed(false);
+ combo.select("Option One");
+ combo.setComponentError(new UserError("Fix it, now!"));
+ row.addComponent(combo);
+
+ combo = new ComboBox("Error, borderless");
+ combo.setInputPrompt("You can type here");
+ combo.addItem("Option One");
+ combo.addItem("Option Two");
+ combo.addItem("Option Three");
+ combo.setNullSelectionAllowed(false);
+ combo.select("Option One");
+ combo.setComponentError(new UserError("Fix it, now!"));
+ combo.addStyleName("borderless");
+ row.addComponent(combo);
+
combo = new ComboBox("Disabled");
combo.setInputPrompt("You can't type here");
combo.addItem("Option One");
@@ -122,18 +144,26 @@ public class ComboBoxes extends VerticalLayout implements View {
combo = new ComboBox("Small");
combo.setInputPrompt("You can type here");
- combo.addItem("Option One");
- combo.addItem("Option Two");
- combo.addItem("Option Three");
+ combo.setContainerDataSource(generatedContainer);
+ combo.setItemCaptionPropertyId(ValoThemeTest.CAPTION_PROPERTY);
+ combo.setItemIconPropertyId(ValoThemeTest.ICON_PROPERTY);
combo.addStyleName("small");
row.addComponent(combo);
combo = new ComboBox("Large");
combo.setInputPrompt("You can type here");
+ combo.setContainerDataSource(generatedContainer);
+ combo.setItemCaptionPropertyId(ValoThemeTest.CAPTION_PROPERTY);
+ combo.setItemIconPropertyId(ValoThemeTest.ICON_PROPERTY);
+ combo.addStyleName("large");
+ row.addComponent(combo);
+
+ combo = new ComboBox("Borderless");
+ combo.setInputPrompt("You can type here");
combo.addItem("Option One");
combo.addItem("Option Two");
combo.addItem("Option Three");
- combo.addStyleName("large");
+ combo.addStyleName("borderless");
row.addComponent(combo);
}
diff --git a/uitest/src/com/vaadin/tests/themes/valo/CommonParts.java b/uitest/src/com/vaadin/tests/themes/valo/CommonParts.java
index 59b712d8b2..75d51ed2a6 100644
--- a/uitest/src/com/vaadin/tests/themes/valo/CommonParts.java
+++ b/uitest/src/com/vaadin/tests/themes/valo/CommonParts.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 Vaadin Ltd.
+ * Copyright 2000-2014 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
@@ -22,13 +22,16 @@ import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.server.AbstractErrorMessage;
import com.vaadin.server.ErrorMessage.ErrorLevel;
+import com.vaadin.server.FontAwesome;
import com.vaadin.server.Page;
import com.vaadin.server.UserError;
import com.vaadin.shared.Position;
import com.vaadin.shared.ui.label.ContentMode;
+import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.CheckBox;
import com.vaadin.ui.Component;
import com.vaadin.ui.CssLayout;
import com.vaadin.ui.GridLayout;
@@ -39,6 +42,9 @@ import com.vaadin.ui.MenuBar.Command;
import com.vaadin.ui.MenuBar.MenuItem;
import com.vaadin.ui.Notification;
import com.vaadin.ui.Panel;
+import com.vaadin.ui.TabSheet;
+import com.vaadin.ui.TabSheet.SelectedTabChangeEvent;
+import com.vaadin.ui.TabSheet.SelectedTabChangeListener;
import com.vaadin.ui.TextArea;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
@@ -61,8 +67,8 @@ public class CommonParts extends VerticalLayout implements View {
row.addComponent(loadingIndicators());
row.addComponent(notifications(), 1, 0, 1, 2);
- row.addComponent(tooltips());
row.addComponent(windows());
+ row.addComponent(tooltips());
}
@@ -189,8 +195,9 @@ public class CommonParts extends VerticalLayout implements View {
notification.setStyleName(styleString.trim());
} else {
typeString = selectedItem.getText().toLowerCase();
- notification.setStyleName(typeString + " "
- + styleString.trim());
+ notification
+ .setStyleName((typeString + " " + styleString
+ .trim()).trim());
}
for (MenuItem item : type.getItems()) {
item.setChecked(false);
@@ -221,10 +228,11 @@ public class CommonParts extends VerticalLayout implements View {
}
}
if (styleString.trim().length() > 0) {
- notification.setStyleName(typeString + " "
- + styleString.trim());
+ notification
+ .setStyleName((typeString + " " + styleString
+ .trim()).trim());
} else if (typeString.length() > 0) {
- notification.setStyleName(typeString);
+ notification.setStyleName(typeString.trim());
} else {
notification.setStyleName(null);
}
@@ -235,6 +243,7 @@ public class CommonParts extends VerticalLayout implements View {
style.addItem("Success", styleCommand).setCheckable(true);
style.addItem("Failure", styleCommand).setCheckable(true);
style.addItem("Bar", styleCommand).setCheckable(true);
+ style.addItem("Small", styleCommand).setCheckable(true);
style.addItem("Closable", styleCommand).setCheckable(true);
addComponent(style);
style.addStyleName("small");
@@ -264,12 +273,13 @@ public class CommonParts extends VerticalLayout implements View {
delay.setValue("1000");
group.addComponent(delay);
- Button clear = new Button("×", new ClickListener() {
+ Button clear = new Button(null, new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
delay.setValue("");
}
});
+ clear.setIcon(FontAwesome.TIMES_CIRCLE);
clear.addStyleName("last");
clear.addStyleName("small");
clear.addStyleName("icon-only");
@@ -435,51 +445,209 @@ public class CommonParts extends VerticalLayout implements View {
Panel windows() {
Panel p = new Panel("Dialogs");
VerticalLayout content = new VerticalLayout() {
- final Window win = new Window();
- MenuBar footer = new MenuBar();
+ final Window win = new Window("Window Caption");
String prevHeight = "300px";
+ boolean footerVisible = true;
+ boolean autoHeight = false;
+ boolean tabsVisible = false;
+ boolean toolbarVisible = false;
+ boolean footerToolbar = false;
+ boolean toolbarLayout = false;
+ String toolbarStyle = null;
+
+ VerticalLayout windowContent() {
+ VerticalLayout root = new VerticalLayout();
+
+ if (toolbarVisible) {
+ MenuBar menuBar = MenuBars.getToolBar();
+ menuBar.setSizeUndefined();
+ menuBar.setStyleName(toolbarStyle);
+ Component toolbar = menuBar;
+ if (toolbarLayout) {
+ menuBar.setWidth(null);
+ HorizontalLayout toolbarLayout = new HorizontalLayout();
+ toolbarLayout.setWidth("100%");
+ toolbarLayout.setSpacing(true);
+ Label label = new Label("Tools");
+ label.setSizeUndefined();
+ toolbarLayout.addComponents(label, menuBar);
+ toolbarLayout.setExpandRatio(menuBar, 1);
+ toolbarLayout.setComponentAlignment(menuBar,
+ Alignment.TOP_RIGHT);
+ toolbar = toolbarLayout;
+ }
+ toolbar.addStyleName("v-window-top-toolbar");
+ root.addComponent(toolbar);
+ }
+
+ Component content = null;
+
+ if (tabsVisible) {
+ TabSheet tabs = new TabSheet();
+ tabs.setSizeFull();
+ VerticalLayout l = new VerticalLayout();
+ l.addComponent(new Label(
+ "<h2>Subtitle</h2><p>Normal type for plain text. Etiam at risus et justo dignissim congue. Phasellus laoreet lorem vel dolor tempus vehicula.</p><p>Quisque ut dolor gravida, placerat libero vel, euismod. Etiam habebis sem dicantur magna mollis euismod. Nihil hic munitissimus habendi senatus locus, nihil horum? Curabitur est gravida et libero vitae dictum. Ullamco laboris nisi ut aliquid ex ea commodi consequat. Morbi odio eros, volutpat ut pharetra vitae, lobortis sed nibh.</p>",
+ ContentMode.HTML));
+ l.setMargin(true);
+ tabs.addTab(l, "Selected");
+ tabs.addTab(new Label("&nbsp;", ContentMode.HTML),
+ "Another");
+ tabs.addTab(new Label("&nbsp;", ContentMode.HTML),
+ "One more");
+ tabs.addStyleName("padded-tabbar");
+ tabs.addSelectedTabChangeListener(new SelectedTabChangeListener() {
+ @Override
+ public void selectedTabChange(
+ SelectedTabChangeEvent event) {
+ try {
+ Thread.sleep(600);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ });
+ content = tabs;
+ } else if (!autoHeight) {
+ Panel p = new Panel();
+ p.setSizeFull();
+ p.addStyleName("borderless");
+ if (!toolbarVisible || !toolbarLayout) {
+ p.addStyleName("scroll-divider");
+ }
+ VerticalLayout l = new VerticalLayout();
+ l.addComponent(new Label(
+ "<h2>Subtitle</h2><p>Normal type for plain text. Etiam at risus et justo dignissim congue. Phasellus laoreet lorem vel dolor tempus vehicula.</p><p>Quisque ut dolor gravida, placerat libero vel, euismod. Etiam habebis sem dicantur magna mollis euismod. Nihil hic munitissimus habendi senatus locus, nihil horum? Curabitur est gravida et libero vitae dictum. Ullamco laboris nisi ut aliquid ex ea commodi consequat. Morbi odio eros, volutpat ut pharetra vitae, lobortis sed nibh.</p>",
+ ContentMode.HTML));
+ l.setMargin(true);
+ p.setContent(l);
+ content = p;
+ } else {
+ content = new Label(
+ "<h2>Subtitle</h2><p>Normal type for plain text. Etiam at risus et justo dignissim congue. Phasellus laoreet lorem vel dolor tempus vehicula.</p><p>Quisque ut dolor gravida, placerat libero vel, euismod. Etiam habebis sem dicantur magna mollis euismod. Nihil hic munitissimus habendi senatus locus, nihil horum? Curabitur est gravida et libero vitae dictum. Ullamco laboris nisi ut aliquid ex ea commodi consequat. Morbi odio eros, volutpat ut pharetra vitae, lobortis sed nibh.</p>",
+ ContentMode.HTML);
+ root.setMargin(true);
+ }
+
+ root.addComponent(content);
+
+ if (footerVisible) {
+ HorizontalLayout footer = new HorizontalLayout();
+ footer.setWidth("100%");
+ footer.setSpacing(true);
+ footer.addStyleName("v-window-bottom-toolbar");
+
+ Label footerText = new Label("Footer text");
+ footerText.setSizeUndefined();
+
+ Button ok = new Button("OK");
+ ok.addStyleName("primary");
+
+ Button cancel = new Button("Cancel");
+
+ footer.addComponents(footerText, ok, cancel);
+ footer.setExpandRatio(footerText, 1);
+
+ if (footerToolbar) {
+ MenuBar menuBar = MenuBars.getToolBar();
+ menuBar.setStyleName(toolbarStyle);
+ menuBar.setWidth(null);
+ footer.removeAllComponents();
+ footer.addComponent(menuBar);
+ }
+
+ root.addComponent(footer);
+ }
+
+ if (!autoHeight) {
+ root.setSizeFull();
+ root.setExpandRatio(content, 1);
+ }
+
+ return root;
+ }
+
{
setSpacing(true);
setMargin(true);
- win.setWidth("320px");
+ win.setWidth("380px");
win.setHeight(prevHeight);
win.setClosable(false);
win.setResizable(false);
- win.setContent(windowContents(true));
+ win.setContent(windowContent());
win.setCloseShortcut(KeyCode.ESCAPE, null);
- Command footerCommand = new Command() {
+ Command optionsCommand = new Command() {
@Override
public void menuSelected(MenuItem selectedItem) {
- if (selectedItem.getText().equals("Fixed")) {
- win.setContent(windowContents(true));
- win.setHeight(prevHeight);
- } else {
- win.setContent(windowContents(false));
- prevHeight = win.getHeight()
- + win.getHeightUnits().toString();
- win.setHeight(null);
+ if (selectedItem.getText().equals("Footer")) {
+ footerVisible = selectedItem.isChecked();
}
- for (MenuItem item : footer.getItems()) {
- item.setChecked(false);
+ if (selectedItem.getText().equals("Auto Height")) {
+ autoHeight = selectedItem.isChecked();
+ if (!autoHeight) {
+ win.setHeight(prevHeight);
+ } else {
+ prevHeight = win.getHeight()
+ + win.getHeightUnits().toString();
+ win.setHeight(null);
+ }
}
- selectedItem.setChecked(true);
+ if (selectedItem.getText().equals("Tabs")) {
+ tabsVisible = selectedItem.isChecked();
+ }
+
+ if (selectedItem.getText().equals("Top Toolbar")) {
+ toolbarVisible = selectedItem.isChecked();
+ }
+
+ if (selectedItem.getText().equals("Footer Toolbar")) {
+ footerToolbar = selectedItem.isChecked();
+ }
+
+ if (selectedItem.getText().equals("Top Toolbar layout")) {
+ toolbarLayout = selectedItem.isChecked();
+ }
+
+ if (selectedItem.getText()
+ .equals("Borderless Toolbars")) {
+ toolbarStyle = selectedItem.isChecked() ? "borderless"
+ : null;
+ }
+
+ win.setContent(windowContent());
}
};
- footer.setCaption("Footer type");
- MenuItem fixed = footer.addItem("Fixed", footerCommand);
- fixed.setCheckable(true);
- fixed.setChecked(true);
- footer.addItem("Scroll", footerCommand).setCheckable(true);
- footer.addStyleName("small");
- addComponent(footer);
+ MenuBar options = new MenuBar();
+ options.setCaption("Content");
+ options.addItem("Auto Height", optionsCommand).setCheckable(
+ true);
+ options.addItem("Tabs", optionsCommand).setCheckable(true);
+ MenuItem option = options.addItem("Footer", optionsCommand);
+ option.setCheckable(true);
+ option.setChecked(true);
+ options.addStyleName("small");
+ addComponent(options);
- Command optionsCommand = new Command() {
+ options = new MenuBar();
+ options.setCaption("Toolbars");
+ options.addItem("Footer Toolbar", optionsCommand).setCheckable(
+ true);
+ options.addItem("Top Toolbar", optionsCommand).setCheckable(
+ true);
+ options.addItem("Top Toolbar layout", optionsCommand)
+ .setCheckable(true);
+ options.addItem("Borderless Toolbars", optionsCommand)
+ .setCheckable(true);
+ options.addStyleName("small");
+ addComponent(options);
+
+ Command optionsCommand2 = new Command() {
@Override
public void menuSelected(MenuItem selectedItem) {
if (selectedItem.getText().equals("Caption")) {
- win.setCaption(selectedItem.isChecked() ? "Window caption"
+ win.setCaption(selectedItem.isChecked() ? "Window Caption"
: null);
} else if (selectedItem.getText().equals("Closable")) {
win.setClosable(selectedItem.isChecked());
@@ -491,12 +659,15 @@ public class CommonParts extends VerticalLayout implements View {
}
};
- MenuBar options = new MenuBar();
+ options = new MenuBar();
options.setCaption("Options");
- options.addItem("Caption", optionsCommand).setCheckable(true);
- options.addItem("Closable", optionsCommand).setCheckable(true);
- options.addItem("Resizable", optionsCommand).setCheckable(true);
- options.addItem("Modal", optionsCommand).setCheckable(true);
+ MenuItem caption = options.addItem("Caption", optionsCommand2);
+ caption.setCheckable(true);
+ caption.setChecked(true);
+ options.addItem("Closable", optionsCommand2).setCheckable(true);
+ options.addItem("Resizable", optionsCommand2)
+ .setCheckable(true);
+ options.addItem("Modal", optionsCommand2).setCheckable(true);
options.addStyleName("small");
addComponent(options);
@@ -513,6 +684,15 @@ public class CommonParts extends VerticalLayout implements View {
show.addStyleName("primary");
addComponent(show);
+ final CheckBox hidden = new CheckBox("Hidden");
+ hidden.addValueChangeListener(new ValueChangeListener() {
+ @Override
+ public void valueChange(ValueChangeEvent event) {
+ win.setVisible(!hidden.getValue());
+ }
+ });
+ addComponent(hidden);
+
win.addCloseListener(new CloseListener() {
@Override
public void windowClose(CloseEvent e) {
@@ -526,54 +706,6 @@ public class CommonParts extends VerticalLayout implements View {
}
- VerticalLayout windowContents(boolean scrollable) {
- VerticalLayout root = new VerticalLayout();
-
- HorizontalLayout footer = new HorizontalLayout();
- footer.setWidth("100%");
- footer.setSpacing(true);
- footer.addStyleName("v-window-bottom-toolbar");
-
- Label footerText = new Label("Footer text");
- footerText.setSizeUndefined();
-
- Button ok = new Button("OK");
- ok.addStyleName("primary");
-
- Button cancel = new Button("Cancel");
-
- footer.addComponents(footerText, ok, cancel);
- footer.setExpandRatio(footerText, 1);
-
- Component content = null;
- if (scrollable) {
- Panel panel = new Panel();
- panel.setSizeFull();
- panel.addStyleName("borderless");
- // Adds a border between the caption and the content
- panel.addStyleName("scroll-divider");
- VerticalLayout l = new VerticalLayout();
- l.addComponent(new Label(
- "<h2>Subtitle</h2><p>Quam diu etiam furor iste tuus nos eludet? Petierunt uti sibi concilium totius Galliae in diem certam indicere. Ut enim ad minim veniam, quis nostrud exercitation. Quae vero auctorem tractata ab fiducia dicuntur.</p><p>Quisque ut dolor gravida, placerat libero vel, euismod. Etiam habebis sem dicantur magna mollis euismod. Nihil hic munitissimus habendi senatus locus, nihil horum? Curabitur est gravida et libero vitae dictum. Ullamco laboris nisi ut aliquid ex ea commodi consequat. Morbi odio eros, volutpat ut pharetra vitae, lobortis sed nibh.</p>",
- ContentMode.HTML));
- l.setMargin(true);
- panel.setContent(l);
- content = panel;
- } else {
- content = new Label(
- "<h2>Subtitle</h2><p>Normal type for plain text. Etiam at risus et justo dignissim congue. Phasellus laoreet lorem vel dolor tempus vehicula.</p>",
- ContentMode.HTML);
- }
- root.addComponents(content, footer);
- if (scrollable) {
- root.setSizeFull();
- root.setExpandRatio(content, 1);
- }
- root.setMargin(!scrollable);
-
- return root;
- }
-
@Override
public void enter(ViewChangeEvent event) {
// TODO Auto-generated method stub
diff --git a/uitest/src/com/vaadin/tests/themes/valo/DateFields.java b/uitest/src/com/vaadin/tests/themes/valo/DateFields.java
index a9a9018dbb..ae520e07c2 100644
--- a/uitest/src/com/vaadin/tests/themes/valo/DateFields.java
+++ b/uitest/src/com/vaadin/tests/themes/valo/DateFields.java
@@ -20,6 +20,7 @@ import java.util.Locale;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
+import com.vaadin.server.UserError;
import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
@@ -48,6 +49,17 @@ public class DateFields extends VerticalLayout implements View {
date.setValue(new Date());
row.addComponent(date);
+ date = new DateField("Error");
+ date.setValue(new Date());
+ date.setComponentError(new UserError("Fix it, now!"));
+ row.addComponent(date);
+
+ date = new DateField("Error, borderless");
+ date.setValue(new Date());
+ date.setComponentError(new UserError("Fix it, now!"));
+ date.addStyleName("borderless");
+ row.addComponent(date);
+
CssLayout group = new CssLayout();
group.setCaption("Grouped with a Button");
group.addStyleName("v-component-group");
@@ -136,6 +148,12 @@ public class DateFields extends VerticalLayout implements View {
date.addStyleName("large");
row.addComponent(date);
+ date = new DateField("Borderless");
+ date.setValue(new Date());
+ date.setResolution(Resolution.DAY);
+ date.addStyleName("borderless");
+ row.addComponent(date);
+
date = new DateField("Week numbers");
date.setValue(new Date());
date.setResolution(Resolution.DAY);
diff --git a/uitest/src/com/vaadin/tests/themes/valo/Dragging.java b/uitest/src/com/vaadin/tests/themes/valo/Dragging.java
new file mode 100644
index 0000000000..27bdea7d8a
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/themes/valo/Dragging.java
@@ -0,0 +1,273 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.themes.valo;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import com.vaadin.event.Transferable;
+import com.vaadin.event.dd.DragAndDropEvent;
+import com.vaadin.event.dd.DropHandler;
+import com.vaadin.event.dd.DropTarget;
+import com.vaadin.event.dd.TargetDetails;
+import com.vaadin.event.dd.acceptcriteria.AcceptCriterion;
+import com.vaadin.event.dd.acceptcriteria.Not;
+import com.vaadin.event.dd.acceptcriteria.SourceIsTarget;
+import com.vaadin.navigator.View;
+import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
+import com.vaadin.server.ThemeResource;
+import com.vaadin.shared.ui.dd.HorizontalDropLocation;
+import com.vaadin.ui.AbstractOrderedLayout;
+import com.vaadin.ui.Alignment;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Component;
+import com.vaadin.ui.CssLayout;
+import com.vaadin.ui.CustomComponent;
+import com.vaadin.ui.DragAndDropWrapper;
+import com.vaadin.ui.Embedded;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.MenuBar;
+import com.vaadin.ui.MenuBar.MenuItem;
+import com.vaadin.ui.Notification;
+import com.vaadin.ui.VerticalLayout;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class Dragging extends VerticalLayout implements View {
+
+ SortableLayout sample;
+
+ public Dragging() {
+ setMargin(true);
+ setSpacing(true);
+
+ Label h1 = new Label("Dragging Components");
+ h1.addStyleName("h1");
+ addComponent(h1);
+
+ MenuBar options = new MenuBar();
+ options.setCaption("Drop Hints");
+ addComponent(options);
+
+ // Use these styles to hide irrelevant drag hints
+ // Can be used either on a parent or directly on the DnDWrapper
+ MenuItem opt = options.addItem("Vertical", new MenuBar.Command() {
+ @Override
+ public void menuSelected(MenuItem selectedItem) {
+ if (selectedItem.isChecked()) {
+ sample.removeStyleName("no-vertical-drag-hints");
+ } else {
+ sample.addStyleName("no-vertical-drag-hints");
+ }
+ }
+ });
+ opt.setCheckable(true);
+ opt.setChecked(true);
+
+ opt = options.addItem("Horizontal", new MenuBar.Command() {
+ @Override
+ public void menuSelected(MenuItem selectedItem) {
+ if (selectedItem.isChecked()) {
+ sample.removeStyleName("no-horizontal-drag-hints");
+ } else {
+ sample.addStyleName("no-horizontal-drag-hints");
+ }
+ }
+ });
+ opt.setCheckable(true);
+ opt.setChecked(true);
+
+ opt = options.addItem("Box", new MenuBar.Command() {
+ @Override
+ public void menuSelected(MenuItem selectedItem) {
+ if (selectedItem.isChecked()) {
+ sample.removeStyleName("no-box-drag-hints");
+ } else {
+ sample.addStyleName("no-box-drag-hints");
+ }
+ }
+ });
+ opt.setCheckable(true);
+ opt.setChecked(true);
+
+ sample = new SortableLayout();
+ sample.setSizeUndefined();
+ sample.setHeight("100px");
+
+ for (final Component component : createComponents()) {
+ sample.addComponent(component);
+ }
+
+ addComponent(sample);
+
+ }
+
+ private List<Component> createComponents() {
+ final List<Component> components = new ArrayList<Component>();
+
+ final Label label = new Label(
+ "This is a long text block that will wrap.");
+ label.setWidth("120px");
+ components.add(label);
+
+ final Embedded image = new Embedded("", new ThemeResource(
+ "../runo/icons/64/document.png"));
+ components.add(image);
+
+ final CssLayout documentLayout = new CssLayout();
+ documentLayout.setWidth("19px");
+ for (int i = 0; i < 5; ++i) {
+ final Embedded e = new Embedded(null, new ThemeResource(
+ "../runo/icons/16/document.png"));
+ e.setHeight("16px");
+ e.setWidth("16px");
+ documentLayout.addComponent(e);
+ }
+ components.add(documentLayout);
+
+ final VerticalLayout buttonLayout = new VerticalLayout();
+ final Button button = new Button("Button");
+ button.addClickListener(new Button.ClickListener() {
+ @Override
+ public void buttonClick(final ClickEvent event) {
+ Notification.show("Button clicked");
+ }
+ });
+ buttonLayout.addComponent(button);
+ buttonLayout.setComponentAlignment(button, Alignment.MIDDLE_CENTER);
+ components.add(buttonLayout);
+
+ return components;
+ }
+
+ private static class ReorderLayoutDropHandler implements DropHandler {
+
+ private final AbstractOrderedLayout layout;
+
+ public ReorderLayoutDropHandler(final AbstractOrderedLayout layout) {
+ this.layout = layout;
+ }
+
+ @Override
+ public AcceptCriterion getAcceptCriterion() {
+ return new Not(SourceIsTarget.get());
+ }
+
+ @Override
+ public void drop(final DragAndDropEvent dropEvent) {
+ final Transferable transferable = dropEvent.getTransferable();
+ final Component sourceComponent = transferable.getSourceComponent();
+ if (sourceComponent instanceof WrappedComponent) {
+ final TargetDetails dropTargetData = dropEvent
+ .getTargetDetails();
+ final DropTarget target = dropTargetData.getTarget();
+
+ // find the location where to move the dragged component
+ boolean sourceWasAfterTarget = true;
+ int index = 0;
+ final Iterator<Component> componentIterator = layout
+ .getComponentIterator();
+ Component next = null;
+ while (next != target && componentIterator.hasNext()) {
+ next = componentIterator.next();
+ if (next != sourceComponent) {
+ index++;
+ } else {
+ sourceWasAfterTarget = false;
+ }
+ }
+ if (next == null || next != target) {
+ // component not found - if dragging from another layout
+ return;
+ }
+
+ // drop on top of target?
+ if (dropTargetData.getData("horizontalLocation").equals(
+ HorizontalDropLocation.CENTER.toString())) {
+ if (sourceWasAfterTarget) {
+ index--;
+ }
+ }
+
+ // drop before the target?
+ else if (dropTargetData.getData("horizontalLocation").equals(
+ HorizontalDropLocation.LEFT.toString())) {
+ index--;
+ if (index < 0) {
+ index = 0;
+ }
+ }
+
+ // move component within the layout
+ layout.removeComponent(sourceComponent);
+ layout.addComponent(sourceComponent, index);
+ }
+ }
+ }
+
+ private static class SortableLayout extends CustomComponent {
+ private final AbstractOrderedLayout layout;
+ private final DropHandler dropHandler;
+
+ public SortableLayout() {
+ layout = new HorizontalLayout();
+ layout.setMargin(true);
+ dropHandler = new ReorderLayoutDropHandler(layout);
+
+ // final DragAndDropWrapper pane = new DragAndDropWrapper(layout);
+ setCompositionRoot(layout);
+ }
+
+ public void addComponent(final Component component) {
+ final WrappedComponent wrapper = new WrappedComponent(component,
+ dropHandler);
+ wrapper.setSizeUndefined();
+ component.setHeight("100%");
+ wrapper.setHeight("100%");
+ layout.addComponent(wrapper);
+ }
+ }
+
+ private static class WrappedComponent extends DragAndDropWrapper {
+
+ private final DropHandler dropHandler;
+
+ public WrappedComponent(final Component content,
+ final DropHandler dropHandler) {
+ super(content);
+ this.dropHandler = dropHandler;
+ setDragStartMode(DragStartMode.WRAPPER);
+ }
+
+ @Override
+ public DropHandler getDropHandler() {
+ return dropHandler;
+ }
+
+ }
+
+ @Override
+ public void enter(ViewChangeEvent event) {
+ // TODO Auto-generated method stub
+
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/themes/valo/Forms.java b/uitest/src/com/vaadin/tests/themes/valo/Forms.java
index da147cbdc9..9451b5c5d3 100644
--- a/uitest/src/com/vaadin/tests/themes/valo/Forms.java
+++ b/uitest/src/com/vaadin/tests/themes/valo/Forms.java
@@ -20,6 +20,7 @@ import java.util.Date;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.server.UserError;
+import com.vaadin.shared.ui.MarginInfo;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
@@ -57,7 +58,7 @@ public class Forms extends VerticalLayout implements View {
addComponent(form);
Label section = new Label("Personal Info");
- section.addStyleName("h4");
+ section.addStyleName("h2");
form.addComponent(section);
TextField name = new TextField("Name");
@@ -84,7 +85,7 @@ public class Forms extends VerticalLayout implements View {
form.addComponent(sex);
section = new Label("Contact Info");
- section.addStyleName("h4");
+ section.addStyleName("h3");
form.addComponent(section);
TextField email = new TextField("Email");
@@ -139,22 +140,26 @@ public class Forms extends VerticalLayout implements View {
shortbio.setRows(2);
form.addComponent(shortbio);
- RichTextArea bio = new RichTextArea("Bio");
+ final RichTextArea bio = new RichTextArea("Bio");
bio.setWidth("100%");
+ bio.setValue("<div><p><span>Integer legentibus erat a ante historiarum dapibus.</span> <span>Vivamus sagittis lacus vel augue laoreet rutrum faucibus.</span> <span>A communi observantia non est recedendum.</span> <span>Morbi fringilla convallis sapien, id pulvinar odio volutpat.</span> <span>Ab illo tempore, ab est sed immemorabili.</span> <span>Quam temere in vitiis, legem sancimus haerentia.</span></p><p><span>Morbi odio eros, volutpat ut pharetra vitae, lobortis sed nibh.</span> <span>Quam diu etiam furor iste tuus nos eludet?</span> <span>Cum sociis natoque penatibus et magnis dis parturient.</span> <span>Quam diu etiam furor iste tuus nos eludet?</span> <span>Tityre, tu patulae recubans sub tegmine fagi dolor.</span></p><p><span>Curabitur blandit tempus ardua ridiculus sed magna.</span> <span>Phasellus laoreet lorem vel dolor tempus vehicula.</span> <span>Etiam habebis sem dicantur magna mollis euismod.</span> <span>Hi omnes lingua, institutis, legibus inter se differunt.</span></p></div>");
form.addComponent(bio);
form.setReadOnly(true);
+ bio.setReadOnly(true);
Button edit = new Button("Edit", new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
boolean readOnly = form.isReadOnly();
if (readOnly) {
+ bio.setReadOnly(false);
form.setReadOnly(false);
form.removeStyleName("light");
event.getButton().setCaption("Save");
event.getButton().addStyleName("primary");
} else {
+ bio.setReadOnly(true);
form.setReadOnly(true);
form.addStyleName("light");
event.getButton().setCaption("Edit");
@@ -163,7 +168,16 @@ public class Forms extends VerticalLayout implements View {
}
});
- addComponent(edit);
+ HorizontalLayout footer = new HorizontalLayout();
+ footer.setMargin(new MarginInfo(true, false, true, false));
+ footer.setSpacing(true);
+ footer.setDefaultComponentAlignment(Alignment.MIDDLE_LEFT);
+ form.addComponent(footer);
+ footer.addComponent(edit);
+
+ Label lastModified = new Label("Last modified by you a minute ago");
+ lastModified.addStyleName("light");
+ footer.addComponent(lastModified);
}
@Override
diff --git a/uitest/src/com/vaadin/tests/themes/valo/MenuBars.java b/uitest/src/com/vaadin/tests/themes/valo/MenuBars.java
index c75338912a..f15f43254a 100644
--- a/uitest/src/com/vaadin/tests/themes/valo/MenuBars.java
+++ b/uitest/src/com/vaadin/tests/themes/valo/MenuBars.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 Vaadin Ltd.
+ * Copyright 2000-2014 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
@@ -47,45 +47,58 @@ public class MenuBars extends VerticalLayout implements View {
menuBar.setCaption("Borderless style");
menuBar.addStyleName("borderless");
addComponent(menuBar);
+
+ menuBar = getMenuBar();
+ menuBar.setCaption("Small borderless style");
+ menuBar.addStyleName("borderless");
+ menuBar.addStyleName("small");
+ addComponent(menuBar);
}
- MenuBar getMenuBar() {
+ static MenuBar getMenuBar() {
+ Command click = new Command() {
+ @Override
+ public void menuSelected(MenuItem selectedItem) {
+ Notification.show("Clicked " + selectedItem.getText());
+ }
+ };
+
MenuBar menubar = new MenuBar();
menubar.setWidth("100%");
final MenuBar.MenuItem file = menubar.addItem("File", null);
final MenuBar.MenuItem newItem = file.addItem("New", null);
- file.addItem("Open file...", null);
+ file.addItem("Open file...", click);
file.addSeparator();
- newItem.addItem("File", null);
- newItem.addItem("Folder", null);
- newItem.addItem("Project...", null);
+ newItem.addItem("File", click);
+ newItem.addItem("Folder", click);
+ newItem.addItem("Project...", click);
- file.addItem("Close", null);
- file.addItem("Close All", null);
+ file.addItem("Close", click);
+ file.addItem("Close All", click);
file.addSeparator();
- file.addItem("Save", null);
- file.addItem("Save As...", null);
- file.addItem("Save All", null);
+ file.addItem("Save", click);
+ file.addItem("Save As...", click);
+ file.addItem("Save All", click);
final MenuBar.MenuItem edit = menubar.addItem("Edit", null);
- edit.addItem("Undo", null);
- edit.addItem("Redo", null).setEnabled(false);
+ edit.addItem("Undo", click);
+ edit.addItem("Redo", click).setEnabled(false);
edit.addSeparator();
- edit.addItem("Cut", null);
- edit.addItem("Copy", null);
- edit.addItem("Paste", null);
+ edit.addItem("Cut", click);
+ edit.addItem("Copy", click);
+ edit.addItem("Paste", click);
edit.addSeparator();
final MenuBar.MenuItem find = edit.addItem("Find/Replace", null);
- find.addItem("Google Search", null);
+ find.addItem("Google Search", click);
find.addSeparator();
- find.addItem("Find/Replace...", null);
- find.addItem("Find Next", null);
- find.addItem("Find Previous", null);
+ find.addItem("Find/Replace...", click);
+ find.addItem("Find Next", click);
+ find.addItem("Find Previous", click);
Command check = new Command() {
@Override
@@ -100,12 +113,12 @@ public class MenuBars extends VerticalLayout implements View {
MenuItem title = view.addItem("Show Title Bar", check);
title.setCheckable(true);
title.setChecked(true);
- view.addItem("Customize Toolbar...", null);
+ view.addItem("Customize Toolbar...", click);
view.addSeparator();
- view.addItem("Actual Size", null);
- view.addItem("Zoom In", null);
- view.addItem("Zoom Out", null);
+ view.addItem("Actual Size", click);
+ view.addItem("Zoom In", click);
+ view.addItem("Zoom Out", click);
MenuItem fav = menubar.addItem("", check);
fav.setIcon(TestIcon.get());
@@ -119,12 +132,48 @@ public class MenuBars extends VerticalLayout implements View {
fav.setCheckable(true);
fav.setCheckable(true);
- menubar.addItem("Attach", null).setIcon(FontAwesome.PAPERCLIP);
- menubar.addItem("Undo", null).setIcon(FontAwesome.UNDO);
- MenuItem redo = menubar.addItem("Redo", null);
+ menubar.addItem("Attach", click).setIcon(FontAwesome.PAPERCLIP);
+ menubar.addItem("Undo", click).setIcon(FontAwesome.UNDO);
+ MenuItem redo = menubar.addItem("Redo", click);
+ redo.setIcon(FontAwesome.REPEAT);
+ redo.setEnabled(false);
+ menubar.addItem("Upload", click).setIcon(FontAwesome.UPLOAD);
+
+ return menubar;
+ }
+
+ static MenuBar getToolBar() {
+ MenuBar menubar = new MenuBar();
+ menubar.setWidth("100%");
+
+ MenuItem fav = menubar.addItem("", null);
+ fav.setIcon(FontAwesome.ALIGN_LEFT);
+ fav.setStyleName("icon-only");
+ fav.setCheckable(true);
+ // fav.setChecked(true);
+
+ fav = menubar.addItem("", null);
+ fav.setIcon(FontAwesome.ALIGN_CENTER);
+ fav.setStyleName("icon-only");
+ fav.setCheckable(true);
+
+ fav = menubar.addItem("", null);
+ fav.setIcon(FontAwesome.ALIGN_RIGHT);
+ fav.setStyleName("icon-only");
+ fav.setCheckable(true);
+
+ MenuItem clip = menubar.addItem("", null);
+ clip.setIcon(FontAwesome.PAPERCLIP);
+ clip.setStyleName("icon-only");
+
+ MenuItem undo = menubar.addItem("", null);
+ undo.setIcon(FontAwesome.UNDO);
+ undo.setStyleName("icon-only");
+
+ MenuItem redo = menubar.addItem("", null);
redo.setIcon(FontAwesome.REPEAT);
redo.setEnabled(false);
- menubar.addItem("Upload", null).setIcon(FontAwesome.UPLOAD);
+ redo.setStyleName("icon-only");
return menubar;
}
diff --git a/uitest/src/com/vaadin/tests/themes/valo/Panels.java b/uitest/src/com/vaadin/tests/themes/valo/Panels.java
index 62bb600bde..74baef066b 100644
--- a/uitest/src/com/vaadin/tests/themes/valo/Panels.java
+++ b/uitest/src/com/vaadin/tests/themes/valo/Panels.java
@@ -111,7 +111,7 @@ public class Panels extends VerticalLayout implements View {
Button action = new Button();
action.setIcon(FontAwesome.PENCIL);
- action.addStyleName("borderless");
+ action.addStyleName("borderless-colored");
action.addStyleName("small");
action.addStyleName("icon-only");
panelCaption.addComponent(action);
diff --git a/uitest/src/com/vaadin/tests/themes/valo/PopupViews.java b/uitest/src/com/vaadin/tests/themes/valo/PopupViews.java
index b13544c26a..c15270400c 100644
--- a/uitest/src/com/vaadin/tests/themes/valo/PopupViews.java
+++ b/uitest/src/com/vaadin/tests/themes/valo/PopupViews.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 Vaadin Ltd.
+ * Copyright 2000-2014 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
@@ -17,6 +17,7 @@ package com.vaadin.tests.themes.valo;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
+import com.vaadin.shared.ui.label.ContentMode;
import com.vaadin.ui.Component;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
@@ -43,6 +44,7 @@ public class PopupViews extends VerticalLayout implements View {
return new VerticalLayout() {
{
setMargin(true);
+ setWidth("300px");
addComponent(new Label(
"Fictum, deserunt mollit anim laborum astutumque! Magna pars studiorum, prodita quaerimus."));
}
@@ -54,9 +56,40 @@ public class PopupViews extends VerticalLayout implements View {
return "Click to view";
}
});
+ row.addComponent(pv);
+ pv.setHideOnMouseOut(true);
+ pv.setCaption("Hide on mouse-out");
+
+ pv = new PopupView(new Content() {
+ int count = 0;
+
+ @Override
+ public Component getPopupComponent() {
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ }
+ return new VerticalLayout() {
+ {
+ setMargin(true);
+ addComponent(new Label(
+ "<h3>Thanks for waiting!</h3><p>You've opened this popup <b>"
+ + ++count + " time"
+ + (count > 1 ? "s" : " only")
+ + "</b>.</p>", ContentMode.HTML));
+ }
+ };
+ }
+
+ @Override
+ public String getMinimizedValueAsHTML() {
+ return "Show slow loading content";
+ }
+ });
row.addComponent(pv);
pv.setHideOnMouseOut(false);
+ pv.setCaption("Hide on click-outside");
}
@Override
diff --git a/uitest/src/com/vaadin/tests/themes/valo/Sliders.java b/uitest/src/com/vaadin/tests/themes/valo/Sliders.java
index 516254cb40..363c698c32 100644
--- a/uitest/src/com/vaadin/tests/themes/valo/Sliders.java
+++ b/uitest/src/com/vaadin/tests/themes/valo/Sliders.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 Vaadin Ltd.
+ * Copyright 2000-2014 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
@@ -71,11 +71,19 @@ public class Sliders extends VerticalLayout implements View {
row.addComponent(slider);
slider = new Slider("With ticks (not in IE8 & IE9)");
- slider.setValue(50.0);
+ slider.setValue(3.0);
slider.setWidth("200px");
+ slider.setMax(4);
slider.addStyleName("ticks");
row.addComponent(slider);
+ slider = new Slider("Toggle imitation");
+ slider.setWidth("50px");
+ slider.setResolution(0);
+ slider.setMin(0);
+ slider.setMax(1);
+ row.addComponent(slider);
+
slider = new Slider("Vertical");
slider.setValue(50.0);
slider.setOrientation(SliderOrientation.VERTICAL);
@@ -116,8 +124,9 @@ public class Sliders extends VerticalLayout implements View {
row.addComponent(slider);
slider = new Slider("With ticks");
- slider.setValue(50.0);
+ slider.setValue(3.0);
slider.setHeight("200px");
+ slider.setMax(4);
slider.addStyleName("ticks");
slider.setOrientation(SliderOrientation.VERTICAL);
row.addComponent(slider);
diff --git a/uitest/src/com/vaadin/tests/themes/valo/Tables.java b/uitest/src/com/vaadin/tests/themes/valo/Tables.java
index d9e4bdd3ab..6aa02a7f74 100644
--- a/uitest/src/com/vaadin/tests/themes/valo/Tables.java
+++ b/uitest/src/com/vaadin/tests/themes/valo/Tables.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 Vaadin Ltd.
+ * Copyright 2000-2014 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
@@ -16,17 +16,25 @@
package com.vaadin.tests.themes.valo;
import com.vaadin.data.Container;
+import com.vaadin.data.Property.ValueChangeEvent;
+import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.event.dd.DragAndDropEvent;
import com.vaadin.event.dd.DropHandler;
import com.vaadin.event.dd.acceptcriteria.AcceptAll;
import com.vaadin.event.dd.acceptcriteria.AcceptCriterion;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.CheckBox;
+import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Notification;
import com.vaadin.ui.Table;
import com.vaadin.ui.Table.Align;
+import com.vaadin.ui.Table.ColumnGenerator;
+import com.vaadin.ui.Table.RowHeaderMode;
import com.vaadin.ui.Table.TableDragMode;
+import com.vaadin.ui.TextField;
import com.vaadin.ui.TreeTable;
import com.vaadin.ui.VerticalLayout;
@@ -37,6 +45,23 @@ public class Tables extends VerticalLayout implements View {
static final Container hierarchicalContainer = ValoThemeTest
.generateContainer(200, true);
+ CheckBox hierarchical = new CheckBox("Hierarchical");
+ CheckBox footer = new CheckBox("Footer", true);
+ CheckBox sized = new CheckBox("Sized");
+ CheckBox expandRatios = new CheckBox("Expand ratios");
+ CheckBox stripes = new CheckBox("Sripes", true);
+ CheckBox verticalLines = new CheckBox("Vertical lines", true);
+ CheckBox horizontalLines = new CheckBox("Horizontal lines", true);
+ CheckBox borderless = new CheckBox("Borderless");
+ CheckBox headers = new CheckBox("Header", true);
+ CheckBox compact = new CheckBox("Compact");
+ CheckBox small = new CheckBox("Small");
+ CheckBox rowIndex = new CheckBox("Row index", false);
+ CheckBox rowIcon = new CheckBox("Row icon", true);
+ CheckBox rowCaption = new CheckBox("Row caption", false);
+
+ Table table;
+
public Tables() {
setMargin(true);
setSpacing(true);
@@ -45,81 +70,70 @@ public class Tables extends VerticalLayout implements View {
h1.addStyleName("h1");
addComponent(h1);
- Table table = getTable("Normal");
- addComponent(table);
-
- table = getTable("Footer");
- table.setFooterVisible(true);
- table.setColumnFooter(ValoThemeTest.CAPTION_PROPERTY, "caption");
- table.setColumnFooter(ValoThemeTest.DESCRIPTION_PROPERTY, "description");
- table.setColumnFooter(ValoThemeTest.ICON_PROPERTY, "icon");
- table.setColumnFooter(ValoThemeTest.INDEX_PROPERTY, "index");
- addComponent(table);
-
- table = getTable("Sized ");
- table.setWidth("300px");
- addComponent(table);
-
- table = getTable("Sized w/ expand ratios");
- table.setWidth("100%");
- table.setColumnExpandRatio(ValoThemeTest.CAPTION_PROPERTY, 1.0f);
- table.setColumnExpandRatio(ValoThemeTest.DESCRIPTION_PROPERTY, 1.0f);
- // table.setColumnExpandRatio(ValoThemeTest.ICON_PROPERTY, 1.0f);
- // table.setColumnExpandRatio(ValoThemeTest.INDEX_PROPERTY, 1.0f);
- addComponent(table);
-
- table = getTable("No stripes");
- table.addStyleName("no-stripes");
- addComponent(table);
-
- table = getTable("No vertical lines");
- table.addStyleName("no-vertical-lines");
- addComponent(table);
-
- table = getTable("No horizontal lines");
- table.addStyleName("no-horizontal-lines");
- addComponent(table);
-
- table = getTable("Borderless");
- table.addStyleName("borderless");
- addComponent(table);
-
- table = getTable("No headers");
- table.addStyleName("no-header");
- addComponent(table);
-
- table = getTable("Compact");
- table.addStyleName("compact");
- addComponent(table);
-
- table = getTable("Small");
- table.addStyleName("small");
- addComponent(table);
-
- h1 = new Label("Tree Tables");
- h1.addStyleName("h1");
- addComponent(h1);
+ HorizontalLayout wrap = new HorizontalLayout();
+ wrap.addStyleName("wrapping");
+ wrap.setSpacing(true);
+ addComponent(wrap);
- addComponent(new Label(
- "TreeTables have all the same features as Tables, but they support hierarchical containers as well."));
+ wrap.addComponents(hierarchical, footer, sized, expandRatios, stripes,
+ verticalLines, horizontalLines, borderless, headers, compact,
+ small, rowIndex, rowCaption, rowIcon);
- table = getTreeTable(null);
- addComponent(table);
- }
+ ValueChangeListener update = new ValueChangeListener() {
+ @Override
+ public void valueChange(ValueChangeEvent event) {
+ if (table == null) {
+ table = new Table();
+ table.setContainerDataSource(normalContainer);
+ addComponent(table);
+ }
+ if (hierarchical.getValue() && table instanceof Table) {
+ removeComponent(table);
+ table = new TreeTable();
+ table.setContainerDataSource(hierarchicalContainer);
+ addComponent(table);
+ } else if (!hierarchical.getValue()
+ && table instanceof TreeTable) {
+ removeComponent(table);
+ table = new Table();
+ table.setContainerDataSource(normalContainer);
+ addComponent(table);
+ }
- TreeTable getTreeTable(String caption) {
- TreeTable table = new TreeTable(caption);
- configure(table, true);
- return table;
- }
+ configure(table, footer.getValue(), sized.getValue(),
+ expandRatios.getValue(), stripes.getValue(),
+ verticalLines.getValue(), horizontalLines.getValue(),
+ borderless.getValue(), headers.getValue(),
+ compact.getValue(), small.getValue(),
+ rowIndex.getValue(), rowCaption.getValue(),
+ rowIcon.getValue());
+ }
+ };
+
+ hierarchical.addValueChangeListener(update);
+ footer.addValueChangeListener(update);
+ sized.addValueChangeListener(update);
+ expandRatios.addValueChangeListener(update);
+ stripes.addValueChangeListener(update);
+ verticalLines.addValueChangeListener(update);
+ horizontalLines.addValueChangeListener(update);
+ borderless.addValueChangeListener(update);
+ headers.addValueChangeListener(update);
+ compact.addValueChangeListener(update);
+ small.addValueChangeListener(update);
+ rowIndex.addValueChangeListener(update);
+ rowCaption.addValueChangeListener(update);
+ rowIcon.addValueChangeListener(update);
+
+ footer.setValue(false);
- Table getTable(String caption) {
- Table table = new Table(caption);
- configure(table, false);
- return table;
}
- void configure(Table table, boolean hierarchical) {
+ static void configure(Table table, boolean footer, boolean sized,
+ boolean expandRatios, boolean stripes, boolean verticalLines,
+ boolean horizontalLines, boolean borderless, boolean headers,
+ boolean compact, boolean small, boolean rowIndex,
+ boolean rowCaption, boolean rowIcon) {
table.setSelectable(true);
table.setMultiSelect(true);
table.setSortEnabled(true);
@@ -139,14 +153,126 @@ public class Tables extends VerticalLayout implements View {
Notification.show(event.getTransferable().toString());
}
});
- Container tableData = hierarchical ? hierarchicalContainer
- : normalContainer;
- table.setContainerDataSource(tableData);
- table.select(tableData.getItemIds().iterator().next());
- // table.setSortContainerPropertyId(ValoThemeTest.CAPTION_PROPERTY);
- // table.setItemIconPropertyId(ValoThemeTest.ICON_PROPERTY);
table.setColumnAlignment(ValoThemeTest.DESCRIPTION_PROPERTY,
Align.RIGHT);
+ table.setColumnAlignment(ValoThemeTest.INDEX_PROPERTY, Align.CENTER);
+
+ table.removeContainerProperty("textfield");
+ table.addContainerProperty("textfield", TextField.class, null);
+
+ table.removeGeneratedColumn("textfield");
+ table.addGeneratedColumn("textfield", new ColumnGenerator() {
+ @Override
+ public Object generateCell(Table source, Object itemId,
+ Object columnId) {
+ TextField tf = new TextField();
+ tf.setInputPrompt("Type here…");
+ return tf;
+ }
+ });
+
+ table.removeContainerProperty("button");
+ table.addContainerProperty("button", Button.class, null);
+
+ table.removeGeneratedColumn("button");
+ table.addGeneratedColumn("button", new ColumnGenerator() {
+ @Override
+ public Object generateCell(Table source, Object itemId,
+ Object columnId) {
+ Button b = new Button("Button");
+ return b;
+ }
+ });
+
+ table.setFooterVisible(footer);
+ if (footer) {
+ table.setColumnFooter(ValoThemeTest.CAPTION_PROPERTY, "caption");
+ table.setColumnFooter(ValoThemeTest.DESCRIPTION_PROPERTY,
+ "description");
+ table.setColumnFooter(ValoThemeTest.ICON_PROPERTY, "icon");
+ table.setColumnFooter(ValoThemeTest.INDEX_PROPERTY, "index");
+ }
+
+ if (sized) {
+ table.setWidth("400px");
+ table.setHeight("300px");
+ } else {
+ table.setSizeUndefined();
+ }
+
+ if (expandRatios) {
+ if (!sized) {
+ table.setWidth("100%");
+ }
+ }
+ table.setColumnExpandRatio(ValoThemeTest.CAPTION_PROPERTY,
+ expandRatios ? 1.0f : 0);
+ table.setColumnExpandRatio(ValoThemeTest.DESCRIPTION_PROPERTY,
+ expandRatios ? 1.0f : 0);
+
+ if (!stripes) {
+ table.addStyleName("no-stripes");
+ } else {
+ table.removeStyleName("no-stripes");
+ }
+
+ if (!verticalLines) {
+ table.addStyleName("no-vertical-lines");
+ } else {
+ table.removeStyleName("no-vertical-lines");
+ }
+
+ if (!horizontalLines) {
+ table.addStyleName("no-horizontal-lines");
+ } else {
+ table.removeStyleName("no-horizontal-lines");
+ }
+
+ if (borderless) {
+ table.addStyleName("borderless");
+ } else {
+ table.removeStyleName("borderless");
+ }
+
+ if (!headers) {
+ table.addStyleName("no-header");
+ } else {
+ table.removeStyleName("no-header");
+ }
+
+ if (compact) {
+ table.addStyleName("compact");
+ } else {
+ table.removeStyleName("compact");
+ }
+
+ if (small) {
+ table.addStyleName("small");
+ } else {
+ table.removeStyleName("small");
+ }
+
+ if (!rowIndex && !rowCaption && rowIcon) {
+ table.setRowHeaderMode(RowHeaderMode.HIDDEN);
+ }
+
+ if (rowIndex) {
+ table.setRowHeaderMode(RowHeaderMode.INDEX);
+ }
+
+ if (rowCaption) {
+ table.setRowHeaderMode(RowHeaderMode.PROPERTY);
+ table.setItemCaptionPropertyId(ValoThemeTest.CAPTION_PROPERTY);
+ } else {
+ table.setItemCaptionPropertyId(null);
+ }
+
+ if (rowIcon) {
+ table.setRowHeaderMode(RowHeaderMode.ICON_ONLY);
+ table.setItemIconPropertyId(ValoThemeTest.ICON_PROPERTY);
+ } else {
+ table.setItemIconPropertyId(null);
+ }
}
@Override
diff --git a/uitest/src/com/vaadin/tests/themes/valo/Tabsheets.java b/uitest/src/com/vaadin/tests/themes/valo/Tabsheets.java
index 079a9c6b95..24a249d90e 100644
--- a/uitest/src/com/vaadin/tests/themes/valo/Tabsheets.java
+++ b/uitest/src/com/vaadin/tests/themes/valo/Tabsheets.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 Vaadin Ltd.
+ * Copyright 2000-2014 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
@@ -19,13 +19,20 @@ import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
+import com.vaadin.shared.ui.MarginInfo;
import com.vaadin.ui.CheckBox;
+import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.TabSheet;
+import com.vaadin.ui.TabSheet.SelectedTabChangeEvent;
+import com.vaadin.ui.TabSheet.SelectedTabChangeListener;
import com.vaadin.ui.TabSheet.Tab;
import com.vaadin.ui.VerticalLayout;
public class Tabsheets extends VerticalLayout implements View {
+
+ TabSheet tabs;
+
public Tabsheets() {
setMargin(true);
@@ -33,8 +40,9 @@ public class Tabsheets extends VerticalLayout implements View {
h1.addStyleName("h1");
addComponent(h1);
- final VerticalLayout wrap = new VerticalLayout();
+ HorizontalLayout wrap = new HorizontalLayout();
wrap.setSpacing(true);
+ wrap.addStyleName("wrapping");
addComponent(wrap);
final CheckBox closable = new CheckBox("Closable");
@@ -45,60 +53,142 @@ public class Tabsheets extends VerticalLayout implements View {
overflow.setImmediate(true);
wrap.addComponent(overflow);
+ final CheckBox caption = new CheckBox("Captions", true);
+ caption.setImmediate(true);
+ wrap.addComponent(caption);
+
final CheckBox icon = new CheckBox("Icons");
icon.setImmediate(true);
wrap.addComponent(icon);
+ final CheckBox disable = new CheckBox("Disable tabs");
+ disable.setImmediate(true);
+ wrap.addComponent(disable);
+
+ Label h3 = new Label("Additional Styles");
+ h3.addStyleName("h3");
+ addComponent(h3);
+
+ wrap = new HorizontalLayout();
+ wrap.setSpacing(true);
+ wrap.addStyleName("wrapping");
+ wrap.setMargin(new MarginInfo(false, false, true, false));
+ addComponent(wrap);
+
+ final CheckBox framed = new CheckBox("Framed", true);
+ framed.setImmediate(true);
+ wrap.addComponent(framed);
+
+ final CheckBox centered = new CheckBox("Centered tabs");
+ centered.setImmediate(true);
+ wrap.addComponent(centered);
+
+ final CheckBox rightAlign = new CheckBox("Right-aligned tabs");
+ rightAlign.setImmediate(true);
+ wrap.addComponent(rightAlign);
+
+ final CheckBox equal = new CheckBox("Equal-width tabs");
+ equal.setImmediate(true);
+ wrap.addComponent(equal);
+
+ final CheckBox padded = new CheckBox("Padded tabbar");
+ padded.setImmediate(true);
+ wrap.addComponent(padded);
+
+ final CheckBox compact = new CheckBox("Compact");
+ compact.setImmediate(true);
+ wrap.addComponent(compact);
+
+ final CheckBox iconsOnTop = new CheckBox("Icons on top");
+ iconsOnTop.setImmediate(true);
+ wrap.addComponent(iconsOnTop);
+
+ final CheckBox selectedOnly = new CheckBox("Selected tab closable");
+ selectedOnly.setImmediate(true);
+ wrap.addComponent(selectedOnly);
+
ValueChangeListener update = new ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
- wrap.removeAllComponents();
-
- wrap.addComponents(closable, overflow, icon);
-
- wrap.addComponent(getTabSheet("Normal", null,
- closable.getValue(), overflow.getValue(),
- icon.getValue()));
- wrap.addComponent(getTabSheet("Centered tabs", "centered-tabs",
+ String style = framed.getValue() ? "framed " : "";
+ style += centered.getValue() ? " centered-tabs" : "";
+ style += rightAlign.getValue() ? " right-aligned-tabs" : "";
+ style += equal.getValue() ? " equal-width-tabs" : "";
+ style += padded.getValue() ? " padded-tabbar" : "";
+ style += compact.getValue() ? " compact-tabbar" : "";
+ style += iconsOnTop.getValue() ? " icons-on-top" : "";
+ style += selectedOnly.getValue() ? " only-selected-closable"
+ : "";
+
+ if (tabs != null) {
+ removeComponent(tabs);
+ }
+ tabs = getTabSheet(caption.getValue(), style.trim(),
closable.getValue(), overflow.getValue(),
- icon.getValue()));
- wrap.addComponent(getTabSheet("Equal-width tabs",
- "equal-width-tabs", closable.getValue(),
- overflow.getValue(), icon.getValue()));
- wrap.addComponent(getTabSheet("Icons on top + padded tabbar",
- "icons-on-top padded-tabbar", closable.getValue(),
- overflow.getValue(), icon.getValue()));
- wrap.addComponent(getTabSheet("Only selected tab is closable",
- "selected-closable", closable.getValue(),
- overflow.getValue(), icon.getValue()));
+ icon.getValue(), disable.getValue());
+ addComponent(tabs);
}
};
closable.addValueChangeListener(update);
overflow.addValueChangeListener(update);
+ caption.addValueChangeListener(update);
icon.addValueChangeListener(update);
+ disable.addValueChangeListener(update);
+ framed.addValueChangeListener(update);
+ centered.addValueChangeListener(update);
+ rightAlign.addValueChangeListener(update);
+ equal.addValueChangeListener(update);
+ padded.addValueChangeListener(update);
+ compact.addValueChangeListener(update);
+ iconsOnTop.addValueChangeListener(update);
+ selectedOnly.addValueChangeListener(update);
// Generate initial view
icon.setValue(true);
}
- TabSheet getTabSheet(String caption, String style, boolean closable,
- boolean scrolling, boolean icon) {
+ static TabSheet getTabSheet(boolean caption, String style,
+ boolean closable, boolean scrolling, boolean icon, boolean disable) {
TabSheet ts = new TabSheet();
ts.addStyleName(style);
- ts.setCaption(caption);
- for (int i = 0; i < (scrolling ? 10 : 3); i++) {
- String tabcaption = ValoThemeTest.nextString(true);
- if (i == 0 && icon) {
- tabcaption = null;
+ for (int i = 1; i <= (scrolling ? 10 : 3); i++) {
+ String tabcaption = caption ? ValoThemeTest.nextString(true) + " "
+ + ValoThemeTest.nextString(false) : null;
+
+ VerticalLayout content = new VerticalLayout();
+ content.setMargin(true);
+ content.setSpacing(true);
+ content.addComponent(new Label("Content for tab " + i));
+ if (i == 2) {
+ content.addComponent(new Label(
+ "Excepteur sint obcaecat cupiditat non proident culpa. Magna pars studiorum, prodita quaerimus."));
}
- Tab t = ts.addTab(new Label(" "), tabcaption);
+ Tab t = ts.addTab(content, tabcaption);
t.setClosable(closable);
+ t.setEnabled(!disable);
+
+ // First tab is always enabled
+ if (i == 1) {
+ t.setEnabled(true);
+ }
if (icon) {
- t.setIcon(TestIcon.get(i == 2));
+ t.setIcon(TestIcon.get(false));
}
}
+
+ ts.addSelectedTabChangeListener(new SelectedTabChangeListener() {
+ @Override
+ public void selectedTabChange(SelectedTabChangeEvent event) {
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ });
+
return ts;
}
diff --git a/uitest/src/com/vaadin/tests/themes/valo/TextFields.java b/uitest/src/com/vaadin/tests/themes/valo/TextFields.java
index 1201071f84..cbe7a8a0b3 100644
--- a/uitest/src/com/vaadin/tests/themes/valo/TextFields.java
+++ b/uitest/src/com/vaadin/tests/themes/valo/TextFields.java
@@ -17,10 +17,13 @@ package com.vaadin.tests.themes.valo;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
+import com.vaadin.server.FontAwesome;
+import com.vaadin.server.UserError;
import com.vaadin.ui.Button;
import com.vaadin.ui.CssLayout;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
+import com.vaadin.ui.PasswordField;
import com.vaadin.ui.RichTextArea;
import com.vaadin.ui.TextArea;
import com.vaadin.ui.TextField;
@@ -59,6 +62,17 @@ public class TextFields extends VerticalLayout implements View {
tf.addStyleName("color3");
row.addComponent(tf);
+ tf = new TextField("Error");
+ tf.setValue("Something’s wrong");
+ tf.setComponentError(new UserError("Fix it, now!"));
+ row.addComponent(tf);
+
+ tf = new TextField("Error, borderless");
+ tf.setValue("Something’s wrong");
+ tf.setComponentError(new UserError("Fix it, now!"));
+ tf.addStyleName("borderless");
+ row.addComponent(tf);
+
tf = new TextField("Read-only");
tf.setInputPrompt("Nationality");
tf.setValue("Finnish");
@@ -82,6 +96,20 @@ public class TextFields extends VerticalLayout implements View {
tf.setIcon(TestIcon.get());
row.addComponent(tf);
+ tf = new TextField("Large, Icon inside");
+ tf.setInputPrompt("Ooh, an icon");
+ tf.addStyleName("large");
+ tf.addStyleName("inline-icon");
+ tf.setIcon(TestIcon.get());
+ row.addComponent(tf);
+
+ tf = new TextField("Small, Icon inside");
+ tf.setInputPrompt("Ooh, an icon");
+ tf.addStyleName("small");
+ tf.addStyleName("inline-icon");
+ tf.setIcon(TestIcon.get());
+ row.addComponent(tf);
+
tf = new TextField("16px supported by default");
tf.setInputPrompt("Image icon");
tf.addStyleName("inline-icon");
@@ -122,6 +150,36 @@ public class TextFields extends VerticalLayout implements View {
tf.setIcon(TestIcon.get());
row.addComponent(tf);
+ tf = new TextField("Right-aligned");
+ tf.setValue("1,234");
+ tf.addStyleName("align-right");
+ row.addComponent(tf);
+
+ tf = new TextField("Centered");
+ tf.setInputPrompt("Guess what?");
+ tf.addStyleName("align-center");
+ row.addComponent(tf);
+
+ PasswordField pwf = new PasswordField("Password");
+ pwf.setInputPrompt("Secret words");
+ pwf.addStyleName("inline-icon");
+ pwf.setIcon(FontAwesome.LOCK);
+ row.addComponent(pwf);
+
+ pwf = new PasswordField("Password, right-aligned");
+ pwf.setInputPrompt("Secret words");
+ pwf.addStyleName("inline-icon");
+ pwf.addStyleName("align-right");
+ pwf.setIcon(FontAwesome.LOCK);
+ row.addComponent(pwf);
+
+ pwf = new PasswordField("Password, centered");
+ pwf.setInputPrompt("Secret words");
+ pwf.addStyleName("inline-icon");
+ pwf.addStyleName("align-center");
+ pwf.setIcon(FontAwesome.LOCK);
+ row.addComponent(pwf);
+
h1 = new Label("Text Areas");
h1.addStyleName("h1");
addComponent(h1);
@@ -172,9 +230,24 @@ public class TextFields extends VerticalLayout implements View {
ta.setInputPrompt("Write your comment…");
row.addComponent(ta);
+ ta = new TextArea("Right-aligned");
+ ta.addStyleName("align-right");
+ ta.setValue("Field value, spanning multiple lines of text");
+ row.addComponent(ta);
+
+ ta = new TextArea("Centered");
+ ta.addStyleName("align-center");
+ ta.setValue("Field value, spanning multiple lines of text");
+ row.addComponent(ta);
+
RichTextArea rta = new RichTextArea();
rta.setValue("<b>Some</b> <i>rich</i> content");
row.addComponent(rta);
+
+ rta = new RichTextArea("Read-only");
+ rta.setValue("<b>Some</b> <i>rich</i> content");
+ rta.setReadOnly(true);
+ row.addComponent(rta);
}
@Override
diff --git a/uitest/src/com/vaadin/tests/themes/valo/ValoMenuLayout.java b/uitest/src/com/vaadin/tests/themes/valo/ValoMenuLayout.java
new file mode 100644
index 0000000000..3a3baa686c
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/themes/valo/ValoMenuLayout.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.themes.valo;
+
+import com.vaadin.ui.Component;
+import com.vaadin.ui.ComponentContainer;
+import com.vaadin.ui.CssLayout;
+import com.vaadin.ui.HorizontalLayout;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class ValoMenuLayout extends HorizontalLayout {
+
+ CssLayout contentArea = new CssLayout();
+
+ CssLayout menuArea = new CssLayout();
+
+ public ValoMenuLayout() {
+ setSizeFull();
+
+ menuArea.setPrimaryStyleName("valo-menu");
+
+ contentArea.setPrimaryStyleName("valo-content");
+ contentArea.addStyleName("v-scrollable");
+ contentArea.setSizeFull();
+
+ addComponents(menuArea, contentArea);
+ setExpandRatio(contentArea, 1);
+ }
+
+ public ComponentContainer getContentContainer() {
+ return contentArea;
+ }
+
+ public void addMenu(Component menu) {
+ menu.addStyleName("valo-menu-part");
+ menuArea.addComponent(menu);
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/themes/valo/ValoMiscTests.java b/uitest/src/com/vaadin/tests/themes/valo/ValoMiscTests.java
new file mode 100644
index 0000000000..222dd90e49
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/themes/valo/ValoMiscTests.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.themes.valo;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.ui.Alignment;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.CheckBox;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.InlineDateField;
+import com.vaadin.ui.Panel;
+import com.vaadin.ui.TreeTable;
+import com.vaadin.ui.UI;
+import com.vaadin.ui.VerticalLayout;
+
+public class ValoMiscTests extends UI {
+
+ VerticalLayout layout = new VerticalLayout();
+
+ public ValoMiscTests() {
+ layout.setMargin(true);
+
+ Panel p = new Panel();
+ // layout.addComponent(p);
+
+ HorizontalLayout row = new HorizontalLayout();
+ p.setHeight("300px");
+ // row.setSpacing(true);
+ // row.setMargin(true);
+ row.setDefaultComponentAlignment(Alignment.BOTTOM_CENTER);
+ row.setWidth("100%");
+ // row.setHeight("248px");
+ row.setSizeFull();
+
+ Button button = new Button("Boo");
+ button.setWidth("100%");
+ Button button2 = new Button("Abc");
+ button2.setWidth("100%");
+ row.addComponents(button, new InlineDateField(), new CheckBox("Far"));
+
+ p.setContent(row);
+
+ p = new Panel();
+ // layout.addComponent(p);
+ p.setHeight("400px");
+
+ VerticalLayout col = new VerticalLayout();
+ col.setSizeFull();
+ col.setSpacing(true);
+ // row.setMargin(true);
+ col.setDefaultComponentAlignment(Alignment.BOTTOM_CENTER);
+
+ col.addComponents(new Button("Boo"), new InlineDateField(),
+ new CheckBox("Far"), new Button("Abc"));
+
+ p.setContent(col);
+
+ TreeTable table = new TreeTable();
+ table.setWidth("100%");
+ table.setContainerDataSource(Tables.hierarchicalContainer);
+ Tables.configure(table, true, false, false, true, true, true, false,
+ true, false, false, false, false, false);
+ layout.addComponent(table);
+
+ }
+
+ @Override
+ protected void init(VaadinRequest request) {
+ setContent(layout);
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/themes/valo/ValoThemeTest.java b/uitest/src/com/vaadin/tests/themes/valo/ValoThemeTest.java
index 0336be05a2..014b1acac8 100644
--- a/uitest/src/com/vaadin/tests/themes/valo/ValoThemeTest.java
+++ b/uitest/src/com/vaadin/tests/themes/valo/ValoThemeTest.java
@@ -1,9 +1,25 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
package com.vaadin.tests.themes.valo;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
+import com.vaadin.annotations.PreserveOnRefresh;
import com.vaadin.annotations.Theme;
import com.vaadin.annotations.Title;
import com.vaadin.data.Container;
@@ -28,6 +44,7 @@ import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.Component;
+import com.vaadin.ui.ComponentContainer;
import com.vaadin.ui.CssLayout;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
@@ -38,17 +55,18 @@ import com.vaadin.ui.UI;
@Theme("tests-valo")
@Title("Valo Theme Test")
+@PreserveOnRefresh
public class ValoThemeTest extends UI {
- HorizontalLayout root = new HorizontalLayout();
- CssLayout viewDisplay = new CssLayout();
+ ValoMenuLayout root = new ValoMenuLayout();
+ ComponentContainer viewDisplay = root.getContentContainer();
CssLayout menu = new CssLayout();
private Navigator navigator;
private LinkedHashMap<String, String> menuItems = new LinkedHashMap<String, String>();
@Override
protected void init(VaadinRequest request) {
- // Show .v-app-loading badge
+ // Show .v-app-loading valo-menu-badge
// try {
// Thread.sleep(2000);
// } catch (InterruptedException e) {
@@ -59,12 +77,8 @@ public class ValoThemeTest extends UI {
setContent(root);
root.setWidth("100%");
- root.addComponent(buildMenu());
-
- viewDisplay.setWidth("100%");
- viewDisplay.addStyleName("view");
- root.addComponent(viewDisplay);
- root.setExpandRatio(viewDisplay, 1);
+ root.addMenu(buildTestMenu());
+ root.addMenu(buildMenu());
navigator = new Navigator(this, viewDisplay);
@@ -88,6 +102,7 @@ public class ValoThemeTest extends UI {
navigator.addView("calendar", CalendarTest.class);
navigator.addView("forms", Forms.class);
navigator.addView("popupviews", PopupViews.class);
+ navigator.addView("dragging", Dragging.class);
String f = Page.getCurrent().getUriFragment();
if (f == null || f.equals("")) {
@@ -111,7 +126,9 @@ public class ValoThemeTest extends UI {
for (Iterator<Component> it = menu.iterator(); it
.hasNext();) {
Component c = it.next();
- if (item.getValue().equals(c.getCaption())) {
+ if (c.getCaption() != null
+ && c.getCaption().startsWith(
+ item.getValue())) {
c.addStyleName("selected");
break;
}
@@ -124,6 +141,37 @@ public class ValoThemeTest extends UI {
}
+ Component buildTestMenu() {
+ CssLayout menu = new CssLayout();
+ menu.addStyleName("large-icons");
+
+ Label logo = new Label("Va");
+ logo.setSizeUndefined();
+ logo.setPrimaryStyleName("valo-menu-logo");
+ menu.addComponent(logo);
+
+ Button b = new Button(
+ "Reference <span class=\"valo-menu-badge\">3</span>");
+ b.setIcon(FontAwesome.TH_LIST);
+ b.setPrimaryStyleName("valo-menu-item");
+ b.addStyleName("selected");
+ b.setHtmlContentAllowed(true);
+ menu.addComponent(b);
+
+ b = new Button("API");
+ b.setIcon(FontAwesome.BOOK);
+ b.setPrimaryStyleName("valo-menu-item");
+ menu.addComponent(b);
+
+ b = new Button("Examples <span class=\"valo-menu-badge\">12</span>");
+ b.setIcon(FontAwesome.TABLE);
+ b.setPrimaryStyleName("valo-menu-item");
+ b.setHtmlContentAllowed(true);
+ menu.addComponent(b);
+
+ return menu;
+ }
+
CssLayout buildMenu() {
// Add items
menuItems.put("common", "Common UI Elements");
@@ -139,6 +187,7 @@ public class ValoThemeTest extends UI {
menuItems.put("menubars", "Menu Bars");
menuItems.put("trees", "Trees");
menuItems.put("tables", "Tables");
+ menuItems.put("dragging", "Drag and Drop");
menuItems.put("panels", "Panels");
menuItems.put("splitpanels", "Split Panels");
menuItems.put("tabs", "Tabs");
@@ -147,8 +196,6 @@ public class ValoThemeTest extends UI {
menuItems.put("calendar", "Calendar");
menuItems.put("forms", "Forms");
- menu.setStyleName("valo-menu");
-
HorizontalLayout top = new HorizontalLayout();
top.setWidth("100%");
top.setDefaultComponentAlignment(Alignment.MIDDLE_LEFT);
@@ -191,8 +238,9 @@ public class ValoThemeTest extends UI {
menu.addComponent(label);
}
if (item.getKey().equals("panels")) {
- label.setValue(label.getValue() + " <span class=\"badge\">"
- + count + "</span>");
+ label.setValue(label.getValue()
+ + " <span class=\"valo-menu-badge\">" + count
+ + "</span>");
count = 0;
label = new Label("Containers", ContentMode.HTML);
label.setPrimaryStyleName("valo-menu-subtitle");
@@ -201,8 +249,9 @@ public class ValoThemeTest extends UI {
menu.addComponent(label);
}
if (item.getKey().equals("calendar")) {
- label.setValue(label.getValue() + " <span class=\"badge\">"
- + count + "</span>");
+ label.setValue(label.getValue()
+ + " <span class=\"valo-menu-badge\">" + count
+ + "</span>");
count = 0;
label = new Label("Other", ContentMode.HTML);
label.setPrimaryStyleName("valo-menu-subtitle");
@@ -216,18 +265,25 @@ public class ValoThemeTest extends UI {
navigator.navigateTo(item.getKey());
}
});
+ if (count == 2) {
+ b.setCaption(b.getCaption()
+ + " <span class=\"valo-menu-badge\">123</span>");
+ }
+ b.setHtmlContentAllowed(true);
b.setPrimaryStyleName("valo-menu-item");
+ b.setIcon(TestIcon.get());
menu.addComponent(b);
count++;
}
- label.setValue(label.getValue() + " <span class=\"badge\">" + count
- + "</span>");
+ label.setValue(label.getValue() + " <span class=\"valo-menu-badge\">"
+ + count + "</span>");
return menu;
}
static String[] strings = new String[] { "lorem", "ipsum", "dolor", "sit",
- "amet", "consectetur" };
+ "amet", "consectetur", "quid", "securi", "etiam", "tamquam", "eu",
+ "fugiat", "nulla", "pariatur" };
static int stringCount = -1;
static String nextString(boolean capitalize) {
diff --git a/uitest/src/com/vaadin/tests/tooltip/AdjacentElementsWithTooltips.java b/uitest/src/com/vaadin/tests/tooltip/AdjacentElementsWithTooltips.java
new file mode 100644
index 0000000000..60167e43b4
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tooltip/AdjacentElementsWithTooltips.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.tooltip;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Component;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.TooltipConfiguration;
+
+/**
+ * When moving between adjacent elements, the tooltip replace should obey
+ * quickOpenDelay
+ *
+ * @author Vaadin Ltd
+ */
+public class AdjacentElementsWithTooltips extends AbstractTestUI {
+
+ private int buttonCount = 0;
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#setup(com.vaadin.server.
+ * VaadinRequest)
+ */
+ @Override
+ protected void setup(VaadinRequest request) {
+ TooltipConfiguration ttc = super.getTooltipConfiguration();
+ ttc.setMaxWidth(350);
+ ttc.setOpenDelay(200);
+ ttc.setCloseTimeout(200);
+ ttc.setQuickOpenDelay(1000);
+ ttc.setQuickOpenTimeout(1000);
+ HorizontalLayout layout = new HorizontalLayout();
+ layout.addComponent(makeButton("first"));
+ layout.addComponent(makeButton("second"));
+ addComponent(layout);
+
+ }
+
+ private Component makeButton(String tooltip) {
+ Button button = new Button("Button " + buttonCount++);
+ button.setDescription(tooltip);
+ return button;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTestDescription()
+ */
+ @Override
+ protected String getTestDescription() {
+ return "Moving between adjacent elements with tooltips should open quickOpenDelay";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTicketNumber()
+ */
+ @Override
+ protected Integer getTicketNumber() {
+ return 13998;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/tooltip/AdjacentElementsWithTooltipsTest.java b/uitest/src/com/vaadin/tests/tooltip/AdjacentElementsWithTooltipsTest.java
new file mode 100644
index 0000000000..b9fc788008
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tooltip/AdjacentElementsWithTooltipsTest.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.tooltip;
+
+import static org.hamcrest.Matchers.greaterThan;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.lessThan;
+import static org.junit.Assert.assertThat;
+
+import java.util.List;
+
+import org.junit.Test;
+import org.openqa.selenium.interactions.HasInputDevices;
+import org.openqa.selenium.interactions.Mouse;
+import org.openqa.selenium.interactions.internal.Coordinates;
+import org.openqa.selenium.internal.Locatable;
+import org.openqa.selenium.remote.DesiredCapabilities;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+/**
+ * Test to see if tooltips obey quickOpenDelay when moving between directly
+ * adjacent elements.
+ *
+ * @author Vaadin Ltd
+ */
+public class AdjacentElementsWithTooltipsTest extends MultiBrowserTest {
+
+ @Override
+ public List<DesiredCapabilities> getBrowsersToTest() {
+ return getBrowsersExcludingIE();
+ }
+
+ @Test
+ public void tooltipsHaveQuickOpenDelay() throws InterruptedException {
+ openTestURL();
+ Coordinates button0Coordinates = getButtonCoordinates("Button 0");
+ Coordinates button1Coordinates = getButtonCoordinates("Button 1");
+
+ Mouse mouse = getMouse();
+ mouse.mouseMove(button0Coordinates, 10, 10);
+ sleep(1000);
+ assertThat(getTooltipElement().getLocation().x, is(greaterThan(0)));
+
+ mouse.mouseMove(button1Coordinates, 10, 10);
+ assertThat(getTooltipElement().getLocation().x, is(lessThan(-1000)));
+
+ sleep(1000);
+ assertThat(getTooltipElement().getLocation().x,
+ is(greaterThan(button1Coordinates.onPage().x)));
+ }
+
+ private Coordinates getButtonCoordinates(String caption) {
+ return getCoordinates(getButton(caption));
+ }
+
+ private ButtonElement getButton(String caption) {
+ return $(ButtonElement.class)
+ .caption(caption).first();
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/components/button/ButtonTooltips.java b/uitest/src/com/vaadin/tests/tooltip/ButtonTooltips.java
index fa639918aa..d212a13058 100644
--- a/uitest/src/com/vaadin/tests/components/button/ButtonTooltips.java
+++ b/uitest/src/com/vaadin/tests/tooltip/ButtonTooltips.java
@@ -1,4 +1,4 @@
-package com.vaadin.tests.components.button;
+package com.vaadin.tests.tooltip;
import com.vaadin.tests.components.TestBase;
import com.vaadin.ui.Alignment;
@@ -24,14 +24,8 @@ public class ButtonTooltips extends TestBase {
button.setDescription("long descidescidescpription");
Button button2 = new Button("Two");
button2.setDescription("Another");
- Button button3 = new Button("One");
- button3.setDescription("long descidescidescpription");
- Button button4 = new Button("Two");
- button4.setDescription("Another");
vl.addComponent(button);
vl.addComponent(button2);
- vl.addComponent(button3);
- vl.addComponent(button4);
vl.setComponentAlignment(button, Alignment.TOP_RIGHT);
vl.setComponentAlignment(button2, Alignment.TOP_RIGHT);
addComponent(vl);
diff --git a/uitest/src/com/vaadin/tests/tooltip/ButtonTooltipsTest.java b/uitest/src/com/vaadin/tests/tooltip/ButtonTooltipsTest.java
new file mode 100644
index 0000000000..d64dd900a7
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tooltip/ButtonTooltipsTest.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.tooltip;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+import org.junit.Test;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.tests.tb3.TooltipTest;
+
+/**
+ * Tests that tooltip sizes do not change when moving between adjacent elements
+ *
+ * @author Vaadin Ltd
+ */
+public class ButtonTooltipsTest extends TooltipTest {
+
+ @Test
+ public void tooltipSizeWhenMovingBetweenElements() throws Exception {
+ openTestURL();
+
+ WebElement buttonOne = $(ButtonElement.class).caption("One").first();
+ WebElement buttonTwo = $(ButtonElement.class).caption("Two").first();
+
+ checkTooltip(buttonOne, "long descidescidescpription");
+ int originalWidth = getTooltipElement().getSize().getWidth();
+ int originalHeight = getTooltipElement().getSize().getHeight();
+
+ clearTooltip();
+ checkTooltip(buttonTwo, "Another");
+ moveMouseTo(buttonOne, 5, 5);
+ sleep(100);
+ assertThat(getTooltipElement().getSize().getWidth(), is(originalWidth));
+ assertThat(getTooltipElement().getSize().getHeight(),
+ is(originalHeight));
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/components/draganddropwrapper/DragAndDropWrapperTooltips.java b/uitest/src/com/vaadin/tests/tooltip/DragAndDropWrapperTooltips.java
index f0010acce8..606a773141 100644
--- a/uitest/src/com/vaadin/tests/components/draganddropwrapper/DragAndDropWrapperTooltips.java
+++ b/uitest/src/com/vaadin/tests/tooltip/DragAndDropWrapperTooltips.java
@@ -1,4 +1,4 @@
-package com.vaadin.tests.components.draganddropwrapper;
+package com.vaadin.tests.tooltip;
import java.util.Iterator;
@@ -10,7 +10,8 @@ import com.vaadin.event.dd.DropTarget;
import com.vaadin.event.dd.TargetDetails;
import com.vaadin.event.dd.acceptcriteria.AcceptAll;
import com.vaadin.event.dd.acceptcriteria.AcceptCriterion;
-import com.vaadin.tests.components.TestBase;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
import com.vaadin.tests.util.TestUtils;
import com.vaadin.ui.Component;
import com.vaadin.ui.CssLayout;
@@ -18,7 +19,7 @@ import com.vaadin.ui.DragAndDropWrapper;
import com.vaadin.ui.Label;
import com.vaadin.ui.VerticalLayout;
-public class DragAndDropWrapperTooltips extends TestBase {
+public class DragAndDropWrapperTooltips extends AbstractTestUI {
private final String BASE = ".v-widget.greenblock {vertical-align: middle; float:left; width:60px;height:60px;background: green !important; padding:0; margin:2px;-webkit-transition: width 0.3s ease-in-out;color: white;}";
private final String B2 = ".v-widget.b2 {background-color: red !important;}";
@@ -28,9 +29,8 @@ public class DragAndDropWrapperTooltips extends TestBase {
private DragAndDropWrapper dragAndDropWrapper;
@Override
- protected void setup() {
- TestUtils.injectCSS(getMainWindow(), BASE + B4 + B2 + B3
- + HIDEDRAGSOURCE);
+ protected void setup(VaadinRequest request) {
+ TestUtils.injectCSS(this, BASE + B4 + B2 + B3 + HIDEDRAGSOURCE);
VerticalLayout l = new VerticalLayout();
l.setWidth("400px");
@@ -49,7 +49,7 @@ public class DragAndDropWrapperTooltips extends TestBase {
wl.addStyleName("b" + i);
cssLayout.addComponent(wl);
}
-
+ getTooltipConfiguration().setOpenDelay(300);
}
int count;
@@ -123,7 +123,7 @@ public class DragAndDropWrapperTooltips extends TestBase {
};
@Override
- protected String getDescription() {
+ protected String getTestDescription() {
return "A tooltip should be shown when hovering the DragAndDropWrapper containing all the draggable layouts";
}
diff --git a/uitest/src/com/vaadin/tests/tooltip/DragAndDropWrapperTooltipsTest.java b/uitest/src/com/vaadin/tests/tooltip/DragAndDropWrapperTooltipsTest.java
new file mode 100644
index 0000000000..d913c8cc12
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tooltip/DragAndDropWrapperTooltipsTest.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.tooltip;
+
+import org.junit.Test;
+import org.openqa.selenium.interactions.Actions;
+
+import com.vaadin.testbench.elements.LabelElement;
+import com.vaadin.tests.tb3.TooltipTest;
+
+/**
+ *
+ *
+ * @author Vaadin Ltd
+ */
+public class DragAndDropWrapperTooltipsTest extends TooltipTest {
+ @Test
+ public void testDragAndDropTooltips() throws Exception {
+ openTestURL();
+ LabelElement element = $(LabelElement.class).get(4);
+ LabelElement targetElement = $(LabelElement.class).get(1);
+ checkTooltip(element,
+ "Tooltip for the wrapper wrapping all the draggable layouts");
+ new Actions(getDriver()).clickAndHold(element)
+ .moveToElement(targetElement).perform();
+ sleep(500);
+ checkTooltipNotPresent();
+ new Actions(getDriver()).release().perform();
+ checkTooltip(element, "Drag was performed and tooltip was changed");
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/components/LongTooltip.java b/uitest/src/com/vaadin/tests/tooltip/LongTooltip.java
index acb498bcee..0eee9d4976 100644
--- a/uitest/src/com/vaadin/tests/components/LongTooltip.java
+++ b/uitest/src/com/vaadin/tests/tooltip/LongTooltip.java
@@ -1,11 +1,13 @@
-package com.vaadin.tests.components;
+package com.vaadin.tests.tooltip;
+import com.vaadin.tests.components.TestBase;
import com.vaadin.tests.util.LoremIpsum;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.GridLayout;
import com.vaadin.ui.TextField;
public class LongTooltip extends TestBase {
+ private int tooltipCount = 0;
@Override
public void setup() {
@@ -33,7 +35,8 @@ public class LongTooltip extends TestBase {
private TextField createField() {
final TextField field = new TextField();
- field.setDescription(LoremIpsum.get(1000));
+ field.setDescription("Tooltip " + Integer.toString(tooltipCount++)
+ + ": " + LoremIpsum.get(1000));
return field;
}
diff --git a/uitest/src/com/vaadin/tests/tooltip/LongTooltipTest.java b/uitest/src/com/vaadin/tests/tooltip/LongTooltipTest.java
new file mode 100644
index 0000000000..191ce6ffec
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tooltip/LongTooltipTest.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.tooltip;
+
+import java.util.List;
+
+import org.junit.Test;
+
+import com.vaadin.testbench.elements.TextFieldElement;
+import com.vaadin.tests.tb3.TooltipTest;
+import com.vaadin.tests.util.LoremIpsum;
+
+/**
+ * Test to see if long tooltips behave appropriately
+ *
+ * @author Vaadin Ltd
+ */
+public class LongTooltipTest extends TooltipTest {
+
+ @Test
+ public void tooltipsDontOverflow() throws Exception {
+ openTestURL();
+ List<TextFieldElement> elements = $(TextFieldElement.class).all();
+ checkTooltipNotPresent();
+ int i = 0;
+ for (TextFieldElement element : elements) {
+ checkTooltip(element, "Tooltip " + Integer.toString(i++) + ": "
+ + LoremIpsum.get(1000));
+ clearTooltip();
+ checkTooltipNotPresent();
+ }
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/tooltip/SliderTooltip.java b/uitest/src/com/vaadin/tests/tooltip/SliderTooltip.java
new file mode 100644
index 0000000000..8cf7232fab
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tooltip/SliderTooltip.java
@@ -0,0 +1,42 @@
+package com.vaadin.tests.tooltip;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Slider;
+
+public class SliderTooltip extends AbstractTestUI {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#setup(com.vaadin.server.
+ * VaadinRequest)
+ */
+ @Override
+ protected void setup(VaadinRequest request) {
+ Slider slider = new Slider();
+ slider.setDescription("Tooltip");
+ addComponent(slider);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTestDescription()
+ */
+ @Override
+ protected String getTestDescription() {
+ return "Testing that sliders have tooltips.";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.vaadin.tests.components.AbstractTestUI#getTicketNumber()
+ */
+ @Override
+ protected Integer getTicketNumber() {
+ return 14019;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/tooltip/SliderTooltipTest.java b/uitest/src/com/vaadin/tests/tooltip/SliderTooltipTest.java
new file mode 100644
index 0000000000..743b7c2ab5
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tooltip/SliderTooltipTest.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.tooltip;
+
+import org.junit.Test;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.testbench.elements.SliderElement;
+import com.vaadin.tests.tb3.TooltipTest;
+
+/**
+ * Test that sliders can have tooltips
+ *
+ * @author Vaadin Ltd
+ */
+public class SliderTooltipTest extends TooltipTest {
+
+ @Test
+ public void sliderHasTooltip() throws Exception {
+ openTestURL();
+ WebElement slider = $(SliderElement.class).first();
+ checkTooltipNotPresent();
+ checkTooltip(slider, "Tooltip");
+ clearTooltip();
+ checkTooltipNotPresent();
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/tooltip/StationaryTooltip.java b/uitest/src/com/vaadin/tests/tooltip/StationaryTooltip.java
new file mode 100644
index 0000000000..5c7b52d96f
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tooltip/StationaryTooltip.java
@@ -0,0 +1,31 @@
+package com.vaadin.tests.tooltip;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.VerticalLayout;
+
+public class StationaryTooltip extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ VerticalLayout vl = new VerticalLayout();
+ Button button = new Button("Button");
+ button.setDescription("description");
+
+ button.setWidth("200px");
+ vl.addComponent(button);
+
+ addComponent(vl);
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return null;
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return null;
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/tooltip/StationaryTooltipTest.java b/uitest/src/com/vaadin/tests/tooltip/StationaryTooltipTest.java
new file mode 100644
index 0000000000..6b751e7a6b
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tooltip/StationaryTooltipTest.java
@@ -0,0 +1,77 @@
+package com.vaadin.tests.tooltip;
+
+import static org.hamcrest.Matchers.greaterThan;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+import java.util.List;
+
+import org.junit.Test;
+import org.openqa.selenium.Dimension;
+import org.openqa.selenium.interactions.Mouse;
+import org.openqa.selenium.interactions.internal.Coordinates;
+import org.openqa.selenium.remote.DesiredCapabilities;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class StationaryTooltipTest extends MultiBrowserTest {
+
+ @Override
+ public List<DesiredCapabilities> getBrowsersToTest() {
+ // With IEDriver, the cursor seems to jump to default position after the
+ // mouse move,
+ // so we are not able to test the tooltip behaviour properly.
+ return getBrowsersExcludingIE();
+ }
+
+ @Test
+ public void tooltipShouldBeStationary() throws InterruptedException {
+ openTestURL();
+
+ Mouse mouse = getMouse();
+
+ moveMouseToButtonUpperLeftCorner(mouse);
+ sleep(3000); // wait for the tooltip to become visible
+ int originalTooltipLocationX = getTooltipLocationX();
+
+ moveMouseToButtonBottomRightCorner(mouse);
+ int actualTooltipLocationX = getTooltipLocationX();
+
+ assertThat(actualTooltipLocationX, is(greaterThan(0)));
+ assertThat(actualTooltipLocationX, is(originalTooltipLocationX));
+ }
+
+ private Coordinates getButtonCoordinates() {
+ return getCoordinates(getButtonElement());
+ }
+
+ private ButtonElement getButtonElement() {
+ return $(ButtonElement.class).first();
+ }
+
+ private void moveMouseToButtonBottomRightCorner(Mouse mouse) {
+ Coordinates buttonCoordinates = getButtonCoordinates();
+ Dimension buttonDimensions = getButtonDimensions();
+
+ mouse.mouseMove(buttonCoordinates, buttonDimensions.getWidth() - 1,
+ buttonDimensions.getHeight() - 1);
+ }
+
+ private void moveMouseToButtonUpperLeftCorner(Mouse mouse) {
+ Coordinates buttonCoordinates = getButtonCoordinates();
+
+ mouse.mouseMove(buttonCoordinates, 0, 0);
+ }
+
+ private org.openqa.selenium.Dimension getButtonDimensions() {
+ ButtonElement buttonElement = getButtonElement();
+
+ return buttonElement.getWrappedElement().getSize();
+ }
+
+ private int getTooltipLocationX() {
+ return getTooltipElement().getLocation().getX();
+ }
+
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/tooltip/TooltipAndJavascript.java b/uitest/src/com/vaadin/tests/tooltip/TooltipAndJavascript.java
new file mode 100644
index 0000000000..2ada6e819a
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tooltip/TooltipAndJavascript.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.tooltip;
+
+import com.vaadin.annotations.JavaScript;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+
+public class TooltipAndJavascript extends AbstractTestUI {
+
+ @JavaScript("tooltipandjavascript.js")
+ public static class MyButton extends Button {
+
+ }
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ MyButton b = new MyButton();
+ b.setCaption("Hover for tooltip");
+ b.setDescription("Tooltip for the button");
+ addComponent(b);
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Hover the button for a tooltip. It should be styled correctly";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 14028;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/tooltip/TooltipAndJavascriptTest.java b/uitest/src/com/vaadin/tests/tooltip/TooltipAndJavascriptTest.java
new file mode 100644
index 0000000000..cc9309ac2c
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tooltip/TooltipAndJavascriptTest.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.tooltip;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.JavascriptExecutor;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class TooltipAndJavascriptTest extends MultiBrowserTest {
+
+ @Test
+ public void ensureTooltipInOverlay() throws InterruptedException {
+ openTestURL();
+ $(ButtonElement.class).first().showTooltip();
+ WebElement tooltip = findElement(By
+ .cssSelector(".v-overlay-container .v-tooltip"));
+ WebElement overlayContainer = getParent(tooltip);
+ Assert.assertTrue("v-overlay-container did not receive theme",
+ hasClass(overlayContainer, "reindeer"));
+ }
+
+ private boolean hasClass(WebElement element, String classname) {
+ String[] classes = element.getAttribute("class").split(" ");
+ for (String classString : classes) {
+ if (classname.equals(classString)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private WebElement getParent(WebElement element) {
+ return (WebElement) ((JavascriptExecutor) getDriver()).executeScript(
+ "return arguments[0].parentNode;", element);
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/components/ui/TooltipConfiguration.java b/uitest/src/com/vaadin/tests/tooltip/TooltipConfiguration.java
index 4d201d2a1a..f67db4219f 100644
--- a/uitest/src/com/vaadin/tests/components/ui/TooltipConfiguration.java
+++ b/uitest/src/com/vaadin/tests/tooltip/TooltipConfiguration.java
@@ -1,4 +1,4 @@
-package com.vaadin.tests.components.ui;
+package com.vaadin.tests.tooltip;
import com.vaadin.data.Property;
import com.vaadin.data.Property.ValueChangeEvent;
@@ -32,8 +32,10 @@ public class TooltipConfiguration extends AbstractTestUIWithLog {
closeTimeout.addValueChangeListener(new Property.ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
- getTooltipConfiguration().setCloseTimeout(
- (Integer) closeTimeout.getConvertedValue());
+ if (closeTimeout.getConvertedValue() != null) {
+ getTooltipConfiguration().setCloseTimeout(
+ (Integer) closeTimeout.getConvertedValue());
+ }
}
});
maxWidth = createIntegerTextField("Max width",
@@ -41,8 +43,10 @@ public class TooltipConfiguration extends AbstractTestUIWithLog {
maxWidth.addValueChangeListener(new Property.ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
- getTooltipConfiguration().setMaxWidth(
- (Integer) maxWidth.getConvertedValue());
+ if (maxWidth.getConvertedValue() != null) {
+ getTooltipConfiguration().setMaxWidth(
+ (Integer) maxWidth.getConvertedValue());
+ }
}
});
openDelay = createIntegerTextField("Open delay",
@@ -50,8 +54,10 @@ public class TooltipConfiguration extends AbstractTestUIWithLog {
openDelay.addValueChangeListener(new Property.ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
- getTooltipConfiguration().setOpenDelay(
- (Integer) openDelay.getConvertedValue());
+ if (openDelay.getConvertedValue() != null) {
+ getTooltipConfiguration().setOpenDelay(
+ (Integer) openDelay.getConvertedValue());
+ }
}
});
@@ -61,8 +67,11 @@ public class TooltipConfiguration extends AbstractTestUIWithLog {
.addValueChangeListener(new Property.ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
- getTooltipConfiguration().setQuickOpenDelay(
- (Integer) quickOpenDelay.getConvertedValue());
+ if (quickOpenDelay.getConvertedValue() != null) {
+ getTooltipConfiguration().setQuickOpenDelay(
+ (Integer) quickOpenDelay
+ .getConvertedValue());
+ }
}
});
@@ -72,8 +81,11 @@ public class TooltipConfiguration extends AbstractTestUIWithLog {
.addValueChangeListener(new Property.ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
- getTooltipConfiguration().setQuickOpenTimeout(
- (Integer) quickOpenTimeout.getConvertedValue());
+ if (quickOpenTimeout.getConvertedValue() != null) {
+ getTooltipConfiguration().setQuickOpenTimeout(
+ (Integer) quickOpenTimeout
+ .getConvertedValue());
+ }
}
});
@@ -91,6 +103,8 @@ public class TooltipConfiguration extends AbstractTestUIWithLog {
tf.setConverter(Integer.class);
tf.setImmediate(true);
tf.setConvertedValue(initialValue);
+ // makes TB3 tests simpler - no "null" added when clearing a field
+ tf.setNullRepresentation("");
return tf;
}
diff --git a/uitest/src/com/vaadin/tests/tooltip/TooltipConfigurationTest.java b/uitest/src/com/vaadin/tests/tooltip/TooltipConfigurationTest.java
new file mode 100644
index 0000000000..8f84444400
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tooltip/TooltipConfigurationTest.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.tooltip;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+import org.junit.Test;
+import org.openqa.selenium.Keys;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.testbench.By;
+import com.vaadin.tests.tb3.TooltipTest;
+
+public class TooltipConfigurationTest extends TooltipTest {
+
+ @Test
+ public void testTooltipConfiguration() throws Exception {
+ openTestURL();
+
+ WebElement uiRoot = getDriver().findElement(By.vaadin("Root"));
+ WebElement closeTimeout = vaadinElementById("Close timeout");
+ WebElement shortTooltip = vaadinElementById("shortTooltip");
+ WebElement longTooltip = vaadinElementById("longTooltip");
+ WebElement maxWidth = vaadinElementById("Max width");
+
+ selectAndType(closeTimeout, "0");
+
+ checkTooltip(shortTooltip, "This is a short tooltip");
+
+ moveToRoot();
+
+ checkTooltipNotPresent();
+
+ selectAndType(closeTimeout, "3000");
+ checkTooltip(shortTooltip, "This is a short tooltip");
+
+ moveToRoot();
+
+ // The tooltip should still be there despite being "cleared", as the
+ // timeout hasn't expired yet.
+ checkTooltip("This is a short tooltip");
+
+ // assert that tooltip is present
+ selectAndType(closeTimeout, "0");
+ selectAndType(maxWidth, "100");
+
+ testBenchElement(longTooltip).showTooltip();
+ assertThat(getDriver().findElement(By.className("popupContent"))
+ .getSize().getWidth(), is(100));
+ }
+
+ private void selectAndType(WebElement element, String value) {
+ // select and replace text
+ element.clear();
+ // if null representation not set as "", need to move cursor to end and
+ // remove text "null"
+ element.sendKeys(value + Keys.ENTER);
+ }
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/tooltip/ValidatorCaptionTooltip.java b/uitest/src/com/vaadin/tests/tooltip/ValidatorCaptionTooltip.java
new file mode 100644
index 0000000000..20dc514c10
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tooltip/ValidatorCaptionTooltip.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.tooltip;
+
+import com.vaadin.data.validator.IntegerRangeValidator;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.TextField;
+
+/**
+ *
+ * UI test class for Tooltip with integer range validator.
+ */
+public class ValidatorCaptionTooltip extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ TextField fieldWithError = new TextField();
+ int min = 0;
+ int max = 100;
+ String errorMessage = "Valid value is between " + min + " and " + max
+ + ". {0} is not.";
+ IntegerRangeValidator validator = new IntegerRangeValidator(
+ errorMessage, min, max);
+ fieldWithError.setValue("142");
+
+ fieldWithError.addValidator(validator);
+ fieldWithError.setConverter(Integer.class);
+ fieldWithError.setImmediate(true);
+
+ TextField fieldWithoutError = new TextField();
+ fieldWithoutError.addValidator(validator);
+ fieldWithoutError.setConverter(Integer.class);
+ fieldWithoutError.setValue("42");
+ addComponent(fieldWithError);
+ addComponent(fieldWithoutError);
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Valid value is from 0 to 100.When the value is not valid. An error tooltip should appear";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 14046;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/tooltip/ValidatorCaptionTooltipTest.java b/uitest/src/com/vaadin/tests/tooltip/ValidatorCaptionTooltipTest.java
new file mode 100644
index 0000000000..9603b1df36
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tooltip/ValidatorCaptionTooltipTest.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.tooltip;
+
+import org.junit.Test;
+
+import com.vaadin.testbench.elements.TextFieldElement;
+import com.vaadin.tests.tb3.TooltipTest;
+
+/**
+ * Test to see if validators create error tooltips correctly.
+ *
+ * @author Vaadin Ltd
+ */
+public class ValidatorCaptionTooltipTest extends TooltipTest {
+ @Test
+ public void validatorWithError() throws Exception {
+ openTestURL();
+
+ TextFieldElement field = $(TextFieldElement.class).get(0);
+ String fieldValue = field.getAttribute("value");
+ String expected = "Valid value is between 0 and 100. " + fieldValue
+ + " is not.";
+ checkTooltip(field, expected);
+ }
+
+ @Test
+ public void validatorWithoutError() throws Exception {
+ openTestURL();
+ TextFieldElement field = $(TextFieldElement.class).get(1);
+ checkTooltip(field, null);
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/tooltip/tooltipandjavascript.js b/uitest/src/com/vaadin/tests/tooltip/tooltipandjavascript.js
new file mode 100644
index 0000000000..f6aea090ba
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tooltip/tooltipandjavascript.js
@@ -0,0 +1 @@
+window.console.log("tooltipandjavascript.js executing") \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/widgetset/client/AbstractSuperclassForBean.java b/uitest/src/com/vaadin/tests/widgetset/client/AbstractSuperclassForBean.java
new file mode 100644
index 0000000000..0ea19bd965
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/widgetset/client/AbstractSuperclassForBean.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.widgetset.client;
+
+import java.io.Serializable;
+
+/**
+ * Dummy state bean used just to check that nothing breaks when generating code
+ * to serialize beans with properties in abstract superclasses
+ */
+public abstract class AbstractSuperclassForBean implements Serializable {
+ public String propertyInAbstractSuperclass;
+}
diff --git a/uitest/src/com/vaadin/tests/widgetset/client/BeanWithAbstractSuperclass.java b/uitest/src/com/vaadin/tests/widgetset/client/BeanWithAbstractSuperclass.java
new file mode 100644
index 0000000000..a3530f19e9
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/widgetset/client/BeanWithAbstractSuperclass.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.widgetset.client;
+
+/**
+ * Dummy state bean used just to check that nothing breaks when generating code
+ * to serialize beans with properties in abstract superclasses
+ */
+public class BeanWithAbstractSuperclass extends AbstractSuperclassForBean {
+ public String propertyInsubclass;
+}
diff --git a/uitest/src/com/vaadin/tests/widgetset/client/SerializerTestState.java b/uitest/src/com/vaadin/tests/widgetset/client/SerializerTestState.java
index d22165b2bb..faf41fbf88 100644
--- a/uitest/src/com/vaadin/tests/widgetset/client/SerializerTestState.java
+++ b/uitest/src/com/vaadin/tests/widgetset/client/SerializerTestState.java
@@ -97,4 +97,6 @@ public class SerializerTestState extends AbstractComponentState {
public Date date1;
public Date date2;
+ public BeanWithAbstractSuperclass beanWithAbstractSuperclass;
+
}
diff --git a/uitest/tb3test.xml b/uitest/tb3test.xml
index 6e0f25a8f7..a39725f1bb 100644
--- a/uitest/tb3test.xml
+++ b/uitest/tb3test.xml
@@ -7,6 +7,7 @@
<property name="browsers.exclude" value="" />
<property name="categories.include" value="" />
<property name="categories.exclude" value="" />
+ <property name="useLocalWebDriver" value="false" />
<ivy:resolve file="${tb3test.dir}/ivy.xml" conf="build, build-provided" />
<ivy:cachepath pathid="classpath.tb3.lib" conf="build, build-provided" />
@@ -37,6 +38,7 @@
<jvmarg value="-Dbrowsers.exclude=${browsers.exclude}" />
<jvmarg value="-Dcategories.include=${categories.include}" />
<jvmarg value="-Dcategories.exclude=${categories.exclude}" />
+ <jvmarg value="-DuseLocalWebDriver=${useLocalWebDriver}" />
<test name="${junit.test.suite}" todir="${report.dir}" />
</junit>