/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */
export default {
  /*// head1.css /////////////////////////////////////////////////*/
  ".wrapper[data-v-67763bae]": {
    "width": "375px",
    "overflow": "hidden"
  },
  ".module-warning[data-v-67763bae]": {
    "text-align": "center",
    "font-size": "25px",
    "color": "red",
    "font-weight": "bold"
  },
  ".video[data-v-67763bae]": {
    "position": "absolute",
    "top": "0",
    "left": "0",
    "width": "375px"
  },
  ".first-frame[data-v-67763bae]": {
    "position": "absolute",
    "top": "0",
    "left": "0",
    "width": "375px"
  },
  ".final-image[data-v-67763bae]": {
    "position": "absolute",
    "top": "0",
    "left": "0",
    "width": "375px"
  },
  ".deco-img[data-v-67763bae]": {
    "width": "375px",
    "position": "absolute",
    "left": "0",
    "bottom": "0"
  },

  /*// head2.css /////////////////////////////////////////////////*/
  ".wrapper[data-v-16194ed9]": {
    "color": "#353535"
  },
  ".point[data-v-16194ed9]": {
    "position": "absolute"
  },
  ".banner[data-v-16194ed9]": {
    "width": "375px"
  },

  /*// head3.css /////////////////////////////////////////////////*/
  ".wrapper[data-v-6acf469e]": {
    "background-color": "transparent",
    "-webkit-box-pack": "center",
    "-webkit-justify-content": "center",
    "-ms-flex-pack": "center",
    "justify-content": "center",
    "-webkit-box-align": "center",
    "-webkit-align-items": "center",
    "-ms-flex-align": "center",
    "align-items": "center",
    "padding-bottom": "9px"
  },
  ".items-wrapper[data-v-6acf469e]": {
    "width": "357.5px"
  },
  ".row[data-v-6acf469e]": {
    "-webkit-box-orient": "horizontal",
    "-webkit-box-direction": "normal",
    "-webkit-flex-direction": "row",
    "-ms-flex-direction": "row",
    "flex-direction": "row"
  },

  /*// head4.css /////////////////////////////////////////////////*/
  ".item[data-v-553d6ea0]": {
    "width": "178px",
    "height": "118px",
    "background-color": "#ffffff",
    "margin-bottom": "1px"
  },
  ".bgImage[data-v-553d6ea0]": {
    "position": "absolute",
    "width": "178px",
    "height": "118px"
  },
  ".img[data-v-553d6ea0]": {
    "position": "absolute",
    "width": "90px",
    "height": "90px",
    "top": "14px",
    "left": "3px"
  },
  ".right-panel[data-v-553d6ea0]": {
    "position": "absolute",
    "left": "98px",
    "width": "75px",
    "lines": "1",
    "text-overflow": "ellipsis",
    "white-space": "nowrap",
    "display": "inline-block",
    "overflow": "hidden"
  },
  ".title[data-v-553d6ea0]": {
    "font-weight": "bold",
    "font-size": "12px"
  },
  ".title-goods[data-v-553d6ea0]": {
    "top": "22px"
  },
  ".title-shop[data-v-553d6ea0]": {
    "top": "40px"
  },
  ".subtitle[data-v-553d6ea0]": {
    "font-weight": "lighter",
    "font-size": "12px",
    "color": "#4A4A4A"
  },
  ".subtitle-goods[data-v-553d6ea0]": {
    "top": "43px"
  },
  ".subtitle-shop[data-v-553d6ea0]": {
    "top": "61px"
  },
  ".price[data-v-553d6ea0]": {
    "font-weight": "lighter",
    "font-size": "14px",
    "top": "76px"
  },

  /*// head5.css /////////////////////////////////////////////////*/
  ".wrapper[data-v-2c9fb3eb]": {
    "background-color": "transparent"
  },
  ".cell-wrap[data-v-2c9fb3eb]": {},
  ".like-row[data-v-2c9fb3eb]": {
    "width": "375px",
    "padding-left": "9px",
    "padding-right": "9px",
    "margin-bottom": "9px",
    "box-sizing": "border-box",
    "-webkit-box-orient": "horizontal",
    "-webkit-box-direction": "normal",
    "-webkit-flex-direction": "row",
    "-ms-flex-direction": "row",
    "flex-direction": "row",
    "-webkit-box-pack": "justify",
    "-webkit-justify-content": "space-between",
    "-ms-flex-pack": "justify",
    "justify-content": "space-between"
  },
  ".like-item[data-v-2c9fb3eb]": {
    "box-sizing": "border-box",
    "width": "174px",
    "height": "250px",
    "padding-left": "7px",
    "padding-right": "7px",
    "background-color": "#ffffff"
  },
  ".item-img[data-v-2c9fb3eb]": {
    "margin-left": "-7px",
    "width": "174px",
    "height": "174px"
  },
  ".title-ctn[data-v-2c9fb3eb]": {
    "margin-top": "12px",
    "width": "162px"
  },
  ".badge[data-v-2c9fb3eb]": {
    "position": "absolute",
    "top": "2px",
    "left": "0px",
    "width": "26px",
    "height": "13px",
    "margin-right": "4px"
  },
  ".title[data-v-2c9fb3eb]": {
    "width": "162px",
    "font-size": "12px",
    "line-height": "15px",
    "color": "#333333",
    "overflow": "hidden",
    "text-overflow": "ellipsis",
    "lines": "2"
  },
  ".sub-title[data-v-2c9fb3eb]": {
    "position": "absolute",
    "bottom": "11px",
    "right": "6px",
    "font-size": "10px",
    "line-height": "9px",
    "height": "14px",
    "padding-top": "1.5px",
    "padding-left": "3px",
    "padding-right": "3px",
    "text-align": "center",
    "color": "#F70E50",
    "border-radius": "3px",
    "border-width": "1px",
    "overflow": "hidden",
    "text-overflow": "ellipsis",
    "lines": "1"
  },
  ".sub-title-bg[data-v-2c9fb3eb]": {
    "position": "absolute",
    "bottom": "11px",
    "right": "6px",
    "font-size": "10px",
    "line-height": "9px",
    "height": "14px",
    "padding-left": "3px",
    "padding-right": "3px",
    "text-align": "center",
    "border-radius": "3px",
    "border-width": "1px",
    "overflow": "hidden",
    "text-overflow": "ellipsis",
    "lines": "1",
    "border-color": "transparent",
    "color": "transparent",
    "opacity": "0.15"
  },
  ".price-ctn[data-v-2c9fb3eb]": {
    "position": "absolute",
    "bottom": "11px",
    "left": "6px",
    "-webkit-box-orient": "horizontal",
    "-webkit-box-direction": "normal",
    "-webkit-flex-direction": "row",
    "-ms-flex-direction": "row",
    "flex-direction": "row",
    "-webkit-box-align": "center",
    "-webkit-align-items": "center",
    "-ms-flex-align": "center",
    "align-items": "center"
  },
  ".price-title[data-v-2c9fb3eb]": {
    "font-size": "12px"
  },
  ".price-unit[data-v-2c9fb3eb]": {
    "font-size": "12px",
    "color": "#E71A17"
  },
  ".price-num[data-v-2c9fb3eb]": {
    "margin-left": "-1px",
    "color": "#E71A17",
    "font-size": "15px",
    "font-weight": "bold"
  },

  /*// head13.css /////////////////////////////////////////////////*/
  ".row[data-v-0dad7305]": {
    "flex-direction": "row"
  },
  ".result[data-v-0dad7305]": {
    "text-align": "right",
    "background-color": "#666",
    "font-size": "40px",
    "color": "white",
    "height": "100px",
    "padding": "30px",
    "margin": "5px"
  },
  ".btn[data-v-0dad7305]": {
    "flex": "1",
    "text-align": "center",
    "background-color": "#eee",
    "font-size": "36px",
    "height": "100px",
    "padding": "30px",
    "margin": "5px"
  },
  ".btn-operator[data-v-0dad7305]": {
    "background-color": "#669",
    "font-size": "40px",
    "color": "white"
  }
}
