Search code examples
javascriptpolymervaadinvaadin-elements

How to change the color of vaadin-select-text-field in the vaadin-select within page only?


How to change the color of vaadin-select-text-field from the vaadin-select within page only? For the vaadin-select source, it is not changed. I want to custom on the vaadin-select in the page. Anyone who can style the vaadin-select?

I've tried to change the style of vaadin-select but it is none. This is because of the shadow-root. Hope the junior or senior or professional programmers who can answer and solve it.

static get template() {
        return html`
            <style>
             vaadin-select {
              background: white
              }
            </style>

            <vaadin-select value="CSR">
               <template>
                 <vaadin-list-box>
                   <vaadin-item value="CSR">Cornerstone Reality</vaadin-item>
                  </vaadin-list-box>
                </template>
             </vaadin-select>
`}


It is none change the color.


Solution

  • In one week, I've challenge with the background of vaadin-text-field. At end, I could git it.

    In the vaadin-text-styles.js, this pages actually created for a new copy js. The styles can changed to be transparent background.

    import '@vaadin/vaadin-lumo-styles/color.js';
    import '@vaadin/vaadin-lumo-styles/sizing.js';
    import '@vaadin/vaadin-lumo-styles/spacing.js';
    import '@vaadin/vaadin-lumo-styles/style.js';
    import '@vaadin/vaadin-lumo-styles/typography.js';
    import '@vaadin/vaadin-lumo-styles/mixins/required-field.js';
    import '@vaadin/vaadin-lumo-styles/font-icons.js';
    import '@vaadin/vaadin-lumo-styles/mixins/field-button.js';
    import { html } from '@polymer/polymer/lib/utils/html-tag.js';
    
    const $_documentContainer = html`<dom-module id="lumo-text-field" theme-for="vaadin-text-field-1">
      <template>
        <style include="lumo-required-field lumo-field-button">
          :host {
            --lumo-text-field-size: var(--lumo-size-m);
            color: var(--lumo-body-text-color);
            font-size: var(--lumo-font-size-m);
            font-family: var(--lumo-font-family);
            -webkit-font-smoothing: antialiased;
            -moz-osx-font-smoothing: grayscale;
            -webkit-tap-highlight-color: transparent;
            padding: var(--lumo-space-xs) 0;
          }
    
          :host::before {
            height: var(--lumo-text-field-size);
            box-sizing: border-box;
            display: inline-flex;
            align-items: center;
          }
    
          :host([focused]:not([readonly])) [part="label"] {
            color: var(--lumo-primary-text-color);
          }
    
          [part="value"],
          [part="input-field"] ::slotted(input),
          [part="input-field"] ::slotted(textarea),
          /* Slotted by vaadin-select-text-field */
          [part="input-field"] ::slotted([part="value"]) {
            cursor: inherit;
            min-height: var(--lumo-text-field-size);
            padding: 0 0.25em;
            --_lumo-text-field-overflow-mask-image: linear-gradient(to left, transparent, #000 1.25em);
            -webkit-mask-image: var(--_lumo-text-field-overflow-mask-image);
          }
    
          [part="value"]:focus,
          [part="input-field"] ::slotted(input):focus,
          [part="input-field"] ::slotted(textarea):focus {
            -webkit-mask-image: none;
            mask-image: none;
          }
    
          /*
            TODO: CSS custom property in \`mask-image\` causes crash in Edge
            see https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/15415089/
          */
          @-moz-document url-prefix() {
            [part="value"],
            [part="input-field"] ::slotted(input),
            [part="input-field"] ::slotted(textarea),
            [part="input-field"] ::slotted([part="value"]) {
              mask-image: var(--_lumo-text-field-overflow-mask-image);
            }
          }
    
          [part="value"]::-webkit-input-placeholder {
            color: inherit;
            transition: opacity 0.175s 0.05s;
            opacity: 0.5;
          }
    
          [part="value"]:-ms-input-placeholder {
            color: inherit;
            opacity: 0.5;
          }
    
          [part="value"]::-moz-placeholder {
            color: inherit;
            transition: opacity 0.175s 0.05s;
            opacity: 0.5;
          }
    
          [part="value"]::placeholder {
            color: inherit;
            transition: opacity 0.175s 0.1s;
            opacity: 0.5;
          }
    
          [part="input-field"] {
            border-radius: var(--lumo-border-radius);
            padding: 0 calc(0.375em + var(--lumo-border-radius) / 4 - 1px);
            font-weight: 500;
            line-height: 1;
            position: relative;
            cursor: text;
            box-sizing: border-box;
          }
    
          /* Used for hover and activation effects */
          [part="input-field"]::after {
            content: "";
            position: absolute;
            top: 0;
            right: 0;
            bottom: 0;
            left: 0;
            border-radius: inherit;
            pointer-events: none;
            background-color: var(--lumo-contrast-50pct);
            opacity: 0;
            transition: transform 0.15s, opacity 0.2s;
            transform-origin: 100% 0;
          }
    
          /* Hover */
    
          :host(:hover:not([readonly]):not([focused])) [part="label"] {
            color: var(--lumo-body-text-color);
          }
    
          :host(:hover:not([readonly]):not([focused])) [part="input-field"]::after {
            opacity: 0.1;
          }
    
          /* Touch device adjustment */
          @media (pointer: coarse) {
            :host(:hover:not([readonly]):not([focused])) [part="label"] {
              color: var(--lumo-secondary-text-color);
            }
    
            :host(:hover:not([readonly]):not([focused])) [part="input-field"]::after {
              opacity: 0;
            }
    
            :host(:active:not([readonly]):not([focused])) [part="input-field"]::after {
              opacity: 0.2;
            }
          }
    
          /* Trigger when not focusing using the keyboard */
          :host([focused]:not([focus-ring]):not([readonly])) [part="input-field"]::after {
            transform: scaleX(0);
            transition-duration: 0.15s, 1s;
          }
    
          /* Focus-ring */
    
          :host([focus-ring]) [part="input-field"] {
            box-shadow: 0 0 0 2px var(--lumo-primary-color-50pct);
          }
    
          /* Read-only and disabled */
          :host([readonly]) [part="value"]::-webkit-input-placeholder,
          :host([disabled]) [part="value"]::-webkit-input-placeholder {
            opacity: 0;
          }
    
          :host([readonly]) [part="value"]:-ms-input-placeholder,
          :host([disabled]) [part="value"]:-ms-input-placeholder {
            opacity: 0;
          }
    
          :host([readonly]) [part="value"]::-moz-placeholder,
          :host([disabled]) [part="value"]::-moz-placeholder {
            opacity: 0;
          }
    
          :host([readonly]) [part="value"]::placeholder,
          :host([disabled]) [part="value"]::placeholder {
            opacity: 0;
          }
    
          /* Read-only */
    
          :host([readonly]) [part="input-field"] {
            color: var(--lumo-secondary-text-color);
            background-color: transparent;
            cursor: default;
          }
    
          :host([readonly]) [part="input-field"]::after {
            background-color: transparent;
            opacity: 1;
            border: 1px dashed var(--lumo-contrast-30pct);
          }
    
          /* Disabled style */
    
          :host([disabled]) {
            pointer-events: none;
          }
    
          :host([disabled]) [part="input-field"] {
            background-color: var(--lumo-contrast-5pct);
          }
    
          :host([disabled]) [part="label"],
          :host([disabled]) [part="value"],
          :host([disabled]) [part="input-field"] ::slotted(*) {
            color: var(--lumo-disabled-text-color);
            -webkit-text-fill-color: var(--lumo-disabled-text-color);
          }
    
          /* Invalid style */
    
          :host([invalid]) [part="input-field"] {
            background-color: var(--lumo-error-color-10pct);
          }
    
          :host([invalid]) [part="input-field"]::after {
            background-color: var(--lumo-error-color-50pct);
          }
    
          :host([invalid][focus-ring]) [part="input-field"] {
            box-shadow: 0 0 0 2px var(--lumo-error-color-50pct);
          }
    
          :host([input-prevented]) [part="input-field"] {
            color: var(--lumo-error-text-color);
          }
    
          /* Small theme */
    
          :host([theme~="small"]) {
            font-size: var(--lumo-font-size-s);
            --lumo-text-field-size: var(--lumo-size-s);
          }
    
          :host([theme~="small"][has-label]) [part="label"] {
            font-size: var(--lumo-font-size-xs);
          }
    
          :host([theme~="small"][has-label]) [part="error-message"] {
            font-size: var(--lumo-font-size-xxs);
          }
    
          /* Text align */
    
          :host([theme~="align-center"]) [part="value"] {
            text-align: center;
            --_lumo-text-field-overflow-mask-image: none;
          }
    
          :host([theme~="align-right"]) [part="value"] {
            text-align: right;
            --_lumo-text-field-overflow-mask-image: none;
          }
    
          @-moz-document url-prefix() {
            /* Firefox is smart enough to align overflowing text to right */
            :host([theme~="align-right"]) [part="value"] {
              --_lumo-text-field-overflow-mask-image: linear-gradient(to right, transparent 0.25em, #000 1.5em);
            }
          }
    
          /* Slotted content */
    
          [part="input-field"] ::slotted(:not([part]):not(iron-icon):not(input):not(textarea)) {
            color: var(--lumo-secondary-text-color);
            font-weight: 400;
          }
    
          /* Slotted icons */
    
          [part="input-field"] ::slotted(iron-icon) {
            color: var(--lumo-contrast-60pct);
            width: var(--lumo-icon-size-m);
            height: var(--lumo-icon-size-m);
          }
    
          /* Vaadin icons are based on a 16x16 grid (unlike Lumo and Material icons with 24x24), so they look too big by default */
          [part="input-field"] ::slotted(iron-icon[icon^="vaadin:"]) {
            padding: 0.25em;
            box-sizing: border-box !important;
          }
    
          [part="clear-button"]::before {
            content: var(--lumo-icons-cross);
          }
        </style>
      </template>
    </dom-module>`;
    
    document.head.appendChild($_documentContainer.content);
    
    

    And the vaadin-text-field-theme.js is also created for the copy vaadin-text-field. It is not modified but it should change 'vaadin-text-field-1' in static get is().

    /**
    @license
    Copyright (c) 2017 Vaadin Ltd.
    This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
    */
    import { PolymerElement } from '@polymer/polymer/polymer-element.js';
    
    import { TextFieldMixin } from '@vaadin/vaadin-text-field/src/vaadin-text-field-mixin.js';
    import { ElementMixin } from '@vaadin/vaadin-element-mixin/vaadin-element-mixin.js';
    import { html } from '@polymer/polymer/lib/utils/html-tag.js';
    import { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
    /**
     * `<vaadin-text-field>` is a Web Component for text field control in forms.
     *
     * ```html
     * <vaadin-text-field label="First Name">
     * </vaadin-text-field>
     * ```
     *
     * ### Prefixes and suffixes
     *
     * These are child elements of a `<vaadin-text-field>` that are displayed
     * inline with the input, before or after.
     * In order for an element to be considered as a prefix, it must have the slot
     * attribute set to `prefix` (and similarly for `suffix`).
     *
     * ```html
     * <vaadin-text-field label="Email address">
     *   <div slot="prefix">Sent to:</div>
     *   <div slot="suffix">@vaadin.com</div>
     * </vaadin-text-area>
     * ```
     *
     * ### Styling
     *
     * The following custom properties are available for styling:
     *
     * Custom property | Description | Default
     * ----------------|-------------|-------------
     * `--vaadin-text-field-default-width` | Set the default width of the input field | `12em`
     *
     * The following shadow DOM parts are available for styling:
     *
     * Part name | Description
     * ----------------|----------------
     * `label` | The label element
     * `input-field` | The element that wraps prefix, value and suffix
     * `value` | The text value element inside the `input-field` element
     * `error-message` | The error message element
     *
     * The following state attributes are available for styling:
     *
     * Attribute    | Description | Part name
     * -------------|-------------|------------
     * `disabled` | Set to a disabled text field | :host
     * `has-value` | Set when the element has a value | :host
     * `has-label` | Set when the element has a label | :host
     * `invalid` | Set when the element is invalid | :host
     * `input-prevented` | Temporarily set when invalid input is prevented | :host
     * `focused` | Set when the element is focused | :host
     * `focus-ring` | Set when the element is keyboard focused | :host
     * `readonly` | Set to a readonly text field | :host
     *
     * See [ThemableMixin – how to apply styles for shadow parts](https://github.com/vaadin/vaadin-themable-mixin/wiki)
     *
     * @memberof Vaadin
     * @mixes Vaadin.TextFieldMixin
     * @mixes Vaadin.ThemableMixin
     * @demo demo/index.html
     */
    class TextFieldElement extends ElementMixin(TextFieldMixin(ThemableMixin(PolymerElement))) {
      static get template() {
        return html`
        <style include="vaadin-text-field-shared-styles">
          /* polymer-cli linter breaks with empty line */
        </style>
    
        <div class="vaadin-text-field-container">
    
          <label part="label" on-click="focus" id="[[_labelId]]">[[label]]</label>
    
          <div part="input-field">
    
            <slot name="prefix"></slot>
    
            <slot name="input">
              <input part="value">
            </slot>
    
            <div part="clear-button" id="clearButton" role="button" aria-label\$="[[i18n.clear]]"></div>
            <slot name="suffix"></slot>
    
          </div>
    
          <div part="error-message" id="[[_errorId]]" aria-live="assertive" aria-hidden\$="[[_getErrorMessageAriaHidden(invalid, errorMessage, _errorId)]]">[[errorMessage]]</div>
    
        </div>
    `;
      }
    
      static get is() {
        return 'vaadin-text-field-1';
      }
    
      static get version() {
        return '2.4.5';
      }
    
      static get properties() {
        return {
          /**
           * Identifies a list of pre-defined options to suggest to the user.
           * The value must be the id of a <datalist> element in the same document.
           */
          list: {
            type: String
          },
    
          /**
           * A regular expression that the value is checked against.
           * The pattern must match the entire value, not just some subset.
           */
          pattern: {
            type: String
          },
    
          /**
           * Message to show to the user when validation fails.
           */
          title: {
            type: String
          }
        };
      }
    }
    
    customElements.define(TextFieldElement.is, TextFieldElement);
    
    export { TextFieldElement };
    
    

    At the end, it can work with created the vaadin-text-field-1.

    import './vaadin-text-field-theme.js';
    import './vaadin-text-styles';
    

    After that, you can import './vaadin-text-field-1.js' in any pages.

    Thank you for sharing our experience with kind.

    enter image description here