// Color functions are used to calculate default font color
@import "../util/color";

/**
 * A static text that is shown under the loading spinned while the client-side
 * engine is being loaded and started. The text must be given in quotes. The
 * text can not be localized currently.
 *
 * @type string, quoted
 */
$v-app-loading-text: "" !default;

/**
 * Base line height for all widgets. It must be given a unitless number.
 *
 * @group typography
 * @type number
 */
$v-line-height: 1.55 !default;

/**
 * Base font size for the theme. The font size defines the overall sizing of
 * UI components by default. Must be specified in pixels.
 *
 * @group typography
 * @type size (px)
 */
$v-font-size: 16px !default;

/**
 * Base font weight for plain text.
 * Must be specified as a numeric value: 100, 200, 300 (light), 400 (regular),
 * 500, 600, 700 (bold), 800 or 900.
 *
 * @group typography
 * @type number
 */
$v-font-weight: 300 !default;

/**
 * Base font family for the theme. Can be any valid CSS font stack.
 *
 * @group typography
 * @type list
 */
$v-font-family: "Open Sans", sans-serif !default;

/**
 * Font size for generic component captions. Can be any valid CSS font-size. A
 * round pixel value is recommended.
 *
 * @group typography
 * @type number
 */
$v-caption-font-size: round($v-font-size * 0.9) !default;

/**
 * Font weight for generic component captions. Can be any valid CSS font-weight.
 *
 * @group typography
 * @type number | identifier
 */
$v-caption-font-weight: max(400, $v-font-weight) !default;

/**
 * Border specification for the components that have a border. The border width
 * must be specified in pixels. For the border color, you can specify any CSS color
 * or one of the v-tint, v-shade, and v-tone keywords.
 *
 * @group style
 * @type list
 */
$v-border: 1px solid (v-shade 0.7) !default;

/**
 * Corner radius for components that have a border. The measure must be specified as a
 * single pixel value (i.e. not as a list of values for each corner).
 *
 * @group style
 * @type size (px)
 */
$v-border-radius: 4px !default;

/**
 * Color gradient style for components that have a gradient. The gradient style may use
 * the following keywords: v-linear and v-linear-reverse. The opacity must be given
 * as percentage between 0% and 100%.
 * 
 * #### Gradient styles
 * 
 *  - __v-linear__ - The start of the gradient is a lighter shade of the base color and the end is a darker shade of the base color. A basic linear gradient.
 *  - __v-linear-reverse__ - Same as v-linear, but the color stops are reversed (darker at the start and lighter at the end)
 *
 * @group style
 * @type list
 */
$v-gradient: v-linear 8% !default;

/**
 * Inset shadow style to define how some components are "raised" from the background.
 * The value follows the syntax of CSS box-shadow, and should be a list of insets.
 * For the bevel color, you can specify any CSS color or one of the v-tint, v-shade,
 * and v-tone keywords.
 *
 * @group style
 * @type list
 */
$v-bevel: inset 0 1px 0 v-tint, inset 0 -1px 0 v-shade !default;

/**
 * Specifies the "depth" of the bevel shadow, as applied to one of the color keywords for
 * the bevel style. The actual amount of tint, shade, or tone is computed from the depth.
 *
 * @group style
 * @type number (pct)
 */
$v-bevel-depth: 30% !default;

/**
 * Default shadow style for all components. As with $v-bevel, the value follows the syntax
 * of CSS box-shadow, but without the inset. For the shadow color, you can specify any CSS
 * color or one of the v-tint or v-shade keywords.
 *
 * @group style
 * @type list
 */
$v-shadow: 0 2px 3px v-shade !default;

/**
 * Specifies the opacity of the shadow, as applied to one of the color keywords for the
 * shadow style. The actual amount of tint or shade is computed from the depth.
 *
 * @group style
 * @type number (pct)
 */
$v-shadow-opacity: 5% !default;

/**
 * The background color is the main control parameter for the Valo theme and
 * it is  used for computing all other colors in the theme. If the color is dark
 * (has low luminance),  * light foreground colors that give high contrast
 * with the background are automatically used.
 *
 * Can be any valid CSS color.
 *
 * @group color
 * @type color
 */
$v-background-color: hsl(210, 0%, 98%) !default;

/**
 * Background color of the UI's root element. You can specify the color in
 * any way allowed in CSS. Used as the base for other default colors, such
 * as panel and window content areas.
 *
 * Can be any valid CSS color.
 *
 * @group color
 * @type color
 */
$v-app-background-color: $v-background-color !default;

/**
 * Base font color for the theme. Can be any valid CSS color.
 *
 * @group color
 * @type color
 */
$v-font-color: valo-font-color($v-app-background-color) !default;

/**
 * Color for the field focus indicator. The valo-focus-color() function computes a
 * high-contrast color from the context, which is usually the background color. The color
 * can be any CSS color.
 *
 * @group color
 * @type color
 */
$v-focus-color: valo-focus-color() !default;

/**
 * Box-shadow specification for the field focus indicator. The space-separated values
 * are the horizontal shadow position in pixels, vertical shadow position in pixels,
 * blur distance in pixels, spread distance in pixels, and the color. The color can be
 * any CSS color. You can only specify the color, in which case defaults for the position
 * are used. rgba() or hsla() can be used to enable transparency.
 *
 * @group style
 * @type list | color
 */
$v-focus-style: 0 0 0 2px rgba($v-focus-color, .5) !default;

/**
 * Opacity of disabled components, from 0 to 1. Not all components have reduced opacity when disabled, such as Labels.
 *
 * @group style
 * @type number
 */
$v-disabled-opacity: 0.5 !default;

/**
 * Color for indicating selection in selection components.
 *
 * @group color
 * @type color
 */
$v-selection-color: $v-focus-color !default;

/**
 * Color of the component error indicator and other error indications, such as the
 * error style notification.
 *
 * @group color
 * @type color
 */
$v-error-indicator-color: #ed473b !default;

/**
 * Color of the required indicator in field components.
 *
 * @group color
 * @type color
 */
$v-required-field-indicator-color: $v-error-indicator-color !default;

/**
 * Color used for success states and to indicate safe actions (i.e. actions that
 * will not cause any data loss).
 *
 * @group color
 * @type color
 */
$v-friendly-color: #2c9720 !default;

/**
 * Color specifications for $v-border, $v-bevel, and $v-shadow may use, in addition to CSS colors, the following keywords:
 *
 *  - __v-tint__ - Lighter than the background color
 *  - __v-shade__ - Darker than the background color
 *  - __v-tone__ - Adaptive color specification: darker on light background and lighter on dark background. Not usable in $v-shadow.
 *
 *
 *  These keywords can be further adjusted by combining them with a strength multiplier, specified in parenthesis.
 *
 *  Examples:
 *
 *      (v-tint 2)
 *      (v-shade 0.6)
 *      (v-tone 1.1)
 *
 * @group color
 */
$v-color-keywords: v-tint, v-shade, v-tone;

/**
 * This is the base size for various layout measures. It is directly used in some
 * measures, such as button height and layout margins, while other measures are
 * derived from it. The value must be specified in pixels, with a suitable range
 * of 18-50.
 *
 * @group layout
 * @type size (px)
 */
$v-unit-size: round(2.3 * $v-font-size) !default;

/**
 * Scaling factor for tiny sizes. Must be a unitless number.
 *
 * @group layout
 * @type number
 */
$v-scaling-factor--tiny: 0.75 !default;

/**
 * Scaling factor for small sizes. Must be a unitless number.
 *
 * @group layout
 * @type number
 */
$v-scaling-factor--small: 0.85 !default;

/**
 * Scaling factor for large sizes. Must be a unitless number.
 *
 * @group layout
 * @type number
 */
$v-scaling-factor--large: 1.2 !default;

/**
 * Scaling factor for huge sizes. Must be a unitless number.
 *
 * @group layout
 * @type number
 */
$v-scaling-factor--huge: 1.6 !default;

/**
 * Unit size for tiny components. Must be a pixel value.
 *
 * @group layout
 * @type size (px)
 */
$v-unit-size--tiny: round($v-unit-size * $v-scaling-factor--tiny) !default;

/**
 * Unit size for small components. Must be a pixel value.
 *
 * @group layout
 * @type size (px)
 */
$v-unit-size--small: round($v-unit-size * $v-scaling-factor--small) !default;

/**
 * Unit size for large components. Must be a pixel value.
 *
 * @group layout
 * @type size (px)
 */
$v-unit-size--large: round($v-unit-size * $v-scaling-factor--large) !default;

/**
 * Unit size for huge components. Must be a pixel value.
 *
 * @group layout
 * @type size (px)
 */
$v-unit-size--huge: round($v-unit-size * $v-scaling-factor--huge) !default;

/**
 * The top margin size for all built-in layout components, when the margin is
 * enabled with setMargin(). Can be any valid CSS size.
 *
 * @group layout
 * @type size
 */
$v-layout-margin-top: round($v-unit-size) !default;

/**
 * The right margin size for all built-in layout components, when the margin is
 * enabled with setMargin(). Can be any valid CSS size.
 *
 * @group layout
 * @type size
 */
$v-layout-margin-right: round($v-unit-size) !default;

/**
 * The bottom margin size for all built-in layout components, when the margin is
 * enabled with setMargin(). Can be any valid CSS size.
 *
 * @group layout
 * @type size
 */
$v-layout-margin-bottom: round($v-unit-size) !default;

/**
 * The left margin size for all built-in layout components, when the margin is
 * enabled with setMargin(). Can be any valid CSS size.
 *
 * @group layout
 * @type size
 */
$v-layout-margin-left: round($v-unit-size) !default;

/**
 * Amount of vertical space when spacing is enabled for a layout with setSpacing().
 * Can be any valid CSS size.
 *
 * @group layout
 * @type size
 */
$v-layout-spacing-vertical: round($v-unit-size/3) !default;

/**
 * Amount of horizontal space when spacing is enabled for a layout with setSpacing().
 * Can be any valid CSS size.
 *
 * @group layout
 * @type size
 */
$v-layout-spacing-horizontal: round($v-unit-size/3) !default;

/**
 * Tiny font size.
 *
 * @group typography
 * @type size (px)
 */
$v-font-size--tiny: ceil($v-font-size * $v-scaling-factor--tiny) !default;

/**
 * Small font size.
 *
 * @group typography
 * @type size (px)
 */
$v-font-size--small: ceil($v-font-size * $v-scaling-factor--small) !default;

/**
 * Large font size.
 *
 * @group typography
 * @type size (px)
 */
$v-font-size--large: ceil($v-font-size * $v-scaling-factor--large) !default;

/**
 * Huge font size.
 *
 * @group typography
 * @type size (px)
 */
$v-font-size--huge: ceil($v-font-size * $v-scaling-factor--huge) !default;

/**
 * Default width of certain field components, unless overridden with setWidth().
 *
 * @group layout
 * @type size (px)
 */
$v-default-field-width: $v-unit-size * 5 !default;

/**
 * Specifies whether various CSS animations are used. Not all animations are disabled when
 * set to false, such as the default loading indicator animations.
 *
 * @group optimization
 * @type bool
 */
$v-animations-enabled: true !default;

/**
 * Specifies whether various :hover styles are used for indicating that mouse pointer
 * hovers over an element.
 *
 * @group optimization
 * @type bool
 */
$v-hover-styles-enabled: true !default;

/**
 * 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.
 *
 * @group optimization
 * @type list
 *
 * @example scss
 * // Remove the Calendar component styles from the output (must be declared after importing Valo)
 * $v-included-components: remove($v-included-components, calendar);
 *
 * @example scss
 * // Only include the Label, Button and Vertical and Horizontal layouts in the compilation
 * $v-included-components: label, button, orderedlayout;
 */
$v-included-components:
    absolutelayout,
    accordion,
    button,
    calendar,
    checkbox,
    colorpicker,
    combobox,
    csslayout,
    customcomponent,
    customlayout,
    datefield,
    dragwrapper,
    form,
    formlayout,
    grid,
    gridlayout,
    label,
    link,
    menubar,
    nativebutton,
    nativeselect,
    notification,
    optiongroup,
    orderedlayout,
    panel,
    popupview,
    progressbar,
    slider,
    splitpanel,
    table,
    tabsheet,
    textfield,
    textarea,
    richtextarea,
    tree,
    treetable,
    twincolselect,
    upload,
    window,
    valo-menu !default;

/**
 * List of components whose additional styles should be included in the compilation.
 *
 * @group optimization
 * @type list
 */
$v-included-additional-styles: $v-included-components !default;

/**
 * Checks if a given component is included in the compilation. Used by the collection mixins that
 * include all components (i.e. valo-components).
 *
 * @requires $v-included-components
 *
 * @example scss
 *  @if v-is-included(button) {
 *    // The Button component is included in the compilation
 *  }
 *
 * @param {string} $component-name - the name of the component to check
 * @param {list} $is-included ($v-included-components) - the list of components which is checked
 *
 * @return {bool} true if the component is included in the compilation, false if not
 *
 * @group optimization
 */
@function v-is-included ($component-name, $is-included: $v-included-components) {
  @return contains($is-included, $component-name);
}


/**
 * A flag to note whether relative URL paths are relative to the currently parsed SCSS file or to the compilation root file.
 * 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
 *
 * @type bool
 */
$v-relative-paths: true !default;
